// ==UserScript==
// @name OCS 网课助手
// @version 4.0.5
// @description OCS(online-course-script) 网课助手,专注于帮助大学生从网课中释放出来。让自己的时间把握在自己的手中,拥有人性化的操作页面,流畅的步骤提示,支持 智慧树,学习通,等网课的学习,作业。具体的功能请查看脚本悬浮窗中的教程页面,OCS官网 https://docs.ocsjs.com 。
// @author enncy
// @license MIT
// @match *://*.zhihuishu.com/*
// @match *://*.chaoxing.com/*
// @match *://*.edu.cn/*
// @match *://*.org.cn/*
// @grant GM_info
// @grant GM_getTab
// @grant GM_saveTab
// @grant GM_setValue
// @grant GM_getValue
// @grant unsafeWindow
// @grant GM_listValues
// @grant GM_deleteValue
// @grant GM_notification
// @grant GM_xmlhttpRequest
// @grant GM_getResourceText
// @grant GM_addValueChangeListener
// @grant GM_removeValueChangeListener
// @run-at document-start
// @namespace https://enncy.cn
// @homepage https://docs.ocsjs.com
// @source https://github.com/ocsjs/ocsjs
// @icon https://cdn.ocsjs.com/logo.png
// @connect enncy.cn
// @connect icodef.com
// @connect ocsjs.com
// @connect localhost
// @downloadURL none
// ==/UserScript==
(function(global2, factory) {
typeof exports === "object" && typeof module !== "undefined" ? factory(exports) : typeof define === "function" && define.amd ? define(["exports"], factory) : (global2 = typeof globalThis !== "undefined" ? globalThis : global2 || self, factory(global2.OCS = {}));
})(this, function(exports2) {
"use strict";
var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
function isObject$2(value) {
var type = typeof value;
return value != null && (type == "object" || type == "function");
}
var isObject_1 = isObject$2;
var freeGlobal$1 = typeof commonjsGlobal == "object" && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;
var _freeGlobal = freeGlobal$1;
var freeGlobal = _freeGlobal;
var freeSelf = typeof self == "object" && self && self.Object === Object && self;
var root$3 = freeGlobal || freeSelf || Function("return this")();
var _root = root$3;
var root$2 = _root;
var now$1 = function() {
return root$2.Date.now();
};
var now_1 = now$1;
var reWhitespace = /\s/;
function trimmedEndIndex$1(string) {
var index = string.length;
while (index-- && reWhitespace.test(string.charAt(index))) {
}
return index;
}
var _trimmedEndIndex = trimmedEndIndex$1;
var trimmedEndIndex = _trimmedEndIndex;
var reTrimStart = /^\s+/;
function baseTrim$1(string) {
return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, "") : string;
}
var _baseTrim = baseTrim$1;
var root$1 = _root;
var Symbol$3 = root$1.Symbol;
var _Symbol = Symbol$3;
var Symbol$2 = _Symbol;
var objectProto$1 = Object.prototype;
var hasOwnProperty = objectProto$1.hasOwnProperty;
var nativeObjectToString$1 = objectProto$1.toString;
var symToStringTag$1 = Symbol$2 ? Symbol$2.toStringTag : void 0;
function getRawTag$1(value) {
var isOwn = hasOwnProperty.call(value, symToStringTag$1), tag = value[symToStringTag$1];
try {
value[symToStringTag$1] = void 0;
var unmasked = true;
} catch (e) {
}
var result = nativeObjectToString$1.call(value);
if (unmasked) {
if (isOwn) {
value[symToStringTag$1] = tag;
} else {
delete value[symToStringTag$1];
}
}
return result;
}
var _getRawTag = getRawTag$1;
var objectProto = Object.prototype;
var nativeObjectToString = objectProto.toString;
function objectToString$1(value) {
return nativeObjectToString.call(value);
}
var _objectToString = objectToString$1;
var Symbol$1 = _Symbol, getRawTag = _getRawTag, objectToString = _objectToString;
var nullTag = "[object Null]", undefinedTag = "[object Undefined]";
var symToStringTag = Symbol$1 ? Symbol$1.toStringTag : void 0;
function baseGetTag$1(value) {
if (value == null) {
return value === void 0 ? undefinedTag : nullTag;
}
return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);
}
var _baseGetTag = baseGetTag$1;
function isObjectLike$1(value) {
return value != null && typeof value == "object";
}
var isObjectLike_1 = isObjectLike$1;
var baseGetTag = _baseGetTag, isObjectLike = isObjectLike_1;
var symbolTag = "[object Symbol]";
function isSymbol$1(value) {
return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag;
}
var isSymbol_1 = isSymbol$1;
var baseTrim = _baseTrim, isObject$1 = isObject_1, isSymbol = isSymbol_1;
var NAN = 0 / 0;
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
var reIsBinary = /^0b[01]+$/i;
var reIsOctal = /^0o[0-7]+$/i;
var freeParseInt = parseInt;
function toNumber$1(value) {
if (typeof value == "number") {
return value;
}
if (isSymbol(value)) {
return NAN;
}
if (isObject$1(value)) {
var other = typeof value.valueOf == "function" ? value.valueOf() : value;
value = isObject$1(other) ? other + "" : other;
}
if (typeof value != "string") {
return value === 0 ? value : +value;
}
value = baseTrim(value);
var isBinary = reIsBinary.test(value);
return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
}
var toNumber_1 = toNumber$1;
var isObject = isObject_1, now = now_1, toNumber = toNumber_1;
var FUNC_ERROR_TEXT = "Expected a function";
var nativeMax = Math.max, nativeMin = Math.min;
function debounce(func, wait, options) {
var lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true;
if (typeof func != "function") {
throw new TypeError(FUNC_ERROR_TEXT);
}
wait = toNumber(wait) || 0;
if (isObject(options)) {
leading = !!options.leading;
maxing = "maxWait" in options;
maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
trailing = "trailing" in options ? !!options.trailing : trailing;
}
function invokeFunc(time) {
var args = lastArgs, thisArg = lastThis;
lastArgs = lastThis = void 0;
lastInvokeTime = time;
result = func.apply(thisArg, args);
return result;
}
function leadingEdge(time) {
lastInvokeTime = time;
timerId = setTimeout(timerExpired, wait);
return leading ? invokeFunc(time) : result;
}
function remainingWait(time) {
var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall;
return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
}
function shouldInvoke(time) {
var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime;
return lastCallTime === void 0 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
}
function timerExpired() {
var time = now();
if (shouldInvoke(time)) {
return trailingEdge(time);
}
timerId = setTimeout(timerExpired, remainingWait(time));
}
function trailingEdge(time) {
timerId = void 0;
if (trailing && lastArgs) {
return invokeFunc(time);
}
lastArgs = lastThis = void 0;
return result;
}
function cancel() {
if (timerId !== void 0) {
clearTimeout(timerId);
}
lastInvokeTime = 0;
lastArgs = lastCallTime = lastThis = timerId = void 0;
}
function flush() {
return timerId === void 0 ? result : trailingEdge(now());
}
function debounced() {
var time = now(), isInvoking = shouldInvoke(time);
lastArgs = arguments;
lastThis = this;
lastCallTime = time;
if (isInvoking) {
if (timerId === void 0) {
return leadingEdge(lastCallTime);
}
if (maxing) {
clearTimeout(timerId);
timerId = setTimeout(timerExpired, wait);
return invokeFunc(lastCallTime);
}
}
if (timerId === void 0) {
timerId = setTimeout(timerExpired, wait);
}
return result;
}
debounced.cancel = cancel;
debounced.flush = flush;
return debounced;
}
var debounce_1 = debounce;
const $string = {
humpToTarget(value, target) {
return value.replace(/([A-Z])/g, target + "$1").toLowerCase().split(target).slice(1).join(target);
}
};
class StringUtils {
constructor(_text) {
this._text = _text;
}
static nowrap(str) {
return (str == null ? void 0 : str.replace(/\n/g, "")) || "";
}
nowrap() {
this._text = StringUtils.nowrap(this._text);
return this;
}
static nospace(str) {
return (str == null ? void 0 : str.replace(/ +/g, " ")) || "";
}
nospace() {
this._text = StringUtils.nospace(this._text);
return this;
}
static noSpecialChar(str) {
return (str == null ? void 0 : str.replace(/[^\w\s]/gi, "")) || "";
}
noSpecialChar() {
this._text = StringUtils.noSpecialChar(this._text);
return this;
}
static max(str, len) {
return str.length > len ? str.substring(0, len) + "..." : str;
}
max(len) {
this._text = StringUtils.max(this._text, len);
return this;
}
static hide(str, start2, end, replacer = "*") {
return str.substring(0, start2) + str.substring(start2, end).replace(/./g, replacer) + str.substring(end);
}
hide(start2, end, replacer = "*") {
this._text = StringUtils.hide(this._text, start2, end, replacer);
return this;
}
static of(text) {
return new StringUtils(text);
}
toString() {
return this._text;
}
}
const $const = {
TAB_UID: "_uid_",
TAB_URLS: "_urls_",
TAB_CURRENT_PANEL_NAME: "_current_panel_name_"
};
class LocalStoreChangeEvent extends Event {
constructor() {
super(...arguments);
this.key = "";
}
}
const _ObjectStoreProvider = class {
get(key, defaultValue) {
var _a;
return (_a = Reflect.get(_ObjectStoreProvider._source.store, key)) != null ? _a : defaultValue;
}
set(key, value) {
var _a;
const pre = Reflect.get(_ObjectStoreProvider._source.store, key);
Reflect.set(_ObjectStoreProvider._source.store, key, value);
(_a = _ObjectStoreProvider.storeListeners.get(key)) == null ? void 0 : _a.forEach((lis) => lis(value, pre));
}
delete(key) {
Reflect.deleteProperty(_ObjectStoreProvider._source.store, key);
}
list() {
return Object.keys(_ObjectStoreProvider._source.store);
}
async getTab(key) {
return Reflect.get(_ObjectStoreProvider._source.tab, key);
}
async setTab(key, value) {
var _a;
Reflect.set(_ObjectStoreProvider._source.tab, key, value);
(_a = _ObjectStoreProvider.tabListeners.get(key)) == null ? void 0 : _a.forEach((lis) => lis(value, this.getTab(key)));
}
addChangeListener(key, listener) {
const listeners = _ObjectStoreProvider.storeListeners.get(key) || [];
listeners.push(listener);
_ObjectStoreProvider.storeListeners.set(key, listeners);
}
removeChangeListener(listener) {
_ObjectStoreProvider.tabListeners.forEach((lis, key) => {
const index = lis.findIndex((l) => l === listener);
if (index !== -1) {
lis.splice(index, 1);
_ObjectStoreProvider.tabListeners.set(key, lis);
}
});
}
addTabChangeListener(key, listener) {
const listeners = _ObjectStoreProvider.tabListeners.get(key) || [];
listeners.push(listener);
_ObjectStoreProvider.tabListeners.set(key, listeners);
}
removeTabChangeListener(key, listener) {
const listeners = _ObjectStoreProvider.tabListeners.get(key) || [];
const index = listeners.findIndex((l) => l === listener);
if (index !== -1) {
listeners.splice(index, 1);
_ObjectStoreProvider.tabListeners.set(key, listeners);
}
}
};
let ObjectStoreProvider = _ObjectStoreProvider;
ObjectStoreProvider._source = { store: {}, tab: {} };
ObjectStoreProvider.storeListeners = /* @__PURE__ */ new Map();
ObjectStoreProvider.tabListeners = /* @__PURE__ */ new Map();
class GMStoreProvider {
getTabChangeHandleKey(tabUid, key) {
return `_tab_change_${tabUid}_${key}`;
}
get(key, defaultValue) {
return GM_getValue(key, defaultValue);
}
set(key, value) {
GM_setValue(key, value);
}
delete(key) {
GM_deleteValue(key);
}
list() {
return GM_listValues();
}
getTab(key) {
return new Promise((resolve, reject) => {
GM_getTab((tab = {}) => resolve(Reflect.get(tab, key)));
});
}
setTab(key, value) {
return new Promise((resolve, reject) => {
GM_getTab((tab = {}) => {
Reflect.set(tab, key, value);
GM_saveTab(tab);
this.set(this.getTabChangeHandleKey(Reflect.get(tab, $const.TAB_UID), key), value);
resolve();
});
});
}
addChangeListener(key, listener) {
return GM_addValueChangeListener(key, (_, pre, curr, remote) => {
listener(pre, curr, remote);
});
}
removeChangeListener(listenerId) {
GM_removeValueChangeListener(listenerId);
}
async addTabChangeListener(key, listener) {
const uid = await this.getTab($const.TAB_UID);
return GM_addValueChangeListener(this.getTabChangeHandleKey(uid, key), (_, pre, curr) => {
listener(curr, pre);
});
}
removeTabChangeListener(key, listener) {
return this.removeChangeListener(listener);
}
}
const $store = typeof globalThis.unsafeWindow === "undefined" ? new ObjectStoreProvider() : new GMStoreProvider();
const $ = {
createConfigProxy(script) {
var _a, _b;
const proxy = new Proxy(script.cfg, {
set(target, propertyKey, value) {
const key = $.namespaceKey(script.namespace, propertyKey);
$store.set(key, value);
return Reflect.set(target, propertyKey, value);
},
get(target, propertyKey) {
const value = $store.get($.namespaceKey(script.namespace, propertyKey));
Reflect.set(target, propertyKey, value);
return value;
}
});
for (const key in script.configs) {
if (Object.prototype.hasOwnProperty.call(script.configs, key)) {
const element = Reflect.get(script.configs, key);
Reflect.set(proxy, key, $store.get($.namespaceKey(script.namespace, key), element.defaultValue));
}
}
if (script.namespace) {
proxy.notes = (_b = (_a = script.configs) == null ? void 0 : _a.notes) == null ? void 0 : _b.defaultValue;
}
return proxy;
},
getAllRawConfigs(scripts) {
const object = {};
for (const script of scripts) {
for (const key in script.configs) {
if (Object.prototype.hasOwnProperty.call(script.configs, key)) {
const { label, ...element } = script.configs[key];
Reflect.set(object, $.namespaceKey(script.namespace, key), {
label: $.namespaceKey(script.namespace, key),
...element
});
}
}
}
return object;
},
getMatchedScripts(projects, urls) {
var _a;
const scripts = [];
for (const project of projects) {
for (const key in project.scripts) {
if (Object.prototype.hasOwnProperty.call(project.scripts, key)) {
const script = project.scripts[key];
if ((_a = script.excludes) == null ? void 0 : _a.some((u) => urls.some((url) => RegExp(u[1]).test(url)))) {
continue;
}
if (script.url.some((u) => urls.some((url) => RegExp(u[1]).test(url)))) {
scripts.push(script);
}
}
}
}
return scripts;
},
namespaceKey(namespace, key) {
return namespace ? namespace + "." + key.toString() : key.toString();
},
uuid() {
return "xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g, function(c) {
const r = Math.random() * 16 | 0;
const v = c === "x" ? r : r & 3 | 8;
return v.toString(16);
});
},
random(min, max) {
return Math.round(Math.random() * (max - min)) + min;
},
async sleep(period) {
return new Promise((resolve) => {
setTimeout(resolve, period);
});
},
isInBrowser() {
return typeof window !== "undefined" && typeof window.document !== "undefined";
},
elementToRawObject(el2) {
return {
innerText: el2 == null ? void 0 : el2.innerText,
innerHTML: el2 == null ? void 0 : el2.innerHTML,
textContent: el2 == null ? void 0 : el2.textContent
};
},
onresize(el2, handler) {
const resize = debounce_1(() => {
if (el2.parentNode === null) {
window.removeEventListener("resize", resize);
} else {
handler(el2);
}
}, 200);
resize();
window.addEventListener("resize", resize);
},
simplifyWorkResult(results) {
var _a, _b, _c, _d;
const res = [];
for (const wr of results) {
res.push({
requesting: wr.requesting,
resolving: wr.resolving,
error: wr.error,
question: (((_b = (_a = wr.ctx) == null ? void 0 : _a.elements.title) == null ? void 0 : _b.map((t2) => (t2 == null ? void 0 : t2.innerText) || "").filter(Boolean).join(",")) || "\u65E0").replace(/\d+\.\s*\((.+题|名词解释|完形填空|阅读理解), .+分\)/, "").replace(/[[|(|【|(]..题[\]|)|】|)]/, ""),
finish: (_c = wr.result) == null ? void 0 : _c.finish,
searchResults: ((_d = wr.ctx) == null ? void 0 : _d.searchResults.map((sr) => {
var _a2;
return {
error: (_a2 = sr.error) == null ? void 0 : _a2.message,
name: sr.name,
homepage: sr.homepage,
results: sr.answers.map((ans) => [ans.question, ans.answer])
};
})) || []
});
}
return res;
},
loadCustomElements(elements) {
for (const element of elements) {
const name = $string.humpToTarget(element.name, "-");
if (customElements.get(name) === void 0) {
customElements.define(name, element);
}
}
}
};
async function start(startConfig) {
const uid = await $store.getTab($const.TAB_UID);
if (uid === void 0) {
await $store.setTab($const.TAB_UID, $.uuid());
}
startConfig.projects = startConfig.projects.map((p) => {
for (const key in p.scripts) {
if (Object.prototype.hasOwnProperty.call(p.scripts, key)) {
p.scripts[key].cfg = $.createConfigProxy(p.scripts[key]);
}
}
return p;
});
const scripts = $.getMatchedScripts(startConfig.projects, [location.href]);
scripts.forEach((script) => {
var _a;
script.emit("start", startConfig);
(_a = script.onstart) == null ? void 0 : _a.call(script, startConfig);
});
let active = false;
if (document.readyState === "interactive") {
active = true;
scripts.forEach((script) => {
var _a;
return (_a = script.onactive) == null ? void 0 : _a.call(script, startConfig);
});
} else if (document.readyState === "complete") {
scripts.forEach((script) => {
var _a;
return (_a = script.onactive) == null ? void 0 : _a.call(script, startConfig);
});
scripts.forEach((script) => {
var _a;
return (_a = script.oncomplete) == null ? void 0 : _a.call(script, startConfig);
});
}
document.addEventListener("readystatechange", () => {
if (document.readyState === "interactive" && active === false) {
scripts.forEach((script) => {
var _a;
script.emit("active", startConfig);
(_a = script.onactive) == null ? void 0 : _a.call(script, startConfig);
});
}
if (document.readyState === "complete") {
scripts.forEach((script) => {
var _a;
script.emit("complete");
(_a = script.oncomplete) == null ? void 0 : _a.call(script, startConfig);
});
$store.getTab("_urls_").then((urls) => {
$store.setTab(`_urls_`, Array.from(new Set(urls || [])).concat(location.href));
});
}
});
history.pushState = addFunctionEventListener(history, "pushState");
history.replaceState = addFunctionEventListener(history, "replaceState");
window.addEventListener("pushState", () => {
scripts.forEach((script) => {
var _a;
script.emit("historychange", "push", startConfig);
(_a = script.onhistorychange) == null ? void 0 : _a.call(script, "push", startConfig);
});
});
window.addEventListener("replaceState", () => {
scripts.forEach((script) => {
var _a;
script.emit("historychange", "replace", startConfig);
(_a = script.onhistorychange) == null ? void 0 : _a.call(script, "replace", startConfig);
});
});
window.onbeforeunload = (e) => {
var _a;
let prevent;
for (const script of scripts) {
script.emit("beforeunload");
if ((_a = script.onbeforeunload) == null ? void 0 : _a.call(script, startConfig)) {
prevent = true;
}
}
if (prevent) {
e.preventDefault();
e.returnValue = true;
return true;
}
};
}
function addFunctionEventListener(obj, type) {
const origin = obj[type];
return function(...args) {
const res = origin.apply(this, args);
const e = new Event(type.toString());
e.arguments = args;
window.dispatchEvent(e);
return res;
};
}
function el(tagName, attrsOrChildren, childrenOrHandler) {
const element = document.createElement(tagName);
if (attrsOrChildren) {
if (Array.isArray(attrsOrChildren)) {
element.append(...attrsOrChildren);
} else if (typeof attrsOrChildren === "string") {
element.append(attrsOrChildren);
} else {
const attrs = attrsOrChildren;
for (const key in attrs) {
if (Object.prototype.hasOwnProperty.call(attrs, key)) {
const value = attrs[key];
Reflect.set(element, key, value);
}
}
}
}
if (childrenOrHandler) {
if (typeof childrenOrHandler === "function") {
childrenOrHandler.call(element, element);
} else if (Array.isArray(childrenOrHandler)) {
element.append(...childrenOrHandler);
} else if (typeof childrenOrHandler === "string") {
element.append(childrenOrHandler);
}
}
return element;
}
function $el(selector, root2 = window.document) {
return root2.querySelector(selector);
}
function $$el(selector, root2 = window.document) {
return Array.from(root2.querySelectorAll(selector));
}
function enableElementDraggable(header, target, ondrag) {
let pos1 = 0;
let pos2 = 0;
let pos3 = 0;
let pos4 = 0;
header.onmousedown = dragMouseDown;
function dragMouseDown(e) {
e = e || window.event;
pos3 = e.clientX;
pos4 = e.clientY;
document.onmouseup = closeDragElement;
document.onmousemove = elementDrag;
}
function elementDrag(e) {
e = e || window.event;
pos1 = pos3 - e.clientX;
pos2 = pos4 - e.clientY;
pos3 = e.clientX;
pos4 = e.clientY;
target.style.top = target.offsetTop - pos2 + "px";
target.style.left = target.offsetLeft - pos1 + "px";
}
function closeDragElement() {
ondrag == null ? void 0 : ondrag();
document.onmouseup = null;
document.onmousemove = null;
}
}
class IElement extends HTMLElement {
}
class ConfigElement extends IElement {
constructor() {
super(...arguments);
this.label = el("label");
this.wrapper = el("div", { className: "config-wrapper" });
this.key = "";
}
get value() {
return $store.get(this.key);
}
connectedCallback() {
var _a;
const createInput = () => {
this.provider = el("input");
if (["checkbox", "radio"].some((t2) => {
var _a2;
return t2 === ((_a2 = this.attrs) == null ? void 0 : _a2.type);
})) {
this.provider.checked = $store.get(this.key, this.defaultValue);
const provider = this.provider;
provider.onchange = () => {
$store.set(this.key, provider.checked);
};
} else {
this.provider.value = $store.get(this.key, this.defaultValue);
this.provider.setAttribute("value", this.provider.value);
this.provider.onchange = () => {
const { min, max, type } = this.attrs || {};
if (type === "number") {
const val = parseFloat(this.provider.value);
const _min = min ? parseFloat(min) : void 0;
const _max = max ? parseFloat(max) : void 0;
if (_min && val < _min) {
this.provider.value = _min.toString();
} else if (_max && val > _max) {
this.provider.value = _max.toString();
} else {
$store.set(this.key, val);
}
} else {
$store.set(this.key, this.provider.value);
}
};
}
};
switch (this.tag) {
case "input": {
createInput();
break;
}
case "select": {
this.provider = el("select");
this.provider.setAttribute("value", $store.get(this.key, this.defaultValue));
this.provider.onchange = () => {
$store.set(this.key, this.provider.value);
};
break;
}
case "textarea": {
this.provider = el("textarea");
this.provider.value = $store.get(this.key, this.defaultValue);
this.provider.onchange = () => {
$store.set(this.key, this.provider.value);
};
break;
}
default: {
createInput();
break;
}
}
this.wrapper.replaceChildren(this.provider);
this.append(this.label, this.wrapper);
for (const key in this.attrs) {
if (Object.prototype.hasOwnProperty.call(this.attrs, key)) {
Reflect.set(this.provider, key, Reflect.get(this.attrs, key));
}
}
if (this.sync) {
$store.addChangeListener(this.key, (pre, curr, remote) => {
this.provider.value = curr;
});
}
$creator.tooltip(this.provider);
(_a = this._onload) == null ? void 0 : _a.call(this.provider, this);
}
}
class ContainerElement extends IElement {
constructor() {
super(...arguments);
this.header = $creator.tooltip(el("header-element", { className: "header", title: "\u83DC\u5355\u680F-\u53EF\u62D6\u52A8\u533A\u57DF" }));
this.body = el("div", { className: "body", clientHeight: window.innerHeight / 2 });
this.footer = el("div", { className: "footer" });
}
connectedCallback() {
this.append(this.header, this.body, this.footer);
$.onresize(this, (cont) => {
cont.body.style.maxHeight = window.innerHeight - this.header.clientHeight - 100 + "px";
cont.body.style.maxWidth = window.innerWidth - 50 + "px";
});
}
}
class HeaderElement extends IElement {
connectedCallback() {
this.append(
this.profile || "",
this.projectSelector || "",
this.logo || "",
this.visualSwitcher || "",
this.closeButton || ""
);
}
}
class MessageElement extends IElement {
constructor() {
super(...arguments);
this.closer = el("span", { className: "message-closer" }, "x");
this.contentContainer = el("span", { className: "message-content-container" });
this.type = "info";
this.content = "";
this.closeable = true;
}
connectedCallback() {
this.classList.add(this.type);
if (typeof this.content === "string") {
this.contentContainer.innerHTML = this.content;
} else {
this.contentContainer.append(this.content);
}
this.duration = Math.max(this.duration === 0 ? 0 : this.duration || 5, 0);
this.append(this.contentContainer);
if (this.closeable) {
this.append(this.closer);
this.closer.addEventListener("click", () => {
var _a;
(_a = this.onClose) == null ? void 0 : _a.call(this);
this.remove();
});
}
if (this.duration) {
setTimeout(() => {
var _a;
(_a = this.onClose) == null ? void 0 : _a.call(this);
this.remove();
}, this.duration * 1e3);
}
}
}
const $gm = {
unsafeWindow: typeof globalThis.unsafeWindow === "undefined" ? globalThis.window : globalThis.unsafeWindow,
getInfos() {
return typeof GM_info === "undefined" ? void 0 : GM_info;
},
getTab(callback) {
return typeof GM_getTab === "undefined" ? void 0 : GM_getTab(callback);
},
notification(content, options) {
var _a;
const { onclick, ondone, important, duration = 0 } = options || {};
const { icon, name } = ((_a = $gm.getInfos()) == null ? void 0 : _a.script) || {};
GM_notification({
title: name,
text: content,
image: icon || "",
highlight: important,
onclick,
ondone,
silent: true,
timeout: duration * 1e3
});
}
};
class ModelElement extends IElement {
constructor() {
var _a;
super(...arguments);
this.profile = el("div", {
innerText: "\u5F39\u7A97\u6765\u81EA: OCS " + (((_a = $gm.getInfos()) == null ? void 0 : _a.script.version) || ""),
className: "model-profile"
});
this._title = el("div", { className: "model-title" });
this.body = el("div", { className: "model-body" });
this.footer = el("div", { className: "model-footer" });
this.modalInput = el("input", { className: "model-input" });
this.type = "alert";
this.content = "";
this.inputDefaultValue = "";
this.placeholder = "";
}
connectedCallback() {
this.classList.add(this.type);
this._title.innerText = this.title;
this.body.append(typeof this.content === "string" ? el("div", { innerHTML: this.content }) : this.content);
this.modalInput.placeholder = this.placeholder || "";
this.modalInput.value = this.inputDefaultValue || "";
this.footer.append(this.modalInput);
this.append(this.profile, this._title, this.body, this.footer);
this.style.width = (this.width || 400) + "px";
if (this.cancelButton === void 0) {
this.cancelButton = el("button", { className: "model-cancel-button" });
this.cancelButton.innerText = this.cancelButtonText || "\u53D6\u6D88";
this.cancelButton.addEventListener("click", () => {
var _a, _b;
(_a = this.onCancel) == null ? void 0 : _a.call(this);
(_b = this.onClose) == null ? void 0 : _b.call(this);
this.remove();
});
}
if (this.confirmButton === void 0) {
this.confirmButton = el("button", { className: "model-confirm-button" });
this.confirmButton.innerText = this.confirmButtonText || "\u786E\u5B9A";
this.confirmButton.addEventListener("click", async () => {
var _a, _b;
if (await ((_a = this.onConfirm) == null ? void 0 : _a.call(this, this.modalInput.value)) !== false) {
this.remove();
(_b = this.onClose) == null ? void 0 : _b.call(this, this.modalInput.value);
}
});
}
this.cancelButton !== null && this.footer.append(this.cancelButton);
this.confirmButton !== null && this.footer.append(this.confirmButton);
$.onresize(this.body, (modal) => {
this.body.style.maxHeight = window.innerHeight - 100 + "px";
this.body.style.maxWidth = window.innerWidth - 50 + "px";
});
}
}
class ScriptPanelElement extends IElement {
constructor() {
super(...arguments);
this.separator = el("div", { className: "separator" });
this.notesContainer = el("div", { className: "notes card" });
this.configsContainer = el("div", { className: "configs card" });
this.configsBody = el("div", { className: "configs-body" });
this.body = el("div", { className: "script-panel-body" });
}
connectedCallback() {
this.separator.innerText = this.name || "";
this.append(this.separator);
this.append(this.notesContainer);
this.append(this.configsContainer);
this.append(this.body);
}
}
function defaultWorkTypeResolver(ctx) {
function count(selector) {
let c = 0;
for (const option of ctx.elements.options || []) {
if ((option == null ? void 0 : option.querySelector(selector)) !== null) {
c++;
}
}
return c;
}
return count('[type="radio"]') === 2 ? "judgement" : count('[type="radio"]') > 2 ? "single" : count('[type="checkbox"]') > 2 ? "multiple" : count("textarea") >= 1 ? "completion" : void 0;
}
function isPlainAnswer(answer) {
if (answer.length > 8 || !/[A-Z]/.test(answer)) {
return false;
}
const counter = {};
let min = 0;
for (let i = 0; i < answer.length; i++) {
if (answer.charCodeAt(i) < min) {
return false;
}
min = answer.charCodeAt(i);
counter[min] = (counter[min] || 0) + 1;
}
for (const key in counter) {
if (counter[key] !== 1) {
return false;
}
}
return true;
}
function splitAnswer(answer) {
try {
const json = JSON.parse(answer);
if (Array.isArray(json)) {
return json.map(String).filter((el2) => el2.trim().length > 0);
}
} catch {
const seprators = ["===", "#", "---", "###", "|", ";"];
for (const sep of seprators) {
if (answer.split(sep).length > 1) {
return answer.split(sep).filter((el2) => el2.trim().length > 0);
}
}
}
return [answer];
}
const transformImgLink = (str) => str.replace(/https?:\/\/.*?\.(png|jpg|jpeg|gif)/g, (match) => ` ${text}`);
class SearchResultsElement extends IElement {
constructor() {
super(...arguments);
this.results = [];
this.question = "";
}
connectedCallback() {
const question = transformImgLink(this.question || "\u65E0");
this.append(
el("div", [question, $creator.copy("\u590D\u5236", question)], (div) => {
div.style.padding = "4px";
}),
el("hr")
);
this.append(
...this.results.map((res) => {
return el("details", { open: true }, [
el("summary", [el("a", { href: res.homepage, innerText: res.name })]),
...res.error ? [el("span", { className: "error" }, ["\u6B64\u9898\u5E93\u641C\u9898\u65F6\u53D1\u751F\u9519\u8BEF\uFF1A", res.error || "\u7F51\u7EDC\u9519\u8BEF\u6216\u8005\u672A\u77E5\u9519\u8BEF"])] : [
...res.results.map((ans) => {
const title = transformImgLink(ans[0] || this.question || "\u65E0");
const answer = transformImgLink(ans[1] || "\u65E0");
return el("div", { className: "search-result" }, [
el("div", { className: "question" }, [el("span", title), $creator.copy("\u590D\u5236", title)]),
el("div", { className: "answer" }, [
el("span", "\u7B54\u6848\uFF1A"),
...splitAnswer(answer).map((a) => el("code", a)),
$creator.copy("\u590D\u5236", splitAnswer(answer).join(" "))
])
]);
})
]
]);
})
);
$.onresize(this, (sr) => {
sr.style.maxHeight = window.innerHeight / 2 + "px";
});
}
}
const definedCustomElements = [
ConfigElement,
ContainerElement,
HeaderElement,
ModelElement,
MessageElement,
ScriptPanelElement,
SearchResultsElement
];
class CorsEventEmitter {
constructor() {
this.eventMap = /* @__PURE__ */ new Map();
}
eventKey(name) {
return "cors.events." + name;
}
tempKey(...args) {
return ["_temp_", ...args].join(".");
}
keyOfReturn(id) {
return this.tempKey("event", id, "return");
}
keyOfArguments(id) {
return this.tempKey("event", id, "arguments");
}
keyOfState(id) {
return this.tempKey("event", id, "state");
}
emit(name, args, callback) {
$store.getTab($const.TAB_UID).then((uid) => {
const id = $.uuid().replace(/-/g, "");
const key = uid + "." + this.eventKey(name);
$store.set(this.keyOfState(id), 0);
$store.set(this.keyOfArguments(id), args);
const listenerId = $store.addChangeListener(this.keyOfState(id), (pre, curr, remote) => {
$store.removeChangeListener(listenerId);
callback($store.get(this.keyOfReturn(id)), !!remote);
$store.delete(this.keyOfState(id));
$store.delete(this.keyOfReturn(id));
$store.delete(this.keyOfArguments(id));
}) || 0;
$store.set(key, ($store.get(key) ? String($store.get(key)).split(",") : []).concat(id).join(","));
}).catch(console.error);
}
on(name, handler) {
return new Promise((resolve) => {
$store.getTab($const.TAB_UID).then((uid) => {
const key = uid + "." + this.eventKey(name);
const originId = this.eventMap.get(key);
if (originId) {
resolve(originId);
} else {
const id = $store.addChangeListener(key, async (pre, curr, remote) => {
if (remote) {
const list = String(curr).split(",");
const id2 = list.pop();
if (id2) {
$store.set(this.keyOfReturn(id2), await handler($store.get(this.keyOfArguments(id2))));
setTimeout(() => {
$store.set(this.keyOfState(id2), 1);
$store.set(key, list.join(","));
}, 100);
}
}
}) || 0;
this.eventMap.set(key, id);
resolve(id);
}
}).catch(console.error);
});
}
off(name) {
const key = this.eventKey(name);
const originId = this.eventMap.get(key);
if (originId) {
this.eventMap.delete(key);
$store.removeChangeListener(originId);
}
}
}
if (typeof GM_listValues !== "undefined") {
window.onload = () => {
$store.list().forEach((key) => {
if (/_temp_.event.[0-9a-z]{32}.(state|return|arguments)/.test(key)) {
$store.delete(key);
}
if (/[0-9a-z]{32}.cors.events.model/.test(key)) {
$store.delete(key);
}
});
};
}
const cors = new CorsEventEmitter();
class Project {
constructor({ name, level, domains, scripts, studyProject }) {
this.name = name;
this.level = level;
this.domains = domains;
this.scripts = scripts;
this.studyProject = studyProject;
}
static create(opts2) {
return new Project(opts2);
}
}
var events = { exports: {} };
var R = typeof Reflect === "object" ? Reflect : null;
var ReflectApply = R && typeof R.apply === "function" ? R.apply : function ReflectApply2(target, receiver, args) {
return Function.prototype.apply.call(target, receiver, args);
};
var ReflectOwnKeys;
if (R && typeof R.ownKeys === "function") {
ReflectOwnKeys = R.ownKeys;
} else if (Object.getOwnPropertySymbols) {
ReflectOwnKeys = function ReflectOwnKeys2(target) {
return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target));
};
} else {
ReflectOwnKeys = function ReflectOwnKeys2(target) {
return Object.getOwnPropertyNames(target);
};
}
function ProcessEmitWarning(warning) {
if (console && console.warn)
console.warn(warning);
}
var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) {
return value !== value;
};
function EventEmitter() {
EventEmitter.init.call(this);
}
events.exports = EventEmitter;
events.exports.once = once;
EventEmitter.EventEmitter = EventEmitter;
EventEmitter.prototype._events = void 0;
EventEmitter.prototype._eventsCount = 0;
EventEmitter.prototype._maxListeners = void 0;
var defaultMaxListeners = 10;
function checkListener(listener) {
if (typeof listener !== "function") {
throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
}
}
Object.defineProperty(EventEmitter, "defaultMaxListeners", {
enumerable: true,
get: function() {
return defaultMaxListeners;
},
set: function(arg) {
if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) {
throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + ".");
}
defaultMaxListeners = arg;
}
});
EventEmitter.init = function() {
if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) {
this._events = /* @__PURE__ */ Object.create(null);
this._eventsCount = 0;
}
this._maxListeners = this._maxListeners || void 0;
};
EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) {
throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + ".");
}
this._maxListeners = n;
return this;
};
function _getMaxListeners(that) {
if (that._maxListeners === void 0)
return EventEmitter.defaultMaxListeners;
return that._maxListeners;
}
EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
return _getMaxListeners(this);
};
EventEmitter.prototype.emit = function emit(type) {
var args = [];
for (var i = 1; i < arguments.length; i++)
args.push(arguments[i]);
var doError = type === "error";
var events2 = this._events;
if (events2 !== void 0)
doError = doError && events2.error === void 0;
else if (!doError)
return false;
if (doError) {
var er;
if (args.length > 0)
er = args[0];
if (er instanceof Error) {
throw er;
}
var err = new Error("Unhandled error." + (er ? " (" + er.message + ")" : ""));
err.context = er;
throw err;
}
var handler = events2[type];
if (handler === void 0)
return false;
if (typeof handler === "function") {
ReflectApply(handler, this, args);
} else {
var len = handler.length;
var listeners = arrayClone(handler, len);
for (var i = 0; i < len; ++i)
ReflectApply(listeners[i], this, args);
}
return true;
};
function _addListener(target, type, listener, prepend) {
var m;
var events2;
var existing;
checkListener(listener);
events2 = target._events;
if (events2 === void 0) {
events2 = target._events = /* @__PURE__ */ Object.create(null);
target._eventsCount = 0;
} else {
if (events2.newListener !== void 0) {
target.emit(
"newListener",
type,
listener.listener ? listener.listener : listener
);
events2 = target._events;
}
existing = events2[type];
}
if (existing === void 0) {
existing = events2[type] = listener;
++target._eventsCount;
} else {
if (typeof existing === "function") {
existing = events2[type] = prepend ? [listener, existing] : [existing, listener];
} else if (prepend) {
existing.unshift(listener);
} else {
existing.push(listener);
}
m = _getMaxListeners(target);
if (m > 0 && existing.length > m && !existing.warned) {
existing.warned = true;
var w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit");
w.name = "MaxListenersExceededWarning";
w.emitter = target;
w.type = type;
w.count = existing.length;
ProcessEmitWarning(w);
}
}
return target;
}
EventEmitter.prototype.addListener = function addListener(type, listener) {
return _addListener(this, type, listener, false);
};
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
EventEmitter.prototype.prependListener = function prependListener(type, listener) {
return _addListener(this, type, listener, true);
};
function onceWrapper() {
if (!this.fired) {
this.target.removeListener(this.type, this.wrapFn);
this.fired = true;
if (arguments.length === 0)
return this.listener.call(this.target);
return this.listener.apply(this.target, arguments);
}
}
function _onceWrap(target, type, listener) {
var state2 = { fired: false, wrapFn: void 0, target, type, listener };
var wrapped = onceWrapper.bind(state2);
wrapped.listener = listener;
state2.wrapFn = wrapped;
return wrapped;
}
EventEmitter.prototype.once = function once2(type, listener) {
checkListener(listener);
this.on(type, _onceWrap(this, type, listener));
return this;
};
EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) {
checkListener(listener);
this.prependListener(type, _onceWrap(this, type, listener));
return this;
};
EventEmitter.prototype.removeListener = function removeListener(type, listener) {
var list, events2, position, i, originalListener;
checkListener(listener);
events2 = this._events;
if (events2 === void 0)
return this;
list = events2[type];
if (list === void 0)
return this;
if (list === listener || list.listener === listener) {
if (--this._eventsCount === 0)
this._events = /* @__PURE__ */ Object.create(null);
else {
delete events2[type];
if (events2.removeListener)
this.emit("removeListener", type, list.listener || listener);
}
} else if (typeof list !== "function") {
position = -1;
for (i = list.length - 1; i >= 0; i--) {
if (list[i] === listener || list[i].listener === listener) {
originalListener = list[i].listener;
position = i;
break;
}
}
if (position < 0)
return this;
if (position === 0)
list.shift();
else {
spliceOne(list, position);
}
if (list.length === 1)
events2[type] = list[0];
if (events2.removeListener !== void 0)
this.emit("removeListener", type, originalListener || listener);
}
return this;
};
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) {
var listeners, events2, i;
events2 = this._events;
if (events2 === void 0)
return this;
if (events2.removeListener === void 0) {
if (arguments.length === 0) {
this._events = /* @__PURE__ */ Object.create(null);
this._eventsCount = 0;
} else if (events2[type] !== void 0) {
if (--this._eventsCount === 0)
this._events = /* @__PURE__ */ Object.create(null);
else
delete events2[type];
}
return this;
}
if (arguments.length === 0) {
var keys = Object.keys(events2);
var key;
for (i = 0; i < keys.length; ++i) {
key = keys[i];
if (key === "removeListener")
continue;
this.removeAllListeners(key);
}
this.removeAllListeners("removeListener");
this._events = /* @__PURE__ */ Object.create(null);
this._eventsCount = 0;
return this;
}
listeners = events2[type];
if (typeof listeners === "function") {
this.removeListener(type, listeners);
} else if (listeners !== void 0) {
for (i = listeners.length - 1; i >= 0; i--) {
this.removeListener(type, listeners[i]);
}
}
return this;
};
function _listeners(target, type, unwrap) {
var events2 = target._events;
if (events2 === void 0)
return [];
var evlistener = events2[type];
if (evlistener === void 0)
return [];
if (typeof evlistener === "function")
return unwrap ? [evlistener.listener || evlistener] : [evlistener];
return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
}
EventEmitter.prototype.listeners = function listeners(type) {
return _listeners(this, type, true);
};
EventEmitter.prototype.rawListeners = function rawListeners(type) {
return _listeners(this, type, false);
};
EventEmitter.listenerCount = function(emitter, type) {
if (typeof emitter.listenerCount === "function") {
return emitter.listenerCount(type);
} else {
return listenerCount.call(emitter, type);
}
};
EventEmitter.prototype.listenerCount = listenerCount;
function listenerCount(type) {
var events2 = this._events;
if (events2 !== void 0) {
var evlistener = events2[type];
if (typeof evlistener === "function") {
return 1;
} else if (evlistener !== void 0) {
return evlistener.length;
}
}
return 0;
}
EventEmitter.prototype.eventNames = function eventNames() {
return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
};
function arrayClone(arr, n) {
var copy = new Array(n);
for (var i = 0; i < n; ++i)
copy[i] = arr[i];
return copy;
}
function spliceOne(list, index) {
for (; index + 1 < list.length; index++)
list[index] = list[index + 1];
list.pop();
}
function unwrapListeners(arr) {
var ret = new Array(arr.length);
for (var i = 0; i < ret.length; ++i) {
ret[i] = arr[i].listener || arr[i];
}
return ret;
}
function once(emitter, name) {
return new Promise(function(resolve, reject) {
function errorListener(err) {
emitter.removeListener(name, resolver);
reject(err);
}
function resolver() {
if (typeof emitter.removeListener === "function") {
emitter.removeListener("error", errorListener);
}
resolve([].slice.call(arguments));
}
eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });
if (name !== "error") {
addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });
}
});
}
function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
if (typeof emitter.on === "function") {
eventTargetAgnosticAddListener(emitter, "error", handler, flags);
}
}
function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
if (typeof emitter.on === "function") {
if (flags.once) {
emitter.once(name, listener);
} else {
emitter.on(name, listener);
}
} else if (typeof emitter.addEventListener === "function") {
emitter.addEventListener(name, function wrapListener(arg) {
if (flags.once) {
emitter.removeEventListener(name, wrapListener);
}
listener(arg);
});
} else {
throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter);
}
}
var EventEmitter$1 = events.exports;
class CommonEventEmitter extends EventEmitter$1 {
on(eventName, listener) {
return super.on(eventName.toString(), listener);
}
once(eventName, listener) {
return super.once(eventName.toString(), listener);
}
emit(eventName, ...args) {
return super.emit(eventName.toString(), ...args);
}
off(eventName, listener) {
return super.off(eventName.toString(), listener);
}
}
class BaseScript extends CommonEventEmitter {
}
class Script extends BaseScript {
constructor({
name,
namespace,
url,
excludes,
configs,
hideInPanel,
onstart,
onactive,
oncomplete,
onbeforeunload,
onrender,
onhistorychange
}) {
super();
this.excludes = [];
this.cfg = {};
this.event = new EventEmitter$1();
this.name = name;
this.namespace = namespace;
this.url = url;
this.excludes = excludes;
this._configs = configs;
this.hideInPanel = hideInPanel;
this.onstart = onstart;
this.onactive = onactive;
this.oncomplete = oncomplete;
this.onbeforeunload = onbeforeunload;
this.onrender = onrender;
this.onhistorychange = onhistorychange;
}
get configs() {
if (!this._resolvedConfigs) {
this._resolvedConfigs = typeof this._configs === "function" ? this._configs() : this._configs;
}
return this._resolvedConfigs;
}
set configs(c) {
this._configs = c;
}
onConfigChange(key, handler) {
const _key = $.namespaceKey(this.namespace, key.toString());
return $store.addChangeListener(_key, (pre, curr, remote) => {
handler(curr, pre, !!remote);
});
}
offConfigChange(listener) {
$store.removeChangeListener(listener);
}
}
const panel = el("div");
const root = panel.attachShadow({ mode: "closed" });
const $elements = {
panel,
root,
messageContainer: el("div", { className: "message-container" }),
tooltip: el("div", { className: "tooltip" })
};
root.append($elements.messageContainer, $elements.tooltip);
const RenderScript = new Script({
name: "\u60AC\u6D6E\u7A97",
url: [["\u6240\u6709", /.*/]],
namespace: "render.panel",
configs: {
x: { defaultValue: window.innerWidth * 0.1 },
y: { defaultValue: window.innerWidth * 0.1 },
visual: { defaultValue: "normal" },
firstCloseAlert: {
defaultValue: true
},
fontsize: {
label: "\u5B57\u4F53\u5927\u5C0F\uFF08\u50CF\u7D20\uFF09",
attrs: { type: "number", min: 12, max: 24, step: 1 },
defaultValue: 14
},
switchPoint: {
label: "\u7A97\u53E3\u663E\u793A\u8FDE\u70B9\uFF08\u6B21\u6570\uFF09",
attrs: {
type: "number",
min: 3,
max: 10,
step: 1,
title: "\u8BBE\u7F6E\u5F53\u8FDE\u7EED\u70B9\u51FB\u5C4F\u5E55 N \u6B21\u65F6\uFF0C\u53EF\u4EE5\u8FDB\u884C\u9762\u677F\u7684 \u9690\u85CF/\u663E\u793A \u5207\u6362\uFF0C\u9ED8\u8BA4\u8FDE\u7EED\u70B9\u51FB\u5C4F\u5E55\u4E09\u4E0B"
},
defaultValue: 3
}
},
async onactive({ style, projects }) {
$.loadCustomElements(definedCustomElements);
const matchedScripts = $.getMatchedScripts(projects, [location.href]).filter((s) => !s.hideInPanel);
const container = el("container-element");
const initHeader = (urls, currentPanelName) => {
const infos = $gm.getInfos();
container.header.logo = $creator.tooltip(
el("img", {
src: (infos == null ? void 0 : infos.script.icon) || "https://cdn.ocsjs.com/logo.png",
width: 18,
className: "logo",
title: "\u5B98\u65B9\u6559\u7A0B",
onclick: () => {
window.open((infos == null ? void 0 : infos.script.homepage) || "https://docs.ocsjs.com", "_blank");
}
})
);
container.header.profile = $creator.tooltip(
el(
"div",
{ className: "profile", title: "\u83DC\u5355\u680F\uFF08\u53EF\u62D6\u52A8\u533A\u57DF\uFF09" },
`OCS${infos ? "-" : ""}${(infos == null ? void 0 : infos.script.version) || ""}`
)
);
const projectSelector = el(
"select",
{
id: "project-selector",
onchange: async () => {
await $store.setTab($const.TAB_CURRENT_PANEL_NAME, projectSelector.value);
}
},
async (select) => {
const sortedProjects = projects.sort(({ level: a = 0 }, { level: b = 0 }) => b - a);
for (const project of sortedProjects) {
const scripts = $.getMatchedScripts([project], urls).filter((s) => !s.hideInPanel).sort(({ level: a = 0 }, { level: b = 0 }) => b - a);
if (scripts.length) {
const group = el("optgroup", { label: project.name });
const options = scripts.map(
(script, i) => el("option", {
value: project.name + "-" + script.name,
label: script.name,
selected: isCurrentPanel(project.name, script, currentPanelName)
})
);
group.append(...options);
select.append(group);
}
}
}
);
const projectSelectorDiv = $creator.tooltip(
el(
"div",
{
className: "project-selector",
title: "\u70B9\u51FB\u9009\u62E9\u811A\u672C\u64CD\u4F5C\u9875\u9762\uFF0C\u90E8\u5206\u811A\u672C\u4F1A\u63D0\u4F9B\u64CD\u4F5C\u9875\u9762\uFF08\u5305\u542B\u811A\u672C\u8BBE\u7F6E\u548C\u811A\u672C\u63D0\u793A\uFF09\u3002"
},
[projectSelector]
)
);
container.header.projectSelector = projectSelectorDiv;
const isMinimize = () => this.cfg.visual === "minimize";
const visualSwitcher = $creator.tooltip(
el("div", {
className: "switch ",
title: isMinimize() ? "\u70B9\u51FB\u5C55\u5F00\u7A97\u53E3" : "\u70B9\u51FB\u6700\u5C0F\u5316\u7A97\u53E3",
innerText: isMinimize() ? "\u25A1" : "-",
onclick: () => {
this.cfg.visual = isMinimize() ? "normal" : "minimize";
visualSwitcher.title = isMinimize() ? "\u70B9\u51FB\u5C55\u5F00\u7A97\u53E3" : "\u70B9\u51FB\u6700\u5C0F\u5316\u7A97\u53E3";
visualSwitcher.innerText = isMinimize() ? "\u25A1" : "-";
}
})
);
container.header.visualSwitcher = visualSwitcher;
container.header.closeButton = $creator.tooltip(
el("div", {
className: "close ",
innerText: "x",
title: "\u70B9\u51FB\u5173\u95ED\u7A97\u53E3\uFF08\u4E0D\u4F1A\u5F71\u54CD\u811A\u672C\u8FD0\u884C\uFF0C\u8FDE\u7EED\u70B9\u51FB\u4E09\u6B21\u9875\u9762\u4EFB\u610F\u4F4D\u7F6E\u53EF\u4EE5\u91CD\u65B0\u5524\u51FA\u7A97\u53E3\uFF09",
onclick: () => {
if (this.cfg.firstCloseAlert) {
$model("confirm", {
content: $creator.notes([
"\u5173\u95ED\u811A\u672C\u9875\u9762\u540E\uFF0C\u5FEB\u901F\u70B9\u51FB\u9875\u9762\u4E09\u4E0B\uFF08\u53EF\u4EE5\u5728\u60AC\u6D6E\u7A97\u8BBE\u7F6E\u4E2D\u8C03\u6574\u6B21\u6570\uFF09\u5373\u53EF\u91CD\u65B0\u663E\u793A\u811A\u672C\u3002\u5982\u679C\u4E09\u4E0B\u65E0\u6548\uFF0C\u53EF\u4EE5\u5C1D\u8BD5\u5220\u9664\u811A\u672C\u91CD\u65B0\u5B89\u88C5\u3002",
"\u8BF7\u786E\u8BA4\u662F\u5426\u5173\u95ED\u3002\uFF08\u6B64\u540E\u4E0D\u518D\u663E\u793A\u6B64\u5F39\u7A97\uFF09"
]),
onConfirm: () => {
this.cfg.visual = "close";
this.cfg.firstCloseAlert = false;
}
});
} else {
this.cfg.visual = "close";
}
}
})
);
container.header.replaceChildren();
container.header.append(
container.header.profile || "",
container.header.projectSelector || "",
container.header.logo || "",
container.header.visualSwitcher || "",
container.header.closeButton || ""
);
};
const initPanelAndScript = (projectName, script) => {
const panel2 = $creator.scriptPanel(script, { projectName });
script.projectName = projectName;
script.panel = panel2;
script.header = container.header;
return panel2;
};
const createBody = async (urls, currentPanelName) => {
const list = [];
for (const project of projects) {
const scripts = $.getMatchedScripts([project], urls).filter((s) => !s.hideInPanel);
for (const script of scripts) {
list.push({ script, panel: initPanelAndScript(project.name, script) });
}
}
const index = list.findIndex((i) => isCurrentPanel(i.script.projectName, i.script, currentPanelName));
const targetIndex = index === -1 ? 0 : index;
if (list[targetIndex]) {
return [list[targetIndex]];
} else {
if (list[0]) {
return [list[0]];
} else {
return [{
script: RenderProject.scripts.render,
panel: initPanelAndScript(RenderProject.name, RenderProject.scripts.render)
}];
}
}
};
const handlePosition = () => {
container.style.top = this.cfg.y + "px";
container.style.left = this.cfg.x + "px";
const positionHandler = () => {
this.cfg.x = container.offsetLeft;
this.cfg.y = container.offsetTop;
};
enableElementDraggable(container.header, container, positionHandler);
};
const handleVisible = () => {
const visual = (value) => {
container.className = "";
if (value === "minimize") {
container.classList.add("minimize");
} else if (value === "close") {
container.classList.add("close");
} else {
container.classList.add("normal");
}
};
window.addEventListener("click", (e) => {
if (e.detail === Math.max(this.cfg.switchPoint, 3)) {
container.style.top = e.y + "px";
container.style.left = e.x + "px";
this.cfg.x = e.x;
this.cfg.y = e.y;
this.cfg.visual = this.cfg.visual === "close" ? "normal" : this.cfg.visual;
}
});
this.onConfigChange("visual", (curr) => visual(curr));
visual(this.cfg.visual);
};
const renderBody = async (urls, currentPanelName) => {
var _a;
const list = await createBody(urls, currentPanelName);
container.body.replaceChildren(...list.map((i) => i.panel));
const scripts = list.map((i) => i.script);
const index = scripts.findIndex((s) => isCurrentPanel(s.projectName, s, currentPanelName));
const script = scripts[index === -1 ? 0 : index];
if (script == null ? void 0 : script.panel) {
(_a = script.onrender) == null ? void 0 : _a.call(script, { panel: script.panel, header: container.header });
script.emit("render", { panel: script.panel, header: container.header });
}
};
const initModelSystem = () => {
cors.on("model", async ([type, _attrs]) => {
return new Promise((resolve, reject) => {
const attrs = _attrs;
attrs.onCancel = () => resolve("");
attrs.onConfirm = resolve;
attrs.onClose = resolve;
$model(type, attrs);
});
});
};
const onFontsizeChange = () => {
container.style.font = `${this.cfg.fontsize}px Menlo, Monaco, Consolas, 'Courier New', monospace`;
};
const rerender = (urls, currentPanelName) => {
initHeader(urls, currentPanelName);
renderBody(urls, currentPanelName);
};
if (matchedScripts.length !== 0 && self === top) {
container.append(el("style", {}, style || ""), $elements.messageContainer);
container.body.append(el("div", { className: "card" }, [$creator.notes(["OCS\u8B66\u544A : ", "\u5F53\u524D\u6D4F\u89C8\u5668\u7248\u672C\u8FC7\u4F4E\u6216\u8005\u4E0D\u517C\u5BB9\uFF0C\u8BF7\u4E0B\u8F7D\u5176\u4ED6\u6D4F\u89C8\u5668\uFF0C", "\u4F8B\u5982\u8C37\u6B4C\u6D4F\u89C8\u5668\u6216\u8005\u5FAE\u8F6F\u6D4F\u89C8\u5668\u3002"])]));
$elements.root.append(container);
document.body.children[$.random(0, document.body.children.length - 1)].after($elements.panel);
(async () => {
const urls = await $store.getTab($const.TAB_URLS);
const currentPanelName = await $store.getTab($const.TAB_CURRENT_PANEL_NAME);
rerender(urls || [], currentPanelName || "");
})();
initModelSystem();
handlePosition();
onFontsizeChange();
$store.addTabChangeListener(
$const.TAB_URLS,
debounce_1(async (urls = [location.href]) => {
const currentPanelName = await $store.getTab($const.TAB_CURRENT_PANEL_NAME);
rerender(urls, currentPanelName);
}, 2e3)
);
$store.addTabChangeListener($const.TAB_CURRENT_PANEL_NAME, async (currentPanelName) => {
const urls = await $store.getTab($const.TAB_URLS) || [location.href];
rerender(urls, currentPanelName);
});
this.onConfigChange("fontsize", onFontsizeChange);
}
handleVisible();
}
});
function $model(type, attrs) {
if (self === top) {
const {
disableWrapperCloseable,
onConfirm,
onCancel,
onClose,
notification: notify,
notificationOptions,
..._attrs
} = attrs;
if (notify) {
$gm.notification(
typeof _attrs.content === "string" ? _attrs.content : _attrs.content.innerText,
notificationOptions
);
}
const wrapper = el("div", { className: "model-wrapper" }, (wrapper2) => {
const model = el("model-element", {
async onConfirm(val) {
const isClose = await (onConfirm == null ? void 0 : onConfirm.apply(model, [val]));
if (isClose !== false) {
wrapper2.remove();
}
return isClose;
},
onCancel() {
onCancel == null ? void 0 : onCancel.apply(model);
wrapper2.remove();
},
onClose(val) {
onClose == null ? void 0 : onClose.apply(model, [val]);
wrapper2.remove();
},
type,
..._attrs
});
wrapper2.append(model);
model.addEventListener("click", (e) => {
e.stopPropagation();
});
if (!disableWrapperCloseable) {
wrapper2.addEventListener("click", () => {
onClose == null ? void 0 : onClose.apply(model);
wrapper2.remove();
});
}
});
$elements.root.append(wrapper);
return wrapper;
} else {
cors.emit("model", [type, attrs], (args, remote) => {
var _a, _b;
if (args) {
(_a = attrs.onConfirm) == null ? void 0 : _a.call(attrs, args);
} else {
(_b = attrs.onCancel) == null ? void 0 : _b.call(attrs);
}
});
}
}
function $message(type, attrs) {
const message = el("message-element", { type, ...attrs });
$elements.messageContainer.append(message);
return message;
}
const RenderProject = Project.create({
name: "\u6E32\u67D3",
domains: [],
scripts: {
render: RenderScript
}
});
function isCurrentPanel(projectName, script, currentPanelName) {
return projectName + "-" + script.name === currentPanelName || script.namespace === currentPanelName;
}
const $creator = {
notes(lines, tag = "ul") {
return el(
tag,
lines.map((line) => el("li", Array.isArray(line) ? line.map((node) => el("div", [node])) : [line]))
);
},
tooltip(target) {
target.setAttribute("data-title", target.title);
if (typeof $gm.unsafeWindow !== "undefined") {
target.removeAttribute("title");
}
const onMouseMove = (e) => {
$elements.tooltip.style.top = e.y + "px";
$elements.tooltip.style.left = e.x + "px";
};
const showTitle = (e) => {
const dataTitle = target.getAttribute("data-title");
if (dataTitle) {
$elements.tooltip.innerHTML = dataTitle.split("\n").join("
") || "";
$elements.tooltip.style.top = e.y + "px";
$elements.tooltip.style.left = e.x + "px";
$elements.tooltip.style.display = "block";
} else {
$elements.tooltip.style.display = "none";
}
window.addEventListener("mousemove", onMouseMove);
};
const hideTitle = () => {
$elements.tooltip.style.display = "none";
window.removeEventListener("mousemove", onMouseMove);
};
hideTitle();
target.addEventListener("mouseenter", showTitle);
target.addEventListener("click", showTitle);
target.addEventListener("mouseout", hideTitle);
target.addEventListener("blur", hideTitle);
return target;
},
selectOptions(selectedValue = "", options) {
return options.map(
(opt) => el("option", { value: String(opt[0]), innerText: opt[1], title: opt[2] }, (opt2) => {
if (opt2.value === selectedValue) {
opt2.toggleAttribute("selected");
}
})
);
},
input(attrs, children, handler) {
return el("input", attrs, function(input) {
input.append(...children || []);
input.classList.add("base-style-input");
handler == null ? void 0 : handler.apply(this, [input]);
});
},
button(text, attrs, handler) {
return el("input", { type: "button", ...attrs }, function(btn) {
btn.value = text || "";
btn.classList.add("base-style-button");
handler == null ? void 0 : handler.apply(this, [btn]);
});
},
scriptPanel(script, opts2) {
var _a, _b;
const scriptPanel = el("script-panel-element", { name: script.name });
script.onConfigChange("notes", (pre, curr) => {
scriptPanel.notesContainer.innerHTML = script.cfg.notes || "";
});
script.panel = scriptPanel;
scriptPanel.notesContainer.innerHTML = ((_b = (_a = script.configs) == null ? void 0 : _a.notes) == null ? void 0 : _b.defaultValue) || "";
const els = $creator.configs(script.namespace, script.configs || {}, opts2.onload);
const elList = [];
for (const key in els) {
if (Object.prototype.hasOwnProperty.call(els, key)) {
elList.push(els[key]);
}
}
scriptPanel.configsBody.append(...elList);
scriptPanel.configsContainer.append(scriptPanel.configsBody);
return scriptPanel;
},
configs(namespace, configs, onload) {
const elements = /* @__PURE__ */ Object.create({});
for (const key in configs) {
if (Object.prototype.hasOwnProperty.call(configs, key)) {
const config = configs[key];
if (config.label !== void 0) {
const element = el("config-element", {
key: $.namespaceKey(namespace, key),
tag: config.tag,
sync: config.sync,
attrs: config.attrs,
_onload: config.onload,
defaultValue: config.defaultValue
});
onload == null ? void 0 : onload(element);
element.label.textContent = config.label;
elements[key] = element;
}
}
}
return elements;
},
copy(name, value) {
return el("span", "\u{1F4C4}" + name, (btn) => {
btn.className = "copy";
btn.addEventListener("click", () => {
btn.innerText = "\u5DF2\u590D\u5236\u221A";
navigator.clipboard.writeText(value);
setTimeout(() => {
btn.innerText = "\u{1F4C4}" + name;
}, 500);
});
});
},
preventText(opts2) {
const { name, delay = 3, autoRemove = true, ondefault, onprevent } = opts2;
const span = el("span", name);
span.style.textDecoration = "underline";
span.style.cursor = "pointer";
span.onclick = () => {
clearTimeout(id);
if (autoRemove) {
span.remove();
}
onprevent == null ? void 0 : onprevent(span);
};
const id = setTimeout(() => {
if (autoRemove) {
span.remove();
}
ondefault(span);
}, delay * 1e3);
return span;
},
workPreCheckMessage(options) {
const { onrun, ondone, ...opts2 } = options;
if (opts2.answererWrappers.length === 0) {
$model("alert", { content: "\u68C0\u6D4B\u5230\u9898\u5E93\u914D\u7F6E\u4E3A\u7A7A\uFF0C\u65E0\u6CD5\u81EA\u52A8\u7B54\u9898\uFF0C\u8BF7\u524D\u5F80\u5168\u5C40\u8BBE\u7F6E\u9875\u9762\u8FDB\u884C\u914D\u7F6E\u3002" });
ondone == null ? void 0 : ondone(opts2);
} else {
$message("info", {
duration: 5,
content: el("span", [
"5\u79D2\u540E\u81EA\u52A8\u7B54\u9898\u3002\u5E76\u5207\u6362\u5230\u201C\u901A\u7528-\u641C\u7D22\u7ED3\u679C\u201D\u3002",
$creator.preventText({
name: "\u70B9\u51FB\u53D6\u6D88\u6B64\u6B21\u7B54\u9898",
delay: 5,
ondefault: (span) => {
onrun(opts2);
},
onprevent(span) {
$message("warn", { content: "\u5DF2\u5173\u95ED\u6B64\u6B21\u7684\u81EA\u52A8\u7B54\u9898\u3002" });
ondone == null ? void 0 : ondone(opts2);
}
})
])
});
}
}
};
const $script = {
async pin(script) {
if (script.projectName) {
await $store.setTab($const.TAB_CURRENT_PANEL_NAME, `${script.projectName}-${script.name}`);
} else if (script.namespace) {
await $store.setTab($const.TAB_CURRENT_PANEL_NAME, script.namespace);
} else {
console.warn("[OCS]", `${script.name} \u65E0\u6CD5\u7F6E\u9876\uFF0C projectName \u4E0E namespace \u90FD\u4E3A undefined`);
}
}
};
function domSearch(wrapper, root2 = window.document) {
const obj = /* @__PURE__ */ Object.create({});
Reflect.ownKeys(wrapper).forEach((key) => {
const item = wrapper[key.toString()];
Reflect.set(
obj,
key,
typeof item === "string" ? root2.querySelector(item) : typeof item === "function" ? item(root2) : item.map((fun) => fun(root2))
);
});
return obj;
}
function domSearchAll(wrapper, root2 = window.document) {
const obj = /* @__PURE__ */ Object.create({});
Reflect.ownKeys(wrapper).forEach((key) => {
const item = wrapper[key.toString()];
Reflect.set(
obj,
key,
typeof item === "string" ? Array.from(root2.querySelectorAll(item)) : typeof item === "function" ? item(root2) : item.map((fun) => fun(root2))
);
});
return obj;
}
var src = {
compareTwoStrings,
findBestMatch
};
function compareTwoStrings(first, second) {
first = first.replace(/\s+/g, "");
second = second.replace(/\s+/g, "");
if (first === second)
return 1;
if (first.length < 2 || second.length < 2)
return 0;
let firstBigrams = /* @__PURE__ */ new Map();
for (let i = 0; i < first.length - 1; i++) {
const bigram = first.substring(i, i + 2);
const count = firstBigrams.has(bigram) ? firstBigrams.get(bigram) + 1 : 1;
firstBigrams.set(bigram, count);
}
let intersectionSize = 0;
for (let i = 0; i < second.length - 1; i++) {
const bigram = second.substring(i, i + 2);
const count = firstBigrams.has(bigram) ? firstBigrams.get(bigram) : 0;
if (count > 0) {
firstBigrams.set(bigram, count - 1);
intersectionSize++;
}
}
return 2 * intersectionSize / (first.length + second.length - 2);
}
function findBestMatch(mainString, targetStrings) {
if (!areArgsValid(mainString, targetStrings))
throw new Error("Bad arguments: First argument should be a string, second should be an array of strings");
const ratings = [];
let bestMatchIndex = 0;
for (let i = 0; i < targetStrings.length; i++) {
const currentTargetString = targetStrings[i];
const currentRating = compareTwoStrings(mainString, currentTargetString);
ratings.push({ target: currentTargetString, rating: currentRating });
if (currentRating > ratings[bestMatchIndex].rating) {
bestMatchIndex = i;
}
}
const bestMatch = ratings[bestMatchIndex];
return { ratings, bestMatch, bestMatchIndex };
}
function areArgsValid(mainString, targetStrings) {
if (typeof mainString !== "string")
return false;
if (!Array.isArray(targetStrings))
return false;
if (!targetStrings.length)
return false;
if (targetStrings.find(function(s) {
return typeof s !== "string";
}))
return false;
return true;
}
function clearString(str, ...exclude) {
return str.trim().toLocaleLowerCase().replace(RegExp(`[^\\u4e00-\\u9fa5A-Za-z0-9${exclude.join("")}]*`, "g"), "");
}
function answerSimilar(answers, options) {
answers = answers.map(removeRedundant);
options = options.map(removeRedundant);
const similar = answers.length !== 0 ? options.map((option) => src.findBestMatch(option, answers).bestMatch) : options.map((opt) => ({ rating: 0, target: "" }));
return similar;
}
function removeRedundant(str) {
return (str == null ? void 0 : str.trim().replace(/[A-Z]{1}[^A-Za-z0-9\u4e00-\u9fa5]+([A-Za-z0-9\u4e00-\u9fa5]+)/, "$1")) || "";
}
function request(url, opts2) {
return new Promise((resolve, reject) => {
try {
const { contentType = "json", method = "get", type = "fetch", data = {}, headers = {} } = opts2 || {};
const env = $.isInBrowser() ? "browser" : "node";
if (type === "GM_xmlhttpRequest" && env === "browser") {
if (typeof GM_xmlhttpRequest !== "undefined") {
GM_xmlhttpRequest({
url,
method: method === "get" ? "GET" : "POST",
data: new URLSearchParams(data).toString(),
headers,
responseType: "json",
onload: (response) => {
if (response.status === 200) {
if (contentType === "json") {
try {
resolve(JSON.parse(response.responseText));
} catch (error) {
reject(error);
}
} else {
resolve(response.responseText);
}
} else {
reject(response.responseText);
}
},
onerror: reject
});
} else {
reject(new Error("GM_xmlhttpRequest is not defined"));
}
} else {
const fet = env === "node" ? require("node-fetch").default : fetch;
fet(url, { contentType, body: method === "post" ? JSON.stringify(data) : void 0, method, headers }).then((response) => {
if (contentType === "json") {
response.json().then(resolve).catch(reject);
} else {
response.text().then(resolve).catch(reject);
}
}).catch((error) => {
reject(new Error(error));
});
}
} catch (error) {
reject(error);
}
});
}
function defaultQuestionResolve(ctx) {
return {
async single(results, options, handler) {
for (const result of results) {
for (const answer of result.answers) {
const ans = StringUtils.nowrap(answer.answer).trim();
if (ans.length === 1 && isPlainAnswer(ans)) {
const index2 = ans.charCodeAt(0) - 65;
await handler("single", options[index2].innerText, options[index2], ctx);
await $.sleep(500);
return { finish: true, option: options[index2] };
}
}
}
const ratings = answerSimilar(
results.map((res) => res.answers.map((ans) => ans.answer)).flat(),
options.map((el2) => el2.innerText)
);
let index = -1;
let max = 0;
ratings.forEach((rating, i) => {
if (rating.rating > max) {
max = rating.rating;
index = i;
}
});
if (index !== -1 && max > 0.6) {
await handler("single", options[index].innerText, options[index], ctx);
await $.sleep(500);
return {
finish: true,
ratings: ratings.map((r) => r.rating)
};
}
return { finish: false };
},
async multiple(results, options, handler) {
const targetAnswers = [];
const targetOptions = [];
let count = 0;
for (const answers of results.map((res) => res.answers.map((ans) => ans.answer))) {
targetAnswers[count] = [];
targetOptions[count] = [];
options.forEach((el2, i) => {
if (answers.some((answer) => answer.includes(removeRedundant(el2.innerText)))) {
targetAnswers[count][i] = el2.innerText;
targetOptions[count][i] = el2;
}
});
for (const answer of answers) {
const ans = StringUtils.nowrap(answer).trim();
if (isPlainAnswer(ans)) {
for (let i = 0; i < ans.length; i++) {
const index2 = ans.charCodeAt(i) - 65;
targetAnswers[count][i] = options[index2].innerText;
targetOptions[count][i] = options[index2];
}
}
}
if (targetAnswers[count].length === 0) {
const ratings = answerSimilar(
answers,
options.map((el2) => el2.innerText)
).sort((a, b) => b.rating - a.rating);
if (ratings.some((rating) => rating.rating > 0.6)) {
options.forEach((el2, i) => {
if (ratings[i].rating > 0.6) {
targetAnswers[count][i] = el2.innerText;
targetOptions[count][i] = el2;
}
});
}
}
count++;
}
let max = 0;
let index = -1;
for (let i = 0; i < targetOptions.length; i++) {
const len = targetAnswers[i].filter((ans) => ans !== void 0).length;
if (len > max) {
max = len;
index = i;
}
}
if (index === -1) {
return { finish: false };
} else {
targetAnswers[index] = targetAnswers[index].filter((ans) => ans !== void 0);
targetOptions[index] = targetOptions[index].filter((ans) => ans !== void 0);
for (let i = 0; i < targetOptions[index].length; i++) {
await handler("multiple", targetAnswers[index][i], targetOptions[index][i], ctx);
await $.sleep(500);
}
return { finish: true, targetOptions, targetAnswers };
}
},
async judgement(results, options, handler) {
for (const answers of results.map((res) => res.answers.map((ans) => ans.answer))) {
let matches = function(target, options2) {
return options2.some((option) => RegExp(clearString(option, "\u221A", "\xD7")).test(clearString(target, "\u221A", "\xD7")));
};
const correctWords = ["\u662F", "\u5BF9", "\u6B63\u786E", "\u221A", "\u5BF9\u7684", "\u662F\u7684", "\u6B63\u786E\u7684", "true", "yes", "1"];
const incorrectWords = [
"\u975E",
"\u5426",
"\u9519",
"\u9519\u8BEF",
"\xD7",
"X",
"\u9519\u7684",
"\u4E0D\u5BF9",
"\u4E0D\u6B63\u786E\u7684",
"\u4E0D\u6B63\u786E",
"\u4E0D\u662F",
"\u4E0D\u662F\u7684",
"false",
"no",
"0"
];
const answerShowCorrect = answers.find((answer) => matches(answer, correctWords));
const answerShowIncorrect = answers.find((answer) => matches(answer, incorrectWords));
if (answerShowCorrect || answerShowIncorrect) {
let option;
for (const el2 of options) {
const textShowCorrect = matches(el2.innerText, correctWords);
const textShowIncorrect = matches(el2.innerText, incorrectWords);
if (answerShowCorrect && textShowCorrect) {
option = el2;
await handler("judgement", answerShowCorrect, el2, ctx);
await $.sleep(500);
break;
}
if (answerShowIncorrect && textShowIncorrect) {
option = el2;
await handler("judgement", answerShowIncorrect, el2, ctx);
await $.sleep(500);
break;
}
}
return { finish: true, option };
}
}
return { finish: false };
},
async completion(results, options, handler) {
for (const answers of results.map((res) => res.answers.map((ans) => ans.answer))) {
let ans = answers.filter((ans2) => ans2);
if (ans.length === 1) {
ans = splitAnswer(ans[0]);
}
if (ans.length !== 0 && (ans.length === options.length || options.length === 1)) {
if (ans.length === options.length) {
for (let index = 0; index < options.length; index++) {
const element = options[index];
await handler("completion", ans[index], element, ctx);
await $.sleep(500);
}
return { finish: true };
} else if (options.length === 1) {
await handler("completion", ans.join(" "), options[0], ctx);
await $.sleep(500);
return { finish: true };
}
return { finish: false };
}
}
return { finish: false };
}
};
}
class OCSWorker extends CommonEventEmitter {
constructor(opts2) {
super();
this.isRunning = false;
this.isClose = false;
this.isStop = false;
this.requestIndex = 0;
this.resolverIndex = 0;
this.totalQuestionCount = 0;
this.locks = [];
this.opts = opts2;
}
async doWork() {
var _a, _b, _c, _d;
this.requestIndex = 0;
this.resolverIndex = 0;
this.totalQuestionCount = 0;
this.once("close", () => {
this.isClose = true;
});
this.on("stop", () => {
this.isStop = true;
});
this.on("continuate", () => {
this.isStop = false;
});
this.emit("start");
this.isRunning = true;
const questionRoot = typeof this.opts.root === "string" ? Array.from(document.querySelectorAll(this.opts.root)) : this.opts.root;
this.totalQuestionCount = questionRoot.length;
this.locks = Array(this.totalQuestionCount).fill(1);
const results = [];
for (const q of questionRoot) {
const ctx = {
searchResults: [],
root: q,
elements: domSearchAll(this.opts.elements, q)
};
await ((_b = (_a = this.opts).onElementSearched) == null ? void 0 : _b.call(_a, ctx.elements));
ctx.elements.title = (_c = ctx.elements.title) == null ? void 0 : _c.filter(Boolean);
ctx.elements.options = (_d = ctx.elements.options) == null ? void 0 : _d.filter(Boolean);
results.push({
requesting: true,
resolving: true,
type: void 0,
ctx
});
}
const resolvers = [];
const requestThread = async () => {
var _a2, _b2, _c2;
while (this.locks.shift()) {
const i = this.requestIndex++;
const ctx = results[i].ctx || {};
if (this.isClose === true) {
this.isRunning = false;
this.emit("close");
this.emit("done");
return results;
}
let type;
let error;
if (typeof this.opts.work === "object") {
type = this.opts.work.type === void 0 ? defaultWorkTypeResolver(ctx) : typeof this.opts.work.type === "string" ? this.opts.work.type : this.opts.work.type(ctx);
}
if (this.isStop) {
await new Promise((resolve, reject) => {
const interval = setInterval(() => {
if (this.isStop === false) {
clearInterval(interval);
resolve();
}
}, 200);
});
}
const searchResults = await this.doAnswer(ctx.elements, type, ctx);
let resultPromise;
if (!searchResults) {
error = "\u7B54\u6848\u83B7\u53D6\u5931\u8D25, \u8BF7\u91CD\u65B0\u8FD0\u884C, \u6216\u8005\u5FFD\u7565\u6B64\u9898\u3002";
} else {
searchResults.forEach((res) => {
res.answers = res.answers.map((ans) => {
ans.answer = ans.answer ? ans.answer : "";
return ans;
});
});
ctx.searchResults = searchResults;
if (searchResults.length === 0) {
error = "\u641C\u7D22\u4E0D\u5230\u7B54\u6848, \u8BF7\u91CD\u65B0\u8FD0\u884C, \u6216\u8005\u5FFD\u7565\u6B64\u9898\u3002";
}
if (typeof this.opts.work === "object") {
if (ctx.elements.options) {
if (type) {
const resolver = defaultQuestionResolve(ctx)[type];
const handler = this.opts.work.handler;
resultPromise = async () => await resolver(searchResults, ctx.elements.options, handler);
} else {
error = "\u9898\u76EE\u7C7B\u578B\u89E3\u6790\u5931\u8D25, \u8BF7\u81EA\u884C\u63D0\u4F9B\u89E3\u6790\u5668, \u6216\u8005\u5FFD\u7565\u6B64\u9898\u3002";
}
} else {
error = "elements.options \u4E3A\u7A7A ! \u4F7F\u7528\u9ED8\u8BA4\u5904\u7406\u5668, \u5FC5\u987B\u63D0\u4F9B\u9898\u76EE\u9009\u9879\u7684\u9009\u62E9\u5668\u3002";
}
} else {
const work = this.opts.work;
resultPromise = async () => await work(ctx);
}
}
const currentResult = {
requesting: false,
resolving: true,
ctx,
error,
type
};
results[i] = currentResult;
if (resultPromise) {
resolvers.push({
func: resultPromise,
index: i
});
} else {
resolvers.push({
func: async () => ({ finish: false }),
index: i
});
}
await ((_b2 = (_a2 = this.opts).onResultsUpdate) == null ? void 0 : _b2.call(_a2, results, currentResult));
await $.sleep(((_c2 = this.opts.requestPeriod) != null ? _c2 : 3) * 1e3);
}
};
const resolverThread = new Promise((resolve) => {
const start2 = async () => {
var _a2, _b2, _c2, _d2;
if (this.resolverIndex < this.totalQuestionCount) {
const resolver = resolvers.shift();
if (resolver) {
try {
const result = await resolver.func();
results[resolver.index].result = result;
results[resolver.index].resolving = false;
await ((_b2 = (_a2 = this.opts).onResultsUpdate) == null ? void 0 : _b2.call(_a2, results, results[resolver.index]));
await ((_d2 = (_c2 = this.opts).onResolveUpdate) == null ? void 0 : _d2.call(_c2, results[resolver.index]));
} catch (e) {
results[resolver.index].result = { finish: false };
results[resolver.index].resolving = false;
results[resolver.index].error = (e == null ? void 0 : e.message) || e;
}
this.resolverIndex++;
loop();
} else {
loop();
}
} else {
resolve();
}
};
const loop = async () => {
var _a2;
setTimeout(start2, ((_a2 = this.opts.resolvePeriod) != null ? _a2 : 0) * 1e3);
};
start2();
});
await Promise.all([
...Array(Math.max(this.opts.thread || 1, 1)).fill("").map(() => requestThread()),
resolverThread
]);
this.isRunning = false;
this.emit("done");
return results;
}
async doAnswer(elements, type, ctx) {
const { timeout: _t, retry: _r } = this.opts;
const timeout = _t != null ? _t : 60;
let retry = _r != null ? _r : 2;
const answer = async () => {
return await Promise.race([
this.opts.answerer(elements, type, ctx),
$.sleep(timeout * 1e3)
]);
};
let answers = await answer();
if (!answers) {
while (retry && !answers) {
answers = await answer();
retry--;
}
}
return answers;
}
async uploadHandler(options) {
var _a;
const { results, type, callback } = options;
let finished = 0;
for (const result of results) {
if ((_a = result.result) == null ? void 0 : _a.finish) {
finished++;
}
}
const rate = results.length === 0 ? 0 : finished / results.length * 100;
if (type !== "nomove") {
if (type === "force") {
await callback(rate, true);
} else {
await callback(rate, type === "save" ? false : rate >= parseFloat(type.toString()));
}
}
}
}
async function defaultAnswerWrapperHandler(answererWrappers, env) {
const searchResults = [];
const temp = JSON.parse(JSON.stringify(answererWrappers));
await Promise.all(
temp.map(async (wrapper) => {
const {
name = "\u672A\u77E5\u9898\u5E93",
homepage = "#",
method = "get",
type = "fetch",
contentType = "json",
headers = {},
data: wrapperData = {},
handler = "return (res)=> [JSON.stringify(res), undefined]"
} = wrapper;
try {
let answers = [];
const data = /* @__PURE__ */ Object.create({});
Reflect.ownKeys(wrapperData).forEach((key) => {
Reflect.set(data, key, resolvePlaceHolder(wrapperData[key.toString()]));
});
let url = resolvePlaceHolder(wrapper.url);
url = method === "post" ? url : url + "?" + new URLSearchParams(data).toString();
const requestData = {
method,
contentType,
data,
type,
headers: JSON.parse(JSON.stringify(headers || {}))
};
const responseData = await request(url, requestData);
const info = Function(handler)()(responseData);
if (info && Array.isArray(info)) {
if (info.every((item) => Array.isArray(item))) {
answers = answers.concat(
info.map((item) => ({
question: item[0],
answer: item[1]
}))
);
} else {
answers.push({
question: info[0],
answer: info[1]
});
}
}
searchResults.push({
url: wrapper.url,
name,
homepage,
answers,
response: responseData,
data: requestData
});
} catch (error) {
searchResults.push({
url: wrapper.url,
name,
homepage,
answers: [],
response: void 0,
data: void 0,
error
});
}
})
);
function resolvePlaceHolder(str) {
if (typeof str === "string") {
const matches = str.match(/\${(.*?)}/g) || [];
matches.forEach((placeHolder) => {
const value = env[placeHolder.replace(/\${(.*)}/, "$1")];
str = str.replace(placeHolder, value);
});
}
return str;
}
return searchResults;
}
class AnswerWrapperParser {
static fromObject(json) {
const aw = json;
if (aw && Array.isArray(aw)) {
if (aw.length) {
for (let i = 0; i < aw.length; i++) {
const item = aw[i];
if (typeof item.name !== "string") {
throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 \u540D\u5B57(name) \u4E3A\u7A7A`);
}
if (typeof item.url !== "string") {
throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 \u63A5\u53E3\u5730\u5740(url) \u4E3A\u7A7A`);
}
if (typeof item.name !== "string") {
throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 \u89E3\u6790\u5668(handler) \u4E3A\u7A7A`);
}
if (item.headers && typeof item.headers !== "object") {
throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 \u5934\u90E8\u4FE1\u606F(header) \u5E94\u4E3A \u5BF9\u8C61 \u683C\u5F0F`);
}
if (item.data && typeof item.data !== "object") {
throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 \u63D0\u4EA4\u6570\u636E(data) \u5E94\u4E3A \u5BF9\u8C61 \u683C\u5F0F`);
}
const contentTypes = ["json", "text"];
if (item.contentType && contentTypes.every((i2) => i2 !== item.contentType)) {
throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 contentType \u5FC5\u987B\u4E3A\u4EE5\u4E0B\u9009\u9879\u4E2D\u7684\u4E00\u4E2A ${contentTypes.join(", ")}`);
}
const methods = ["post", "get"];
if (item.method && methods.every((i2) => i2 !== item.method)) {
throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 method \u5FC5\u987B\u4E3A\u4EE5\u4E0B\u9009\u9879\u4E2D\u7684\u4E00\u4E2A ${methods.join(", ")}`);
}
const types = ["fetch", "GM_xmlhttpRequest"];
if (item.type && types.every((i2) => i2 !== item.type)) {
throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 type \u5FC5\u987B\u4E3A\u4EE5\u4E0B\u9009\u9879\u4E2D\u7684\u4E00\u4E2A ${types.join(", ")}`);
}
}
return aw;
} else {
throw new Error("\u9898\u5E93\u4E3A\u7A7A\uFF01");
}
} else {
throw new Error("\u9898\u5E93\u914D\u7F6E\u683C\u5F0F\u9519\u8BEF\uFF01");
}
}
static fromJSONString(json) {
const raw = json.toString();
try {
return JSON.parse(raw);
} catch {
throw new Error(`\u683C\u5F0F\u9519\u8BEF\uFF0C\u5FC5\u987B\u4E3A\uFF1Ajson\u5B57\u7B26\u4E32 \u6216 \u9898\u5E93\u914D\u7F6E\u94FE\u63A5`);
}
}
static async fromURL(url) {
const text = await request(url, {
contentType: "text",
method: "get",
type: "fetch"
});
return this.fromJSONString(text);
}
static fromBase64(base64) {
return this.fromJSONString(Buffer.from(base64, "base64").toString("utf8"));
}
static from(value) {
if (typeof value === "string") {
if (value.startsWith("http")) {
return this.fromURL(value);
} else {
return this.fromJSONString(value);
}
} else {
return this.fromObject(value);
}
}
}
const debug$1 = typeof process === "object" && process.env && {}.NODE_DEBUG && /\bsemver\b/i.test({}.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => {
};
var debug_1 = debug$1;
const SEMVER_SPEC_VERSION = "2.0.0";
const MAX_LENGTH$1 = 256;
const MAX_SAFE_INTEGER$1 = Number.MAX_SAFE_INTEGER || 9007199254740991;
const MAX_SAFE_COMPONENT_LENGTH = 16;
var constants = {
SEMVER_SPEC_VERSION,
MAX_LENGTH: MAX_LENGTH$1,
MAX_SAFE_INTEGER: MAX_SAFE_INTEGER$1,
MAX_SAFE_COMPONENT_LENGTH
};
var re$1 = { exports: {} };
(function(module2, exports3) {
const { MAX_SAFE_COMPONENT_LENGTH: MAX_SAFE_COMPONENT_LENGTH2 } = constants;
const debug2 = debug_1;
exports3 = module2.exports = {};
const re2 = exports3.re = [];
const src2 = exports3.src = [];
const t2 = exports3.t = {};
let R2 = 0;
const createToken = (name, value, isGlobal) => {
const index = R2++;
debug2(name, index, value);
t2[name] = index;
src2[index] = value;
re2[index] = new RegExp(value, isGlobal ? "g" : void 0);
};
createToken("NUMERICIDENTIFIER", "0|[1-9]\\d*");
createToken("NUMERICIDENTIFIERLOOSE", "[0-9]+");
createToken("NONNUMERICIDENTIFIER", "\\d*[a-zA-Z-][a-zA-Z0-9-]*");
createToken("MAINVERSION", `(${src2[t2.NUMERICIDENTIFIER]})\\.(${src2[t2.NUMERICIDENTIFIER]})\\.(${src2[t2.NUMERICIDENTIFIER]})`);
createToken("MAINVERSIONLOOSE", `(${src2[t2.NUMERICIDENTIFIERLOOSE]})\\.(${src2[t2.NUMERICIDENTIFIERLOOSE]})\\.(${src2[t2.NUMERICIDENTIFIERLOOSE]})`);
createToken("PRERELEASEIDENTIFIER", `(?:${src2[t2.NUMERICIDENTIFIER]}|${src2[t2.NONNUMERICIDENTIFIER]})`);
createToken("PRERELEASEIDENTIFIERLOOSE", `(?:${src2[t2.NUMERICIDENTIFIERLOOSE]}|${src2[t2.NONNUMERICIDENTIFIER]})`);
createToken("PRERELEASE", `(?:-(${src2[t2.PRERELEASEIDENTIFIER]}(?:\\.${src2[t2.PRERELEASEIDENTIFIER]})*))`);
createToken("PRERELEASELOOSE", `(?:-?(${src2[t2.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src2[t2.PRERELEASEIDENTIFIERLOOSE]})*))`);
createToken("BUILDIDENTIFIER", "[0-9A-Za-z-]+");
createToken("BUILD", `(?:\\+(${src2[t2.BUILDIDENTIFIER]}(?:\\.${src2[t2.BUILDIDENTIFIER]})*))`);
createToken("FULLPLAIN", `v?${src2[t2.MAINVERSION]}${src2[t2.PRERELEASE]}?${src2[t2.BUILD]}?`);
createToken("FULL", `^${src2[t2.FULLPLAIN]}$`);
createToken("LOOSEPLAIN", `[v=\\s]*${src2[t2.MAINVERSIONLOOSE]}${src2[t2.PRERELEASELOOSE]}?${src2[t2.BUILD]}?`);
createToken("LOOSE", `^${src2[t2.LOOSEPLAIN]}$`);
createToken("GTLT", "((?:<|>)?=?)");
createToken("XRANGEIDENTIFIERLOOSE", `${src2[t2.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);
createToken("XRANGEIDENTIFIER", `${src2[t2.NUMERICIDENTIFIER]}|x|X|\\*`);
createToken("XRANGEPLAIN", `[v=\\s]*(${src2[t2.XRANGEIDENTIFIER]})(?:\\.(${src2[t2.XRANGEIDENTIFIER]})(?:\\.(${src2[t2.XRANGEIDENTIFIER]})(?:${src2[t2.PRERELEASE]})?${src2[t2.BUILD]}?)?)?`);
createToken("XRANGEPLAINLOOSE", `[v=\\s]*(${src2[t2.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src2[t2.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src2[t2.XRANGEIDENTIFIERLOOSE]})(?:${src2[t2.PRERELEASELOOSE]})?${src2[t2.BUILD]}?)?)?`);
createToken("XRANGE", `^${src2[t2.GTLT]}\\s*${src2[t2.XRANGEPLAIN]}$`);
createToken("XRANGELOOSE", `^${src2[t2.GTLT]}\\s*${src2[t2.XRANGEPLAINLOOSE]}$`);
createToken("COERCE", `${"(^|[^\\d])(\\d{1,"}${MAX_SAFE_COMPONENT_LENGTH2}})(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH2}}))?(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH2}}))?(?:$|[^\\d])`);
createToken("COERCERTL", src2[t2.COERCE], true);
createToken("LONETILDE", "(?:~>?)");
createToken("TILDETRIM", `(\\s*)${src2[t2.LONETILDE]}\\s+`, true);
exports3.tildeTrimReplace = "$1~";
createToken("TILDE", `^${src2[t2.LONETILDE]}${src2[t2.XRANGEPLAIN]}$`);
createToken("TILDELOOSE", `^${src2[t2.LONETILDE]}${src2[t2.XRANGEPLAINLOOSE]}$`);
createToken("LONECARET", "(?:\\^)");
createToken("CARETTRIM", `(\\s*)${src2[t2.LONECARET]}\\s+`, true);
exports3.caretTrimReplace = "$1^";
createToken("CARET", `^${src2[t2.LONECARET]}${src2[t2.XRANGEPLAIN]}$`);
createToken("CARETLOOSE", `^${src2[t2.LONECARET]}${src2[t2.XRANGEPLAINLOOSE]}$`);
createToken("COMPARATORLOOSE", `^${src2[t2.GTLT]}\\s*(${src2[t2.LOOSEPLAIN]})$|^$`);
createToken("COMPARATOR", `^${src2[t2.GTLT]}\\s*(${src2[t2.FULLPLAIN]})$|^$`);
createToken("COMPARATORTRIM", `(\\s*)${src2[t2.GTLT]}\\s*(${src2[t2.LOOSEPLAIN]}|${src2[t2.XRANGEPLAIN]})`, true);
exports3.comparatorTrimReplace = "$1$2$3";
createToken("HYPHENRANGE", `^\\s*(${src2[t2.XRANGEPLAIN]})\\s+-\\s+(${src2[t2.XRANGEPLAIN]})\\s*$`);
createToken("HYPHENRANGELOOSE", `^\\s*(${src2[t2.XRANGEPLAINLOOSE]})\\s+-\\s+(${src2[t2.XRANGEPLAINLOOSE]})\\s*$`);
createToken("STAR", "(<|>)?=?\\s*\\*");
createToken("GTE0", "^\\s*>=\\s*0\\.0\\.0\\s*$");
createToken("GTE0PRE", "^\\s*>=\\s*0\\.0\\.0-0\\s*$");
})(re$1, re$1.exports);
const opts = ["includePrerelease", "loose", "rtl"];
const parseOptions$1 = (options) => !options ? {} : typeof options !== "object" ? { loose: true } : opts.filter((k) => options[k]).reduce((o, k) => {
o[k] = true;
return o;
}, {});
var parseOptions_1 = parseOptions$1;
const numeric = /^[0-9]+$/;
const compareIdentifiers$1 = (a, b) => {
const anum = numeric.test(a);
const bnum = numeric.test(b);
if (anum && bnum) {
a = +a;
b = +b;
}
return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1;
};
const rcompareIdentifiers = (a, b) => compareIdentifiers$1(b, a);
var identifiers = {
compareIdentifiers: compareIdentifiers$1,
rcompareIdentifiers
};
const debug = debug_1;
const { MAX_LENGTH, MAX_SAFE_INTEGER } = constants;
const { re, t } = re$1.exports;
const parseOptions = parseOptions_1;
const { compareIdentifiers } = identifiers;
class SemVer$1 {
constructor(version, options) {
options = parseOptions(options);
if (version instanceof SemVer$1) {
if (version.loose === !!options.loose && version.includePrerelease === !!options.includePrerelease) {
return version;
} else {
version = version.version;
}
} else if (typeof version !== "string") {
throw new TypeError(`Invalid Version: ${version}`);
}
if (version.length > MAX_LENGTH) {
throw new TypeError(
`version is longer than ${MAX_LENGTH} characters`
);
}
debug("SemVer", version, options);
this.options = options;
this.loose = !!options.loose;
this.includePrerelease = !!options.includePrerelease;
const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]);
if (!m) {
throw new TypeError(`Invalid Version: ${version}`);
}
this.raw = version;
this.major = +m[1];
this.minor = +m[2];
this.patch = +m[3];
if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
throw new TypeError("Invalid major version");
}
if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
throw new TypeError("Invalid minor version");
}
if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
throw new TypeError("Invalid patch version");
}
if (!m[4]) {
this.prerelease = [];
} else {
this.prerelease = m[4].split(".").map((id) => {
if (/^[0-9]+$/.test(id)) {
const num = +id;
if (num >= 0 && num < MAX_SAFE_INTEGER) {
return num;
}
}
return id;
});
}
this.build = m[5] ? m[5].split(".") : [];
this.format();
}
format() {
this.version = `${this.major}.${this.minor}.${this.patch}`;
if (this.prerelease.length) {
this.version += `-${this.prerelease.join(".")}`;
}
return this.version;
}
toString() {
return this.version;
}
compare(other) {
debug("SemVer.compare", this.version, this.options, other);
if (!(other instanceof SemVer$1)) {
if (typeof other === "string" && other === this.version) {
return 0;
}
other = new SemVer$1(other, this.options);
}
if (other.version === this.version) {
return 0;
}
return this.compareMain(other) || this.comparePre(other);
}
compareMain(other) {
if (!(other instanceof SemVer$1)) {
other = new SemVer$1(other, this.options);
}
return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch);
}
comparePre(other) {
if (!(other instanceof SemVer$1)) {
other = new SemVer$1(other, this.options);
}
if (this.prerelease.length && !other.prerelease.length) {
return -1;
} else if (!this.prerelease.length && other.prerelease.length) {
return 1;
} else if (!this.prerelease.length && !other.prerelease.length) {
return 0;
}
let i = 0;
do {
const a = this.prerelease[i];
const b = other.prerelease[i];
debug("prerelease compare", i, a, b);
if (a === void 0 && b === void 0) {
return 0;
} else if (b === void 0) {
return 1;
} else if (a === void 0) {
return -1;
} else if (a === b) {
continue;
} else {
return compareIdentifiers(a, b);
}
} while (++i);
}
compareBuild(other) {
if (!(other instanceof SemVer$1)) {
other = new SemVer$1(other, this.options);
}
let i = 0;
do {
const a = this.build[i];
const b = other.build[i];
debug("prerelease compare", i, a, b);
if (a === void 0 && b === void 0) {
return 0;
} else if (b === void 0) {
return 1;
} else if (a === void 0) {
return -1;
} else if (a === b) {
continue;
} else {
return compareIdentifiers(a, b);
}
} while (++i);
}
inc(release, identifier) {
switch (release) {
case "premajor":
this.prerelease.length = 0;
this.patch = 0;
this.minor = 0;
this.major++;
this.inc("pre", identifier);
break;
case "preminor":
this.prerelease.length = 0;
this.patch = 0;
this.minor++;
this.inc("pre", identifier);
break;
case "prepatch":
this.prerelease.length = 0;
this.inc("patch", identifier);
this.inc("pre", identifier);
break;
case "prerelease":
if (this.prerelease.length === 0) {
this.inc("patch", identifier);
}
this.inc("pre", identifier);
break;
case "major":
if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) {
this.major++;
}
this.minor = 0;
this.patch = 0;
this.prerelease = [];
break;
case "minor":
if (this.patch !== 0 || this.prerelease.length === 0) {
this.minor++;
}
this.patch = 0;
this.prerelease = [];
break;
case "patch":
if (this.prerelease.length === 0) {
this.patch++;
}
this.prerelease = [];
break;
case "pre":
if (this.prerelease.length === 0) {
this.prerelease = [0];
} else {
let i = this.prerelease.length;
while (--i >= 0) {
if (typeof this.prerelease[i] === "number") {
this.prerelease[i]++;
i = -2;
}
}
if (i === -1) {
this.prerelease.push(0);
}
}
if (identifier) {
if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
if (isNaN(this.prerelease[1])) {
this.prerelease = [identifier, 0];
}
} else {
this.prerelease = [identifier, 0];
}
}
break;
default:
throw new Error(`invalid increment argument: ${release}`);
}
this.format();
this.raw = this.version;
return this;
}
}
var semver = SemVer$1;
const SemVer = semver;
const compare$1 = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose));
var compare_1 = compare$1;
const compare = compare_1;
const gt = (a, b, loose) => compare(a, b, loose) > 0;
var gt_1 = gt;
const state$1 = {
console: {
listener: {
logs: 0
}
}
};
const BackgroundProject = Project.create({
name: "\u540E\u53F0",
domains: [],
level: -99,
scripts: {
app: new Script({
name: "\u8F6F\u4EF6\u914D\u7F6E\u540C\u6B65",
namespace: "background.app",
url: [["\u6240\u6709\u9875\u9762", /./]],
level: -1,
configs: {
notes: {
defaultValue: $creator.notes([
[
el("span", [
"\u5982\u679C\u60A8\u4F7F\u7528",
el("a", { href: "https://docs.ocsjs.com/docs/app", target: "_blank" }, "OCS\u684C\u9762\u8F6F\u4EF6"),
"\u542F\u52A8\u6D4F\u89C8\u5668\uFF0C\u5E76\u4F7F\u7528\u6B64\u811A\u672C\uFF0C"
]),
"\u6211\u4EEC\u4F1A\u540C\u6B65\u8F6F\u4EF6\u4E2D\u7684\u914D\u7F6E\u5230\u6B64\u811A\u672C\u4E0A\uFF0C\u65B9\u4FBF\u591A\u4E2A\u6D4F\u89C8\u5668\u7684\u7BA1\u7406\u3002"
],
"\u5982\u679C\u4E0D\u662F\uFF0C\u60A8\u53EF\u4EE5\u5FFD\u7565\u6B64\u811A\u672C\u3002"
]).outerHTML
},
sync: {
defaultValue: false
},
name: {
defaultValue: ""
}
},
onrender({ panel: panel2 }) {
const update = () => {
if (this.cfg.sync) {
const tip = el("div", { className: "notes card" }, [`\u5F53\u524D\u6210\u529F\u540C\u6B65\u8F6F\u4EF6\u4E2D \u201C${this.cfg.name}\u201D \u6587\u4EF6\u7684\u914D\u7F6E.`]);
panel2.append(tip);
}
};
update();
this.onConfigChange("sync", update);
},
async oncomplete() {
if (self === top) {
this.cfg.sync = false;
try {
const res = await request("https://ocs-app/browser", { type: "fetch", method: "get", contentType: "json" });
if (res.name && res.store) {
for (const key in res.store) {
if (Object.prototype.hasOwnProperty.call(res.store, key)) {
$store.set(key, res.store[key]);
}
}
this.cfg.name = res.name;
this.cfg.sync = true;
}
} catch {
}
}
}
}),
appLoginHelper: new Script({
name: "\u8F6F\u4EF6\u767B\u5F55\u8F85\u52A9",
url: [
["\u8D85\u661F\u767B\u5F55", "passport2.chaoxing.com/login"],
["\u667A\u6167\u6811\u767B\u5F55", "passport.zhihuishu.com/login"]
],
hideInPanel: true,
onactive() {
RenderProject.scripts.render.cfg.x = 10;
RenderProject.scripts.render.cfg.y = 10;
RenderProject.scripts.render.cfg.visual = "minimize";
}
}),
dev: new Script({
name: "\u5F00\u53D1\u8005\u8C03\u8BD5",
namespace: "background.dev",
url: [["\u6240\u6709\u9875\u9762", /./]],
configs: {
notes: {
defaultValue: "\u5F00\u53D1\u4EBA\u5458\u8C03\u8BD5\u7528\u3002
\u6CE8\u5165OCS_CONTEXT\u5168\u5C40\u53D8\u91CF\u3002\u7528\u6237\u53EF\u5FFD\u7565\u6B64\u9875\u9762\u3002"
}
},
onrender({ panel: panel2 }) {
const injectBtn = el("button", { className: "base-style-button" }, "\u70B9\u51FB\u6CE8\u5165\u5168\u5C40\u53D8\u91CF");
injectBtn.addEventListener("click", () => {
$gm.unsafeWindow.OCS_CONTEXT = self;
});
panel2.body.replaceChildren(el("div", { className: "card" }, [injectBtn]));
}
}),
console: new Script({
name: "\u65E5\u5FD7",
url: [["\u6240\u6709", /.*/]],
namespace: "render.console",
configs: {
logs: {
defaultValue: []
}
},
onrender({ panel: panel2 }) {
var _a;
this.offConfigChange(state$1.console.listener.logs);
const getTypeDesc = (type) => type === "info" ? "\u4FE1\u606F" : type === "error" ? "\u9519\u8BEF" : type === "warn" ? "\u8B66\u544A" : type === "debug" ? "\u8C03\u8BD5" : "\u65E5\u5FD7";
const showLogs = () => {
const div2 = el("div", { className: "card console" });
const logs2 = this.cfg.logs.map((log) => {
const date = new Date(log.time);
const item = el(
"div",
{
title: "\u53CC\u51FB\u590D\u5236\u65E5\u5FD7\u4FE1\u606F",
className: "item"
},
[
el(
"span",
{ className: "time" },
`${date.getHours().toFixed(0).padStart(2, "0")}:${date.getMinutes().toFixed(0).padStart(2, "0")} `
),
el("span", { className: log.type }, `[${getTypeDesc(log.type)}]`),
el("span", ":" + log.content)
]
);
item.addEventListener("dblclick", () => {
navigator.clipboard.writeText(
Object.keys(log).map((k) => `${k}: ${log[k]}`).join("\n")
);
});
return item;
});
if (logs2.length) {
div2.replaceChildren(...logs2);
} else {
div2.replaceChildren(
el("div", "\u6682\u65E0\u4EFB\u4F55\u65E5\u5FD7", (div3) => {
div3.style.textAlign = "center";
})
);
}
return { div: div2, logs: logs2 };
};
state$1.console.listener.logs = this.onConfigChange("logs", () => {
var _a2;
const { div: div2, logs: logs2 } = showLogs();
panel2.replaceChildren(div2);
(_a2 = logs2.at(-1)) == null ? void 0 : _a2.scrollIntoView();
}) || 0;
const { div, logs } = showLogs();
panel2.replaceChildren(div);
(_a = logs.at(-1)) == null ? void 0 : _a.scrollIntoView();
}
}),
browserCheck: new Script({
name: "\u6D4F\u89C8\u5668\u7248\u672C\u68C0\u6D4B",
url: [["\u6240\u6709\u9875\u9762", /.*/]],
hideInPanel: true,
oncomplete() {
if (self === top) {
const match = navigator.userAgent.match(/Chrome\/(\d+)/);
const version = match ? parseInt(match[1]) : void 0;
if (version) {
if (version < 86) {
$model("alert", {
content: $creator.notes([
"\u68C0\u6D4B\u5230\u60A8\u5F53\u524D\u7684\u6D4F\u89C8\u5668\u7248\u672C\u8FC7\u4F4E\uFF0C\u53EF\u80FD\u5BFC\u81F4\u811A\u672C\u65E0\u6CD5\u8FD0\u884C\uFF0C\u8BF7\u4E0B\u8F7D/\u66F4\u65B0\u4EE5\u4E0B\u63A8\u8350\u6D4F\u89C8\u5668\uFF1A",
[
"- \u5FAE\u8F6F\u6D4F\u89C8\u5668(Edge) : ",
el(
"a",
{ href: "https://www.microsoft.com/zh-cn/edge/download", target: "_blank" },
"https://www.microsoft.com/zh-cn/edge"
)
],
[
"- \u8C37\u6B4C\u6D4F\u89C8\u5668(Chrome) : ",
el(
"a",
{ href: "https://www.google.com/intl/zh-CN/chrome/", target: "_blank" },
"https://www.google.com/intl/zh-CN/chrome/"
)
]
]).outerHTML
});
}
}
}
}
}),
update: new Script({
name: "\u811A\u672C\u66F4\u65B0\u68C0\u6D4B",
url: [["\u6240\u6709\u9875\u9762", /.*/]],
hideInPanel: true,
namespace: "background.update",
configs: {
notToday: {
defaultValue: -1
}
},
oncomplete() {
if (self === top) {
if (this.cfg.notToday === -1 || this.cfg.notToday !== new Date().getDate()) {
const infos = $gm.getInfos();
if (infos) {
setTimeout(async () => {
const version = await request("https://cdn.ocsjs.com/ocs-version.json?t=" + Date.now(), {
method: "get",
type: "fetch"
});
if (gt_1(version["last-version"], infos.script.version)) {
const model = $model("confirm", {
content: $creator.notes([
`\u68C0\u6D4B\u5230\u65B0\u7248\u672C\u53D1\u5E03 ${version["last-version"]} \uFF1A`,
[...version.notes || []]
]),
cancelButton: el(
"button",
{ className: "base-style-button-secondary", innerText: "\u4ECA\u65E5\u4E0D\u518D\u63D0\u793A" },
(btn) => {
btn.onclick = () => {
this.cfg.notToday = new Date().getDate();
model == null ? void 0 : model.remove();
};
}
),
confirmButton: el("button", { className: "base-style-button", innerText: "\u524D\u5F80\u66F4\u65B0" }, (btn) => {
btn.onclick = () => {
window.open(version.resource[infos.scriptHandler], "_blank");
model == null ? void 0 : model.remove();
};
})
});
}
}, 10 * 1e3);
}
}
}
}
})
}
});
const $console = new Proxy({}, {
get(target, key) {
return (...msg) => {
let logs = BackgroundProject.scripts.console.cfg.logs;
if (logs.length > 50) {
logs = logs.slice(-50);
}
logs = logs.concat({
type: key.toString(),
content: msg.join(" "),
time: Date.now(),
stack: (Error().stack || "").replace("Error", "")
});
BackgroundProject.scripts.console.cfg.logs = logs;
};
}
});
function getDefaults() {
return {
async: false,
baseUrl: null,
breaks: false,
extensions: null,
gfm: true,
headerIds: true,
headerPrefix: "",
highlight: null,
langPrefix: "language-",
mangle: true,
pedantic: false,
renderer: null,
sanitize: false,
sanitizer: null,
silent: false,
smartypants: false,
tokenizer: null,
walkTokens: null,
xhtml: false
};
}
let defaults = getDefaults();
function changeDefaults(newDefaults) {
defaults = newDefaults;
}
const escapeTest = /[&<>"']/;
const escapeReplace = new RegExp(escapeTest.source, "g");
const escapeTestNoEncode = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/;
const escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, "g");
const escapeReplacements = {
"&": "&",
"<": "<",
">": ">",
'"': """,
"'": "'"
};
const getEscapeReplacement = (ch) => escapeReplacements[ch];
function escape$1(html, encode) {
if (encode) {
if (escapeTest.test(html)) {
return html.replace(escapeReplace, getEscapeReplacement);
}
} else {
if (escapeTestNoEncode.test(html)) {
return html.replace(escapeReplaceNoEncode, getEscapeReplacement);
}
}
return html;
}
const unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;
function unescape$1(html) {
return html.replace(unescapeTest, (_, n) => {
n = n.toLowerCase();
if (n === "colon")
return ":";
if (n.charAt(0) === "#") {
return n.charAt(1) === "x" ? String.fromCharCode(parseInt(n.substring(2), 16)) : String.fromCharCode(+n.substring(1));
}
return "";
});
}
const caret = /(^|[^\[])\^/g;
function edit(regex, opt) {
regex = typeof regex === "string" ? regex : regex.source;
opt = opt || "";
const obj = {
replace: (name, val) => {
val = val.source || val;
val = val.replace(caret, "$1");
regex = regex.replace(name, val);
return obj;
},
getRegex: () => {
return new RegExp(regex, opt);
}
};
return obj;
}
const nonWordAndColonTest = /[^\w:]/g;
const originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
function cleanUrl(sanitize, base, href) {
if (sanitize) {
let prot;
try {
prot = decodeURIComponent(unescape$1(href)).replace(nonWordAndColonTest, "").toLowerCase();
} catch (e) {
return null;
}
if (prot.indexOf("javascript:") === 0 || prot.indexOf("vbscript:") === 0 || prot.indexOf("data:") === 0) {
return null;
}
}
if (base && !originIndependentUrl.test(href)) {
href = resolveUrl(base, href);
}
try {
href = encodeURI(href).replace(/%25/g, "%");
} catch (e) {
return null;
}
return href;
}
const baseUrls = {};
const justDomain = /^[^:]+:\/*[^/]*$/;
const protocol = /^([^:]+:)[\s\S]*$/;
const domain = /^([^:]+:\/*[^/]*)[\s\S]*$/;
function resolveUrl(base, href) {
if (!baseUrls[" " + base]) {
if (justDomain.test(base)) {
baseUrls[" " + base] = base + "/";
} else {
baseUrls[" " + base] = rtrim(base, "/", true);
}
}
base = baseUrls[" " + base];
const relativeBase = base.indexOf(":") === -1;
if (href.substring(0, 2) === "//") {
if (relativeBase) {
return href;
}
return base.replace(protocol, "$1") + href;
} else if (href.charAt(0) === "/") {
if (relativeBase) {
return href;
}
return base.replace(domain, "$1") + href;
} else {
return base + href;
}
}
const noopTest = { exec: function noopTest2() {
} };
function merge(obj) {
let i = 1, target, key;
for (; i < arguments.length; i++) {
target = arguments[i];
for (key in target) {
if (Object.prototype.hasOwnProperty.call(target, key)) {
obj[key] = target[key];
}
}
}
return obj;
}
function splitCells(tableRow, count) {
const row = tableRow.replace(/\|/g, (match, offset, str) => {
let escaped = false, curr = offset;
while (--curr >= 0 && str[curr] === "\\")
escaped = !escaped;
if (escaped) {
return "|";
} else {
return " |";
}
}), cells = row.split(/ \|/);
let i = 0;
if (!cells[0].trim()) {
cells.shift();
}
if (cells.length > 0 && !cells[cells.length - 1].trim()) {
cells.pop();
}
if (cells.length > count) {
cells.splice(count);
} else {
while (cells.length < count)
cells.push("");
}
for (; i < cells.length; i++) {
cells[i] = cells[i].trim().replace(/\\\|/g, "|");
}
return cells;
}
function rtrim(str, c, invert) {
const l = str.length;
if (l === 0) {
return "";
}
let suffLen = 0;
while (suffLen < l) {
const currChar = str.charAt(l - suffLen - 1);
if (currChar === c && !invert) {
suffLen++;
} else if (currChar !== c && invert) {
suffLen++;
} else {
break;
}
}
return str.slice(0, l - suffLen);
}
function findClosingBracket(str, b) {
if (str.indexOf(b[1]) === -1) {
return -1;
}
const l = str.length;
let level = 0, i = 0;
for (; i < l; i++) {
if (str[i] === "\\") {
i++;
} else if (str[i] === b[0]) {
level++;
} else if (str[i] === b[1]) {
level--;
if (level < 0) {
return i;
}
}
}
return -1;
}
function checkSanitizeDeprecation(opt) {
if (opt && opt.sanitize && !opt.silent) {
console.warn("marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options");
}
}
function repeatString(pattern, count) {
if (count < 1) {
return "";
}
let result = "";
while (count > 1) {
if (count & 1) {
result += pattern;
}
count >>= 1;
pattern += pattern;
}
return result + pattern;
}
function outputLink(cap, link, raw, lexer) {
const href = link.href;
const title = link.title ? escape$1(link.title) : null;
const text = cap[1].replace(/\\([\[\]])/g, "$1");
if (cap[0].charAt(0) !== "!") {
lexer.state.inLink = true;
const token = {
type: "link",
raw,
href,
title,
text,
tokens: lexer.inlineTokens(text)
};
lexer.state.inLink = false;
return token;
}
return {
type: "image",
raw,
href,
title,
text: escape$1(text)
};
}
function indentCodeCompensation(raw, text) {
const matchIndentToCode = raw.match(/^(\s+)(?:```)/);
if (matchIndentToCode === null) {
return text;
}
const indentToCode = matchIndentToCode[1];
return text.split("\n").map((node) => {
const matchIndentInNode = node.match(/^\s+/);
if (matchIndentInNode === null) {
return node;
}
const [indentInNode] = matchIndentInNode;
if (indentInNode.length >= indentToCode.length) {
return node.slice(indentToCode.length);
}
return node;
}).join("\n");
}
class Tokenizer {
constructor(options) {
this.options = options || defaults;
}
space(src2) {
const cap = this.rules.block.newline.exec(src2);
if (cap && cap[0].length > 0) {
return {
type: "space",
raw: cap[0]
};
}
}
code(src2) {
const cap = this.rules.block.code.exec(src2);
if (cap) {
const text = cap[0].replace(/^ {1,4}/gm, "");
return {
type: "code",
raw: cap[0],
codeBlockStyle: "indented",
text: !this.options.pedantic ? rtrim(text, "\n") : text
};
}
}
fences(src2) {
const cap = this.rules.block.fences.exec(src2);
if (cap) {
const raw = cap[0];
const text = indentCodeCompensation(raw, cap[3] || "");
return {
type: "code",
raw,
lang: cap[2] ? cap[2].trim().replace(this.rules.inline._escapes, "$1") : cap[2],
text
};
}
}
heading(src2) {
const cap = this.rules.block.heading.exec(src2);
if (cap) {
let text = cap[2].trim();
if (/#$/.test(text)) {
const trimmed = rtrim(text, "#");
if (this.options.pedantic) {
text = trimmed.trim();
} else if (!trimmed || / $/.test(trimmed)) {
text = trimmed.trim();
}
}
return {
type: "heading",
raw: cap[0],
depth: cap[1].length,
text,
tokens: this.lexer.inline(text)
};
}
}
hr(src2) {
const cap = this.rules.block.hr.exec(src2);
if (cap) {
return {
type: "hr",
raw: cap[0]
};
}
}
blockquote(src2) {
const cap = this.rules.block.blockquote.exec(src2);
if (cap) {
const text = cap[0].replace(/^ *>[ \t]?/gm, "");
const top2 = this.lexer.state.top;
this.lexer.state.top = true;
const tokens = this.lexer.blockTokens(text);
this.lexer.state.top = top2;
return {
type: "blockquote",
raw: cap[0],
tokens,
text
};
}
}
list(src2) {
let cap = this.rules.block.list.exec(src2);
if (cap) {
let raw, istask, ischecked, indent, i, blankLine, endsWithBlankLine, line, nextLine, rawLine, itemContents, endEarly;
let bull = cap[1].trim();
const isordered = bull.length > 1;
const list = {
type: "list",
raw: "",
ordered: isordered,
start: isordered ? +bull.slice(0, -1) : "",
loose: false,
items: []
};
bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`;
if (this.options.pedantic) {
bull = isordered ? bull : "[*+-]";
}
const itemRegex = new RegExp(`^( {0,3}${bull})((?:[ ][^\\n]*)?(?:\\n|$))`);
while (src2) {
endEarly = false;
if (!(cap = itemRegex.exec(src2))) {
break;
}
if (this.rules.block.hr.test(src2)) {
break;
}
raw = cap[0];
src2 = src2.substring(raw.length);
line = cap[2].split("\n", 1)[0].replace(/^\t+/, (t2) => " ".repeat(3 * t2.length));
nextLine = src2.split("\n", 1)[0];
if (this.options.pedantic) {
indent = 2;
itemContents = line.trimLeft();
} else {
indent = cap[2].search(/[^ ]/);
indent = indent > 4 ? 1 : indent;
itemContents = line.slice(indent);
indent += cap[1].length;
}
blankLine = false;
if (!line && /^ *$/.test(nextLine)) {
raw += nextLine + "\n";
src2 = src2.substring(nextLine.length + 1);
endEarly = true;
}
if (!endEarly) {
const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`);
const hrRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`);
const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\`\`\`|~~~)`);
const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`);
while (src2) {
rawLine = src2.split("\n", 1)[0];
nextLine = rawLine;
if (this.options.pedantic) {
nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, " ");
}
if (fencesBeginRegex.test(nextLine)) {
break;
}
if (headingBeginRegex.test(nextLine)) {
break;
}
if (nextBulletRegex.test(nextLine)) {
break;
}
if (hrRegex.test(src2)) {
break;
}
if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) {
itemContents += "\n" + nextLine.slice(indent);
} else {
if (blankLine) {
break;
}
if (line.search(/[^ ]/) >= 4) {
break;
}
if (fencesBeginRegex.test(line)) {
break;
}
if (headingBeginRegex.test(line)) {
break;
}
if (hrRegex.test(line)) {
break;
}
itemContents += "\n" + nextLine;
}
if (!blankLine && !nextLine.trim()) {
blankLine = true;
}
raw += rawLine + "\n";
src2 = src2.substring(rawLine.length + 1);
line = nextLine.slice(indent);
}
}
if (!list.loose) {
if (endsWithBlankLine) {
list.loose = true;
} else if (/\n *\n *$/.test(raw)) {
endsWithBlankLine = true;
}
}
if (this.options.gfm) {
istask = /^\[[ xX]\] /.exec(itemContents);
if (istask) {
ischecked = istask[0] !== "[ ] ";
itemContents = itemContents.replace(/^\[[ xX]\] +/, "");
}
}
list.items.push({
type: "list_item",
raw,
task: !!istask,
checked: ischecked,
loose: false,
text: itemContents
});
list.raw += raw;
}
list.items[list.items.length - 1].raw = raw.trimRight();
list.items[list.items.length - 1].text = itemContents.trimRight();
list.raw = list.raw.trimRight();
const l = list.items.length;
for (i = 0; i < l; i++) {
this.lexer.state.top = false;
list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);
if (!list.loose) {
const spacers = list.items[i].tokens.filter((t2) => t2.type === "space");
const hasMultipleLineBreaks = spacers.length > 0 && spacers.some((t2) => /\n.*\n/.test(t2.raw));
list.loose = hasMultipleLineBreaks;
}
}
if (list.loose) {
for (i = 0; i < l; i++) {
list.items[i].loose = true;
}
}
return list;
}
}
html(src2) {
const cap = this.rules.block.html.exec(src2);
if (cap) {
const token = {
type: "html",
raw: cap[0],
pre: !this.options.sanitizer && (cap[1] === "pre" || cap[1] === "script" || cap[1] === "style"),
text: cap[0]
};
if (this.options.sanitize) {
const text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$1(cap[0]);
token.type = "paragraph";
token.text = text;
token.tokens = this.lexer.inline(text);
}
return token;
}
}
def(src2) {
const cap = this.rules.block.def.exec(src2);
if (cap) {
const tag = cap[1].toLowerCase().replace(/\s+/g, " ");
const href = cap[2] ? cap[2].replace(/^<(.*)>$/, "$1").replace(this.rules.inline._escapes, "$1") : "";
const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline._escapes, "$1") : cap[3];
return {
type: "def",
tag,
raw: cap[0],
href,
title
};
}
}
table(src2) {
const cap = this.rules.block.table.exec(src2);
if (cap) {
const item = {
type: "table",
header: splitCells(cap[1]).map((c) => {
return { text: c };
}),
align: cap[2].replace(/^ *|\| *$/g, "").split(/ *\| */),
rows: cap[3] && cap[3].trim() ? cap[3].replace(/\n[ \t]*$/, "").split("\n") : []
};
if (item.header.length === item.align.length) {
item.raw = cap[0];
let l = item.align.length;
let i, j, k, row;
for (i = 0; i < l; i++) {
if (/^ *-+: *$/.test(item.align[i])) {
item.align[i] = "right";
} else if (/^ *:-+: *$/.test(item.align[i])) {
item.align[i] = "center";
} else if (/^ *:-+ *$/.test(item.align[i])) {
item.align[i] = "left";
} else {
item.align[i] = null;
}
}
l = item.rows.length;
for (i = 0; i < l; i++) {
item.rows[i] = splitCells(item.rows[i], item.header.length).map((c) => {
return { text: c };
});
}
l = item.header.length;
for (j = 0; j < l; j++) {
item.header[j].tokens = this.lexer.inline(item.header[j].text);
}
l = item.rows.length;
for (j = 0; j < l; j++) {
row = item.rows[j];
for (k = 0; k < row.length; k++) {
row[k].tokens = this.lexer.inline(row[k].text);
}
}
return item;
}
}
}
lheading(src2) {
const cap = this.rules.block.lheading.exec(src2);
if (cap) {
return {
type: "heading",
raw: cap[0],
depth: cap[2].charAt(0) === "=" ? 1 : 2,
text: cap[1],
tokens: this.lexer.inline(cap[1])
};
}
}
paragraph(src2) {
const cap = this.rules.block.paragraph.exec(src2);
if (cap) {
const text = cap[1].charAt(cap[1].length - 1) === "\n" ? cap[1].slice(0, -1) : cap[1];
return {
type: "paragraph",
raw: cap[0],
text,
tokens: this.lexer.inline(text)
};
}
}
text(src2) {
const cap = this.rules.block.text.exec(src2);
if (cap) {
return {
type: "text",
raw: cap[0],
text: cap[0],
tokens: this.lexer.inline(cap[0])
};
}
}
escape(src2) {
const cap = this.rules.inline.escape.exec(src2);
if (cap) {
return {
type: "escape",
raw: cap[0],
text: escape$1(cap[1])
};
}
}
tag(src2) {
const cap = this.rules.inline.tag.exec(src2);
if (cap) {
if (!this.lexer.state.inLink && /^/i.test(cap[0])) {
this.lexer.state.inLink = false;
}
if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
this.lexer.state.inRawBlock = true;
} else if (this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
this.lexer.state.inRawBlock = false;
}
return {
type: this.options.sanitize ? "text" : "html",
raw: cap[0],
inLink: this.lexer.state.inLink,
inRawBlock: this.lexer.state.inRawBlock,
text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$1(cap[0]) : cap[0]
};
}
}
link(src2) {
const cap = this.rules.inline.link.exec(src2);
if (cap) {
const trimmedUrl = cap[2].trim();
if (!this.options.pedantic && /^$/.test(trimmedUrl)) {
return;
}
const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), "\\");
if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {
return;
}
} else {
const lastParenIndex = findClosingBracket(cap[2], "()");
if (lastParenIndex > -1) {
const start2 = cap[0].indexOf("!") === 0 ? 5 : 4;
const linkLen = start2 + cap[1].length + lastParenIndex;
cap[2] = cap[2].substring(0, lastParenIndex);
cap[0] = cap[0].substring(0, linkLen).trim();
cap[3] = "";
}
}
let href = cap[2];
let title = "";
if (this.options.pedantic) {
const link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
if (link) {
href = link[1];
title = link[3];
}
} else {
title = cap[3] ? cap[3].slice(1, -1) : "";
}
href = href.trim();
if (/^$/.test(trimmedUrl)) {
href = href.slice(1);
} else {
href = href.slice(1, -1);
}
}
return outputLink(cap, {
href: href ? href.replace(this.rules.inline._escapes, "$1") : href,
title: title ? title.replace(this.rules.inline._escapes, "$1") : title
}, cap[0], this.lexer);
}
}
reflink(src2, links) {
let cap;
if ((cap = this.rules.inline.reflink.exec(src2)) || (cap = this.rules.inline.nolink.exec(src2))) {
let link = (cap[2] || cap[1]).replace(/\s+/g, " ");
link = links[link.toLowerCase()];
if (!link) {
const text = cap[0].charAt(0);
return {
type: "text",
raw: text,
text
};
}
return outputLink(cap, link, cap[0], this.lexer);
}
}
emStrong(src2, maskedSrc, prevChar = "") {
let match = this.rules.inline.emStrong.lDelim.exec(src2);
if (!match)
return;
if (match[3] && prevChar.match(/[\p{L}\p{N}]/u))
return;
const nextChar = match[1] || match[2] || "";
if (!nextChar || nextChar && (prevChar === "" || this.rules.inline.punctuation.exec(prevChar))) {
const lLength = match[0].length - 1;
let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;
const endReg = match[0][0] === "*" ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;
endReg.lastIndex = 0;
maskedSrc = maskedSrc.slice(-1 * src2.length + lLength);
while ((match = endReg.exec(maskedSrc)) != null) {
rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];
if (!rDelim)
continue;
rLength = rDelim.length;
if (match[3] || match[4]) {
delimTotal += rLength;
continue;
} else if (match[5] || match[6]) {
if (lLength % 3 && !((lLength + rLength) % 3)) {
midDelimTotal += rLength;
continue;
}
}
delimTotal -= rLength;
if (delimTotal > 0)
continue;
rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);
const raw = src2.slice(0, lLength + match.index + (match[0].length - rDelim.length) + rLength);
if (Math.min(lLength, rLength) % 2) {
const text2 = raw.slice(1, -1);
return {
type: "em",
raw,
text: text2,
tokens: this.lexer.inlineTokens(text2)
};
}
const text = raw.slice(2, -2);
return {
type: "strong",
raw,
text,
tokens: this.lexer.inlineTokens(text)
};
}
}
}
codespan(src2) {
const cap = this.rules.inline.code.exec(src2);
if (cap) {
let text = cap[2].replace(/\n/g, " ");
const hasNonSpaceChars = /[^ ]/.test(text);
const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);
if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {
text = text.substring(1, text.length - 1);
}
text = escape$1(text, true);
return {
type: "codespan",
raw: cap[0],
text
};
}
}
br(src2) {
const cap = this.rules.inline.br.exec(src2);
if (cap) {
return {
type: "br",
raw: cap[0]
};
}
}
del(src2) {
const cap = this.rules.inline.del.exec(src2);
if (cap) {
return {
type: "del",
raw: cap[0],
text: cap[2],
tokens: this.lexer.inlineTokens(cap[2])
};
}
}
autolink(src2, mangle2) {
const cap = this.rules.inline.autolink.exec(src2);
if (cap) {
let text, href;
if (cap[2] === "@") {
text = escape$1(this.options.mangle ? mangle2(cap[1]) : cap[1]);
href = "mailto:" + text;
} else {
text = escape$1(cap[1]);
href = text;
}
return {
type: "link",
raw: cap[0],
text,
href,
tokens: [
{
type: "text",
raw: text,
text
}
]
};
}
}
url(src2, mangle2) {
let cap;
if (cap = this.rules.inline.url.exec(src2)) {
let text, href;
if (cap[2] === "@") {
text = escape$1(this.options.mangle ? mangle2(cap[0]) : cap[0]);
href = "mailto:" + text;
} else {
let prevCapZero;
do {
prevCapZero = cap[0];
cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];
} while (prevCapZero !== cap[0]);
text = escape$1(cap[0]);
if (cap[1] === "www.") {
href = "http://" + cap[0];
} else {
href = cap[0];
}
}
return {
type: "link",
raw: cap[0],
text,
href,
tokens: [
{
type: "text",
raw: text,
text
}
]
};
}
}
inlineText(src2, smartypants2) {
const cap = this.rules.inline.text.exec(src2);
if (cap) {
let text;
if (this.lexer.state.inRawBlock) {
text = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$1(cap[0]) : cap[0];
} else {
text = escape$1(this.options.smartypants ? smartypants2(cap[0]) : cap[0]);
}
return {
type: "text",
raw: cap[0],
text
};
}
}
}
const block = {
newline: /^(?: *(?:\n|$))+/,
code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,
fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?=\n|$)|$)/,
hr: /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,
heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,
blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
list: /^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/,
html: "^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))",
def: /^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,
table: noopTest,
lheading: /^((?:.|\n(?!\n))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
_paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,
text: /^[^\n]+/
};
block._label = /(?!\s*\])(?:\\.|[^\[\]\\])+/;
block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
block.def = edit(block.def).replace("label", block._label).replace("title", block._title).getRegex();
block.bullet = /(?:[*+-]|\d{1,9}[.)])/;
block.listItemStart = edit(/^( *)(bull) */).replace("bull", block.bullet).getRegex();
block.list = edit(block.list).replace(/bull/g, block.bullet).replace("hr", "\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def", "\\n+(?=" + block.def.source + ")").getRegex();
block._tag = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul";
block._comment = /|$)/;
block.html = edit(block.html, "i").replace("comment", block._comment).replace("tag", block._tag).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex();
block.paragraph = edit(block._paragraph).replace("hr", block.hr).replace("heading", " {0,3}#{1,6} ").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", block._tag).getRegex();
block.blockquote = edit(block.blockquote).replace("paragraph", block.paragraph).getRegex();
block.normal = merge({}, block);
block.gfm = merge({}, block.normal, {
table: "^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"
});
block.gfm.table = edit(block.gfm.table).replace("hr", block.hr).replace("heading", " {0,3}#{1,6} ").replace("blockquote", " {0,3}>").replace("code", " {4}[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", block._tag).getRegex();
block.gfm.paragraph = edit(block._paragraph).replace("hr", block.hr).replace("heading", " {0,3}#{1,6} ").replace("|lheading", "").replace("table", block.gfm.table).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", block._tag).getRegex();
block.pedantic = merge({}, block.normal, {
html: edit(
`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?\\1> *(?:\\n{2,}|\\s*$)|
\n";
}
return '" + (escaped ? code : escape$1(code, true)) + "
\n";
}
blockquote(quote) {
return `' + (escaped ? code : escape$1(code, true)) + "
${quote}
`;
}
html(html) {
return html;
}
heading(text, level, raw, slugger) {
if (this.options.headerIds) {
const id = this.options.headerPrefix + slugger.slug(raw);
return `
\n" : "
\n";
}
list(body, ordered, start2) {
const type = ordered ? "ol" : "ul", startatt = ordered && start2 !== 1 ? ' start="' + start2 + '"' : "";
return "<" + type + startatt + ">\n" + body + "" + type + ">\n";
}
listitem(text) {
return `
${text}
`;
}
br() {
return this.options.xhtml ? "An error occurred:
" + escape$1(e.message + "", true) + ""; } throw e; } try { const tokens = Lexer.lex(src2, opt); if (opt.walkTokens) { if (opt.async) { return Promise.all(marked.walkTokens(tokens, opt.walkTokens)).then(() => { return Parser.parse(tokens, opt); }).catch(onError); } marked.walkTokens(tokens, opt.walkTokens); } return Parser.parse(tokens, opt); } catch (e) { onError(e); } } marked.options = marked.setOptions = function(opt) { merge(marked.defaults, opt); changeDefaults(marked.defaults); return marked; }; marked.getDefaults = getDefaults; marked.defaults = defaults; marked.use = function(...args) { const extensions = marked.defaults.extensions || { renderers: {}, childTokens: {} }; args.forEach((pack) => { const opts2 = merge({}, pack); opts2.async = marked.defaults.async || opts2.async; if (pack.extensions) { pack.extensions.forEach((ext) => { if (!ext.name) { throw new Error("extension name required"); } if (ext.renderer) { const prevRenderer = extensions.renderers[ext.name]; if (prevRenderer) { extensions.renderers[ext.name] = function(...args2) { let ret = ext.renderer.apply(this, args2); if (ret === false) { ret = prevRenderer.apply(this, args2); } return ret; }; } else { extensions.renderers[ext.name] = ext.renderer; } } if (ext.tokenizer) { if (!ext.level || ext.level !== "block" && ext.level !== "inline") { throw new Error("extension level must be 'block' or 'inline'"); } if (extensions[ext.level]) { extensions[ext.level].unshift(ext.tokenizer); } else { extensions[ext.level] = [ext.tokenizer]; } if (ext.start) { if (ext.level === "block") { if (extensions.startBlock) { extensions.startBlock.push(ext.start); } else { extensions.startBlock = [ext.start]; } } else if (ext.level === "inline") { if (extensions.startInline) { extensions.startInline.push(ext.start); } else { extensions.startInline = [ext.start]; } } } } if (ext.childTokens) { extensions.childTokens[ext.name] = ext.childTokens; } }); opts2.extensions = extensions; } if (pack.renderer) { const renderer = marked.defaults.renderer || new Renderer(); for (const prop in pack.renderer) { const prevRenderer = renderer[prop]; renderer[prop] = (...args2) => { let ret = pack.renderer[prop].apply(renderer, args2); if (ret === false) { ret = prevRenderer.apply(renderer, args2); } return ret; }; } opts2.renderer = renderer; } if (pack.tokenizer) { const tokenizer = marked.defaults.tokenizer || new Tokenizer(); for (const prop in pack.tokenizer) { const prevTokenizer = tokenizer[prop]; tokenizer[prop] = (...args2) => { let ret = pack.tokenizer[prop].apply(tokenizer, args2); if (ret === false) { ret = prevTokenizer.apply(tokenizer, args2); } return ret; }; } opts2.tokenizer = tokenizer; } if (pack.walkTokens) { const walkTokens = marked.defaults.walkTokens; opts2.walkTokens = function(token) { let values = []; values.push(pack.walkTokens.call(this, token)); if (walkTokens) { values = values.concat(walkTokens.call(this, token)); } return values; }; } marked.setOptions(opts2); }); }; marked.walkTokens = function(tokens, callback) { let values = []; for (const token of tokens) { values = values.concat(callback.call(marked, token)); switch (token.type) { case "table": { for (const cell of token.header) { values = values.concat(marked.walkTokens(cell.tokens, callback)); } for (const row of token.rows) { for (const cell of row) { values = values.concat(marked.walkTokens(cell.tokens, callback)); } } break; } case "list": { values = values.concat(marked.walkTokens(token.items, callback)); break; } default: { if (marked.defaults.extensions && marked.defaults.extensions.childTokens && marked.defaults.extensions.childTokens[token.type]) { marked.defaults.extensions.childTokens[token.type].forEach(function(childTokens) { values = values.concat(marked.walkTokens(token[childTokens], callback)); }); } else if (token.tokens) { values = values.concat(marked.walkTokens(token.tokens, callback)); } } } } return values; }; marked.parseInline = function(src2, opt) { if (typeof src2 === "undefined" || src2 === null) { throw new Error("marked.parseInline(): input parameter is undefined or null"); } if (typeof src2 !== "string") { throw new Error("marked.parseInline(): input parameter is of type " + Object.prototype.toString.call(src2) + ", string expected"); } opt = merge({}, marked.defaults, opt || {}); checkSanitizeDeprecation(opt); try { const tokens = Lexer.lexInline(src2, opt); if (opt.walkTokens) { marked.walkTokens(tokens, opt.walkTokens); } return Parser.parseInline(tokens, opt); } catch (e) { e.message += "\nPlease report this to https://github.com/markedjs/marked."; if (opt.silent) { return "
An error occurred:
" + escape$1(e.message + "", true) + ""; } throw e; } }; marked.Parser = Parser; marked.parser = Parser.parse; marked.Renderer = Renderer; marked.TextRenderer = TextRenderer; marked.Lexer = Lexer; marked.lexer = Lexer.lex; marked.Tokenizer = Tokenizer; marked.Slugger = Slugger; marked.parse = marked; marked.options; marked.setOptions; marked.use; marked.walkTokens; marked.parseInline; Parser.parse; Lexer.lex; function markdown(md) { return marked.parse(md); } function createRangeTooltip(input, defaultValue, transform) { input.addEventListener("change", () => { input.setAttribute("data-title", transform(input.value || input.getAttribute("value") || defaultValue)); }); input.setAttribute("data-title", transform(input.value || input.getAttribute("value") || defaultValue)); } const volume = { label: "\u97F3\u91CF\u8C03\u8282", attrs: { type: "range", step: "0.05", min: "0", max: "1" }, defaultValue: 0, onload() { createRangeTooltip(this, "0", (val) => `${parseFloat(val) * 100}%`); } }; const restudy = { label: "\u590D\u4E60\u6A21\u5F0F", attrs: { title: "\u5DF2\u7ECF\u5B8C\u6210\u7684\u89C6\u9891\u7EE7\u7EED\u5B66\u4E60", type: "checkbox" }, defaultValue: false }; const definition = { label: "\u6E05\u6670\u5EA6", tag: "select", defaultValue: "line1bq", onload() { this.append( ...$creator.selectOptions(this.getAttribute("value"), [ ["line1bq", "\u6D41\u7545"], ["line1gq", "\u9AD8\u6E05"] ]) ); } }; const auto = { label: "\u5F00\u542F\u81EA\u52A8\u7B54\u9898", attrs: { type: "checkbox" }, defaultValue: false }; const workConfigs = { notes: { defaultValue: $creator.notes([ "\u81EA\u52A8\u7B54\u9898\u524D\u8BF7\u5728 \u201C\u901A\u7528-\u5168\u5C40\u8BBE\u7F6E\u201D \u4E2D\u8BBE\u7F6E\u9898\u5E93\u914D\u7F6E\u3002", "\u53EF\u4EE5\u642D\u914D \u201C\u901A\u7528-\u5728\u7EBF\u641C\u9898\u201D \u4E00\u8D77\u4F7F\u7528\u3002" ]).outerHTML }, auto: { label: "\u5F00\u542F\u81EA\u52A8\u7B54\u9898", attrs: { type: "checkbox" }, defaultValue: true }, upload: { label: "\u7B54\u9898\u5B8C\u6210\u540E", tag: "select", defaultValue: "save", attrs: { title: "\u7B54\u9898\u5B8C\u6210\u540E\u7684\u8BBE\u7F6E, \u9F20\u6807\u60AC\u6D6E\u5728\u9009\u9879\u4E0A\u53EF\u4EE5\u67E5\u770B\u6BCF\u4E2A\u9009\u9879\u7684\u5177\u4F53\u89E3\u91CA\u3002" }, onload() { this.append( ...$creator.selectOptions(this.getAttribute("value"), [ ["save", "\u81EA\u52A8\u4FDD\u5B58", "\u5B8C\u6210\u540E\u81EA\u52A8\u4FDD\u5B58\u7B54\u6848, \u6CE8\u610F\u5982\u679C\u4F60\u5F00\u542F\u4E86\u968F\u673A\u4F5C\u7B54, \u6709\u53EF\u80FD\u5206\u8FA8\u4E0D\u51FA\u7B54\u6848\u662F\u5426\u6B63\u786E\u3002"], ["nomove", "\u4E0D\u4FDD\u5B58\u4E5F\u4E0D\u63D0\u4EA4", "\u7B49\u5F85\u65F6\u95F4\u8FC7\u540E\u5C06\u4F1A\u81EA\u52A8\u4E0B\u4E00\u8282, \u9002\u5408\u5728\u6D4B\u8BD5\u811A\u672C\u65F6\u4F7F\u7528\u3002"], ...[10, 20, 30, 40, 50, 60, 70, 80, 90].map((rate) => [ rate.toString(), `\u641C\u5230${rate}%\u7684\u9898\u76EE\u5219\u81EA\u52A8\u63D0\u4EA4`, `\u4F8B\u5982: 100\u9898\u4E2D\u67E5\u8BE2\u5230 ${rate} \u9898\u7684\u7B54\u6848,\uFF08\u7B54\u6848\u4E0D\u4E00\u5B9A\u6B63\u786E\uFF09, \u5219\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002` ]), ["100", "\u6BCF\u4E2A\u9898\u76EE\u90FD\u67E5\u5230\u7B54\u6848\u624D\u81EA\u52A8\u63D0\u4EA4", "\u7B54\u6848\u4E0D\u4E00\u5B9A\u6B63\u786E"], ["force", "\u5F3A\u5236\u81EA\u52A8\u63D0\u4EA4", "\u4E0D\u7BA1\u7B54\u6848\u662F\u5426\u6B63\u786E\u76F4\u63A5\u5F3A\u5236\u81EA\u52A8\u63D0\u4EA4\uFF0C\u5982\u9700\u5F00\u542F\uFF0C\u8BF7\u914D\u5408\u968F\u673A\u4F5C\u7B54\u8C28\u614E\u4F7F\u7528\u3002"] ]) ); } } }; const CommonProject = Project.create({ name: "\u901A\u7528", domains: [], level: 1, scripts: { guide: new Script({ name: "\u4F7F\u7528\u6559\u7A0B", url: [["\u6240\u6709\u9875\u9762", /.*/]], namespace: "common.guide", onrender({ panel: panel2, header }) { const guide = createGuide({ panel: panel2, header }); const home = el("button", { className: "base-style-button-secondary" }, "\u{1F3E1}\u5B98\u7F51\u6559\u7A0B"); home.onclick = () => window.open("https://docs.ocsjs.com", "_blank"); const notify = el("button", { className: "base-style-button-secondary" }, "\u2728\u67E5\u770B\u901A\u77E5\u63D0\u793A"); notify.onclick = () => $script.pin(CommonProject.scripts.notify); const changeLog = el("button", { className: "base-style-button-secondary" }, "\u{1F4C4}\u67E5\u770B\u66F4\u65B0\u65E5\u5FD7"); changeLog.onclick = () => $script.pin(CommonProject.scripts.changelog); changeLog.style.marginBottom = "12px"; guide.style.width = "400px"; panel2.body.replaceChildren(home, notify, changeLog, guide); } }), notify: new Script({ name: "\u901A\u77E5\u63D0\u793A", url: [["", /.*/]], namespace: "common.notify", configs: { notes: { defaultValue: $creator.notes([ "\u6B64\u9875\u9762\u5B9E\u65F6\u66F4\u65B0\uFF0C\u5927\u5BB6\u9047\u5230\u95EE\u9898\u53EF\u4EE5\u770B\u770B\u901A\u77E5", "\u6216\u8005\u8FDB\u5165\u4E0A\u65B9\u5B98\u7F51\u91CC\u7684\u4EA4\u6D41\u7FA4\u8FDB\u884C\u53CD\u9988" ]).outerHTML } }, async onrender({ panel: panel2 }) { panel2.body.replaceChildren("\u52A0\u8F7D\u4E2D..."); const md = await request("https://cdn.ocsjs.com/articles/ocs/notify.md", { type: "fetch", contentType: "text", method: "get" }); panel2.body.replaceChildren(el("div", { className: "card markdown", innerHTML: markdown(md) })); } }), settings: new Script({ name: "\u5168\u5C40\u8BBE\u7F6E", url: [["\u6240\u6709\u9875\u9762", /.*/]], namespace: "common.settings", configs: { notes: { defaultValue: $creator.notes([ "\u2728\u9F20\u6807\u79FB\u52A8\u5230\u6309\u94AE\u6216\u8005\u8F93\u5165\u6846\uFF0C\u53EF\u4EE5\u770B\u5230\u63D0\u793A\uFF01", "\u60F3\u8981\u81EA\u52A8\u7B54\u9898\u5FC5\u987B\u8BBE\u7F6E \u201C\u9898\u5E93\u914D\u7F6E\u201D ", "\u8BBE\u7F6E\u540E\u8FDB\u5165\u7AE0\u8282\u6D4B\u8BD5\uFF0C\u4F5C\u4E1A\uFF0C\u8003\u8BD5\u9875\u9762\u5373\u53EF\u81EA\u52A8\u7B54\u9898\u3002" ]).outerHTML }, notification: { label: "\u5F00\u542F\u7CFB\u7EDF\u901A\u77E5", defaultValue: true, attrs: { title: "\u5141\u8BB8\u811A\u672C\u53D1\u9001\u7CFB\u7EDF\u901A\u77E5\uFF0C\u53EA\u6709\u91CD\u8981\u4E8B\u60C5\u53D1\u751F\u65F6\u4F1A\u53D1\u9001\u7CFB\u7EDF\u901A\u77E5\uFF0C\u5C3D\u91CF\u907F\u514D\u7528\u6237\u53D7\u5230\u9A9A\u6270\uFF08\u5728\u7535\u8111\u5C4F\u5E55\u53F3\u4FA7\u663E\u793A\u901A\u77E5\u5F39\u7A97\uFF0C\u4F8B\u5982\u811A\u672C\u6267\u884C\u5B8C\u6BD5\uFF0C\u7248\u672C\u66F4\u65B0\u7B49\u901A\u77E5\uFF09\u3002", type: "checkbox" } }, answererWrappers: { defaultValue: [] }, answererWrappersButton: { label: "\u9898\u5E93\u914D\u7F6E", defaultValue: "\u70B9\u51FB\u914D\u7F6E", attrs: { type: "button" }, onload() { const aws = CommonProject.scripts.settings.cfg.answererWrappers || []; this.value = aws.length ? "\u5F53\u524D\u6709" + aws.length + "\u4E2A\u53EF\u7528\u9898\u5E93" : "\u70B9\u51FB\u914D\u7F6E"; this.onclick = () => { const aw = CommonProject.scripts.settings.cfg.answererWrappers || []; const copy = $creator.copy("\u590D\u5236\u9898\u5E93\u914D\u7F6E", JSON.stringify(aw)); const list = el("div", [ el("div", aw.length ? ["\u4EE5\u4E0B\u662F\u5DF2\u7ECF\u89E3\u6790\u8FC7\u7684\u9898\u5E93\u914D\u7F6E\uFF1A", copy] : ""), ...createAnswererWrapperList(aw) ]); const model = $model("prompt", { content: el("div", [ "\u5177\u4F53\u914D\u7F6E\u6559\u7A0B\uFF0C\u8BF7\u67E5\u770B\u5B98\u7F51\uFF1A", el("a", { href: "https://docs.ocsjs.com/docs/work" }, "\u81EA\u52A8\u7B54\u9898\u6559\u7A0B"), list ]), placeholder: aw.length ? "\u91CD\u65B0\u8F93\u5165" : "\u8F93\u5165\u9898\u5E93\u914D\u7F6E", cancelButton: el("button", { className: "model-cancel-button", innerText: "\u6E05\u7A7A\u9898\u5E93\u914D\u7F6E", onclick() { $message("success", { content: "\u5DF2\u6E05\u7A7A\uFF0C\u5728\u7B54\u9898\u524D\u8BF7\u8BB0\u5F97\u91CD\u65B0\u914D\u7F6E\u3002" }); model == null ? void 0 : model.remove(); CommonProject.scripts.settings.cfg.answererWrappers = []; } }), async onConfirm(value) { if (value) { try { const aw2 = await AnswerWrapperParser.from(value); if (aw2.length) { CommonProject.scripts.settings.cfg.answererWrappers = aw2; $model("alert", { content: el("div", [ el("div", "\u914D\u7F6E\u6210\u529F\uFF0C\u6253\u5F00\u5177\u6709\u7B54\u9898\u811A\u672C\u7684\u9875\u9762\u540E\u5373\u53EF\u81EA\u52A8\u7B54\u9898\uFF0C\u89E3\u6790\u5230\u7684\u9898\u5E93\u5982\u4E0B\u6240\u793A:"), ...createAnswererWrapperList(aw2) ]) }); } else { $model("alert", { content: "\u9898\u5E93\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u914D\u7F6E\u3002" }); } } catch (e) { $model("alert", { content: el("div", [el("div", "\u89E3\u6790\u5931\u8D25\uFF0C\u539F\u56E0\u5982\u4E0B :"), el("div", e.message)]) }); } } else { $model("alert", { content: el("div", "\u4E0D\u80FD\u4E3A\u7A7A\uFF01") }); } } }); }; } }, upload: workConfigs.upload, skipAnswered: { label: "\u8DF3\u8FC7\u5DF2\u7ECF\u5B8C\u6210\u7684\u9898\u76EE", attrs: { type: "checkbox", title: "\u5F53\u9898\u76EE\u4E2D\u7684\u9009\u9879\u5927\u4E8E\u4E00\u4E2A\u5DF2\u7ECF\u88AB\u9009\u4E2D\uFF0C\u5219\u5C06\u8DF3\u8FC7\u6B64\u9898\u7684\u7B54\u9898\u3002" }, defaultValue: true }, uncheckAllChoice: { label: "\u6E05\u7A7A\u7B54\u6848", attrs: { type: "checkbox", title: "\u5728\u8003\u8BD5\u5F00\u59CB\u524D\uFF0C\u6E05\u7A7A\u6240\u6709\u5DF2\u7ECF\u9009\u62E9\u8FC7\u7684\u7B54\u6848\u3002" }, defaultValue: false }, thread: { label: "\u7EBF\u7A0B\u6570\u91CF\uFF08\u4E2A\uFF09", attrs: { type: "number", min: 1, step: 1, max: 3, title: "\u540C\u4E00\u65F6\u95F4\u5185\u7B54\u9898\u7EBF\u7A0B\u5DE5\u4F5C\u7684\u6570\u91CF\uFF08\u4F8B\u5B50\uFF1A\u4E09\u4E2A\u7EBF\u7A0B\u5219\u4EE3\u8868\u4E00\u79D2\u5185\u540C\u65F6\u641C\u7D22\u4E09\u9053\u9898\uFF09\uFF0C\u8FC7\u591A\u53EF\u80FD\u5BFC\u81F4\u9898\u5E93\u670D\u52A1\u5668\u538B\u529B\u8FC7\u5927\uFF0C\u8BF7\u9002\u5F53\u8C03\u4F4E\u3002" }, defaultValue: 1 }, period: { label: "\u7B54\u9898\u95F4\u9694\uFF08\u79D2\uFF09", attrs: { type: "number", min: 0, step: 1, max: 60, title: "\u6BCF\u9053\u9898\u7684\u95F4\u9694\u65F6\u95F4\uFF0C\u4E0D\u5EFA\u8BAE\u592A\u4F4E\uFF0C\u907F\u514D\u589E\u52A0\u670D\u52A1\u5668\u538B\u529B\u3002" }, defaultValue: 3 }, timeout: { label: "\u5904\u7406\u8D85\u65F6\u65F6\u95F4\uFF08\u79D2\uFF09", attrs: { type: "number", min: 3, step: 1, max: 60, title: "\u6BCF\u9053\u9898\u6700\u591A\u505An\u79D2, \u8D85\u8FC7\u5219\u8DF3\u8FC7\u6B64\u9898\u3002" }, defaultValue: 30 }, retry: { label: "\u8D85\u65F6\u91CD\u8BD5\u6B21\u6570", attrs: { type: "number", min: 0, step: 1, max: 3 }, defaultValue: 1 }, forceWork: { label: "(\u4EC5\u8D85\u661F)\u5F3A\u5236\u7B54\u9898", defaultValue: false, attrs: { type: "checkbox", title: "\u5F53\u7AE0\u8282\u6D4B\u8BD5\u4E0D\u662F\u4EFB\u52A1\u70B9\u65F6\uFF0C\u5F3A\u5236\u81EA\u52A8\u7B54\u9898\u3002\n(\u5DE6\u4E0A\u89D2\u6709\u9EC4\u70B9\u7684\u4EE3\u8868\u6B64\u5C0F\u8282\u662F\u4EFB\u52A1\u70B9)\n(\u4E00\u822C\u6765\u8BF4\u4E0D\u662F\u4EFB\u52A1\u70B9\u7684\u7AE0\u8282\u6D4B\u8BD5\u662F\u4E0D\u8BA1\u5206\u7684)" } }, "randomWork-choice": { defaultValue: false, label: "(\u4EC5\u8D85\u661F)\u968F\u673A\u9009\u62E9", attrs: { type: "checkbox", title: "\u968F\u673A\u9009\u62E9\u4EFB\u610F\u4E00\u4E2A\u9009\u9879" } }, "randomWork-complete": { defaultValue: false, label: "(\u4EC5\u8D85\u661F)\u968F\u673A\u586B\u7A7A", attrs: { type: "checkbox", title: "\u968F\u673A\u586B\u5199\u4EE5\u4E0B\u4EFB\u610F\u4E00\u4E2A\u6587\u6848" } }, "randomWork-completeTexts-textarea": { defaultValue: ["\u4E0D\u4F1A", "\u4E0D\u77E5\u9053", "\u4E0D\u6E05\u695A", "\u4E0D\u61C2", "\u4E0D\u4F1A\u5199"].join("\n"), label: "(\u4EC5\u8D85\u661F)\u968F\u673A\u586B\u7A7A\u6587\u6848", tag: "textarea", attrs: { title: "\u6BCF\u884C\u4E00\u4E2A\uFF0C\u968F\u673A\u586B\u5165" } } }, oncomplete() { this.onConfigChange("notification", (open) => { if (open) { $gm.notification("\u60A8\u5DF2\u5F00\u542F\u7CFB\u7EDF\u901A\u77E5\uFF0C\u5982\u679C\u811A\u672C\u6709\u91CD\u8981\u60C5\u51B5\u9700\u8981\u5904\u7406\uFF0C\u5219\u4F1A\u53D1\u8D77\u901A\u77E5\u63D0\u793A\u60A8\u3002", { duration: 5 }); } }); }, onbeforeunload() { } }), onlineSearch: new Script({ name: "\u5728\u7EBF\u641C\u9898", url: [["\u6240\u6709\u9875\u9762", /.*/]], namespace: "common.online-search", configs: { notes: { defaultValue: "\u67E5\u9898\u524D\u8BF7\u5728 \u201C\u901A\u7528-\u5168\u5C40\u8BBE\u7F6E\u201D \u4E2D\u8BBE\u7F6E\u9898\u5E93\u914D\u7F6E\uFF0C\u624D\u80FD\u8FDB\u884C\u5728\u7EBF\u641C\u9898\u3002" }, selectSearch: { label: "\u5212\u8BCD\u641C\u7D22", defaultValue: true, attrs: { type: "checkbox", title: "\u4F7F\u7528\u9F20\u6807\u6ED1\u52A8\u9009\u62E9\u9875\u9762\u4E2D\u7684\u9898\u76EE\u8FDB\u884C\u641C\u7D22\u3002" } }, selection: { defaultValue: "" } }, oncomplete() { if (this.cfg.selectSearch) { document.addEventListener( "selectionchange", debounce_1(() => { var _a; this.cfg.selection = ((_a = document.getSelection()) == null ? void 0 : _a.toString()) || ""; }, 500) ); } }, onrender({ panel: panel2 }) { const content = el("div", "\u8BF7\u8F93\u5165\u9898\u76EE\u8FDB\u884C\u641C\u7D22\uFF1A", (content2) => { content2.style.marginBottom = "12px"; }); const input = el("input", { placeholder: "\u8BF7\u5C3D\u91CF\u4FDD\u8BC1\u9898\u76EE\u5B8C\u6574\uFF0C\u4E0D\u8981\u6F0F\u5B57\u54E6\u3002" }, (input2) => { input2.className = "base-style-input"; input2.style.flex = "1"; }); const search = async (value) => { content.replaceChildren(el("span", "\u641C\u7D22\u4E2D...")); if (value) { const t2 = Date.now(); const results = await defaultAnswerWrapperHandler(CommonProject.scripts.settings.cfg.answererWrappers, { title: value }); const resume = ((Date.now() - t2) / 1e3).toFixed(2); content.replaceChildren( el( "div", [ el("div", `\u641C\u7D22\u5230 ${results.map((r) => r.answers).flat().length} \u4E2A\u7ED3\u679C\uFF0C\u5171\u8017\u65F6 ${resume} \u79D2`), el("search-results-element", { results: results.map((res) => ({ results: res.answers.map((ans) => [ans.question, ans.answer]), homepage: res.homepage, name: res.name })), question: value }) ], (div) => { div.style.width = "400px"; } ) ); } else { content.replaceChildren(el("span", "\u9898\u76EE\u4E0D\u80FD\u4E3A\u7A7A\uFF01")); } }; const button = el("button", "\u641C\u7D22", (button2) => { button2.className = "base-style-button"; button2.onclick = () => { search(input.value); }; }); const searchContainer = el("div", [input, button], (div) => { div.style.display = "flex"; }); this.onConfigChange("selection", (curr) => { if (input.parentElement) { input.value = curr; } }); panel2.body.append(el("div", [el("hr"), content, searchContainer])); } }), workResults: new Script({ name: "\u641C\u7D22\u7ED3\u679C", url: [["\u6240\u6709\u9875\u9762", /.*/]], namespace: "common.work-results", configs: { notes: { defaultValue: $creator.notes([ ["\u8B66\u544A\uFF1A\u7981\u6B62\u4E0E\u5176\u4ED6\u811A\u672C\u4E00\u8D77\u4F7F\u7528\uFF0C", "\u5426\u5219\u51FA\u73B0\u7B54\u6848\u9009\u4E0D\u4E0A\u6216\u8005\u5176\u4ED6\u95EE\u9898\u4E00\u5F8B\u540E\u679C\u81EA\u8D1F\u3002"], "\u70B9\u51FB\u9898\u76EE\u5E8F\u53F7\uFF0C\u67E5\u770B\u641C\u7D22\u7ED3\u679C", "\u6BCF\u6B21\u81EA\u52A8\u7B54\u9898\u5F00\u59CB\u524D\uFF0C\u90FD\u4F1A\u6E05\u7A7A\u4E0A\u4E00\u6B21\u7684\u641C\u7D22\u7ED3\u679C\u3002" ]).outerHTML }, type: { label: "\u663E\u793A\u7C7B\u578B", tag: "select", attrs: { title: "\u4F7F\u7528\u9898\u76EE\u5217\u8868\u53EF\u80FD\u4F1A\u9020\u6210\u9875\u9762\u5361\u987F\u3002" }, defaultValue: "numbers", onload() { this.append( ...$creator.selectOptions(this.getAttribute("value"), [ ["numbers", "\u5E8F\u53F7\u5217\u8868"], ["questions", "\u9898\u76EE\u5217\u8868"] ]) ); } }, totalQuestionCount: { defaultValue: 0 }, requestIndex: { defaultValue: 0 }, resolverIndex: { defaultValue: 0 }, currentResultIndex: { defaultValue: 0 } }, onrender({ panel: panel2 }) { let scrollPercent = 0; const list = el("div"); let mouseoverIndex = -1; list.onscroll = () => { scrollPercent = list.scrollTop / list.scrollHeight; }; const setNumStyle = (result, num, index) => { if (result.requesting) { num.classList.add("requesting"); } else if (result.resolving) { num.classList.add("resolving"); } else if (result.error || result.searchResults.length === 0 || result.finish === false) { num.classList.add("error"); } else if (index === this.cfg.currentResultIndex) { num.classList.add("active"); } }; const render = async () => { const results = await $store.getTab("common.work-results.results"); if (results == null ? void 0 : results.length) { if (results[this.cfg.currentResultIndex] === void 0) { this.cfg.currentResultIndex = 0; } if (this.cfg.type === "numbers") { const resultContainer = el("div", {}, (res) => { res.style.width = "400px"; }); list.style.width = "400px"; list.style.marginBottom = "12px"; list.style.maxHeight = window.innerHeight / 2 + "px"; const nums = results.map((result, index) => { return el("span", { className: "search-results-num", innerText: (index + 1).toString() }, (num) => { setNumStyle(result, num, index); num.onclick = () => { for (const n of nums) { n.classList.remove("active"); } num.classList.add("active"); this.cfg.currentResultIndex = index; resultContainer.replaceChildren(createResult(result)); }; }); }); list.replaceChildren(...nums); resultContainer.replaceChildren(createResult(results[this.cfg.currentResultIndex])); panel2.body.replaceChildren(list, resultContainer); } else { list.style.width = "400px"; list.style.overflow = "auto"; list.style.maxHeight = window.innerHeight / 2 + "px"; const resultContainer = el("div", { className: "work-result-question-container" }); const nums = []; const questions = results.map((result, index) => { const num = el( "span", { className: "search-results-num", innerHTML: (index + 1).toString() }, (num2) => { num2.style.marginRight = "12px"; num2.style.display = "inline-block"; setNumStyle(result, num2, index); } ); nums.push(num); return el( "div", [num, result.question], (question) => { question.className = "search-results-question"; if (result.requesting === false && result.resolving === false && (result.error || result.searchResults.length === 0 || result.finish === false)) { question.classList.add("error"); } else if (index === this.cfg.currentResultIndex) { question.classList.add("active"); } question.onmouseover = () => { mouseoverIndex = index; question.classList.add("hover"); resultContainer.replaceChildren(createResult(result)); }; question.onmouseleave = () => { mouseoverIndex = -1; question.classList.remove("hover"); resultContainer.replaceChildren(createResult(results[this.cfg.currentResultIndex])); }; question.onclick = () => { for (const n of nums) { n.classList.remove("active"); } for (const q of questions) { q.classList.remove("active"); } nums[index].classList.add("active"); question.classList.add("active"); this.cfg.currentResultIndex = index; resultContainer.replaceChildren(createResult(result)); }; } ); }); list.replaceChildren(...questions); if (mouseoverIndex === -1) { resultContainer.replaceChildren(createResult(results[this.cfg.currentResultIndex])); } else { resultContainer.replaceChildren(createResult(results[mouseoverIndex])); } panel2.body.replaceChildren( el("div", [list, el("div", {}, [resultContainer])], (div) => { div.style.display = "flex"; }) ); } } else { panel2.body.replaceChildren( el("div", "\u26A0\uFE0F\u6682\u65E0\u4EFB\u4F55\u641C\u7D22\u7ED3\u679C", (div) => { div.style.textAlign = "center"; }) ); } list.scrollTo({ top: scrollPercent * list.scrollHeight, behavior: "auto" }); const tip = el("div", [ el("div", { className: "search-results-num requesting" }, "n"), "\u8868\u793A\u641C\u7D22\u4E2D ", el("br"), el("div", { className: "search-results-num resolving" }, "n"), "\u8868\u793A\u5DF2\u641C\u7D22\u4F46\u672A\u5F00\u59CB\u7B54\u9898 ", el("br"), el("div", { className: "search-results-num" }, "n"), "\u8868\u793A\u5DF2\u641C\u7D22\u5DF2\u7B54\u9898 " ]); panel2.body.prepend( el("hr"), el( "div", [ `\u5F53\u524D\u641C\u9898: ${this.cfg.requestIndex + 1}/${this.cfg.totalQuestionCount}`, " , ", `\u5F53\u524D\u7B54\u9898: ${this.cfg.resolverIndex + 1}/${this.cfg.totalQuestionCount}`, " , ", el("a", "\u67E5\u770B\u63D0\u793A", (btn) => { btn.addEventListener("click", () => { $model("confirm", { content: tip }); }); }) ], (div) => { div.style.marginBottom = "12px"; } ), el("hr") ); }; const createResult = (result) => { if (result) { const error = el("span", {}, (el2) => el2.style.color = "red"); if (result.requesting && result.resolving) { return el("div", [result.question, el("hr"), "\u5F53\u524D\u9898\u76EE\u8FD8\u672A\u5F00\u59CB\u641C\u7D22\uFF0C\u8BF7\u7A0D\u7B49\u3002"]); } else { if (result.error) { error.innerText = result.error; return el("div", [result.question, el("hr"), error]); } else if (result.searchResults.length === 0) { error.innerText = "\u6B64\u9898\u672A\u641C\u7D22\u5230\u7B54\u6848"; return el("div", [result.question, el("hr"), error]); } else { error.innerText = "\u6B64\u9898\u672A\u5B8C\u6210, \u53EF\u80FD\u662F\u6CA1\u6709\u5339\u914D\u7684\u9009\u9879\u3002"; return el("div", [ ...result.finish ? [] : [result.resolving ? "\u6B63\u5728\u7B49\u5F85\u7B54\u9898\u4E2D\uFF0C\u8BF7\u7A0D\u7B49\u3002" : error], el("search-results-element", { results: result.searchResults, question: result.question }) ]); } } } else { return el("div", "undefined"); } }; render(); this.onConfigChange("type", render); this.onConfigChange("resolverIndex", render); $store.addChangeListener("common.work-results.result", debounce_1(render, 1e3, { maxWait: 1e3 })); } }), changelog: new Script({ name: "\u7248\u672C\u66F4\u65B0", url: [["", /.*/]], namespace: "common.changelog", configs: { notes: { defaultValue: $creator.notes(["\u6B64\u9875\u9762\u5B9E\u65F6\u66F4\u65B0\uFF0C\u9047\u5230\u95EE\u9898\u53EF\u4EE5\u67E5\u770B\u6700\u65B0\u7248\u672C\u662F\u5426\u4FEE\u590D\u3002"]).outerHTML } }, async onrender({ panel: panel2 }) { panel2.body.replaceChildren("\u52A0\u8F7D\u4E2D..."); const md = await request("https://cdn.ocsjs.com/articles/ocs/changelog.md", { type: "fetch", contentType: "text", method: "get" }); panel2.body.replaceChildren(el("div", { className: "markdown card", innerHTML: markdown(md) })); } }), hack: new Script({ name: "\u9875\u9762\u590D\u5236\u7C98\u8D34\u9650\u5236\u89E3\u9664", url: [["\u6240\u6709\u9875\u9762", /.*/]], hideInPanel: true, onactive() { enableCopy(); }, oncomplete() { enableCopy(); setTimeout(() => enableCopy(), 3e3); } }), disableDialog: new Script({ name: "\u7981\u6B62\u5F39\u7A97", url: [], onstart() { try { $gm.unsafeWindow.alert = (msg) => $console.warn(`\u5DF2\u62E6\u622A\u5F39\u7A97: ${msg}`); window.alert = self.alert = (msg) => $console.warn(`\u5DF2\u62E6\u622A\u5F39\u7A97: ${msg}`); } catch (e) { } } }) } }); function enableCopy() { try { const d = document; const b = document.body; d.onselectstart = d.oncopy = d.onpaste = d.onkeydown = d.oncontextmenu = () => true; b.onselectstart = b.oncopy = b.onpaste = b.onkeydown = b.oncontextmenu = () => true; } catch (err) { console.error("\u9875\u9762\u590D\u5236\u7C98\u8D34\u529F\u80FD\u5F00\u542F\u5931\u8D25", err); } const style = document.createElement("style"); style.innerHTML = ` html * { -webkit-user-select: text !important; -khtml-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important; user-select: text !important; }`; document.body.appendChild(style); } function createAnswererWrapperList(aw) { return aw.map( (item) => el( "details", [ el("summary", [item.name]), el("ul", [ el("li", ["\u540D\u5B57 ", item.name]), el("li", { innerHTML: `\u5B98\u7F51 ${item.homepage || "\u65E0"}` }), el("li", ["\u63A5\u53E3 ", item.url]), el("li", ["\u8BF7\u6C42\u65B9\u6CD5 ", item.method]), el("li", ["\u8BF7\u6C42\u7C7B\u578B ", item.type]), el("li", ["\u8BF7\u6C42\u5934 ", JSON.stringify(item.headers, null, 4) || "\u65E0"]), el("li", ["\u8BF7\u6C42\u4F53 ", JSON.stringify(item.data, null, 4) || "\u65E0"]) ]) ], (details) => { details.style.paddingLeft = "12px"; } ) ); } const createGuide = ({ panel: panel2, header }) => { return el("div", { className: "user-guide card" }, [ $creator.notes( [ "\u6253\u5F00\u4EFB\u610F\u7F51\u8BFE\u5E73\u53F0\uFF0C\u7B49\u5F85\u811A\u672C\u52A0\u8F7D\uFF0C", "\u811A\u672C\u52A0\u8F7D\u540E\u67E5\u770B\u6BCF\u4E2A\u7F51\u8BFE\u4E0D\u540C\u7684\u4F7F\u7528\u63D0\u793A\u3002", "\u5982\u679C\u4E0D\u652F\u6301\u5F53\u524D\u7F51\u8BFE\uFF0C\u5219\u4E0D\u4F1A\u6709\u76F8\u5E94\u7684\u63D0\u793A\u4EE5\u53CA\u8BBE\u7F6E\u9762\u677F\u3002", [ "\u4EE5\u4E0B\u662F\u5168\u90E8\u652F\u6301\u7684\u7F51\u8BFE\u4EE5\u53CA\u5305\u542B\u7684\u811A\u672C\uFF08\u70B9\u51FB\u4E0B\u5217\u8BE6\u60C5\u5C55\u5F00\u67E5\u770B\uFF09:", ...definedProjects().filter((p) => p.studyProject).map((project) => { return el("details", [ el("summary", project.name), el( "ul", Object.keys(project.scripts).map((key) => { const script = project.scripts[key]; return el( "li", [ el("b", script.name), $creator.notes([ el("span", ["\u64CD\u4F5C\u9762\u677F\uFF1A", script.hideInPanel ? "\u9690\u85CF" : "\u663E\u793A"]), [ "\u8FD0\u884C\u9875\u9762\uFF1A", el( "ul", script.url.map( (i) => el("li", [ i[0], "\uFF1A", i[1] instanceof RegExp ? i[1].toString().replace(/\\/g, "").slice(1, -1) : el("a", { href: i[1], target: "_blank" }, i[1]) ]) ) ) ] ]) ], (li) => { li.style.marginBottom = "12px"; } ); }), (ul) => { ul.style.paddingLeft = "42px"; } ) ]); }), el("br") ], [ "\u6700\u540E\u6E29\u99A8\u63D0\u793A: ", "- \u7981\u6B62\u4E0E\u5176\u4ED6\u811A\u672C\u4E00\u8D77\u4F7F\u7528\uFF0C\u5426\u5219\u51FA\u73B0\u7B54\u6848\u9009\u4E0D\u4E0A\u6216\u8005\u9875\u9762\u5361\u6B7B\uFF0C\u65E0\u9650\u5237\u65B0\uFF0C\u7B49\u95EE\u9898\u4E00\u5F8B\u540E\u679C\u81EA\u8D1F\u3002", "- \u4EFB\u4F55\u5176\u4ED6\u7591\u95EE\u8BF7\u524D\u5F80\u5B98\u7F51\u67E5\u770B\u4EA4\u6D41\u7FA4\uFF0C\u8FDB\u5165\u4EA4\u6D41\u7FA4\u540E\u5E26\u622A\u56FE\u8FDB\u884C\u53CD\u9988\u3002", "- \u8BF7\u5C06\u6D4F\u89C8\u5668\u9875\u9762\u4FDD\u6301\u6700\u5927\u5316\uFF0C\u6216\u8005\u7F29\u5C0F\u7A97\u53E3\uFF0C\u4E0D\u80FD\u6700\u5C0F\u5316\uFF0C\u5426\u5219\u53EF\u80FD\u5BFC\u81F4\u811A\u672C\u5361\u6B7B\uFF01" ] ], "ol" ) ]); }; function createWorkerControl(script, getWorker) { var _a; const worker = getWorker(); let stop2 = true; const startBtn = $creator.button("\u25B6\uFE0F\u5F00\u59CB\u7B54\u9898"); const restartBtn = $creator.button("\u21A9\uFE0F\u91CD\u65B0\u7B54\u9898"); const controlBtn = $creator.button("\u23F8\uFE0F\u6682\u505C\u7B54\u9898"); const stopMessage = $message("warn", { duration: 10, content: "\u6682\u505C\u4E2D..." }); stopMessage.style.display = "none"; startBtn.onclick = () => { var _a2; startBtn.remove(); (_a2 = script.panel) == null ? void 0 : _a2.body.replaceChildren(el("hr"), restartBtn, controlBtn); script.event.emit("start"); }; restartBtn.onclick = () => script.event.emit("restart"); controlBtn.onclick = () => { var _a2; stop2 = !stop2; const worker2 = getWorker(); (_a2 = worker2 == null ? void 0 : worker2.emit) == null ? void 0 : _a2.call(worker2, stop2 ? "continuate" : "stop"); controlBtn.value = stop2 ? "\u23F8\uFE0F\u6682\u505C\u7B54\u9898" : "\u25B6\uFE0F\u7EE7\u7EED\u7B54\u9898"; stopMessage.style.display = stop2 ? "none" : "display"; }; script.event.on("done", () => controlBtn.disabled = true); if (script.panel) { script.panel.body.style.textAlign = "right"; } (_a = script.panel) == null ? void 0 : _a.body.replaceChildren(el("hr"), ...(worker == null ? void 0 : worker.isRunning) ? [restartBtn, controlBtn] : [startBtn]); } function optimizationTextWithImage(root2) { if (root2) { const el2 = root2.cloneNode(true); for (const img of Array.from(el2.querySelectorAll("img"))) { img.after(img.src); } return el2.innerText; } else { return ""; } } let stop = false; const hasCapture = false; const ZHSProject = Project.create({ name: "\u667A\u6167\u6811", level: 99, domains: ["zhihuishu.com"], studyProject: true, scripts: { guide: new Script({ name: "\u4F7F\u7528\u63D0\u793A", url: [ ["\u5B66\u4E60\u9996\u9875", "https://onlineweb.zhihuishu.com/onlinestuh5"], ["\u9996\u9875", "https://www.zhihuishu.com/"] ], level: 1, namespace: "zhs.guide", configs: { notes: { defaultValue: $creator.notes([ "\u8BF7\u624B\u52A8\u8FDB\u5165\u89C6\u9891\u3001\u4F5C\u4E1A\u3001\u8003\u8BD5\u9875\u9762\uFF0C\u811A\u672C\u4F1A\u81EA\u52A8\u8FD0\u884C\u3002", "\u5174\u8DA3\u8BFE\u4F1A\u81EA\u52A8\u4E0B\u4E00\u4E2A\uFF0C\u6240\u4EE5\u4E0D\u63D0\u4F9B\u811A\u672C\u3002", "\u6821\u5185\u5B66\u5206\u8BFE\u7684\u8003\u8BD5\u811A\u672C\u8FD8\u672A\u63D0\u4F9B\uFF0C\u8BF7\u624B\u52A8(\u5212\u8BCD)\u641C\u9898\u3002" ]).outerHTML } }, oncomplete() { $script.pin(this); } }), "gxk-study": new Script({ name: "\u5171\u4EAB\u8BFE\u5B66\u4E60\u811A\u672C", url: [["\u5171\u4EAB\u8BFE\u5B66\u4E60\u9875\u9762", "studyvideoh5.zhihuishu.com"]], level: 999, namespace: "zhs.gxk.study", configs: { notes: { defaultValue: $creator.notes([ "\u7AE0\u8282\u6D4B\u8BD5\u8BF7\u5927\u5BB6\u89C2\u770B\u5B8C\u89C6\u9891\u540E\u624B\u52A8\u6253\u5F00\u3002", [ "\u8BF7\u5927\u5BB6\u4ED4\u7EC6\u6253\u5F00\u89C6\u9891\u4E0A\u65B9\u7684\u201D\u5B66\u524D\u5FC5\u8BFB\u201C\uFF0C\u67E5\u770B\u6210\u7EE9\u5206\u5E03\u3002", "\u5982\u679C \u201C\u5E73\u65F6\u6210\u7EE9-\u5B66\u4E60\u4E60\u60EF\u6210\u7EE9\u201D \u5360\u6BD4\u591A\u7684\u8BDD\uFF0C\u5C31\u9700\u8981\u89C4\u5F8B\u5B66\u4E60\u3002", "\u6BCF\u5929\u5B9A\u65F6\u534A\u5C0F\u65F6\u53EF\u83B7\u5F97\u4E00\u5206\u4E60\u60EF\u5206\u3002", "\u5982\u679C\u4E0D\u60F3\u8981\u4E60\u60EF\u5206\u53EF\u5FFD\u7565\u3002" ] ]).outerHTML }, studyRecord: { defaultValue: [] }, stopTime: { label: "\u5B9A\u65F6\u505C\u6B62", tag: "select", attrs: { title: "\u5230\u65F6\u95F4\u540E\u81EA\u52A8\u6682\u505C\u811A\u672C" }, defaultValue: "0", onload() { this.append( ...$creator.selectOptions(this.getAttribute("value"), [ [0, "\u5173\u95ED"], [0.5, "\u534A\u5C0F\u65F6\u540E"], [1, "\u4E00\u5C0F\u65F6\u540E"], [2, "\u4E24\u5C0F\u65F6\u540E"] ]) ); } }, restudy, volume, definition, playbackRate: { label: "\u89C6\u9891\u500D\u901F", tag: "select", defaultValue: 1, onload() { this.append( ...$creator.selectOptions( this.getAttribute("value"), [1, 1.25, 1.5].map((rate) => [rate, rate + "x"]) ) ); } } }, onrender({ panel: panel2 }) { panel2.body.append( el("hr"), $creator.button("\u23F0\u68C0\u6D4B\u662F\u5426\u9700\u8981\u89C4\u5F8B\u5B66\u4E60", {}, (btn) => { btn.style.marginRight = "12px"; btn.onclick = () => { $el(".iconbaizhoumoshi-xueqianbidu").click(); setTimeout(() => { var _a; const num = parseInt( ((_a = $el(".preschool-Mustread-div").innerText.match(/学习习惯成绩((\d+)分)/)) == null ? void 0 : _a[1]) || "0" ); $model("alert", { content: `\u5F53\u524D\u8BFE\u7A0B\u4E60\u60EF\u5206\u5360\u6BD4\u4E3A${num}\u5206\uFF0C` + (num ? `\u9700\u8981\u89C4\u5F8B\u5B66\u4E60${num}\u5929, \u6BCF\u5929\u5B9A\u65F6\u89C2\u770B\u534A\u5C0F\u65F6\u5373\u53EF\u3002\uFF08\u5982\u679C\u4E0D\u60F3\u62FF\u4E60\u60EF\u5206\u53EF\u4EE5\u5FFD\u7565\uFF09` : "\u53EF\u4E00\u76F4\u89C2\u770B\u5B66\u4E60\uFF0C\u65E0\u9700\u5B9A\u65F6\u505C\u6B62\u3002") }); }, 100); }; }), $creator.button("\u{1F4D8}\u67E5\u770B\u5B66\u4E60\u8BB0\u5F55", {}, (btn) => { btn.onclick = () => { $model("alert", { title: "\u5B66\u4E60\u8BB0\u5F55", content: $creator.notes( this.cfg.studyRecord.map((r) => { const date = new Date(r.date); return [ `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, "0")}-${date.getDate().toString().padStart(2, "0")}`, $creator.notes(r.courses.map((course) => `${course.name} - ${optimizeSecond(course.time)}`)) ]; }) ) }); }; }) ); }, onactive() { this.cfg.stopTime = "0"; const records = this.cfg.studyRecord; const record = records.find( (record2) => new Date(record2.date).toLocaleDateString() === new Date().toLocaleDateString() ); if (!record) { records.push({ date: Date.now(), courses: [] }); this.cfg.studyRecord = records; } }, oncomplete() { var _a; $script.pin(this); const vue = (_a = $el(".video-study")) == null ? void 0 : _a.__vue__; let stopInterval = 0; let stopMessage; this.onConfigChange("stopTime", () => { var _a2; clearInterval(stopInterval); stopMessage == null ? void 0 : stopMessage.remove(); if (this.cfg.stopTime === "0") { $message("info", { content: "\u5B9A\u65F6\u505C\u6B62\u5DF2\u5173\u95ED" }); } else { let stopCount = parseFloat(this.cfg.stopTime) * 60 * 60; stopInterval = setInterval(() => { if (stopCount > 0 && hasCapture === false) { stopCount--; } else { clearInterval(stopInterval); stop = true; $el("video").pause(); $model("alert", { content: "\u811A\u672C\u6682\u505C\uFF0C\u5DF2\u83B7\u5F97\u4ECA\u65E5\u5E73\u65F6\u5206\uFF0C\u5982\u9700\u7EE7\u7EED\u89C2\u770B\uFF0C\u8BF7\u5237\u65B0\u9875\u9762\u3002" }); } }, 1e3); const val = (_a2 = [ [0.5, "\u534A\u5C0F\u65F6\u540E"], [1, "\u4E00\u5C0F\u65F6\u540E"], [2, "\u4E24\u5C0F\u65F6\u540E"] ].find((t2) => t2[0].toString() === this.cfg.stopTime)) == null ? void 0 : _a2[0]; const date = new Date(); date.setMinutes(date.getMinutes() + val * 60); stopMessage = $message("info", { duration: 0, content: `\u5728 ${date.toLocaleTimeString()} \u811A\u672C\u5C06\u81EA\u52A8\u6682\u505C` }); } }); this.onConfigChange("volume", (curr) => { $el("video").volume = curr; }); this.onConfigChange("playbackRate", (curr) => { switchPlaybackRate(parseFloat(curr.toString())); }); this.onConfigChange("definition", (curr) => { switchLine(curr); }); const hideDialog = () => { $$el(".el-dialog__wrapper").forEach((dialog) => { dialog.remove(); }); }; const closeTestDialog = async () => { const items = $$el(".topic-item"); if (items.length !== 0) { items[0].click(); await $.sleep(1e3); vue.testDialog = false; } }; const finish = () => { $model("alert", { content: "\u68C0\u6D4B\u5230\u5F53\u524D\u89C6\u9891\u5168\u90E8\u64AD\u653E\u5B8C\u6BD5\uFF0C\u5982\u679C\u8FD8\u6709\u672A\u5B8C\u6210\u7684\u89C6\u9891\u8BF7\u5237\u65B0\u91CD\u8BD5\uFF0C\u6216\u8005\u6253\u5F00\u590D\u4E60\u6A21\u5F0F\u3002" }); }; const fixProcessBar = () => { const bar = $el(".controlsBar"); bar.style.display = "block"; }; let timeMessage; const calculateTime = () => { var _a2, _b; try { const vue2 = (_a2 = $el(".video-study")) == null ? void 0 : _a2.__vue__; const videos = vue2.videoList.map((v) => v.videoLessons).flat().map((l) => (l == null ? void 0 : l.videoSmallLessons) || l).flat().filter((v) => v.isStudiedLesson === 0); const allTime = videos.map((l) => l.videoSec || 0).reduce((pre, curr) => pre + curr, 0); if (timeMessage) { timeMessage.remove(); } const record = this.cfg.studyRecord.find( (r) => new Date(r.date).toLocaleDateString() === new Date().toLocaleDateString() ); timeMessage = $message("info", { duration: 0, content: `\u8FD8\u5269${videos.length - 1}\u4E2A\u89C6\u9891\uFF0C\u603B\u65F6\u957F${(allTime / (60 * 60)).toFixed( 2 )}\u5C0F\u65F6\uFF0C\u4ECA\u65E5\u5DF2\u5B66\u4E60${optimizeSecond( ((_b = record == null ? void 0 : record.courses.find((c) => c.name === vue2.data.courseInfo.name)) == null ? void 0 : _b.time) || 0 )}` }); } catch { } }; const interval = setInterval(async () => { if (vue.videoList.length) { clearInterval(interval); hack(); hideDialog(); setInterval(() => { closeTestDialog(); fixProcessBar(); $$el(".v-modal,.mask").forEach((modal) => { modal.remove(); }); if (!stop) { const records = this.cfg.studyRecord; const record = records.find( (r) => new Date(r.date).toLocaleDateString() === new Date().toLocaleDateString() ); if (record) { record.courses = (record == null ? void 0 : record.courses) || []; const course = record == null ? void 0 : record.courses.find((c) => c.name === vue.data.courseInfo.name); if (course) { course.time = course.time + 3; } else { record.courses.push({ name: vue.data.courseInfo.name, time: 0 }); } this.cfg.studyRecord = records; } } }, 3e3); let list = $$el("li.clearfix.video"); if (!this.cfg.restudy) { list = list.filter((el2) => el2.querySelector(".time_icofinish") === null); } if (list.length === 0) { finish(); } else { $message("info", { content: "3\u79D2\u540E\u5F00\u59CB\u5B66\u4E60", duration: 3 }); const study2 = async () => { if (stop === false) { const item = list.shift(); if (item) { await $.sleep(3e3); item.click(); await $.sleep(5e3); watch( { volume: this.cfg.volume, playbackRate: this.cfg.playbackRate, definition: this.cfg.definition }, study2 ); calculateTime(); } else { finish(); } } else { $message("warn", { content: "\u68C0\u6D4B\u5230\u5F53\u524D\u89C6\u9891\u5168\u90E8\u64AD\u653E\u5B8C\u6BD5\uFF0C\u5982\u679C\u8FD8\u6709\u672A\u5B8C\u6210\u7684\u89C6\u9891\u8BF7\u5237\u65B0\u91CD\u8BD5\uFF0C\u6216\u8005\u6253\u5F00\u590D\u4E60\u6A21\u5F0F\u3002" }); } }; study2(); } } }, 1e3); setTimeout(() => { if (vue.videoList.length === 0) { finish(); clearInterval(interval); } }, 10 * 1e3); } }), "xnk-study": new Script({ name: "\u6821\u5185\u8BFE\u5B66\u4E60\u811A\u672C", url: [["\u6821\u5185\u8BFE\u5B66\u4E60\u9875\u9762", "zhihuishu.com/aidedteaching/sourceLearning"]], namespace: "zhs.xnk.study", configs: { notes: { defaultValue: $creator.notes(["\u7AE0\u8282\u6D4B\u8BD5\u8BF7\u5927\u5BB6\u89C2\u770B\u5B8C\u89C6\u9891\u540E\u624B\u52A8\u6253\u5F00\u3002", "\u6B64\u8BFE\u7A0B\u4E0D\u80FD\u4F7F\u7528\u500D\u901F\u3002"]).outerHTML }, restudy, volume }, oncomplete() { $script.pin(this); const finish = () => { $model("alert", { content: "\u68C0\u6D4B\u5230\u5F53\u524D\u89C6\u9891\u5168\u90E8\u64AD\u653E\u5B8C\u6BD5\uFF0C\u5982\u679C\u8FD8\u6709\u672A\u5B8C\u6210\u7684\u89C6\u9891\u8BF7\u5237\u65B0\u91CD\u8BD5\uFF0C\u6216\u8005\u6253\u5F00\u590D\u4E60\u6A21\u5F0F\u3002" }); }; this.onConfigChange("volume", (curr) => { $el("video").volume = curr; }); let list = []; const interval = setInterval(async () => { list = $$el(".icon-video").map((icon) => icon.parentElement); if (list.length) { clearInterval(interval); if (!this.cfg.restudy) { list = list.filter((el2) => el2.querySelector(".icon-finish") === null); } const item = list[0]; if (item) { if (item.classList.contains("active")) { watch({ volume: this.cfg.volume, playbackRate: 1 }, () => { if (list[1]) list[1].click(); }); } else { item.click(); } } } }, 1e3); setTimeout(() => { if (list.length === 0) { finish(); clearInterval(interval); } }, 10 * 1e3); } }), "gxk-work-and-exam-guide": new Script({ name: "\u5171\u4EAB\u8BFE\u4F5C\u4E1A\u8003\u8BD5\u63D0\u793A", url: [["\u5171\u4EAB\u8BFE\u4F5C\u4E1A\u8003\u8BD5\u5217\u8868\u9875\u9762", "zhihuishu.com/stuExamWeb.html#/webExamList\\?"]], namespace: "zhs.work.gxk-guide", level: 999, configs: { notes: { defaultValue: $creator.notes( [ [ el("b", "\u5728\u8FDB\u884C\u4F5C\u4E1A\u6216\u8005\u8003\u8BD5\u4E4B\u524D\uFF0C\u8BF7\u5728\u201D\u901A\u7528-\u5168\u5C40\u8BBE\u7F6E\u201C\u4E2D\u8BBE\u7F6E\u597D\u9898\u5E93\u914D\u7F6E"), el("b", "\u5E76\u5728\u4F5C\u4E1A\u548C\u8003\u8BD5\u811A\u672C\u4E2D\u5F00\u542F\u81EA\u52A8\u7B54\u9898\u9009\u9879\uFF0C\u5426\u5219\u5C06\u65E0\u6CD5\u6B63\u5E38\u7B54\u9898\u3002") ], "\u8003\u8BD5\u81EA\u52A8\u7B54\u9898\u5728\u8BBE\u7F6E\u4E2D\u5F00\u542F\uFF0C\u5E76\u70B9\u51FB\u8FDB\u5165\u5373\u53EF\u4F7F\u7528", "\u8FDB\u5165\u8003\u8BD5\u9875\u9762\u540E\u9700\u8981\u5237\u65B0\u4E00\u4E0B\u3002", "\u8003\u8BD5\u529F\u80FD\u56E0\u4E3A\u88AB\u9891\u7E41\u9488\u5BF9\u6240\u4EE5\u4E0D\u7A33\u5B9A, \u5927\u5BB6\u9884\u7559\u597D\u5176\u4ED6\u641C\u9898\u65B9\u5F0F\u3002" ], "ol" ).outerHTML } }, oncomplete() { $script.pin(this); } }), "gxk-work": new Script({ name: "\u5171\u4EAB\u8BFE\u4F5C\u4E1A\u811A\u672C", url: [ ["\u5171\u4EAB\u8BFE\u4F5C\u4E1A\u9875\u9762", "zhihuishu.com/stuExamWeb.html#/webExamList/dohomework"], ["\u5171\u4EAB\u8BFE\u4F5C\u4E1A\u8003\u8BD5\u5217\u8868\u9875\u9762", "zhihuishu.com/stuExamWeb.html#/webExamList\\?"] ], namespace: "zhs.gxk.work", level: 99, configs: workConfigs, oncomplete() { $script.pin(this); const changeMsg = () => $message("info", { content: "\u68C0\u6D4B\u5230\u8BBE\u7F6E\u66F4\u6539\uFF0C\u8BF7\u91CD\u65B0\u8FDB\u5165\uFF0C\u6216\u8005\u5237\u65B0\u4F5C\u4E1A\u9875\u9762\u8FDB\u884C\u7B54\u9898\u3002" }); this.onConfigChange("upload", changeMsg); this.onConfigChange("auto", changeMsg); let worker; let warn; this.on("render", () => createWorkerControl(this, () => worker)); this.event.on("start", () => start2()); this.event.on("restart", () => { worker == null ? void 0 : worker.emit("close"); $message("info", { content: "3\u79D2\u540E\u91CD\u65B0\u7B54\u9898\u3002" }); setTimeout(start2, 3e3); }); const start2 = () => { warn == null ? void 0 : warn.remove(); recognize(); $creator.workPreCheckMessage({ onrun: (opts2) => { worker = gxkWorkOrExam("work", opts2); }, ondone: () => this.event.emit("done"), ...CommonProject.scripts.settings.cfg }); }; if (/zhihuishu.com\/stuExamWeb.html#\/webExamList\/dohomework/.test(location.href)) { createWorkerControl(this, () => worker); if (this.cfg.auto === false) { this.event.emit("done"); warn = $message("warn", { duration: 0, content: "\u81EA\u52A8\u7B54\u9898\u5DF2\u88AB\u5173\u95ED\uFF01\u8BF7\u624B\u52A8\u70B9\u51FB\u5F00\u59CB\u7B54\u9898\uFF0C\u6216\u8005\u5FFD\u7565\u6B64\u8B66\u544A" }); } else { const interval = setInterval(() => { var _a; const vue = (_a = $el("#app > div")) == null ? void 0 : _a.__vue__; if (vue == null ? void 0 : vue.alllQuestionTest) { clearInterval(interval); start2(); } }, 1e3); } } } }), "gxk-exam": new Script({ name: "\u5171\u4EAB\u8BFE\u8003\u8BD5\u811A\u672C", url: [ ["\u5171\u4EAB\u8BFE\u8003\u8BD5\u9875\u9762", "zhihuishu.com/stuExamWeb.html#/webExamList/doexamination"], ["\u5171\u4EAB\u8BFE\u4F5C\u4E1A\u8003\u8BD5\u5217\u8868\u9875\u9762", "zhihuishu.com/stuExamWeb.html#/webExamList\\?"] ], namespace: "zhs.gxk.exam", level: 99, configs: { notes: { defaultValue: $creator.notes([ "\u7B54\u9898\u524D\u8BF7\u5728 \u201C\u901A\u7528-\u5168\u5C40\u8BBE\u7F6E\u201D \u4E2D\u8BBE\u7F6E\u9898\u5E93\u914D\u7F6E\uFF0C\u624D\u80FD\u5F00\u59CB\u81EA\u52A8\u7B54\u9898\u3002", "\u53EF\u4EE5\u642D\u914D \u201C\u901A\u7528-\u5728\u7EBF\u641C\u9898\u201D \u4E00\u8D77\u4F7F\u7528\u3002", "\u8003\u8BD5\u8BF7\u5728\u811A\u672C\u81EA\u52A8\u7B54\u9898\u5B8C\u6210\u540E\u81EA\u884C\u68C0\u67E5\uFF0C\u81EA\u5DF1\u70B9\u51FB\u63D0\u4EA4\uFF0C\u811A\u672C\u4E0D\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002", "\u5982\u679C\u5F00\u542F\u540E\u811A\u672C\u4ECD\u7136\u6CA1\u6709\u53CD\u5E94\uFF0C\u8BF7\u5237\u65B0\u9875\u9762\u91CD\u8BD5\u3002" ]).outerHTML }, auto: { label: "\u5F00\u542F\u81EA\u52A8\u7B54\u9898", attrs: { type: "checkbox" }, defaultValue: false } }, async oncomplete() { $script.pin(this); const changeMsg = () => $message("info", { content: "\u68C0\u6D4B\u5230\u8BBE\u7F6E\u66F4\u6539\uFF0C\u8BF7\u91CD\u65B0\u8FDB\u5165\uFF0C\u6216\u8005\u5237\u65B0\u4F5C\u4E1A\u9875\u9762\u8FDB\u884C\u7B54\u9898\u3002" }); this.onConfigChange("auto", changeMsg); let worker; this.on("render", () => createWorkerControl(this, () => worker)); this.event.on("start", () => start2()); this.event.on("restart", () => { worker == null ? void 0 : worker.emit("close"); $message("info", { content: "3\u79D2\u540E\u91CD\u65B0\u7B54\u9898\u3002" }); setTimeout(start2, 3e3); }); const start2 = () => { $creator.workPreCheckMessage({ onrun: (opts2) => { worker = gxkWorkOrExam("exam", opts2); }, ondone: () => { this.event.emit("done"); }, ...CommonProject.scripts.settings.cfg, upload: "nomove" }); }; if (/zhihuishu.com\/stuExamWeb.html#\/webExamList\/doexamination/.test(location.href)) { createWorkerControl(this, () => worker); if (this.cfg.auto) { await waitForQuestionsLoad(); recognize(); start2(); } else { this.event.emit("done"); $message("warn", { duration: 0, content: "\u81EA\u52A8\u7B54\u9898\u5DF2\u88AB\u5173\u95ED\uFF01\u8BF7\u624B\u52A8\u70B9\u51FB\u5F00\u59CB\u7B54\u9898\uFF0C\u6216\u8005\u5FFD\u7565\u6B64\u8B66\u544A" }); } } } }), "xnk-work": new Script({ name: "\u6821\u5185\u8BFE\u4F5C\u4E1A\u8003\u8BD5\u811A\u672C", url: [["\u6821\u5185\u8BFE\u8003\u8BD5\u9875\u9762", "zhihuishu.com/atHomeworkExam/stu/homeworkQ/exerciseList"]], namespace: "zhs.xnk.work", level: 99, configs: workConfigs, oncomplete() { $script.pin(this); const changeMsg = () => $message("info", { content: "\u68C0\u6D4B\u5230\u8BBE\u7F6E\u66F4\u6539\uFF0C\u8BF7\u91CD\u65B0\u8FDB\u5165\uFF0C\u6216\u8005\u5237\u65B0\u4F5C\u4E1A\u9875\u9762\u8FDB\u884C\u7B54\u9898\u3002" }); this.onConfigChange("upload", changeMsg); this.onConfigChange("auto", changeMsg); let worker; createWorkerControl(this, () => worker); this.on("render", () => createWorkerControl(this, () => worker)); this.on("start", () => start2()); this.event.on("restart", () => { worker == null ? void 0 : worker.emit("close"); $message("info", { content: "3\u79D2\u540E\u91CD\u65B0\u7B54\u9898\u3002" }); setTimeout(start2, 3e3); }); if (this.cfg.auto === false) { return $message("warn", { duration: 0, content: "\u81EA\u52A8\u7B54\u9898\u5DF2\u88AB\u5173\u95ED\uFF01\u8BF7\u624B\u52A8\u70B9\u51FB\u5F00\u59CB\u7B54\u9898\uFF0C\u6216\u8005\u5FFD\u7565\u6B64\u8B66\u544A" }); } const start2 = () => { $creator.workPreCheckMessage({ onrun: (opts2) => { worker = xnkWork(opts2); }, ondone: () => { this.event.emit("done"); }, ...CommonProject.scripts.settings.cfg }); }; } }) } }); async function watch(options, onended) { let video = $el("video"); const set = async () => { switchLine(options.definition); await $.sleep(1e3); switchPlaybackRate(options.playbackRate); await $.sleep(500); video = $el("video"); video.currentTime = 1; await $.sleep(500); video.volume = options.volume; await $.sleep(500); }; await set(); video.play().catch(() => { $model("alert", { content: "\u7531\u4E8E\u6D4F\u89C8\u5668\u4FDD\u62A4\u9650\u5236\uFF0C\u5982\u679C\u8981\u64AD\u653E\u5E26\u6709\u97F3\u91CF\u7684\u89C6\u9891\uFF0C\u60A8\u5FC5\u987B\u5148\u70B9\u51FB\u9875\u9762\u4E0A\u7684\u4EFB\u610F\u4F4D\u7F6E\u624D\u80FD\u8FDB\u884C\u89C6\u9891\u7684\u64AD\u653E\u3002", onClose: async () => { video.play(); } }); }); video.onpause = async () => { if (!video.ended && stop === false) { await waitForCaptcha(); await $.sleep(1e3); video.play(); } }; video.onended = onended; } function switchLine(definition2 = "line1bq") { var _a; (_a = $el(`.definiLines .${definition2}`)) == null ? void 0 : _a.click(); } function switchPlaybackRate(playbackRate) { var _a; (_a = $el(`.speedList [rate="${playbackRate === 1 ? "1.0" : playbackRate}"]`)) == null ? void 0 : _a.click(); } function checkForCaptcha(update) { let modal; return setInterval(() => { if ($el(".yidun_popup")) { update(true); if (modal === void 0) { modal = $model("alert", { content: "\u5F53\u524D\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\uFF0C\u8BF7\u8F93\u5165\u540E\u65B9\u53EF\u7EE7\u7EED\u8FD0\u884C\u3002" }); } } else { if (modal) { update(false); modal.remove(); modal = void 0; } } }, 1e3); } function waitForCaptcha() { const popup = document.querySelector(".yidun_popup"); if (popup) { $message("warn", { content: "\u5F53\u524D\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\uFF0C\u8BF7\u8F93\u5165\u540E\u65B9\u53EF\u7EE7\u7EED\u8FD0\u884C\u3002" }); return new Promise((resolve, reject) => { const interval = setInterval(() => { const popup2 = document.querySelector(".yidun_popup"); if (popup2 === null) { clearInterval(interval); resolve(); } }, 1e3); }); } } function waitForQuestionsLoad() { return new Promise((resolve) => { const interval = setInterval(() => { var _a; const vue = (_a = $el("#app > div")) == null ? void 0 : _a.__vue__; if (vue == null ? void 0 : vue.alllQuestionTest) { clearInterval(interval); resolve(); } }, 1e3); }); } function hack() { var _a; const vue = (_a = $el(".video-study")) == null ? void 0 : _a.__vue__; const empty = () => { }; vue.checkout = empty; vue.notTrustScript = empty; vue.checkoutNotTrustScript = empty; const _videoClick = vue.videoClick; vue.videoClick = function(...args) { const e = new PointerEvent("click"); const event = /* @__PURE__ */ Object.create({ isTrusted: true }); Object.setPrototypeOf(event, e); args[args.length - 1] = event; return _videoClick.apply(vue, args); }; vue.videoClick = function(...args) { args[args.length - 1] = { isTrusted: true }; return _videoClick.apply(vue, args); }; } function recognize() { for (const div of $$el(".subject_describe > div")) { div.__vue__.$el.innerHTML = div.__vue__._data.shadowDom.textContent; } } function gxkWorkOrExam(type = "work", { answererWrappers, period, timeout, retry, upload, thread }) { $message("info", { content: `\u5F00\u59CB${type === "work" ? "\u4F5C\u4E1A" : "\u8003\u8BD5"}` }); $store.setTab("common.work-results.results", []); $script.pin(CommonProject.scripts.workResults); const worker = new OCSWorker({ root: ".examPaper_subject", elements: { title: ".subject_describe,.smallStem_describe", options: ".subject_node .nodeLab" }, requestPeriod: period != null ? period : 3, resolvePeriod: 1, timeout: timeout != null ? timeout : 30, retry: retry != null ? retry : 2, thread: thread != null ? thread : 1, answerer: (elements, type2, ctx) => defaultAnswerWrapperHandler(answererWrappers, { type: type2, title: elements.title.filter((t2) => t2.innerText).map((t2) => optimizationTextWithImage(t2)).join(","), root: ctx.root }), work: { handler(type2, answer, option) { var _a; if (type2 === "judgement" || type2 === "single" || type2 === "multiple") { if (!((_a = option.querySelector("input")) == null ? void 0 : _a.checked)) { option.click(); } } else if (type2 === "completion" && answer.trim()) { const text = option.querySelector("textarea"); if (text) { text.value = answer; } } } }, onResultsUpdate(res) { $store.setTab("common.work-results.results", $.simplifyWorkResult(res)); }, onResolveUpdate(res) { CommonProject.scripts.workResults.cfg.totalQuestionCount = worker.totalQuestionCount; CommonProject.scripts.workResults.cfg.requestIndex = worker.requestIndex; CommonProject.scripts.workResults.cfg.resolverIndex = worker.resolverIndex; } }); checkForCaptcha((hasCaptcha) => { if (hasCaptcha) { worker.emit("stop"); } else { worker.emit("continuate"); } }); worker.doWork().then(async (results) => { if (type === "exam") { $message("info", { content: "\u8003\u8BD5\u5B8C\u6210\uFF0C\u4E3A\u4E86\u5B89\u5168\u8003\u8651\uFF0C\u8BF7\u81EA\u884C\u68C0\u67E5\u540E\u81EA\u884C\u70B9\u51FB\u63D0\u4EA4\uFF01" }); } else { await worker.uploadHandler({ type: upload, results, async callback(finishedRate, uploadable) { var _a; $message("info", { content: `\u5B8C\u6210\u7387 ${finishedRate.toFixed(2)} : ${uploadable ? "5\u79D2\u540E\u5C06\u81EA\u52A8\u63D0\u4EA4" : "5\u79D2\u540E\u5C06\u81EA\u52A8\u4FDD\u5B58"} ` }); await $.sleep(5e3); const saveBtn = $el(".btnStyleX:not(.btnStyleXSumit)"); const uploadBtn = $el(".btnStyleXSumit"); if (uploadable) { uploadBtn == null ? void 0 : uploadBtn.click(); } else { saveBtn == null ? void 0 : saveBtn.click(); } await $.sleep(2e3); (_a = $el("[role='dialog'] .el-button--primary")) == null ? void 0 : _a.click(); } }); } const text = el("span", "\u6B63\u5728\u4FDD\u5B58\u9898\u76EE\u4E2D\uFF0C\u8BF7\u52FF\u64CD\u4F5C..."); const modal = $model("alert", { content: text }); for (let index = 0; index < worker.totalQuestionCount; index++) { $el("div.examPaper_box > div.switch-btn-box > button:nth-child(2)").click(); await $.sleep(1e3); } text.innerText = "\u6240\u6709\u9898\u76EE\u4FDD\u5B58\u6210\u529F\u3002"; setTimeout(() => modal == null ? void 0 : modal.remove(), 3e3); $message("success", { duration: 0, content: "\u4F5C\u4E1A\u5DF2\u5B8C\u6210\u3002" }); }).catch((err) => { $message("error", { content: "\u7B54\u9898\u7A0B\u5E8F\u53D1\u751F\u9519\u8BEF : " + err.message }); }); return worker; } function xnkWork({ answererWrappers, period, timeout, retry, thread }) { $message("info", { content: "\u5F00\u59CB\u4F5C\u4E1A" }); $store.setTab("common.work-results.results", []); $script.pin(CommonProject.scripts.workResults); const worker = new OCSWorker({ root: ".questionBox", elements: { title: ".questionContent", options: ".optionUl label", questionTit: ".questionTit" }, requestPeriod: period != null ? period : 3, resolvePeriod: 1, timeout: timeout != null ? timeout : 30, retry: retry != null ? retry : 2, thread: thread != null ? thread : 1, answerer: (elements, type, ctx) => { const title = StringUtils.nowrap(elements.title[0].innerText).trim(); if (title) { return defaultAnswerWrapperHandler(answererWrappers, { type, title, root: ctx.root }); } else { throw new Error("\u9898\u76EE\u4E3A\u7A7A\uFF0C\u8BF7\u67E5\u770B\u9898\u76EE\u662F\u5426\u4E3A\u7A7A\uFF0C\u6216\u8005\u5FFD\u7565\u6B64\u9898"); } }, work: { handler(type, answer, option, ctx) { var _a; if (type === "judgement" || type === "single" || type === "multiple") { if (((_a = option.querySelector("input")) == null ? void 0 : _a.checked) === false) { option.click(); } } else if (type === "completion" && answer.trim()) { const text = option.querySelector("textarea"); if (text) { text.value = answer; } } } }, onResultsUpdate(res) { $store.setTab("common.work-results.results", $.simplifyWorkResult(res)); }, onResolveUpdate(res) { CommonProject.scripts.workResults.cfg.totalQuestionCount = worker.totalQuestionCount; CommonProject.scripts.workResults.cfg.requestIndex = worker.requestIndex; CommonProject.scripts.workResults.cfg.resolverIndex = worker.resolverIndex; } }); const getBtn = () => document.querySelector("span.Topicswitchingbtn:nth-child(2)"); let next = getBtn(); (async () => { while (next && worker.isClose === false) { await worker.doWork(); await $.sleep((period != null ? period : 3) * 1e3); next = getBtn(); next == null ? void 0 : next.click(); await $.sleep((period != null ? period : 3) * 1e3); } })(); return worker; } function optimizeSecond(second) { return second / 3600 < 1 ? `${(second / 60).toFixed(2)}\u5206\u949F` : `${(second / 3600).toFixed(2)}\u5C0F\u65F6`; } var md5$1 = { exports: {} }; var crypt = { exports: {} }; (function() { var base64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", crypt$1 = { rotl: function(n, b) { return n << b | n >>> 32 - b; }, rotr: function(n, b) { return n << 32 - b | n >>> b; }, endian: function(n) { if (n.constructor == Number) { return crypt$1.rotl(n, 8) & 16711935 | crypt$1.rotl(n, 24) & 4278255360; } for (var i = 0; i < n.length; i++) n[i] = crypt$1.endian(n[i]); return n; }, randomBytes: function(n) { for (var bytes = []; n > 0; n--) bytes.push(Math.floor(Math.random() * 256)); return bytes; }, bytesToWords: function(bytes) { for (var words = [], i = 0, b = 0; i < bytes.length; i++, b += 8) words[b >>> 5] |= bytes[i] << 24 - b % 32; return words; }, wordsToBytes: function(words) { for (var bytes = [], b = 0; b < words.length * 32; b += 8) bytes.push(words[b >>> 5] >>> 24 - b % 32 & 255); return bytes; }, bytesToHex: function(bytes) { for (var hex = [], i = 0; i < bytes.length; i++) { hex.push((bytes[i] >>> 4).toString(16)); hex.push((bytes[i] & 15).toString(16)); } return hex.join(""); }, hexToBytes: function(hex) { for (var bytes = [], c = 0; c < hex.length; c += 2) bytes.push(parseInt(hex.substr(c, 2), 16)); return bytes; }, bytesToBase64: function(bytes) { for (var base64 = [], i = 0; i < bytes.length; i += 3) { var triplet = bytes[i] << 16 | bytes[i + 1] << 8 | bytes[i + 2]; for (var j = 0; j < 4; j++) if (i * 8 + j * 6 <= bytes.length * 8) base64.push(base64map.charAt(triplet >>> 6 * (3 - j) & 63)); else base64.push("="); } return base64.join(""); }, base64ToBytes: function(base64) { base64 = base64.replace(/[^A-Z0-9+\/]/ig, ""); for (var bytes = [], i = 0, imod4 = 0; i < base64.length; imod4 = ++i % 4) { if (imod4 == 0) continue; bytes.push((base64map.indexOf(base64.charAt(i - 1)) & Math.pow(2, -2 * imod4 + 8) - 1) << imod4 * 2 | base64map.indexOf(base64.charAt(i)) >>> 6 - imod4 * 2); } return bytes; } }; crypt.exports = crypt$1; })(); var charenc = { utf8: { stringToBytes: function(str) { return charenc.bin.stringToBytes(unescape(encodeURIComponent(str))); }, bytesToString: function(bytes) { return decodeURIComponent(escape(charenc.bin.bytesToString(bytes))); } }, bin: { stringToBytes: function(str) { for (var bytes = [], i = 0; i < str.length; i++) bytes.push(str.charCodeAt(i) & 255); return bytes; }, bytesToString: function(bytes) { for (var str = [], i = 0; i < bytes.length; i++) str.push(String.fromCharCode(bytes[i])); return str.join(""); } } }; var charenc_1 = charenc; /*! * Determine if an object is a Buffer * * @author Feross Aboukhadijeh