สคริปต์นี้ไม่ควรถูกติดตั้งโดยตรง มันเป็นคลังสำหรับสคริปต์อื่น ๆ เพื่อบรรจุด้วยคำสั่งเมทา // @require https://update.greasyfork.org/scripts/407543/963893/Block_Obj.js
// ==UserScript==
// @name Block_Obj
// @namespace https://greasyfork.org/zh-CN/users/193133-pana
// @homepage https://greasyfork.org/zh-CN/users/193133-pana
// @version 3.0.3
// @description 屏蔽内容对象库
// @author pana
// @license GNU General Public License v3.0 or later
// ==/UserScript==
const BLOCK_STYLE = `
.block_obj_wrap_div {
background-color: #222222;
border-radius: 3px;
border: 1px solid #282A36;
bottom: 6vh;
box-shadow: 0 0 5px #282A36;
color: #D3D3D3;
font-size: 13px;
margin: 0px;
padding: 0px;
position: fixed;
text-align: left;
transition: 0.8s;
width: 520px;
z-index: 99999;
}
.block_obj_show_wrap {
display: block;
right: 0;
}
.block_obj_hidden_wrap {
right: -530px;
}
.block_obj_main_fieldset {
border-radius: 3px;
border: 3px groove #00A1D6;
height: auto;
margin: 8px;
min-width: 300px;
padding: 4px 9px 6px 9px;
width: auto;
}
.block_obj_ul_node {
list-style: none;
padding-left: 0;
margin: 0;
}
.block_obj_checkbox_li {
display: inline-block;
margin-top: 5px;
}
.block_obj_checkbox_input {
clip: rect(0, 0, 0, 0);
position: absolute;
}
.block_obj_checkbox_label {
cursor: help;
vertical-align: middle;
}
.block_obj_checkbox_input + label::before {
background-color: silver;
border-radius: 0.1em;
color: #FFF;
content: "\\a0";
display: inline-block;
height: 1em;
line-height: 85%;
margin-right: 0.5em;
text-align: center;
vertical-align: 0.2em;
width: 1em;
cursor: pointer;
}
.block_obj_checkbox_input:checked + label::before {
background-color: #00A1D6;
content: "\\2713";
}
.block_obj_separator_text {
color: #FFB86C;
margin-top: 5px;
}
.block_obj_separator_symbol {
background-color: #303030;
height: 2px;
margin-bottom: 5px;
margin-top: 5px;
min-width: 400px;
}
.block_obj_input_div {
margin-top: 5px;
}
.block_obj_input {
background-color: #C0C0C0;
border: 1px solid #C0C0C0;
color: #000;
font-size: 13px;
min-height: 1.5em;
margin-left: 5px;
margin-right: 5px;
padding-left: 4px;
}
.block_obj_keyword_input {
width: 220px;
}
.block_obj_input_btn {
background-color: #3da9cc;
border-radius: 3px;
border: 1px solid #73C9E5;
box-shadow: 0 0 4px #73C9E5;
color: #FFF;
cursor: pointer;
display: inline-block;
min-height: 1em;
margin-left: 5px;
text-align: center;
vertical-align: bottom;
white-space: nowrap;
width: 30px;
}
.block_obj_list_div {
margin-top: 5px;
}
.block_obj_list_textarea_div {
border: 1px dotted #00A1D6;
margin-top: 3px;
max-height: 65px;
min-height: 3px;
overflow: auto;
}
.block_obj_list_textarea_div::-webkit-scrollbar {
background-color: #979797;
border-radius: 5px;
width: 10px;
}
.block_obj_list_textarea_div::-webkit-scrollbar-thumb {
background-color: #404040;
border-radius: 5px;
}
.block_obj_button_clicked {
color: #000;
}
.block_obj_child_span {
background-color: #3D3D3D;
border-radius: 5px;
border: 1px solid #3D3D3D;
display: inline-block;
margin: 3px;
padding: 2px;
min-height: 18px;
}
.block_obj_child_text {
border-right: 1px solid #A9181C;
margin-right: 4px;
padding-right: 4px;
}
.block_obj_child_green {
color: #41B349;
}
.block_obj_child_del {
color: #A9181C;
cursor: pointer;
}
.block_obj_list_textarea_expand {
max-height: 720px;
}
.block_obj_li_hide {
display: none;
}
.block_obj_button {
background-color: #FB7299;
border-radius: 4px;
border: 1px solid #FB7299;
color: #FFF;
cursor: pointer;
margin-top: 5px;
padding: 2px 4px;
position: relative;
min-height: 1em;
}
.block_obj_save_button {
float: right;
margin-right: 5px;
}
.block_obj_cancel_button {
float: left;
margin-left: 5px;
}
.block_obj_expand_box {
bottom: 0px;
height: 6vh;
position: fixed;
right: -6vw;
transition: 0.5s;
width: 12vw;
z-index: 99999;
}
.block_obj_show_expand_box {
right: 0;
width: 6vw;
}
.block_obj_expand_span {
background-color: #00A1D6;
border-radius: 19px;
border: 1px solid #00A1D6;
bottom: 1vh;
color: #FFF;
cursor: pointer;
display: block;
font-size: 13px;
height: 38px;
line-height: 38px;
position: absolute;
right: 1vw;
text-align: center;
width: 38px;
z-index: 99999;
user-select: none;
}
.block_obj_expand_span:hover {
box-shadow: 0 0 5px 1px green;
}
.block_obj_move_right {
margin-left: 15px;
}
.block_obj_none {
display: none !important;
}
.block_obj_hidden {
visibility: hidden !important;
}
.block_obj_presentation_div {
display: flex;
position: fixed;
background-color: rgba(0, 0, 0, .5);
top: 0;
bottom: 0;
left: 0;
right: 0;
z-index: 100000;
align-items: center;
justify-content: center;
}
.block_obj_dialog_div {
position: relative;
width: 400px;
background-color: #4e5654;
border: 0 solid #000;
border-radius: 12px;
display: flex;
flex-direction: column;
}
.block_obj_big_bang_top_part {
margin-top: 5px;
margin-bottom: 5px;
}
.block_obj_big_bang_h3 {
font-size: 20px;
color: #fff;
margin-left: 5px;
background-color: #4e5654;
border-color: #4e5654;
}
.block_obj_big_bang_deselect_btn {
float: right;
margin-top: 5px;
margin-right: 5px;
color: #2a2a92;
cursor: pointer;
}
.block_obj_big_bang_middle_part {
margin-top: 5px;
margin-bottom: 5px;
max-height: 500px;
overflow-y: auto;
}
.block_obj_big_bang_text {
background-color: #3e3939;
color: #fff;
padding: 5px;
margin: 4px;
font-size: 16px;
display: inline-block;
border-radius: 99px;
cursor: pointer;
user-select: none;
}
.block_obj_big_bang_text_selected {
background-color: #3636b1 !important;
}
.block_obj_big_bang_bottom_part {
margin-top: 5px;
margin-bottom: 5px;
text-align: center;
}
.block_obj_big_bang_add_btn, .block_obj_big_bang_copy_btn {
display: inline-block;
padding: 10px;
color: #fff;
background-color: #325561;
cursor: pointer;
border-radius: 99px;
margin-left: 20px;
margin-right: 20px;
}
.block_obj_big_bang_add_btn:hover, .block_obj_big_bang_copy_btn:hover {
color: #2a2a92;
}
`;
class Block_Obj {
constructor(configKey, regConversion = []) {
this.wrapDiv = null;
this.mainFieldset = null;
this.ulNode = null;
this.style = null;
this.saveField = [];
this.onSave = null;
this.onChange = null;
this.field = [];
this.configKey = configKey;
this.regConversion = regConversion;
this.config = {};
this.timer = null;
this.saveTimer = null;
this.cancelTimer = null;
}
async init(initialization) {
if (!this.id) {
this.id = initialization.id ? 'blockObj_' + initialization.id : 'blockObj_' + Block_Obj.count;
!initialization.id && Block_Obj.count++;
}
this.config = await this.readConfig();
this.regConversion.forEach(item => {
const { ori, key } = item;
if (ori && this.config[ori] != undefined) {
this.config[key] = this.config[key].concat(this.config[ori]);
delete this.config[ori];
}
});
this.display = initialization.display ? true : false;
if (initialization.events) {
if (typeof initialization.events['save'] === 'function') {
this.onSave = initialization.events['save'];
}
if (typeof initialization.events['change'] === 'function') {
this.onChange = initialization.events['change'];
}
}
this.style = document.createElement('style');
this.style.innerHTML = BLOCK_STYLE;
document.body.appendChild(this.style);
if (initialization.style && typeof initialization.style === 'string') {
const externalStyle = document.createElement('style');
externalStyle.innerHTML = initialization.style;
document.body.appendChild(externalStyle);
}
!this.wrapDiv && this.createSettingsPanel();
this.field = initialization.field;
this.settingsPanel();
Block_Obj.GM.registerMenuCommand(initialization.menu, () => this.expandWrap());
Block_Obj.GM.addValueChangeListener(this.configKey, (_name, _oldValue, newValue, remote) => {
if (remote) {
this.destroyAndRebuild(newValue);
typeof this.onChange === 'function' && this.onChange(this.getConfig());
}
});
const expandBox = document.createElement('div');
expandBox.className = 'block_obj_expand_box';
expandBox.onmouseenter = function () {
this.classList.add('block_obj_show_expand_box');
};
expandBox.onmouseleave = function () {
this.classList.remove('block_obj_show_expand_box');
};
const hoverButton = {};
if (initialization.hover_button) {
Object.assign(hoverButton, initialization.hover_button);
}
const expandSpan = document.createElement('span');
expandSpan.id = this.id + '_expandSpan';
expandSpan.className = 'block_obj_expand_span';
expandSpan.textContent = hoverButton.label == null ? '屏蔽' : hoverButton.label;
expandSpan.title = hoverButton.title == null ? '显示/隐藏屏蔽设置' : hoverButton.title;
expandSpan.addEventListener('click', () => {
this.expandWrap();
if (hoverButton.click && typeof hoverButton.click === 'function') {
hoverButton.click(expandSpan);
}
});
expandBox.appendChild(expandSpan);
document.body.appendChild(expandBox);
}
settingsPanel() {
if (Array.isArray(this.field)) {
this.field.forEach(ele => {
if (!this.wrapDiv.querySelector('#' + this.id + '_' + (ele.id ? ele.id : ''))) {
switch (ele.type.toLowerCase()) {
case 'separator':
case 's':
this.insertSeparator(ele.id, ele.label, ele.title, ele.classname);
break;
case 'br':
case 'b':
this.insertBr(ele.classname);
break;
case 'input':
case 'i':
this.insertInput(ele.list_id, ele.id, ele.label, ele.title, ele.placeholder, ele.classname, ele.campare);
break;
case 'list':
case 'l':
this.insertList(ele.id, this.config[ele.id] == null ? ele.default : this.config[ele.id], ele.label, ele.title, ele.classname);
break;
case 'checkbox':
case 'c':
default:
this.insertCheckbox(
ele.id,
ele.label,
ele.title,
this.config[ele.id] == null ? ele.default : this.config[ele.id],
ele.classname,
ele.move_right
);
break;
}
}
});
}
const saveButton = this.createSpanBtn('block_obj_button block_obj_save_button', '保存并关闭', '保存设置并关闭设置窗口', e => {
this.expandWrap();
this.saveConfig();
});
const onlySaveButton = this.createSpanBtn('block_obj_button block_obj_save_button', '仅保存', '仅保存设置', e => {
onlySaveButton.textContent = '已保存';
this.saveTimer && window.clearTimeout(this.saveTimer);
this.saveTimer = null;
this.saveTimer = window.setTimeout(() => {
onlySaveButton.textContent = '仅保存';
}, 1000);
this.saveConfig();
});
const cancelButton = this.createSpanBtn('block_obj_button block_obj_cancel_button', '取消', '关闭设置窗口', e => {
this.expandWrap();
this.cancelTimer && window.clearTimeout(this.cancelTimer);
this.cancelTimer = null;
this.cancelTimer = window.setTimeout(() => {
this.display = false;
this.destroyAndRebuild();
}, 800);
e.stopPropagation();
});
this.ulNode.appendChild(saveButton);
this.ulNode.appendChild(onlySaveButton);
this.ulNode.appendChild(cancelButton);
document.body.appendChild(this.wrapDiv);
}
getConfig() {
const realConfig = {};
Object.assign(realConfig, this.config);
this.regConversion.forEach(item => {
const { key } = item;
realConfig[key] = this.convertArray(realConfig[key]);
});
return realConfig;
}
async readConfig() {
let config = {};
if (this.configKey) {
config = await Block_Obj.GM.getValue(this.configKey, {});
}
return config;
}
saveConfig() {
this.saveField.forEach(item => {
if (item.type == 'checkbox') {
this.config[item.key] = document.getElementById(this.id + '_' + item.key).checked;
} else if (item.type == 'list') {
this.config[item.key] = this.extractList(this.id + '_' + item.key);
}
});
Block_Obj.GM.setValue(this.configKey, this.config);
typeof this.onSave === 'function' && this.onSave(this.getConfig());
}
createSettingsPanel() {
this.wrapDiv = document.createElement('div');
this.wrapDiv.id = this.id + '_wrapDiv';
this.wrapDiv.className = 'block_obj_wrap_div ' + (this.display ? 'block_obj_show_wrap' : 'block_obj_hidden_wrap');
this.mainFieldset = document.createElement('fieldset');
this.mainFieldset.id = this.id + '_mainFieldset';
this.mainFieldset.className = 'block_obj_main_fieldset';
this.wrapDiv.appendChild(this.mainFieldset);
this.ulNode = document.createElement('ul');
this.ulNode.id = this.id + '_ulNode';
this.ulNode.className = 'block_obj_ul_node';
this.mainFieldset.appendChild(this.ulNode);
document.body.appendChild(this.wrapDiv);
}
destroyAndRebuild(new_config = null) {
this.config = new_config || this.config;
document.body.removeChild(this.wrapDiv);
this.createSettingsPanel();
this.settingsPanel();
}
expandWrap() {
const panel = document.getElementById(this.id + '_wrapDiv');
if (panel) {
if (panel.classList.contains('block_obj_show_wrap')) {
this.display = false;
panel.classList.remove('block_obj_show_wrap');
panel.classList.add('block_obj_hidden_wrap');
} else {
this.display = true;
panel.classList.remove('block_obj_hidden_wrap');
panel.classList.add('block_obj_show_wrap');
}
}
}
insertCheckbox(id, label = '', title = '', checked = false, classname = null, moveRight = false) {
const checkboxLi = document.createElement('li');
checkboxLi.className = 'block_obj_checkbox_li';
classname && checkboxLi.classList.add(classname);
moveRight && checkboxLi.classList.add('block_obj_move_right');
const checkboxInput = document.createElement('input');
checkboxInput.type = 'checkbox';
checkboxInput.className = 'block_obj_checkbox_input';
checkboxInput.id = this.id + '_' + id;
checkboxInput.checked = checked ? true : false;
const checkboxLabel = document.createElement('label');
checkboxLabel.className = 'block_obj_checkbox_label';
checkboxLabel.setAttribute('for', this.id + '_' + id);
checkboxLabel.textContent = label;
checkboxLabel.title = title;
checkboxLi.appendChild(checkboxInput);
checkboxLi.appendChild(checkboxLabel);
this.ulNode.appendChild(checkboxLi);
this.saveField.push({
key: id,
type: 'checkbox',
});
}
insertSeparator(id = null, label = null, title = null, liClassname = null) {
const separatorLi = document.createElement('li');
separatorLi.className = 'block_obj_separator_li';
liClassname && separatorLi.classList.add('block_obj_' + liClassname);
const separatorDiv = document.createElement('div');
if (id) {
separatorDiv.id = this.id + '_' + id;
}
if (label) {
separatorDiv.className = 'block_obj_separator_text';
separatorDiv.textContent = label;
} else {
separatorDiv.className = 'block_obj_separator_symbol';
}
separatorDiv.title = title ? title : '';
separatorLi.appendChild(separatorDiv);
this.ulNode.appendChild(separatorLi);
}
insertBr(classname = null) {
const br = document.createElement('br');
br.className = classname ? classname : '';
this.ulNode.appendChild(br);
}
insertInput(listId, id = null, label = '', title = '', placeholder = '', liClassname = null, campare = null) {
const inputLi = document.createElement('li');
inputLi.className = liClassname ? 'block_obj_' + liClassname : '';
const inputDiv = document.createElement('div');
inputDiv.className = 'block_obj_input_div';
const inputSpan = document.createElement('span');
inputSpan.className = 'block_obj_input_span';
inputSpan.textContent = label;
inputDiv.appendChild(inputSpan);
const input = document.createElement('input');
if (id) {
input.id = this.id + '_' + id;
}
input.title = title;
input.placeholder = placeholder;
input.type = 'text';
input.className = 'block_obj_input block_obj_keyword_input';
inputSpan.appendChild(input);
const theListId = this.id + '_' + listId;
input.addEventListener('keyup', e => {
if (e.key === 'Enter') {
this.addListItem(input, theListId, campare);
}
});
const addBtn = this.createSpanBtn('block_obj_input_btn', '添加', '添加内容到列表中', _e => {
if (this.addListItem(input, theListId, campare)) {
this.buttonClicked(addBtn, '添加成功', 'block_obj_button_clicked');
}
});
const deleteBtn = this.createSpanBtn('block_obj_input_btn', '删除', '从列表中删除符合的项目', _e => {
if (this.delListItem(input, theListId)) {
this.buttonClicked(deleteBtn, '删除成功', 'block_obj_button_clicked');
}
});
const clearBtn = this.createSpanBtn('block_obj_input_btn', '清空', '清空列表', _e => {
document.getElementById(theListId).innerHTML = '';
this.buttonClicked(clearBtn, '清除成功', 'block_obj_button_clicked');
});
const copyBtn = this.createSpanBtn('block_obj_input_btn', '复制', '复制列表', _e => {
Block_Obj.GM.setClipboard(this.extractList(theListId).toString());
this.buttonClicked(copyBtn, '复制成功', 'block_obj_button_clicked');
});
const expandBtn = this.createSpanBtn('block_obj_input_btn', '展开', '展开列表', _e => {
liClassname && this.toggleList('block_obj_' + liClassname);
if (expandBtn.textContent == '展开') {
expandBtn.textContent = '恢复';
expandBtn.title = '收缩列表';
} else {
expandBtn.textContent = '展开';
expandBtn.title = '展开列表';
}
});
inputDiv.appendChild(addBtn);
inputDiv.appendChild(deleteBtn);
inputDiv.appendChild(clearBtn);
inputDiv.appendChild(copyBtn);
inputDiv.appendChild(expandBtn);
inputLi.appendChild(inputDiv);
this.ulNode.appendChild(inputLi);
}
insertList(id, saveArray = [], label = '', title = '', liClassname = '') {
const listLi = document.createElement('li');
listLi.className = liClassname ? 'block_obj_' + liClassname : '';
const listDiv = document.createElement('div');
listDiv.className = 'block_obj_list_div';
listDiv.textContent = label;
listDiv.title = title;
const listTextareaDiv = document.createElement('div');
listTextareaDiv.id = this.id + '_' + id;
listTextareaDiv.className = 'block_obj_list_textarea_div';
for (const item of saveArray) {
item && listTextareaDiv.insertAdjacentElement('afterbegin', this.createListItem(item));
}
listDiv.appendChild(listTextareaDiv);
listLi.appendChild(listDiv);
this.ulNode.appendChild(listLi);
this.saveField.push({
key: id,
type: 'list',
});
}
addListItem(input, listId, campare = null) {
const textValue = input.value;
if (textValue) {
const textArr = this.stringToArray(textValue);
const saveArr = this.extractList(listId);
textArr.forEach(item => {
let status = true;
if (typeof campare === 'function') {
const tempStatus = campare(item);
if (typeof tempStatus === 'boolean') {
status = tempStatus;
}
}
if (status) {
!saveArr.includes(item) && document.getElementById(listId).insertAdjacentElement('afterbegin', this.createListItem(item));
}
});
input.value = '';
return true;
}
return false;
}
delListItem(input, listId) {
const textValue = input.value;
if (textValue) {
let delStatus = false;
const textArr = this.stringToArray(textValue);
const saveArr = this.extractList(listId);
textArr.forEach(item => {
if (saveArr.includes(item)) {
const totalChild = document.getElementById(listId).getElementsByClassName('block_obj_child_span');
try {
document.getElementById(listId).removeChild(totalChild[totalChild.length - 1 - saveArr.indexOf(item)]);
delStatus = true;
} catch (e) {
delStatus = false;
console.error('Block_Obj: Error deleting element.');
console.error(e);
}
}
});
if (delStatus) {
input.value = '';
return true;
}
}
return false;
}
createSpanBtn(classname, label, title, callback) {
const btnSpan = this.createBasicBtn('span', label, title, classname);
btnSpan.addEventListener('click', e => typeof callback === 'function' && callback(e));
return btnSpan;
}
createListItem(text_value) {
const childSpan = document.createElement('span');
childSpan.className = 'block_obj_child_span';
const textSpan = document.createElement('span');
textSpan.className = text_value.match(/^\/.+\/[a-z]*$/i) ? 'block_obj_child_text block_obj_child_green' : 'block_obj_child_text';
textSpan.textContent = text_value.length > 9 ? text_value.slice(0, 3) + ' ... ' + text_value.slice(-3) : text_value;
if (text_value.length > 9) {
textSpan.title = text_value;
}
const delSpan = document.createElement('span');
delSpan.textContent = 'X';
delSpan.title = '移除';
delSpan.className = 'block_obj_child_del';
delSpan.addEventListener('click', e => childSpan.remove());
childSpan.appendChild(textSpan);
childSpan.appendChild(delSpan);
return childSpan;
}
createBasicBtn(type, text, title, classname) {
let btnType = 'span';
if (typeof type === 'string') {
switch (type.toLowerCase()) {
case 'div':
case 'd':
btnType = 'div';
break;
case 'a':
btnType = 'a';
break;
case 'button':
btnType = 'button';
break;
case 'input':
btnType = 'input';
break;
case 'i':
btnType = 'i';
break;
case 'b':
btnType = 'b';
break;
case 'span':
case 's':
default:
btnType = 'span';
break;
}
}
const btn = document.createElement(btnType);
btn.textContent = text ? text : '';
btn.title = title ? title : '';
btn.className = classname ? classname : '';
return btn;
}
createBlockBtn(value, listId, classname, type = 'span', text = '', title = '', campare = null) {
const blockBtn = this.createBasicBtn(type, text, title, classname);
blockBtn.addEventListener('click', e => {
e.stopPropagation();
if (value && listId) {
let status = true;
if (typeof campare === 'function') {
const tempStatus = campare(value);
if (typeof tempStatus === 'boolean') {
status = tempStatus;
}
}
if (status) {
const theListId = this.id + '_' + listId;
const saveArr = this.extractList(theListId);
!saveArr.includes(value) &&
document.getElementById(theListId) &&
document.getElementById(theListId).insertAdjacentElement('afterbegin', this.createListItem(value));
}
}
this.saveConfig();
});
return blockBtn;
}
createBigBangBtn(value, listId, classname, type = 'span', text = '', title = '', campare = null) {
const bigBangBtn = this.createBasicBtn(type, text, title, classname);
bigBangBtn.addEventListener('click', e => {
e.stopPropagation();
if (value && listId) {
const theListId = this.id + '_' + listId;
this.injectionBigBangPanel(value, theListId, campare);
}
});
return bigBangBtn;
}
injectionBigBangPanel(value, listId, campare = null) {
const presentationDiv = document.createElement('div');
presentationDiv.id = this.id + '_presentationDiv';
presentationDiv.className = 'block_obj_presentation_div';
presentationDiv.addEventListener('click', function (event) {
if (event.target === this) {
if (presentationDiv) {
presentationDiv.remove();
}
}
});
const dialogDiv = document.createElement('div');
dialogDiv.className = 'block_obj_dialog_div';
presentationDiv.appendChild(dialogDiv);
const topPart = document.createElement('div');
topPart.className = 'block_obj_big_bang_top_part';
const h3 = document.createElement('h3');
h3.className = 'block_obj_big_bang_h3';
h3.textContent = '大爆炸';
topPart.appendChild(h3);
const deselectBtn = this.createSpanBtn('block_obj_big_bang_deselect_btn', '取消选择', '取消全部已选择的内容', e => {
e.stopPropagation();
const selectArr = document.querySelectorAll('.block_obj_big_bang_text_selected');
for (const s of selectArr) {
s.classList.remove('block_obj_big_bang_text_selected');
}
});
topPart.appendChild(deselectBtn);
const valueArray = value.replace(/\s| /gi, '').split('');
const middlePart = document.createElement('div');
middlePart.className = 'block_obj_big_bang_middle_part';
const nodeArray = valueArray.map((ele, index) => {
const eleNode = this.createBasicBtn('span', ele, '', 'block_obj_big_bang_text');
eleNode.setAttribute('data-index', index);
eleNode.addEventListener('click', e => {
e.stopPropagation();
eleNode.classList.contains('block_obj_big_bang_text_selected')
? eleNode.classList.remove('block_obj_big_bang_text_selected')
: eleNode.classList.add('block_obj_big_bang_text_selected');
});
return eleNode;
});
nodeArray.forEach(item => {
middlePart.appendChild(item);
});
const bottomPart = document.createElement('div');
bottomPart.className = 'block_obj_big_bang_bottom_part';
const addBtn = this.createSpanBtn('block_obj_big_bang_add_btn', '添加', '添加选择的内容到列表中', e => {
e.stopPropagation();
const textValue = this.getSelectedText('block_obj_big_bang_text_selected');
if (textValue && listId) {
const textArr = this.stringToArray(textValue);
const saveArr = this.extractList(listId);
textArr.forEach(item => {
let status = true;
if (typeof campare === 'function') {
const tempStatus = campare(item);
if (typeof tempStatus === 'boolean') {
status = tempStatus;
}
}
if (status) {
!saveArr.includes(item) && document.getElementById(listId).insertAdjacentElement('afterbegin', this.createListItem(item));
}
});
this.saveConfig();
presentationDiv.remove();
}
});
bottomPart.appendChild(addBtn);
const copyBtn = this.createSpanBtn('block_obj_big_bang_copy_btn', '复制', '复制选择的内容到剪贴板中', e => {
e.stopPropagation();
const textValue = this.getSelectedText('block_obj_big_bang_text_selected');
if (textValue) {
Block_Obj.GM.setClipboard(textValue);
presentationDiv.remove();
}
});
bottomPart.appendChild(copyBtn);
dialogDiv.appendChild(topPart);
dialogDiv.appendChild(middlePart);
dialogDiv.appendChild(bottomPart);
document.body.appendChild(presentationDiv);
}
getSelectedText(classname) {
const selectedArray = document.getElementsByClassName(classname);
let lastIndex = -1;
let textValue = '';
for (const selected of selectedArray) {
const index = selected.getAttribute('data-index') || -1;
if (Number(index) == lastIndex + 1) {
textValue += selected.textContent;
} else {
textValue = textValue ? textValue + ',' + selected.textContent : selected.textContent;
}
lastIndex = Number(index);
}
return textValue;
}
buttonClicked(button, clickTitle, click_class) {
const originalTitle = button.title;
button.title = clickTitle;
click_class && button.classList.add(click_class);
this.timer && window.clearTimeout(this.timer);
this.timer = null;
this.timer = window.setTimeout(() => {
button.title = originalTitle;
button.classList.remove(click_class);
}, 1000);
}
extractList(listId) {
const reArr = [];
const listDom = document.getElementById(listId);
const listArr = listDom.getElementsByClassName('block_obj_child_text');
for (let i = listArr.length - 1; i >= 0; i--) {
listArr[i].title ? reArr.push(listArr[i].title) : reArr.push(listArr[i].textContent);
}
return reArr;
}
stringToArray(textString = '') {
const tempArray = textString.match(/^\/.+\/[a-z]*$/i) ? [textString] : textString.split(',');
const returnArray = [];
for (let i = 0, l = tempArray.length; i < l; i++) {
for (let j = i + 1; j < l; j++) {
if (tempArray[i] === tempArray[j]) {
++i;
j = i;
}
}
returnArray.push(tempArray[i]);
}
return returnArray;
}
toggleList(liClassname) {
for (const li of this.ulNode.querySelectorAll('li')) {
if (li.classList.contains(liClassname)) {
const listTextareaDiv = li.querySelector('.block_obj_list_textarea_div');
if (listTextareaDiv) {
listTextareaDiv.classList.contains('block_obj_list_textarea_expand')
? listTextareaDiv.classList.remove('block_obj_list_textarea_expand')
: listTextareaDiv.classList.add('block_obj_list_textarea_expand');
}
} else {
li.classList.contains('block_obj_li_hide') ? li.classList.remove('block_obj_li_hide') : li.classList.add('block_obj_li_hide');
}
}
for (const br of this.ulNode.querySelectorAll('br')) {
br.classList.contains('block_obj_li_hide') ? br.classList.remove('block_obj_li_hide') : br.classList.add('block_obj_li_hide');
}
}
convertArray(stringArray) {
const reArr = [];
if (Array.isArray(stringArray)) {
for (const str of stringArray) {
if (str.match(/^\/.+\/[a-z]*$/i)) {
try {
const newReg = new RegExp(str.replace(/^\/|\/[a-z]*$/gi, ''), str.replace(/^\/.*\/[^a-z]*/i, ''));
reArr.push(newReg);
} catch (e) {
console.error('Block_Obj: The transformation contains invalid regular expressions.');
console.error(e);
}
} else {
reArr.push(str);
}
}
}
return reArr;
}
}
Block_Obj.count = 0;
Block_Obj.GM = {
isError: false,
menuCount: 0,
error: message => {
if (!Block_Obj.GM.isError) {
Block_Obj.GM.isError = true;
alert('The required ' + message + ' method is incomplete!!!');
}
},
warn: message => {
console.warn('The required ' + message + ' method is incomplete!!!');
},
tips: message => {
console.info('Tips: ' + message);
},
info: () => {
if (typeof GM_info === 'object') {
return GM_info;
} else if (typeof GM.info === 'object') {
return GM.info;
} else {
Block_Obj.GM.warn('GM_info or GM.info');
return {
script: {
version: 0,
},
scriptHandler: 'Unknown',
version: 0,
};
}
},
getValue: (name, defaultValue) => {
if (typeof GM_getValue === 'function') {
return GM_getValue(name, defaultValue);
} else if (typeof GM.getValue === 'function') {
return GM.getValue(name, defaultValue);
} else {
Block_Obj.GM.error('GM_getValue or GM.getValue');
return null;
}
},
setValue: (name, value) => {
if (typeof GM_setValue === 'function') {
GM_setValue(name, value);
} else if (typeof GM.setValue === 'function') {
GM.setValue(name, value);
} else {
Block_Obj.GM.error('GM_setValue or GM.setValue');
}
},
deleteValue: async name => {
if (typeof GM_deleteValue === 'function') {
await GM_deleteValue(name);
} else if (typeof GM.deleteValue === 'function') {
await GM.deleteValue(name);
} else {
Block_Obj.GM.error('GM_deleteValue or GM.deleteValue');
}
},
listValues: () => {
if (typeof GM_listValues === 'function') {
return GM_listValues();
} else if (typeof GM.listValues === 'function') {
return GM.listValues();
} else {
Block_Obj.GM.error('GM_listValues or GM.listValues');
}
},
openInTab: (url, options) => {
if (typeof GM_openInTab === 'function') {
GM_openInTab(url, options);
} else if (typeof GM.openItTab === 'function') {
GM.openInTab(url, options.active);
} else {
Block_Obj.GM.error('GM_openInTab or GM.openInTab');
}
},
hasOpenIntTabMethods: () => {
return typeof GM_openInTab === 'function' || typeof GM.openItTab === 'function';
},
hasRegisterMenuCommandMethods: () => {
return typeof GM_registerMenuCommand === 'function';
},
hasAddValueChangeListenerMethods: () => {
return typeof GM_addValueChangeListener === 'function';
},
registerMenuCommand: (name, fn) => {
let menuId = null;
if (typeof GM_registerMenuCommand === 'function') {
if (Block_Obj.GM.info().scriptHandler === 'Violentmonkey') {
Block_Obj.GM.menuCount++;
GM_registerMenuCommand(Block_Obj.GM.menuCount + '.' + name, fn);
menuId = Block_Obj.GM.menuCount + '.' + name;
} else if (Block_Obj.GM.info().scriptHandler === 'Tampermonkey') {
menuId = GM_registerMenuCommand(name, fn);
}
} else {
Block_Obj.GM.warn('GM_registerMenuCommand');
}
return menuId;
},
unregisterMenuCommand: menuId => {
if (typeof GM_unregisterMenuCommand === 'function') {
GM_unregisterMenuCommand(menuId);
if (Block_Obj.GM.info().scriptHandler === 'Violentmonkey') {
Block_Obj.GM.menuCount--;
if (Block_Obj.fn.compare('2.12.5', Block_Obj.GM.info().version)) {
Block_Obj.GM.tips('Maybe you should update Violentmonkey to 2.12.5 or higher.');
}
}
} else {
Block_Obj.GM.warn('GM_unregisterMenuCommand');
}
},
addValueChangeListener: (name, callback) => {
if (typeof GM_addValueChangeListener === 'function') {
return GM_addValueChangeListener(name, callback);
} else {
Block_Obj.GM.warn('GM_addValueChangeListener');
return null;
}
},
removeValueChangeListener: listenerId => {
if (typeof GM_removeValueChangeListener === 'function') {
GM_removeValueChangeListener(listenerId);
} else {
Block_Obj.GM.warn('GM_removeValueChangeListener');
}
},
setClipboard: text => {
if (typeof GM_setClipboard === 'function') {
GM_setClipboard(text);
} else if (typeof GM.setClipboard === 'function') {
GM.setClipboard(text);
} else {
Block_Obj.GM.error('GM_setClipboard or GM.setClipboard');
}
},
};
Block_Obj.fn = {
hideOperation: (node, hide_status, method = 0) => {
if (node && node instanceof HTMLElement) {
if (hide_status) {
if (method === 0) {
node.classList.add('block_obj_none');
} else if (method === 1) {
node.classList.add('block_obj_hidden');
} else if (method === 2) {
node.style.display = 'none';
} else if (method === 3) {
node.style.visibility = 'hidden';
}
} else {
if (method === 0) {
node.classList.remove('block_obj_none');
} else if (method === 1) {
node.classList.remove('block_obj_hidden');
} else if (method === 2) {
node.style.display = '';
} else if (method === 3) {
node.style.visibility = '';
}
}
}
},
compare(str1, str2, symbol = '.', equal = false) {
const arr1 = str1.split(symbol);
const arr2 = str2.split(symbol);
let compareStatus = false;
const len = arr1.length < arr2.length ? arr1.length : arr2.length;
for (let i = len - 1; i >= 0; i--) {
if (Number(arr1[i]) > Number(arr2[i])) {
compareStatus = true;
} else if (equal && Number(arr1[i]) == Number(arr2[i])) {
compareStatus = true;
} else {
compareStatus = false;
}
}
return compareStatus;
},
getVersion: () => '3.0.3',
};