// ==UserScript==
// @name 微信编辑器增强🧬
// @namespace http://tampermonkey.net/
// @match *://www.135editor.com/*
// @match *://bj.96weixin.com/*
// @match *://www.365editor.com/*
// @icon https://www.135editor.com/img/vip/vip.png
// @grant none
// @version 1.6
// @author ec50n9
// @description 为135、96、365编辑器去除广告,免vip,增加css样式编辑面板等...
// @license MIT
// @downloadURL none
// ==/UserScript==
$(function () {
'use strict';
// 计算互补色
const getComplementaryColor = function (color = '') {
const colorPart = color.slice(1);
const ind = parseInt(colorPart, 16);
let iter = ((1 << 4 * colorPart.length) - 1 - ind).toString(16);
while (iter.length < colorPart.length) {
iter = '0' + iter;
};
return '#' + iter;
};
// 添加样式
const addStyle = function (styleText, document) {
(document ? document : $('head')).append($(``));
}
// css编辑面板
let ec_window = $(`
点击一个元素以查看其属性
元素名
当前元素样式
每次只能添加一条样式。
添加样式后需要点击下方写入才可生效。
清空编辑框后点击写入即可删除该行样式。
属性
子元素
内容
`).hide();
$('body').append(ec_window);
// 窗口控件
let ec_default_tip = $('#ec-default-tip');
let ec_win_title = $('#ec-win-title');
let ec_path_list = $('#ec-path-list');
let ec_win_style = $('#ec-win-style');
let ec_win_input_style = $('#ec-win-input-style');
let ec_win_add_style = $('#ec-win-add-style');
let ec_win_attr = $('#ec-win-attr');
let ec_child_list = $('#ec-child-list');
let ec_win_html = $('#ec-win-html');
let ec_win_delete = $('#ec-win-delete');
let ec_win_parent = $('#ec-win-parent');
let ec_win_write = $('#ec-win-write');
// 窗口拖拽
ec_win_title.mousedown(function (e) {
var positionDiv = $(this).offset();
var distenceX = e.pageX - positionDiv.left;
var distenceY = e.pageY - positionDiv.top;
$(document).mousemove(function (e) {
var x = e.pageX - distenceX;
var y = e.pageY - distenceY;
if (x < 0) {
x = 0;
} else if (x > $(document).width() - ec_window.outerWidth(true)) {
x = $(document).width() - ec_window.outerWidth(true);
}
if (y < 0) {
y = 0;
} else if (y > $(document).height() - ec_window.outerHeight(true)) {
y = $(document).height() - ec_window.outerHeight(true);
}
ec_window.css({
'left': x + 'px',
'top': y + 'px'
});
});
$(document).mouseup(function () {
$(document).off('mousemove');
});
});
// 初始化
const ecInit = function () {
addStyle(`#ec-change{color:#fff; background-color:#e8b004;}`);
}
// 进化函数
const evolution = function () {
let cur_editor = $('#ueditor_0');
// 注入样式
addStyle('.ec-active{outline: 1.5px dashed red !important; outline-offset: 2px; position: relative;}',
cur_editor.contents().find('head'));
// 元素选中
let element_click_func = function () {
const cur_element = $(this);
// 隐藏提示
ec_window.find('*:not(style,#ec-default-tip)').show();
ec_default_tip.hide();
// 添加标记
cur_editor.contents().find('body .ec-active').removeClass('ec-active');
cur_element.addClass('ec-active');
// 清空内容
ec_path_list.html('');
ec_win_style.html('');
ec_win_attr.html('');
ec_win_html.val('');
ec_win_add_style.unbind();
ec_child_list.html('');
ec_win_write.unbind();
ec_win_parent.unbind();
ec_win_delete.unbind();
// 添加内容
cur_element.each(function () {
// 设置标题
ec_win_title.text(`当前元素:${this.tagName}`);
// 路径
cur_element.parents().filter('body *').each(function () {
let row = $(`${this.tagName}`);
ec_path_list.prepend(row);
let element = $(this);
row.find('a').bind('click', function () {
element.click();
});
});
ec_path_list.append(`[ ${this.tagName} ]`);
// 遍历属性
$.each(this.attributes, function () {
if (this.specified) {
if (this.name === 'style') {
// 单独处理样式
let style_list = this.value.split(';');
for (let j = 0; j < style_list.length; j++) {
let style = style_list[j];
if (style) {
let style_item = style.split(':');
let style_row = $(`${style_item[0]} | |
`);
ec_win_style.append(style_row);
}
}
} else {
// 处理其他属性
let row = $(`${this.name} | |
`);
ec_win_attr.append(row);
}
}
});
});
// 生成子元素树
const genChildList = function (container, element, parent_li) {
const list = $('');
element.children().each(function () {
let row = $(`${this.tagName}`);
let element = $(this);
row.find('a').bind('click', function () {
element.click();
return false;
});
list.append(row);
genChildList(list, element, row);
});
if (list.html()) {
container.append(list);
if (parent_li) {
parent_li.css('list-style-type', 'disc').on('click', function () {
list.slideToggle(200);
});
}
}
};
genChildList(ec_child_list, cur_element);
// html内容
ec_win_html.val(cur_element.html());
// 更新样式函数
function update_sytle(element) {
// 保存样式
let sytle_tr_list = ec_win_style.find('tr');
let style_text = '';
for (let i = 0; i < sytle_tr_list.length; i++) {
let tr = $(sytle_tr_list[i]);
if (tr.find('input').val()) {
style_text = style_text + tr.find('th').text() + ':' + tr.find('input').val() + ';';
}
}
element.attr('style', style_text);
}
// 添加样式按钮
ec_win_add_style.bind('click', function () {
let style_text = ec_win_input_style.val();
if (style_text) {
let temp = style_text.split(':');
ec_win_style.append(`${temp[0]} | |
`);
ec_win_input_style.val('');
}
update_sytle(cur_element);
});
// 保存按钮
ec_win_write.bind('click', function () {
update_sytle(cur_element);
// 保存属性
let tr_list = ec_win_attr.find('tr');
for (let i = 0; i < tr_list.length; i++) {
let tr = $(tr_list[i]);
cur_element.attr(tr.find('th').text(), tr.find('input').val());
}
// 保存内容
cur_element.html(ec_win_html.val());
});
// 父辈按钮
ec_win_parent.bind('click', function () {
cur_element.parent().click();
});
// 删除按钮
ec_win_delete.bind('click', function(){
let parent = cur_element.parent();
cur_element.remove();
parent.click();
});
return false;
}
// 为元素添加监听器
if ($(this).hasClass('running')) {
ec_window.fadeOut(200);
cur_editor.contents().find('body .binding').unbind().removeClass('binding');
$(this).removeClass('running');
// 解除标记
cur_editor.contents().find('body .ec-active').removeClass('ec-active');
const ec_change = $(this).find('#ec-change');
(ec_change.length ? ec_change : $(this)).css({ 'background-color': '#e8b004' }).text('编辑进化');
} else {
ec_window.fadeIn(200);
cur_editor.contents().find('body *:not(.binding,#ec-inject)').bind('click', element_click_func).addClass('binding');
$(this).addClass('running');
// 隐藏控件,显示提示
ec_window.find('*:not(style,#ec-default-tip)').hide();
ec_default_tip.show();
const ec_change = $(this).find('#ec-change');
(ec_change.length ? ec_change : $(this)).css({ 'background-color': '#20a162' }).text('解除进化');
}
};
// 执行函数
const run135 = function () {
// 解除模板会员限制
setInterval(() => {
let lis = $('#editor-template-scroll li');
for (let i = 0, len = lis.length; i < len; i++) {
lis[i].classList.remove('vip-style');
}
// vip删除线
$('.vip-flag').css('text-decoration', 'line-through');
// 去除小红点
$('.user-unread-msgnum').hide();
// 文章管理器会员
articleManager.setVIP(true);
}, 1000);
// 去除会员弹窗
window.style_click = window.show_role_vip_dialog = function () { };
// 伪装登录
// window.loged_user = 1;
// 会员弹窗
$('#add_xiaoshi').hide();
// 顶部导航栏后两个按钮
$('.category-nav.editor-nav>.nav-item:nth-last-child(-n+2)').hide();
// 移除全局菜单中非功能设置按钮
$('#fixed-side-bar li:not(#function-settings), #fixed-bar-pack-up').hide();
// 颜色增强
let origin_color_div = $('#color-choosen>div:first-child'); // 原始
let complementary_color_div = origin_color_div.clone(); // 互补
origin_color_div.before($('原始色
'));
origin_color_div.after(complementary_color_div);
origin_color_div.after($('互补色
'));
$('#color-plan-list .color-swatch').on('click', function () {
let cur_color = $(this).attr('style').match(/background-color:\s?([^;]+)/)[1];
console.log(cur_color, getComplementaryColor(cur_color));
origin_color_div.children('input').css('color', getComplementaryColor(cur_color))
complementary_color_div.children('input').attr('value', getComplementaryColor(cur_color));
complementary_color_div.children('input').css({ 'color': cur_color, 'background-color': getComplementaryColor(cur_color) });
});
// 进化按钮
let evolution_btn = $('编辑进化').on('click', evolution);
$('#operate-tool').prepend(evolution_btn);
// 色板按钮
let open_color_plan = $('开关色板')
.on('click', function () {
$('#color-plan').fadeToggle(300);
});
$('#operate-tool').prepend(open_color_plan);
};
const run96 = function () {
// vip样式
setInterval(() => {
$('.rich_media_content').attr('data-vip', 1);
}, 1000);
// 进化按钮
let evolution_btn = $('').on('click', evolution);
$('.button-tools').prepend(evolution_btn);
};
const run365 = function () {
let evolution_btn = $('编辑进化').on('click', evolution);
$('.m-tools').prepend(evolution_btn);
};
// 判断执行
ecInit();
const host = window.location.host;
if (host.search(/www.135editor.com/) >= 0) run135();
else if (host.search(/bj.96weixin.com/) >= 0) run96();
else if (host.search(/www.365editor.com/) >= 0) run365();
});