Greasy Fork is available in English.

Apifox万能网课助手

Apifox网课助手,专注于帮助大学生从网课中释放出来。让自己的时间把握在自己的手中,拥有人性化的操作页面,流畅的步骤提示,支持 【知到智慧树】 【超星学习通】 【智慧职教(MOOC学院)】 【职教云】,等网课的学习,作业。具体的功能请查看脚本悬浮窗中的教程页面,官网 http://www.toptpv.com.cn/ 。

  1. // ==UserScript==
  2. // @name Apifox万能网课助手
  3. // @version 4.6.32
  4. // @description Apifox网课助手,专注于帮助大学生从网课中释放出来。让自己的时间把握在自己的手中,拥有人性化的操作页面,流畅的步骤提示,支持 【知到智慧树】 【超星学习通】 【智慧职教(MOOC学院)】 【职教云】,等网课的学习,作业。具体的功能请查看脚本悬浮窗中的教程页面,官网 http://www.toptpv.com.cn/ 。
  5. // @author 阿甘
  6. // @license MIT
  7. // @match *://*.zhihuishu.com/*
  8. // @match *://*.chaoxing.com/*
  9. // @match *://*.edu.cn/*
  10. // @match *://*.org.cn/*
  11. // @match *://*.xueyinonline.com/*
  12. // @match *://*.hnsyu.net/*
  13. // @match *://*.qutjxjy.cn/*
  14. // @match *://*.ynny.cn/*
  15. // @match *://*.icve.com.cn/*
  16. // @match *://*.course.icve.com.cn/*
  17. // @match *://*.courshare.cn/*
  18. // @match *://*.zjy2.icve.com.cn/*
  19. // @match *://*.zyk.icve.com.cn/*
  20. // @grant GM_info
  21. // @grant GM_getTab
  22. // @grant GM_saveTab
  23. // @grant GM_setValue
  24. // @grant GM_getValue
  25. // @grant unsafeWindow
  26. // @grant GM_listValues
  27. // @grant GM_deleteValue
  28. // @grant GM_notification
  29. // @grant GM_xmlhttpRequest
  30. // @grant GM_getResourceText
  31. // @grant GM_addValueChangeListener
  32. // @grant GM_removeValueChangeListener
  33. // @run-at document-start
  34. // @namespace https://enncy.cn
  35. // @homepage https://docs.ocsjs.com
  36. // @homepage http://www.toptpv.com.cn
  37. // @source https://github.com/ocsjs/ocsjs
  38. // @icon https://cdn.ocsjs.com/logo.png
  39. // @connect enncy.cn
  40. // @connect www.toptpv.com.cn
  41. // @connect icodef.com
  42. // @connect ocsjs.com
  43. // @connect localhost
  44. // @antifeature payment
  45. // ==/UserScript==
  46.  
  47. var __defProp = Object.defineProperty;
  48. var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  49. var __publicField = (obj, key, value) => {
  50. __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  51. return value;
  52. };
  53. (function(global2, factory) {
  54. 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 = {}));
  55. })(this, function(exports2) {
  56. "use strict";
  57. var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
  58. function isObject$2(value) {
  59. var type = typeof value;
  60. return value != null && (type == "object" || type == "function");
  61. }
  62. var isObject_1 = isObject$2;
  63. var freeGlobal$1 = typeof commonjsGlobal == "object" && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;
  64. var _freeGlobal = freeGlobal$1;
  65. var freeGlobal = _freeGlobal;
  66. var freeSelf = typeof self == "object" && self && self.Object === Object && self;
  67. var root$3 = freeGlobal || freeSelf || Function("return this")();
  68. var _root = root$3;
  69. var root$2 = _root;
  70. var now$1 = function() {
  71. return root$2.Date.now();
  72. };
  73. var now_1 = now$1;
  74. var reWhitespace = /\s/;
  75. function trimmedEndIndex$1(string) {
  76. var index = string.length;
  77. while (index-- && reWhitespace.test(string.charAt(index))) {
  78. }
  79. return index;
  80. }
  81. var _trimmedEndIndex = trimmedEndIndex$1;
  82. var trimmedEndIndex = _trimmedEndIndex;
  83. var reTrimStart = /^\s+/;
  84. function baseTrim$1(string) {
  85. return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, "") : string;
  86. }
  87. var _baseTrim = baseTrim$1;
  88. var root$1 = _root;
  89. var Symbol$3 = root$1.Symbol;
  90. var _Symbol = Symbol$3;
  91. var Symbol$2 = _Symbol;
  92. var objectProto$1 = Object.prototype;
  93. var hasOwnProperty = objectProto$1.hasOwnProperty;
  94. var nativeObjectToString$1 = objectProto$1.toString;
  95. var symToStringTag$1 = Symbol$2 ? Symbol$2.toStringTag : void 0;
  96. function getRawTag$1(value) {
  97. var isOwn = hasOwnProperty.call(value, symToStringTag$1), tag = value[symToStringTag$1];
  98. try {
  99. value[symToStringTag$1] = void 0;
  100. var unmasked = true;
  101. } catch (e) {
  102. }
  103. var result = nativeObjectToString$1.call(value);
  104. if (unmasked) {
  105. if (isOwn) {
  106. value[symToStringTag$1] = tag;
  107. } else {
  108. delete value[symToStringTag$1];
  109. }
  110. }
  111. return result;
  112. }
  113. var _getRawTag = getRawTag$1;
  114. var objectProto = Object.prototype;
  115. var nativeObjectToString = objectProto.toString;
  116. function objectToString$1(value) {
  117. return nativeObjectToString.call(value);
  118. }
  119. var _objectToString = objectToString$1;
  120. var Symbol$1 = _Symbol, getRawTag = _getRawTag, objectToString = _objectToString;
  121. var nullTag = "[object Null]", undefinedTag = "[object Undefined]";
  122. var symToStringTag = Symbol$1 ? Symbol$1.toStringTag : void 0;
  123. function baseGetTag$1(value) {
  124. if (value == null) {
  125. return value === void 0 ? undefinedTag : nullTag;
  126. }
  127. return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);
  128. }
  129. var _baseGetTag = baseGetTag$1;
  130. function isObjectLike$1(value) {
  131. return value != null && typeof value == "object";
  132. }
  133. var isObjectLike_1 = isObjectLike$1;
  134. var baseGetTag = _baseGetTag, isObjectLike = isObjectLike_1;
  135. var symbolTag = "[object Symbol]";
  136. function isSymbol$1(value) {
  137. return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag;
  138. }
  139. var isSymbol_1 = isSymbol$1;
  140. var baseTrim = _baseTrim, isObject$1 = isObject_1, isSymbol = isSymbol_1;
  141. var NAN = 0 / 0;
  142. var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
  143. var reIsBinary = /^0b[01]+$/i;
  144. var reIsOctal = /^0o[0-7]+$/i;
  145. var freeParseInt = parseInt;
  146. function toNumber$1(value) {
  147. if (typeof value == "number") {
  148. return value;
  149. }
  150. if (isSymbol(value)) {
  151. return NAN;
  152. }
  153. if (isObject$1(value)) {
  154. var other = typeof value.valueOf == "function" ? value.valueOf() : value;
  155. value = isObject$1(other) ? other + "" : other;
  156. }
  157. if (typeof value != "string") {
  158. return value === 0 ? value : +value;
  159. }
  160. value = baseTrim(value);
  161. var isBinary = reIsBinary.test(value);
  162. return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
  163. }
  164. var toNumber_1 = toNumber$1;
  165. var isObject = isObject_1, now = now_1, toNumber = toNumber_1;
  166. var FUNC_ERROR_TEXT = "Expected a function";
  167. var nativeMax = Math.max, nativeMin = Math.min;
  168. function debounce(func, wait, options) {
  169. var lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true;
  170. if (typeof func != "function") {
  171. throw new TypeError(FUNC_ERROR_TEXT);
  172. }
  173. wait = toNumber(wait) || 0;
  174. if (isObject(options)) {
  175. leading = !!options.leading;
  176. maxing = "maxWait" in options;
  177. maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
  178. trailing = "trailing" in options ? !!options.trailing : trailing;
  179. }
  180. function invokeFunc(time) {
  181. var args = lastArgs, thisArg = lastThis;
  182. lastArgs = lastThis = void 0;
  183. lastInvokeTime = time;
  184. result = func.apply(thisArg, args);
  185. return result;
  186. }
  187. function leadingEdge(time) {
  188. lastInvokeTime = time;
  189. timerId = setTimeout(timerExpired, wait);
  190. return leading ? invokeFunc(time) : result;
  191. }
  192. function remainingWait(time) {
  193. var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall;
  194. return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
  195. }
  196. function shouldInvoke(time) {
  197. var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime;
  198. return lastCallTime === void 0 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
  199. }
  200. function timerExpired() {
  201. var time = now();
  202. if (shouldInvoke(time)) {
  203. return trailingEdge(time);
  204. }
  205. timerId = setTimeout(timerExpired, remainingWait(time));
  206. }
  207. function trailingEdge(time) {
  208. timerId = void 0;
  209. if (trailing && lastArgs) {
  210. return invokeFunc(time);
  211. }
  212. lastArgs = lastThis = void 0;
  213. return result;
  214. }
  215. function cancel() {
  216. if (timerId !== void 0) {
  217. clearTimeout(timerId);
  218. }
  219. lastInvokeTime = 0;
  220. lastArgs = lastCallTime = lastThis = timerId = void 0;
  221. }
  222. function flush() {
  223. return timerId === void 0 ? result : trailingEdge(now());
  224. }
  225. function debounced() {
  226. var time = now(), isInvoking = shouldInvoke(time);
  227. lastArgs = arguments;
  228. lastThis = this;
  229. lastCallTime = time;
  230. if (isInvoking) {
  231. if (timerId === void 0) {
  232. return leadingEdge(lastCallTime);
  233. }
  234. if (maxing) {
  235. clearTimeout(timerId);
  236. timerId = setTimeout(timerExpired, wait);
  237. return invokeFunc(lastCallTime);
  238. }
  239. }
  240. if (timerId === void 0) {
  241. timerId = setTimeout(timerExpired, wait);
  242. }
  243. return result;
  244. }
  245. debounced.cancel = cancel;
  246. debounced.flush = flush;
  247. return debounced;
  248. }
  249. var debounce_1 = debounce;
  250. const $string = {
  251. humpToTarget(value, target) {
  252. return value.replace(/([A-Z])/g, target + "$1").toLowerCase().split(target).slice(1).join(target);
  253. }
  254. };
  255. class StringUtils {
  256. constructor(_text) {
  257. this._text = _text;
  258. }
  259. static nowrap(str) {
  260. return (str == null ? void 0 : str.replace(/\n/g, "")) || "";
  261. }
  262. nowrap() {
  263. this._text = StringUtils.nowrap(this._text);
  264. return this;
  265. }
  266. static nospace(str) {
  267. return (str == null ? void 0 : str.replace(/ +/g, " ")) || "";
  268. }
  269. nospace() {
  270. this._text = StringUtils.nospace(this._text);
  271. return this;
  272. }
  273. static noSpecialChar(str) {
  274. return (str == null ? void 0 : str.replace(/[^\w\s]/gi, "")) || "";
  275. }
  276. noSpecialChar() {
  277. this._text = StringUtils.noSpecialChar(this._text);
  278. return this;
  279. }
  280. static max(str, len) {
  281. return str.length > len ? str.substring(0, len) + "..." : str;
  282. }
  283. max(len) {
  284. this._text = StringUtils.max(this._text, len);
  285. return this;
  286. }
  287. static hide(str, start2, end, replacer = "*") {
  288. return str.substring(0, start2) + str.substring(start2, end).replace(/./g, replacer) + str.substring(end);
  289. }
  290. hide(start2, end, replacer = "*") {
  291. this._text = StringUtils.hide(this._text, start2, end, replacer);
  292. return this;
  293. }
  294. static of(text) {
  295. return new StringUtils(text);
  296. }
  297. toString() {
  298. return this._text;
  299. }
  300. }
  301. const $const = {
  302. TAB_UID: "_uid_",
  303. TAB_URLS: "_urls_",
  304. TAB_CURRENT_PANEL_NAME: "_current_panel_name_"
  305. };
  306. class LocalStoreChangeEvent extends Event {
  307. constructor() {
  308. super(...arguments);
  309. this.key = "";
  310. }
  311. }
  312. const _ObjectStoreProvider = class {
  313. get(key, defaultValue) {
  314. var _a;
  315. return (_a = Reflect.get(_ObjectStoreProvider._source.store, key)) != null ? _a : defaultValue;
  316. }
  317. set(key, value) {
  318. var _a;
  319. const pre = Reflect.get(_ObjectStoreProvider._source.store, key);
  320. Reflect.set(_ObjectStoreProvider._source.store, key, value);
  321. (_a = _ObjectStoreProvider.storeListeners.get(key)) == null ? void 0 : _a.forEach((lis) => lis(value, pre));
  322. }
  323. delete(key) {
  324. Reflect.deleteProperty(_ObjectStoreProvider._source.store, key);
  325. }
  326. list() {
  327. return Object.keys(_ObjectStoreProvider._source.store);
  328. }
  329. async getTab(key) {
  330. return Reflect.get(_ObjectStoreProvider._source.tab, key);
  331. }
  332. async setTab(key, value) {
  333. var _a;
  334. Reflect.set(_ObjectStoreProvider._source.tab, key, value);
  335. (_a = _ObjectStoreProvider.tabListeners.get(key)) == null ? void 0 : _a.forEach((lis) => lis(value, this.getTab(key)));
  336. }
  337. addChangeListener(key, listener) {
  338. const listeners = _ObjectStoreProvider.storeListeners.get(key) || [];
  339. listeners.push(listener);
  340. _ObjectStoreProvider.storeListeners.set(key, listeners);
  341. }
  342. removeChangeListener(listener) {
  343. _ObjectStoreProvider.tabListeners.forEach((lis, key) => {
  344. const index = lis.findIndex((l) => l === listener);
  345. if (index !== -1) {
  346. lis.splice(index, 1);
  347. _ObjectStoreProvider.tabListeners.set(key, lis);
  348. }
  349. });
  350. }
  351. addTabChangeListener(key, listener) {
  352. const listeners = _ObjectStoreProvider.tabListeners.get(key) || [];
  353. listeners.push(listener);
  354. _ObjectStoreProvider.tabListeners.set(key, listeners);
  355. }
  356. removeTabChangeListener(key, listener) {
  357. const listeners = _ObjectStoreProvider.tabListeners.get(key) || [];
  358. const index = listeners.findIndex((l) => l === listener);
  359. if (index !== -1) {
  360. listeners.splice(index, 1);
  361. _ObjectStoreProvider.tabListeners.set(key, listeners);
  362. }
  363. }
  364. };
  365. let ObjectStoreProvider = _ObjectStoreProvider;
  366. ObjectStoreProvider._source = { store: {}, tab: {} };
  367. ObjectStoreProvider.storeListeners = /* @__PURE__ */ new Map();
  368. ObjectStoreProvider.tabListeners = /* @__PURE__ */ new Map();
  369. class GMStoreProvider {
  370. constructor() {
  371. if (self === top && typeof globalThis.GM_listValues !== "undefined") {
  372. for (const val of GM_listValues()) {
  373. if (val.startsWith("_tab_change_")) {
  374. GM_deleteValue(val);
  375. }
  376. }
  377. }
  378. }
  379. getTabChangeHandleKey(tabUid, key) {
  380. return `_tab_change_${tabUid}_${key}`;
  381. }
  382. get(key, defaultValue) {
  383. return GM_getValue(key, defaultValue);
  384. }
  385. set(key, value) {
  386. GM_setValue(key, value);
  387. }
  388. delete(key) {
  389. GM_deleteValue(key);
  390. }
  391. list() {
  392. return GM_listValues();
  393. }
  394. getTab(key) {
  395. return new Promise((resolve, reject) => {
  396. GM_getTab((tab = {}) => resolve(Reflect.get(tab, key)));
  397. });
  398. }
  399. setTab(key, value) {
  400. return new Promise((resolve, reject) => {
  401. GM_getTab((tab = {}) => {
  402. Reflect.set(tab, key, value);
  403. GM_saveTab(tab);
  404. this.set(this.getTabChangeHandleKey(Reflect.get(tab, $const.TAB_UID), key), value);
  405. resolve();
  406. });
  407. });
  408. }
  409. addChangeListener(key, listener) {
  410. return GM_addValueChangeListener(key, (_, pre, curr, remote) => {
  411. listener(pre, curr, remote);
  412. });
  413. }
  414. removeChangeListener(listenerId) {
  415. if (typeof listenerId === "number") {
  416. GM_removeValueChangeListener(listenerId);
  417. }
  418. }
  419. async addTabChangeListener(key, listener) {
  420. const uid = await this.getTab($const.TAB_UID);
  421. return GM_addValueChangeListener(this.getTabChangeHandleKey(uid, key), (_, pre, curr) => {
  422. listener(curr, pre);
  423. });
  424. }
  425. removeTabChangeListener(key, listener) {
  426. return this.removeChangeListener(listener);
  427. }
  428. }
  429. const $store = typeof globalThis.unsafeWindow === "undefined" ? new ObjectStoreProvider() : new GMStoreProvider();
  430. const $ = {
  431. createConfigProxy(script) {
  432. var _a, _b;
  433. const proxy = new Proxy(script.cfg, {
  434. set(target, propertyKey, value) {
  435. const key = $.namespaceKey(script.namespace, propertyKey);
  436. $store.set(key, value);
  437. return Reflect.set(target, propertyKey, value);
  438. },
  439. get(target, propertyKey) {
  440. const value = $store.get($.namespaceKey(script.namespace, propertyKey));
  441. Reflect.set(target, propertyKey, value);
  442. return value;
  443. }
  444. });
  445. for (const key in script.configs) {
  446. if (Object.prototype.hasOwnProperty.call(script.configs, key)) {
  447. const element = Reflect.get(script.configs, key);
  448. Reflect.set(proxy, key, $store.get($.namespaceKey(script.namespace, key), element.defaultValue));
  449. }
  450. }
  451. if (script.namespace) {
  452. proxy.notes = (_b = (_a = script.configs) == null ? void 0 : _a.notes) == null ? void 0 : _b.defaultValue;
  453. }
  454. return proxy;
  455. },
  456. getAllRawConfigs(scripts) {
  457. const object = {};
  458. for (const script of scripts) {
  459. for (const key in script.configs) {
  460. if (Object.prototype.hasOwnProperty.call(script.configs, key)) {
  461. const { label, ...element } = script.configs[key];
  462. Reflect.set(object, $.namespaceKey(script.namespace, key), {
  463. label: $.namespaceKey(script.namespace, key),
  464. ...element
  465. });
  466. }
  467. }
  468. }
  469. return object;
  470. },
  471. getMatchedScripts(projects, urls) {
  472. var _a;
  473. const scripts = [];
  474. for (const project of projects) {
  475. for (const key in project.scripts) {
  476. if (Object.prototype.hasOwnProperty.call(project.scripts, key)) {
  477. const script = project.scripts[key];
  478. if (project.domains.length === 0 || project.domains.some((d) => urls.some((url) => new URL(url).origin.includes(d)))) {
  479. if ((_a = script.excludes) == null ? void 0 : _a.some((u) => urls.some((url) => RegExp(u[1]).test(url)))) {
  480. continue;
  481. }
  482. if (script.url.some((u) => urls.some((url) => RegExp(u[1]).test(url)))) {
  483. scripts.push(script);
  484. }
  485. }
  486. }
  487. }
  488. }
  489. return scripts;
  490. },
  491. namespaceKey(namespace, key) {
  492. return namespace ? namespace + "." + key.toString() : key.toString();
  493. },
  494. uuid() {
  495. return "xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g, function(c) {
  496. const r = Math.random() * 16 | 0;
  497. const v = c === "x" ? r : r & 3 | 8;
  498. return v.toString(16);
  499. });
  500. },
  501. random(min, max) {
  502. return Math.round(Math.random() * (max - min)) + min;
  503. },
  504. async sleep(period) {
  505. return new Promise((resolve) => {
  506. setTimeout(resolve, period);
  507. });
  508. },
  509. isInBrowser() {
  510. return typeof window !== "undefined" && typeof window.document !== "undefined";
  511. },
  512. elementToRawObject(el2) {
  513. return {
  514. innerText: el2 == null ? void 0 : el2.innerText,
  515. innerHTML: el2 == null ? void 0 : el2.innerHTML,
  516. textContent: el2 == null ? void 0 : el2.textContent
  517. };
  518. },
  519. onresize(el2, handler) {
  520. const resize = debounce_1(() => {
  521. if (el2.parentNode === null) {
  522. window.removeEventListener("resize", resize);
  523. } else {
  524. handler(el2);
  525. }
  526. }, 200);
  527. resize();
  528. window.addEventListener("resize", resize);
  529. },
  530. loadCustomElements(elements) {
  531. for (const element of elements) {
  532. const name = $string.humpToTarget(element.name, "-");
  533. if (customElements.get(name) === void 0) {
  534. customElements.define(name, element);
  535. }
  536. }
  537. },
  538. isInTopWindow() {
  539. return self === top;
  540. },
  541. createCenteredPopupWindow(url, winName, opts) {
  542. const { width, height, scrollbars, resizable } = opts;
  543. const LeftPosition = screen.width ? (screen.width - width) / 2 : 0;
  544. const TopPosition = screen.height ? (screen.height - height) / 2 : 0;
  545. const settings = "height=" + height + ",width=" + width + ",top=" + TopPosition + ",left=" + LeftPosition + ",scrollbars=" + (scrollbars ? "yes" : "no") + ",resizable=" + (resizable ? "yes" : "no");
  546. return window.open(url, winName, settings);
  547. }
  548. };
  549. async function start$1(startConfig) {
  550. if ([
  551. "GM_getTab",
  552. "GM_saveTab",
  553. "GM_setValue",
  554. "GM_getValue",
  555. "unsafeWindow",
  556. "GM_listValues",
  557. "GM_deleteValue",
  558. "GM_notification",
  559. "GM_xmlhttpRequest",
  560. "GM_getResourceText",
  561. "GM_addValueChangeListener",
  562. "GM_removeValueChangeListener"
  563. ].some((api) => typeof Reflect.get(globalThis, api) === "undefined")) {
  564. const open = confirm(
  565. `OCS\u7F51\u8BFE\u811A\u672C\u4E0D\u652F\u6301\u5F53\u524D\u7684\u811A\u672C\u7BA1\u7406\u5668\uFF08${GM_info.scriptHandler}\uFF09\u3002\u8BF7\u524D\u5F80 https://docs.ocsjs.com/docs/script \u4E0B\u8F7D\u6307\u5B9A\u7684\u811A\u672C\u7BA1\u7406\u5668\uFF0C\u4F8B\u5982 \u201CScriptcat \u811A\u672C\u732B\u201D \u6216\u8005 \u201CTampermonkey \u6CB9\u7334\u201D`
  566. );
  567. if (open) {
  568. window.location.href = "https://docs.ocsjs.com/docs/script";
  569. }
  570. return;
  571. }
  572. const uid = await $store.getTab($const.TAB_UID);
  573. if (uid === void 0) {
  574. await $store.setTab($const.TAB_UID, $.uuid());
  575. }
  576. startConfig.projects = startConfig.projects.map((p) => {
  577. for (const key in p.scripts) {
  578. if (Object.prototype.hasOwnProperty.call(p.scripts, key)) {
  579. p.scripts[key].cfg = $.createConfigProxy(p.scripts[key]);
  580. }
  581. }
  582. return p;
  583. });
  584. const scripts = $.getMatchedScripts(startConfig.projects, [location.href]).sort((a, b) => b.priority - a.priority);
  585. scripts.forEach((script) => {
  586. var _a;
  587. script.emit("start", startConfig);
  588. (_a = script.onstart) == null ? void 0 : _a.call(script, startConfig);
  589. });
  590. let active = false;
  591. if (document.readyState === "interactive") {
  592. active = true;
  593. scripts.forEach((script) => {
  594. var _a;
  595. return (_a = script.onactive) == null ? void 0 : _a.call(script, startConfig);
  596. });
  597. } else if (document.readyState === "complete") {
  598. scripts.forEach((script) => {
  599. var _a;
  600. return (_a = script.onactive) == null ? void 0 : _a.call(script, startConfig);
  601. });
  602. scripts.forEach((script) => {
  603. var _a;
  604. return (_a = script.oncomplete) == null ? void 0 : _a.call(script, startConfig);
  605. });
  606. }
  607. document.addEventListener("readystatechange", () => {
  608. if (document.readyState === "interactive" && active === false) {
  609. scripts.forEach((script) => {
  610. var _a;
  611. script.emit("active", startConfig);
  612. (_a = script.onactive) == null ? void 0 : _a.call(script, startConfig);
  613. });
  614. }
  615. if (document.readyState === "complete") {
  616. scripts.forEach((script) => {
  617. var _a;
  618. script.emit("complete");
  619. (_a = script.oncomplete) == null ? void 0 : _a.call(script, startConfig);
  620. });
  621. $store.getTab($const.TAB_URLS).then((urls) => {
  622. $store.setTab($const.TAB_URLS, Array.from(new Set(urls || [])).concat(location.href));
  623. });
  624. }
  625. });
  626. history.pushState = addFunctionEventListener(history, "pushState");
  627. history.replaceState = addFunctionEventListener(history, "replaceState");
  628. window.addEventListener("pushState", () => {
  629. scripts.forEach((script) => {
  630. var _a;
  631. script.emit("historychange", "push", startConfig);
  632. (_a = script.onhistorychange) == null ? void 0 : _a.call(script, "push", startConfig);
  633. });
  634. });
  635. window.addEventListener("replaceState", () => {
  636. scripts.forEach((script) => {
  637. var _a;
  638. script.emit("historychange", "replace", startConfig);
  639. (_a = script.onhistorychange) == null ? void 0 : _a.call(script, "replace", startConfig);
  640. });
  641. });
  642. window.onbeforeunload = (e) => {
  643. var _a;
  644. let prevent;
  645. for (const script of scripts) {
  646. script.emit("beforeunload");
  647. if ((_a = script.onbeforeunload) == null ? void 0 : _a.call(script, startConfig)) {
  648. prevent = true;
  649. }
  650. }
  651. if (prevent) {
  652. e.preventDefault();
  653. e.returnValue = true;
  654. return true;
  655. }
  656. };
  657. }
  658. function addFunctionEventListener(obj, type) {
  659. const origin = obj[type];
  660. return function(...args) {
  661. const res = origin.apply(this, args);
  662. const e = new Event(type.toString());
  663. e.arguments = args;
  664. window.dispatchEvent(e);
  665. return res;
  666. };
  667. }
  668. function el(tagName, attrsOrChildren, childrenOrHandler) {
  669. const element = document.createElement(tagName);
  670. if (attrsOrChildren) {
  671. if (Array.isArray(attrsOrChildren)) {
  672. element.append(...attrsOrChildren);
  673. } else if (typeof attrsOrChildren === "string") {
  674. element.append(attrsOrChildren);
  675. } else {
  676. const attrs = attrsOrChildren;
  677. for (const key in attrs) {
  678. if (Object.prototype.hasOwnProperty.call(attrs, key)) {
  679. if (key === "style") {
  680. Object.assign(element.style, attrs[key]);
  681. } else {
  682. const value = attrs[key];
  683. Reflect.set(element, key, value);
  684. }
  685. }
  686. }
  687. }
  688. }
  689. if (childrenOrHandler) {
  690. if (typeof childrenOrHandler === "function") {
  691. childrenOrHandler.call(element, element);
  692. } else if (Array.isArray(childrenOrHandler)) {
  693. element.append(...childrenOrHandler);
  694. } else if (typeof childrenOrHandler === "string") {
  695. element.append(childrenOrHandler);
  696. }
  697. }
  698. return element;
  699. }
  700. function $el(selector, root2 = window.document) {
  701. const el2 = root2.querySelector(selector);
  702. return el2 === null ? void 0 : el2;
  703. }
  704. function $$el(selector, root2 = window.document) {
  705. return Array.from(root2.querySelectorAll(selector));
  706. }
  707. function enableElementDraggable(header, target, ondrag) {
  708. let pos1 = 0;
  709. let pos2 = 0;
  710. let pos3 = 0;
  711. let pos4 = 0;
  712. header.onmousedown = dragMouseDown;
  713. function dragMouseDown(e) {
  714. e = e || window.event;
  715. pos3 = e.clientX;
  716. pos4 = e.clientY;
  717. document.onmouseup = closeDragElement;
  718. document.onmousemove = elementDrag;
  719. }
  720. function elementDrag(e) {
  721. e = e || window.event;
  722. pos1 = pos3 - e.clientX;
  723. pos2 = pos4 - e.clientY;
  724. pos3 = e.clientX;
  725. pos4 = e.clientY;
  726. target.style.top = Math.max(target.offsetTop - pos2, 10) + "px";
  727. target.style.left = target.offsetLeft - pos1 + "px";
  728. }
  729. function closeDragElement() {
  730. ondrag == null ? void 0 : ondrag();
  731. document.onmouseup = null;
  732. document.onmousemove = null;
  733. }
  734. }
  735. const panel = el("div");
  736. const root = panel.attachShadow({ mode: "closed" });
  737. const $elements = {
  738. panel,
  739. root,
  740. messageContainer: el("div", { className: "message-container" }),
  741. tooltip: el("div", { className: "tooltip" })
  742. };
  743. root.append($elements.messageContainer, $elements.tooltip);
  744. const $gm = {
  745. unsafeWindow: typeof globalThis.unsafeWindow === "undefined" ? globalThis.window : globalThis.unsafeWindow,
  746. getInfos() {
  747. return typeof GM_info === "undefined" ? void 0 : GM_info;
  748. },
  749. getTab(callback) {
  750. return typeof GM_getTab === "undefined" ? void 0 : GM_getTab(callback);
  751. },
  752. notification(content, options) {
  753. var _a;
  754. const { onclick, ondone, important, duration = 0 } = options || {};
  755. const { icon, name } = ((_a = $gm.getInfos()) == null ? void 0 : _a.script) || {};
  756. GM_notification({
  757. title: name,
  758. text: content,
  759. image: icon || "",
  760. highlight: important,
  761. onclick,
  762. ondone,
  763. silent: true,
  764. timeout: duration * 1e3
  765. });
  766. }
  767. };
  768. let popupWin;
  769. window.addEventListener("beforeunload", () => {
  770. popupWin == null ? void 0 : popupWin.close();
  771. });
  772. const $creator = {
  773. notes(lines, tag = "ul") {
  774. return el(
  775. tag,
  776. lines.map(
  777. (line) => el(
  778. "li",
  779. Array.isArray(line) ? line.map((node) => typeof node === "string" ? el("div", { innerHTML: node }) : node) : [typeof line === "string" ? el("div", { innerHTML: line }) : line]
  780. )
  781. )
  782. );
  783. },
  784. tooltip(target) {
  785. target.setAttribute("data-title", target.title);
  786. if (typeof $gm.getInfos() !== "undefined") {
  787. target.removeAttribute("title");
  788. }
  789. const onMouseMove = (e) => {
  790. $elements.tooltip.style.top = e.y + "px";
  791. $elements.tooltip.style.left = e.x + "px";
  792. };
  793. const showTitle = (e) => {
  794. const dataTitle = target.getAttribute("data-title");
  795. if (dataTitle) {
  796. $elements.tooltip.innerHTML = dataTitle.split("\n").join("<br>") || "";
  797. $elements.tooltip.style.top = e.y + "px";
  798. $elements.tooltip.style.left = e.x + "px";
  799. $elements.tooltip.style.display = "block";
  800. } else {
  801. $elements.tooltip.style.display = "none";
  802. }
  803. window.addEventListener("mousemove", onMouseMove);
  804. };
  805. const hideTitle = () => {
  806. $elements.tooltip.style.display = "none";
  807. window.removeEventListener("mousemove", onMouseMove);
  808. };
  809. hideTitle();
  810. target.addEventListener("mouseenter", showTitle);
  811. target.addEventListener("click", showTitle);
  812. target.addEventListener("mouseout", hideTitle);
  813. target.addEventListener("blur", hideTitle);
  814. return target;
  815. },
  816. selectOptions(selectedValue = "", options) {
  817. return options.map(
  818. (opt) => el("option", { value: String(opt[0]), innerText: opt[1], title: opt[2] }, (opt2) => {
  819. if (opt2.value === selectedValue) {
  820. opt2.toggleAttribute("selected");
  821. }
  822. })
  823. );
  824. },
  825. input(attrs, children, handler) {
  826. return el("input", attrs, function(input) {
  827. input.append(...children || []);
  828. input.classList.add("base-style-input");
  829. handler == null ? void 0 : handler.apply(this, [input]);
  830. });
  831. },
  832. button(text, attrs, handler) {
  833. return el("input", { type: "button", ...attrs }, function(btn) {
  834. btn.value = text || "";
  835. btn.classList.add("base-style-button");
  836. handler == null ? void 0 : handler.apply(this, [btn]);
  837. });
  838. },
  839. scriptPanel(script, opts) {
  840. var _a, _b;
  841. const scriptPanel = el("script-panel-element", { name: script.name });
  842. script.onConfigChange("notes", (pre, curr) => {
  843. scriptPanel.notesContainer.innerHTML = script.cfg.notes || "";
  844. });
  845. script.panel = scriptPanel;
  846. scriptPanel.notesContainer.innerHTML = ((_b = (_a = script.configs) == null ? void 0 : _a.notes) == null ? void 0 : _b.defaultValue) || "";
  847. let configs = /* @__PURE__ */ Object.create({});
  848. const elList = [];
  849. for (const key in script.configs) {
  850. if (Object.prototype.hasOwnProperty.call(script.configs, key)) {
  851. const cfg = script.configs[key];
  852. if (cfg.separator) {
  853. elList.push($creator.configsArea($creator.configs(script.namespace, configs || {}, opts.onload)));
  854. elList.push(el("div", { className: "separator", style: { margin: "0px 8px" } }, cfg.separator));
  855. configs = /* @__PURE__ */ Object.create({});
  856. }
  857. configs[key] = cfg;
  858. }
  859. }
  860. if (Object.keys(configs).length > 0) {
  861. elList.push($creator.configsArea($creator.configs(script.namespace, configs || {}, opts.onload)));
  862. }
  863. scriptPanel.configsContainer.replaceChildren(...elList);
  864. return scriptPanel;
  865. },
  866. configsArea(configElements) {
  867. const configsContainer = el("div", { className: "configs card" });
  868. const configsBody = el("div", { className: "configs-body" });
  869. configsBody.append(...Object.entries(configElements).map(([key, el2]) => el2));
  870. configsContainer.append(configsBody);
  871. return configsContainer;
  872. },
  873. configs(namespace, configs, onload) {
  874. const elements = /* @__PURE__ */ Object.create({});
  875. for (const key in configs) {
  876. if (Object.prototype.hasOwnProperty.call(configs, key)) {
  877. const config = configs[key];
  878. if (config.label !== void 0) {
  879. const element = el("config-element", {
  880. key: $.namespaceKey(namespace, key),
  881. tag: config.tag,
  882. sync: config.sync,
  883. attrs: config.attrs,
  884. _onload: config.onload,
  885. defaultValue: config.defaultValue
  886. });
  887. onload == null ? void 0 : onload(element);
  888. element.label.textContent = config.label;
  889. elements[key] = element;
  890. }
  891. }
  892. }
  893. return elements;
  894. },
  895. copy(name, value) {
  896. return el("span", "\u{1F4C4}" + name, (btn) => {
  897. btn.className = "copy";
  898. btn.addEventListener("click", () => {
  899. btn.innerText = "\u5DF2\u590D\u5236\u221A";
  900. navigator.clipboard.writeText(value);
  901. setTimeout(() => {
  902. btn.innerText = "\u{1F4C4}" + name;
  903. }, 500);
  904. });
  905. });
  906. },
  907. preventText(opts) {
  908. const { name, delay = 3, autoRemove = true, ondefault, onprevent } = opts;
  909. const span = el("span", name);
  910. span.style.textDecoration = "underline";
  911. span.style.cursor = "pointer";
  912. span.onclick = () => {
  913. clearTimeout(id);
  914. if (autoRemove) {
  915. span.remove();
  916. }
  917. onprevent == null ? void 0 : onprevent(span);
  918. };
  919. const id = setTimeout(() => {
  920. if (autoRemove) {
  921. span.remove();
  922. }
  923. ondefault(span);
  924. }, delay * 1e3);
  925. return span;
  926. },
  927. createQuestionTitleExtra(question) {
  928. const space = $creator.space(
  929. [
  930. $creator.copy("\u590D\u5236", question),
  931. el("span", { className: "question-title-extra-btn", innerText: "\u{1F30F}\u767E\u5EA6\u4E00\u4E0B" }, (btn) => {
  932. btn.onclick = () => {
  933. popupWin == null ? void 0 : popupWin.close();
  934. popupWin = $.createCenteredPopupWindow(`https://www.baidu.com/s?wd=${question}`, "\u767E\u5EA6\u641C\u7D22", {
  935. width: 1e3,
  936. height: 800,
  937. resizable: true,
  938. scrollbars: true
  939. });
  940. };
  941. })
  942. ],
  943. { x: 4 }
  944. );
  945. space.style.marginTop = "6px";
  946. space.style.textAlign = "right";
  947. return el("div", { style: { textAlign: "right" } }, [space]);
  948. },
  949. space(children, options) {
  950. return el("div", { className: "space" }, (div) => {
  951. var _a, _b, _c;
  952. for (let index = 0; index < children.length; index++) {
  953. const child = el("span", { className: "space-item" }, [children[index]]);
  954. child.style.display = "inline-block";
  955. const x = (_a = options == null ? void 0 : options.x) != null ? _a : 12;
  956. const y = (_b = options == null ? void 0 : options.y) != null ? _b : 0;
  957. if (index > 0) {
  958. child.style.marginLeft = x / 2 + "px";
  959. child.style.marginRight = x / 2 + "px";
  960. child.style.marginTop = y / 2 + "px";
  961. child.style.marginBottom = y / 2 + "px";
  962. } else {
  963. child.style.marginRight = x / 2 + "px";
  964. child.style.marginBottom = y / 2 + "px";
  965. }
  966. div.append(child);
  967. if (index !== children.length - 1) {
  968. div.append(el("span", [(_c = options == null ? void 0 : options.separator) != null ? _c : " "]));
  969. }
  970. }
  971. });
  972. }
  973. };
  974. function domSearch(wrapper, root2 = window.document) {
  975. const obj = /* @__PURE__ */ Object.create({});
  976. Reflect.ownKeys(wrapper).forEach((key) => {
  977. const item = wrapper[key.toString()];
  978. Reflect.set(
  979. obj,
  980. key,
  981. typeof item === "string" ? root2.querySelector(item) : typeof item === "function" ? item(root2) : item.map((fun) => fun(root2))
  982. );
  983. });
  984. return obj;
  985. }
  986. function domSearchAll(wrapper, root2 = window.document) {
  987. const obj = /* @__PURE__ */ Object.create({});
  988. Reflect.ownKeys(wrapper).forEach((key) => {
  989. const item = wrapper[key.toString()];
  990. Reflect.set(
  991. obj,
  992. key,
  993. typeof item === "string" ? Array.from(root2.querySelectorAll(item)) : typeof item === "function" ? item(root2) : item.map((fun) => fun(root2))
  994. );
  995. });
  996. return obj;
  997. }
  998. var src = {
  999. compareTwoStrings,
  1000. findBestMatch
  1001. };
  1002. function compareTwoStrings(first, second) {
  1003. first = first.replace(/\s+/g, "");
  1004. second = second.replace(/\s+/g, "");
  1005. if (first === second)
  1006. return 1;
  1007. if (first.length < 2 || second.length < 2)
  1008. return 0;
  1009. let firstBigrams = /* @__PURE__ */ new Map();
  1010. for (let i = 0; i < first.length - 1; i++) {
  1011. const bigram = first.substring(i, i + 2);
  1012. const count = firstBigrams.has(bigram) ? firstBigrams.get(bigram) + 1 : 1;
  1013. firstBigrams.set(bigram, count);
  1014. }
  1015. let intersectionSize = 0;
  1016. for (let i = 0; i < second.length - 1; i++) {
  1017. const bigram = second.substring(i, i + 2);
  1018. const count = firstBigrams.has(bigram) ? firstBigrams.get(bigram) : 0;
  1019. if (count > 0) {
  1020. firstBigrams.set(bigram, count - 1);
  1021. intersectionSize++;
  1022. }
  1023. }
  1024. return 2 * intersectionSize / (first.length + second.length - 2);
  1025. }
  1026. function findBestMatch(mainString, targetStrings) {
  1027. if (!areArgsValid(mainString, targetStrings))
  1028. throw new Error("Bad arguments: First argument should be a string, second should be an array of strings");
  1029. const ratings = [];
  1030. let bestMatchIndex = 0;
  1031. for (let i = 0; i < targetStrings.length; i++) {
  1032. const currentTargetString = targetStrings[i];
  1033. const currentRating = compareTwoStrings(mainString, currentTargetString);
  1034. ratings.push({ target: currentTargetString, rating: currentRating });
  1035. if (currentRating > ratings[bestMatchIndex].rating) {
  1036. bestMatchIndex = i;
  1037. }
  1038. }
  1039. const bestMatch = ratings[bestMatchIndex];
  1040. return { ratings, bestMatch, bestMatchIndex };
  1041. }
  1042. function areArgsValid(mainString, targetStrings) {
  1043. if (typeof mainString !== "string")
  1044. return false;
  1045. if (!Array.isArray(targetStrings))
  1046. return false;
  1047. if (!targetStrings.length)
  1048. return false;
  1049. if (targetStrings.find(function(s) {
  1050. return typeof s !== "string";
  1051. }))
  1052. return false;
  1053. return true;
  1054. }
  1055. function clearString(str, ...exclude) {
  1056. return str.trim().toLocaleLowerCase().replace(RegExp(`[^\\u4e00-\\u9fa5A-Za-z0-9${exclude.join("")}]*`, "g"), "");
  1057. }
  1058. function answerSimilar(answers, options) {
  1059. const _answers = answers.map(removeRedundant);
  1060. const _options = options.map(removeRedundant);
  1061. const similar = _answers.length !== 0 ? _options.map((option) => {
  1062. if (option.trim() === "") {
  1063. return { rating: 0, target: "" };
  1064. }
  1065. return src.findBestMatch(option, _answers).bestMatch;
  1066. }) : _options.map(() => ({ rating: 0, target: "" }));
  1067. return similar;
  1068. }
  1069. function removeRedundant(str) {
  1070. return (str == null ? void 0 : str.trim().replace(/[A-Z]{1}[^A-Za-z0-9\u4e00-\u9fa5]+([A-Za-z0-9\u4e00-\u9fa5]+)/, "$1")) || "";
  1071. }
  1072. function request(url, opts) {
  1073. return new Promise((resolve, reject) => {
  1074. try {
  1075. const { responseType = "json", method = "get", type = "fetch", data = {}, headers = {} } = opts || {};
  1076. const env = $.isInBrowser() ? "browser" : "node";
  1077. if (type === "GM_xmlhttpRequest" && env === "browser") {
  1078. if (typeof GM_xmlhttpRequest !== "undefined") {
  1079. GM_xmlhttpRequest({
  1080. url,
  1081. method: method.toUpperCase(),
  1082. data: Object.keys(data).length ? new URLSearchParams(data).toString() : void 0,
  1083. headers: Object.keys(headers).length ? headers : void 0,
  1084. responseType: responseType === "json" ? "json" : void 0,
  1085. onload: (response) => {
  1086. if (response.status === 200) {
  1087. if (responseType === "json") {
  1088. try {
  1089. resolve(JSON.parse(response.responseText));
  1090. } catch (error) {
  1091. reject(error);
  1092. }
  1093. } else {
  1094. resolve(response.responseText || "");
  1095. }
  1096. } else {
  1097. reject(response.responseText);
  1098. }
  1099. },
  1100. onerror: (err) => {
  1101. console.error("GM_xmlhttpRequest error", err);
  1102. reject(err);
  1103. }
  1104. });
  1105. } else {
  1106. reject(new Error("GM_xmlhttpRequest is not defined"));
  1107. }
  1108. } else {
  1109. const fet = env === "node" ? require("node-fetch").default : fetch;
  1110. fet(url, { body: method === "post" ? JSON.stringify(data) : void 0, method, headers }).then((response) => {
  1111. if (responseType === "json") {
  1112. response.json().then(resolve).catch(reject);
  1113. } else {
  1114. response.text().then(resolve).catch(reject);
  1115. }
  1116. }).catch((error) => {
  1117. reject(new Error(error));
  1118. });
  1119. }
  1120. } catch (error) {
  1121. reject(error);
  1122. }
  1123. });
  1124. }
  1125. class IElement extends HTMLElement {
  1126. }
  1127. class ConfigElement extends IElement {
  1128. constructor() {
  1129. super(...arguments);
  1130. this.label = el("label");
  1131. this.wrapper = el("div", { className: "config-wrapper" });
  1132. this.key = "";
  1133. }
  1134. get value() {
  1135. return $store.get(this.key);
  1136. }
  1137. connectedCallback() {
  1138. var _a;
  1139. const createInput = () => {
  1140. this.provider = el("input");
  1141. if (["checkbox", "radio"].some((t2) => {
  1142. var _a2;
  1143. return t2 === ((_a2 = this.attrs) == null ? void 0 : _a2.type);
  1144. })) {
  1145. this.provider.checked = $store.get(this.key, this.defaultValue);
  1146. const provider = this.provider;
  1147. provider.onchange = () => {
  1148. $store.set(this.key, provider.checked);
  1149. };
  1150. } else {
  1151. this.provider.value = $store.get(this.key, this.defaultValue);
  1152. this.provider.setAttribute("value", this.provider.value);
  1153. this.provider.onchange = () => {
  1154. const { min, max, type } = this.attrs || {};
  1155. if (type === "number") {
  1156. const val = parseFloat(this.provider.value);
  1157. const _min = min ? parseFloat(min) : void 0;
  1158. const _max = max ? parseFloat(max) : void 0;
  1159. if (_min && val < _min) {
  1160. this.provider.value = _min.toString();
  1161. } else if (_max && val > _max) {
  1162. this.provider.value = _max.toString();
  1163. } else {
  1164. $store.set(this.key, val);
  1165. }
  1166. } else {
  1167. $store.set(this.key, this.provider.value);
  1168. }
  1169. };
  1170. }
  1171. };
  1172. switch (this.tag) {
  1173. case "input": {
  1174. createInput();
  1175. break;
  1176. }
  1177. case "select": {
  1178. this.provider = el("select");
  1179. this.provider.setAttribute("value", $store.get(this.key, this.defaultValue));
  1180. this.provider.onchange = () => {
  1181. $store.set(this.key, this.provider.value);
  1182. };
  1183. break;
  1184. }
  1185. case "textarea": {
  1186. this.provider = el("textarea");
  1187. this.provider.value = $store.get(this.key, this.defaultValue);
  1188. this.provider.onchange = () => {
  1189. $store.set(this.key, this.provider.value);
  1190. };
  1191. break;
  1192. }
  1193. default: {
  1194. createInput();
  1195. break;
  1196. }
  1197. }
  1198. this.wrapper.replaceChildren(this.provider);
  1199. this.append(this.label, this.wrapper);
  1200. for (const key in this.attrs) {
  1201. if (Object.prototype.hasOwnProperty.call(this.attrs, key)) {
  1202. Reflect.set(this.provider, key, Reflect.get(this.attrs, key));
  1203. }
  1204. }
  1205. if (this.sync) {
  1206. $store.addChangeListener(this.key, (pre, curr, remote) => {
  1207. this.provider.value = curr;
  1208. });
  1209. }
  1210. $creator.tooltip(this.provider);
  1211. (_a = this._onload) == null ? void 0 : _a.call(this.provider, this);
  1212. }
  1213. }
  1214. class ContainerElement extends IElement {
  1215. constructor() {
  1216. super(...arguments);
  1217. this.header = $creator.tooltip(el("header-element", { className: "header", title: "\u83DC\u5355\u680F-\u53EF\u62D6\u52A8\u533A\u57DF" }));
  1218. this.body = el("div", { className: "body", clientHeight: window.innerHeight / 2 });
  1219. this.footer = el("div", { className: "footer" });
  1220. }
  1221. connectedCallback() {
  1222. this.append(this.header, this.body, this.footer);
  1223. $.onresize(this, (cont) => {
  1224. cont.body.style.maxHeight = window.innerHeight - this.header.clientHeight - 100 + "px";
  1225. cont.body.style.maxWidth = window.innerWidth - 50 + "px";
  1226. });
  1227. }
  1228. }
  1229. class DropdownElement extends IElement {
  1230. constructor() {
  1231. super(...arguments);
  1232. this.triggerElement = el("button");
  1233. this.content = el("div", { className: "dropdown-content" });
  1234. this.trigger = "hover";
  1235. }
  1236. connectedCallback() {
  1237. this.append(this.triggerElement, this.content);
  1238. this.classList.add("dropdown");
  1239. if (this.trigger === "click") {
  1240. this.triggerElement.onclick = () => {
  1241. this.content.classList.toggle("show");
  1242. };
  1243. } else {
  1244. this.triggerElement.onmouseover = () => {
  1245. this.content.classList.add("show");
  1246. };
  1247. this.triggerElement.onmouseout = () => {
  1248. this.content.classList.remove("show");
  1249. };
  1250. this.content.onmouseover = () => {
  1251. this.content.classList.add("show");
  1252. };
  1253. this.content.onmouseout = () => {
  1254. this.content.classList.remove("show");
  1255. };
  1256. }
  1257. this.content.onclick = () => {
  1258. this.content.classList.remove("show");
  1259. };
  1260. }
  1261. }
  1262. class HeaderElement extends IElement {
  1263. connectedCallback() {
  1264. this.append(this.visualSwitcher || "");
  1265. }
  1266. }
  1267. class MessageElement extends IElement {
  1268. constructor() {
  1269. super(...arguments);
  1270. this.closer = el("span", { className: "message-closer" }, "x");
  1271. this.contentContainer = el("span", { className: "message-content-container" });
  1272. this.type = "info";
  1273. this.content = "";
  1274. this.closeable = true;
  1275. }
  1276. connectedCallback() {
  1277. var _a;
  1278. this.classList.add(this.type);
  1279. if (typeof this.content === "string") {
  1280. this.contentContainer.innerHTML = this.content;
  1281. } else {
  1282. this.contentContainer.append(this.content);
  1283. }
  1284. this.duration = Math.max((_a = this.duration) != null ? _a : 5, 0);
  1285. this.append(this.contentContainer);
  1286. if (this.closeable) {
  1287. this.append(this.closer);
  1288. this.closer.addEventListener("click", () => {
  1289. var _a2;
  1290. (_a2 = this.onClose) == null ? void 0 : _a2.call(this);
  1291. this.remove();
  1292. });
  1293. }
  1294. if (this.duration) {
  1295. setTimeout(() => {
  1296. var _a2;
  1297. (_a2 = this.onClose) == null ? void 0 : _a2.call(this);
  1298. this.remove();
  1299. }, this.duration * 1e3);
  1300. }
  1301. }
  1302. }
  1303. class ModalElement extends IElement {
  1304. constructor() {
  1305. super(...arguments);
  1306. this._title = el("div", { className: "modal-title" });
  1307. this.body = el("div", { className: "modal-body" });
  1308. this.footerContainer = el("div", { className: "modal-footer" });
  1309. this.modalInput = el("input", { className: "modal-input" });
  1310. this.modalInputType = "input";
  1311. this.type = "alert";
  1312. this.content = "";
  1313. this.inputDefaultValue = "";
  1314. this.placeholder = "";
  1315. this.modalStyle = {};
  1316. }
  1317. connectedCallback() {
  1318. var _a;
  1319. this.classList.add(this.type);
  1320. Object.assign(this.style, this.modalStyle || {});
  1321. const profile = el("div", {
  1322. innerText: this.profile || "\u5F39\u7A97\u6765\u81EA: OCS " + (((_a = $gm.getInfos()) == null ? void 0 : _a.script.version) || ""),
  1323. className: "modal-profile"
  1324. });
  1325. this._title.innerText = this.title;
  1326. this.body.append(typeof this.content === "string" ? el("div", { innerHTML: this.content }) : this.content);
  1327. if (this.modalInputType === "textarea") {
  1328. this.modalInput = el("textarea", { className: "modal-input", style: { height: "100px" } });
  1329. }
  1330. this.modalInput.placeholder = this.placeholder || "";
  1331. this.modalInput.value = this.inputDefaultValue || "";
  1332. this.append(profile, this._title, this.body, this.footerContainer);
  1333. this.style.width = (this.width || 400) + "px";
  1334. if (this.footer === void 0) {
  1335. this.footerContainer.append(this.modalInput);
  1336. if (this.cancelButton === void 0) {
  1337. this.cancelButton = el("button", { className: "modal-cancel-button" });
  1338. this.cancelButton.innerText = this.cancelButtonText || "\u53D6\u6D88";
  1339. this.cancelButton.onclick = () => {
  1340. var _a2, _b;
  1341. (_a2 = this.onCancel) == null ? void 0 : _a2.call(this);
  1342. (_b = this.onClose) == null ? void 0 : _b.call(this);
  1343. this.remove();
  1344. };
  1345. }
  1346. if (this.confirmButton === void 0) {
  1347. this.confirmButton = el("button", { className: "modal-confirm-button" });
  1348. this.confirmButton.innerText = this.confirmButtonText || "\u786E\u5B9A";
  1349. this.confirmButton.onclick = async () => {
  1350. var _a2, _b;
  1351. if (await ((_a2 = this.onConfirm) == null ? void 0 : _a2.call(this, this.modalInput.value)) !== false) {
  1352. this.remove();
  1353. (_b = this.onClose) == null ? void 0 : _b.call(this, this.modalInput.value);
  1354. }
  1355. };
  1356. }
  1357. this.cancelButton && this.footerContainer.append(this.cancelButton);
  1358. this.confirmButton && this.footerContainer.append(this.confirmButton);
  1359. if (this.type === "simple") {
  1360. this.footerContainer.remove();
  1361. } else if (this.type === "prompt") {
  1362. this.modalInput.focus();
  1363. }
  1364. } else {
  1365. this.footerContainer.append(this.footer);
  1366. }
  1367. $.onresize(this.body, (modal) => {
  1368. this.body.style.maxHeight = window.innerHeight - 100 + "px";
  1369. this.body.style.maxWidth = window.innerWidth - 50 + "px";
  1370. });
  1371. }
  1372. }
  1373. class ScriptPanelElement extends IElement {
  1374. constructor() {
  1375. super(...arguments);
  1376. this.separator = el("div", { className: "separator" });
  1377. this.notesContainer = el("div", { className: "notes card" });
  1378. this.configsContainer = el("div", { className: "configs-container card" });
  1379. this.body = el("div", { className: "script-panel-body" });
  1380. this.lockWrapper = el("div", { className: "lock-wrapper" });
  1381. }
  1382. connectedCallback() {
  1383. this.separator.innerText = this.name || "";
  1384. this.append(this.separator);
  1385. this.append(this.notesContainer);
  1386. this.append(this.configsContainer);
  1387. this.append(this.body);
  1388. }
  1389. }
  1390. function defaultWorkTypeResolver(ctx) {
  1391. function count(selector) {
  1392. let c = 0;
  1393. for (const option of ctx.elements.options || []) {
  1394. if ((option == null ? void 0 : option.querySelector(selector)) !== null) {
  1395. c++;
  1396. }
  1397. }
  1398. return c;
  1399. }
  1400. return count('[type="radio"]') === 2 ? "judgement" : count('[type="radio"]') > 2 ? "single" : count('[type="checkbox"]') > 2 ? "multiple" : count("textarea") >= 1 ? "completion" : void 0;
  1401. }
  1402. function isPlainAnswer(answer) {
  1403. answer = answer.trim();
  1404. if (answer.length > 8 || !/[A-Z]/.test(answer)) {
  1405. return false;
  1406. }
  1407. const counter = {};
  1408. let min = 0;
  1409. for (let i = 0; i < answer.length; i++) {
  1410. if (answer.charCodeAt(i) < min) {
  1411. return false;
  1412. }
  1413. min = answer.charCodeAt(i);
  1414. counter[min] = (counter[min] || 0) + 1;
  1415. }
  1416. for (const key in counter) {
  1417. if (counter[key] !== 1) {
  1418. return false;
  1419. }
  1420. }
  1421. return true;
  1422. }
  1423. function splitAnswer(answer) {
  1424. try {
  1425. const json = JSON.parse(answer);
  1426. if (Array.isArray(json)) {
  1427. return json.map(String).filter((el2) => el2.trim().length > 0);
  1428. }
  1429. } catch {
  1430. const seprators = ["===", "#", "---", "###", "|", ";"];
  1431. for (const sep of seprators) {
  1432. if (answer.split(sep).length > 1) {
  1433. return answer.split(sep).filter((el2) => el2.trim().length > 0);
  1434. }
  1435. }
  1436. }
  1437. return [answer];
  1438. }
  1439. const transformImgLinkOfQuestion = (question) => {
  1440. const dom = new DOMParser().parseFromString(question, "text/html");
  1441. for (const img of Array.from(dom.querySelectorAll("img"))) {
  1442. img.replaceWith(img.src);
  1443. }
  1444. return dom.documentElement.innerText.replace(/https?:\/\/.+?\.(png|jpg|jpeg|gif)/g, (img) => {
  1445. return `<img src="${img}" />`;
  1446. });
  1447. };
  1448. class SearchInfosElement extends IElement {
  1449. constructor() {
  1450. super(...arguments);
  1451. this.infos = [];
  1452. this.question = "";
  1453. }
  1454. connectedCallback() {
  1455. const question = transformImgLinkOfQuestion(this.question || "\u65E0");
  1456. this.append(
  1457. el("div", [el("span", { innerHTML: question }), $creator.createQuestionTitleExtra(this.question)], (div) => {
  1458. div.style.padding = "4px";
  1459. }),
  1460. el("hr")
  1461. );
  1462. this.append(
  1463. ...this.infos.map((info) => {
  1464. return el("details", { open: true }, [
  1465. el("summary", [el("a", { href: info.homepage, innerText: info.name, target: "_blank" })]),
  1466. ...info.error ? [el("span", { className: "error" }, [info.error || "\u7F51\u7EDC\u9519\u8BEF\u6216\u8005\u672A\u77E5\u9519\u8BEF"])] : [
  1467. ...info.results.map((ans) => {
  1468. const title = transformImgLinkOfQuestion(ans[0] || this.question || "\u65E0");
  1469. const answer = transformImgLinkOfQuestion(ans[1] || "\u65E0");
  1470. return el("div", { className: "search-result" }, [
  1471. el("div", { className: "question" }, [el("span", { innerHTML: title })]),
  1472. el("div", { className: "answer" }, [
  1473. el("span", "\u7B54\u6848\uFF1A"),
  1474. ...splitAnswer(answer).map((a) => el("code", { innerHTML: a }))
  1475. ])
  1476. ]);
  1477. })
  1478. ]
  1479. ]);
  1480. })
  1481. );
  1482. $.onresize(this, (sr) => {
  1483. sr.style.maxHeight = window.innerHeight / 2 + "px";
  1484. });
  1485. }
  1486. }
  1487. const definedCustomElements = [
  1488. ConfigElement,
  1489. ContainerElement,
  1490. HeaderElement,
  1491. ModalElement,
  1492. MessageElement,
  1493. ScriptPanelElement,
  1494. SearchInfosElement,
  1495. DropdownElement
  1496. ];
  1497. class CorsEventEmitter {
  1498. constructor() {
  1499. this.eventMap = /* @__PURE__ */ new Map();
  1500. }
  1501. eventKey(name) {
  1502. return "cors.events." + name;
  1503. }
  1504. tempKey(...args) {
  1505. return ["_temp_", ...args].join(".");
  1506. }
  1507. keyOfReturn(id) {
  1508. return this.tempKey("event", id, "return");
  1509. }
  1510. keyOfArguments(id) {
  1511. return this.tempKey("event", id, "arguments");
  1512. }
  1513. keyOfState(id) {
  1514. return this.tempKey("event", id, "state");
  1515. }
  1516. emit(name, args = [], callback) {
  1517. $store.getTab($const.TAB_UID).then((uid) => {
  1518. const id = $.uuid().replace(/-/g, "");
  1519. const key = uid + "." + this.eventKey(name);
  1520. $store.set(this.keyOfState(id), 0);
  1521. $store.set(this.keyOfArguments(id), args);
  1522. const listenerId = $store.addChangeListener(this.keyOfState(id), (pre, curr, remote) => {
  1523. $store.removeChangeListener(listenerId);
  1524. callback == null ? void 0 : callback($store.get(this.keyOfReturn(id)), !!remote);
  1525. $store.delete(this.keyOfState(id));
  1526. $store.delete(this.keyOfReturn(id));
  1527. $store.delete(this.keyOfArguments(id));
  1528. }) || 0;
  1529. $store.set(key, ($store.get(key) ? String($store.get(key)).split(",") : []).concat(id).join(","));
  1530. }).catch(console.error);
  1531. }
  1532. on(name, handler) {
  1533. return new Promise((resolve) => {
  1534. $store.getTab($const.TAB_UID).then((uid) => {
  1535. const key = uid + "." + this.eventKey(name);
  1536. const originId = this.eventMap.get(key);
  1537. if (originId) {
  1538. resolve(originId);
  1539. } else {
  1540. const id = $store.addChangeListener(key, async (pre, curr, remote) => {
  1541. if (remote) {
  1542. const list = String(curr).split(",");
  1543. const id2 = list.pop();
  1544. if (id2) {
  1545. $store.set(this.keyOfReturn(id2), await handler($store.get(this.keyOfArguments(id2))));
  1546. setTimeout(() => {
  1547. $store.set(this.keyOfState(id2), 1);
  1548. $store.set(key, list.join(","));
  1549. }, 100);
  1550. }
  1551. }
  1552. }) || 0;
  1553. this.eventMap.set(key, id);
  1554. resolve(id);
  1555. }
  1556. }).catch(console.error);
  1557. });
  1558. }
  1559. off(name) {
  1560. const key = this.eventKey(name);
  1561. const originId = this.eventMap.get(key);
  1562. if (originId) {
  1563. this.eventMap.delete(key);
  1564. $store.removeChangeListener(originId);
  1565. }
  1566. }
  1567. }
  1568. if (typeof GM_listValues !== "undefined") {
  1569. window.onload = () => {
  1570. $store.list().forEach((key) => {
  1571. if (/_temp_.event.[0-9a-z]{32}.(state|return|arguments)/.test(key)) {
  1572. $store.delete(key);
  1573. }
  1574. if (/[0-9a-z]{32}.cors.events.modal/.test(key)) {
  1575. $store.delete(key);
  1576. }
  1577. });
  1578. };
  1579. }
  1580. const cors = new CorsEventEmitter();
  1581. var events = { exports: {} };
  1582. var R = typeof Reflect === "object" ? Reflect : null;
  1583. var ReflectApply = R && typeof R.apply === "function" ? R.apply : function ReflectApply2(target, receiver, args) {
  1584. return Function.prototype.apply.call(target, receiver, args);
  1585. };
  1586. var ReflectOwnKeys;
  1587. if (R && typeof R.ownKeys === "function") {
  1588. ReflectOwnKeys = R.ownKeys;
  1589. } else if (Object.getOwnPropertySymbols) {
  1590. ReflectOwnKeys = function ReflectOwnKeys2(target) {
  1591. return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target));
  1592. };
  1593. } else {
  1594. ReflectOwnKeys = function ReflectOwnKeys2(target) {
  1595. return Object.getOwnPropertyNames(target);
  1596. };
  1597. }
  1598. function ProcessEmitWarning(warning) {
  1599. if (console && console.warn)
  1600. console.warn(warning);
  1601. }
  1602. var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) {
  1603. return value !== value;
  1604. };
  1605. function EventEmitter() {
  1606. EventEmitter.init.call(this);
  1607. }
  1608. events.exports = EventEmitter;
  1609. events.exports.once = once;
  1610. EventEmitter.EventEmitter = EventEmitter;
  1611. EventEmitter.prototype._events = void 0;
  1612. EventEmitter.prototype._eventsCount = 0;
  1613. EventEmitter.prototype._maxListeners = void 0;
  1614. var defaultMaxListeners = 10;
  1615. function checkListener(listener) {
  1616. if (typeof listener !== "function") {
  1617. throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
  1618. }
  1619. }
  1620. Object.defineProperty(EventEmitter, "defaultMaxListeners", {
  1621. enumerable: true,
  1622. get: function() {
  1623. return defaultMaxListeners;
  1624. },
  1625. set: function(arg) {
  1626. if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) {
  1627. throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + ".");
  1628. }
  1629. defaultMaxListeners = arg;
  1630. }
  1631. });
  1632. EventEmitter.init = function() {
  1633. if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) {
  1634. this._events = /* @__PURE__ */ Object.create(null);
  1635. this._eventsCount = 0;
  1636. }
  1637. this._maxListeners = this._maxListeners || void 0;
  1638. };
  1639. EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
  1640. if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) {
  1641. throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + ".");
  1642. }
  1643. this._maxListeners = n;
  1644. return this;
  1645. };
  1646. function _getMaxListeners(that) {
  1647. if (that._maxListeners === void 0)
  1648. return EventEmitter.defaultMaxListeners;
  1649. return that._maxListeners;
  1650. }
  1651. EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
  1652. return _getMaxListeners(this);
  1653. };
  1654. EventEmitter.prototype.emit = function emit(type) {
  1655. var args = [];
  1656. for (var i = 1; i < arguments.length; i++)
  1657. args.push(arguments[i]);
  1658. var doError = type === "error";
  1659. var events2 = this._events;
  1660. if (events2 !== void 0)
  1661. doError = doError && events2.error === void 0;
  1662. else if (!doError)
  1663. return false;
  1664. if (doError) {
  1665. var er;
  1666. if (args.length > 0)
  1667. er = args[0];
  1668. if (er instanceof Error) {
  1669. throw er;
  1670. }
  1671. var err = new Error("Unhandled error." + (er ? " (" + er.message + ")" : ""));
  1672. err.context = er;
  1673. throw err;
  1674. }
  1675. var handler = events2[type];
  1676. if (handler === void 0)
  1677. return false;
  1678. if (typeof handler === "function") {
  1679. ReflectApply(handler, this, args);
  1680. } else {
  1681. var len = handler.length;
  1682. var listeners = arrayClone(handler, len);
  1683. for (var i = 0; i < len; ++i)
  1684. ReflectApply(listeners[i], this, args);
  1685. }
  1686. return true;
  1687. };
  1688. function _addListener(target, type, listener, prepend) {
  1689. var m;
  1690. var events2;
  1691. var existing;
  1692. checkListener(listener);
  1693. events2 = target._events;
  1694. if (events2 === void 0) {
  1695. events2 = target._events = /* @__PURE__ */ Object.create(null);
  1696. target._eventsCount = 0;
  1697. } else {
  1698. if (events2.newListener !== void 0) {
  1699. target.emit(
  1700. "newListener",
  1701. type,
  1702. listener.listener ? listener.listener : listener
  1703. );
  1704. events2 = target._events;
  1705. }
  1706. existing = events2[type];
  1707. }
  1708. if (existing === void 0) {
  1709. existing = events2[type] = listener;
  1710. ++target._eventsCount;
  1711. } else {
  1712. if (typeof existing === "function") {
  1713. existing = events2[type] = prepend ? [listener, existing] : [existing, listener];
  1714. } else if (prepend) {
  1715. existing.unshift(listener);
  1716. } else {
  1717. existing.push(listener);
  1718. }
  1719. m = _getMaxListeners(target);
  1720. if (m > 0 && existing.length > m && !existing.warned) {
  1721. existing.warned = true;
  1722. var w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit");
  1723. w.name = "MaxListenersExceededWarning";
  1724. w.emitter = target;
  1725. w.type = type;
  1726. w.count = existing.length;
  1727. ProcessEmitWarning(w);
  1728. }
  1729. }
  1730. return target;
  1731. }
  1732. EventEmitter.prototype.addListener = function addListener(type, listener) {
  1733. return _addListener(this, type, listener, false);
  1734. };
  1735. EventEmitter.prototype.on = EventEmitter.prototype.addListener;
  1736. EventEmitter.prototype.prependListener = function prependListener(type, listener) {
  1737. return _addListener(this, type, listener, true);
  1738. };
  1739. function onceWrapper() {
  1740. if (!this.fired) {
  1741. this.target.removeListener(this.type, this.wrapFn);
  1742. this.fired = true;
  1743. if (arguments.length === 0)
  1744. return this.listener.call(this.target);
  1745. return this.listener.apply(this.target, arguments);
  1746. }
  1747. }
  1748. function _onceWrap(target, type, listener) {
  1749. var state2 = { fired: false, wrapFn: void 0, target, type, listener };
  1750. var wrapped = onceWrapper.bind(state2);
  1751. wrapped.listener = listener;
  1752. state2.wrapFn = wrapped;
  1753. return wrapped;
  1754. }
  1755. EventEmitter.prototype.once = function once2(type, listener) {
  1756. checkListener(listener);
  1757. this.on(type, _onceWrap(this, type, listener));
  1758. return this;
  1759. };
  1760. EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) {
  1761. checkListener(listener);
  1762. this.prependListener(type, _onceWrap(this, type, listener));
  1763. return this;
  1764. };
  1765. EventEmitter.prototype.removeListener = function removeListener(type, listener) {
  1766. var list, events2, position, i, originalListener;
  1767. checkListener(listener);
  1768. events2 = this._events;
  1769. if (events2 === void 0)
  1770. return this;
  1771. list = events2[type];
  1772. if (list === void 0)
  1773. return this;
  1774. if (list === listener || list.listener === listener) {
  1775. if (--this._eventsCount === 0)
  1776. this._events = /* @__PURE__ */ Object.create(null);
  1777. else {
  1778. delete events2[type];
  1779. if (events2.removeListener)
  1780. this.emit("removeListener", type, list.listener || listener);
  1781. }
  1782. } else if (typeof list !== "function") {
  1783. position = -1;
  1784. for (i = list.length - 1; i >= 0; i--) {
  1785. if (list[i] === listener || list[i].listener === listener) {
  1786. originalListener = list[i].listener;
  1787. position = i;
  1788. break;
  1789. }
  1790. }
  1791. if (position < 0)
  1792. return this;
  1793. if (position === 0)
  1794. list.shift();
  1795. else {
  1796. spliceOne(list, position);
  1797. }
  1798. if (list.length === 1)
  1799. events2[type] = list[0];
  1800. if (events2.removeListener !== void 0)
  1801. this.emit("removeListener", type, originalListener || listener);
  1802. }
  1803. return this;
  1804. };
  1805. EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
  1806. EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) {
  1807. var listeners, events2, i;
  1808. events2 = this._events;
  1809. if (events2 === void 0)
  1810. return this;
  1811. if (events2.removeListener === void 0) {
  1812. if (arguments.length === 0) {
  1813. this._events = /* @__PURE__ */ Object.create(null);
  1814. this._eventsCount = 0;
  1815. } else if (events2[type] !== void 0) {
  1816. if (--this._eventsCount === 0)
  1817. this._events = /* @__PURE__ */ Object.create(null);
  1818. else
  1819. delete events2[type];
  1820. }
  1821. return this;
  1822. }
  1823. if (arguments.length === 0) {
  1824. var keys = Object.keys(events2);
  1825. var key;
  1826. for (i = 0; i < keys.length; ++i) {
  1827. key = keys[i];
  1828. if (key === "removeListener")
  1829. continue;
  1830. this.removeAllListeners(key);
  1831. }
  1832. this.removeAllListeners("removeListener");
  1833. this._events = /* @__PURE__ */ Object.create(null);
  1834. this._eventsCount = 0;
  1835. return this;
  1836. }
  1837. listeners = events2[type];
  1838. if (typeof listeners === "function") {
  1839. this.removeListener(type, listeners);
  1840. } else if (listeners !== void 0) {
  1841. for (i = listeners.length - 1; i >= 0; i--) {
  1842. this.removeListener(type, listeners[i]);
  1843. }
  1844. }
  1845. return this;
  1846. };
  1847. function _listeners(target, type, unwrap) {
  1848. var events2 = target._events;
  1849. if (events2 === void 0)
  1850. return [];
  1851. var evlistener = events2[type];
  1852. if (evlistener === void 0)
  1853. return [];
  1854. if (typeof evlistener === "function")
  1855. return unwrap ? [evlistener.listener || evlistener] : [evlistener];
  1856. return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
  1857. }
  1858. EventEmitter.prototype.listeners = function listeners(type) {
  1859. return _listeners(this, type, true);
  1860. };
  1861. EventEmitter.prototype.rawListeners = function rawListeners(type) {
  1862. return _listeners(this, type, false);
  1863. };
  1864. EventEmitter.listenerCount = function(emitter, type) {
  1865. if (typeof emitter.listenerCount === "function") {
  1866. return emitter.listenerCount(type);
  1867. } else {
  1868. return listenerCount.call(emitter, type);
  1869. }
  1870. };
  1871. EventEmitter.prototype.listenerCount = listenerCount;
  1872. function listenerCount(type) {
  1873. var events2 = this._events;
  1874. if (events2 !== void 0) {
  1875. var evlistener = events2[type];
  1876. if (typeof evlistener === "function") {
  1877. return 1;
  1878. } else if (evlistener !== void 0) {
  1879. return evlistener.length;
  1880. }
  1881. }
  1882. return 0;
  1883. }
  1884. EventEmitter.prototype.eventNames = function eventNames() {
  1885. return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
  1886. };
  1887. function arrayClone(arr, n) {
  1888. var copy = new Array(n);
  1889. for (var i = 0; i < n; ++i)
  1890. copy[i] = arr[i];
  1891. return copy;
  1892. }
  1893. function spliceOne(list, index) {
  1894. for (; index + 1 < list.length; index++)
  1895. list[index] = list[index + 1];
  1896. list.pop();
  1897. }
  1898. function unwrapListeners(arr) {
  1899. var ret = new Array(arr.length);
  1900. for (var i = 0; i < ret.length; ++i) {
  1901. ret[i] = arr[i].listener || arr[i];
  1902. }
  1903. return ret;
  1904. }
  1905. function once(emitter, name) {
  1906. return new Promise(function(resolve, reject) {
  1907. function errorListener(err) {
  1908. emitter.removeListener(name, resolver);
  1909. reject(err);
  1910. }
  1911. function resolver() {
  1912. if (typeof emitter.removeListener === "function") {
  1913. emitter.removeListener("error", errorListener);
  1914. }
  1915. resolve([].slice.call(arguments));
  1916. }
  1917. eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });
  1918. if (name !== "error") {
  1919. addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });
  1920. }
  1921. });
  1922. }
  1923. function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
  1924. if (typeof emitter.on === "function") {
  1925. eventTargetAgnosticAddListener(emitter, "error", handler, flags);
  1926. }
  1927. }
  1928. function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
  1929. if (typeof emitter.on === "function") {
  1930. if (flags.once) {
  1931. emitter.once(name, listener);
  1932. } else {
  1933. emitter.on(name, listener);
  1934. }
  1935. } else if (typeof emitter.addEventListener === "function") {
  1936. emitter.addEventListener(name, function wrapListener(arg) {
  1937. if (flags.once) {
  1938. emitter.removeEventListener(name, wrapListener);
  1939. }
  1940. listener(arg);
  1941. });
  1942. } else {
  1943. throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter);
  1944. }
  1945. }
  1946. var EventEmitter$1 = events.exports;
  1947. class CommonEventEmitter extends EventEmitter$1 {
  1948. on(eventName, listener) {
  1949. return super.on(eventName.toString(), listener);
  1950. }
  1951. once(eventName, listener) {
  1952. return super.once(eventName.toString(), listener);
  1953. }
  1954. emit(eventName, ...args) {
  1955. return super.emit(eventName.toString(), ...args);
  1956. }
  1957. off(eventName, listener) {
  1958. return super.off(eventName.toString(), listener);
  1959. }
  1960. }
  1961. class BaseScript extends CommonEventEmitter {
  1962. }
  1963. class Script extends BaseScript {
  1964. constructor({
  1965. name,
  1966. namespace,
  1967. url,
  1968. excludes,
  1969. configs,
  1970. hideInPanel,
  1971. onstart,
  1972. onactive,
  1973. oncomplete,
  1974. onbeforeunload,
  1975. onrender,
  1976. onhistorychange,
  1977. methods,
  1978. priority
  1979. }) {
  1980. super();
  1981. this.excludes = [];
  1982. this.cfg = {};
  1983. this.methods = /* @__PURE__ */ Object.create({});
  1984. this.event = new EventEmitter$1();
  1985. this.name = name;
  1986. this.namespace = namespace;
  1987. this.url = url;
  1988. this.excludes = excludes;
  1989. this._configs = configs;
  1990. this.hideInPanel = hideInPanel;
  1991. this.onstart = this.errorHandler(onstart);
  1992. this.onactive = this.errorHandler(onactive);
  1993. this.oncomplete = this.errorHandler(oncomplete);
  1994. this.onbeforeunload = this.errorHandler(onbeforeunload);
  1995. this.onrender = this.errorHandler(onrender);
  1996. this.onhistorychange = this.errorHandler(onhistorychange);
  1997. this.methods = (methods == null ? void 0 : methods.bind(this)()) || /* @__PURE__ */ Object.create({});
  1998. this.priority = priority != null ? priority : 0;
  1999. if (this.methods) {
  2000. for (const key in methods) {
  2001. if (Reflect.has(this.methods, key) && typeof this.methods[key] !== "function") {
  2002. Reflect.set(this.methods, key, this.errorHandler(this.methods[key]));
  2003. }
  2004. }
  2005. }
  2006. }
  2007. get configs() {
  2008. if (!this._resolvedConfigs) {
  2009. this._resolvedConfigs = typeof this._configs === "function" ? this._configs() : this._configs;
  2010. }
  2011. return this._resolvedConfigs;
  2012. }
  2013. set configs(c) {
  2014. this._configs = c;
  2015. }
  2016. onConfigChange(key, handler) {
  2017. const _key = $.namespaceKey(this.namespace, key.toString());
  2018. return $store.addChangeListener(_key, (pre, curr, remote) => {
  2019. handler(curr, pre, !!remote);
  2020. });
  2021. }
  2022. offConfigChange(listener) {
  2023. $store.removeChangeListener(listener);
  2024. }
  2025. errorHandler(func) {
  2026. return (...args) => {
  2027. try {
  2028. return func == null ? void 0 : func.apply(this, args);
  2029. } catch (err) {
  2030. console.error(err);
  2031. if (err instanceof Error) {
  2032. this.emit("scripterror", err.message);
  2033. } else {
  2034. this.emit("scripterror", String(err));
  2035. }
  2036. }
  2037. };
  2038. }
  2039. }
  2040. const minimizeSvg = '<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M19 13H5v-2h14v2z"/></svg>';
  2041. const expandSvg = '<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M18 4H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 14H6V6h12v12z"/></svg>';
  2042. const RenderScript = new Script({
  2043. name: "\u{1F5BC}\uFE0F \u7A97\u53E3\u8BBE\u7F6E",
  2044. url: [["\u6240\u6709", /.*/]],
  2045. namespace: "render.panel",
  2046. configs: {
  2047. notes: {
  2048. defaultValue: $creator.notes([
  2049. ["\u5982\u679C\u9700\u8981\u9690\u85CF\u6574\u4E2A\u7A97\u53E3\uFF0C\u53EF\u4EE5\u70B9\u51FB\u4E0B\u65B9\u9690\u85CF\u6309\u94AE\uFF0C", "\u9690\u85CF\u540E\u53EF\u4EE5\u5FEB\u901F\u4E09\u51FB\u5C4F\u5E55\u4E2D\u7684\u4EFB\u610F\u5730\u65B9", "\u6765\u91CD\u65B0\u663E\u793A\u7A97\u53E3\u3002"],
  2050. "\u7A97\u53E3\u8FDE\u7EED\u70B9\u51FB\u663E\u793A\u7684\u6B21\u6570\u53EF\u4EE5\u81EA\u5B9A\u4E49\uFF0C\u9ED8\u8BA4\u4E3A\u4E09\u6B21"
  2051. ]).outerHTML
  2052. },
  2053. x: { defaultValue: window.innerWidth * 0.1 },
  2054. y: { defaultValue: window.innerWidth * 0.1 },
  2055. visual: { defaultValue: "normal" },
  2056. firstCloseAlert: {
  2057. defaultValue: true
  2058. },
  2059. fontsize: {
  2060. label: "\u5B57\u4F53\u5927\u5C0F\uFF08\u50CF\u7D20\uFF09",
  2061. attrs: { type: "number", min: 12, max: 24, step: 1 },
  2062. defaultValue: 14
  2063. },
  2064. switchPoint: {
  2065. label: "\u7A97\u53E3\u663E\u793A\u8FDE\u70B9\uFF08\u6B21\u6570\uFF09",
  2066. attrs: {
  2067. type: "number",
  2068. min: 3,
  2069. max: 10,
  2070. step: 1,
  2071. 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"
  2072. },
  2073. defaultValue: 3
  2074. },
  2075. lockConfigs: {
  2076. defaultValue: false
  2077. },
  2078. lockMessage: {
  2079. defaultValue: "\u5F53\u524D\u811A\u672C\u5DF2\u9501\u5B9A\u914D\u7F6E\uFF0C\u65E0\u6CD5\u4FEE\u6539"
  2080. }
  2081. },
  2082. methods() {
  2083. return {
  2084. isPinned: async (script) => {
  2085. const currentPanelName = await $store.getTab($const.TAB_CURRENT_PANEL_NAME);
  2086. return isCurrentPanel(script.projectName, script, currentPanelName);
  2087. },
  2088. pin: async (script) => {
  2089. if (script.projectName) {
  2090. await $store.setTab($const.TAB_CURRENT_PANEL_NAME, `${script.projectName}-${script.name}`);
  2091. } else if (script.namespace) {
  2092. await $store.setTab($const.TAB_CURRENT_PANEL_NAME, script.namespace);
  2093. } else {
  2094. console.warn("[OCS]", `${script.name} \u65E0\u6CD5\u7F6E\u9876\uFF0C projectName \u4E0E namespace \u90FD\u4E3A undefined`);
  2095. }
  2096. },
  2097. minimize: () => {
  2098. this.cfg.visual = "minimize";
  2099. },
  2100. moveToEdge: () => {
  2101. this.cfg.x = 80;
  2102. this.cfg.y = 60;
  2103. this.cfg.visual = "minimize";
  2104. },
  2105. normal: () => {
  2106. this.cfg.visual = "normal";
  2107. }
  2108. };
  2109. },
  2110. onrender({ panel: panel2 }) {
  2111. const closeBtn = el("button", { className: "base-style-button" }, "\u9690\u85CF\u7A97\u53E3");
  2112. closeBtn.onclick = () => {
  2113. if (this.cfg.firstCloseAlert) {
  2114. $modal("confirm", {
  2115. content: $creator.notes([
  2116. "\u9690\u85CF\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",
  2117. "\u8BF7\u786E\u8BA4\u662F\u5426\u5173\u95ED\u3002\uFF08\u6B64\u540E\u4E0D\u518D\u663E\u793A\u6B64\u5F39\u7A97\uFF09"
  2118. ]),
  2119. onConfirm: () => {
  2120. this.cfg.visual = "close";
  2121. this.cfg.firstCloseAlert = false;
  2122. }
  2123. });
  2124. } else {
  2125. this.cfg.visual = "close";
  2126. }
  2127. };
  2128. panel2.body.replaceChildren(el("hr"), closeBtn);
  2129. },
  2130. async onactive({ style, projects, defaultPanelName }) {
  2131. handleLowLevelBrowser();
  2132. $.loadCustomElements(definedCustomElements);
  2133. const defaults2 = {
  2134. urls: (urls) => urls && urls.length ? urls : [location.href],
  2135. panelName: (name) => name || defaultPanelName || ""
  2136. };
  2137. const matchedScripts = $.getMatchedScripts(projects, [location.href]).filter((s) => !s.hideInPanel);
  2138. const container = el("container-element");
  2139. const initHeader = (urls, currentPanelName) => {
  2140. const infos = $gm.getInfos();
  2141. const profile = $creator.tooltip(
  2142. el(
  2143. "div",
  2144. { className: "profile", title: "\u83DC\u5355\u680F\uFF08\u53EF\u62D6\u52A8\u533A\u57DF\uFF09" },
  2145. `OCS${infos ? "-" : ""}${(infos == null ? void 0 : infos.script.version) || ""}`
  2146. )
  2147. );
  2148. const scriptDropdowns = [];
  2149. for (const project of projects) {
  2150. const dropdown = el("dropdown-element");
  2151. let selected = false;
  2152. const options = [];
  2153. const scripts = $.getMatchedScripts([project], urls).filter((s) => !s.hideInPanel);
  2154. if (scripts.length) {
  2155. for (const key in project.scripts) {
  2156. if (Object.prototype.hasOwnProperty.call(project.scripts, key)) {
  2157. const script = project.scripts[key];
  2158. if (!script.hideInPanel) {
  2159. const optionSelected = isCurrentPanel(project.name, script, currentPanelName);
  2160. const option = el("div", { className: "dropdown-option" }, script.name);
  2161. if (optionSelected) {
  2162. option.classList.add("active");
  2163. }
  2164. if (selected !== true && optionSelected) {
  2165. selected = true;
  2166. }
  2167. option.onclick = () => {
  2168. $store.setTab($const.TAB_CURRENT_PANEL_NAME, project.name + "-" + script.name);
  2169. };
  2170. options.push(option);
  2171. }
  2172. }
  2173. }
  2174. if (selected) {
  2175. dropdown.classList.add("active");
  2176. }
  2177. dropdown.triggerElement = el("div", { className: "dropdown-trigger-element " }, project.name);
  2178. dropdown.triggerElement.style.padding = "0px 8px";
  2179. dropdown.content.append(...options);
  2180. scriptDropdowns.push(dropdown);
  2181. }
  2182. }
  2183. const isMinimize = () => this.cfg.visual === "minimize";
  2184. const visualSwitcher = $creator.tooltip(
  2185. el("div", {
  2186. className: "switch ",
  2187. title: isMinimize() ? "\u70B9\u51FB\u5C55\u5F00\u7A97\u53E3" : "\u70B9\u51FB\u6700\u5C0F\u5316\u7A97\u53E3",
  2188. innerHTML: isMinimize() ? expandSvg : minimizeSvg,
  2189. onclick: () => {
  2190. this.cfg.visual = isMinimize() ? "normal" : "minimize";
  2191. visualSwitcher.title = isMinimize() ? "\u70B9\u51FB\u5C55\u5F00\u7A97\u53E3" : "\u70B9\u51FB\u6700\u5C0F\u5316\u7A97\u53E3";
  2192. visualSwitcher.innerHTML = isMinimize() ? expandSvg : minimizeSvg;
  2193. }
  2194. })
  2195. );
  2196. container.header.visualSwitcher = visualSwitcher;
  2197. container.header.replaceChildren();
  2198. container.header.append(profile, ...scriptDropdowns, container.header.visualSwitcher || "");
  2199. };
  2200. const handlePosition = () => {
  2201. if (this.cfg.x > document.documentElement.clientWidth || this.cfg.x < 0) {
  2202. this.cfg.x = 10;
  2203. this.cfg.y = 10;
  2204. }
  2205. if (this.cfg.y > document.documentElement.clientHeight || this.cfg.y < 0) {
  2206. this.cfg.x = 10;
  2207. this.cfg.y = 10;
  2208. }
  2209. container.style.left = this.cfg.x + "px";
  2210. container.style.top = this.cfg.y + "px";
  2211. const positionHandler = () => {
  2212. this.cfg.x = container.offsetLeft;
  2213. this.cfg.y = container.offsetTop;
  2214. };
  2215. enableElementDraggable(container.header, container, positionHandler);
  2216. this.onConfigChange(
  2217. "x",
  2218. debounce_1((x) => container.style.left = x + "px", 200)
  2219. );
  2220. this.onConfigChange(
  2221. "y",
  2222. debounce_1((y) => container.style.top = y + "px", 200)
  2223. );
  2224. };
  2225. const visual = (value) => {
  2226. container.className = "";
  2227. if (value === "minimize") {
  2228. container.classList.add("minimize");
  2229. } else if (value === "close") {
  2230. container.classList.add("close");
  2231. } else {
  2232. container.classList.add("normal");
  2233. }
  2234. };
  2235. const handleVisible = () => {
  2236. window.addEventListener("click", (e) => {
  2237. if (e.detail === Math.max(this.cfg.switchPoint, 3)) {
  2238. container.style.top = e.y + "px";
  2239. container.style.left = e.x + "px";
  2240. this.cfg.x = e.x;
  2241. this.cfg.y = e.y;
  2242. this.cfg.visual = "normal";
  2243. }
  2244. });
  2245. this.onConfigChange("visual", (curr) => visual(curr));
  2246. };
  2247. const renderBody = async (currentPanelName) => {
  2248. var _a;
  2249. for (const project of projects) {
  2250. for (const key in project.scripts) {
  2251. if (Object.prototype.hasOwnProperty.call(project.scripts, key)) {
  2252. const script = project.scripts[key];
  2253. if (isCurrentPanel(project.name, script, currentPanelName)) {
  2254. const panel2 = $creator.scriptPanel(script, {
  2255. projectName: project.name
  2256. });
  2257. script.projectName = project.name;
  2258. script.panel = panel2;
  2259. script.header = container.header;
  2260. container.body.replaceChildren(panel2);
  2261. (_a = script.onrender) == null ? void 0 : _a.call(script, { panel: panel2, header: container.header });
  2262. script.emit("render", { panel: panel2, header: container.header });
  2263. }
  2264. }
  2265. }
  2266. }
  2267. };
  2268. const initModalSystem = () => {
  2269. cors.on("modal", async ([type, _attrs]) => {
  2270. return new Promise((resolve, reject) => {
  2271. const attrs = _attrs;
  2272. attrs.onCancel = () => resolve("");
  2273. attrs.onConfirm = resolve;
  2274. attrs.onClose = resolve;
  2275. $modal(type, attrs);
  2276. });
  2277. });
  2278. };
  2279. const onFontsizeChange = () => {
  2280. container.style.font = `${this.cfg.fontsize}px Menlo, Monaco, Consolas, 'Courier New', monospace`;
  2281. };
  2282. const rerender = async (urls, currentPanelName) => {
  2283. initHeader(urls, currentPanelName);
  2284. await renderBody(currentPanelName);
  2285. };
  2286. if (matchedScripts.length !== 0 && self === top) {
  2287. $store.setTab($const.TAB_URLS, []);
  2288. container.append(el("style", {}, style || ""), $elements.messageContainer);
  2289. $elements.root.append(container);
  2290. document.body.children[$.random(0, document.body.children.length - 1)].after($elements.panel);
  2291. handleVisible();
  2292. visual(this.cfg.visual);
  2293. (async () => {
  2294. const urls = await $store.getTab($const.TAB_URLS);
  2295. const currentPanelName = await $store.getTab($const.TAB_CURRENT_PANEL_NAME);
  2296. await rerender(defaults2.urls(urls), defaults2.panelName(currentPanelName));
  2297. })();
  2298. initModalSystem();
  2299. handlePosition();
  2300. onFontsizeChange();
  2301. $store.addTabChangeListener(
  2302. $const.TAB_URLS,
  2303. debounce_1(async (urls) => {
  2304. const currentPanelName = await $store.getTab($const.TAB_CURRENT_PANEL_NAME);
  2305. rerender(defaults2.urls(urls), defaults2.panelName(currentPanelName));
  2306. }, 2e3)
  2307. );
  2308. $store.addTabChangeListener($const.TAB_CURRENT_PANEL_NAME, async (currentPanelName) => {
  2309. const urls = await $store.getTab($const.TAB_URLS) || [location.href];
  2310. rerender(defaults2.urls(urls), defaults2.panelName(currentPanelName));
  2311. });
  2312. this.onConfigChange("fontsize", onFontsizeChange);
  2313. }
  2314. }
  2315. });
  2316. function $modal(type, attrs) {
  2317. if (self === top) {
  2318. const {
  2319. maskCloseable = true,
  2320. onConfirm,
  2321. onCancel,
  2322. onClose,
  2323. notification: notify,
  2324. notificationOptions,
  2325. ..._attrs
  2326. } = attrs;
  2327. if (notify) {
  2328. $gm.notification(
  2329. typeof _attrs.content === "string" ? _attrs.content : _attrs.content.innerText,
  2330. notificationOptions
  2331. );
  2332. }
  2333. const wrapper = el("div", { className: "modal-wrapper" }, (wrapper2) => {
  2334. const modal = el("modal-element", {
  2335. async onConfirm(val) {
  2336. const isClose = await (onConfirm == null ? void 0 : onConfirm.apply(modal, [val]));
  2337. if (isClose !== false) {
  2338. wrapper2.remove();
  2339. }
  2340. return isClose;
  2341. },
  2342. onCancel() {
  2343. onCancel == null ? void 0 : onCancel.apply(modal);
  2344. wrapper2.remove();
  2345. },
  2346. onClose(val) {
  2347. onClose == null ? void 0 : onClose.apply(modal, [val]);
  2348. wrapper2.remove();
  2349. },
  2350. type,
  2351. ..._attrs
  2352. });
  2353. wrapper2.append(modal);
  2354. modal.addEventListener("click", (e) => {
  2355. e.stopPropagation();
  2356. });
  2357. if (maskCloseable) {
  2358. wrapper2.addEventListener("click", () => {
  2359. onClose == null ? void 0 : onClose.apply(modal);
  2360. wrapper2.remove();
  2361. });
  2362. }
  2363. });
  2364. $elements.root.append(wrapper);
  2365. return wrapper;
  2366. } else {
  2367. cors.emit("modal", [type, attrs], (args, remote) => {
  2368. var _a, _b, _c;
  2369. if (args) {
  2370. (_a = attrs.onConfirm) == null ? void 0 : _a.call(attrs, args);
  2371. } else {
  2372. (_b = attrs.onCancel) == null ? void 0 : _b.call(attrs);
  2373. }
  2374. (_c = attrs.onClose) == null ? void 0 : _c.call(attrs, args);
  2375. });
  2376. }
  2377. }
  2378. function $message(type, attrs) {
  2379. const message = el("message-element", { type, ...attrs });
  2380. $elements.messageContainer.append(message);
  2381. return message;
  2382. }
  2383. function isCurrentPanel(projectName, script, currentPanelName) {
  2384. return projectName + "-" + script.name === currentPanelName || script.namespace === currentPanelName;
  2385. }
  2386. function handleLowLevelBrowser() {
  2387. if (typeof Element.prototype.replaceChildren === "undefined") {
  2388. Element.prototype.replaceChildren = function(...nodes) {
  2389. this.innerHTML = "";
  2390. for (const node of nodes) {
  2391. this.append(node);
  2392. }
  2393. };
  2394. }
  2395. }
  2396. function defaultQuestionResolve(ctx) {
  2397. return {
  2398. async single(infos, options, handler) {
  2399. const allAnswer = infos.map((res) => res.results.map((res2) => splitAnswer(res2.answer)).flat()).flat();
  2400. const optionStrings = options.map((o) => removeRedundant(o.innerText));
  2401. const ratings = answerSimilar(allAnswer, optionStrings);
  2402. let index = -1;
  2403. let max = 0;
  2404. ratings.forEach((rating, i) => {
  2405. if (rating.rating > max) {
  2406. max = rating.rating;
  2407. index = i;
  2408. }
  2409. });
  2410. if (index !== -1 && max > 0.6) {
  2411. await handler("single", options[index].innerText, options[index], ctx);
  2412. await $.sleep(500);
  2413. return {
  2414. finish: true,
  2415. ratings: ratings.map((r) => r.rating)
  2416. };
  2417. }
  2418. for (const info of infos) {
  2419. for (const res of info.results) {
  2420. const ans = StringUtils.nowrap(res.answer).trim();
  2421. if (ans.length === 1 && isPlainAnswer(ans)) {
  2422. const index2 = ans.charCodeAt(0) - 65;
  2423. await handler("single", options[index2].innerText, options[index2], ctx);
  2424. await $.sleep(500);
  2425. return { finish: true, option: options[index2] };
  2426. }
  2427. }
  2428. }
  2429. return { finish: false, allAnswer, options: optionStrings, ratings };
  2430. },
  2431. async multiple(infos, options, handler) {
  2432. const targetAnswers = [];
  2433. const targetOptions = [];
  2434. const list = [];
  2435. const results = infos.map((info) => info.results).flat();
  2436. for (let i = 0; i < results.length; i++) {
  2437. const result = results[i];
  2438. const answers = splitAnswer(result.answer);
  2439. const matchResult = { options: [], answers: [], ratings: [], similarSum: 0, similarCount: 0 };
  2440. for (const option of options) {
  2441. const ans = answers.find(
  2442. (answer) => answer.includes(removeRedundant(option.textContent || option.innerText))
  2443. );
  2444. if (ans) {
  2445. matchResult.options.push(option);
  2446. matchResult.answers.push(ans);
  2447. matchResult.ratings.push(1);
  2448. matchResult.similarSum += 1;
  2449. matchResult.similarCount += 1;
  2450. }
  2451. }
  2452. const ratingResult = { options: [], answers: [], ratings: [], similarSum: 0, similarCount: 0 };
  2453. const ratings = answerSimilar(
  2454. answers,
  2455. options.map((o) => removeRedundant(o.innerText))
  2456. );
  2457. for (let j = 0; j < ratings.length; j++) {
  2458. const rating = ratings[j];
  2459. if (rating.rating > 0.6) {
  2460. ratingResult.options.push(options[j]);
  2461. ratingResult.answers.push(ratings[j].target);
  2462. ratingResult.ratings.push(ratings[j].rating);
  2463. ratingResult.similarSum += rating.rating;
  2464. ratingResult.similarCount += 1;
  2465. }
  2466. }
  2467. if (matchResult.similarSum > ratingResult.similarSum) {
  2468. list[i] = matchResult;
  2469. } else {
  2470. list[i] = ratingResult;
  2471. }
  2472. }
  2473. const match = list.filter((i) => i.similarCount !== 0).sort((a, b) => {
  2474. const bsc = b.similarCount * 100;
  2475. const asc = a.similarCount * 100;
  2476. const bss = b.similarSum;
  2477. const ass = a.similarSum;
  2478. return bsc + bss - asc + ass;
  2479. });
  2480. if (match[0]) {
  2481. for (let i = 0; i < match[0].options.length; i++) {
  2482. await handler("multiple", match[0].answers[i], match[0].options[i], ctx);
  2483. await $.sleep(500);
  2484. }
  2485. return { finish: true, match, targetOptions, targetAnswers };
  2486. } else {
  2487. const plainOptions = [];
  2488. for (const result of results) {
  2489. const ans = StringUtils.nowrap(result.answer).trim();
  2490. if (isPlainAnswer(ans)) {
  2491. for (const char of ans) {
  2492. const index = char.charCodeAt(0) - 65;
  2493. await handler("single", options[index].innerText, options[index], ctx);
  2494. await $.sleep(500);
  2495. plainOptions.push(options[index]);
  2496. }
  2497. }
  2498. }
  2499. if (plainOptions.length) {
  2500. return { finish: true, plainOptions };
  2501. } else {
  2502. return { finish: false };
  2503. }
  2504. }
  2505. },
  2506. async judgement(infos, options, handler) {
  2507. for (const answers of infos.map((info) => info.results.map((res) => res.answer))) {
  2508. let matches = function(target, options2) {
  2509. return options2.some((option) => RegExp(clearString(option, "\u221A", "\xD7")).test(clearString(target, "\u221A", "\xD7")));
  2510. };
  2511. const correctWords = ["\u662F", "\u5BF9", "\u6B63\u786E", "\u786E\u5B9A", "\u221A", "\u5BF9\u7684", "\u662F\u7684", "\u6B63\u786E\u7684", "true", "True", "yes", "1"];
  2512. const incorrectWords = [
  2513. "\u975E",
  2514. "\u5426",
  2515. "\u9519",
  2516. "\u9519\u8BEF",
  2517. "\xD7",
  2518. "X",
  2519. "\u9519\u7684",
  2520. "\u4E0D\u5BF9",
  2521. "\u4E0D\u6B63\u786E\u7684",
  2522. "\u4E0D\u6B63\u786E",
  2523. "\u4E0D\u662F",
  2524. "\u4E0D\u662F\u7684",
  2525. "false",
  2526. "False",
  2527. "no",
  2528. "0"
  2529. ];
  2530. const answerShowCorrect = answers.find((answer) => matches(answer, correctWords));
  2531. const answerShowIncorrect = answers.find((answer) => matches(answer, incorrectWords));
  2532. if (answerShowCorrect || answerShowIncorrect) {
  2533. let option;
  2534. for (const el2 of options) {
  2535. const textShowCorrect = matches(el2.innerText, correctWords);
  2536. const textShowIncorrect = matches(el2.innerText, incorrectWords);
  2537. if (answerShowCorrect && textShowCorrect) {
  2538. option = el2;
  2539. await handler("judgement", answerShowCorrect, el2, ctx);
  2540. await $.sleep(500);
  2541. break;
  2542. }
  2543. if (answerShowIncorrect && textShowIncorrect) {
  2544. option = el2;
  2545. await handler("judgement", answerShowIncorrect, el2, ctx);
  2546. await $.sleep(500);
  2547. break;
  2548. }
  2549. }
  2550. return { finish: true, option };
  2551. }
  2552. }
  2553. return { finish: false };
  2554. },
  2555. async completion(infos, options, handler) {
  2556. for (const answers of infos.map((info) => info.results.map((res) => res.answer))) {
  2557. let ans = answers.filter((ans2) => ans2);
  2558. if (ans.length === 1) {
  2559. ans = splitAnswer(ans[0]);
  2560. }
  2561. if (ans.length !== 0 && (ans.length === options.length || options.length === 1)) {
  2562. if (ans.length === options.length) {
  2563. for (let index = 0; index < options.length; index++) {
  2564. const element = options[index];
  2565. await handler("completion", ans[index], element, ctx);
  2566. await $.sleep(500);
  2567. }
  2568. return { finish: true };
  2569. } else if (options.length === 1) {
  2570. await handler("completion", ans.join(" "), options[0], ctx);
  2571. await $.sleep(500);
  2572. return { finish: true };
  2573. }
  2574. return { finish: false };
  2575. }
  2576. }
  2577. return { finish: false };
  2578. }
  2579. };
  2580. }
  2581. class OCSWorker extends CommonEventEmitter {
  2582. constructor(opts) {
  2583. super();
  2584. this.isRunning = false;
  2585. this.isClose = false;
  2586. this.isStop = false;
  2587. this.requestIndex = 0;
  2588. this.resolverIndex = 0;
  2589. this.totalQuestionCount = 0;
  2590. this.locks = [];
  2591. this.opts = opts;
  2592. }
  2593. async doWork() {
  2594. var _a, _b, _c, _d;
  2595. this.requestIndex = 0;
  2596. this.resolverIndex = 0;
  2597. this.totalQuestionCount = 0;
  2598. this.emit("start");
  2599. this.isRunning = true;
  2600. this.once("close", () => {
  2601. this.isClose = true;
  2602. });
  2603. this.on("stop", () => {
  2604. this.isStop = true;
  2605. });
  2606. this.on("continuate", () => {
  2607. this.isStop = false;
  2608. });
  2609. const questionRoots = typeof this.opts.root === "string" ? Array.from(document.querySelectorAll(this.opts.root)) : this.opts.root;
  2610. this.totalQuestionCount = questionRoots.length;
  2611. this.locks = Array(this.totalQuestionCount).fill(1);
  2612. const results = [];
  2613. if (questionRoots.length === 0) {
  2614. throw new Error("\u672A\u627E\u5230\u4EFB\u4F55\u9898\u76EE\uFF0C\u7B54\u9898\u7ED3\u675F\u3002");
  2615. }
  2616. for (const questionRoot of questionRoots) {
  2617. const ctx = {
  2618. searchInfos: [],
  2619. root: questionRoot,
  2620. elements: domSearchAll(this.opts.elements, questionRoot)
  2621. };
  2622. await ((_b = (_a = this.opts).onElementSearched) == null ? void 0 : _b.call(_a, ctx.elements, questionRoot));
  2623. ctx.elements.title = (_c = ctx.elements.title) == null ? void 0 : _c.filter(Boolean);
  2624. ctx.elements.options = (_d = ctx.elements.options) == null ? void 0 : _d.filter(Boolean);
  2625. results.push({
  2626. requesting: true,
  2627. resolving: true,
  2628. type: void 0,
  2629. ctx
  2630. });
  2631. }
  2632. const resolvers = [];
  2633. const requestThread = async () => {
  2634. var _a2, _b2, _c2;
  2635. while (this.locks.shift()) {
  2636. const i = this.requestIndex++;
  2637. const ctx = results[i].ctx || {};
  2638. if (this.isClose === true) {
  2639. this.isRunning = false;
  2640. return results;
  2641. }
  2642. let type;
  2643. let error;
  2644. try {
  2645. if (this.isStop) {
  2646. await waitForContinuate(() => this.isStop);
  2647. }
  2648. if (typeof this.opts.work === "object") {
  2649. type = this.opts.work.type === void 0 ? defaultWorkTypeResolver(ctx) : typeof this.opts.work.type === "string" ? this.opts.work.type : this.opts.work.type(ctx);
  2650. }
  2651. const searchInfos = await this.opts.answerer(ctx.elements, type, ctx);
  2652. let resultPromise;
  2653. searchInfos.forEach((info) => {
  2654. info.results = info.results.map((ans) => {
  2655. ans.answer = ans.answer ? ans.answer : "";
  2656. return ans;
  2657. });
  2658. });
  2659. ctx.searchInfos = searchInfos;
  2660. if (searchInfos.length === 0) {
  2661. error = "\u641C\u7D22\u4E0D\u5230\u7B54\u6848, \u8BF7\u91CD\u65B0\u8FD0\u884C, \u6216\u8005\u5FFD\u7565\u6B64\u9898\u3002";
  2662. }
  2663. if (typeof this.opts.work === "object") {
  2664. if (ctx.elements.options) {
  2665. if (type) {
  2666. const resolver = defaultQuestionResolve(ctx)[type];
  2667. const handler = this.opts.work.handler;
  2668. resultPromise = async () => await resolver(searchInfos, ctx.elements.options, handler);
  2669. } else {
  2670. error = "\u9898\u76EE\u7C7B\u578B\u89E3\u6790\u5931\u8D25, \u8BF7\u81EA\u884C\u63D0\u4F9B\u89E3\u6790\u5668, \u6216\u8005\u5FFD\u7565\u6B64\u9898\u3002";
  2671. }
  2672. } else {
  2673. 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";
  2674. }
  2675. } else {
  2676. const work2 = this.opts.work;
  2677. resultPromise = async () => await work2(ctx);
  2678. }
  2679. if (resultPromise) {
  2680. resolvers.push({
  2681. func: resultPromise,
  2682. index: i
  2683. });
  2684. } else {
  2685. resolvers.push({
  2686. func: async () => ({ finish: false }),
  2687. index: i
  2688. });
  2689. }
  2690. } catch (err) {
  2691. resolvers.push({
  2692. func: async () => ({ finish: false }),
  2693. index: i
  2694. });
  2695. if (err instanceof Error) {
  2696. error = err.message;
  2697. } else {
  2698. error = String(err);
  2699. }
  2700. }
  2701. const currentResult = {
  2702. requesting: false,
  2703. resolving: true,
  2704. ctx,
  2705. error,
  2706. type
  2707. };
  2708. results[i] = currentResult;
  2709. await ((_b2 = (_a2 = this.opts).onResultsUpdate) == null ? void 0 : _b2.call(_a2, results, currentResult));
  2710. await $.sleep(((_c2 = this.opts.requestPeriod) != null ? _c2 : 3) * 1e3);
  2711. }
  2712. };
  2713. const resolverThread = new Promise((resolve) => {
  2714. const start2 = async () => {
  2715. var _a2, _b2, _c2, _d2;
  2716. if (this.isClose === true) {
  2717. this.isRunning = false;
  2718. return;
  2719. }
  2720. if (this.isStop) {
  2721. await waitForContinuate(() => this.isStop);
  2722. }
  2723. if (this.resolverIndex < this.totalQuestionCount) {
  2724. const resolver = resolvers.shift();
  2725. if (resolver) {
  2726. this.resolverIndex++;
  2727. try {
  2728. const result = await resolver.func();
  2729. results[resolver.index].result = result;
  2730. results[resolver.index].resolving = false;
  2731. await ((_b2 = (_a2 = this.opts).onResultsUpdate) == null ? void 0 : _b2.call(_a2, results, results[resolver.index]));
  2732. await ((_d2 = (_c2 = this.opts).onResolveUpdate) == null ? void 0 : _d2.call(_c2, results[resolver.index]));
  2733. } catch (e) {
  2734. results[resolver.index].result = { finish: false };
  2735. results[resolver.index].resolving = false;
  2736. results[resolver.index].error = (e == null ? void 0 : e.message) || e;
  2737. }
  2738. loop();
  2739. } else {
  2740. loop();
  2741. }
  2742. } else {
  2743. resolve();
  2744. }
  2745. };
  2746. const loop = async () => {
  2747. var _a2;
  2748. setTimeout(start2, ((_a2 = this.opts.resolvePeriod) != null ? _a2 : 0) * 1e3);
  2749. };
  2750. start2();
  2751. });
  2752. await Promise.all([
  2753. ...Array(Math.max(this.opts.thread || 1, 1)).fill("").map(() => requestThread()),
  2754. resolverThread
  2755. ]);
  2756. this.isRunning = false;
  2757. return results;
  2758. }
  2759. async uploadHandler(options) {
  2760. var _a;
  2761. const { results, type, callback } = options;
  2762. let finished = 0;
  2763. for (const result of results) {
  2764. if ((_a = result.result) == null ? void 0 : _a.finish) {
  2765. finished++;
  2766. }
  2767. }
  2768. const rate = results.length === 0 ? 0 : finished / results.length * 100;
  2769. if (type !== "nomove") {
  2770. if (type === "force") {
  2771. await callback(rate, true);
  2772. } else {
  2773. await callback(rate, type === "save" ? false : rate >= parseFloat(type.toString()));
  2774. }
  2775. }
  2776. }
  2777. }
  2778. async function waitForContinuate(isStopping) {
  2779. if (isStopping()) {
  2780. await new Promise((resolve, reject) => {
  2781. const interval = setInterval(() => {
  2782. if (isStopping() === false) {
  2783. clearInterval(interval);
  2784. resolve();
  2785. }
  2786. }, 200);
  2787. });
  2788. }
  2789. }
  2790. async function defaultAnswerWrapperHandler(answererWrappers, env) {
  2791. const searchInfos = [];
  2792. const temp = JSON.parse(JSON.stringify(answererWrappers));
  2793. if (temp.length === 0) {
  2794. throw new Error("\u9898\u5E93\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u914D\u7F6E\u540E\u91CD\u65B0\u5F00\u59CB\u81EA\u52A8\u7B54\u9898\u3002");
  2795. }
  2796. await Promise.all(
  2797. temp.map(async (wrapper) => {
  2798. const {
  2799. name = "\u672A\u77E5\u9898\u5E93",
  2800. homepage = "#",
  2801. method = "get",
  2802. type = "fetch",
  2803. contentType = "json",
  2804. headers = {},
  2805. data: wrapperData = {},
  2806. handler = "return (res)=> [JSON.stringify(res), undefined]"
  2807. } = wrapper;
  2808. try {
  2809. let results = [];
  2810. let requestData;
  2811. let url;
  2812. if (method === "get") {
  2813. url = new URL(resolvePlaceHolder(wrapper.url, { encodeURI: true }));
  2814. Object.keys(wrapperData).forEach((key) => {
  2815. url.searchParams.set(key, resolvePlaceHolder(wrapperData[key.toString()]));
  2816. });
  2817. requestData = {};
  2818. } else if (method === "post") {
  2819. url = new URL(wrapper.url);
  2820. const data = /* @__PURE__ */ Object.create({});
  2821. Object.keys(wrapperData).forEach((key) => {
  2822. Reflect.set(data, key, resolvePlaceHolder(wrapperData[key]));
  2823. });
  2824. requestData = data;
  2825. } else {
  2826. throw new Error("\u4E0D\u652F\u6301\u7684\u8BF7\u6C42\u65B9\u5F0F");
  2827. }
  2828. const responseData = await Promise.race([
  2829. request(url.toString(), {
  2830. method,
  2831. responseType: contentType,
  2832. data: requestData,
  2833. type,
  2834. headers: JSON.parse(JSON.stringify(headers || {}))
  2835. }),
  2836. $.sleep(30 * 1e3)
  2837. ]);
  2838. if (responseData === void 0) {
  2839. throw new Error("\u9898\u5E93\u8FDE\u63A5\u8D85\u65F6\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u6216\u8005\u91CD\u8BD5\u3002");
  2840. }
  2841. const info = Function(handler)()(responseData);
  2842. if (info && Array.isArray(info)) {
  2843. if (info.every((item) => Array.isArray(item))) {
  2844. results = results.concat(
  2845. info.map((item) => ({
  2846. question: item[0],
  2847. answer: item[1]
  2848. }))
  2849. );
  2850. } else {
  2851. results.push({
  2852. question: info[0],
  2853. answer: info[1]
  2854. });
  2855. }
  2856. }
  2857. searchInfos.push({
  2858. url: wrapper.url,
  2859. name,
  2860. homepage,
  2861. results,
  2862. response: responseData,
  2863. data: requestData
  2864. });
  2865. } catch (error) {
  2866. searchInfos.push({
  2867. url: wrapper.url,
  2868. name,
  2869. homepage,
  2870. results: [],
  2871. response: void 0,
  2872. data: void 0,
  2873. error: (error == null ? void 0 : error.message) || "\u9898\u5E93\u8FDE\u63A5\u5931\u8D25"
  2874. });
  2875. }
  2876. })
  2877. );
  2878. function resolvePlaceHolder(str, options) {
  2879. if (typeof str === "string") {
  2880. const matches = str.match(/\${(.*?)}/g) || [];
  2881. matches.forEach((placeHolder) => {
  2882. const value = env[placeHolder.replace(/\${(.*)}/, "$1")];
  2883. str = str.replace(placeHolder, (options == null ? void 0 : options.encodeURI) ? encodeURIComponent(value) : value);
  2884. });
  2885. }
  2886. return str;
  2887. }
  2888. return searchInfos;
  2889. }
  2890. class AnswerWrapperParser {
  2891. static fromObject(json) {
  2892. const aw = json;
  2893. if (aw && Array.isArray(aw)) {
  2894. if (aw.length) {
  2895. for (let i = 0; i < aw.length; i++) {
  2896. const item = aw[i];
  2897. if (typeof item.name !== "string") {
  2898. throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 \u540D\u5B57(name) \u4E3A\u7A7A`);
  2899. }
  2900. if (typeof item.url !== "string") {
  2901. throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 \u63A5\u53E3\u5730\u5740(url) \u4E3A\u7A7A`);
  2902. }
  2903. if (typeof item.handler !== "string") {
  2904. throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 \u89E3\u6790\u5668(handler) \u4E3A\u7A7A`);
  2905. }
  2906. if (item.headers && typeof item.headers !== "object") {
  2907. throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 \u5934\u90E8\u4FE1\u606F(header) \u5E94\u4E3A \u5BF9\u8C61 \u683C\u5F0F`);
  2908. }
  2909. if (item.data && typeof item.data !== "object") {
  2910. throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 \u63D0\u4EA4\u6570\u636E(data) \u5E94\u4E3A \u5BF9\u8C61 \u683C\u5F0F`);
  2911. }
  2912. const contentTypes = ["json", "text"];
  2913. if (item.contentType && contentTypes.every((i2) => i2 !== item.contentType)) {
  2914. throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 contentType \u5FC5\u987B\u4E3A\u4EE5\u4E0B\u9009\u9879\u4E2D\u7684\u4E00\u4E2A ${contentTypes.join(", ")}`);
  2915. }
  2916. const methods = ["post", "get"];
  2917. if (item.method && methods.every((i2) => i2 !== item.method)) {
  2918. throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 method \u5FC5\u987B\u4E3A\u4EE5\u4E0B\u9009\u9879\u4E2D\u7684\u4E00\u4E2A ${methods.join(", ")}`);
  2919. }
  2920. const types = ["fetch", "GM_xmlhttpRequest"];
  2921. if (item.type && types.every((i2) => i2 !== item.type)) {
  2922. throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 type \u5FC5\u987B\u4E3A\u4EE5\u4E0B\u9009\u9879\u4E2D\u7684\u4E00\u4E2A ${types.join(", ")}`);
  2923. }
  2924. }
  2925. return aw;
  2926. } else {
  2927. throw new Error("\u9898\u5E93\u4E3A\u7A7A\uFF01");
  2928. }
  2929. } else {
  2930. throw new Error("\u9898\u5E93\u914D\u7F6E\u683C\u5F0F\u9519\u8BEF\uFF01");
  2931. }
  2932. }
  2933. static fromJSONString(json) {
  2934. const raw = json.toString();
  2935. try {
  2936. return JSON.parse(raw);
  2937. } catch {
  2938. throw new Error(`\u683C\u5F0F\u9519\u8BEF\uFF0C\u5FC5\u987B\u4E3A\uFF1Ajson\u5B57\u7B26\u4E32 \u6216 \u9898\u5E93\u914D\u7F6E\u94FE\u63A5`);
  2939. }
  2940. }
  2941. static async fromURL(url) {
  2942. const text = await request(url, {
  2943. responseType: "text",
  2944. method: "get",
  2945. type: "fetch"
  2946. });
  2947. return this.fromJSONString(text);
  2948. }
  2949. static fromBase64(base64) {
  2950. return this.fromJSONString(Buffer.from(base64, "base64").toString("utf8"));
  2951. }
  2952. static from(value) {
  2953. if (typeof value === "string") {
  2954. if (value.startsWith("http")) {
  2955. return this.fromURL(value);
  2956. } else {
  2957. return this.fromJSONString(value);
  2958. }
  2959. } else {
  2960. return this.fromObject(value);
  2961. }
  2962. }
  2963. }
  2964. class Project {
  2965. constructor({ name, domains, scripts, studyProject }) {
  2966. this.name = name;
  2967. this.domains = domains;
  2968. this.scripts = scripts;
  2969. this.studyProject = studyProject;
  2970. }
  2971. static create(opts) {
  2972. return new Project(opts);
  2973. }
  2974. }
  2975. function getDefaults() {
  2976. return {
  2977. async: false,
  2978. baseUrl: null,
  2979. breaks: false,
  2980. extensions: null,
  2981. gfm: true,
  2982. headerIds: true,
  2983. headerPrefix: "",
  2984. highlight: null,
  2985. hooks: null,
  2986. langPrefix: "language-",
  2987. mangle: true,
  2988. pedantic: false,
  2989. renderer: null,
  2990. sanitize: false,
  2991. sanitizer: null,
  2992. silent: false,
  2993. smartypants: false,
  2994. tokenizer: null,
  2995. walkTokens: null,
  2996. xhtml: false
  2997. };
  2998. }
  2999. let defaults = getDefaults();
  3000. function changeDefaults(newDefaults) {
  3001. defaults = newDefaults;
  3002. }
  3003. const escapeTest = /[&<>"']/;
  3004. const escapeReplace = new RegExp(escapeTest.source, "g");
  3005. const escapeTestNoEncode = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/;
  3006. const escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, "g");
  3007. const escapeReplacements = {
  3008. "&": "&amp;",
  3009. "<": "&lt;",
  3010. ">": "&gt;",
  3011. '"': "&quot;",
  3012. "'": "&#39;"
  3013. };
  3014. const getEscapeReplacement = (ch) => escapeReplacements[ch];
  3015. function escape$1(html, encode) {
  3016. if (encode) {
  3017. if (escapeTest.test(html)) {
  3018. return html.replace(escapeReplace, getEscapeReplacement);
  3019. }
  3020. } else {
  3021. if (escapeTestNoEncode.test(html)) {
  3022. return html.replace(escapeReplaceNoEncode, getEscapeReplacement);
  3023. }
  3024. }
  3025. return html;
  3026. }
  3027. const unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;
  3028. function unescape$1(html) {
  3029. return html.replace(unescapeTest, (_, n) => {
  3030. n = n.toLowerCase();
  3031. if (n === "colon")
  3032. return ":";
  3033. if (n.charAt(0) === "#") {
  3034. return n.charAt(1) === "x" ? String.fromCharCode(parseInt(n.substring(2), 16)) : String.fromCharCode(+n.substring(1));
  3035. }
  3036. return "";
  3037. });
  3038. }
  3039. const caret = /(^|[^\[])\^/g;
  3040. function edit(regex, opt) {
  3041. regex = typeof regex === "string" ? regex : regex.source;
  3042. opt = opt || "";
  3043. const obj = {
  3044. replace: (name, val) => {
  3045. val = val.source || val;
  3046. val = val.replace(caret, "$1");
  3047. regex = regex.replace(name, val);
  3048. return obj;
  3049. },
  3050. getRegex: () => {
  3051. return new RegExp(regex, opt);
  3052. }
  3053. };
  3054. return obj;
  3055. }
  3056. const nonWordAndColonTest = /[^\w:]/g;
  3057. const originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
  3058. function cleanUrl(sanitize, base, href) {
  3059. if (sanitize) {
  3060. let prot;
  3061. try {
  3062. prot = decodeURIComponent(unescape$1(href)).replace(nonWordAndColonTest, "").toLowerCase();
  3063. } catch (e) {
  3064. return null;
  3065. }
  3066. if (prot.indexOf("javascript:") === 0 || prot.indexOf("vbscript:") === 0 || prot.indexOf("data:") === 0) {
  3067. return null;
  3068. }
  3069. }
  3070. if (base && !originIndependentUrl.test(href)) {
  3071. href = resolveUrl(base, href);
  3072. }
  3073. try {
  3074. href = encodeURI(href).replace(/%25/g, "%");
  3075. } catch (e) {
  3076. return null;
  3077. }
  3078. return href;
  3079. }
  3080. const baseUrls = {};
  3081. const justDomain = /^[^:]+:\/*[^/]*$/;
  3082. const protocol = /^([^:]+:)[\s\S]*$/;
  3083. const domain = /^([^:]+:\/*[^/]*)[\s\S]*$/;
  3084. function resolveUrl(base, href) {
  3085. if (!baseUrls[" " + base]) {
  3086. if (justDomain.test(base)) {
  3087. baseUrls[" " + base] = base + "/";
  3088. } else {
  3089. baseUrls[" " + base] = rtrim(base, "/", true);
  3090. }
  3091. }
  3092. base = baseUrls[" " + base];
  3093. const relativeBase = base.indexOf(":") === -1;
  3094. if (href.substring(0, 2) === "//") {
  3095. if (relativeBase) {
  3096. return href;
  3097. }
  3098. return base.replace(protocol, "$1") + href;
  3099. } else if (href.charAt(0) === "/") {
  3100. if (relativeBase) {
  3101. return href;
  3102. }
  3103. return base.replace(domain, "$1") + href;
  3104. } else {
  3105. return base + href;
  3106. }
  3107. }
  3108. const noopTest = { exec: function noopTest2() {
  3109. } };
  3110. function splitCells(tableRow, count) {
  3111. const row = tableRow.replace(/\|/g, (match, offset, str) => {
  3112. let escaped = false, curr = offset;
  3113. while (--curr >= 0 && str[curr] === "\\")
  3114. escaped = !escaped;
  3115. if (escaped) {
  3116. return "|";
  3117. } else {
  3118. return " |";
  3119. }
  3120. }), cells = row.split(/ \|/);
  3121. let i = 0;
  3122. if (!cells[0].trim()) {
  3123. cells.shift();
  3124. }
  3125. if (cells.length > 0 && !cells[cells.length - 1].trim()) {
  3126. cells.pop();
  3127. }
  3128. if (cells.length > count) {
  3129. cells.splice(count);
  3130. } else {
  3131. while (cells.length < count)
  3132. cells.push("");
  3133. }
  3134. for (; i < cells.length; i++) {
  3135. cells[i] = cells[i].trim().replace(/\\\|/g, "|");
  3136. }
  3137. return cells;
  3138. }
  3139. function rtrim(str, c, invert) {
  3140. const l = str.length;
  3141. if (l === 0) {
  3142. return "";
  3143. }
  3144. let suffLen = 0;
  3145. while (suffLen < l) {
  3146. const currChar = str.charAt(l - suffLen - 1);
  3147. if (currChar === c && !invert) {
  3148. suffLen++;
  3149. } else if (currChar !== c && invert) {
  3150. suffLen++;
  3151. } else {
  3152. break;
  3153. }
  3154. }
  3155. return str.slice(0, l - suffLen);
  3156. }
  3157. function findClosingBracket(str, b) {
  3158. if (str.indexOf(b[1]) === -1) {
  3159. return -1;
  3160. }
  3161. const l = str.length;
  3162. let level = 0, i = 0;
  3163. for (; i < l; i++) {
  3164. if (str[i] === "\\") {
  3165. i++;
  3166. } else if (str[i] === b[0]) {
  3167. level++;
  3168. } else if (str[i] === b[1]) {
  3169. level--;
  3170. if (level < 0) {
  3171. return i;
  3172. }
  3173. }
  3174. }
  3175. return -1;
  3176. }
  3177. function checkSanitizeDeprecation(opt) {
  3178. if (opt && opt.sanitize && !opt.silent) {
  3179. 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");
  3180. }
  3181. }
  3182. function repeatString(pattern, count) {
  3183. if (count < 1) {
  3184. return "";
  3185. }
  3186. let result = "";
  3187. while (count > 1) {
  3188. if (count & 1) {
  3189. result += pattern;
  3190. }
  3191. count >>= 1;
  3192. pattern += pattern;
  3193. }
  3194. return result + pattern;
  3195. }
  3196. function outputLink(cap, link, raw, lexer) {
  3197. const href = link.href;
  3198. const title = link.title ? escape$1(link.title) : null;
  3199. const text = cap[1].replace(/\\([\[\]])/g, "$1");
  3200. if (cap[0].charAt(0) !== "!") {
  3201. lexer.state.inLink = true;
  3202. const token = {
  3203. type: "link",
  3204. raw,
  3205. href,
  3206. title,
  3207. text,
  3208. tokens: lexer.inlineTokens(text)
  3209. };
  3210. lexer.state.inLink = false;
  3211. return token;
  3212. }
  3213. return {
  3214. type: "image",
  3215. raw,
  3216. href,
  3217. title,
  3218. text: escape$1(text)
  3219. };
  3220. }
  3221. function indentCodeCompensation(raw, text) {
  3222. const matchIndentToCode = raw.match(/^(\s+)(?:```)/);
  3223. if (matchIndentToCode === null) {
  3224. return text;
  3225. }
  3226. const indentToCode = matchIndentToCode[1];
  3227. return text.split("\n").map((node) => {
  3228. const matchIndentInNode = node.match(/^\s+/);
  3229. if (matchIndentInNode === null) {
  3230. return node;
  3231. }
  3232. const [indentInNode] = matchIndentInNode;
  3233. if (indentInNode.length >= indentToCode.length) {
  3234. return node.slice(indentToCode.length);
  3235. }
  3236. return node;
  3237. }).join("\n");
  3238. }
  3239. class Tokenizer {
  3240. constructor(options) {
  3241. this.options = options || defaults;
  3242. }
  3243. space(src2) {
  3244. const cap = this.rules.block.newline.exec(src2);
  3245. if (cap && cap[0].length > 0) {
  3246. return {
  3247. type: "space",
  3248. raw: cap[0]
  3249. };
  3250. }
  3251. }
  3252. code(src2) {
  3253. const cap = this.rules.block.code.exec(src2);
  3254. if (cap) {
  3255. const text = cap[0].replace(/^ {1,4}/gm, "");
  3256. return {
  3257. type: "code",
  3258. raw: cap[0],
  3259. codeBlockStyle: "indented",
  3260. text: !this.options.pedantic ? rtrim(text, "\n") : text
  3261. };
  3262. }
  3263. }
  3264. fences(src2) {
  3265. const cap = this.rules.block.fences.exec(src2);
  3266. if (cap) {
  3267. const raw = cap[0];
  3268. const text = indentCodeCompensation(raw, cap[3] || "");
  3269. return {
  3270. type: "code",
  3271. raw,
  3272. lang: cap[2] ? cap[2].trim().replace(this.rules.inline._escapes, "$1") : cap[2],
  3273. text
  3274. };
  3275. }
  3276. }
  3277. heading(src2) {
  3278. const cap = this.rules.block.heading.exec(src2);
  3279. if (cap) {
  3280. let text = cap[2].trim();
  3281. if (/#$/.test(text)) {
  3282. const trimmed = rtrim(text, "#");
  3283. if (this.options.pedantic) {
  3284. text = trimmed.trim();
  3285. } else if (!trimmed || / $/.test(trimmed)) {
  3286. text = trimmed.trim();
  3287. }
  3288. }
  3289. return {
  3290. type: "heading",
  3291. raw: cap[0],
  3292. depth: cap[1].length,
  3293. text,
  3294. tokens: this.lexer.inline(text)
  3295. };
  3296. }
  3297. }
  3298. hr(src2) {
  3299. const cap = this.rules.block.hr.exec(src2);
  3300. if (cap) {
  3301. return {
  3302. type: "hr",
  3303. raw: cap[0]
  3304. };
  3305. }
  3306. }
  3307. blockquote(src2) {
  3308. const cap = this.rules.block.blockquote.exec(src2);
  3309. if (cap) {
  3310. const text = cap[0].replace(/^ *>[ \t]?/gm, "");
  3311. const top2 = this.lexer.state.top;
  3312. this.lexer.state.top = true;
  3313. const tokens = this.lexer.blockTokens(text);
  3314. this.lexer.state.top = top2;
  3315. return {
  3316. type: "blockquote",
  3317. raw: cap[0],
  3318. tokens,
  3319. text
  3320. };
  3321. }
  3322. }
  3323. list(src2) {
  3324. let cap = this.rules.block.list.exec(src2);
  3325. if (cap) {
  3326. let raw, istask, ischecked, indent, i, blankLine, endsWithBlankLine, line, nextLine, rawLine, itemContents, endEarly;
  3327. let bull = cap[1].trim();
  3328. const isordered = bull.length > 1;
  3329. const list = {
  3330. type: "list",
  3331. raw: "",
  3332. ordered: isordered,
  3333. start: isordered ? +bull.slice(0, -1) : "",
  3334. loose: false,
  3335. items: []
  3336. };
  3337. bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`;
  3338. if (this.options.pedantic) {
  3339. bull = isordered ? bull : "[*+-]";
  3340. }
  3341. const itemRegex = new RegExp(`^( {0,3}${bull})((?:[ ][^\\n]*)?(?:\\n|$))`);
  3342. while (src2) {
  3343. endEarly = false;
  3344. if (!(cap = itemRegex.exec(src2))) {
  3345. break;
  3346. }
  3347. if (this.rules.block.hr.test(src2)) {
  3348. break;
  3349. }
  3350. raw = cap[0];
  3351. src2 = src2.substring(raw.length);
  3352. line = cap[2].split("\n", 1)[0].replace(/^\t+/, (t2) => " ".repeat(3 * t2.length));
  3353. nextLine = src2.split("\n", 1)[0];
  3354. if (this.options.pedantic) {
  3355. indent = 2;
  3356. itemContents = line.trimLeft();
  3357. } else {
  3358. indent = cap[2].search(/[^ ]/);
  3359. indent = indent > 4 ? 1 : indent;
  3360. itemContents = line.slice(indent);
  3361. indent += cap[1].length;
  3362. }
  3363. blankLine = false;
  3364. if (!line && /^ *$/.test(nextLine)) {
  3365. raw += nextLine + "\n";
  3366. src2 = src2.substring(nextLine.length + 1);
  3367. endEarly = true;
  3368. }
  3369. if (!endEarly) {
  3370. const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`);
  3371. const hrRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`);
  3372. const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\`\`\`|~~~)`);
  3373. const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`);
  3374. while (src2) {
  3375. rawLine = src2.split("\n", 1)[0];
  3376. nextLine = rawLine;
  3377. if (this.options.pedantic) {
  3378. nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, " ");
  3379. }
  3380. if (fencesBeginRegex.test(nextLine)) {
  3381. break;
  3382. }
  3383. if (headingBeginRegex.test(nextLine)) {
  3384. break;
  3385. }
  3386. if (nextBulletRegex.test(nextLine)) {
  3387. break;
  3388. }
  3389. if (hrRegex.test(src2)) {
  3390. break;
  3391. }
  3392. if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) {
  3393. itemContents += "\n" + nextLine.slice(indent);
  3394. } else {
  3395. if (blankLine) {
  3396. break;
  3397. }
  3398. if (line.search(/[^ ]/) >= 4) {
  3399. break;
  3400. }
  3401. if (fencesBeginRegex.test(line)) {
  3402. break;
  3403. }
  3404. if (headingBeginRegex.test(line)) {
  3405. break;
  3406. }
  3407. if (hrRegex.test(line)) {
  3408. break;
  3409. }
  3410. itemContents += "\n" + nextLine;
  3411. }
  3412. if (!blankLine && !nextLine.trim()) {
  3413. blankLine = true;
  3414. }
  3415. raw += rawLine + "\n";
  3416. src2 = src2.substring(rawLine.length + 1);
  3417. line = nextLine.slice(indent);
  3418. }
  3419. }
  3420. if (!list.loose) {
  3421. if (endsWithBlankLine) {
  3422. list.loose = true;
  3423. } else if (/\n *\n *$/.test(raw)) {
  3424. endsWithBlankLine = true;
  3425. }
  3426. }
  3427. if (this.options.gfm) {
  3428. istask = /^\[[ xX]\] /.exec(itemContents);
  3429. if (istask) {
  3430. ischecked = istask[0] !== "[ ] ";
  3431. itemContents = itemContents.replace(/^\[[ xX]\] +/, "");
  3432. }
  3433. }
  3434. list.items.push({
  3435. type: "list_item",
  3436. raw,
  3437. task: !!istask,
  3438. checked: ischecked,
  3439. loose: false,
  3440. text: itemContents
  3441. });
  3442. list.raw += raw;
  3443. }
  3444. list.items[list.items.length - 1].raw = raw.trimRight();
  3445. list.items[list.items.length - 1].text = itemContents.trimRight();
  3446. list.raw = list.raw.trimRight();
  3447. const l = list.items.length;
  3448. for (i = 0; i < l; i++) {
  3449. this.lexer.state.top = false;
  3450. list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);
  3451. if (!list.loose) {
  3452. const spacers = list.items[i].tokens.filter((t2) => t2.type === "space");
  3453. const hasMultipleLineBreaks = spacers.length > 0 && spacers.some((t2) => /\n.*\n/.test(t2.raw));
  3454. list.loose = hasMultipleLineBreaks;
  3455. }
  3456. }
  3457. if (list.loose) {
  3458. for (i = 0; i < l; i++) {
  3459. list.items[i].loose = true;
  3460. }
  3461. }
  3462. return list;
  3463. }
  3464. }
  3465. html(src2) {
  3466. const cap = this.rules.block.html.exec(src2);
  3467. if (cap) {
  3468. const token = {
  3469. type: "html",
  3470. raw: cap[0],
  3471. pre: !this.options.sanitizer && (cap[1] === "pre" || cap[1] === "script" || cap[1] === "style"),
  3472. text: cap[0]
  3473. };
  3474. if (this.options.sanitize) {
  3475. const text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$1(cap[0]);
  3476. token.type = "paragraph";
  3477. token.text = text;
  3478. token.tokens = this.lexer.inline(text);
  3479. }
  3480. return token;
  3481. }
  3482. }
  3483. def(src2) {
  3484. const cap = this.rules.block.def.exec(src2);
  3485. if (cap) {
  3486. const tag = cap[1].toLowerCase().replace(/\s+/g, " ");
  3487. const href = cap[2] ? cap[2].replace(/^<(.*)>$/, "$1").replace(this.rules.inline._escapes, "$1") : "";
  3488. const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline._escapes, "$1") : cap[3];
  3489. return {
  3490. type: "def",
  3491. tag,
  3492. raw: cap[0],
  3493. href,
  3494. title
  3495. };
  3496. }
  3497. }
  3498. table(src2) {
  3499. const cap = this.rules.block.table.exec(src2);
  3500. if (cap) {
  3501. const item = {
  3502. type: "table",
  3503. header: splitCells(cap[1]).map((c) => {
  3504. return { text: c };
  3505. }),
  3506. align: cap[2].replace(/^ *|\| *$/g, "").split(/ *\| */),
  3507. rows: cap[3] && cap[3].trim() ? cap[3].replace(/\n[ \t]*$/, "").split("\n") : []
  3508. };
  3509. if (item.header.length === item.align.length) {
  3510. item.raw = cap[0];
  3511. let l = item.align.length;
  3512. let i, j, k, row;
  3513. for (i = 0; i < l; i++) {
  3514. if (/^ *-+: *$/.test(item.align[i])) {
  3515. item.align[i] = "right";
  3516. } else if (/^ *:-+: *$/.test(item.align[i])) {
  3517. item.align[i] = "center";
  3518. } else if (/^ *:-+ *$/.test(item.align[i])) {
  3519. item.align[i] = "left";
  3520. } else {
  3521. item.align[i] = null;
  3522. }
  3523. }
  3524. l = item.rows.length;
  3525. for (i = 0; i < l; i++) {
  3526. item.rows[i] = splitCells(item.rows[i], item.header.length).map((c) => {
  3527. return { text: c };
  3528. });
  3529. }
  3530. l = item.header.length;
  3531. for (j = 0; j < l; j++) {
  3532. item.header[j].tokens = this.lexer.inline(item.header[j].text);
  3533. }
  3534. l = item.rows.length;
  3535. for (j = 0; j < l; j++) {
  3536. row = item.rows[j];
  3537. for (k = 0; k < row.length; k++) {
  3538. row[k].tokens = this.lexer.inline(row[k].text);
  3539. }
  3540. }
  3541. return item;
  3542. }
  3543. }
  3544. }
  3545. lheading(src2) {
  3546. const cap = this.rules.block.lheading.exec(src2);
  3547. if (cap) {
  3548. return {
  3549. type: "heading",
  3550. raw: cap[0],
  3551. depth: cap[2].charAt(0) === "=" ? 1 : 2,
  3552. text: cap[1],
  3553. tokens: this.lexer.inline(cap[1])
  3554. };
  3555. }
  3556. }
  3557. paragraph(src2) {
  3558. const cap = this.rules.block.paragraph.exec(src2);
  3559. if (cap) {
  3560. const text = cap[1].charAt(cap[1].length - 1) === "\n" ? cap[1].slice(0, -1) : cap[1];
  3561. return {
  3562. type: "paragraph",
  3563. raw: cap[0],
  3564. text,
  3565. tokens: this.lexer.inline(text)
  3566. };
  3567. }
  3568. }
  3569. text(src2) {
  3570. const cap = this.rules.block.text.exec(src2);
  3571. if (cap) {
  3572. return {
  3573. type: "text",
  3574. raw: cap[0],
  3575. text: cap[0],
  3576. tokens: this.lexer.inline(cap[0])
  3577. };
  3578. }
  3579. }
  3580. escape(src2) {
  3581. const cap = this.rules.inline.escape.exec(src2);
  3582. if (cap) {
  3583. return {
  3584. type: "escape",
  3585. raw: cap[0],
  3586. text: escape$1(cap[1])
  3587. };
  3588. }
  3589. }
  3590. tag(src2) {
  3591. const cap = this.rules.inline.tag.exec(src2);
  3592. if (cap) {
  3593. if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {
  3594. this.lexer.state.inLink = true;
  3595. } else if (this.lexer.state.inLink && /^<\/a>/i.test(cap[0])) {
  3596. this.lexer.state.inLink = false;
  3597. }
  3598. if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
  3599. this.lexer.state.inRawBlock = true;
  3600. } else if (this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
  3601. this.lexer.state.inRawBlock = false;
  3602. }
  3603. return {
  3604. type: this.options.sanitize ? "text" : "html",
  3605. raw: cap[0],
  3606. inLink: this.lexer.state.inLink,
  3607. inRawBlock: this.lexer.state.inRawBlock,
  3608. text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$1(cap[0]) : cap[0]
  3609. };
  3610. }
  3611. }
  3612. link(src2) {
  3613. const cap = this.rules.inline.link.exec(src2);
  3614. if (cap) {
  3615. const trimmedUrl = cap[2].trim();
  3616. if (!this.options.pedantic && /^</.test(trimmedUrl)) {
  3617. if (!/>$/.test(trimmedUrl)) {
  3618. return;
  3619. }
  3620. const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), "\\");
  3621. if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {
  3622. return;
  3623. }
  3624. } else {
  3625. const lastParenIndex = findClosingBracket(cap[2], "()");
  3626. if (lastParenIndex > -1) {
  3627. const start2 = cap[0].indexOf("!") === 0 ? 5 : 4;
  3628. const linkLen = start2 + cap[1].length + lastParenIndex;
  3629. cap[2] = cap[2].substring(0, lastParenIndex);
  3630. cap[0] = cap[0].substring(0, linkLen).trim();
  3631. cap[3] = "";
  3632. }
  3633. }
  3634. let href = cap[2];
  3635. let title = "";
  3636. if (this.options.pedantic) {
  3637. const link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
  3638. if (link) {
  3639. href = link[1];
  3640. title = link[3];
  3641. }
  3642. } else {
  3643. title = cap[3] ? cap[3].slice(1, -1) : "";
  3644. }
  3645. href = href.trim();
  3646. if (/^</.test(href)) {
  3647. if (this.options.pedantic && !/>$/.test(trimmedUrl)) {
  3648. href = href.slice(1);
  3649. } else {
  3650. href = href.slice(1, -1);
  3651. }
  3652. }
  3653. return outputLink(cap, {
  3654. href: href ? href.replace(this.rules.inline._escapes, "$1") : href,
  3655. title: title ? title.replace(this.rules.inline._escapes, "$1") : title
  3656. }, cap[0], this.lexer);
  3657. }
  3658. }
  3659. reflink(src2, links) {
  3660. let cap;
  3661. if ((cap = this.rules.inline.reflink.exec(src2)) || (cap = this.rules.inline.nolink.exec(src2))) {
  3662. let link = (cap[2] || cap[1]).replace(/\s+/g, " ");
  3663. link = links[link.toLowerCase()];
  3664. if (!link) {
  3665. const text = cap[0].charAt(0);
  3666. return {
  3667. type: "text",
  3668. raw: text,
  3669. text
  3670. };
  3671. }
  3672. return outputLink(cap, link, cap[0], this.lexer);
  3673. }
  3674. }
  3675. emStrong(src2, maskedSrc, prevChar = "") {
  3676. let match = this.rules.inline.emStrong.lDelim.exec(src2);
  3677. if (!match)
  3678. return;
  3679. if (match[3] && prevChar.match(/[\p{L}\p{N}]/u))
  3680. return;
  3681. const nextChar = match[1] || match[2] || "";
  3682. if (!nextChar || nextChar && (prevChar === "" || this.rules.inline.punctuation.exec(prevChar))) {
  3683. const lLength = match[0].length - 1;
  3684. let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;
  3685. const endReg = match[0][0] === "*" ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;
  3686. endReg.lastIndex = 0;
  3687. maskedSrc = maskedSrc.slice(-1 * src2.length + lLength);
  3688. while ((match = endReg.exec(maskedSrc)) != null) {
  3689. rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];
  3690. if (!rDelim)
  3691. continue;
  3692. rLength = rDelim.length;
  3693. if (match[3] || match[4]) {
  3694. delimTotal += rLength;
  3695. continue;
  3696. } else if (match[5] || match[6]) {
  3697. if (lLength % 3 && !((lLength + rLength) % 3)) {
  3698. midDelimTotal += rLength;
  3699. continue;
  3700. }
  3701. }
  3702. delimTotal -= rLength;
  3703. if (delimTotal > 0)
  3704. continue;
  3705. rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);
  3706. const raw = src2.slice(0, lLength + match.index + (match[0].length - rDelim.length) + rLength);
  3707. if (Math.min(lLength, rLength) % 2) {
  3708. const text2 = raw.slice(1, -1);
  3709. return {
  3710. type: "em",
  3711. raw,
  3712. text: text2,
  3713. tokens: this.lexer.inlineTokens(text2)
  3714. };
  3715. }
  3716. const text = raw.slice(2, -2);
  3717. return {
  3718. type: "strong",
  3719. raw,
  3720. text,
  3721. tokens: this.lexer.inlineTokens(text)
  3722. };
  3723. }
  3724. }
  3725. }
  3726. codespan(src2) {
  3727. const cap = this.rules.inline.code.exec(src2);
  3728. if (cap) {
  3729. let text = cap[2].replace(/\n/g, " ");
  3730. const hasNonSpaceChars = /[^ ]/.test(text);
  3731. const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);
  3732. if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {
  3733. text = text.substring(1, text.length - 1);
  3734. }
  3735. text = escape$1(text, true);
  3736. return {
  3737. type: "codespan",
  3738. raw: cap[0],
  3739. text
  3740. };
  3741. }
  3742. }
  3743. br(src2) {
  3744. const cap = this.rules.inline.br.exec(src2);
  3745. if (cap) {
  3746. return {
  3747. type: "br",
  3748. raw: cap[0]
  3749. };
  3750. }
  3751. }
  3752. del(src2) {
  3753. const cap = this.rules.inline.del.exec(src2);
  3754. if (cap) {
  3755. return {
  3756. type: "del",
  3757. raw: cap[0],
  3758. text: cap[2],
  3759. tokens: this.lexer.inlineTokens(cap[2])
  3760. };
  3761. }
  3762. }
  3763. autolink(src2, mangle2) {
  3764. const cap = this.rules.inline.autolink.exec(src2);
  3765. if (cap) {
  3766. let text, href;
  3767. if (cap[2] === "@") {
  3768. text = escape$1(this.options.mangle ? mangle2(cap[1]) : cap[1]);
  3769. href = "mailto:" + text;
  3770. } else {
  3771. text = escape$1(cap[1]);
  3772. href = text;
  3773. }
  3774. return {
  3775. type: "link",
  3776. raw: cap[0],
  3777. text,
  3778. href,
  3779. tokens: [
  3780. {
  3781. type: "text",
  3782. raw: text,
  3783. text
  3784. }
  3785. ]
  3786. };
  3787. }
  3788. }
  3789. url(src2, mangle2) {
  3790. let cap;
  3791. if (cap = this.rules.inline.url.exec(src2)) {
  3792. let text, href;
  3793. if (cap[2] === "@") {
  3794. text = escape$1(this.options.mangle ? mangle2(cap[0]) : cap[0]);
  3795. href = "mailto:" + text;
  3796. } else {
  3797. let prevCapZero;
  3798. do {
  3799. prevCapZero = cap[0];
  3800. cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];
  3801. } while (prevCapZero !== cap[0]);
  3802. text = escape$1(cap[0]);
  3803. if (cap[1] === "www.") {
  3804. href = "http://" + cap[0];
  3805. } else {
  3806. href = cap[0];
  3807. }
  3808. }
  3809. return {
  3810. type: "link",
  3811. raw: cap[0],
  3812. text,
  3813. href,
  3814. tokens: [
  3815. {
  3816. type: "text",
  3817. raw: text,
  3818. text
  3819. }
  3820. ]
  3821. };
  3822. }
  3823. }
  3824. inlineText(src2, smartypants2) {
  3825. const cap = this.rules.inline.text.exec(src2);
  3826. if (cap) {
  3827. let text;
  3828. if (this.lexer.state.inRawBlock) {
  3829. text = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$1(cap[0]) : cap[0];
  3830. } else {
  3831. text = escape$1(this.options.smartypants ? smartypants2(cap[0]) : cap[0]);
  3832. }
  3833. return {
  3834. type: "text",
  3835. raw: cap[0],
  3836. text
  3837. };
  3838. }
  3839. }
  3840. }
  3841. const block = {
  3842. newline: /^(?: *(?:\n|$))+/,
  3843. code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,
  3844. fences: /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,
  3845. hr: /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,
  3846. heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,
  3847. blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
  3848. list: /^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/,
  3849. html: "^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\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|$))",
  3850. def: /^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,
  3851. table: noopTest,
  3852. lheading: /^((?:.|\n(?!\n))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
  3853. _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,
  3854. text: /^[^\n]+/
  3855. };
  3856. block._label = /(?!\s*\])(?:\\.|[^\[\]\\])+/;
  3857. block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
  3858. block.def = edit(block.def).replace("label", block._label).replace("title", block._title).getRegex();
  3859. block.bullet = /(?:[*+-]|\d{1,9}[.)])/;
  3860. block.listItemStart = edit(/^( *)(bull) */).replace("bull", block.bullet).getRegex();
  3861. 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();
  3862. 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";
  3863. block._comment = /<!--(?!-?>)[\s\S]*?(?:-->|$)/;
  3864. block.html = edit(block.html, "i").replace("comment", block._comment).replace("tag", block._tag).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex();
  3865. 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();
  3866. block.blockquote = edit(block.blockquote).replace("paragraph", block.paragraph).getRegex();
  3867. block.normal = { ...block };
  3868. block.gfm = {
  3869. ...block.normal,
  3870. table: "^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"
  3871. };
  3872. 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();
  3873. 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();
  3874. block.pedantic = {
  3875. ...block.normal,
  3876. html: edit(
  3877. `^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`
  3878. ).replace("comment", block._comment).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),
  3879. def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
  3880. heading: /^(#{1,6})(.*)(?:\n+|$)/,
  3881. fences: noopTest,
  3882. lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
  3883. paragraph: edit(block.normal._paragraph).replace("hr", block.hr).replace("heading", " *#{1,6} *[^\n]").replace("lheading", block.lheading).replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").getRegex()
  3884. };
  3885. const inline = {
  3886. escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
  3887. autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
  3888. url: noopTest,
  3889. tag: "^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>",
  3890. link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,
  3891. reflink: /^!?\[(label)\]\[(ref)\]/,
  3892. nolink: /^!?\[(ref)\](?:\[\])?/,
  3893. reflinkSearch: "reflink|nolink(?!\\()",
  3894. emStrong: {
  3895. lDelim: /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,
  3896. rDelimAst: /^(?:[^_*\\]|\\.)*?\_\_(?:[^_*\\]|\\.)*?\*(?:[^_*\\]|\\.)*?(?=\_\_)|(?:[^*\\]|\\.)+(?=[^*])|[punct_](\*+)(?=[\s]|$)|(?:[^punct*_\s\\]|\\.)(\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|(?:[^punct*_\s\\]|\\.)(\*+)(?=[^punct*_\s])/,
  3897. rDelimUnd: /^(?:[^_*\\]|\\.)*?\*\*(?:[^_*\\]|\\.)*?\_(?:[^_*\\]|\\.)*?(?=\*\*)|(?:[^_\\]|\\.)+(?=[^_])|[punct*](\_+)(?=[\s]|$)|(?:[^punct*_\s\\]|\\.)(\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/
  3898. },
  3899. code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
  3900. br: /^( {2,}|\\)\n(?!\s*$)/,
  3901. del: noopTest,
  3902. text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,
  3903. punctuation: /^([\spunctuation])/
  3904. };
  3905. inline._punctuation = "!\"#$%&'()+\\-.,/:;<=>?@\\[\\]`^{|}~";
  3906. inline.punctuation = edit(inline.punctuation).replace(/punctuation/g, inline._punctuation).getRegex();
  3907. inline.blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g;
  3908. inline.escapedEmSt = /(?:^|[^\\])(?:\\\\)*\\[*_]/g;
  3909. inline._comment = edit(block._comment).replace("(?:-->|$)", "-->").getRegex();
  3910. inline.emStrong.lDelim = edit(inline.emStrong.lDelim).replace(/punct/g, inline._punctuation).getRegex();
  3911. inline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, "g").replace(/punct/g, inline._punctuation).getRegex();
  3912. inline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, "g").replace(/punct/g, inline._punctuation).getRegex();
  3913. inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
  3914. inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
  3915. inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
  3916. inline.autolink = edit(inline.autolink).replace("scheme", inline._scheme).replace("email", inline._email).getRegex();
  3917. inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
  3918. inline.tag = edit(inline.tag).replace("comment", inline._comment).replace("attribute", inline._attribute).getRegex();
  3919. inline._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
  3920. inline._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/;
  3921. inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
  3922. inline.link = edit(inline.link).replace("label", inline._label).replace("href", inline._href).replace("title", inline._title).getRegex();
  3923. inline.reflink = edit(inline.reflink).replace("label", inline._label).replace("ref", block._label).getRegex();
  3924. inline.nolink = edit(inline.nolink).replace("ref", block._label).getRegex();
  3925. inline.reflinkSearch = edit(inline.reflinkSearch, "g").replace("reflink", inline.reflink).replace("nolink", inline.nolink).getRegex();
  3926. inline.normal = { ...inline };
  3927. inline.pedantic = {
  3928. ...inline.normal,
  3929. strong: {
  3930. start: /^__|\*\*/,
  3931. middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
  3932. endAst: /\*\*(?!\*)/g,
  3933. endUnd: /__(?!_)/g
  3934. },
  3935. em: {
  3936. start: /^_|\*/,
  3937. middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,
  3938. endAst: /\*(?!\*)/g,
  3939. endUnd: /_(?!_)/g
  3940. },
  3941. link: edit(/^!?\[(label)\]\((.*?)\)/).replace("label", inline._label).getRegex(),
  3942. reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", inline._label).getRegex()
  3943. };
  3944. inline.gfm = {
  3945. ...inline.normal,
  3946. escape: edit(inline.escape).replace("])", "~|])").getRegex(),
  3947. _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
  3948. url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
  3949. _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,
  3950. del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,
  3951. text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/
  3952. };
  3953. inline.gfm.url = edit(inline.gfm.url, "i").replace("email", inline.gfm._extended_email).getRegex();
  3954. inline.breaks = {
  3955. ...inline.gfm,
  3956. br: edit(inline.br).replace("{2,}", "*").getRegex(),
  3957. text: edit(inline.gfm.text).replace("\\b_", "\\b_| {2,}\\n").replace(/\{2,\}/g, "*").getRegex()
  3958. };
  3959. function smartypants(text) {
  3960. return text.replace(/---/g, "\u2014").replace(/--/g, "\u2013").replace(/(^|[-\u2014/(\[{"\s])'/g, "$1\u2018").replace(/'/g, "\u2019").replace(/(^|[-\u2014/(\[{\u2018\s])"/g, "$1\u201C").replace(/"/g, "\u201D").replace(/\.{3}/g, "\u2026");
  3961. }
  3962. function mangle(text) {
  3963. let out = "", i, ch;
  3964. const l = text.length;
  3965. for (i = 0; i < l; i++) {
  3966. ch = text.charCodeAt(i);
  3967. if (Math.random() > 0.5) {
  3968. ch = "x" + ch.toString(16);
  3969. }
  3970. out += "&#" + ch + ";";
  3971. }
  3972. return out;
  3973. }
  3974. class Lexer {
  3975. constructor(options) {
  3976. this.tokens = [];
  3977. this.tokens.links = /* @__PURE__ */ Object.create(null);
  3978. this.options = options || defaults;
  3979. this.options.tokenizer = this.options.tokenizer || new Tokenizer();
  3980. this.tokenizer = this.options.tokenizer;
  3981. this.tokenizer.options = this.options;
  3982. this.tokenizer.lexer = this;
  3983. this.inlineQueue = [];
  3984. this.state = {
  3985. inLink: false,
  3986. inRawBlock: false,
  3987. top: true
  3988. };
  3989. const rules = {
  3990. block: block.normal,
  3991. inline: inline.normal
  3992. };
  3993. if (this.options.pedantic) {
  3994. rules.block = block.pedantic;
  3995. rules.inline = inline.pedantic;
  3996. } else if (this.options.gfm) {
  3997. rules.block = block.gfm;
  3998. if (this.options.breaks) {
  3999. rules.inline = inline.breaks;
  4000. } else {
  4001. rules.inline = inline.gfm;
  4002. }
  4003. }
  4004. this.tokenizer.rules = rules;
  4005. }
  4006. static get rules() {
  4007. return {
  4008. block,
  4009. inline
  4010. };
  4011. }
  4012. static lex(src2, options) {
  4013. const lexer = new Lexer(options);
  4014. return lexer.lex(src2);
  4015. }
  4016. static lexInline(src2, options) {
  4017. const lexer = new Lexer(options);
  4018. return lexer.inlineTokens(src2);
  4019. }
  4020. lex(src2) {
  4021. src2 = src2.replace(/\r\n|\r/g, "\n");
  4022. this.blockTokens(src2, this.tokens);
  4023. let next2;
  4024. while (next2 = this.inlineQueue.shift()) {
  4025. this.inlineTokens(next2.src, next2.tokens);
  4026. }
  4027. return this.tokens;
  4028. }
  4029. blockTokens(src2, tokens = []) {
  4030. if (this.options.pedantic) {
  4031. src2 = src2.replace(/\t/g, " ").replace(/^ +$/gm, "");
  4032. } else {
  4033. src2 = src2.replace(/^( *)(\t+)/gm, (_, leading, tabs) => {
  4034. return leading + " ".repeat(tabs.length);
  4035. });
  4036. }
  4037. let token, lastToken, cutSrc, lastParagraphClipped;
  4038. while (src2) {
  4039. if (this.options.extensions && this.options.extensions.block && this.options.extensions.block.some((extTokenizer) => {
  4040. if (token = extTokenizer.call({ lexer: this }, src2, tokens)) {
  4041. src2 = src2.substring(token.raw.length);
  4042. tokens.push(token);
  4043. return true;
  4044. }
  4045. return false;
  4046. })) {
  4047. continue;
  4048. }
  4049. if (token = this.tokenizer.space(src2)) {
  4050. src2 = src2.substring(token.raw.length);
  4051. if (token.raw.length === 1 && tokens.length > 0) {
  4052. tokens[tokens.length - 1].raw += "\n";
  4053. } else {
  4054. tokens.push(token);
  4055. }
  4056. continue;
  4057. }
  4058. if (token = this.tokenizer.code(src2)) {
  4059. src2 = src2.substring(token.raw.length);
  4060. lastToken = tokens[tokens.length - 1];
  4061. if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) {
  4062. lastToken.raw += "\n" + token.raw;
  4063. lastToken.text += "\n" + token.text;
  4064. this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
  4065. } else {
  4066. tokens.push(token);
  4067. }
  4068. continue;
  4069. }
  4070. if (token = this.tokenizer.fences(src2)) {
  4071. src2 = src2.substring(token.raw.length);
  4072. tokens.push(token);
  4073. continue;
  4074. }
  4075. if (token = this.tokenizer.heading(src2)) {
  4076. src2 = src2.substring(token.raw.length);
  4077. tokens.push(token);
  4078. continue;
  4079. }
  4080. if (token = this.tokenizer.hr(src2)) {
  4081. src2 = src2.substring(token.raw.length);
  4082. tokens.push(token);
  4083. continue;
  4084. }
  4085. if (token = this.tokenizer.blockquote(src2)) {
  4086. src2 = src2.substring(token.raw.length);
  4087. tokens.push(token);
  4088. continue;
  4089. }
  4090. if (token = this.tokenizer.list(src2)) {
  4091. src2 = src2.substring(token.raw.length);
  4092. tokens.push(token);
  4093. continue;
  4094. }
  4095. if (token = this.tokenizer.html(src2)) {
  4096. src2 = src2.substring(token.raw.length);
  4097. tokens.push(token);
  4098. continue;
  4099. }
  4100. if (token = this.tokenizer.def(src2)) {
  4101. src2 = src2.substring(token.raw.length);
  4102. lastToken = tokens[tokens.length - 1];
  4103. if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) {
  4104. lastToken.raw += "\n" + token.raw;
  4105. lastToken.text += "\n" + token.raw;
  4106. this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
  4107. } else if (!this.tokens.links[token.tag]) {
  4108. this.tokens.links[token.tag] = {
  4109. href: token.href,
  4110. title: token.title
  4111. };
  4112. }
  4113. continue;
  4114. }
  4115. if (token = this.tokenizer.table(src2)) {
  4116. src2 = src2.substring(token.raw.length);
  4117. tokens.push(token);
  4118. continue;
  4119. }
  4120. if (token = this.tokenizer.lheading(src2)) {
  4121. src2 = src2.substring(token.raw.length);
  4122. tokens.push(token);
  4123. continue;
  4124. }
  4125. cutSrc = src2;
  4126. if (this.options.extensions && this.options.extensions.startBlock) {
  4127. let startIndex = Infinity;
  4128. const tempSrc = src2.slice(1);
  4129. let tempStart;
  4130. this.options.extensions.startBlock.forEach(function(getStartIndex) {
  4131. tempStart = getStartIndex.call({ lexer: this }, tempSrc);
  4132. if (typeof tempStart === "number" && tempStart >= 0) {
  4133. startIndex = Math.min(startIndex, tempStart);
  4134. }
  4135. });
  4136. if (startIndex < Infinity && startIndex >= 0) {
  4137. cutSrc = src2.substring(0, startIndex + 1);
  4138. }
  4139. }
  4140. if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {
  4141. lastToken = tokens[tokens.length - 1];
  4142. if (lastParagraphClipped && lastToken.type === "paragraph") {
  4143. lastToken.raw += "\n" + token.raw;
  4144. lastToken.text += "\n" + token.text;
  4145. this.inlineQueue.pop();
  4146. this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
  4147. } else {
  4148. tokens.push(token);
  4149. }
  4150. lastParagraphClipped = cutSrc.length !== src2.length;
  4151. src2 = src2.substring(token.raw.length);
  4152. continue;
  4153. }
  4154. if (token = this.tokenizer.text(src2)) {
  4155. src2 = src2.substring(token.raw.length);
  4156. lastToken = tokens[tokens.length - 1];
  4157. if (lastToken && lastToken.type === "text") {
  4158. lastToken.raw += "\n" + token.raw;
  4159. lastToken.text += "\n" + token.text;
  4160. this.inlineQueue.pop();
  4161. this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
  4162. } else {
  4163. tokens.push(token);
  4164. }
  4165. continue;
  4166. }
  4167. if (src2) {
  4168. const errMsg = "Infinite loop on byte: " + src2.charCodeAt(0);
  4169. if (this.options.silent) {
  4170. console.error(errMsg);
  4171. break;
  4172. } else {
  4173. throw new Error(errMsg);
  4174. }
  4175. }
  4176. }
  4177. this.state.top = true;
  4178. return tokens;
  4179. }
  4180. inline(src2, tokens = []) {
  4181. this.inlineQueue.push({ src: src2, tokens });
  4182. return tokens;
  4183. }
  4184. inlineTokens(src2, tokens = []) {
  4185. let token, lastToken, cutSrc;
  4186. let maskedSrc = src2;
  4187. let match;
  4188. let keepPrevChar, prevChar;
  4189. if (this.tokens.links) {
  4190. const links = Object.keys(this.tokens.links);
  4191. if (links.length > 0) {
  4192. while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {
  4193. if (links.includes(match[0].slice(match[0].lastIndexOf("[") + 1, -1))) {
  4194. maskedSrc = maskedSrc.slice(0, match.index) + "[" + repeatString("a", match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);
  4195. }
  4196. }
  4197. }
  4198. }
  4199. while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {
  4200. maskedSrc = maskedSrc.slice(0, match.index) + "[" + repeatString("a", match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
  4201. }
  4202. while ((match = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) {
  4203. maskedSrc = maskedSrc.slice(0, match.index + match[0].length - 2) + "++" + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);
  4204. this.tokenizer.rules.inline.escapedEmSt.lastIndex--;
  4205. }
  4206. while (src2) {
  4207. if (!keepPrevChar) {
  4208. prevChar = "";
  4209. }
  4210. keepPrevChar = false;
  4211. if (this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some((extTokenizer) => {
  4212. if (token = extTokenizer.call({ lexer: this }, src2, tokens)) {
  4213. src2 = src2.substring(token.raw.length);
  4214. tokens.push(token);
  4215. return true;
  4216. }
  4217. return false;
  4218. })) {
  4219. continue;
  4220. }
  4221. if (token = this.tokenizer.escape(src2)) {
  4222. src2 = src2.substring(token.raw.length);
  4223. tokens.push(token);
  4224. continue;
  4225. }
  4226. if (token = this.tokenizer.tag(src2)) {
  4227. src2 = src2.substring(token.raw.length);
  4228. lastToken = tokens[tokens.length - 1];
  4229. if (lastToken && token.type === "text" && lastToken.type === "text") {
  4230. lastToken.raw += token.raw;
  4231. lastToken.text += token.text;
  4232. } else {
  4233. tokens.push(token);
  4234. }
  4235. continue;
  4236. }
  4237. if (token = this.tokenizer.link(src2)) {
  4238. src2 = src2.substring(token.raw.length);
  4239. tokens.push(token);
  4240. continue;
  4241. }
  4242. if (token = this.tokenizer.reflink(src2, this.tokens.links)) {
  4243. src2 = src2.substring(token.raw.length);
  4244. lastToken = tokens[tokens.length - 1];
  4245. if (lastToken && token.type === "text" && lastToken.type === "text") {
  4246. lastToken.raw += token.raw;
  4247. lastToken.text += token.text;
  4248. } else {
  4249. tokens.push(token);
  4250. }
  4251. continue;
  4252. }
  4253. if (token = this.tokenizer.emStrong(src2, maskedSrc, prevChar)) {
  4254. src2 = src2.substring(token.raw.length);
  4255. tokens.push(token);
  4256. continue;
  4257. }
  4258. if (token = this.tokenizer.codespan(src2)) {
  4259. src2 = src2.substring(token.raw.length);
  4260. tokens.push(token);
  4261. continue;
  4262. }
  4263. if (token = this.tokenizer.br(src2)) {
  4264. src2 = src2.substring(token.raw.length);
  4265. tokens.push(token);
  4266. continue;
  4267. }
  4268. if (token = this.tokenizer.del(src2)) {
  4269. src2 = src2.substring(token.raw.length);
  4270. tokens.push(token);
  4271. continue;
  4272. }
  4273. if (token = this.tokenizer.autolink(src2, mangle)) {
  4274. src2 = src2.substring(token.raw.length);
  4275. tokens.push(token);
  4276. continue;
  4277. }
  4278. if (!this.state.inLink && (token = this.tokenizer.url(src2, mangle))) {
  4279. src2 = src2.substring(token.raw.length);
  4280. tokens.push(token);
  4281. continue;
  4282. }
  4283. cutSrc = src2;
  4284. if (this.options.extensions && this.options.extensions.startInline) {
  4285. let startIndex = Infinity;
  4286. const tempSrc = src2.slice(1);
  4287. let tempStart;
  4288. this.options.extensions.startInline.forEach(function(getStartIndex) {
  4289. tempStart = getStartIndex.call({ lexer: this }, tempSrc);
  4290. if (typeof tempStart === "number" && tempStart >= 0) {
  4291. startIndex = Math.min(startIndex, tempStart);
  4292. }
  4293. });
  4294. if (startIndex < Infinity && startIndex >= 0) {
  4295. cutSrc = src2.substring(0, startIndex + 1);
  4296. }
  4297. }
  4298. if (token = this.tokenizer.inlineText(cutSrc, smartypants)) {
  4299. src2 = src2.substring(token.raw.length);
  4300. if (token.raw.slice(-1) !== "_") {
  4301. prevChar = token.raw.slice(-1);
  4302. }
  4303. keepPrevChar = true;
  4304. lastToken = tokens[tokens.length - 1];
  4305. if (lastToken && lastToken.type === "text") {
  4306. lastToken.raw += token.raw;
  4307. lastToken.text += token.text;
  4308. } else {
  4309. tokens.push(token);
  4310. }
  4311. continue;
  4312. }
  4313. if (src2) {
  4314. const errMsg = "Infinite loop on byte: " + src2.charCodeAt(0);
  4315. if (this.options.silent) {
  4316. console.error(errMsg);
  4317. break;
  4318. } else {
  4319. throw new Error(errMsg);
  4320. }
  4321. }
  4322. }
  4323. return tokens;
  4324. }
  4325. }
  4326. class Renderer {
  4327. constructor(options) {
  4328. this.options = options || defaults;
  4329. }
  4330. code(code, infostring, escaped) {
  4331. const lang = (infostring || "").match(/\S*/)[0];
  4332. if (this.options.highlight) {
  4333. const out = this.options.highlight(code, lang);
  4334. if (out != null && out !== code) {
  4335. escaped = true;
  4336. code = out;
  4337. }
  4338. }
  4339. code = code.replace(/\n$/, "") + "\n";
  4340. if (!lang) {
  4341. return "<pre><code>" + (escaped ? code : escape$1(code, true)) + "</code></pre>\n";
  4342. }
  4343. return '<pre><code class="' + this.options.langPrefix + escape$1(lang) + '">' + (escaped ? code : escape$1(code, true)) + "</code></pre>\n";
  4344. }
  4345. blockquote(quote) {
  4346. return `<blockquote>
  4347. ${quote}</blockquote>
  4348. `;
  4349. }
  4350. html(html) {
  4351. return html;
  4352. }
  4353. heading(text, level, raw, slugger) {
  4354. if (this.options.headerIds) {
  4355. const id = this.options.headerPrefix + slugger.slug(raw);
  4356. return `<h${level} id="${id}">${text}</h${level}>
  4357. `;
  4358. }
  4359. return `<h${level}>${text}</h${level}>
  4360. `;
  4361. }
  4362. hr() {
  4363. return this.options.xhtml ? "<hr/>\n" : "<hr>\n";
  4364. }
  4365. list(body, ordered, start2) {
  4366. const type = ordered ? "ol" : "ul", startatt = ordered && start2 !== 1 ? ' start="' + start2 + '"' : "";
  4367. return "<" + type + startatt + ">\n" + body + "</" + type + ">\n";
  4368. }
  4369. listitem(text) {
  4370. return `<li>${text}</li>
  4371. `;
  4372. }
  4373. checkbox(checked) {
  4374. return "<input " + (checked ? 'checked="" ' : "") + 'disabled="" type="checkbox"' + (this.options.xhtml ? " /" : "") + "> ";
  4375. }
  4376. paragraph(text) {
  4377. return `<p>${text}</p>
  4378. `;
  4379. }
  4380. table(header, body) {
  4381. if (body)
  4382. body = `<tbody>${body}</tbody>`;
  4383. return "<table>\n<thead>\n" + header + "</thead>\n" + body + "</table>\n";
  4384. }
  4385. tablerow(content) {
  4386. return `<tr>
  4387. ${content}</tr>
  4388. `;
  4389. }
  4390. tablecell(content, flags) {
  4391. const type = flags.header ? "th" : "td";
  4392. const tag = flags.align ? `<${type} align="${flags.align}">` : `<${type}>`;
  4393. return tag + content + `</${type}>
  4394. `;
  4395. }
  4396. strong(text) {
  4397. return `<strong>${text}</strong>`;
  4398. }
  4399. em(text) {
  4400. return `<em>${text}</em>`;
  4401. }
  4402. codespan(text) {
  4403. return `<code>${text}</code>`;
  4404. }
  4405. br() {
  4406. return this.options.xhtml ? "<br/>" : "<br>";
  4407. }
  4408. del(text) {
  4409. return `<del>${text}</del>`;
  4410. }
  4411. link(href, title, text) {
  4412. href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
  4413. if (href === null) {
  4414. return text;
  4415. }
  4416. let out = '<a href="' + href + '"';
  4417. if (title) {
  4418. out += ' title="' + title + '"';
  4419. }
  4420. out += ">" + text + "</a>";
  4421. return out;
  4422. }
  4423. image(href, title, text) {
  4424. href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
  4425. if (href === null) {
  4426. return text;
  4427. }
  4428. let out = `<img src="${href}" alt="${text}"`;
  4429. if (title) {
  4430. out += ` title="${title}"`;
  4431. }
  4432. out += this.options.xhtml ? "/>" : ">";
  4433. return out;
  4434. }
  4435. text(text) {
  4436. return text;
  4437. }
  4438. }
  4439. class TextRenderer {
  4440. strong(text) {
  4441. return text;
  4442. }
  4443. em(text) {
  4444. return text;
  4445. }
  4446. codespan(text) {
  4447. return text;
  4448. }
  4449. del(text) {
  4450. return text;
  4451. }
  4452. html(text) {
  4453. return text;
  4454. }
  4455. text(text) {
  4456. return text;
  4457. }
  4458. link(href, title, text) {
  4459. return "" + text;
  4460. }
  4461. image(href, title, text) {
  4462. return "" + text;
  4463. }
  4464. br() {
  4465. return "";
  4466. }
  4467. }
  4468. class Slugger {
  4469. constructor() {
  4470. this.seen = {};
  4471. }
  4472. serialize(value) {
  4473. return value.toLowerCase().trim().replace(/<[!\/a-z].*?>/ig, "").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, "").replace(/\s/g, "-");
  4474. }
  4475. getNextSafeSlug(originalSlug, isDryRun) {
  4476. let slug = originalSlug;
  4477. let occurenceAccumulator = 0;
  4478. if (this.seen.hasOwnProperty(slug)) {
  4479. occurenceAccumulator = this.seen[originalSlug];
  4480. do {
  4481. occurenceAccumulator++;
  4482. slug = originalSlug + "-" + occurenceAccumulator;
  4483. } while (this.seen.hasOwnProperty(slug));
  4484. }
  4485. if (!isDryRun) {
  4486. this.seen[originalSlug] = occurenceAccumulator;
  4487. this.seen[slug] = 0;
  4488. }
  4489. return slug;
  4490. }
  4491. slug(value, options = {}) {
  4492. const slug = this.serialize(value);
  4493. return this.getNextSafeSlug(slug, options.dryrun);
  4494. }
  4495. }
  4496. class Parser {
  4497. constructor(options) {
  4498. this.options = options || defaults;
  4499. this.options.renderer = this.options.renderer || new Renderer();
  4500. this.renderer = this.options.renderer;
  4501. this.renderer.options = this.options;
  4502. this.textRenderer = new TextRenderer();
  4503. this.slugger = new Slugger();
  4504. }
  4505. static parse(tokens, options) {
  4506. const parser = new Parser(options);
  4507. return parser.parse(tokens);
  4508. }
  4509. static parseInline(tokens, options) {
  4510. const parser = new Parser(options);
  4511. return parser.parseInline(tokens);
  4512. }
  4513. parse(tokens, top2 = true) {
  4514. let out = "", i, j, k, l2, l3, row, cell, header, body, token, ordered, start2, loose, itemBody, item, checked, task, checkbox, ret;
  4515. const l = tokens.length;
  4516. for (i = 0; i < l; i++) {
  4517. token = tokens[i];
  4518. if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
  4519. ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);
  4520. if (ret !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "paragraph", "text"].includes(token.type)) {
  4521. out += ret || "";
  4522. continue;
  4523. }
  4524. }
  4525. switch (token.type) {
  4526. case "space": {
  4527. continue;
  4528. }
  4529. case "hr": {
  4530. out += this.renderer.hr();
  4531. continue;
  4532. }
  4533. case "heading": {
  4534. out += this.renderer.heading(
  4535. this.parseInline(token.tokens),
  4536. token.depth,
  4537. unescape$1(this.parseInline(token.tokens, this.textRenderer)),
  4538. this.slugger
  4539. );
  4540. continue;
  4541. }
  4542. case "code": {
  4543. out += this.renderer.code(
  4544. token.text,
  4545. token.lang,
  4546. token.escaped
  4547. );
  4548. continue;
  4549. }
  4550. case "table": {
  4551. header = "";
  4552. cell = "";
  4553. l2 = token.header.length;
  4554. for (j = 0; j < l2; j++) {
  4555. cell += this.renderer.tablecell(
  4556. this.parseInline(token.header[j].tokens),
  4557. { header: true, align: token.align[j] }
  4558. );
  4559. }
  4560. header += this.renderer.tablerow(cell);
  4561. body = "";
  4562. l2 = token.rows.length;
  4563. for (j = 0; j < l2; j++) {
  4564. row = token.rows[j];
  4565. cell = "";
  4566. l3 = row.length;
  4567. for (k = 0; k < l3; k++) {
  4568. cell += this.renderer.tablecell(
  4569. this.parseInline(row[k].tokens),
  4570. { header: false, align: token.align[k] }
  4571. );
  4572. }
  4573. body += this.renderer.tablerow(cell);
  4574. }
  4575. out += this.renderer.table(header, body);
  4576. continue;
  4577. }
  4578. case "blockquote": {
  4579. body = this.parse(token.tokens);
  4580. out += this.renderer.blockquote(body);
  4581. continue;
  4582. }
  4583. case "list": {
  4584. ordered = token.ordered;
  4585. start2 = token.start;
  4586. loose = token.loose;
  4587. l2 = token.items.length;
  4588. body = "";
  4589. for (j = 0; j < l2; j++) {
  4590. item = token.items[j];
  4591. checked = item.checked;
  4592. task = item.task;
  4593. itemBody = "";
  4594. if (item.task) {
  4595. checkbox = this.renderer.checkbox(checked);
  4596. if (loose) {
  4597. if (item.tokens.length > 0 && item.tokens[0].type === "paragraph") {
  4598. item.tokens[0].text = checkbox + " " + item.tokens[0].text;
  4599. if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === "text") {
  4600. item.tokens[0].tokens[0].text = checkbox + " " + item.tokens[0].tokens[0].text;
  4601. }
  4602. } else {
  4603. item.tokens.unshift({
  4604. type: "text",
  4605. text: checkbox
  4606. });
  4607. }
  4608. } else {
  4609. itemBody += checkbox;
  4610. }
  4611. }
  4612. itemBody += this.parse(item.tokens, loose);
  4613. body += this.renderer.listitem(itemBody, task, checked);
  4614. }
  4615. out += this.renderer.list(body, ordered, start2);
  4616. continue;
  4617. }
  4618. case "html": {
  4619. out += this.renderer.html(token.text);
  4620. continue;
  4621. }
  4622. case "paragraph": {
  4623. out += this.renderer.paragraph(this.parseInline(token.tokens));
  4624. continue;
  4625. }
  4626. case "text": {
  4627. body = token.tokens ? this.parseInline(token.tokens) : token.text;
  4628. while (i + 1 < l && tokens[i + 1].type === "text") {
  4629. token = tokens[++i];
  4630. body += "\n" + (token.tokens ? this.parseInline(token.tokens) : token.text);
  4631. }
  4632. out += top2 ? this.renderer.paragraph(body) : body;
  4633. continue;
  4634. }
  4635. default: {
  4636. const errMsg = 'Token with "' + token.type + '" type was not found.';
  4637. if (this.options.silent) {
  4638. console.error(errMsg);
  4639. return;
  4640. } else {
  4641. throw new Error(errMsg);
  4642. }
  4643. }
  4644. }
  4645. }
  4646. return out;
  4647. }
  4648. parseInline(tokens, renderer) {
  4649. renderer = renderer || this.renderer;
  4650. let out = "", i, token, ret;
  4651. const l = tokens.length;
  4652. for (i = 0; i < l; i++) {
  4653. token = tokens[i];
  4654. if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
  4655. ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);
  4656. if (ret !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(token.type)) {
  4657. out += ret || "";
  4658. continue;
  4659. }
  4660. }
  4661. switch (token.type) {
  4662. case "escape": {
  4663. out += renderer.text(token.text);
  4664. break;
  4665. }
  4666. case "html": {
  4667. out += renderer.html(token.text);
  4668. break;
  4669. }
  4670. case "link": {
  4671. out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer));
  4672. break;
  4673. }
  4674. case "image": {
  4675. out += renderer.image(token.href, token.title, token.text);
  4676. break;
  4677. }
  4678. case "strong": {
  4679. out += renderer.strong(this.parseInline(token.tokens, renderer));
  4680. break;
  4681. }
  4682. case "em": {
  4683. out += renderer.em(this.parseInline(token.tokens, renderer));
  4684. break;
  4685. }
  4686. case "codespan": {
  4687. out += renderer.codespan(token.text);
  4688. break;
  4689. }
  4690. case "br": {
  4691. out += renderer.br();
  4692. break;
  4693. }
  4694. case "del": {
  4695. out += renderer.del(this.parseInline(token.tokens, renderer));
  4696. break;
  4697. }
  4698. case "text": {
  4699. out += renderer.text(token.text);
  4700. break;
  4701. }
  4702. default: {
  4703. const errMsg = 'Token with "' + token.type + '" type was not found.';
  4704. if (this.options.silent) {
  4705. console.error(errMsg);
  4706. return;
  4707. } else {
  4708. throw new Error(errMsg);
  4709. }
  4710. }
  4711. }
  4712. }
  4713. return out;
  4714. }
  4715. }
  4716. class Hooks {
  4717. constructor(options) {
  4718. this.options = options || defaults;
  4719. }
  4720. preprocess(markdown2) {
  4721. return markdown2;
  4722. }
  4723. postprocess(html) {
  4724. return html;
  4725. }
  4726. }
  4727. __publicField(Hooks, "passThroughHooks", /* @__PURE__ */ new Set([
  4728. "preprocess",
  4729. "postprocess"
  4730. ]));
  4731. function onError(silent, async, callback) {
  4732. return (e) => {
  4733. e.message += "\nPlease report this to https://github.com/markedjs/marked.";
  4734. if (silent) {
  4735. const msg = "<p>An error occurred:</p><pre>" + escape$1(e.message + "", true) + "</pre>";
  4736. if (async) {
  4737. return Promise.resolve(msg);
  4738. }
  4739. if (callback) {
  4740. callback(null, msg);
  4741. return;
  4742. }
  4743. return msg;
  4744. }
  4745. if (async) {
  4746. return Promise.reject(e);
  4747. }
  4748. if (callback) {
  4749. callback(e);
  4750. return;
  4751. }
  4752. throw e;
  4753. };
  4754. }
  4755. function parseMarkdown(lexer, parser) {
  4756. return (src2, opt, callback) => {
  4757. if (typeof opt === "function") {
  4758. callback = opt;
  4759. opt = null;
  4760. }
  4761. const origOpt = { ...opt };
  4762. opt = { ...marked.defaults, ...origOpt };
  4763. const throwError = onError(opt.silent, opt.async, callback);
  4764. if (typeof src2 === "undefined" || src2 === null) {
  4765. return throwError(new Error("marked(): input parameter is undefined or null"));
  4766. }
  4767. if (typeof src2 !== "string") {
  4768. return throwError(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(src2) + ", string expected"));
  4769. }
  4770. checkSanitizeDeprecation(opt);
  4771. if (opt.hooks) {
  4772. opt.hooks.options = opt;
  4773. }
  4774. if (callback) {
  4775. const highlight = opt.highlight;
  4776. let tokens;
  4777. try {
  4778. if (opt.hooks) {
  4779. src2 = opt.hooks.preprocess(src2);
  4780. }
  4781. tokens = lexer(src2, opt);
  4782. } catch (e) {
  4783. return throwError(e);
  4784. }
  4785. const done = function(err) {
  4786. let out;
  4787. if (!err) {
  4788. try {
  4789. if (opt.walkTokens) {
  4790. marked.walkTokens(tokens, opt.walkTokens);
  4791. }
  4792. out = parser(tokens, opt);
  4793. if (opt.hooks) {
  4794. out = opt.hooks.postprocess(out);
  4795. }
  4796. } catch (e) {
  4797. err = e;
  4798. }
  4799. }
  4800. opt.highlight = highlight;
  4801. return err ? throwError(err) : callback(null, out);
  4802. };
  4803. if (!highlight || highlight.length < 3) {
  4804. return done();
  4805. }
  4806. delete opt.highlight;
  4807. if (!tokens.length)
  4808. return done();
  4809. let pending = 0;
  4810. marked.walkTokens(tokens, function(token) {
  4811. if (token.type === "code") {
  4812. pending++;
  4813. setTimeout(() => {
  4814. highlight(token.text, token.lang, function(err, code) {
  4815. if (err) {
  4816. return done(err);
  4817. }
  4818. if (code != null && code !== token.text) {
  4819. token.text = code;
  4820. token.escaped = true;
  4821. }
  4822. pending--;
  4823. if (pending === 0) {
  4824. done();
  4825. }
  4826. });
  4827. }, 0);
  4828. }
  4829. });
  4830. if (pending === 0) {
  4831. done();
  4832. }
  4833. return;
  4834. }
  4835. if (opt.async) {
  4836. return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src2) : src2).then((src3) => lexer(src3, opt)).then((tokens) => opt.walkTokens ? Promise.all(marked.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens).then((tokens) => parser(tokens, opt)).then((html) => opt.hooks ? opt.hooks.postprocess(html) : html).catch(throwError);
  4837. }
  4838. try {
  4839. if (opt.hooks) {
  4840. src2 = opt.hooks.preprocess(src2);
  4841. }
  4842. const tokens = lexer(src2, opt);
  4843. if (opt.walkTokens) {
  4844. marked.walkTokens(tokens, opt.walkTokens);
  4845. }
  4846. let html = parser(tokens, opt);
  4847. if (opt.hooks) {
  4848. html = opt.hooks.postprocess(html);
  4849. }
  4850. return html;
  4851. } catch (e) {
  4852. return throwError(e);
  4853. }
  4854. };
  4855. }
  4856. function marked(src2, opt, callback) {
  4857. return parseMarkdown(Lexer.lex, Parser.parse)(src2, opt, callback);
  4858. }
  4859. marked.options = marked.setOptions = function(opt) {
  4860. marked.defaults = { ...marked.defaults, ...opt };
  4861. changeDefaults(marked.defaults);
  4862. return marked;
  4863. };
  4864. marked.getDefaults = getDefaults;
  4865. marked.defaults = defaults;
  4866. marked.use = function(...args) {
  4867. const extensions = marked.defaults.extensions || { renderers: {}, childTokens: {} };
  4868. args.forEach((pack) => {
  4869. const opts = { ...pack };
  4870. opts.async = marked.defaults.async || opts.async || false;
  4871. if (pack.extensions) {
  4872. pack.extensions.forEach((ext) => {
  4873. if (!ext.name) {
  4874. throw new Error("extension name required");
  4875. }
  4876. if (ext.renderer) {
  4877. const prevRenderer = extensions.renderers[ext.name];
  4878. if (prevRenderer) {
  4879. extensions.renderers[ext.name] = function(...args2) {
  4880. let ret = ext.renderer.apply(this, args2);
  4881. if (ret === false) {
  4882. ret = prevRenderer.apply(this, args2);
  4883. }
  4884. return ret;
  4885. };
  4886. } else {
  4887. extensions.renderers[ext.name] = ext.renderer;
  4888. }
  4889. }
  4890. if (ext.tokenizer) {
  4891. if (!ext.level || ext.level !== "block" && ext.level !== "inline") {
  4892. throw new Error("extension level must be 'block' or 'inline'");
  4893. }
  4894. if (extensions[ext.level]) {
  4895. extensions[ext.level].unshift(ext.tokenizer);
  4896. } else {
  4897. extensions[ext.level] = [ext.tokenizer];
  4898. }
  4899. if (ext.start) {
  4900. if (ext.level === "block") {
  4901. if (extensions.startBlock) {
  4902. extensions.startBlock.push(ext.start);
  4903. } else {
  4904. extensions.startBlock = [ext.start];
  4905. }
  4906. } else if (ext.level === "inline") {
  4907. if (extensions.startInline) {
  4908. extensions.startInline.push(ext.start);
  4909. } else {
  4910. extensions.startInline = [ext.start];
  4911. }
  4912. }
  4913. }
  4914. }
  4915. if (ext.childTokens) {
  4916. extensions.childTokens[ext.name] = ext.childTokens;
  4917. }
  4918. });
  4919. opts.extensions = extensions;
  4920. }
  4921. if (pack.renderer) {
  4922. const renderer = marked.defaults.renderer || new Renderer();
  4923. for (const prop in pack.renderer) {
  4924. const prevRenderer = renderer[prop];
  4925. renderer[prop] = (...args2) => {
  4926. let ret = pack.renderer[prop].apply(renderer, args2);
  4927. if (ret === false) {
  4928. ret = prevRenderer.apply(renderer, args2);
  4929. }
  4930. return ret;
  4931. };
  4932. }
  4933. opts.renderer = renderer;
  4934. }
  4935. if (pack.tokenizer) {
  4936. const tokenizer = marked.defaults.tokenizer || new Tokenizer();
  4937. for (const prop in pack.tokenizer) {
  4938. const prevTokenizer = tokenizer[prop];
  4939. tokenizer[prop] = (...args2) => {
  4940. let ret = pack.tokenizer[prop].apply(tokenizer, args2);
  4941. if (ret === false) {
  4942. ret = prevTokenizer.apply(tokenizer, args2);
  4943. }
  4944. return ret;
  4945. };
  4946. }
  4947. opts.tokenizer = tokenizer;
  4948. }
  4949. if (pack.hooks) {
  4950. const hooks = marked.defaults.hooks || new Hooks();
  4951. for (const prop in pack.hooks) {
  4952. const prevHook = hooks[prop];
  4953. if (Hooks.passThroughHooks.has(prop)) {
  4954. hooks[prop] = (arg) => {
  4955. if (marked.defaults.async) {
  4956. return Promise.resolve(pack.hooks[prop].call(hooks, arg)).then((ret2) => {
  4957. return prevHook.call(hooks, ret2);
  4958. });
  4959. }
  4960. const ret = pack.hooks[prop].call(hooks, arg);
  4961. return prevHook.call(hooks, ret);
  4962. };
  4963. } else {
  4964. hooks[prop] = (...args2) => {
  4965. let ret = pack.hooks[prop].apply(hooks, args2);
  4966. if (ret === false) {
  4967. ret = prevHook.apply(hooks, args2);
  4968. }
  4969. return ret;
  4970. };
  4971. }
  4972. }
  4973. opts.hooks = hooks;
  4974. }
  4975. if (pack.walkTokens) {
  4976. const walkTokens = marked.defaults.walkTokens;
  4977. opts.walkTokens = function(token) {
  4978. let values = [];
  4979. values.push(pack.walkTokens.call(this, token));
  4980. if (walkTokens) {
  4981. values = values.concat(walkTokens.call(this, token));
  4982. }
  4983. return values;
  4984. };
  4985. }
  4986. marked.setOptions(opts);
  4987. });
  4988. };
  4989. marked.walkTokens = function(tokens, callback) {
  4990. let values = [];
  4991. for (const token of tokens) {
  4992. values = values.concat(callback.call(marked, token));
  4993. switch (token.type) {
  4994. case "table": {
  4995. for (const cell of token.header) {
  4996. values = values.concat(marked.walkTokens(cell.tokens, callback));
  4997. }
  4998. for (const row of token.rows) {
  4999. for (const cell of row) {
  5000. values = values.concat(marked.walkTokens(cell.tokens, callback));
  5001. }
  5002. }
  5003. break;
  5004. }
  5005. case "list": {
  5006. values = values.concat(marked.walkTokens(token.items, callback));
  5007. break;
  5008. }
  5009. default: {
  5010. if (marked.defaults.extensions && marked.defaults.extensions.childTokens && marked.defaults.extensions.childTokens[token.type]) {
  5011. marked.defaults.extensions.childTokens[token.type].forEach(function(childTokens) {
  5012. values = values.concat(marked.walkTokens(token[childTokens], callback));
  5013. });
  5014. } else if (token.tokens) {
  5015. values = values.concat(marked.walkTokens(token.tokens, callback));
  5016. }
  5017. }
  5018. }
  5019. }
  5020. return values;
  5021. };
  5022. marked.parseInline = parseMarkdown(Lexer.lexInline, Parser.parseInline);
  5023. marked.Parser = Parser;
  5024. marked.parser = Parser.parse;
  5025. marked.Renderer = Renderer;
  5026. marked.TextRenderer = TextRenderer;
  5027. marked.Lexer = Lexer;
  5028. marked.lexer = Lexer.lex;
  5029. marked.Tokenizer = Tokenizer;
  5030. marked.Slugger = Slugger;
  5031. marked.Hooks = Hooks;
  5032. marked.parse = marked;
  5033. marked.options;
  5034. marked.setOptions;
  5035. marked.use;
  5036. marked.walkTokens;
  5037. marked.parseInline;
  5038. Parser.parse;
  5039. Lexer.lex;
  5040. function markdown(md) {
  5041. return marked.parse(md);
  5042. }
  5043. const TAB_WORK_RESULTS_KEY = "common.work-results.results";
  5044. const gotoHome = () => {
  5045. const btn = el("button", { className: "base-style-button-secondary" }, "\u{1F3E1}\u5B98\u7F51\u6559\u7A0B");
  5046. btn.onclick = () => window.open("https://docs.ocsjs.com", "_blank");
  5047. return btn;
  5048. };
  5049. const state$5 = {
  5050. workResult: {
  5051. questionPositionSyncHandler: {
  5052. cx: (index) => {
  5053. var _a;
  5054. const el2 = (_a = document.querySelectorAll('[id*="sigleQuestionDiv"], .questionLi')) == null ? void 0 : _a.item(index);
  5055. if (el2) {
  5056. window.scrollTo({
  5057. top: el2.getBoundingClientRect().top + window.pageYOffset - 50,
  5058. behavior: "smooth"
  5059. });
  5060. }
  5061. },
  5062. "zhs-gxk": (index) => {
  5063. var _a;
  5064. (_a = document.querySelectorAll(".answerCard_list ul li").item(index)) == null ? void 0 : _a.click();
  5065. },
  5066. "zhs-xnk": (index) => {
  5067. var _a;
  5068. (_a = document.querySelectorAll(".jobclassallnumber-div li[questionid]").item(index)) == null ? void 0 : _a.click();
  5069. },
  5070. icve: (index) => {
  5071. var _a;
  5072. (_a = document.querySelectorAll(`.sheet_nums [id*="sheetSeq"]`).item(index)) == null ? void 0 : _a.click();
  5073. },
  5074. zjy: (index) => {
  5075. var _a;
  5076. (_a = document.querySelector(`.e-q-body[data-num="${index + 1}"]`)) == null ? void 0 : _a.scrollIntoView({ behavior: "smooth" });
  5077. }
  5078. }
  5079. },
  5080. setting: {
  5081. listenerIds: {
  5082. aw: 0
  5083. }
  5084. }
  5085. };
  5086. const CommonProject = Project.create({
  5087. name: "\u901A\u7528",
  5088. domains: [],
  5089. scripts: {
  5090. guide: new Script({
  5091. name: "\u{1F3E0} \u811A\u672C\u9996\u9875",
  5092. url: [["\u6240\u6709\u9875\u9762", /.*/]],
  5093. namespace: "common.guide",
  5094. onrender({ panel: panel2 }) {
  5095. const guide = createGuide();
  5096. const contactUs = el("button", { className: "base-style-button-secondary" }, "\u{1F5E8}\uFE0F\u4EA4\u6D41\u7FA4");
  5097. contactUs.onclick = () => window.open("https://docs.ocsjs.com/docs/about#\u4EA4\u6D41\u65B9\u5F0F", "_blank");
  5098. const changeLog = el("button", { className: "base-style-button-secondary" }, "\u{1F4C4}\u67E5\u770B\u66F4\u65B0\u65E5\u5FD7");
  5099. changeLog.onclick = () => CommonProject.scripts.apps.methods.showChangelog();
  5100. changeLog.style.marginBottom = "12px";
  5101. guide.style.width = "480px";
  5102. panel2.body.replaceChildren(el("div", { className: "card" }, [gotoHome(), contactUs, changeLog]), guide);
  5103. }
  5104. }),
  5105. settings: new Script({
  5106. name: "\u2699\uFE0F \u5168\u5C40\u8BBE\u7F6E",
  5107. url: [["\u6240\u6709\u9875\u9762", /.*/]],
  5108. namespace: "common.settings",
  5109. configs: {
  5110. notes: {
  5111. defaultValue: $creator.notes([
  5112. "\u2728\u9F20\u6807\u79FB\u52A8\u5230\u6309\u94AE\u6216\u8005\u8F93\u5165\u6846\uFF0C\u53EF\u4EE5\u770B\u5230\u63D0\u793A\uFF01",
  5113. "\u60F3\u8981\u81EA\u52A8\u7B54\u9898\u5FC5\u987B\u8BBE\u7F6E \u201C\u9898\u5E93\u914D\u7F6E\u201D ",
  5114. "\u8BBE\u7F6E\u540E\u8FDB\u5165\u7AE0\u8282\u6D4B\u8BD5\uFF0C\u4F5C\u4E1A\uFF0C\u8003\u8BD5\u9875\u9762\u5373\u53EF\u81EA\u52A8\u7B54\u9898\u3002"
  5115. ]).outerHTML
  5116. },
  5117. notification: {
  5118. label: "\u5F00\u542F\u7CFB\u7EDF\u901A\u77E5",
  5119. defaultValue: true,
  5120. attrs: {
  5121. 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",
  5122. type: "checkbox"
  5123. }
  5124. },
  5125. enableQuestionCaches: {
  5126. label: "\u9898\u5E93\u7F13\u5B58\u529F\u80FD",
  5127. defaultValue: true,
  5128. attrs: { type: "checkbox", title: "\u8BE6\u60C5\u8BF7\u524D\u5F80 \u901A\u7528-\u5176\u4ED6\u5E94\u7528-\u9898\u5E93\u62D3\u5C55\u67E5\u770B\u3002" }
  5129. },
  5130. answererWrappers: {
  5131. separator: "\u81EA\u52A8\u7B54\u9898\u8BBE\u7F6E",
  5132. defaultValue: []
  5133. },
  5134. disabledAnswererWrapperNames: {
  5135. defaultValue: []
  5136. },
  5137. answererWrappersButton: {
  5138. label: "\u9898\u5E93\u914D\u7F6E",
  5139. defaultValue: "\u70B9\u51FB\u914D\u7F6E",
  5140. attrs: {
  5141. type: "button"
  5142. },
  5143. onload() {
  5144. const aws = CommonProject.scripts.settings.cfg.answererWrappers || [];
  5145. this.value = aws.length ? "\u5F53\u524D\u6709" + aws.length + "\u4E2A\u53EF\u7528\u9898\u5E93\uFF0C\u70B9\u51FB\u91CD\u65B0\u914D\u7F6E" : "\u70B9\u51FB\u914D\u7F6E";
  5146. this.onclick = () => {
  5147. const aw = CommonProject.scripts.settings.cfg.answererWrappers || [];
  5148. const copy = $creator.copy("\u590D\u5236\u9898\u5E93\u914D\u7F6E", JSON.stringify(aw, null, 4));
  5149. const list = el("div", [
  5150. el("div", aw.length ? ["\u4EE5\u4E0B\u662F\u5DF2\u7ECF\u89E3\u6790\u8FC7\u7684\u9898\u5E93\u914D\u7F6E\uFF1A", copy] : ""),
  5151. ...createAnswererWrapperList(aw)
  5152. ]);
  5153. const modal = $modal("prompt", {
  5154. width: 600,
  5155. modalInputType: "textarea",
  5156. inputDefaultValue: aw.length === 0 ? "" : JSON.stringify(aw, null, 4),
  5157. content: $creator.notes([
  5158. [
  5159. el("div", [
  5160. "\u5177\u4F53\u914D\u7F6E\u6559\u7A0B\uFF0C\u8BF7\u67E5\u770B\u5B98\u7F51\uFF1A",
  5161. el("a", { href: "https://docs.ocsjs.com/docs/work" }, "\u81EA\u52A8\u7B54\u9898\u6559\u7A0B")
  5162. ])
  5163. ],
  5164. "\u5982\u679C\u9898\u5E93\u914D\u7F6E\u65E0\u6CD5\u7C98\u8D34\uFF0C\u5219\u8BF4\u660E\u6B64\u9875\u9762\u7981\u6B62\u7C98\u8D34\uFF0C\u8BF7\u5C1D\u8BD5\u524D\u5F80\u5176\u4ED6\u9875\u9762(\u7F51\u8BFE\u4E3B\u9875\u6216\u8005\u5B66\u4E60\u9875\u9762)\u518D\u5C1D\u8BD5\u8FDB\u884C\u7C98\u8D34\u3002",
  5165. ...aw.length ? [list] : []
  5166. ]),
  5167. placeholder: aw.length ? "\u91CD\u65B0\u8F93\u5165" : "\u8F93\u5165\u9898\u5E93\u914D\u7F6E",
  5168. cancelButton: el("button", {
  5169. className: "modal-cancel-button",
  5170. innerText: "\u6E05\u7A7A\u9898\u5E93\u914D\u7F6E",
  5171. onclick: () => {
  5172. $message("success", { content: "\u5DF2\u6E05\u7A7A\uFF0C\u5728\u7B54\u9898\u524D\u8BF7\u8BB0\u5F97\u91CD\u65B0\u914D\u7F6E\u3002" });
  5173. modal == null ? void 0 : modal.remove();
  5174. CommonProject.scripts.settings.cfg.answererWrappers = [];
  5175. this.value = "\u70B9\u51FB\u914D\u7F6E";
  5176. }
  5177. }),
  5178. onConfirm: async (value) => {
  5179. if (value) {
  5180. try {
  5181. const aw2 = await AnswerWrapperParser.from(value);
  5182. if (aw2.length) {
  5183. CommonProject.scripts.settings.cfg.answererWrappers = aw2;
  5184. this.value = "\u5F53\u524D\u6709" + aw2.length + "\u4E2A\u53EF\u7528\u9898\u5E93";
  5185. $modal("alert", {
  5186. width: 600,
  5187. content: el("div", [
  5188. el("div", ["\u{1F389} \u914D\u7F6E\u6210\u529F\uFF0C\u5237\u65B0\u7F51\u9875\u540E\u91CD\u65B0\u7B54\u9898\u5373\u53EF\u3002", "\u89E3\u6790\u5230\u7684\u9898\u5E93\u5982\u4E0B\u6240\u793A:"]),
  5189. ...createAnswererWrapperList(aw2)
  5190. ])
  5191. });
  5192. } else {
  5193. $modal("alert", { content: "\u9898\u5E93\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u914D\u7F6E\u3002" });
  5194. }
  5195. } catch (e) {
  5196. $modal("alert", {
  5197. content: el("div", [el("div", "\u89E3\u6790\u5931\u8D25\uFF0C\u539F\u56E0\u5982\u4E0B :"), el("div", e.message)])
  5198. });
  5199. }
  5200. } else {
  5201. $modal("alert", {
  5202. content: el("div", "\u4E0D\u80FD\u4E3A\u7A7A\uFF01")
  5203. });
  5204. }
  5205. }
  5206. });
  5207. };
  5208. }
  5209. },
  5210. upload: {
  5211. label: "\u7B54\u9898\u5B8C\u6210\u540E",
  5212. tag: "select",
  5213. defaultValue: 80,
  5214. attrs: {
  5215. title: "\u81EA\u52A8\u7B54\u9898\u5B8C\u6210\u540E\u7684\u8BBE\u7F6E\uFF0C\u76EE\u524D\u4EC5\u5728 \u8D85\u661F\u5B66\u4E60\u901A\u7684\u7AE0\u8282\u6D4B\u8BD5 \u4E2D\u751F\u6548, \u9F20\u6807\u60AC\u6D6E\u5728\u9009\u9879\u4E0A\u53EF\u4EE5\u67E5\u770B\u6BCF\u4E2A\u9009\u9879\u7684\u5177\u4F53\u89E3\u91CA\u3002"
  5216. },
  5217. onload() {
  5218. this.append(
  5219. ...$creator.selectOptions(this.getAttribute("value"), [
  5220. ["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"],
  5221. ["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"],
  5222. ...[10, 20, 30, 40, 50, 60, 70, 80, 90].map((rate) => [
  5223. rate.toString(),
  5224. `\u641C\u5230${rate}%\u7684\u9898\u76EE\u5219\u81EA\u52A8\u63D0\u4EA4`,
  5225. `\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`
  5226. ]),
  5227. ["100", "\u6BCF\u4E2A\u9898\u76EE\u90FD\u67E5\u5230\u7B54\u6848\u624D\u81EA\u52A8\u63D0\u4EA4", "\u7B54\u6848\u4E0D\u4E00\u5B9A\u6B63\u786E"],
  5228. ["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"]
  5229. ])
  5230. );
  5231. }
  5232. },
  5233. stopSecondWhenFinish: {
  5234. label: "\u7B54\u9898\u7ED3\u675F\u540E\u6682\u505C\uFF08\u79D2\uFF09",
  5235. attrs: {
  5236. type: "number",
  5237. min: 3,
  5238. step: 1,
  5239. max: 9999,
  5240. title: "\u81EA\u52A8\u7B54\u9898\u811A\u672C\u7ED3\u675F\u540E\u6682\u505C\u7684\u65F6\u95F4\uFF08\u65B9\u4FBF\u67E5\u770B\u548C\u68C0\u67E5\uFF09\u3002"
  5241. },
  5242. defaultValue: 3
  5243. },
  5244. thread: {
  5245. label: "\u7EBF\u7A0B\u6570\u91CF\uFF08\u4E2A\uFF09",
  5246. attrs: {
  5247. type: "number",
  5248. min: 1,
  5249. step: 1,
  5250. max: 3,
  5251. 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"
  5252. },
  5253. defaultValue: 1
  5254. },
  5255. period: {
  5256. label: "\u7B54\u9898\u95F4\u9694\uFF08\u79D2\uFF09",
  5257. attrs: {
  5258. type: "number",
  5259. min: 0,
  5260. step: 1,
  5261. max: 60,
  5262. 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"
  5263. },
  5264. defaultValue: 3
  5265. },
  5266. "work-when-no-job": {
  5267. defaultValue: false,
  5268. label: "(\u4EC5\u8D85\u661F)\u5F3A\u5236\u7B54\u9898",
  5269. attrs: {
  5270. type: "checkbox",
  5271. title: "\u5F53\u7AE0\u8282\u6D4B\u8BD5\u5DE6\u4E0A\u89D2\u5E76\u6CA1\u6709\u9EC4\u8272\u4EFB\u52A1\u70B9\u7684\u65F6\u5019\u4F9D\u7136\u8FDB\u884C\u7B54\u9898\uFF08\u6CA1\u6709\u4EFB\u52A1\u70B9\u8BF4\u660E\u6B64\u4F5C\u4E1A\u53EF\u80FD\u4E0D\u8BA1\u5165\u603B\u6210\u7EE9\uFF0C\u5982\u679C\u8001\u5E08\u8981\u6C42\u5219\u53EF\u4EE5\u5F00\u542F\uFF09"
  5272. }
  5273. },
  5274. "randomWork-choice": {
  5275. defaultValue: false,
  5276. label: "(\u4EC5\u8D85\u661F)\u968F\u673A\u9009\u62E9",
  5277. attrs: { type: "checkbox", title: "\u968F\u673A\u9009\u62E9\u4EFB\u610F\u4E00\u4E2A\u9009\u9879" }
  5278. },
  5279. "randomWork-complete": {
  5280. defaultValue: false,
  5281. label: "(\u4EC5\u8D85\u661F)\u968F\u673A\u586B\u7A7A",
  5282. attrs: { type: "checkbox", title: "\u968F\u673A\u586B\u5199\u4EE5\u4E0B\u4EFB\u610F\u4E00\u4E2A\u6587\u6848" }
  5283. },
  5284. "randomWork-completeTexts-textarea": {
  5285. defaultValue: ["\u4E0D\u4F1A", "\u4E0D\u77E5\u9053", "\u4E0D\u6E05\u695A", "\u4E0D\u61C2", "\u4E0D\u4F1A\u5199"].join("\n"),
  5286. label: "(\u4EC5\u8D85\u661F)\u968F\u673A\u586B\u7A7A\u6587\u6848",
  5287. tag: "textarea",
  5288. attrs: { title: "\u6BCF\u884C\u4E00\u4E2A\uFF0C\u968F\u673A\u586B\u5165" }
  5289. },
  5290. redundanceWordsText: {
  5291. defaultValue: [
  5292. "\u5355\u9009\u9898(\u5FC5\u8003)",
  5293. "\u586B\u7A7A\u9898(\u5FC5\u8003)",
  5294. "\u591A\u9009\u9898(\u5FC5\u8003)",
  5295. "\u3010\u5355\u9009\u9898\u3011",
  5296. "\u3010\u591A\u9009\u9898\u3011",
  5297. "\u3010single choice\u3011",
  5298. "\u3010multiple choice\u3011"
  5299. ].join("\n"),
  5300. label: "\u9898\u76EE\u5197\u4F59\u5B57\u6BB5\u81EA\u52A8\u5220\u9664",
  5301. tag: "textarea",
  5302. attrs: { title: "\u5728\u641C\u9898\u7684\u65F6\u5019\u81EA\u52A8\u5220\u9664\u591A\u4F59\u7684\u6587\u5B57\uFF0C\u4EE5\u4FBF\u63D0\u9AD8\u641C\u9898\u7684\u51C6\u786E\u5EA6\uFF0C\u6BCF\u884C\u4E00\u4E2A\u3002" }
  5303. }
  5304. },
  5305. methods() {
  5306. return {
  5307. getWorkOptions: () => {
  5308. const workOptions = JSON.parse(JSON.stringify(this.cfg));
  5309. workOptions.answererWrappers = workOptions.answererWrappers.filter(
  5310. (aw) => this.cfg.disabledAnswererWrapperNames.find((daw) => daw === aw.name) === void 0
  5311. );
  5312. return workOptions;
  5313. }
  5314. };
  5315. },
  5316. onrender({ panel: panel2 }) {
  5317. if ($gm.getInfos() !== void 0) {
  5318. panel2.body.replaceChildren(...this.cfg.answererWrappers.length ? [el("hr")] : []);
  5319. const refresh = el(
  5320. "button",
  5321. { className: "base-style-button", disabled: this.cfg.answererWrappers.length === 0 },
  5322. "\u{1F504}\uFE0F\u5237\u65B0\u9898\u5E93\u72B6\u6001"
  5323. );
  5324. refresh.onclick = () => {
  5325. updateState();
  5326. };
  5327. const tableContainer = el("div");
  5328. refresh.style.display = "none";
  5329. tableContainer.style.display = "none";
  5330. panel2.body.append(refresh, tableContainer);
  5331. const updateState = async () => {
  5332. tableContainer.replaceChildren();
  5333. let loadedCount = 0;
  5334. if (this.cfg.answererWrappers.length) {
  5335. refresh.style.display = "block";
  5336. tableContainer.style.display = "block";
  5337. refresh.textContent = "\u{1F6AB}\u6B63\u5728\u52A0\u8F7D\u9898\u5E93\u72B6\u6001...";
  5338. refresh.setAttribute("disabled", "true");
  5339. const table = el("table");
  5340. table.style.width = "100%";
  5341. this.cfg.answererWrappers.forEach(async (item) => {
  5342. const t2 = Date.now();
  5343. let success = false;
  5344. let error;
  5345. const isDisabled = this.cfg.disabledAnswererWrapperNames.find((name) => name === item.name);
  5346. const res = isDisabled ? false : await Promise.race([
  5347. (async () => {
  5348. try {
  5349. return await request(new URL(item.url).origin + "/?t=" + t2, {
  5350. type: "GM_xmlhttpRequest",
  5351. method: "head",
  5352. responseType: "text"
  5353. });
  5354. } catch (err) {
  5355. error = err;
  5356. return false;
  5357. }
  5358. })(),
  5359. (async () => {
  5360. await $.sleep(10 * 1e3);
  5361. return false;
  5362. })()
  5363. ]);
  5364. if (typeof res === "string") {
  5365. success = true;
  5366. } else {
  5367. success = false;
  5368. }
  5369. const body = el("tbody");
  5370. body.append(el("td", item.name));
  5371. body.append(
  5372. el("td", success ? "\u8FDE\u63A5\u6210\u529F\u{1F7E2}" : isDisabled ? "\u5DF2\u505C\u7528\u26AA" : error ? "\u8FDE\u63A5\u5931\u8D25\u{1F534}" : "\u8FDE\u63A5\u8D85\u65F6\u{1F7E1}")
  5373. );
  5374. body.append(el("td", `\u5EF6\u8FDF : ${success ? Date.now() - t2 : "---"}/ms`));
  5375. table.append(body);
  5376. loadedCount++;
  5377. if (loadedCount === this.cfg.answererWrappers.length) {
  5378. setTimeout(() => {
  5379. refresh.textContent = "\u{1F504}\uFE0F\u5237\u65B0\u9898\u5E93\u72B6\u6001";
  5380. refresh.removeAttribute("disabled");
  5381. }, 2e3);
  5382. }
  5383. });
  5384. tableContainer.append(table);
  5385. } else {
  5386. refresh.style.display = "none";
  5387. tableContainer.style.display = "none";
  5388. }
  5389. };
  5390. updateState();
  5391. this.offConfigChange(state$5.setting.listenerIds.aw);
  5392. state$5.setting.listenerIds.aw = this.onConfigChange("answererWrappers", (_, __, remote) => {
  5393. if (remote === false) {
  5394. updateState();
  5395. }
  5396. });
  5397. }
  5398. },
  5399. oncomplete() {
  5400. if ($.isInTopWindow()) {
  5401. this.onConfigChange("notification", (open) => {
  5402. if (open) {
  5403. $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", {
  5404. duration: 5
  5405. });
  5406. }
  5407. });
  5408. }
  5409. }
  5410. }),
  5411. workResults: new Script({
  5412. name: "\u{1F30F} \u641C\u7D22\u7ED3\u679C",
  5413. url: [["\u6240\u6709\u9875\u9762", /.*/]],
  5414. namespace: "common.work-results",
  5415. configs: {
  5416. notes: {
  5417. defaultValue: $creator.notes(["\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
  5418. },
  5419. type: {
  5420. label: "\u663E\u793A\u7C7B\u578B",
  5421. tag: "select",
  5422. attrs: { title: "\u4F7F\u7528\u9898\u76EE\u5217\u8868\u53EF\u80FD\u4F1A\u9020\u6210\u9875\u9762\u5361\u987F\u3002" },
  5423. defaultValue: "numbers",
  5424. onload() {
  5425. this.append(
  5426. ...$creator.selectOptions(this.getAttribute("value"), [
  5427. ["numbers", "\u5E8F\u53F7\u5217\u8868"],
  5428. ["questions", "\u9898\u76EE\u5217\u8868"]
  5429. ])
  5430. );
  5431. }
  5432. },
  5433. totalQuestionCount: {
  5434. defaultValue: 0
  5435. },
  5436. requestIndex: {
  5437. defaultValue: 0
  5438. },
  5439. resolverIndex: {
  5440. defaultValue: 0
  5441. },
  5442. currentResultIndex: {
  5443. defaultValue: 0
  5444. },
  5445. questionPositionSyncHandlerType: {
  5446. defaultValue: void 0
  5447. }
  5448. },
  5449. methods() {
  5450. return {
  5451. updateWorkState: (state2) => {
  5452. this.cfg.totalQuestionCount = state2.totalQuestionCount;
  5453. this.cfg.requestIndex = state2.requestIndex;
  5454. this.cfg.resolverIndex = state2.resolverIndex;
  5455. },
  5456. refreshState: () => {
  5457. this.cfg.totalQuestionCount = 0;
  5458. this.cfg.requestIndex = 0;
  5459. this.cfg.resolverIndex = 0;
  5460. },
  5461. clearResults: () => {
  5462. return $store.setTab(TAB_WORK_RESULTS_KEY, []);
  5463. },
  5464. getResults() {
  5465. return $store.getTab(TAB_WORK_RESULTS_KEY) || void 0;
  5466. },
  5467. setResults(results) {
  5468. return $store.setTab(TAB_WORK_RESULTS_KEY, results);
  5469. },
  5470. init(opts) {
  5471. CommonProject.scripts.workResults.cfg.questionPositionSyncHandlerType = opts == null ? void 0 : opts.questionPositionSyncHandlerType;
  5472. CommonProject.scripts.workResults.methods.refreshState();
  5473. CommonProject.scripts.workResults.methods.clearResults();
  5474. },
  5475. createWorkResultsPanel: (mount) => {
  5476. const container = mount || el("div");
  5477. let scrollPercent = 0;
  5478. const list = el("div");
  5479. let mouseoverIndex = -1;
  5480. list.onscroll = () => {
  5481. scrollPercent = list.scrollTop / list.scrollHeight;
  5482. };
  5483. const setNumStyle = (result, num, index) => {
  5484. if (result.requesting) {
  5485. num.classList.add("requesting");
  5486. } else if (result.resolving) {
  5487. num.classList.add("resolving");
  5488. } else if (result.error || result.searchInfos.length === 0 || result.finish === false) {
  5489. num.classList.add("error");
  5490. } else if (index === this.cfg.currentResultIndex) {
  5491. num.classList.add("active");
  5492. }
  5493. };
  5494. const render = debounce_1(async () => {
  5495. const results = await CommonProject.scripts.workResults.methods.getResults();
  5496. if (results == null ? void 0 : results.length) {
  5497. if (results[this.cfg.currentResultIndex] === void 0) {
  5498. this.cfg.currentResultIndex = 0;
  5499. }
  5500. if (this.cfg.type === "numbers") {
  5501. const resultContainer = el("div", {}, (res) => {
  5502. res.style.width = "400px";
  5503. });
  5504. list.style.width = "400px";
  5505. list.style.marginBottom = "12px";
  5506. list.style.maxHeight = window.innerHeight / 2 + "px";
  5507. const nums = results.map((result, index) => {
  5508. return el("span", { className: "search-infos-num", innerText: (index + 1).toString() }, (num) => {
  5509. setNumStyle(result, num, index);
  5510. num.onclick = () => {
  5511. var _a, _b;
  5512. for (const n of nums) {
  5513. n.classList.remove("active");
  5514. }
  5515. num.classList.add("active");
  5516. this.cfg.currentResultIndex = index;
  5517. resultContainer.replaceChildren(createResult(result));
  5518. if (this.cfg.questionPositionSyncHandlerType) {
  5519. (_b = (_a = state$5.workResult.questionPositionSyncHandler)[this.cfg.questionPositionSyncHandlerType]) == null ? void 0 : _b.call(
  5520. _a,
  5521. index
  5522. );
  5523. }
  5524. };
  5525. });
  5526. });
  5527. list.replaceChildren(...nums);
  5528. resultContainer.replaceChildren(createResult(results[this.cfg.currentResultIndex]));
  5529. container.replaceChildren(list, resultContainer);
  5530. } else {
  5531. list.style.width = "400px";
  5532. list.style.overflow = "auto";
  5533. list.style.maxHeight = window.innerHeight / 2 + "px";
  5534. const resultContainer = el("div", { className: "work-result-question-container" });
  5535. const nums = [];
  5536. const questions = results.map((result, index) => {
  5537. const num = el(
  5538. "span",
  5539. {
  5540. className: "search-infos-num",
  5541. innerHTML: (index + 1).toString()
  5542. },
  5543. (num2) => {
  5544. num2.style.marginRight = "12px";
  5545. num2.style.display = "inline-block";
  5546. setNumStyle(result, num2, index);
  5547. }
  5548. );
  5549. nums.push(num);
  5550. return el(
  5551. "div",
  5552. [num, result.question],
  5553. (question) => {
  5554. question.className = "search-infos-question";
  5555. if (result.requesting === false && result.resolving === false && (result.error || result.searchInfos.length === 0 || result.finish === false)) {
  5556. question.classList.add("error");
  5557. } else if (index === this.cfg.currentResultIndex) {
  5558. question.classList.add("active");
  5559. }
  5560. question.onmouseover = () => {
  5561. mouseoverIndex = index;
  5562. question.classList.add("hover");
  5563. resultContainer.replaceChildren(createResult(result));
  5564. };
  5565. question.onmouseleave = () => {
  5566. mouseoverIndex = -1;
  5567. question.classList.remove("hover");
  5568. resultContainer.replaceChildren(createResult(results[this.cfg.currentResultIndex]));
  5569. };
  5570. question.onclick = () => {
  5571. var _a, _b;
  5572. for (const n of nums) {
  5573. n.classList.remove("active");
  5574. }
  5575. for (const q of questions) {
  5576. q.classList.remove("active");
  5577. }
  5578. nums[index].classList.add("active");
  5579. question.classList.add("active");
  5580. this.cfg.currentResultIndex = index;
  5581. resultContainer.replaceChildren(createResult(result));
  5582. if (this.cfg.questionPositionSyncHandlerType) {
  5583. (_b = (_a = state$5.workResult.questionPositionSyncHandler)[this.cfg.questionPositionSyncHandlerType]) == null ? void 0 : _b.call(
  5584. _a,
  5585. index
  5586. );
  5587. }
  5588. };
  5589. }
  5590. );
  5591. });
  5592. list.replaceChildren(...questions);
  5593. if (mouseoverIndex === -1) {
  5594. resultContainer.replaceChildren(createResult(results[this.cfg.currentResultIndex]));
  5595. } else {
  5596. resultContainer.replaceChildren(createResult(results[mouseoverIndex]));
  5597. }
  5598. container.replaceChildren(
  5599. el("div", [list, el("div", {}, [resultContainer])], (div) => {
  5600. div.style.display = "flex";
  5601. })
  5602. );
  5603. }
  5604. } else {
  5605. container.replaceChildren(
  5606. el("div", "\u26A0\uFE0F\u6682\u65E0\u4EFB\u4F55\u641C\u7D22\u7ED3\u679C", (div) => {
  5607. div.style.textAlign = "center";
  5608. })
  5609. );
  5610. }
  5611. list.scrollTo({
  5612. top: scrollPercent * list.scrollHeight,
  5613. behavior: "auto"
  5614. });
  5615. const tip = el("div", [
  5616. el("div", { className: "search-infos-num requesting" }, "n"),
  5617. "\u8868\u793A\u641C\u7D22\u4E2D ",
  5618. el("br"),
  5619. el("div", { className: "search-infos-num resolving" }, "n"),
  5620. "\u8868\u793A\u5DF2\u641C\u7D22\u4F46\u672A\u5F00\u59CB\u7B54\u9898 ",
  5621. el("br"),
  5622. el("div", { className: "search-infos-num" }, "n"),
  5623. "\u8868\u793A\u5DF2\u641C\u7D22\u5DF2\u7B54\u9898 "
  5624. ]);
  5625. container.prepend(
  5626. el("hr"),
  5627. el(
  5628. "div",
  5629. [
  5630. $creator.space(
  5631. [
  5632. el("span", `\u5F53\u524D\u641C\u9898: ${this.cfg.requestIndex}/${this.cfg.totalQuestionCount}`),
  5633. el("span", `\u5F53\u524D\u7B54\u9898: ${this.cfg.resolverIndex}/${this.cfg.totalQuestionCount}`),
  5634. el("a", "\u63D0\u793A", (btn) => {
  5635. btn.style.cursor = "pointer";
  5636. btn.onclick = () => {
  5637. $modal("confirm", { content: tip });
  5638. };
  5639. })
  5640. ],
  5641. { separator: "|" }
  5642. )
  5643. ],
  5644. (div) => {
  5645. div.style.marginBottom = "12px";
  5646. }
  5647. ),
  5648. el("hr")
  5649. );
  5650. }, 100);
  5651. const createResult = (result) => {
  5652. if (result) {
  5653. const error = el("span", {}, (el2) => el2.style.color = "red");
  5654. if (result.requesting && result.resolving) {
  5655. return el("div", [
  5656. result.question,
  5657. $creator.createQuestionTitleExtra(result.question),
  5658. el("hr"),
  5659. "\u5F53\u524D\u9898\u76EE\u8FD8\u672A\u5F00\u59CB\u641C\u7D22\uFF0C\u8BF7\u7A0D\u7B49\u3002"
  5660. ]);
  5661. } else {
  5662. if (result.error) {
  5663. error.innerText = result.error;
  5664. return el("div", [
  5665. result.question,
  5666. $creator.createQuestionTitleExtra(result.question),
  5667. el("hr"),
  5668. error
  5669. ]);
  5670. } else if (result.searchInfos.length === 0) {
  5671. error.innerText = "\u6B64\u9898\u672A\u641C\u7D22\u5230\u7B54\u6848";
  5672. return el("div", [
  5673. result.question,
  5674. $creator.createQuestionTitleExtra(result.question),
  5675. el("hr"),
  5676. error
  5677. ]);
  5678. } else {
  5679. error.innerText = "\u6B64\u9898\u672A\u5B8C\u6210, \u53EF\u80FD\u662F\u6CA1\u6709\u5339\u914D\u7684\u9009\u9879\u3002";
  5680. return el("div", [
  5681. ...result.finish ? [] : [result.resolving ? "\u6B63\u5728\u7B49\u5F85\u7B54\u9898\u4E2D\uFF0C\u8BF7\u7A0D\u7B49\u3002" : error],
  5682. el("search-infos-element", {
  5683. infos: result.searchInfos,
  5684. question: result.question
  5685. })
  5686. ]);
  5687. }
  5688. }
  5689. } else {
  5690. return el("div", "undefined");
  5691. }
  5692. };
  5693. render();
  5694. this.onConfigChange("type", render);
  5695. this.onConfigChange("requestIndex", render);
  5696. this.onConfigChange("resolverIndex", render);
  5697. $store.addChangeListener(TAB_WORK_RESULTS_KEY, render);
  5698. return container;
  5699. }
  5700. };
  5701. },
  5702. onrender({ panel: panel2 }) {
  5703. panel2.body.replaceChildren(this.methods.createWorkResultsPanel());
  5704. }
  5705. }),
  5706. onlineSearch: new Script({
  5707. name: "\u{1F50E} \u5728\u7EBF\u641C\u9898",
  5708. url: [["\u6240\u6709\u9875\u9762", /.*/]],
  5709. namespace: "common.online-search",
  5710. configs: {
  5711. notes: {
  5712. 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"
  5713. },
  5714. selectSearch: {
  5715. label: "\u5212\u8BCD\u641C\u7D22",
  5716. defaultValue: true,
  5717. attrs: { type: "checkbox", title: "\u4F7F\u7528\u9F20\u6807\u6ED1\u52A8\u9009\u62E9\u9875\u9762\u4E2D\u7684\u9898\u76EE\u8FDB\u884C\u641C\u7D22\u3002" }
  5718. },
  5719. selection: {
  5720. defaultValue: ""
  5721. }
  5722. },
  5723. oncomplete() {
  5724. if (this.cfg.selectSearch) {
  5725. document.addEventListener(
  5726. "selectionchange",
  5727. debounce_1(() => {
  5728. var _a;
  5729. this.cfg.selection = ((_a = document.getSelection()) == null ? void 0 : _a.toString()) || "";
  5730. }, 500)
  5731. );
  5732. }
  5733. },
  5734. onrender({ panel: panel2 }) {
  5735. const content = el("div", "\u8BF7\u8F93\u5165\u9898\u76EE\u8FDB\u884C\u641C\u7D22\uFF1A", (content2) => {
  5736. content2.style.marginBottom = "12px";
  5737. });
  5738. const input = el("input", { placeholder: "\u8BF7\u5C3D\u91CF\u4FDD\u8BC1\u9898\u76EE\u5B8C\u6574\uFF0C\u4E0D\u8981\u6F0F\u5B57\u54E6\u3002" }, (input2) => {
  5739. input2.className = "base-style-input";
  5740. input2.style.flex = "1";
  5741. });
  5742. const search = async (value) => {
  5743. content.replaceChildren(el("span", "\u641C\u7D22\u4E2D..."));
  5744. if (value) {
  5745. const t2 = Date.now();
  5746. const infos = await defaultAnswerWrapperHandler(CommonProject.scripts.settings.cfg.answererWrappers, {
  5747. title: value
  5748. });
  5749. const resume = ((Date.now() - t2) / 1e3).toFixed(2);
  5750. content.replaceChildren(
  5751. el(
  5752. "div",
  5753. [
  5754. el("div", `\u641C\u7D22\u5230 ${infos.map((i) => i.results).flat().length} \u4E2A\u7ED3\u679C\uFF0C\u5171\u8017\u65F6 ${resume} \u79D2`),
  5755. el("search-infos-element", {
  5756. infos: infos.map((info) => ({
  5757. results: info.results.map((res) => [res.question, res.answer]),
  5758. homepage: info.homepage,
  5759. name: info.name
  5760. })),
  5761. question: value
  5762. })
  5763. ],
  5764. (div) => {
  5765. div.style.width = "400px";
  5766. }
  5767. )
  5768. );
  5769. } else {
  5770. content.replaceChildren(el("span", "\u9898\u76EE\u4E0D\u80FD\u4E3A\u7A7A\uFF01"));
  5771. }
  5772. };
  5773. const button = el("button", "\u641C\u7D22", (button2) => {
  5774. button2.className = "base-style-button";
  5775. button2.onclick = () => {
  5776. search(input.value);
  5777. };
  5778. });
  5779. const searchContainer = el("div", [input, button], (div) => {
  5780. div.style.display = "flex";
  5781. });
  5782. this.onConfigChange("selection", (curr) => {
  5783. if (input.parentElement) {
  5784. input.value = curr;
  5785. }
  5786. });
  5787. panel2.body.append(el("div", [el("hr"), content, searchContainer]));
  5788. }
  5789. }),
  5790. render: RenderScript,
  5791. hack: new Script({
  5792. name: "\u9875\u9762\u590D\u5236\u7C98\u8D34\u9650\u5236\u89E3\u9664",
  5793. url: [["\u6240\u6709\u9875\u9762", /.*/]],
  5794. hideInPanel: true,
  5795. onactive() {
  5796. enableCopy();
  5797. },
  5798. oncomplete() {
  5799. enableCopy();
  5800. setTimeout(() => enableCopy(), 3e3);
  5801. }
  5802. }),
  5803. disableDialog: new Script({
  5804. name: "\u7981\u6B62\u5F39\u7A97",
  5805. url: [["\u6240\u6709\u9875\u9762", /.*/]],
  5806. hideInPanel: true,
  5807. priority: 1,
  5808. onstart() {
  5809. function disableDialog(msg) {
  5810. $modal("alert", {
  5811. profile: "\u5F39\u7A97\u6765\u81EA\uFF1A" + location.origin,
  5812. content: msg
  5813. });
  5814. }
  5815. try {
  5816. $gm.unsafeWindow.alert = disableDialog;
  5817. window.alert = disableDialog;
  5818. } catch (e) {
  5819. console.error(e);
  5820. }
  5821. }
  5822. }),
  5823. apps: new Script({
  5824. name: "\u{1F4F1} \u62D3\u5C55\u5E94\u7528",
  5825. url: [["", /.*/]],
  5826. namespace: "common.apps",
  5827. configs: {
  5828. notes: {
  5829. defaultValue: "\u8FD9\u91CC\u662F\u4E00\u4E9B\u5176\u4ED6\u7684\u5E94\u7528\u6216\u8005\u62D3\u5C55\u529F\u80FD\u3002"
  5830. },
  5831. localQuestionCaches: {
  5832. defaultValue: [],
  5833. extra: {
  5834. appConfigSync: false
  5835. }
  5836. }
  5837. },
  5838. methods() {
  5839. return {
  5840. addQuestionCache: async (...questionCacheItems) => {
  5841. const questionCaches = this.cfg.localQuestionCaches;
  5842. for (const item of questionCacheItems) {
  5843. if (questionCaches.find((c) => c.title === item.title && c.answer === item.answer) === void 0) {
  5844. questionCaches.unshift(item);
  5845. }
  5846. }
  5847. questionCaches.splice(200);
  5848. this.cfg.localQuestionCaches = questionCaches;
  5849. },
  5850. addQuestionCacheFromWorkResult(swr) {
  5851. CommonProject.scripts.apps.methods.addQuestionCache(
  5852. ...swr.map(
  5853. (r) => r.searchInfos.map(
  5854. (i) => i.results.filter((res) => res[1]).map((res) => ({
  5855. title: r.question,
  5856. answer: res[1],
  5857. from: i.name.replace(/【题库缓存】/g, ""),
  5858. homepage: i.homepage || ""
  5859. })).flat()
  5860. ).flat()
  5861. ).flat()
  5862. );
  5863. },
  5864. searchAnswerInCaches: async (title, whenSearchEmpty) => {
  5865. let results = [];
  5866. const caches = this.cfg.localQuestionCaches;
  5867. for (const cache of caches) {
  5868. if (cache.title === title) {
  5869. results.push({
  5870. name: `\u3010\u9898\u5E93\u7F13\u5B58\u3011${cache.from}`,
  5871. homepage: cache.homepage,
  5872. results: [{ answer: cache.answer, question: cache.title }]
  5873. });
  5874. }
  5875. }
  5876. if (results.length === 0) {
  5877. results = await whenSearchEmpty();
  5878. }
  5879. return results;
  5880. },
  5881. async showChangelog() {
  5882. const changelog = el("div", {
  5883. className: "markdown card",
  5884. innerHTML: "\u52A0\u8F7D\u4E2D...",
  5885. style: { maxWidth: "600px" }
  5886. });
  5887. $modal("simple", {
  5888. width: 600,
  5889. content: el("div", [
  5890. el("div", { className: "notes card" }, [
  5891. $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"])
  5892. ]),
  5893. changelog
  5894. ])
  5895. });
  5896. const md = await request("https://cdn.ocsjs.com/articles/ocs/changelog.md?t=" + Date.now(), {
  5897. type: "GM_xmlhttpRequest",
  5898. responseType: "text",
  5899. method: "get"
  5900. });
  5901. changelog.innerHTML = markdown(md);
  5902. }
  5903. };
  5904. },
  5905. onrender({ panel: panel2 }) {
  5906. const btnStyle = {
  5907. padding: "6px 12px",
  5908. margin: "4px",
  5909. marginBottom: "8px",
  5910. boxShadow: "0px 0px 4px #bebebe",
  5911. borderRadius: "8px",
  5912. cursor: "pointer"
  5913. };
  5914. const cachesBtn = el("div", { innerText: "\u{1F4BE} \u9898\u5E93\u7F13\u5B58", style: btnStyle }, (btn) => {
  5915. btn.onclick = () => {
  5916. const questionCaches = this.cfg.localQuestionCaches;
  5917. const list = questionCaches.map(
  5918. (c) => el(
  5919. "div",
  5920. {
  5921. className: "question-cache",
  5922. style: {
  5923. margin: "8px",
  5924. border: "1px solid lightgray",
  5925. borderRadius: "4px",
  5926. padding: "8px"
  5927. }
  5928. },
  5929. [
  5930. el("div", { className: "title" }, [
  5931. $creator.tooltip(
  5932. el(
  5933. "span",
  5934. {
  5935. title: `\u6765\u81EA\uFF1A${c.from || "\u672A\u77E5\u9898\u5E93"}
  5936. \u4E3B\u9875\uFF1A${c.homepage || "\u672A\u77E5\u4E3B\u9875"}`,
  5937. style: { fontWeight: "bold" }
  5938. },
  5939. c.title
  5940. )
  5941. )
  5942. ]),
  5943. el("div", { className: "answer", style: { marginTop: "6px" } }, c.answer)
  5944. ]
  5945. )
  5946. );
  5947. $modal("simple", {
  5948. width: 800,
  5949. content: el("div", [
  5950. el("div", { className: "notes card" }, [
  5951. $creator.notes([
  5952. "\u9898\u5E93\u7F13\u5B58\u662F\u5C06\u9898\u5E93\u7684\u9898\u76EE\u548C\u7B54\u6848\u4FDD\u5B58\u5728\u5185\u5B58\uFF0C\u5728\u91CD\u590D\u4F7F\u7528\u65F6\u53EF\u4EE5\u76F4\u63A5\u4ECE\u5185\u5B58\u83B7\u53D6\uFF0C\u4E0D\u9700\u8981\u518D\u6B21\u8BF7\u6C42\u9898\u5E93\u3002",
  5953. "\u4EE5\u4E0B\u662F\u5F53\u524D\u5B58\u50A8\u7684\u9898\u5E93\uFF0C\u9ED8\u8BA4\u5B58\u50A8200\u9898\uFF0C\u5F53\u524D\u9875\u9762\u5173\u95ED\u540E\u4F1A\u81EA\u52A8\u6E05\u9664\u3002"
  5954. ])
  5955. ]),
  5956. el("div", { className: "card" }, [
  5957. $creator.space(
  5958. [
  5959. el("span", ["\u5F53\u524D\u7F13\u5B58\u6570\u91CF\uFF1A" + questionCaches.length]),
  5960. $creator.button("\u6E05\u7A7A\u9898\u5E93\u7F13\u5B58", {}, (btn2) => {
  5961. btn2.onclick = () => {
  5962. this.cfg.localQuestionCaches = [];
  5963. list.forEach((el2) => el2.remove());
  5964. };
  5965. })
  5966. ],
  5967. { separator: "|" }
  5968. )
  5969. ]),
  5970. el(
  5971. "div",
  5972. questionCaches.length === 0 ? [el("div", { style: { textAlign: "center" } }, "\u6682\u65E0\u9898\u5E93\u7F13\u5B58")] : list
  5973. )
  5974. ])
  5975. });
  5976. };
  5977. });
  5978. [cachesBtn].forEach((btn) => {
  5979. btn.onmouseover = () => {
  5980. btn.style.boxShadow = "0px 0px 4px #0099ff9c";
  5981. };
  5982. btn.onmouseout = () => {
  5983. btn.style.boxShadow = "0px 0px 4px #bebebe";
  5984. };
  5985. });
  5986. panel2.body.replaceChildren(
  5987. el("div", [el("div", { className: "separator", style: { padding: "4px 0px" } }, "\u9898\u5E93\u62D3\u5C55"), cachesBtn])
  5988. );
  5989. }
  5990. })
  5991. }
  5992. });
  5993. function enableCopy() {
  5994. function hackSelect(target) {
  5995. if (target) {
  5996. const _original_select = target.onselectstart;
  5997. const _original_oncopy = target.oncopy;
  5998. const _original_onpaste = target.onpaste;
  5999. const _original_onkeydown = target.onkeydown;
  6000. target.onselectstart = (e) => {
  6001. _original_select == null ? void 0 : _original_select.apply(target, [e]);
  6002. return true;
  6003. };
  6004. target.oncopy = (e) => {
  6005. _original_oncopy == null ? void 0 : _original_oncopy.apply(target, [e]);
  6006. return true;
  6007. };
  6008. target.onpaste = (e) => {
  6009. _original_onpaste == null ? void 0 : _original_onpaste.apply(target, [e]);
  6010. return true;
  6011. };
  6012. target.onkeydown = (e) => {
  6013. _original_onkeydown == null ? void 0 : _original_onkeydown.apply(target, [e]);
  6014. return true;
  6015. };
  6016. }
  6017. }
  6018. hackSelect(document);
  6019. hackSelect(document.body);
  6020. const style = document.createElement("style");
  6021. style.innerHTML = `
  6022. html * {
  6023. -webkit-user-select: text !important;
  6024. -khtml-user-select: text !important;
  6025. -moz-user-select: text !important;
  6026. -ms-user-select: text !important;
  6027. user-select: text !important;
  6028. }`;
  6029. document.head.append(style);
  6030. }
  6031. function createAnswererWrapperList(aw) {
  6032. return aw.map(
  6033. (item) => el(
  6034. "details",
  6035. [
  6036. el("summary", [
  6037. $creator.space([
  6038. el("span", item.name),
  6039. (() => {
  6040. let isDisabled = CommonProject.scripts.settings.cfg.disabledAnswererWrapperNames.includes(item.name);
  6041. const btn = $creator.button(
  6042. isDisabled ? "\u542F\u7528\u6B64\u9898\u5E93" : "\u505C\u7528\u6B64\u9898\u5E93",
  6043. { className: isDisabled ? "base-style-button" : "base-style-button-secondary" },
  6044. (controlsBtn) => {
  6045. controlsBtn.onclick = () => {
  6046. isDisabled = !isDisabled;
  6047. controlsBtn.value = isDisabled ? "\u542F\u7528\u6B64\u9898\u5E93" : "\u505C\u7528\u6B64\u9898\u5E93";
  6048. controlsBtn.className = isDisabled ? "base-style-button" : "base-style-button-secondary";
  6049. if (isDisabled) {
  6050. CommonProject.scripts.settings.cfg.disabledAnswererWrapperNames = [
  6051. ...CommonProject.scripts.settings.cfg.disabledAnswererWrapperNames,
  6052. item.name
  6053. ];
  6054. } else {
  6055. CommonProject.scripts.settings.cfg.disabledAnswererWrapperNames = CommonProject.scripts.settings.cfg.disabledAnswererWrapperNames.filter(
  6056. (name) => name !== item.name
  6057. );
  6058. }
  6059. };
  6060. }
  6061. );
  6062. return btn;
  6063. })()
  6064. ])
  6065. ]),
  6066. el("ul", [
  6067. el("li", ["\u540D\u5B57 ", item.name]),
  6068. el("li", { innerHTML: `\u5B98\u7F51 <a target="_blank" href=${item.homepage}>${item.homepage || "\u65E0"}</a>` }),
  6069. el("li", ["\u63A5\u53E3 ", item.url]),
  6070. el("li", ["\u8BF7\u6C42\u65B9\u6CD5 ", item.method]),
  6071. el("li", ["\u8BF7\u6C42\u7C7B\u578B ", item.type]),
  6072. el("li", ["\u8BF7\u6C42\u5934 ", JSON.stringify(item.headers, null, 4) || "\u65E0"]),
  6073. el("li", ["\u8BF7\u6C42\u4F53 ", JSON.stringify(item.data, null, 4) || "\u65E0"])
  6074. ])
  6075. ],
  6076. (details) => {
  6077. details.style.paddingLeft = "12px";
  6078. }
  6079. )
  6080. );
  6081. }
  6082. const createGuide = () => {
  6083. const showProjectDetails = (project) => {
  6084. $modal("simple", {
  6085. title: project.name + " - \u7684\u811A\u672C\u5217\u8868",
  6086. width: 800,
  6087. content: el(
  6088. "ul",
  6089. Object.keys(project.scripts).sort((a, b) => project.scripts[b].hideInPanel ? -1 : 1).map((key) => {
  6090. const script = project.scripts[key];
  6091. return el(
  6092. "li",
  6093. [
  6094. el("b", script.name),
  6095. $creator.notes([
  6096. el("span", ["\u64CD\u4F5C\u9762\u677F\uFF1A", script.hideInPanel ? "\u9690\u85CF" : "\u663E\u793A"]),
  6097. [
  6098. "\u8FD0\u884C\u9875\u9762\uFF1A",
  6099. el(
  6100. "ul",
  6101. script.url.map(
  6102. (i) => el("li", [
  6103. i[0],
  6104. "\uFF1A",
  6105. i[1] instanceof RegExp ? i[1].toString().replace(/\\/g, "").slice(1, -1) : el("span", i[1])
  6106. ])
  6107. )
  6108. )
  6109. ]
  6110. ])
  6111. ],
  6112. (li) => {
  6113. li.style.marginBottom = "12px";
  6114. }
  6115. );
  6116. }),
  6117. (ul) => {
  6118. ul.style.paddingLeft = "42px";
  6119. }
  6120. )
  6121. });
  6122. };
  6123. return el("div", { className: "user-guide card" }, [
  6124. el("div", { className: "separator", style: { padding: "12px 0px" } }, "\u2728 \u652F\u6301\u7684\u7F51\u8BFE\u5E73\u53F0"),
  6125. el("div", [
  6126. ...definedProjects().filter((p) => p.studyProject).map((project) => {
  6127. const btn = el("button", { className: "base-style-button-secondary" }, [project.name]);
  6128. btn.onclick = () => {
  6129. showProjectDetails(project);
  6130. };
  6131. return btn;
  6132. })
  6133. ]),
  6134. el("div", { className: "separator", style: { padding: "12px 0px" } }, "\u{1F4D6} \u4F7F\u7528\u6559\u7A0B"),
  6135. $creator.notes(
  6136. [
  6137. "\u6253\u5F00\u4EFB\u610F\u7F51\u8BFE\u5E73\u53F0\uFF0C\u7B49\u5F85\u811A\u672C\u52A0\u8F7D\uFF0C",
  6138. "\u811A\u672C\u52A0\u8F7D\u540E\u67E5\u770B\u6BCF\u4E2A\u7F51\u8BFE\u4E0D\u540C\u7684\u4F7F\u7528\u63D0\u793A\u3002",
  6139. "\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",
  6140. [
  6141. "\u6700\u540E\u6E29\u99A8\u63D0\u793A: ",
  6142. "- \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",
  6143. "- \u4EFB\u4F55\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",
  6144. "- \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"
  6145. ]
  6146. ],
  6147. "ol"
  6148. )
  6149. ]);
  6150. };
  6151. const debug$1 = typeof process === "object" && process.env && {}.NODE_DEBUG && /\bsemver\b/i.test({}.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => {
  6152. };
  6153. var debug_1 = debug$1;
  6154. const SEMVER_SPEC_VERSION = "2.0.0";
  6155. const MAX_LENGTH$1 = 256;
  6156. const MAX_SAFE_INTEGER$1 = Number.MAX_SAFE_INTEGER || 9007199254740991;
  6157. const MAX_SAFE_COMPONENT_LENGTH = 16;
  6158. const MAX_SAFE_BUILD_LENGTH = MAX_LENGTH$1 - 6;
  6159. const RELEASE_TYPES = [
  6160. "major",
  6161. "premajor",
  6162. "minor",
  6163. "preminor",
  6164. "patch",
  6165. "prepatch",
  6166. "prerelease"
  6167. ];
  6168. var constants = {
  6169. MAX_LENGTH: MAX_LENGTH$1,
  6170. MAX_SAFE_COMPONENT_LENGTH,
  6171. MAX_SAFE_BUILD_LENGTH,
  6172. MAX_SAFE_INTEGER: MAX_SAFE_INTEGER$1,
  6173. RELEASE_TYPES,
  6174. SEMVER_SPEC_VERSION,
  6175. FLAG_INCLUDE_PRERELEASE: 1,
  6176. FLAG_LOOSE: 2
  6177. };
  6178. var re$1 = { exports: {} };
  6179. (function(module2, exports3) {
  6180. const {
  6181. MAX_SAFE_COMPONENT_LENGTH: MAX_SAFE_COMPONENT_LENGTH2,
  6182. MAX_SAFE_BUILD_LENGTH: MAX_SAFE_BUILD_LENGTH2,
  6183. MAX_LENGTH: MAX_LENGTH2
  6184. } = constants;
  6185. const debug2 = debug_1;
  6186. exports3 = module2.exports = {};
  6187. const re2 = exports3.re = [];
  6188. const safeRe = exports3.safeRe = [];
  6189. const src2 = exports3.src = [];
  6190. const t2 = exports3.t = {};
  6191. let R2 = 0;
  6192. const LETTERDASHNUMBER = "[a-zA-Z0-9-]";
  6193. const safeRegexReplacements = [
  6194. ["\\s", 1],
  6195. ["\\d", MAX_LENGTH2],
  6196. [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH2]
  6197. ];
  6198. const makeSafeRegex = (value) => {
  6199. for (const [token, max] of safeRegexReplacements) {
  6200. value = value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);
  6201. }
  6202. return value;
  6203. };
  6204. const createToken = (name, value, isGlobal) => {
  6205. const safe = makeSafeRegex(value);
  6206. const index = R2++;
  6207. debug2(name, index, value);
  6208. t2[name] = index;
  6209. src2[index] = value;
  6210. re2[index] = new RegExp(value, isGlobal ? "g" : void 0);
  6211. safeRe[index] = new RegExp(safe, isGlobal ? "g" : void 0);
  6212. };
  6213. createToken("NUMERICIDENTIFIER", "0|[1-9]\\d*");
  6214. createToken("NUMERICIDENTIFIERLOOSE", "\\d+");
  6215. createToken("NONNUMERICIDENTIFIER", `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);
  6216. createToken("MAINVERSION", `(${src2[t2.NUMERICIDENTIFIER]})\\.(${src2[t2.NUMERICIDENTIFIER]})\\.(${src2[t2.NUMERICIDENTIFIER]})`);
  6217. createToken("MAINVERSIONLOOSE", `(${src2[t2.NUMERICIDENTIFIERLOOSE]})\\.(${src2[t2.NUMERICIDENTIFIERLOOSE]})\\.(${src2[t2.NUMERICIDENTIFIERLOOSE]})`);
  6218. createToken("PRERELEASEIDENTIFIER", `(?:${src2[t2.NUMERICIDENTIFIER]}|${src2[t2.NONNUMERICIDENTIFIER]})`);
  6219. createToken("PRERELEASEIDENTIFIERLOOSE", `(?:${src2[t2.NUMERICIDENTIFIERLOOSE]}|${src2[t2.NONNUMERICIDENTIFIER]})`);
  6220. createToken("PRERELEASE", `(?:-(${src2[t2.PRERELEASEIDENTIFIER]}(?:\\.${src2[t2.PRERELEASEIDENTIFIER]})*))`);
  6221. createToken("PRERELEASELOOSE", `(?:-?(${src2[t2.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src2[t2.PRERELEASEIDENTIFIERLOOSE]})*))`);
  6222. createToken("BUILDIDENTIFIER", `${LETTERDASHNUMBER}+`);
  6223. createToken("BUILD", `(?:\\+(${src2[t2.BUILDIDENTIFIER]}(?:\\.${src2[t2.BUILDIDENTIFIER]})*))`);
  6224. createToken("FULLPLAIN", `v?${src2[t2.MAINVERSION]}${src2[t2.PRERELEASE]}?${src2[t2.BUILD]}?`);
  6225. createToken("FULL", `^${src2[t2.FULLPLAIN]}$`);
  6226. createToken("LOOSEPLAIN", `[v=\\s]*${src2[t2.MAINVERSIONLOOSE]}${src2[t2.PRERELEASELOOSE]}?${src2[t2.BUILD]}?`);
  6227. createToken("LOOSE", `^${src2[t2.LOOSEPLAIN]}$`);
  6228. createToken("GTLT", "((?:<|>)?=?)");
  6229. createToken("XRANGEIDENTIFIERLOOSE", `${src2[t2.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);
  6230. createToken("XRANGEIDENTIFIER", `${src2[t2.NUMERICIDENTIFIER]}|x|X|\\*`);
  6231. createToken("XRANGEPLAIN", `[v=\\s]*(${src2[t2.XRANGEIDENTIFIER]})(?:\\.(${src2[t2.XRANGEIDENTIFIER]})(?:\\.(${src2[t2.XRANGEIDENTIFIER]})(?:${src2[t2.PRERELEASE]})?${src2[t2.BUILD]}?)?)?`);
  6232. createToken("XRANGEPLAINLOOSE", `[v=\\s]*(${src2[t2.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src2[t2.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src2[t2.XRANGEIDENTIFIERLOOSE]})(?:${src2[t2.PRERELEASELOOSE]})?${src2[t2.BUILD]}?)?)?`);
  6233. createToken("XRANGE", `^${src2[t2.GTLT]}\\s*${src2[t2.XRANGEPLAIN]}$`);
  6234. createToken("XRANGELOOSE", `^${src2[t2.GTLT]}\\s*${src2[t2.XRANGEPLAINLOOSE]}$`);
  6235. createToken("COERCE", `${"(^|[^\\d])(\\d{1,"}${MAX_SAFE_COMPONENT_LENGTH2}})(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH2}}))?(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH2}}))?(?:$|[^\\d])`);
  6236. createToken("COERCERTL", src2[t2.COERCE], true);
  6237. createToken("LONETILDE", "(?:~>?)");
  6238. createToken("TILDETRIM", `(\\s*)${src2[t2.LONETILDE]}\\s+`, true);
  6239. exports3.tildeTrimReplace = "$1~";
  6240. createToken("TILDE", `^${src2[t2.LONETILDE]}${src2[t2.XRANGEPLAIN]}$`);
  6241. createToken("TILDELOOSE", `^${src2[t2.LONETILDE]}${src2[t2.XRANGEPLAINLOOSE]}$`);
  6242. createToken("LONECARET", "(?:\\^)");
  6243. createToken("CARETTRIM", `(\\s*)${src2[t2.LONECARET]}\\s+`, true);
  6244. exports3.caretTrimReplace = "$1^";
  6245. createToken("CARET", `^${src2[t2.LONECARET]}${src2[t2.XRANGEPLAIN]}$`);
  6246. createToken("CARETLOOSE", `^${src2[t2.LONECARET]}${src2[t2.XRANGEPLAINLOOSE]}$`);
  6247. createToken("COMPARATORLOOSE", `^${src2[t2.GTLT]}\\s*(${src2[t2.LOOSEPLAIN]})$|^$`);
  6248. createToken("COMPARATOR", `^${src2[t2.GTLT]}\\s*(${src2[t2.FULLPLAIN]})$|^$`);
  6249. createToken("COMPARATORTRIM", `(\\s*)${src2[t2.GTLT]}\\s*(${src2[t2.LOOSEPLAIN]}|${src2[t2.XRANGEPLAIN]})`, true);
  6250. exports3.comparatorTrimReplace = "$1$2$3";
  6251. createToken("HYPHENRANGE", `^\\s*(${src2[t2.XRANGEPLAIN]})\\s+-\\s+(${src2[t2.XRANGEPLAIN]})\\s*$`);
  6252. createToken("HYPHENRANGELOOSE", `^\\s*(${src2[t2.XRANGEPLAINLOOSE]})\\s+-\\s+(${src2[t2.XRANGEPLAINLOOSE]})\\s*$`);
  6253. createToken("STAR", "(<|>)?=?\\s*\\*");
  6254. createToken("GTE0", "^\\s*>=\\s*0\\.0\\.0\\s*$");
  6255. createToken("GTE0PRE", "^\\s*>=\\s*0\\.0\\.0-0\\s*$");
  6256. })(re$1, re$1.exports);
  6257. const looseOption = Object.freeze({ loose: true });
  6258. const emptyOpts = Object.freeze({});
  6259. const parseOptions$1 = (options) => {
  6260. if (!options) {
  6261. return emptyOpts;
  6262. }
  6263. if (typeof options !== "object") {
  6264. return looseOption;
  6265. }
  6266. return options;
  6267. };
  6268. var parseOptions_1 = parseOptions$1;
  6269. const numeric = /^[0-9]+$/;
  6270. const compareIdentifiers$1 = (a, b) => {
  6271. const anum = numeric.test(a);
  6272. const bnum = numeric.test(b);
  6273. if (anum && bnum) {
  6274. a = +a;
  6275. b = +b;
  6276. }
  6277. return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1;
  6278. };
  6279. const rcompareIdentifiers = (a, b) => compareIdentifiers$1(b, a);
  6280. var identifiers = {
  6281. compareIdentifiers: compareIdentifiers$1,
  6282. rcompareIdentifiers
  6283. };
  6284. const debug = debug_1;
  6285. const { MAX_LENGTH, MAX_SAFE_INTEGER } = constants;
  6286. const { safeRe: re, t } = re$1.exports;
  6287. const parseOptions = parseOptions_1;
  6288. const { compareIdentifiers } = identifiers;
  6289. class SemVer$1 {
  6290. constructor(version, options) {
  6291. options = parseOptions(options);
  6292. if (version instanceof SemVer$1) {
  6293. if (version.loose === !!options.loose && version.includePrerelease === !!options.includePrerelease) {
  6294. return version;
  6295. } else {
  6296. version = version.version;
  6297. }
  6298. } else if (typeof version !== "string") {
  6299. throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`);
  6300. }
  6301. if (version.length > MAX_LENGTH) {
  6302. throw new TypeError(
  6303. `version is longer than ${MAX_LENGTH} characters`
  6304. );
  6305. }
  6306. debug("SemVer", version, options);
  6307. this.options = options;
  6308. this.loose = !!options.loose;
  6309. this.includePrerelease = !!options.includePrerelease;
  6310. const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]);
  6311. if (!m) {
  6312. throw new TypeError(`Invalid Version: ${version}`);
  6313. }
  6314. this.raw = version;
  6315. this.major = +m[1];
  6316. this.minor = +m[2];
  6317. this.patch = +m[3];
  6318. if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
  6319. throw new TypeError("Invalid major version");
  6320. }
  6321. if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
  6322. throw new TypeError("Invalid minor version");
  6323. }
  6324. if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
  6325. throw new TypeError("Invalid patch version");
  6326. }
  6327. if (!m[4]) {
  6328. this.prerelease = [];
  6329. } else {
  6330. this.prerelease = m[4].split(".").map((id) => {
  6331. if (/^[0-9]+$/.test(id)) {
  6332. const num = +id;
  6333. if (num >= 0 && num < MAX_SAFE_INTEGER) {
  6334. return num;
  6335. }
  6336. }
  6337. return id;
  6338. });
  6339. }
  6340. this.build = m[5] ? m[5].split(".") : [];
  6341. this.format();
  6342. }
  6343. format() {
  6344. this.version = `${this.major}.${this.minor}.${this.patch}`;
  6345. if (this.prerelease.length) {
  6346. this.version += `-${this.prerelease.join(".")}`;
  6347. }
  6348. return this.version;
  6349. }
  6350. toString() {
  6351. return this.version;
  6352. }
  6353. compare(other) {
  6354. debug("SemVer.compare", this.version, this.options, other);
  6355. if (!(other instanceof SemVer$1)) {
  6356. if (typeof other === "string" && other === this.version) {
  6357. return 0;
  6358. }
  6359. other = new SemVer$1(other, this.options);
  6360. }
  6361. if (other.version === this.version) {
  6362. return 0;
  6363. }
  6364. return this.compareMain(other) || this.comparePre(other);
  6365. }
  6366. compareMain(other) {
  6367. if (!(other instanceof SemVer$1)) {
  6368. other = new SemVer$1(other, this.options);
  6369. }
  6370. return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch);
  6371. }
  6372. comparePre(other) {
  6373. if (!(other instanceof SemVer$1)) {
  6374. other = new SemVer$1(other, this.options);
  6375. }
  6376. if (this.prerelease.length && !other.prerelease.length) {
  6377. return -1;
  6378. } else if (!this.prerelease.length && other.prerelease.length) {
  6379. return 1;
  6380. } else if (!this.prerelease.length && !other.prerelease.length) {
  6381. return 0;
  6382. }
  6383. let i = 0;
  6384. do {
  6385. const a = this.prerelease[i];
  6386. const b = other.prerelease[i];
  6387. debug("prerelease compare", i, a, b);
  6388. if (a === void 0 && b === void 0) {
  6389. return 0;
  6390. } else if (b === void 0) {
  6391. return 1;
  6392. } else if (a === void 0) {
  6393. return -1;
  6394. } else if (a === b) {
  6395. continue;
  6396. } else {
  6397. return compareIdentifiers(a, b);
  6398. }
  6399. } while (++i);
  6400. }
  6401. compareBuild(other) {
  6402. if (!(other instanceof SemVer$1)) {
  6403. other = new SemVer$1(other, this.options);
  6404. }
  6405. let i = 0;
  6406. do {
  6407. const a = this.build[i];
  6408. const b = other.build[i];
  6409. debug("prerelease compare", i, a, b);
  6410. if (a === void 0 && b === void 0) {
  6411. return 0;
  6412. } else if (b === void 0) {
  6413. return 1;
  6414. } else if (a === void 0) {
  6415. return -1;
  6416. } else if (a === b) {
  6417. continue;
  6418. } else {
  6419. return compareIdentifiers(a, b);
  6420. }
  6421. } while (++i);
  6422. }
  6423. inc(release, identifier, identifierBase) {
  6424. switch (release) {
  6425. case "premajor":
  6426. this.prerelease.length = 0;
  6427. this.patch = 0;
  6428. this.minor = 0;
  6429. this.major++;
  6430. this.inc("pre", identifier, identifierBase);
  6431. break;
  6432. case "preminor":
  6433. this.prerelease.length = 0;
  6434. this.patch = 0;
  6435. this.minor++;
  6436. this.inc("pre", identifier, identifierBase);
  6437. break;
  6438. case "prepatch":
  6439. this.prerelease.length = 0;
  6440. this.inc("patch", identifier, identifierBase);
  6441. this.inc("pre", identifier, identifierBase);
  6442. break;
  6443. case "prerelease":
  6444. if (this.prerelease.length === 0) {
  6445. this.inc("patch", identifier, identifierBase);
  6446. }
  6447. this.inc("pre", identifier, identifierBase);
  6448. break;
  6449. case "major":
  6450. if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) {
  6451. this.major++;
  6452. }
  6453. this.minor = 0;
  6454. this.patch = 0;
  6455. this.prerelease = [];
  6456. break;
  6457. case "minor":
  6458. if (this.patch !== 0 || this.prerelease.length === 0) {
  6459. this.minor++;
  6460. }
  6461. this.patch = 0;
  6462. this.prerelease = [];
  6463. break;
  6464. case "patch":
  6465. if (this.prerelease.length === 0) {
  6466. this.patch++;
  6467. }
  6468. this.prerelease = [];
  6469. break;
  6470. case "pre": {
  6471. const base = Number(identifierBase) ? 1 : 0;
  6472. if (!identifier && identifierBase === false) {
  6473. throw new Error("invalid increment argument: identifier is empty");
  6474. }
  6475. if (this.prerelease.length === 0) {
  6476. this.prerelease = [base];
  6477. } else {
  6478. let i = this.prerelease.length;
  6479. while (--i >= 0) {
  6480. if (typeof this.prerelease[i] === "number") {
  6481. this.prerelease[i]++;
  6482. i = -2;
  6483. }
  6484. }
  6485. if (i === -1) {
  6486. if (identifier === this.prerelease.join(".") && identifierBase === false) {
  6487. throw new Error("invalid increment argument: identifier already exists");
  6488. }
  6489. this.prerelease.push(base);
  6490. }
  6491. }
  6492. if (identifier) {
  6493. let prerelease = [identifier, base];
  6494. if (identifierBase === false) {
  6495. prerelease = [identifier];
  6496. }
  6497. if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
  6498. if (isNaN(this.prerelease[1])) {
  6499. this.prerelease = prerelease;
  6500. }
  6501. } else {
  6502. this.prerelease = prerelease;
  6503. }
  6504. }
  6505. break;
  6506. }
  6507. default:
  6508. throw new Error(`invalid increment argument: ${release}`);
  6509. }
  6510. this.raw = this.format();
  6511. if (this.build.length) {
  6512. this.raw += `+${this.build.join(".")}`;
  6513. }
  6514. return this;
  6515. }
  6516. }
  6517. var semver = SemVer$1;
  6518. const SemVer = semver;
  6519. const compare$1 = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose));
  6520. var compare_1 = compare$1;
  6521. const compare = compare_1;
  6522. const gt = (a, b, loose) => compare(a, b, loose) > 0;
  6523. var gt_1 = gt;
  6524. const state$4 = {
  6525. console: {
  6526. listenerIds: {
  6527. logs: 0
  6528. }
  6529. },
  6530. app: {
  6531. listenerIds: {
  6532. sync: 0,
  6533. connected: 0,
  6534. closeSync: 0
  6535. }
  6536. }
  6537. };
  6538. const BackgroundProject = Project.create({
  6539. name: "\u540E\u53F0",
  6540. domains: [],
  6541. scripts: {
  6542. console: new Script({
  6543. name: "\u{1F4C4} \u65E5\u5FD7\u8F93\u51FA",
  6544. url: [["\u6240\u6709", /.*/]],
  6545. namespace: "render.console",
  6546. configs: {
  6547. logs: {
  6548. defaultValue: []
  6549. }
  6550. },
  6551. onrender({ panel: panel2 }) {
  6552. const getTypeDesc = (type) => type === "info" ? "\u4FE1\u606F" : type === "error" ? "\u9519\u8BEF" : type === "warn" ? "\u8B66\u544A" : type === "debug" ? "\u8C03\u8BD5" : "\u65E5\u5FD7";
  6553. const createLog = (log) => {
  6554. const date = new Date(log.time);
  6555. const item = el(
  6556. "div",
  6557. {
  6558. title: "\u53CC\u51FB\u590D\u5236\u65E5\u5FD7\u4FE1\u606F",
  6559. className: "item"
  6560. },
  6561. [
  6562. el(
  6563. "span",
  6564. { className: "time" },
  6565. `${date.getHours().toFixed(0).padStart(2, "0")}:${date.getMinutes().toFixed(0).padStart(2, "0")} `
  6566. ),
  6567. el("span", { className: log.type }, `[${getTypeDesc(log.type)}]`),
  6568. el("span", ":" + log.content)
  6569. ]
  6570. );
  6571. item.addEventListener("dblclick", () => {
  6572. navigator.clipboard.writeText(
  6573. Object.keys(log).map((k) => `${k}: ${log[k]}`).join("\n")
  6574. );
  6575. });
  6576. return item;
  6577. };
  6578. const showLogs = () => {
  6579. const div2 = el("div", { className: "card console" });
  6580. const logs2 = this.cfg.logs.map((log) => createLog(log));
  6581. if (logs2.length) {
  6582. div2.replaceChildren(...logs2);
  6583. } else {
  6584. div2.replaceChildren(
  6585. el("div", "\u6682\u65E0\u4EFB\u4F55\u65E5\u5FD7", (div3) => {
  6586. div3.style.textAlign = "center";
  6587. })
  6588. );
  6589. }
  6590. return { div: div2, logs: logs2 };
  6591. };
  6592. const isScrollBottom = (div2) => {
  6593. const { scrollHeight, scrollTop, clientHeight } = div2;
  6594. return scrollTop + clientHeight + 50 > scrollHeight;
  6595. };
  6596. const { div, logs } = showLogs();
  6597. this.offConfigChange(state$4.console.listenerIds.logs);
  6598. state$4.console.listenerIds.logs = this.onConfigChange("logs", (logs2) => {
  6599. const log = createLog(logs2[logs2.length - 1]);
  6600. div.append(log);
  6601. setTimeout(() => {
  6602. if (isScrollBottom(div)) {
  6603. log.scrollIntoView();
  6604. }
  6605. }, 10);
  6606. });
  6607. const show = () => {
  6608. panel2.body.replaceChildren(div);
  6609. setTimeout(() => {
  6610. var _a;
  6611. (_a = logs[logs.length - 1]) == null ? void 0 : _a.scrollIntoView();
  6612. }, 10);
  6613. };
  6614. show();
  6615. }
  6616. }),
  6617. appConfigSync: new Script({
  6618. name: "\u{1F504}\uFE0F \u8F6F\u4EF6\u914D\u7F6E\u540C\u6B65",
  6619. namespace: "background.app",
  6620. url: [["\u6240\u6709\u9875\u9762", /./]],
  6621. hideInPanel: $gm.getInfos() === void 0,
  6622. configs: {
  6623. notes: {
  6624. defaultValue: $creator.notes([
  6625. [
  6626. el("span", [
  6627. "\u5982\u679C\u60A8\u4F7F\u7528",
  6628. el("a", { href: "https://docs.ocsjs.com/docs/app", target: "_blank" }, "OCS\u684C\u9762\u8F6F\u4EF6"),
  6629. "\u542F\u52A8\u6D4F\u89C8\u5668\uFF0C\u5E76\u4F7F\u7528\u6B64\u811A\u672C\uFF0C"
  6630. ]),
  6631. "\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",
  6632. "\u7A97\u53E3\u8BBE\u7F6E\u4EE5\u53CA\u540E\u53F0\u9762\u677F\u6240\u6709\u8BBE\u7F6E\u4E0D\u4F1A\u8FDB\u884C\u540C\u6B65\u3002"
  6633. ],
  6634. "\u5982\u679C\u4E0D\u662F\uFF0C\u60A8\u53EF\u4EE5\u5FFD\u7565\u6B64\u811A\u672C\u3002"
  6635. ]).outerHTML
  6636. },
  6637. sync: {
  6638. defaultValue: false
  6639. },
  6640. connected: {
  6641. defaultValue: false
  6642. },
  6643. closeSync: {
  6644. defaultValue: false,
  6645. label: "\u5173\u95ED\u540C\u6B65",
  6646. attrs: {
  6647. type: "checkbox"
  6648. }
  6649. }
  6650. },
  6651. onrender({ panel: panel2 }) {
  6652. panel2.lockWrapper.remove();
  6653. panel2.configsContainer.classList.remove("lock");
  6654. const update = () => {
  6655. if (this.cfg.sync) {
  6656. const tip = el("div", { className: "notes card" }, [`\u5DF2\u6210\u529F\u540C\u6B65\u8F6F\u4EF6\u4E2D\u7684\u914D\u7F6E.`]);
  6657. panel2.body.replaceChildren(el("hr"), tip);
  6658. } else if (this.cfg.connected) {
  6659. const tip = el("div", { className: "notes card" }, [`\u5DF2\u6210\u529F\u8FDE\u63A5\u5230\u8F6F\u4EF6\uFF0C\u4F46\u914D\u7F6E\u4E3A\u7A7A\u3002`]);
  6660. panel2.body.replaceChildren(el("hr"), tip);
  6661. }
  6662. };
  6663. update();
  6664. this.offConfigChange(state$4.app.listenerIds.sync);
  6665. this.offConfigChange(state$4.app.listenerIds.connected);
  6666. this.offConfigChange(state$4.app.listenerIds.closeSync);
  6667. state$4.app.listenerIds.sync = this.onConfigChange("sync", update);
  6668. state$4.app.listenerIds.connected = this.onConfigChange("connected", update);
  6669. state$4.app.listenerIds.closeSync = this.onConfigChange("closeSync", (closeSync) => {
  6670. if (closeSync) {
  6671. this.cfg.sync = false;
  6672. this.cfg.connected = false;
  6673. $message("success", { content: "\u5DF2\u5173\u95ED\u540C\u6B65\uFF0C\u5237\u65B0\u9875\u9762\u540E\u751F\u6548" });
  6674. }
  6675. });
  6676. },
  6677. async onactive() {
  6678. var _a;
  6679. if ($.isInTopWindow() && this.cfg.closeSync === false) {
  6680. this.cfg.sync = false;
  6681. try {
  6682. const res = await request("http://localhost:15319/browser", {
  6683. type: "GM_xmlhttpRequest",
  6684. method: "get",
  6685. responseType: "json"
  6686. });
  6687. this.cfg.connected = true;
  6688. if (res && Object.keys(res).length) {
  6689. for (const key in res) {
  6690. if (Object.prototype.hasOwnProperty.call(res, key)) {
  6691. if (RenderScript.namespace && key.startsWith(RenderScript.namespace)) {
  6692. Reflect.deleteProperty(res, key);
  6693. }
  6694. for (const scriptKey in BackgroundProject.scripts) {
  6695. if (Object.prototype.hasOwnProperty.call(BackgroundProject.scripts, scriptKey)) {
  6696. const script = Reflect.get(BackgroundProject.scripts, scriptKey);
  6697. if (script.namespace && key.startsWith(script.namespace)) {
  6698. Reflect.deleteProperty(res, key);
  6699. }
  6700. }
  6701. }
  6702. }
  6703. }
  6704. for (const project of definedProjects()) {
  6705. for (const key in project.scripts) {
  6706. if (Object.prototype.hasOwnProperty.call(project.scripts, key)) {
  6707. const script = project.scripts[key];
  6708. for (const ck in script.configs) {
  6709. if (Object.prototype.hasOwnProperty.call(script.configs, ck)) {
  6710. if (((_a = script.configs[ck].extra) == null ? void 0 : _a.appConfigSync) === false) {
  6711. Reflect.deleteProperty(res, $.namespaceKey(script.namespace, ck));
  6712. }
  6713. }
  6714. }
  6715. }
  6716. }
  6717. }
  6718. for (const key in res) {
  6719. if (Object.prototype.hasOwnProperty.call(res, key)) {
  6720. $store.set(key, res[key]);
  6721. }
  6722. }
  6723. for (const project of definedProjects()) {
  6724. if (project.name === BackgroundProject.name) {
  6725. continue;
  6726. }
  6727. for (const key in project.scripts) {
  6728. if (Object.prototype.hasOwnProperty.call(project.scripts, key)) {
  6729. const script = project.scripts[key];
  6730. const originalRender = script.onrender;
  6731. script.onrender = ({ panel: panel2, header }) => {
  6732. var _a2, _b;
  6733. originalRender == null ? void 0 : originalRender({ panel: panel2, header });
  6734. if (panel2.configsContainer.children.length) {
  6735. panel2.configsContainer.classList.add("lock");
  6736. panel2.lockWrapper.style.width = ((_a2 = panel2.configsContainer.clientWidth) != null ? _a2 : panel2.clientWidth) + "px";
  6737. panel2.lockWrapper.style.height = ((_b = panel2.configsContainer.clientHeight) != null ? _b : panel2.clientHeight) + "px";
  6738. panel2.configsContainer.prepend(panel2.lockWrapper);
  6739. panel2.lockWrapper.title = "\u{1F6AB}\u5DF2\u540C\u6B65OCS\u8F6F\u4EF6\u914D\u7F6E\uFF0C\u5982\u9700\u4FEE\u6539\u8BF7\u5728\u8F6F\u4EF6\u8BBE\u7F6E\u4E2D\u4FEE\u6539\u3002\u6216\u8005\u524D\u5F80 \u540E\u53F0-\u8F6F\u4EF6\u914D\u7F6E\u540C\u6B65 \u5173\u95ED\u914D\u7F6E\u540C\u6B65\u3002";
  6740. panel2.lockWrapper = $creator.tooltip(panel2.lockWrapper);
  6741. }
  6742. };
  6743. if (script.panel && script.header) {
  6744. script.onrender({ panel: script.panel, header: script.header });
  6745. }
  6746. }
  6747. }
  6748. }
  6749. this.cfg.sync = true;
  6750. }
  6751. } catch (e) {
  6752. console.error(e);
  6753. this.cfg.sync = false;
  6754. this.cfg.connected = false;
  6755. }
  6756. }
  6757. }
  6758. }),
  6759. dev: new Script({
  6760. name: "\u{1F6E0}\uFE0F \u5F00\u53D1\u8005\u8C03\u8BD5",
  6761. namespace: "background.dev",
  6762. url: [["\u6240\u6709\u9875\u9762", /./]],
  6763. configs: {
  6764. notes: {
  6765. defaultValue: "\u5F00\u53D1\u4EBA\u5458\u8C03\u8BD5\u7528\u3002<br>\u6CE8\u5165OCS_CONTEXT\u5168\u5C40\u53D8\u91CF\u3002\u7528\u6237\u53EF\u5FFD\u7565\u6B64\u9875\u9762\u3002"
  6766. }
  6767. },
  6768. onrender({ panel: panel2 }) {
  6769. const injectBtn = el("button", { className: "base-style-button" }, "\u70B9\u51FB\u6CE8\u5165\u5168\u5C40\u53D8\u91CF");
  6770. injectBtn.addEventListener("click", () => {
  6771. $gm.unsafeWindow.OCS_CONTEXT = self;
  6772. });
  6773. panel2.body.replaceChildren(el("div", { className: "card" }, [injectBtn]));
  6774. }
  6775. }),
  6776. appLoginHelper: new Script({
  6777. name: "\u8F6F\u4EF6\u767B\u5F55\u8F85\u52A9",
  6778. url: [
  6779. ["\u8D85\u661F\u767B\u5F55", "passport2.chaoxing.com/login"],
  6780. ["\u667A\u6167\u6811\u767B\u5F55", "passport.zhihuishu.com/login"],
  6781. ["\u804C\u6559\u4E91\u767B\u5F55", "zjy2.icve.com.cn/portal/login.html"],
  6782. ["\u667A\u6167\u804C\u6559\u767B\u5F55", "sso.icve.com.cn/sso/auth"]
  6783. ],
  6784. hideInPanel: true,
  6785. oncomplete() {
  6786. if ($.isInTopWindow()) {
  6787. CommonProject.scripts.render.methods.moveToEdge();
  6788. }
  6789. }
  6790. }),
  6791. update: new Script({
  6792. name: "\u{1F4E5} \u66F4\u65B0\u6A21\u5757",
  6793. url: [["\u6240\u6709\u9875\u9762", /.*/]],
  6794. namespace: "background.update",
  6795. configs: {
  6796. notes: {
  6797. defaultValue: "\u811A\u672C\u81EA\u52A8\u66F4\u65B0\u6A21\u5757\uFF0C\u5982\u679C\u6709\u65B0\u7684\u7248\u672C\u4F1A\u81EA\u52A8\u901A\u77E5\u3002"
  6798. },
  6799. autoNotify: {
  6800. defaultValue: true,
  6801. label: "\u5F00\u542F\u66F4\u65B0\u901A\u77E5",
  6802. attrs: { type: "checkbox", title: "\u5F53\u6709\u6700\u65B0\u7684\u7248\u672C\u65F6\u81EA\u52A8\u5F39\u7A97\u901A\u77E5\uFF0C\u9ED8\u8BA4\u5F00\u542F" }
  6803. },
  6804. notToday: {
  6805. defaultValue: -1
  6806. },
  6807. ignoreVersions: {
  6808. defaultValue: []
  6809. }
  6810. },
  6811. methods() {
  6812. return {
  6813. getLastVersion: async () => {
  6814. return await request("https://cdn.ocsjs.com/ocs-version.json?t=" + Date.now(), {
  6815. method: "get",
  6816. type: "GM_xmlhttpRequest"
  6817. });
  6818. }
  6819. };
  6820. },
  6821. async onrender({ panel: panel2 }) {
  6822. var _a;
  6823. const version = await this.methods.getLastVersion();
  6824. const infos = $gm.getInfos();
  6825. if (!infos) {
  6826. return;
  6827. }
  6828. const changeLog = el("button", { className: "base-style-button-secondary" }, "\u{1F4C4}\u67E5\u770B\u66F4\u65B0\u65E5\u5FD7");
  6829. changeLog.onclick = () => CommonProject.scripts.apps.methods.showChangelog();
  6830. panel2.body.replaceChildren(
  6831. el("div", { className: "card" }, [
  6832. el("hr"),
  6833. el("div", ["\u6700\u65B0\u7248\u672C\uFF1A" + version["last-version"] + " - ", changeLog]),
  6834. el("hr"),
  6835. el("div", "\u5F53\u524D\u7248\u672C\uFF1A" + ((_a = $gm.getInfos()) == null ? void 0 : _a.script.version)),
  6836. el("div", "\u811A\u672C\u7BA1\u7406\u5668\uFF1A" + (infos == null ? void 0 : infos.scriptHandler)),
  6837. el("div", [
  6838. "\u811A\u672C\u66F4\u65B0\u94FE\u63A5\uFF1A",
  6839. el("a", { target: "_blank", href: version.resource[infos.scriptHandler] }, [
  6840. version.resource[infos.scriptHandler]
  6841. ])
  6842. ])
  6843. ])
  6844. );
  6845. console.log("versions", {
  6846. notToday: this.cfg.notToday,
  6847. ignoreVersions: this.cfg.ignoreVersions,
  6848. version
  6849. });
  6850. },
  6851. oncomplete() {
  6852. if (this.cfg.autoNotify && $.isInTopWindow()) {
  6853. if (this.cfg.notToday === -1 || this.cfg.notToday !== new Date().getDate()) {
  6854. const infos = $gm.getInfos();
  6855. if (infos) {
  6856. setTimeout(async () => {
  6857. const version = await this.methods.getLastVersion();
  6858. const last = version["last-version"];
  6859. if (this.cfg.ignoreVersions.includes(last) === false && gt_1(last, infos.script.version)) {
  6860. const modal = $modal("confirm", {
  6861. maskCloseable: false,
  6862. width: 600,
  6863. content: $creator.notes([`\u68C0\u6D4B\u5230\u65B0\u7248\u672C\u53D1\u5E03 ${last} \uFF1A`, [...version.notes || []]]),
  6864. footer: el("div", [
  6865. el("button", { className: "base-style-button-secondary", innerText: "\u8DF3\u8FC7\u6B64\u7248\u672C" }, (btn) => {
  6866. btn.onclick = () => {
  6867. this.cfg.ignoreVersions = [...this.cfg.ignoreVersions, last];
  6868. modal == null ? void 0 : modal.remove();
  6869. };
  6870. }),
  6871. el("button", { className: "base-style-button-secondary", innerText: "\u4ECA\u65E5\u4E0D\u518D\u63D0\u793A" }, (btn) => {
  6872. btn.onclick = () => {
  6873. this.cfg.notToday = new Date().getDate();
  6874. modal == null ? void 0 : modal.remove();
  6875. };
  6876. }),
  6877. el("button", { className: "base-style-button", innerText: "\u524D\u5F80\u66F4\u65B0" }, (btn) => {
  6878. btn.onclick = () => {
  6879. window.open(version.resource[infos.scriptHandler], "_blank");
  6880. modal == null ? void 0 : modal.remove();
  6881. };
  6882. })
  6883. ])
  6884. });
  6885. }
  6886. }, 5 * 1e3);
  6887. }
  6888. }
  6889. }
  6890. }
  6891. }),
  6892. errorHandle: new Script({
  6893. name: "\u5168\u5C40\u9519\u8BEF\u6355\u83B7",
  6894. url: [["", /.*/]],
  6895. hideInPanel: true,
  6896. onstart() {
  6897. const projects = definedProjects();
  6898. for (const project of projects) {
  6899. for (const key in project.scripts) {
  6900. if (Object.prototype.hasOwnProperty.call(project.scripts, key)) {
  6901. const script = project.scripts[key];
  6902. script.on("scripterror", (err) => {
  6903. const msg = `[${project.name} - ${script.name}] : ${err}`;
  6904. console.error(msg);
  6905. $console.error(msg);
  6906. });
  6907. }
  6908. }
  6909. }
  6910. }
  6911. })
  6912. }
  6913. });
  6914. const $console = new Proxy({}, {
  6915. get(target, key) {
  6916. return (...msg) => {
  6917. let logs = BackgroundProject.scripts.console.cfg.logs;
  6918. if (logs.length > 50) {
  6919. logs = logs.slice(-50);
  6920. }
  6921. logs = logs.concat({
  6922. type: key.toString(),
  6923. content: msg.join(" "),
  6924. time: Date.now(),
  6925. stack: (Error().stack || "").replace("Error", "")
  6926. });
  6927. BackgroundProject.scripts.console.cfg.logs = logs;
  6928. };
  6929. }
  6930. });
  6931. function workPreCheckMessage(options) {
  6932. const { onrun, onNoAnswererWrappers, onclose, ...opts } = options;
  6933. if (opts.answererWrappers.length === 0) {
  6934. onNoAnswererWrappers == null ? void 0 : onNoAnswererWrappers(opts);
  6935. return $message("warn", {
  6936. content: "\u68C0\u6D4B\u5230\u9898\u5E93\u914D\u7F6E\u4E3A\u7A7A\uFF0C\u65E0\u6CD5\u81EA\u52A8\u7B54\u9898\uFF0C\u8BF7\u524D\u5F80 \u901A\u7528-\u5168\u5C40\u8BBE\u7F6E \u9875\u9762\u8FDB\u884C\u914D\u7F6E\u3002",
  6937. duration: 0
  6938. });
  6939. } else {
  6940. return $message("info", {
  6941. duration: 5,
  6942. content: el("span", [
  6943. "5\u79D2\u540E\u81EA\u52A8\u7B54\u9898\uFF0C",
  6944. $creator.preventText({
  6945. name: "\u70B9\u51FB\u53D6\u6D88",
  6946. delay: 5,
  6947. ondefault: (span) => {
  6948. onrun(opts);
  6949. },
  6950. onprevent(span) {
  6951. const closedMessage = $message("warn", {
  6952. content: "\u5DF2\u5173\u95ED\u6B64\u6B21\u7684\u81EA\u52A8\u7B54\u9898\uFF0C\u8BF7\u624B\u52A8\u5F00\u542F\u6216\u8005\u5FFD\u7565\u6B64\u8B66\u544A\u3002",
  6953. duration: 0
  6954. });
  6955. onclose == null ? void 0 : onclose(opts, closedMessage);
  6956. }
  6957. })
  6958. ])
  6959. });
  6960. }
  6961. }
  6962. function createRangeTooltip(input, defaultValue, transform) {
  6963. input.addEventListener("change", () => {
  6964. input.setAttribute("data-title", transform(input.value || input.getAttribute("value") || defaultValue));
  6965. });
  6966. input.setAttribute("data-title", transform(input.value || input.getAttribute("value") || defaultValue));
  6967. }
  6968. async function playMedia(playFunction) {
  6969. const tryPlayMedia = () => {
  6970. return new Promise((resolve, reject) => {
  6971. try {
  6972. const playRes = playFunction();
  6973. if (playRes) {
  6974. playRes.then(resolve).catch(reject);
  6975. } else {
  6976. resolve();
  6977. }
  6978. } catch (err) {
  6979. reject(err);
  6980. }
  6981. });
  6982. };
  6983. try {
  6984. await tryPlayMedia();
  6985. return true;
  6986. } catch (err) {
  6987. console.error(err);
  6988. if (String(err).includes(`failed because the user didn't interact with the document first`)) {
  6989. $modal("alert", {
  6990. content: "\u64AD\u653E\u97F3\u89C6\u9891\u5931\u8D25\uFF0C\u7531\u4E8E\u6D4F\u89C8\u5668\u7684\u7528\u6237\u9690\u79C1\u4FDD\u62A4\u63AA\u65BD\uFF0C\u5982\u679C\u8981\u64AD\u653E\u5E26\u6709\u97F3\u91CF\u7684\u89C6\u9891\uFF0C\u6216\u8005\u67D0\u4E9B\u65E0\u6CD5\u81EA\u52A8\u64AD\u653E\u97F3\u89C6\u9891\u7684\u7F51\u7AD9\uFF0C\u60A8\u5FC5\u987B\u5148\u70B9\u51FB\u4E00\u6B21\u9875\u9762\u4E0A\u7684\u4EFB\u610F\u4F4D\u7F6E\u811A\u672C\u624D\u80FD\u8FDB\u884C\u97F3\u89C6\u9891\u7684\u64AD\u653E\uFF0C\u540E\u7EED\u65E0\u9700\u91CD\u65B0\u70B9\u51FB\u3002",
  6991. onClose: async () => {
  6992. await tryPlayMedia();
  6993. }
  6994. });
  6995. return true;
  6996. } else if (String(err).includes("The element has no supported sources")) {
  6997. $console.error("\u5F53\u524D\u89C6\u9891\u65E0\u6CD5\u64AD\u653E\u3002");
  6998. } else {
  6999. $console.error("\u64AD\u653E\u89C6\u9891\u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF\uFF1A" + String(err));
  7000. }
  7001. return false;
  7002. }
  7003. }
  7004. const volume = {
  7005. label: "\u97F3\u91CF\u8C03\u8282",
  7006. attrs: { type: "range", step: "0.05", min: "0", max: "1" },
  7007. defaultValue: 0,
  7008. onload() {
  7009. createRangeTooltip(this, "0", (val) => `${parseFloat(val) * 100}%`);
  7010. }
  7011. };
  7012. const restudy = {
  7013. label: "\u590D\u4E60\u6A21\u5F0F",
  7014. attrs: { title: "\u5DF2\u7ECF\u5B8C\u6210\u7684\u89C6\u9891\u7EE7\u7EED\u5B66\u4E60", type: "checkbox" },
  7015. defaultValue: false
  7016. };
  7017. const definition = {
  7018. label: "\u6E05\u6670\u5EA6",
  7019. tag: "select",
  7020. defaultValue: "line1bq",
  7021. onload() {
  7022. this.append(
  7023. ...$creator.selectOptions(this.getAttribute("value"), [
  7024. ["line1bq", "\u6D41\u7545"],
  7025. ["line1gq", "\u9AD8\u6E05"]
  7026. ])
  7027. );
  7028. }
  7029. };
  7030. const workNotes = {
  7031. defaultValue: $creator.notes([
  7032. "\u81EA\u52A8\u7B54\u9898\u524D\u8BF7\u5728 \u201C\u901A\u7528-\u5168\u5C40\u8BBE\u7F6E\u201D \u4E2D\u8BBE\u7F6E\u9898\u5E93\u914D\u7F6E\u3002",
  7033. "\u53EF\u4EE5\u642D\u914D \u201C\u901A\u7528-\u5728\u7EBF\u641C\u9898\u201D \u4E00\u8D77\u4F7F\u7528\u3002"
  7034. ]).outerHTML
  7035. };
  7036. function commonWork(script, options) {
  7037. CommonProject.scripts.render.methods.pin(script);
  7038. let worker;
  7039. let startBtnPressed = false;
  7040. let checkFailed = false;
  7041. const createControls = () => {
  7042. const { controlBtn, restartBtn, startBtn } = createWorkerControl({
  7043. workerProvider: () => worker,
  7044. onStart: async () => {
  7045. startBtnPressed = true;
  7046. checkMessage == null ? void 0 : checkMessage.remove();
  7047. start2();
  7048. },
  7049. onRestart: async () => {
  7050. var _a;
  7051. worker == null ? void 0 : worker.emit("close");
  7052. await ((_a = options.onRestart) == null ? void 0 : _a.call(options));
  7053. start2();
  7054. }
  7055. });
  7056. startBtn.style.flex = "1";
  7057. startBtn.style.padding = "4px";
  7058. restartBtn.style.flex = "1";
  7059. restartBtn.style.padding = "4px";
  7060. controlBtn.style.flex = "1";
  7061. controlBtn.style.padding = "4px";
  7062. const container = el(
  7063. "div",
  7064. { style: { marginTop: "12px", display: "flex" } },
  7065. (worker == null ? void 0 : worker.isRunning) ? [controlBtn, restartBtn] : [startBtn]
  7066. );
  7067. return { container, startBtn, restartBtn, controlBtn };
  7068. };
  7069. const workResultPanel = () => CommonProject.scripts.workResults.methods.createWorkResultsPanel();
  7070. script.on("render", () => {
  7071. var _a, _b;
  7072. let gotoSettingsBtnContainer = "";
  7073. if (checkFailed) {
  7074. const gotoSettingsBtn = $creator.button("\u{1F449} \u524D\u5F80\u8BBE\u7F6E\u9898\u5E93\u914D\u7F6E", {
  7075. className: "base-style-button",
  7076. style: { flex: "1", padding: "4px" }
  7077. });
  7078. gotoSettingsBtn.style.flex = "1";
  7079. gotoSettingsBtn.style.padding = "4px";
  7080. gotoSettingsBtn.onclick = () => {
  7081. CommonProject.scripts.render.methods.pin(CommonProject.scripts.settings);
  7082. };
  7083. gotoSettingsBtnContainer = el("div", { style: { display: "flex" } }, [gotoSettingsBtn]);
  7084. }
  7085. (_b = (_a = script.panel) == null ? void 0 : _a.body) == null ? void 0 : _b.replaceChildren(
  7086. el("div", { style: { marginTop: "12px" } }, [
  7087. gotoSettingsBtnContainer,
  7088. createControls().container,
  7089. workResultPanel()
  7090. ])
  7091. );
  7092. });
  7093. const workOptions = CommonProject.scripts.settings.methods.getWorkOptions();
  7094. let checkMessage = workPreCheckMessage({
  7095. onrun: () => startBtnPressed === false && start2(),
  7096. onclose: (_, closedMsg) => checkMessage = closedMsg,
  7097. onNoAnswererWrappers: () => {
  7098. checkFailed = true;
  7099. },
  7100. ...workOptions
  7101. });
  7102. const start2 = async () => {
  7103. var _a, _b, _c;
  7104. await ((_a = options.beforeRunning) == null ? void 0 : _a.call(options));
  7105. worker = options.workerProvider(workOptions);
  7106. const { container, controlBtn } = createControls();
  7107. (_c = (_b = script.panel) == null ? void 0 : _b.body) == null ? void 0 : _c.replaceChildren(container, workResultPanel());
  7108. worker == null ? void 0 : worker.once("done", () => {
  7109. controlBtn.disabled = true;
  7110. });
  7111. };
  7112. }
  7113. function createWorkerControl(options) {
  7114. let stop = false;
  7115. let stopMessage;
  7116. const startBtn = $creator.button("\u25B6\uFE0F\u5F00\u59CB\u7B54\u9898");
  7117. const restartBtn = $creator.button("\u{1F503}\u91CD\u65B0\u7B54\u9898");
  7118. const controlBtn = $creator.button("\u23F8\u6682\u505C");
  7119. startBtn.onclick = () => {
  7120. startBtn.remove();
  7121. options.onStart();
  7122. };
  7123. restartBtn.onclick = () => {
  7124. stopMessage == null ? void 0 : stopMessage.remove();
  7125. options.onRestart();
  7126. };
  7127. controlBtn.onclick = () => {
  7128. var _a;
  7129. stop = !stop;
  7130. const worker = options.workerProvider();
  7131. (_a = worker == null ? void 0 : worker.emit) == null ? void 0 : _a.call(worker, stop ? "stop" : "continuate");
  7132. controlBtn.value = stop ? "\u25B6\uFE0F\u7EE7\u7EED" : "\u23F8\uFE0F\u6682\u505C";
  7133. if (stop) {
  7134. stopMessage = $message("warn", { duration: 0, content: "\u6682\u505C\u4E2D..." });
  7135. } else {
  7136. stopMessage == null ? void 0 : stopMessage.remove();
  7137. }
  7138. };
  7139. return { startBtn, restartBtn, controlBtn };
  7140. }
  7141. function optimizationElementWithImage(root2) {
  7142. if (root2) {
  7143. for (const img of Array.from(root2.querySelectorAll("img"))) {
  7144. const src2 = document.createElement("span");
  7145. src2.innerText = img.src;
  7146. src2.style.fontSize = "0px";
  7147. img.after(src2);
  7148. }
  7149. }
  7150. return root2;
  7151. }
  7152. function createUnVisibleTextOfImage(img) {
  7153. const src2 = document.createElement("span");
  7154. src2.innerText = img.src;
  7155. src2.style.fontSize = "0px";
  7156. img.after(src2);
  7157. }
  7158. function simplifyWorkResult(results, titleTransform) {
  7159. var _a, _b, _c, _d, _e;
  7160. const res = [];
  7161. let i = 0;
  7162. for (const wr of results) {
  7163. res.push({
  7164. requesting: wr.requesting,
  7165. resolving: wr.resolving,
  7166. error: wr.error,
  7167. question: (titleTransform == null ? void 0 : titleTransform(((_a = wr.ctx) == null ? void 0 : _a.elements.title) || [], i)) || ((_c = (_b = wr.ctx) == null ? void 0 : _b.elements.title) == null ? void 0 : _c.join(",")) || "",
  7168. finish: (_d = wr.result) == null ? void 0 : _d.finish,
  7169. searchInfos: ((_e = wr.ctx) == null ? void 0 : _e.searchInfos.map((sr) => ({
  7170. error: sr.error,
  7171. name: sr.name,
  7172. homepage: sr.homepage,
  7173. results: sr.results.map((ans) => [ans.question, ans.answer])
  7174. }))) || []
  7175. });
  7176. i++;
  7177. }
  7178. return res;
  7179. }
  7180. function removeRedundantWords(str, words) {
  7181. for (const word of words) {
  7182. str = str.replace(word, "");
  7183. }
  7184. return str;
  7185. }
  7186. async function waitForMedia(options) {
  7187. const res = await Promise.race([
  7188. new Promise((resolve, reject) => {
  7189. const interval = setInterval(() => {
  7190. const video = ((options == null ? void 0 : options.root) || document).querySelector(
  7191. `${(options == null ? void 0 : options.videoSelector) || "video"},${(options == null ? void 0 : options.audioSelector) || "audio"}`
  7192. );
  7193. if (video) {
  7194. clearInterval(interval);
  7195. resolve(video);
  7196. }
  7197. }, 1e3);
  7198. }),
  7199. $.sleep(3 * 60 * 1e3)
  7200. ]);
  7201. if (res) {
  7202. return res;
  7203. } else {
  7204. throw new Error("\u89C6\u9891/\u97F3\u9891\u672A\u627E\u5230\uFF0C\u6216\u8005\u52A0\u8F7D\u8D85\u65F6\u3002");
  7205. }
  7206. }
  7207. let actions_key = "";
  7208. const $app_actions = {
  7209. showError: () => {
  7210. $modal("alert", {
  7211. maskCloseable: false,
  7212. title: "\u26A0\uFE0F\u8B66\u544A",
  7213. content: el("div", [
  7214. "\u8F6F\u4EF6\u8F85\u52A9\u542F\u52A8\u5931\u8D25\uFF0C\u65E0\u6CD5\u6267\u884C\u811A\u672C\u64CD\u4F5C\uFF0C\u8BF7\u5F00\u542F\u8F6F\u4EF6\u8F85\u52A9\uFF0C\u5F00\u542F\u6559\u7A0B=>",
  7215. $creator.button("\u8F6F\u4EF6\u8F85\u52A9\u5F00\u542F\u6559\u7A0B", {
  7216. onclick: () => {
  7217. window.open("https://docs.ocsjs.com/docs/script-helper");
  7218. }
  7219. })
  7220. ])
  7221. });
  7222. },
  7223. init: async () => {
  7224. if (!actions_key) {
  7225. try {
  7226. actions_key = await request("http://localhost:15319/get-actions-key", {
  7227. type: "GM_xmlhttpRequest",
  7228. method: "get",
  7229. responseType: "text"
  7230. });
  7231. return true;
  7232. } catch (e) {
  7233. console.log(e);
  7234. return false;
  7235. }
  7236. } else {
  7237. return true;
  7238. }
  7239. },
  7240. waitForResponse: async (url, options) => {
  7241. try {
  7242. await appActionRequest(
  7243. {
  7244. url,
  7245. action: "listen-request"
  7246. },
  7247. {
  7248. baseUrl: "https://onlineexamh5new.zhihuishu.com/",
  7249. responseType: "text"
  7250. }
  7251. );
  7252. } catch (e) {
  7253. console.error("listen request", e);
  7254. $console.error("listen request", String(e));
  7255. }
  7256. return new Promise((resolve, reject) => {
  7257. const interval = setInterval(async () => {
  7258. try {
  7259. const res = await appActionRequest(
  7260. {
  7261. url,
  7262. action: "get-listened-request"
  7263. },
  7264. { baseUrl: "https://onlineexamh5new.zhihuishu.com/", responseType: (options == null ? void 0 : options.responseType) || "text" }
  7265. );
  7266. if (res) {
  7267. clearInterval(interval);
  7268. resolve(res);
  7269. }
  7270. } catch (e) {
  7271. console.error("get-listened-request", e);
  7272. $console.error("get-listened-request", String(e));
  7273. }
  7274. }, (options == null ? void 0 : options.period) || 3e3);
  7275. setTimeout(() => {
  7276. clearInterval(interval);
  7277. }, (options == null ? void 0 : options.timeout) || 60 * 1e3);
  7278. });
  7279. },
  7280. mouseMove: async (x, y) => {
  7281. return await appActionRequest({
  7282. x: x.toString(),
  7283. y: y.toString(),
  7284. action: "mouse-move"
  7285. });
  7286. },
  7287. mouseClick: async (elementOrSelector, count = 1) => {
  7288. if (!elementOrSelector) {
  7289. return;
  7290. }
  7291. if (elementOrSelector instanceof Element) {
  7292. elementOrSelector.scrollIntoView();
  7293. await $.sleep(1e3);
  7294. const rect = elementOrSelector.getBoundingClientRect();
  7295. return await appActionRequest({
  7296. x: rect.x.toString(),
  7297. y: rect.y.toString(),
  7298. count: count.toString(),
  7299. action: "mouse-click"
  7300. });
  7301. } else {
  7302. return await appActionRequest({
  7303. selector: elementOrSelector,
  7304. action: "mouse-click"
  7305. });
  7306. }
  7307. },
  7308. setViewPort: async (width, height) => {
  7309. return await appActionRequest({
  7310. width: width ? width.toString() : "null",
  7311. height: height ? height.toString() : "null",
  7312. action: "set-viewport"
  7313. });
  7314. }
  7315. };
  7316. async function appActionRequest(data, options) {
  7317. await $app_actions.init();
  7318. if (!actions_key) {
  7319. return "";
  7320. }
  7321. data = Object.assign({ page: window.location.href }, data);
  7322. try {
  7323. const res = await request(
  7324. ((options == null ? void 0 : options.baseUrl) || "http://localhost:15319") + "/ocs-script-actions?" + new URLSearchParams(data).toString(),
  7325. {
  7326. type: "fetch",
  7327. method: "get",
  7328. responseType: (options == null ? void 0 : options.responseType) || "text",
  7329. headers: {
  7330. "actions-key": actions_key
  7331. }
  7332. }
  7333. );
  7334. return res;
  7335. } catch (e) {
  7336. console.error(e);
  7337. $console.error("\u8F6F\u4EF6\u8F85\u52A9\u9519\u8BEF", data.action, String(e));
  7338. return "";
  7339. }
  7340. }
  7341. const state$3 = {
  7342. study: {
  7343. stop: false,
  7344. currentMedia: void 0,
  7345. stopInterval: 0,
  7346. stopMessage: void 0
  7347. },
  7348. work: {
  7349. workInfo: void 0
  7350. }
  7351. };
  7352. const ZHSProject = Project.create({
  7353. name: "\u77E5\u5230\u667A\u6167\u6811",
  7354. domains: ["zhihuishu.com"],
  7355. studyProject: true,
  7356. scripts: {
  7357. guide: new Script({
  7358. name: "\u{1F4A1} \u4F7F\u7528\u63D0\u793A",
  7359. url: [
  7360. ["\u5B66\u4E60\u9996\u9875", "https://onlineweb.zhihuishu.com/onlinestuh5"],
  7361. ["\u9996\u9875", "https://www.zhihuishu.com/"]
  7362. ],
  7363. namespace: "zhs.guide",
  7364. configs: {
  7365. notes: {
  7366. defaultValue: $creator.notes([
  7367. "\u8BF7\u624B\u52A8\u8FDB\u5165\u89C6\u9891\u3001\u4F5C\u4E1A\u3001\u8003\u8BD5\u9875\u9762\uFF0C\u811A\u672C\u4F1A\u81EA\u52A8\u8FD0\u884C\u3002",
  7368. "\u5174\u8DA3\u8BFE\u4F1A\u81EA\u52A8\u4E0B\u4E00\u4E2A\uFF0C\u6240\u4EE5\u4E0D\u63D0\u4F9B\u811A\u672C\u3002"
  7369. ]).outerHTML
  7370. }
  7371. },
  7372. oncomplete() {
  7373. CommonProject.scripts.render.methods.pin(this);
  7374. }
  7375. }),
  7376. "gxk-study": new Script({
  7377. name: "\u{1F5A5}\uFE0F \u5171\u4EAB\u8BFE-\u5B66\u4E60\u811A\u672C",
  7378. url: [["\u5171\u4EAB\u8BFE\u5B66\u4E60\u9875\u9762", "studyvideoh5.zhihuishu.com"]],
  7379. namespace: "zhs.gxk.study",
  7380. configs: {
  7381. notes: {
  7382. defaultValue: $creator.notes([
  7383. "\u7AE0\u8282\u6D4B\u8BD5\u8BF7\u5927\u5BB6\u89C2\u770B\u5B8C\u89C6\u9891\u540E\u624B\u52A8\u6253\u5F00\u3002",
  7384. [
  7385. "\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",
  7386. "\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",
  7387. "\u6BCF\u5929\u5B9A\u65F6\u534A\u5C0F\u65F6\u53EF\u83B7\u5F97\u4E00\u5206\u4E60\u60EF\u5206\u3002",
  7388. "\u5982\u679C\u4E0D\u60F3\u8981\u4E60\u60EF\u5206\u53EF\u5FFD\u7565\u3002"
  7389. ],
  7390. "\u4E0D\u8981\u6700\u5C0F\u5316\u6D4F\u89C8\u5668\uFF0C\u53EF\u80FD\u5BFC\u81F4\u811A\u672C\u6682\u505C\u3002",
  7391. "\u8FD0\u884C\u8FC7\u7A0B\u4E2D\u8BF7\u6700\u5C0F\u5316\u811A\u672C\u7A97\u53E3\uFF0C\u907F\u514D\u7A97\u53E3\u906E\u6321\uFF0C\u65E0\u6CD5\u70B9\u51FB\u5143\u7D20"
  7392. ]).outerHTML
  7393. },
  7394. studyRecord: {
  7395. defaultValue: [],
  7396. extra: {
  7397. appConfigSync: false
  7398. }
  7399. },
  7400. stopTime: {
  7401. label: "\u5B9A\u65F6\u505C\u6B62",
  7402. tag: "select",
  7403. attrs: { title: "\u5230\u65F6\u95F4\u540E\u81EA\u52A8\u6682\u505C\u811A\u672C" },
  7404. defaultValue: "0",
  7405. onload() {
  7406. this.append(
  7407. ...$creator.selectOptions(this.getAttribute("value"), [
  7408. [0, "\u5173\u95ED"],
  7409. [0.5, "\u534A\u5C0F\u65F6\u540E"],
  7410. [1, "\u4E00\u5C0F\u65F6\u540E"],
  7411. [2, "\u4E24\u5C0F\u65F6\u540E"]
  7412. ])
  7413. );
  7414. }
  7415. },
  7416. restudy,
  7417. volume,
  7418. definition,
  7419. playbackRate: {
  7420. label: "\u89C6\u9891\u500D\u901F",
  7421. tag: "select",
  7422. defaultValue: 1,
  7423. onload() {
  7424. this.append(
  7425. ...$creator.selectOptions(
  7426. this.getAttribute("value"),
  7427. [1, 1.25, 1.5].map((rate) => [rate, rate + "x"])
  7428. )
  7429. );
  7430. }
  7431. }
  7432. },
  7433. methods() {
  7434. return {
  7435. increaseStudyTime: (courseName, val) => {
  7436. const records = this.cfg.studyRecord;
  7437. const record = records.find(
  7438. (r) => new Date(r.date).toLocaleDateString() === new Date().toLocaleDateString()
  7439. );
  7440. let courses = [];
  7441. if (record) {
  7442. courses = record.courses;
  7443. } else {
  7444. records.push({ date: Date.now(), courses });
  7445. }
  7446. const course = courses.find((c) => c.name === courseName);
  7447. if (course) {
  7448. course.time = course.time + val;
  7449. if (typeof course.time === "string") {
  7450. course.time = parseFloat(course.time);
  7451. }
  7452. } else {
  7453. courses.push({ name: courseName, time: 0 });
  7454. }
  7455. this.cfg.studyRecord = records;
  7456. }
  7457. };
  7458. },
  7459. onrender({ panel: panel2 }) {
  7460. panel2.body.replaceChildren(
  7461. el("hr"),
  7462. $creator.button("\u23F0\u68C0\u6D4B\u662F\u5426\u9700\u8981\u89C4\u5F8B\u5B66\u4E60", {}, (btn) => {
  7463. btn.style.marginRight = "12px";
  7464. btn.onclick = () => {
  7465. var _a;
  7466. (_a = $el(".iconbaizhoumoshi-xueqianbidu")) == null ? void 0 : _a.click();
  7467. setTimeout(() => {
  7468. var _a2;
  7469. const pmd = $el(".preschool-Mustread-div");
  7470. if (pmd) {
  7471. const div = document.querySelector(".dialog-read");
  7472. if (div) {
  7473. div.style.display = "block";
  7474. }
  7475. const num = parseInt(((_a2 = pmd.innerText.match(/学习习惯成绩((\d+)分)/)) == null ? void 0 : _a2[1]) || "0");
  7476. $modal("alert", {
  7477. 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")
  7478. });
  7479. } else {
  7480. $modal("alert", { content: "\u68C0\u6D4B\u5931\u8D25\uFF0C\u8BF7\u786E\u8BA4\u5728\u89C6\u9891\u5B66\u4E60\u9875\u9762\u4F7F\u7528\u6B64\u6309\u94AE\u3002" });
  7481. }
  7482. }, 100);
  7483. };
  7484. }),
  7485. $creator.button("\u{1F4D8}\u67E5\u770B\u5B66\u4E60\u8BB0\u5F55", {}, (btn) => {
  7486. btn.onclick = () => {
  7487. $modal("alert", {
  7488. title: "\u5B66\u4E60\u8BB0\u5F55",
  7489. content: $creator.notes(
  7490. this.cfg.studyRecord.map((r) => {
  7491. const date = new Date(r.date);
  7492. return [
  7493. `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, "0")}-${date.getDate().toString().padStart(2, "0")}`,
  7494. $creator.notes(r.courses.map((course) => `${course.name} - ${optimizeSecond(course.time)}`))
  7495. ];
  7496. })
  7497. )
  7498. });
  7499. };
  7500. })
  7501. );
  7502. },
  7503. onactive() {
  7504. this.cfg.stopTime = "0";
  7505. if (this.cfg.playbackRate) {
  7506. this.cfg.playbackRate = parseFloat(this.cfg.playbackRate.toString());
  7507. }
  7508. },
  7509. async oncomplete() {
  7510. CommonProject.scripts.render.methods.pin(this);
  7511. setTimeout(() => {
  7512. if ($$el(".clearfix.video").length === 0) {
  7513. finish();
  7514. }
  7515. }, 10 * 1e3);
  7516. const waitForVideoList = () => {
  7517. return new Promise((resolve, reject) => {
  7518. if ($$el(".clearfix.video").length > 1) {
  7519. resolve();
  7520. } else {
  7521. setTimeout(() => {
  7522. resolve(waitForVideoList());
  7523. }, 1e3);
  7524. }
  7525. });
  7526. };
  7527. await waitForVideoList();
  7528. this.onConfigChange("stopTime", (stopTime) => {
  7529. if (stopTime === "0") {
  7530. $message("info", { content: "\u5B9A\u65F6\u505C\u6B62\u5DF2\u5173\u95ED" });
  7531. } else {
  7532. autoStop(stopTime);
  7533. }
  7534. });
  7535. this.onConfigChange("volume", (curr) => {
  7536. state$3.study.currentMedia && (state$3.study.currentMedia.volume = curr);
  7537. });
  7538. this.onConfigChange("playbackRate", (curr) => {
  7539. if (typeof curr === "string") {
  7540. this.cfg.playbackRate = parseFloat(curr);
  7541. }
  7542. switchPlaybackRate(this.cfg.playbackRate);
  7543. });
  7544. this.onConfigChange("definition", (curr) => {
  7545. switchLine(curr);
  7546. });
  7547. const hideDialog = () => {
  7548. $$el(".el-dialog__wrapper").forEach((dialog) => {
  7549. dialog.remove();
  7550. });
  7551. };
  7552. const closeTestDialog = async () => {
  7553. var _a, _b;
  7554. const tip = $el('[role="dialog"][aria-label="\u63D0\u793A"]');
  7555. if ((_b = (_a = tip == null ? void 0 : tip.querySelector(".el-message-box__message")) == null ? void 0 : _a.textContent) == null ? void 0 : _b.includes("\u672A\u505A\u7B54\u7684\u5F39\u9898\u4E0D\u80FD\u5173\u95ED")) {
  7556. const close = tip.querySelector('[aria-label="Close"]');
  7557. if (close) {
  7558. await $app_actions.mouseClick('[role="dialog"][aria-label="\u63D0\u793A"] [aria-label="Close"]');
  7559. await $.sleep(1e3);
  7560. }
  7561. }
  7562. const items = $$el("#playTopic-dialog .topic .el-pager .number");
  7563. if (items.length) {
  7564. for (const item of items) {
  7565. if (item.classList.contains("active") === false) {
  7566. item.click();
  7567. await $.sleep(500);
  7568. }
  7569. const options = $$el("#playTopic-dialog ul .topic-item");
  7570. if (options.length !== 0) {
  7571. await waitForCaptcha();
  7572. CommonProject.scripts.render.methods.moveToEdge();
  7573. const random = Math.floor(Math.random() * options.length);
  7574. await $.sleep(1e3);
  7575. await $app_actions.mouseClick(`#playTopic-dialog .topic .radio ul > li:nth-child(${random + 1})`);
  7576. await $.sleep(1e3);
  7577. }
  7578. }
  7579. await $.sleep(1e3);
  7580. await $app_actions.mouseClick("#playTopic-dialog .dialog-footer .btn");
  7581. }
  7582. await $.sleep(3e3);
  7583. await closeTestDialog();
  7584. };
  7585. const finish = () => {
  7586. $modal("alert", {
  7587. 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"
  7588. });
  7589. };
  7590. const recordStudyTimeLoop = () => {
  7591. var _a;
  7592. this.methods.increaseStudyTime(((_a = $el(".source-name")) == null ? void 0 : _a.innerText) || "\u65E0\u540D\u79F0", this.cfg.playbackRate);
  7593. setTimeout(recordStudyTimeLoop, 1e3);
  7594. };
  7595. const findVideoItem = (opts) => {
  7596. let videoItems = Array.from(document.querySelectorAll(".clearfix.video"));
  7597. if (!this.cfg.restudy) {
  7598. videoItems = videoItems.filter((el2) => el2.querySelector(".time_icofinish") === null);
  7599. }
  7600. for (let i = 0; i < videoItems.length; i++) {
  7601. const item = videoItems[i];
  7602. if (item.classList.contains("current_play")) {
  7603. return videoItems[i + (opts.next ? 1 : 0)];
  7604. }
  7605. }
  7606. return videoItems[0];
  7607. };
  7608. if (!await $app_actions.init()) {
  7609. return $app_actions.showError();
  7610. }
  7611. closeDialogRead();
  7612. recordStudyTimeLoop();
  7613. hideDialog();
  7614. autoStop(this.cfg.stopTime);
  7615. closeTestDialog();
  7616. setInterval(async () => {
  7617. $$el(".v-modal,.mask").forEach((modal) => {
  7618. modal.remove();
  7619. });
  7620. fixProcessBar();
  7621. }, 3e3);
  7622. $message("info", { content: "3\u79D2\u540E\u5F00\u59CB\u5B66\u4E60", duration: 3 });
  7623. const study2 = async (opts) => {
  7624. if (state$3.study.stop === false) {
  7625. const item = findVideoItem(opts);
  7626. if (item) {
  7627. await $.sleep(3e3);
  7628. CommonProject.scripts.render.methods.moveToEdge();
  7629. await $app_actions.mouseClick(item);
  7630. watch(
  7631. { volume: this.cfg.volume, playbackRate: this.cfg.playbackRate, definition: this.cfg.definition },
  7632. ({ next: next2 }) => study2({ next: next2 })
  7633. );
  7634. } else {
  7635. finish();
  7636. }
  7637. } else {
  7638. $message("warn", {
  7639. 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"
  7640. });
  7641. }
  7642. };
  7643. study2({ next: false });
  7644. }
  7645. }),
  7646. "gxk-work": new Script({
  7647. name: "\u270D\uFE0F \u5171\u4EAB\u8BFE-\u4F5C\u4E1A\u8003\u8BD5\u811A\u672C",
  7648. url: [
  7649. ["\u5171\u4EAB\u8BFE\u4F5C\u4E1A\u9875\u9762", "zhihuishu.com/stuExamWeb.html#/webExamList/dohomework"],
  7650. ["\u5171\u4EAB\u8BFE\u8003\u8BD5\u9875\u9762", "zhihuishu.com/stuExamWeb.html#/webExamList/doexamination"],
  7651. ["\u4F5C\u4E1A\u8003\u8BD5\u5217\u8868", "zhihuishu.com/stuExamWeb.html#/webExamList\\?"]
  7652. ],
  7653. namespace: "zhs.gxk.work",
  7654. configs: {
  7655. notes: {
  7656. defaultValue: $creator.notes([
  7657. "\u{1F4E2} \u5982\u679C\u672A\u5F00\u59CB\u7B54\u9898\uFF0C\u8BF7\u5C1D\u8BD5\u5237\u65B0\u9875\u9762\u3002",
  7658. "\u81EA\u52A8\u7B54\u9898\u524D\u8BF7\u5728 \u201C\u901A\u7528-\u5168\u5C40\u8BBE\u7F6E\u201D \u4E2D\u8BBE\u7F6E\u9898\u5E93\u914D\u7F6E\u3002",
  7659. "\u53EF\u4EE5\u642D\u914D \u201C\u901A\u7528-\u5728\u7EBF\u641C\u9898\u201D \u4E00\u8D77\u4F7F\u7528\u3002"
  7660. ]).outerHTML
  7661. }
  7662. },
  7663. methods() {
  7664. return {
  7665. work: async () => {
  7666. if (!await $app_actions.init()) {
  7667. return $app_actions.showError();
  7668. }
  7669. const isExam = location.href.includes("doexamination");
  7670. const isWork = location.href.includes("dohomework");
  7671. if (isExam || isWork) {
  7672. await waitForWorkInfo();
  7673. $message("info", { content: `\u5F00\u59CB${isExam ? "\u8003\u8BD5" : "\u4F5C\u4E1A"}` });
  7674. commonWork(this, {
  7675. workerProvider: (opts) => gxkWorkAndExam(opts)
  7676. });
  7677. } else {
  7678. $message("info", { content: "\u{1F4E2} \u8BF7\u624B\u52A8\u8FDB\u5165\u4F5C\u4E1A/\u8003\u8BD5\uFF0C\u5982\u679C\u672A\u5F00\u59CB\u7B54\u9898\uFF0C\u8BF7\u5C1D\u8BD5\u5237\u65B0\u9875\u9762\u3002", duration: 0 });
  7679. CommonProject.scripts.render.methods.pin(this);
  7680. }
  7681. }
  7682. };
  7683. },
  7684. async onstart() {
  7685. const isExam = location.href.includes("doexamination");
  7686. let url = "";
  7687. if (isExam) {
  7688. url = "/taurusExam/gateway/t/v1/student/doExam";
  7689. } else {
  7690. url = "/studentExam/gateway/t/v1/student/doHomework";
  7691. }
  7692. state$3.work.workInfo = await $app_actions.waitForResponse(url, {
  7693. responseType: "json"
  7694. });
  7695. },
  7696. async oncomplete() {
  7697. this.methods.work();
  7698. this.on("historychange", () => {
  7699. this.methods.work();
  7700. });
  7701. }
  7702. }),
  7703. "xnk-study": new Script({
  7704. name: "\u{1F5A5}\uFE0F \u6821\u5185\u8BFE-\u5B66\u4E60\u811A\u672C",
  7705. url: [["\u6821\u5185\u8BFE\u5B66\u4E60\u9875\u9762", "zhihuishu.com/aidedteaching/sourceLearning"]],
  7706. namespace: "zhs.xnk.study",
  7707. configs: {
  7708. notes: {
  7709. 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
  7710. },
  7711. restudy,
  7712. volume
  7713. },
  7714. oncomplete() {
  7715. CommonProject.scripts.render.methods.pin(this);
  7716. const finish = () => {
  7717. $modal("alert", {
  7718. 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"
  7719. });
  7720. };
  7721. this.onConfigChange("volume", (curr) => {
  7722. state$3.study.currentMedia && (state$3.study.currentMedia.volume = curr);
  7723. });
  7724. const nextElement = () => {
  7725. const list = document.querySelectorAll(".file-item");
  7726. let passActive = false;
  7727. for (let index = 0; index < list.length; index++) {
  7728. const item = list[index];
  7729. const finish2 = !!item.querySelector(".icon-finish");
  7730. const needsStudy = !finish2 || finish2 && this.cfg.restudy;
  7731. if (item.classList.contains("active")) {
  7732. if (needsStudy) {
  7733. return item;
  7734. } else {
  7735. passActive = true;
  7736. }
  7737. }
  7738. if (passActive && needsStudy) {
  7739. return item;
  7740. }
  7741. }
  7742. };
  7743. const interval = setInterval(async () => {
  7744. const next2 = nextElement();
  7745. if (next2) {
  7746. clearInterval(interval);
  7747. if (document.querySelector("#mediaPlayer")) {
  7748. watchXnk({ volume: this.cfg.volume }, () => {
  7749. setTimeout(() => {
  7750. const next22 = nextElement();
  7751. if (next22)
  7752. next22.click();
  7753. }, 3e3);
  7754. });
  7755. } else {
  7756. setTimeout(() => {
  7757. $console.log("\u4E0D\u662F\u89C6\u9891\u4EFB\u52A1\uFF0C\u5373\u5C06\u5207\u6362\u4E0B\u4E00\u7AE0\u3002");
  7758. const next22 = nextElement();
  7759. if (next22)
  7760. next22.click();
  7761. }, 3e3);
  7762. }
  7763. }
  7764. }, 1e3);
  7765. setTimeout(() => {
  7766. if (!nextElement()) {
  7767. finish();
  7768. clearInterval(interval);
  7769. }
  7770. }, 10 * 1e3);
  7771. }
  7772. }),
  7773. "xnk-work": new Script({
  7774. name: "\u270D\uFE0F \u6821\u5185\u8BFE-\u4F5C\u4E1A\u8003\u8BD5\u811A\u672C",
  7775. url: [
  7776. ["\u6821\u5185\u8BFE\u4F5C\u4E1A\u9875\u9762", "zhihuishu.com/atHomeworkExam/stu/homeworkQ/exerciseList"],
  7777. ["\u6821\u5185\u8BFE\u8003\u8BD5\u9875\u9762", "zhihuishu.com/atHomeworkExam/stu/examQ/examexercise"]
  7778. ],
  7779. namespace: "zhs.xnk.work",
  7780. configs: { notes: workNotes },
  7781. async oncomplete() {
  7782. commonWork(this, {
  7783. workerProvider: xnkWork
  7784. });
  7785. }
  7786. })
  7787. }
  7788. });
  7789. async function watch(options, onended) {
  7790. await waitForMedia();
  7791. const set = async () => {
  7792. await switchLine(options.definition);
  7793. await $.sleep(1e3);
  7794. await switchPlaybackRate(options.playbackRate);
  7795. const video2 = await waitForMedia();
  7796. state$3.study.currentMedia = video2;
  7797. if (video2) {
  7798. video2.currentTime = 1;
  7799. video2.volume = options.volume;
  7800. }
  7801. return video2;
  7802. };
  7803. const video = await set();
  7804. const videoCheckInterval = setInterval(async () => {
  7805. if ((video == null ? void 0 : video.isConnected) === false) {
  7806. clearInterval(videoCheckInterval);
  7807. $message("info", { content: "\u68C0\u6D4B\u5230\u89C6\u9891\u5207\u6362\u4E2D..." });
  7808. onended({ next: false });
  7809. }
  7810. }, 3e3);
  7811. playMedia(() => video == null ? void 0 : video.play());
  7812. video.onpause = async () => {
  7813. if (!(video == null ? void 0 : video.ended) && state$3.study.stop === false) {
  7814. await waitForCaptcha();
  7815. await $.sleep(1e3);
  7816. video == null ? void 0 : video.play();
  7817. }
  7818. };
  7819. video.onended = () => {
  7820. clearInterval(videoCheckInterval);
  7821. onended({ next: true });
  7822. };
  7823. }
  7824. async function watchXnk(options, onended) {
  7825. const media = await waitForMedia();
  7826. media.volume = options.volume;
  7827. media.currentTime = 1;
  7828. state$3.study.currentMedia = media;
  7829. playMedia(() => media == null ? void 0 : media.play());
  7830. media.onpause = async () => {
  7831. if (!(media == null ? void 0 : media.ended)) {
  7832. await $.sleep(1e3);
  7833. media == null ? void 0 : media.play();
  7834. }
  7835. };
  7836. media.onended = () => {
  7837. onended();
  7838. };
  7839. }
  7840. async function switchLine(definition2 = "line1bq") {
  7841. const controlsBar = $el(".controlsBar");
  7842. const dl = $el(".definiLines");
  7843. if (controlsBar && dl) {
  7844. controlsBar.style.display = "block";
  7845. dl.style.display = "block";
  7846. await $app_actions.mouseClick(`.definiLines .${definition2}`);
  7847. }
  7848. }
  7849. async function switchPlaybackRate(playbackRate) {
  7850. const controlsBar = $el(".controlsBar");
  7851. const sl = $el(".speedList");
  7852. if (controlsBar && sl) {
  7853. controlsBar.style.display = "block";
  7854. sl.style.display = "block";
  7855. await $app_actions.mouseClick(`.speedList [rate="${playbackRate === 1 ? "1.0" : playbackRate}"]`);
  7856. }
  7857. }
  7858. function checkForCaptcha(update) {
  7859. let modal;
  7860. return setInterval(() => {
  7861. if ($el(".yidun_popup")) {
  7862. update(true);
  7863. if (modal === void 0) {
  7864. modal = $modal("alert", { content: "\u5F53\u524D\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\uFF0C\u8BF7\u8F93\u5165\u540E\u65B9\u53EF\u7EE7\u7EED\u8FD0\u884C\u3002" });
  7865. }
  7866. } else {
  7867. if (modal) {
  7868. update(false);
  7869. modal.remove();
  7870. modal = void 0;
  7871. }
  7872. }
  7873. }, 1e3);
  7874. }
  7875. function waitForCaptcha() {
  7876. const popup = getPopupCaptcha();
  7877. if (popup) {
  7878. $message("warn", { content: "\u5F53\u524D\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\uFF0C\u8BF7\u8F93\u5165\u540E\u65B9\u53EF\u7EE7\u7EED\u8FD0\u884C\u3002" });
  7879. return new Promise((resolve, reject) => {
  7880. const interval = setInterval(() => {
  7881. const popup2 = getPopupCaptcha();
  7882. if (popup2 === null) {
  7883. clearInterval(interval);
  7884. resolve();
  7885. }
  7886. }, 1e3);
  7887. });
  7888. }
  7889. }
  7890. function getPopupCaptcha() {
  7891. return document.querySelector(".yidun_popup");
  7892. }
  7893. function waitForWorkInfo() {
  7894. return new Promise((resolve, reject) => {
  7895. const interval = setInterval(() => {
  7896. if (state$3.work.workInfo) {
  7897. clearInterval(interval);
  7898. resolve(state$3.work.workInfo);
  7899. }
  7900. }, 1e3);
  7901. });
  7902. }
  7903. function gxkWorkAndExam({
  7904. answererWrappers,
  7905. period,
  7906. thread,
  7907. stopSecondWhenFinish,
  7908. redundanceWordsText
  7909. }) {
  7910. var _a, _b, _c, _d, _e;
  7911. CommonProject.scripts.workResults.methods.init({
  7912. questionPositionSyncHandlerType: "zhs-gxk"
  7913. });
  7914. const allExamParts = ((_e = ((_d = (_c = (_b = (_a = state$3 == null ? void 0 : state$3.work) == null ? void 0 : _a.workInfo) == null ? void 0 : _b.rt) == null ? void 0 : _c.examBase) == null ? void 0 : _d.workExamParts) || []) == null ? void 0 : _e.map((p) => p.questionDtos).flat()) || [];
  7915. const titleTransform = (_, index2) => {
  7916. var _a2;
  7917. const div = el("div");
  7918. div.innerHTML = ((_a2 = allExamParts[index2]) == null ? void 0 : _a2.name) || "\u9898\u76EE\u8BFB\u53D6\u5931\u8D25";
  7919. return removeRedundantWords(optimizationElementWithImage(div).innerText || "", redundanceWordsText.split("\n"));
  7920. };
  7921. let index = 0;
  7922. const worker = new OCSWorker({
  7923. root: ".examPaper_subject",
  7924. elements: {
  7925. title: ".subject_describe > div,.smallStem_describe > div:nth-child(2)",
  7926. options: (root2) => $$el(".subject_node .nodeLab", root2).map((t2) => {
  7927. for (const img of Array.from(t2.querySelectorAll(".node_detail img"))) {
  7928. if (img.dataset.src) {
  7929. img.src = img.dataset.src;
  7930. }
  7931. createUnVisibleTextOfImage(img);
  7932. }
  7933. return t2;
  7934. })
  7935. },
  7936. requestPeriod: period != null ? period : 3,
  7937. resolvePeriod: 1,
  7938. thread: thread != null ? thread : 1,
  7939. answerer: (elements, type, ctx) => {
  7940. const title = titleTransform(void 0, index++);
  7941. if (title) {
  7942. return CommonProject.scripts.apps.methods.searchAnswerInCaches(title, () => {
  7943. return defaultAnswerWrapperHandler(answererWrappers, {
  7944. type,
  7945. title,
  7946. options: ctx.elements.options.map((o) => o.innerText).join("\n")
  7947. });
  7948. });
  7949. } else {
  7950. throw new Error("\u9898\u76EE\u4E3A\u7A7A\uFF0C\u8BF7\u67E5\u770B\u9898\u76EE\u662F\u5426\u4E3A\u7A7A\uFF0C\u6216\u8005\u5FFD\u7565\u6B64\u9898");
  7951. }
  7952. },
  7953. work: {
  7954. handler(type, answer, option) {
  7955. var _a2;
  7956. if (type === "judgement" || type === "single" || type === "multiple") {
  7957. if (!((_a2 = option.querySelector("input")) == null ? void 0 : _a2.checked)) {
  7958. option.click();
  7959. }
  7960. } else if (type === "completion" && answer.trim()) {
  7961. const text = option.querySelector("textarea");
  7962. if (text) {
  7963. text.value = answer;
  7964. }
  7965. }
  7966. }
  7967. },
  7968. onResultsUpdate(res) {
  7969. CommonProject.scripts.workResults.methods.setResults(simplifyWorkResult(res, titleTransform));
  7970. },
  7971. onResolveUpdate(res) {
  7972. var _a2;
  7973. if ((_a2 = res.result) == null ? void 0 : _a2.finish) {
  7974. CommonProject.scripts.apps.methods.addQuestionCacheFromWorkResult(simplifyWorkResult([res], titleTransform));
  7975. }
  7976. CommonProject.scripts.workResults.methods.updateWorkState(worker);
  7977. }
  7978. });
  7979. checkForCaptcha((hasCaptcha) => {
  7980. if (hasCaptcha) {
  7981. worker.emit("stop");
  7982. } else {
  7983. worker.emit("continuate");
  7984. }
  7985. });
  7986. worker.doWork().then(async () => {
  7987. var _a2;
  7988. $message("success", { content: `\u7B54\u9898\u5B8C\u6210\uFF0C\u5C06\u7B49\u5F85 ${stopSecondWhenFinish} \u79D2\u540E\u8FDB\u884C\u4FDD\u5B58\u6216\u63D0\u4EA4\u3002` });
  7989. await $.sleep(stopSecondWhenFinish * 1e3);
  7990. for (let index2 = 0; index2 < worker.totalQuestionCount; index2++) {
  7991. const modal = $modal("alert", { content: "\u6B63\u5728\u4FDD\u5B58\u9898\u76EE\u4E2D\uFF0C\u8BF7\u52FF\u64CD\u4F5C...", confirmButton: null });
  7992. await waitForCaptcha();
  7993. await $.sleep(2e3);
  7994. (_a2 = document.querySelectorAll(".answerCard_list ul li").item(index2)) == null ? void 0 : _a2.click();
  7995. await $.sleep(200);
  7996. const next2 = $el("div.examPaper_box > div.switch-btn-box > button:nth-child(2)");
  7997. if (next2) {
  7998. next2.click();
  7999. } else {
  8000. $console.error("\u672A\u627E\u5230\u4E0B\u4E00\u9875\u6309\u94AE\u3002");
  8001. }
  8002. modal == null ? void 0 : modal.remove();
  8003. }
  8004. $message("info", { content: "\u4F5C\u4E1A/\u8003\u8BD5\u5B8C\u6210\uFF0C\u8BF7\u81EA\u884C\u68C0\u67E5\u540E\u4FDD\u5B58\u6216\u63D0\u4EA4\u3002", duration: 0 });
  8005. worker.emit("done");
  8006. }).catch((err) => {
  8007. $message("error", { content: "\u7B54\u9898\u7A0B\u5E8F\u53D1\u751F\u9519\u8BEF : " + err.message, duration: 0 });
  8008. });
  8009. return worker;
  8010. }
  8011. function xnkWork({ answererWrappers, period, thread }) {
  8012. $message("info", { content: "\u5F00\u59CB\u4F5C\u4E1A" });
  8013. CommonProject.scripts.workResults.methods.init();
  8014. const titleTransform = (titles) => {
  8015. return titles.filter((t2) => t2 == null ? void 0 : t2.innerText).map((t2) => t2 ? optimizationElementWithImage(t2).innerText : "").join(",");
  8016. };
  8017. const workResults = [];
  8018. let totalQuestionCount = 0;
  8019. let requestIndex = 0;
  8020. let resolverIndex = 0;
  8021. const worker = new OCSWorker({
  8022. root: ".questionBox",
  8023. elements: {
  8024. title: ".questionContent",
  8025. options: ".optionUl label",
  8026. questionTit: ".questionTit"
  8027. },
  8028. requestPeriod: period != null ? period : 3,
  8029. resolvePeriod: 1,
  8030. thread: thread != null ? thread : 1,
  8031. answerer: (elements, type, ctx) => {
  8032. const title = titleTransform(elements.title);
  8033. if (title) {
  8034. return CommonProject.scripts.apps.methods.searchAnswerInCaches(title, () => {
  8035. return defaultAnswerWrapperHandler(answererWrappers, {
  8036. type,
  8037. title,
  8038. options: ctx.elements.options.map((o) => o.innerText).join("\n")
  8039. });
  8040. });
  8041. } else {
  8042. throw new Error("\u9898\u76EE\u4E3A\u7A7A\uFF0C\u8BF7\u67E5\u770B\u9898\u76EE\u662F\u5426\u4E3A\u7A7A\uFF0C\u6216\u8005\u5FFD\u7565\u6B64\u9898");
  8043. }
  8044. },
  8045. work: {
  8046. handler(type, answer, option, ctx) {
  8047. var _a;
  8048. if (type === "judgement" || type === "single" || type === "multiple") {
  8049. if (((_a = option.querySelector("input")) == null ? void 0 : _a.checked) === false) {
  8050. option.click();
  8051. }
  8052. } else if (type === "completion" && answer.trim()) {
  8053. const text = option.querySelector("textarea");
  8054. if (text) {
  8055. text.value = answer;
  8056. }
  8057. }
  8058. }
  8059. },
  8060. onResultsUpdate(res, currentResult) {
  8061. if (currentResult.result) {
  8062. workResults.push(...simplifyWorkResult([currentResult], titleTransform));
  8063. CommonProject.scripts.workResults.methods.setResults(workResults);
  8064. totalQuestionCount++;
  8065. requestIndex++;
  8066. resolverIndex++;
  8067. }
  8068. },
  8069. onResolveUpdate(res) {
  8070. var _a;
  8071. if ((_a = res.result) == null ? void 0 : _a.finish) {
  8072. CommonProject.scripts.apps.methods.addQuestionCacheFromWorkResult(simplifyWorkResult([res], titleTransform));
  8073. }
  8074. CommonProject.scripts.workResults.methods.updateWorkState({
  8075. totalQuestionCount,
  8076. requestIndex,
  8077. resolverIndex
  8078. });
  8079. }
  8080. });
  8081. const getBtn = () => document.querySelector("span.Topicswitchingbtn:nth-child(2)");
  8082. let next2 = getBtn();
  8083. (async () => {
  8084. while (next2 && worker.isClose === false) {
  8085. await worker.doWork();
  8086. await $.sleep((period != null ? period : 3) * 1e3);
  8087. next2 = getBtn();
  8088. next2 == null ? void 0 : next2.click();
  8089. await $.sleep((period != null ? period : 3) * 1e3);
  8090. }
  8091. $message("info", { content: "\u4F5C\u4E1A/\u8003\u8BD5\u5B8C\u6210\uFF0C\u8BF7\u81EA\u884C\u68C0\u67E5\u540E\u4FDD\u5B58\u6216\u63D0\u4EA4\u3002", duration: 0 });
  8092. worker.emit("done");
  8093. CommonProject.scripts.workResults.cfg.questionPositionSyncHandlerType = "zhs-xnk";
  8094. })();
  8095. return worker;
  8096. }
  8097. function optimizeSecond(second) {
  8098. if (second > 3600) {
  8099. return `${Math.floor(second / 3600)}\u5C0F\u65F6${Math.floor(second % 3600 / 60)}\u5206\u949F`;
  8100. } else if (second > 60) {
  8101. return `${Math.floor(second / 60)}\u5206\u949F${second % 60}\u79D2`;
  8102. } else {
  8103. return `${second}\u79D2`;
  8104. }
  8105. }
  8106. function autoStop(stopTime) {
  8107. var _a, _b;
  8108. clearInterval(state$3.study.stopInterval);
  8109. (_a = state$3.study.stopMessage) == null ? void 0 : _a.remove();
  8110. if (stopTime !== "0") {
  8111. let stopCount = parseFloat(stopTime) * 60 * 60;
  8112. state$3.study.stopInterval = setInterval(() => {
  8113. var _a2;
  8114. if (stopCount > 0) {
  8115. if (getPopupCaptcha() === null) {
  8116. stopCount--;
  8117. }
  8118. } else {
  8119. clearInterval(state$3.study.stopInterval);
  8120. state$3.study.stop = true;
  8121. (_a2 = $el("video")) == null ? void 0 : _a2.pause();
  8122. $modal("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" });
  8123. }
  8124. }, 1e3);
  8125. const val = (_b = [
  8126. [0.5, "\u534A\u5C0F\u65F6\u540E"],
  8127. [1, "\u4E00\u5C0F\u65F6\u540E"],
  8128. [2, "\u4E24\u5C0F\u65F6\u540E"]
  8129. ].find((t2) => t2[0].toString() === stopTime)) == null ? void 0 : _b[0];
  8130. const date = new Date();
  8131. date.setMinutes(date.getMinutes() + val * 60);
  8132. state$3.study.stopMessage = $message("info", {
  8133. duration: 0,
  8134. content: `\u5728 ${date.toLocaleTimeString()} \u811A\u672C\u5C06\u81EA\u52A8\u6682\u505C`
  8135. });
  8136. }
  8137. }
  8138. function fixProcessBar() {
  8139. const bar = document.querySelector(".controlsBar");
  8140. if (bar) {
  8141. bar.style.display = "block";
  8142. }
  8143. }
  8144. function closeDialogRead() {
  8145. const div = document.querySelector(".dialog-read");
  8146. if (div) {
  8147. div.style.display = "none";
  8148. }
  8149. }
  8150. var md5$1 = { exports: {} };
  8151. var crypt = { exports: {} };
  8152. (function() {
  8153. var base64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", crypt$1 = {
  8154. rotl: function(n, b) {
  8155. return n << b | n >>> 32 - b;
  8156. },
  8157. rotr: function(n, b) {
  8158. return n << 32 - b | n >>> b;
  8159. },
  8160. endian: function(n) {
  8161. if (n.constructor == Number) {
  8162. return crypt$1.rotl(n, 8) & 16711935 | crypt$1.rotl(n, 24) & 4278255360;
  8163. }
  8164. for (var i = 0; i < n.length; i++)
  8165. n[i] = crypt$1.endian(n[i]);
  8166. return n;
  8167. },
  8168. randomBytes: function(n) {
  8169. for (var bytes = []; n > 0; n--)
  8170. bytes.push(Math.floor(Math.random() * 256));
  8171. return bytes;
  8172. },
  8173. bytesToWords: function(bytes) {
  8174. for (var words = [], i = 0, b = 0; i < bytes.length; i++, b += 8)
  8175. words[b >>> 5] |= bytes[i] << 24 - b % 32;
  8176. return words;
  8177. },
  8178. wordsToBytes: function(words) {
  8179. for (var bytes = [], b = 0; b < words.length * 32; b += 8)
  8180. bytes.push(words[b >>> 5] >>> 24 - b % 32 & 255);
  8181. return bytes;
  8182. },
  8183. bytesToHex: function(bytes) {
  8184. for (var hex = [], i = 0; i < bytes.length; i++) {
  8185. hex.push((bytes[i] >>> 4).toString(16));
  8186. hex.push((bytes[i] & 15).toString(16));
  8187. }
  8188. return hex.join("");
  8189. },
  8190. hexToBytes: function(hex) {
  8191. for (var bytes = [], c = 0; c < hex.length; c += 2)
  8192. bytes.push(parseInt(hex.substr(c, 2), 16));
  8193. return bytes;
  8194. },
  8195. bytesToBase64: function(bytes) {
  8196. for (var base64 = [], i = 0; i < bytes.length; i += 3) {
  8197. var triplet = bytes[i] << 16 | bytes[i + 1] << 8 | bytes[i + 2];
  8198. for (var j = 0; j < 4; j++)
  8199. if (i * 8 + j * 6 <= bytes.length * 8)
  8200. base64.push(base64map.charAt(triplet >>> 6 * (3 - j) & 63));
  8201. else
  8202. base64.push("=");
  8203. }
  8204. return base64.join("");
  8205. },
  8206. base64ToBytes: function(base64) {
  8207. base64 = base64.replace(/[^A-Z0-9+\/]/ig, "");
  8208. for (var bytes = [], i = 0, imod4 = 0; i < base64.length; imod4 = ++i % 4) {
  8209. if (imod4 == 0)
  8210. continue;
  8211. 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);
  8212. }
  8213. return bytes;
  8214. }
  8215. };
  8216. crypt.exports = crypt$1;
  8217. })();
  8218. var charenc = {
  8219. utf8: {
  8220. stringToBytes: function(str) {
  8221. return charenc.bin.stringToBytes(unescape(encodeURIComponent(str)));
  8222. },
  8223. bytesToString: function(bytes) {
  8224. return decodeURIComponent(escape(charenc.bin.bytesToString(bytes)));
  8225. }
  8226. },
  8227. bin: {
  8228. stringToBytes: function(str) {
  8229. for (var bytes = [], i = 0; i < str.length; i++)
  8230. bytes.push(str.charCodeAt(i) & 255);
  8231. return bytes;
  8232. },
  8233. bytesToString: function(bytes) {
  8234. for (var str = [], i = 0; i < bytes.length; i++)
  8235. str.push(String.fromCharCode(bytes[i]));
  8236. return str.join("");
  8237. }
  8238. }
  8239. };
  8240. var charenc_1 = charenc;
  8241. /*!
  8242. * Determine if an object is a Buffer
  8243. *
  8244. * @author Feross Aboukhadijeh <https://feross.org>
  8245. * @license MIT
  8246. */
  8247. var isBuffer_1 = function(obj) {
  8248. return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer);
  8249. };
  8250. function isBuffer(obj) {
  8251. return !!obj.constructor && typeof obj.constructor.isBuffer === "function" && obj.constructor.isBuffer(obj);
  8252. }
  8253. function isSlowBuffer(obj) {
  8254. return typeof obj.readFloatLE === "function" && typeof obj.slice === "function" && isBuffer(obj.slice(0, 0));
  8255. }
  8256. (function() {
  8257. var crypt$1 = crypt.exports, utf8 = charenc_1.utf8, isBuffer2 = isBuffer_1, bin = charenc_1.bin, md52 = function(message, options) {
  8258. if (message.constructor == String)
  8259. if (options && options.encoding === "binary")
  8260. message = bin.stringToBytes(message);
  8261. else
  8262. message = utf8.stringToBytes(message);
  8263. else if (isBuffer2(message))
  8264. message = Array.prototype.slice.call(message, 0);
  8265. else if (!Array.isArray(message) && message.constructor !== Uint8Array)
  8266. message = message.toString();
  8267. var m = crypt$1.bytesToWords(message), l = message.length * 8, a = 1732584193, b = -271733879, c = -1732584194, d = 271733878;
  8268. for (var i = 0; i < m.length; i++) {
  8269. m[i] = (m[i] << 8 | m[i] >>> 24) & 16711935 | (m[i] << 24 | m[i] >>> 8) & 4278255360;
  8270. }
  8271. m[l >>> 5] |= 128 << l % 32;
  8272. m[(l + 64 >>> 9 << 4) + 14] = l;
  8273. var FF = md52._ff, GG = md52._gg, HH = md52._hh, II = md52._ii;
  8274. for (var i = 0; i < m.length; i += 16) {
  8275. var aa = a, bb = b, cc = c, dd = d;
  8276. a = FF(a, b, c, d, m[i + 0], 7, -680876936);
  8277. d = FF(d, a, b, c, m[i + 1], 12, -389564586);
  8278. c = FF(c, d, a, b, m[i + 2], 17, 606105819);
  8279. b = FF(b, c, d, a, m[i + 3], 22, -1044525330);
  8280. a = FF(a, b, c, d, m[i + 4], 7, -176418897);
  8281. d = FF(d, a, b, c, m[i + 5], 12, 1200080426);
  8282. c = FF(c, d, a, b, m[i + 6], 17, -1473231341);
  8283. b = FF(b, c, d, a, m[i + 7], 22, -45705983);
  8284. a = FF(a, b, c, d, m[i + 8], 7, 1770035416);
  8285. d = FF(d, a, b, c, m[i + 9], 12, -1958414417);
  8286. c = FF(c, d, a, b, m[i + 10], 17, -42063);
  8287. b = FF(b, c, d, a, m[i + 11], 22, -1990404162);
  8288. a = FF(a, b, c, d, m[i + 12], 7, 1804603682);
  8289. d = FF(d, a, b, c, m[i + 13], 12, -40341101);
  8290. c = FF(c, d, a, b, m[i + 14], 17, -1502002290);
  8291. b = FF(b, c, d, a, m[i + 15], 22, 1236535329);
  8292. a = GG(a, b, c, d, m[i + 1], 5, -165796510);
  8293. d = GG(d, a, b, c, m[i + 6], 9, -1069501632);
  8294. c = GG(c, d, a, b, m[i + 11], 14, 643717713);
  8295. b = GG(b, c, d, a, m[i + 0], 20, -373897302);
  8296. a = GG(a, b, c, d, m[i + 5], 5, -701558691);
  8297. d = GG(d, a, b, c, m[i + 10], 9, 38016083);
  8298. c = GG(c, d, a, b, m[i + 15], 14, -660478335);
  8299. b = GG(b, c, d, a, m[i + 4], 20, -405537848);
  8300. a = GG(a, b, c, d, m[i + 9], 5, 568446438);
  8301. d = GG(d, a, b, c, m[i + 14], 9, -1019803690);
  8302. c = GG(c, d, a, b, m[i + 3], 14, -187363961);
  8303. b = GG(b, c, d, a, m[i + 8], 20, 1163531501);
  8304. a = GG(a, b, c, d, m[i + 13], 5, -1444681467);
  8305. d = GG(d, a, b, c, m[i + 2], 9, -51403784);
  8306. c = GG(c, d, a, b, m[i + 7], 14, 1735328473);
  8307. b = GG(b, c, d, a, m[i + 12], 20, -1926607734);
  8308. a = HH(a, b, c, d, m[i + 5], 4, -378558);
  8309. d = HH(d, a, b, c, m[i + 8], 11, -2022574463);
  8310. c = HH(c, d, a, b, m[i + 11], 16, 1839030562);
  8311. b = HH(b, c, d, a, m[i + 14], 23, -35309556);
  8312. a = HH(a, b, c, d, m[i + 1], 4, -1530992060);
  8313. d = HH(d, a, b, c, m[i + 4], 11, 1272893353);
  8314. c = HH(c, d, a, b, m[i + 7], 16, -155497632);
  8315. b = HH(b, c, d, a, m[i + 10], 23, -1094730640);
  8316. a = HH(a, b, c, d, m[i + 13], 4, 681279174);
  8317. d = HH(d, a, b, c, m[i + 0], 11, -358537222);
  8318. c = HH(c, d, a, b, m[i + 3], 16, -722521979);
  8319. b = HH(b, c, d, a, m[i + 6], 23, 76029189);
  8320. a = HH(a, b, c, d, m[i + 9], 4, -640364487);
  8321. d = HH(d, a, b, c, m[i + 12], 11, -421815835);
  8322. c = HH(c, d, a, b, m[i + 15], 16, 530742520);
  8323. b = HH(b, c, d, a, m[i + 2], 23, -995338651);
  8324. a = II(a, b, c, d, m[i + 0], 6, -198630844);
  8325. d = II(d, a, b, c, m[i + 7], 10, 1126891415);
  8326. c = II(c, d, a, b, m[i + 14], 15, -1416354905);
  8327. b = II(b, c, d, a, m[i + 5], 21, -57434055);
  8328. a = II(a, b, c, d, m[i + 12], 6, 1700485571);
  8329. d = II(d, a, b, c, m[i + 3], 10, -1894986606);
  8330. c = II(c, d, a, b, m[i + 10], 15, -1051523);
  8331. b = II(b, c, d, a, m[i + 1], 21, -2054922799);
  8332. a = II(a, b, c, d, m[i + 8], 6, 1873313359);
  8333. d = II(d, a, b, c, m[i + 15], 10, -30611744);
  8334. c = II(c, d, a, b, m[i + 6], 15, -1560198380);
  8335. b = II(b, c, d, a, m[i + 13], 21, 1309151649);
  8336. a = II(a, b, c, d, m[i + 4], 6, -145523070);
  8337. d = II(d, a, b, c, m[i + 11], 10, -1120210379);
  8338. c = II(c, d, a, b, m[i + 2], 15, 718787259);
  8339. b = II(b, c, d, a, m[i + 9], 21, -343485551);
  8340. a = a + aa >>> 0;
  8341. b = b + bb >>> 0;
  8342. c = c + cc >>> 0;
  8343. d = d + dd >>> 0;
  8344. }
  8345. return crypt$1.endian([a, b, c, d]);
  8346. };
  8347. md52._ff = function(a, b, c, d, x, s, t2) {
  8348. var n = a + (b & c | ~b & d) + (x >>> 0) + t2;
  8349. return (n << s | n >>> 32 - s) + b;
  8350. };
  8351. md52._gg = function(a, b, c, d, x, s, t2) {
  8352. var n = a + (b & d | c & ~d) + (x >>> 0) + t2;
  8353. return (n << s | n >>> 32 - s) + b;
  8354. };
  8355. md52._hh = function(a, b, c, d, x, s, t2) {
  8356. var n = a + (b ^ c ^ d) + (x >>> 0) + t2;
  8357. return (n << s | n >>> 32 - s) + b;
  8358. };
  8359. md52._ii = function(a, b, c, d, x, s, t2) {
  8360. var n = a + (c ^ (b | ~d)) + (x >>> 0) + t2;
  8361. return (n << s | n >>> 32 - s) + b;
  8362. };
  8363. md52._blocksize = 16;
  8364. md52._digestsize = 16;
  8365. md5$1.exports = function(message, options) {
  8366. if (message === void 0 || message === null)
  8367. throw new Error("Illegal argument " + message);
  8368. var digestbytes = crypt$1.wordsToBytes(md52(message, options));
  8369. return options && options.asBytes ? digestbytes : options && options.asString ? bin.bytesToString(digestbytes) : crypt$1.bytesToHex(digestbytes);
  8370. };
  8371. })();
  8372. var md5 = md5$1.exports;
  8373. var Typr = {};
  8374. Typr.parse = function(buff) {
  8375. var bin = Typr._bin;
  8376. var data = new Uint8Array(buff);
  8377. var offset = 0;
  8378. bin.readFixed(data, offset);
  8379. offset += 4;
  8380. var numTables = bin.readUshort(data, offset);
  8381. offset += 2;
  8382. bin.readUshort(data, offset);
  8383. offset += 2;
  8384. bin.readUshort(data, offset);
  8385. offset += 2;
  8386. bin.readUshort(data, offset);
  8387. offset += 2;
  8388. var tags = ["cmap", "head", "hhea", "maxp", "hmtx", "name", "OS/2", "post", "loca", "glyf", "kern", "CFF ", "GPOS", "GSUB", "SVG "];
  8389. var obj = { _data: data };
  8390. var tabs = {};
  8391. for (var i = 0; i < numTables; i++) {
  8392. var tag = bin.readASCII(data, offset, 4);
  8393. offset += 4;
  8394. bin.readUint(data, offset);
  8395. offset += 4;
  8396. var toffset = bin.readUint(data, offset);
  8397. offset += 4;
  8398. var length = bin.readUint(data, offset);
  8399. offset += 4;
  8400. tabs[tag] = { offset: toffset, length };
  8401. }
  8402. for (var i = 0; i < tags.length; i++) {
  8403. var t2 = tags[i];
  8404. if (tabs[t2])
  8405. obj[t2.trim()] = Typr[t2.trim()].parse(data, tabs[t2].offset, tabs[t2].length, obj);
  8406. }
  8407. return obj;
  8408. };
  8409. Typr._tabOffset = function(data, tab) {
  8410. var bin = Typr._bin;
  8411. var numTables = bin.readUshort(data, 4);
  8412. var offset = 12;
  8413. for (var i = 0; i < numTables; i++) {
  8414. var tag = bin.readASCII(data, offset, 4);
  8415. offset += 4;
  8416. bin.readUint(data, offset);
  8417. offset += 4;
  8418. var toffset = bin.readUint(data, offset);
  8419. offset += 4;
  8420. bin.readUint(data, offset);
  8421. offset += 4;
  8422. if (tag == tab)
  8423. return toffset;
  8424. }
  8425. return 0;
  8426. };
  8427. Typr._bin = { readFixed: function(data, o) {
  8428. return (data[o] << 8 | data[o + 1]) + (data[o + 2] << 8 | data[o + 3]) / (256 * 256 + 4);
  8429. }, readF2dot14: function(data, o) {
  8430. var num = Typr._bin.readShort(data, o);
  8431. return num / 16384;
  8432. }, readInt: function(buff, p) {
  8433. var a = Typr._bin.t.uint8;
  8434. a[0] = buff[p + 3];
  8435. a[1] = buff[p + 2];
  8436. a[2] = buff[p + 1];
  8437. a[3] = buff[p];
  8438. return Typr._bin.t.int32[0];
  8439. }, readInt8: function(buff, p) {
  8440. var a = Typr._bin.t.uint8;
  8441. a[0] = buff[p];
  8442. return Typr._bin.t.int8[0];
  8443. }, readShort: function(buff, p) {
  8444. var a = Typr._bin.t.uint8;
  8445. a[1] = buff[p];
  8446. a[0] = buff[p + 1];
  8447. return Typr._bin.t.int16[0];
  8448. }, readUshort: function(buff, p) {
  8449. return buff[p] << 8 | buff[p + 1];
  8450. }, readUshorts: function(buff, p, len) {
  8451. var arr = [];
  8452. for (var i = 0; i < len; i++)
  8453. arr.push(Typr._bin.readUshort(buff, p + i * 2));
  8454. return arr;
  8455. }, readUint: function(buff, p) {
  8456. var a = Typr._bin.t.uint8;
  8457. a[3] = buff[p];
  8458. a[2] = buff[p + 1];
  8459. a[1] = buff[p + 2];
  8460. a[0] = buff[p + 3];
  8461. return Typr._bin.t.uint32[0];
  8462. }, readUint64: function(buff, p) {
  8463. return Typr._bin.readUint(buff, p) * (4294967295 + 1) + Typr._bin.readUint(buff, p + 4);
  8464. }, readASCII: function(buff, p, l) {
  8465. var s = "";
  8466. for (var i = 0; i < l; i++)
  8467. s += String.fromCharCode(buff[p + i]);
  8468. return s;
  8469. }, readUnicode: function(buff, p, l) {
  8470. var s = "";
  8471. for (var i = 0; i < l; i++) {
  8472. var c = buff[p++] << 8 | buff[p++];
  8473. s += String.fromCharCode(c);
  8474. }
  8475. return s;
  8476. }, _tdec: window["TextDecoder"] ? new window["TextDecoder"]() : null, readUTF8: function(buff, p, l) {
  8477. var tdec = Typr._bin._tdec;
  8478. if (tdec && p == 0 && l == buff.length)
  8479. return tdec["decode"](buff);
  8480. return Typr._bin.readASCII(buff, p, l);
  8481. }, readBytes: function(buff, p, l) {
  8482. var arr = [];
  8483. for (var i = 0; i < l; i++)
  8484. arr.push(buff[p + i]);
  8485. return arr;
  8486. }, readASCIIArray: function(buff, p, l) {
  8487. var s = [];
  8488. for (var i = 0; i < l; i++)
  8489. s.push(String.fromCharCode(buff[p + i]));
  8490. return s;
  8491. } };
  8492. Typr._bin.t = { buff: new ArrayBuffer(8) };
  8493. Typr._bin.t.int8 = new Int8Array(Typr._bin.t.buff);
  8494. Typr._bin.t.uint8 = new Uint8Array(Typr._bin.t.buff);
  8495. Typr._bin.t.int16 = new Int16Array(Typr._bin.t.buff);
  8496. Typr._bin.t.uint16 = new Uint16Array(Typr._bin.t.buff);
  8497. Typr._bin.t.int32 = new Int32Array(Typr._bin.t.buff);
  8498. Typr._bin.t.uint32 = new Uint32Array(Typr._bin.t.buff);
  8499. Typr._lctf = {};
  8500. Typr._lctf.parse = function(data, offset, length, font, subt) {
  8501. var bin = Typr._bin;
  8502. var obj = {};
  8503. var offset0 = offset;
  8504. bin.readFixed(data, offset);
  8505. offset += 4;
  8506. var offScriptList = bin.readUshort(data, offset);
  8507. offset += 2;
  8508. var offFeatureList = bin.readUshort(data, offset);
  8509. offset += 2;
  8510. var offLookupList = bin.readUshort(data, offset);
  8511. offset += 2;
  8512. obj.scriptList = Typr._lctf.readScriptList(data, offset0 + offScriptList);
  8513. obj.featureList = Typr._lctf.readFeatureList(data, offset0 + offFeatureList);
  8514. obj.lookupList = Typr._lctf.readLookupList(data, offset0 + offLookupList, subt);
  8515. return obj;
  8516. };
  8517. Typr._lctf.readLookupList = function(data, offset, subt) {
  8518. var bin = Typr._bin;
  8519. var offset0 = offset;
  8520. var obj = [];
  8521. var count = bin.readUshort(data, offset);
  8522. offset += 2;
  8523. for (var i = 0; i < count; i++) {
  8524. var noff = bin.readUshort(data, offset);
  8525. offset += 2;
  8526. var lut = Typr._lctf.readLookupTable(data, offset0 + noff, subt);
  8527. obj.push(lut);
  8528. }
  8529. return obj;
  8530. };
  8531. Typr._lctf.readLookupTable = function(data, offset, subt) {
  8532. var bin = Typr._bin;
  8533. var offset0 = offset;
  8534. var obj = { tabs: [] };
  8535. obj.ltype = bin.readUshort(data, offset);
  8536. offset += 2;
  8537. obj.flag = bin.readUshort(data, offset);
  8538. offset += 2;
  8539. var cnt = bin.readUshort(data, offset);
  8540. offset += 2;
  8541. for (var i = 0; i < cnt; i++) {
  8542. var noff = bin.readUshort(data, offset);
  8543. offset += 2;
  8544. var tab = subt(data, obj.ltype, offset0 + noff);
  8545. obj.tabs.push(tab);
  8546. }
  8547. return obj;
  8548. };
  8549. Typr._lctf.numOfOnes = function(n) {
  8550. var num = 0;
  8551. for (var i = 0; i < 32; i++)
  8552. if ((n >>> i & 1) != 0)
  8553. num++;
  8554. return num;
  8555. };
  8556. Typr._lctf.readClassDef = function(data, offset) {
  8557. var bin = Typr._bin;
  8558. var obj = [];
  8559. var format = bin.readUshort(data, offset);
  8560. offset += 2;
  8561. if (format == 1) {
  8562. var startGlyph = bin.readUshort(data, offset);
  8563. offset += 2;
  8564. var glyphCount = bin.readUshort(data, offset);
  8565. offset += 2;
  8566. for (var i = 0; i < glyphCount; i++) {
  8567. obj.push(startGlyph + i);
  8568. obj.push(startGlyph + i);
  8569. obj.push(bin.readUshort(data, offset));
  8570. offset += 2;
  8571. }
  8572. }
  8573. if (format == 2) {
  8574. var count = bin.readUshort(data, offset);
  8575. offset += 2;
  8576. for (var i = 0; i < count; i++) {
  8577. obj.push(bin.readUshort(data, offset));
  8578. offset += 2;
  8579. obj.push(bin.readUshort(data, offset));
  8580. offset += 2;
  8581. obj.push(bin.readUshort(data, offset));
  8582. offset += 2;
  8583. }
  8584. }
  8585. return obj;
  8586. };
  8587. Typr._lctf.getInterval = function(tab, val) {
  8588. for (var i = 0; i < tab.length; i += 3) {
  8589. var start2 = tab[i], end = tab[i + 1];
  8590. tab[i + 2];
  8591. if (start2 <= val && val <= end)
  8592. return i;
  8593. }
  8594. return -1;
  8595. };
  8596. Typr._lctf.readValueRecord = function(data, offset, valFmt) {
  8597. var bin = Typr._bin;
  8598. var arr = [];
  8599. arr.push(valFmt & 1 ? bin.readShort(data, offset) : 0);
  8600. offset += valFmt & 1 ? 2 : 0;
  8601. arr.push(valFmt & 2 ? bin.readShort(data, offset) : 0);
  8602. offset += valFmt & 2 ? 2 : 0;
  8603. arr.push(valFmt & 4 ? bin.readShort(data, offset) : 0);
  8604. offset += valFmt & 4 ? 2 : 0;
  8605. arr.push(valFmt & 8 ? bin.readShort(data, offset) : 0);
  8606. offset += valFmt & 8 ? 2 : 0;
  8607. return arr;
  8608. };
  8609. Typr._lctf.readCoverage = function(data, offset) {
  8610. var bin = Typr._bin;
  8611. var cvg = {};
  8612. cvg.fmt = bin.readUshort(data, offset);
  8613. offset += 2;
  8614. var count = bin.readUshort(data, offset);
  8615. offset += 2;
  8616. if (cvg.fmt == 1)
  8617. cvg.tab = bin.readUshorts(data, offset, count);
  8618. if (cvg.fmt == 2)
  8619. cvg.tab = bin.readUshorts(data, offset, count * 3);
  8620. return cvg;
  8621. };
  8622. Typr._lctf.coverageIndex = function(cvg, val) {
  8623. var tab = cvg.tab;
  8624. if (cvg.fmt == 1)
  8625. return tab.indexOf(val);
  8626. if (cvg.fmt == 2) {
  8627. var ind = Typr._lctf.getInterval(tab, val);
  8628. if (ind != -1)
  8629. return tab[ind + 2] + (val - tab[ind]);
  8630. }
  8631. return -1;
  8632. };
  8633. Typr._lctf.readFeatureList = function(data, offset) {
  8634. var bin = Typr._bin;
  8635. var offset0 = offset;
  8636. var obj = [];
  8637. var count = bin.readUshort(data, offset);
  8638. offset += 2;
  8639. for (var i = 0; i < count; i++) {
  8640. var tag = bin.readASCII(data, offset, 4);
  8641. offset += 4;
  8642. var noff = bin.readUshort(data, offset);
  8643. offset += 2;
  8644. obj.push({ tag: tag.trim(), tab: Typr._lctf.readFeatureTable(data, offset0 + noff) });
  8645. }
  8646. return obj;
  8647. };
  8648. Typr._lctf.readFeatureTable = function(data, offset) {
  8649. var bin = Typr._bin;
  8650. bin.readUshort(data, offset);
  8651. offset += 2;
  8652. var lookupCount = bin.readUshort(data, offset);
  8653. offset += 2;
  8654. var indices = [];
  8655. for (var i = 0; i < lookupCount; i++)
  8656. indices.push(bin.readUshort(data, offset + 2 * i));
  8657. return indices;
  8658. };
  8659. Typr._lctf.readScriptList = function(data, offset) {
  8660. var bin = Typr._bin;
  8661. var offset0 = offset;
  8662. var obj = {};
  8663. var count = bin.readUshort(data, offset);
  8664. offset += 2;
  8665. for (var i = 0; i < count; i++) {
  8666. var tag = bin.readASCII(data, offset, 4);
  8667. offset += 4;
  8668. var noff = bin.readUshort(data, offset);
  8669. offset += 2;
  8670. obj[tag.trim()] = Typr._lctf.readScriptTable(data, offset0 + noff);
  8671. }
  8672. return obj;
  8673. };
  8674. Typr._lctf.readScriptTable = function(data, offset) {
  8675. var bin = Typr._bin;
  8676. var offset0 = offset;
  8677. var obj = {};
  8678. var defLangSysOff = bin.readUshort(data, offset);
  8679. offset += 2;
  8680. obj.default = Typr._lctf.readLangSysTable(data, offset0 + defLangSysOff);
  8681. var langSysCount = bin.readUshort(data, offset);
  8682. offset += 2;
  8683. for (var i = 0; i < langSysCount; i++) {
  8684. var tag = bin.readASCII(data, offset, 4);
  8685. offset += 4;
  8686. var langSysOff = bin.readUshort(data, offset);
  8687. offset += 2;
  8688. obj[tag.trim()] = Typr._lctf.readLangSysTable(data, offset0 + langSysOff);
  8689. }
  8690. return obj;
  8691. };
  8692. Typr._lctf.readLangSysTable = function(data, offset) {
  8693. var bin = Typr._bin;
  8694. var obj = {};
  8695. bin.readUshort(data, offset);
  8696. offset += 2;
  8697. obj.reqFeature = bin.readUshort(data, offset);
  8698. offset += 2;
  8699. var featureCount = bin.readUshort(data, offset);
  8700. offset += 2;
  8701. obj.features = bin.readUshorts(data, offset, featureCount);
  8702. return obj;
  8703. };
  8704. Typr.CFF = {};
  8705. Typr.CFF.parse = function(data, offset, length) {
  8706. var bin = Typr._bin;
  8707. data = new Uint8Array(data.buffer, offset, length);
  8708. offset = 0;
  8709. data[offset];
  8710. offset++;
  8711. data[offset];
  8712. offset++;
  8713. data[offset];
  8714. offset++;
  8715. data[offset];
  8716. offset++;
  8717. var ninds = [];
  8718. offset = Typr.CFF.readIndex(data, offset, ninds);
  8719. var names = [];
  8720. for (var i = 0; i < ninds.length - 1; i++)
  8721. names.push(bin.readASCII(data, offset + ninds[i], ninds[i + 1] - ninds[i]));
  8722. offset += ninds[ninds.length - 1];
  8723. var tdinds = [];
  8724. offset = Typr.CFF.readIndex(data, offset, tdinds);
  8725. var topDicts = [];
  8726. for (var i = 0; i < tdinds.length - 1; i++)
  8727. topDicts.push(Typr.CFF.readDict(data, offset + tdinds[i], offset + tdinds[i + 1]));
  8728. offset += tdinds[tdinds.length - 1];
  8729. var topdict = topDicts[0];
  8730. var sinds = [];
  8731. offset = Typr.CFF.readIndex(data, offset, sinds);
  8732. var strings = [];
  8733. for (var i = 0; i < sinds.length - 1; i++)
  8734. strings.push(bin.readASCII(data, offset + sinds[i], sinds[i + 1] - sinds[i]));
  8735. offset += sinds[sinds.length - 1];
  8736. Typr.CFF.readSubrs(data, offset, topdict);
  8737. if (topdict.CharStrings) {
  8738. offset = topdict.CharStrings;
  8739. var sinds = [];
  8740. offset = Typr.CFF.readIndex(data, offset, sinds);
  8741. var cstr = [];
  8742. for (var i = 0; i < sinds.length - 1; i++)
  8743. cstr.push(bin.readBytes(data, offset + sinds[i], sinds[i + 1] - sinds[i]));
  8744. topdict.CharStrings = cstr;
  8745. }
  8746. if (topdict.Encoding)
  8747. topdict.Encoding = Typr.CFF.readEncoding(data, topdict.Encoding, topdict.CharStrings.length);
  8748. if (topdict.charset)
  8749. topdict.charset = Typr.CFF.readCharset(data, topdict.charset, topdict.CharStrings.length);
  8750. if (topdict.Private) {
  8751. offset = topdict.Private[1];
  8752. topdict.Private = Typr.CFF.readDict(data, offset, offset + topdict.Private[0]);
  8753. if (topdict.Private.Subrs)
  8754. Typr.CFF.readSubrs(data, offset + topdict.Private.Subrs, topdict.Private);
  8755. }
  8756. var obj = {};
  8757. for (var p in topdict) {
  8758. if (["FamilyName", "FullName", "Notice", "version", "Copyright"].indexOf(p) != -1)
  8759. obj[p] = strings[topdict[p] - 426 + 35];
  8760. else
  8761. obj[p] = topdict[p];
  8762. }
  8763. return obj;
  8764. };
  8765. Typr.CFF.readSubrs = function(data, offset, obj) {
  8766. var bin = Typr._bin;
  8767. var gsubinds = [];
  8768. offset = Typr.CFF.readIndex(data, offset, gsubinds);
  8769. var bias, nSubrs = gsubinds.length;
  8770. if (nSubrs < 1240)
  8771. bias = 107;
  8772. else if (nSubrs < 33900)
  8773. bias = 1131;
  8774. else
  8775. bias = 32768;
  8776. obj.Bias = bias;
  8777. obj.Subrs = [];
  8778. for (var i = 0; i < gsubinds.length - 1; i++)
  8779. obj.Subrs.push(bin.readBytes(data, offset + gsubinds[i], gsubinds[i + 1] - gsubinds[i]));
  8780. };
  8781. Typr.CFF.tableSE = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 0, 111, 112, 113, 114, 0, 115, 116, 117, 118, 119, 120, 121, 122, 0, 123, 0, 124, 125, 126, 127, 128, 129, 130, 131, 0, 132, 133, 0, 134, 135, 136, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 0, 139, 0, 0, 0, 0, 140, 141, 142, 143, 0, 0, 0, 0, 0, 144, 0, 0, 0, 145, 0, 0, 146, 147, 148, 149, 0, 0, 0, 0];
  8782. Typr.CFF.glyphByUnicode = function(cff, code) {
  8783. for (var i = 0; i < cff.charset.length; i++)
  8784. if (cff.charset[i] == code)
  8785. return i;
  8786. return -1;
  8787. };
  8788. Typr.CFF.glyphBySE = function(cff, charcode) {
  8789. if (charcode < 0 || charcode > 255)
  8790. return -1;
  8791. return Typr.CFF.glyphByUnicode(cff, Typr.CFF.tableSE[charcode]);
  8792. };
  8793. Typr.CFF.readEncoding = function(data, offset, num) {
  8794. Typr._bin;
  8795. var array = [".notdef"];
  8796. var format = data[offset];
  8797. offset++;
  8798. if (format == 0) {
  8799. var nCodes = data[offset];
  8800. offset++;
  8801. for (var i = 0; i < nCodes; i++)
  8802. array.push(data[offset + i]);
  8803. } else
  8804. throw "error: unknown encoding format: " + format;
  8805. return array;
  8806. };
  8807. Typr.CFF.readCharset = function(data, offset, num) {
  8808. var bin = Typr._bin;
  8809. var charset = [".notdef"];
  8810. var format = data[offset];
  8811. offset++;
  8812. if (format == 0) {
  8813. for (var i = 0; i < num; i++) {
  8814. var first = bin.readUshort(data, offset);
  8815. offset += 2;
  8816. charset.push(first);
  8817. }
  8818. } else if (format == 1 || format == 2) {
  8819. while (charset.length < num) {
  8820. var first = bin.readUshort(data, offset);
  8821. offset += 2;
  8822. var nLeft = 0;
  8823. if (format == 1) {
  8824. nLeft = data[offset];
  8825. offset++;
  8826. } else {
  8827. nLeft = bin.readUshort(data, offset);
  8828. offset += 2;
  8829. }
  8830. for (var i = 0; i <= nLeft; i++) {
  8831. charset.push(first);
  8832. first++;
  8833. }
  8834. }
  8835. } else
  8836. throw "error: format: " + format;
  8837. return charset;
  8838. };
  8839. Typr.CFF.readIndex = function(data, offset, inds) {
  8840. var bin = Typr._bin;
  8841. var count = bin.readUshort(data, offset);
  8842. offset += 2;
  8843. var offsize = data[offset];
  8844. offset++;
  8845. if (offsize == 1)
  8846. for (var i = 0; i < count + 1; i++)
  8847. inds.push(data[offset + i]);
  8848. else if (offsize == 2)
  8849. for (var i = 0; i < count + 1; i++)
  8850. inds.push(bin.readUshort(data, offset + i * 2));
  8851. else if (offsize == 3)
  8852. for (var i = 0; i < count + 1; i++)
  8853. inds.push(bin.readUint(data, offset + i * 3 - 1) & 16777215);
  8854. else if (count != 0)
  8855. throw "unsupported offset size: " + offsize + ", count: " + count;
  8856. offset += (count + 1) * offsize;
  8857. return offset - 1;
  8858. };
  8859. Typr.CFF.getCharString = function(data, offset, o) {
  8860. var bin = Typr._bin;
  8861. var b0 = data[offset], b1 = data[offset + 1];
  8862. data[offset + 2];
  8863. data[offset + 3];
  8864. data[offset + 4];
  8865. var vs = 1;
  8866. var op = null, val = null;
  8867. if (b0 <= 20) {
  8868. op = b0;
  8869. vs = 1;
  8870. }
  8871. if (b0 == 12) {
  8872. op = b0 * 100 + b1;
  8873. vs = 2;
  8874. }
  8875. if (21 <= b0 && b0 <= 27) {
  8876. op = b0;
  8877. vs = 1;
  8878. }
  8879. if (b0 == 28) {
  8880. val = bin.readShort(data, offset + 1);
  8881. vs = 3;
  8882. }
  8883. if (29 <= b0 && b0 <= 31) {
  8884. op = b0;
  8885. vs = 1;
  8886. }
  8887. if (32 <= b0 && b0 <= 246) {
  8888. val = b0 - 139;
  8889. vs = 1;
  8890. }
  8891. if (247 <= b0 && b0 <= 250) {
  8892. val = (b0 - 247) * 256 + b1 + 108;
  8893. vs = 2;
  8894. }
  8895. if (251 <= b0 && b0 <= 254) {
  8896. val = -(b0 - 251) * 256 - b1 - 108;
  8897. vs = 2;
  8898. }
  8899. if (b0 == 255) {
  8900. val = bin.readInt(data, offset + 1) / 65535;
  8901. vs = 5;
  8902. }
  8903. o.val = val != null ? val : "o" + op;
  8904. o.size = vs;
  8905. };
  8906. Typr.CFF.readCharString = function(data, offset, length) {
  8907. var end = offset + length;
  8908. var bin = Typr._bin;
  8909. var arr = [];
  8910. while (offset < end) {
  8911. var b0 = data[offset], b1 = data[offset + 1];
  8912. data[offset + 2];
  8913. data[offset + 3];
  8914. data[offset + 4];
  8915. var vs = 1;
  8916. var op = null, val = null;
  8917. if (b0 <= 20) {
  8918. op = b0;
  8919. vs = 1;
  8920. }
  8921. if (b0 == 12) {
  8922. op = b0 * 100 + b1;
  8923. vs = 2;
  8924. }
  8925. if (b0 == 19 || b0 == 20) {
  8926. op = b0;
  8927. vs = 2;
  8928. }
  8929. if (21 <= b0 && b0 <= 27) {
  8930. op = b0;
  8931. vs = 1;
  8932. }
  8933. if (b0 == 28) {
  8934. val = bin.readShort(data, offset + 1);
  8935. vs = 3;
  8936. }
  8937. if (29 <= b0 && b0 <= 31) {
  8938. op = b0;
  8939. vs = 1;
  8940. }
  8941. if (32 <= b0 && b0 <= 246) {
  8942. val = b0 - 139;
  8943. vs = 1;
  8944. }
  8945. if (247 <= b0 && b0 <= 250) {
  8946. val = (b0 - 247) * 256 + b1 + 108;
  8947. vs = 2;
  8948. }
  8949. if (251 <= b0 && b0 <= 254) {
  8950. val = -(b0 - 251) * 256 - b1 - 108;
  8951. vs = 2;
  8952. }
  8953. if (b0 == 255) {
  8954. val = bin.readInt(data, offset + 1) / 65535;
  8955. vs = 5;
  8956. }
  8957. arr.push(val != null ? val : "o" + op);
  8958. offset += vs;
  8959. }
  8960. return arr;
  8961. };
  8962. Typr.CFF.readDict = function(data, offset, end) {
  8963. var bin = Typr._bin;
  8964. var dict = {};
  8965. var carr = [];
  8966. while (offset < end) {
  8967. var b0 = data[offset], b1 = data[offset + 1];
  8968. data[offset + 2];
  8969. data[offset + 3];
  8970. data[offset + 4];
  8971. var vs = 1;
  8972. var key = null, val = null;
  8973. if (b0 == 28) {
  8974. val = bin.readShort(data, offset + 1);
  8975. vs = 3;
  8976. }
  8977. if (b0 == 29) {
  8978. val = bin.readInt(data, offset + 1);
  8979. vs = 5;
  8980. }
  8981. if (32 <= b0 && b0 <= 246) {
  8982. val = b0 - 139;
  8983. vs = 1;
  8984. }
  8985. if (247 <= b0 && b0 <= 250) {
  8986. val = (b0 - 247) * 256 + b1 + 108;
  8987. vs = 2;
  8988. }
  8989. if (251 <= b0 && b0 <= 254) {
  8990. val = -(b0 - 251) * 256 - b1 - 108;
  8991. vs = 2;
  8992. }
  8993. if (b0 == 255) {
  8994. val = bin.readInt(data, offset + 1) / 65535;
  8995. vs = 5;
  8996. throw "unknown number";
  8997. }
  8998. if (b0 == 30) {
  8999. var nibs = [];
  9000. vs = 1;
  9001. while (true) {
  9002. var b = data[offset + vs];
  9003. vs++;
  9004. var nib0 = b >> 4, nib1 = b & 15;
  9005. if (nib0 != 15)
  9006. nibs.push(nib0);
  9007. if (nib1 != 15)
  9008. nibs.push(nib1);
  9009. if (nib1 == 15)
  9010. break;
  9011. }
  9012. var s = "";
  9013. var chars = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ".", "e", "e-", "reserved", "-", "endOfNumber"];
  9014. for (var i = 0; i < nibs.length; i++)
  9015. s += chars[nibs[i]];
  9016. val = parseFloat(s);
  9017. }
  9018. if (b0 <= 21) {
  9019. var keys = ["version", "Notice", "FullName", "FamilyName", "Weight", "FontBBox", "BlueValues", "OtherBlues", "FamilyBlues", "FamilyOtherBlues", "StdHW", "StdVW", "escape", "UniqueID", "XUID", "charset", "Encoding", "CharStrings", "Private", "Subrs", "defaultWidthX", "nominalWidthX"];
  9020. key = keys[b0];
  9021. vs = 1;
  9022. if (b0 == 12) {
  9023. var keys = ["Copyright", "isFixedPitch", "ItalicAngle", "UnderlinePosition", "UnderlineThickness", "PaintType", "CharstringType", "FontMatrix", "StrokeWidth", "BlueScale", "BlueShift", "BlueFuzz", "StemSnapH", "StemSnapV", "ForceBold", 0, 0, "LanguageGroup", "ExpansionFactor", "initialRandomSeed", "SyntheticBase", "PostScript", "BaseFontName", "BaseFontBlend", 0, 0, 0, 0, 0, 0, "ROS", "CIDFontVersion", "CIDFontRevision", "CIDFontType", "CIDCount", "UIDBase", "FDArray", "FDSelect", "FontName"];
  9024. key = keys[b1];
  9025. vs = 2;
  9026. }
  9027. }
  9028. if (key != null) {
  9029. dict[key] = carr.length == 1 ? carr[0] : carr;
  9030. carr = [];
  9031. } else
  9032. carr.push(val);
  9033. offset += vs;
  9034. }
  9035. return dict;
  9036. };
  9037. Typr.cmap = {};
  9038. Typr.cmap.parse = function(data, offset, length) {
  9039. data = new Uint8Array(data.buffer, offset, length);
  9040. offset = 0;
  9041. var bin = Typr._bin;
  9042. var obj = {};
  9043. bin.readUshort(data, offset);
  9044. offset += 2;
  9045. var numTables = bin.readUshort(data, offset);
  9046. offset += 2;
  9047. var offs = [];
  9048. obj.tables = [];
  9049. for (var i = 0; i < numTables; i++) {
  9050. var platformID = bin.readUshort(data, offset);
  9051. offset += 2;
  9052. var encodingID = bin.readUshort(data, offset);
  9053. offset += 2;
  9054. var noffset = bin.readUint(data, offset);
  9055. offset += 4;
  9056. var id = "p" + platformID + "e" + encodingID;
  9057. var tind = offs.indexOf(noffset);
  9058. if (tind == -1) {
  9059. tind = obj.tables.length;
  9060. var subt;
  9061. offs.push(noffset);
  9062. var format = bin.readUshort(data, noffset);
  9063. if (format == 0)
  9064. subt = Typr.cmap.parse0(data, noffset);
  9065. else if (format == 4)
  9066. subt = Typr.cmap.parse4(data, noffset);
  9067. else if (format == 6)
  9068. subt = Typr.cmap.parse6(data, noffset);
  9069. else if (format == 12)
  9070. subt = Typr.cmap.parse12(data, noffset);
  9071. else
  9072. console.log("unknown format: " + format, platformID, encodingID, noffset);
  9073. obj.tables.push(subt);
  9074. }
  9075. if (obj[id] != null)
  9076. throw "multiple tables for one platform+encoding";
  9077. obj[id] = tind;
  9078. }
  9079. return obj;
  9080. };
  9081. Typr.cmap.parse0 = function(data, offset) {
  9082. var bin = Typr._bin;
  9083. var obj = {};
  9084. obj.format = bin.readUshort(data, offset);
  9085. offset += 2;
  9086. var len = bin.readUshort(data, offset);
  9087. offset += 2;
  9088. bin.readUshort(data, offset);
  9089. offset += 2;
  9090. obj.map = [];
  9091. for (var i = 0; i < len - 6; i++)
  9092. obj.map.push(data[offset + i]);
  9093. return obj;
  9094. };
  9095. Typr.cmap.parse4 = function(data, offset) {
  9096. var bin = Typr._bin;
  9097. var offset0 = offset;
  9098. var obj = {};
  9099. obj.format = bin.readUshort(data, offset);
  9100. offset += 2;
  9101. var length = bin.readUshort(data, offset);
  9102. offset += 2;
  9103. bin.readUshort(data, offset);
  9104. offset += 2;
  9105. var segCountX2 = bin.readUshort(data, offset);
  9106. offset += 2;
  9107. var segCount = segCountX2 / 2;
  9108. obj.searchRange = bin.readUshort(data, offset);
  9109. offset += 2;
  9110. obj.entrySelector = bin.readUshort(data, offset);
  9111. offset += 2;
  9112. obj.rangeShift = bin.readUshort(data, offset);
  9113. offset += 2;
  9114. obj.endCount = bin.readUshorts(data, offset, segCount);
  9115. offset += segCount * 2;
  9116. offset += 2;
  9117. obj.startCount = bin.readUshorts(data, offset, segCount);
  9118. offset += segCount * 2;
  9119. obj.idDelta = [];
  9120. for (var i = 0; i < segCount; i++) {
  9121. obj.idDelta.push(bin.readShort(data, offset));
  9122. offset += 2;
  9123. }
  9124. obj.idRangeOffset = bin.readUshorts(data, offset, segCount);
  9125. offset += segCount * 2;
  9126. obj.glyphIdArray = [];
  9127. while (offset < offset0 + length) {
  9128. obj.glyphIdArray.push(bin.readUshort(data, offset));
  9129. offset += 2;
  9130. }
  9131. return obj;
  9132. };
  9133. Typr.cmap.parse6 = function(data, offset) {
  9134. var bin = Typr._bin;
  9135. var obj = {};
  9136. obj.format = bin.readUshort(data, offset);
  9137. offset += 2;
  9138. bin.readUshort(data, offset);
  9139. offset += 2;
  9140. bin.readUshort(data, offset);
  9141. offset += 2;
  9142. obj.firstCode = bin.readUshort(data, offset);
  9143. offset += 2;
  9144. var entryCount = bin.readUshort(data, offset);
  9145. offset += 2;
  9146. obj.glyphIdArray = [];
  9147. for (var i = 0; i < entryCount; i++) {
  9148. obj.glyphIdArray.push(bin.readUshort(data, offset));
  9149. offset += 2;
  9150. }
  9151. return obj;
  9152. };
  9153. Typr.cmap.parse12 = function(data, offset) {
  9154. var bin = Typr._bin;
  9155. var obj = {};
  9156. obj.format = bin.readUshort(data, offset);
  9157. offset += 2;
  9158. offset += 2;
  9159. bin.readUint(data, offset);
  9160. offset += 4;
  9161. bin.readUint(data, offset);
  9162. offset += 4;
  9163. var nGroups = bin.readUint(data, offset);
  9164. offset += 4;
  9165. obj.groups = [];
  9166. for (var i = 0; i < nGroups; i++) {
  9167. var off = offset + i * 12;
  9168. var startCharCode = bin.readUint(data, off + 0);
  9169. var endCharCode = bin.readUint(data, off + 4);
  9170. var startGlyphID = bin.readUint(data, off + 8);
  9171. obj.groups.push([startCharCode, endCharCode, startGlyphID]);
  9172. }
  9173. return obj;
  9174. };
  9175. Typr.glyf = {};
  9176. Typr.glyf.parse = function(data, offset, length, font) {
  9177. var obj = [];
  9178. for (var g = 0; g < font.maxp.numGlyphs; g++)
  9179. obj.push(null);
  9180. return obj;
  9181. };
  9182. Typr.glyf._parseGlyf = function(font, g) {
  9183. var bin = Typr._bin;
  9184. var data = font._data;
  9185. var offset = Typr._tabOffset(data, "glyf") + font.loca[g];
  9186. if (font.loca[g] == font.loca[g + 1])
  9187. return null;
  9188. var gl = {};
  9189. gl.noc = bin.readShort(data, offset);
  9190. offset += 2;
  9191. gl.xMin = bin.readShort(data, offset);
  9192. offset += 2;
  9193. gl.yMin = bin.readShort(data, offset);
  9194. offset += 2;
  9195. gl.xMax = bin.readShort(data, offset);
  9196. offset += 2;
  9197. gl.yMax = bin.readShort(data, offset);
  9198. offset += 2;
  9199. if (gl.xMin >= gl.xMax || gl.yMin >= gl.yMax)
  9200. return null;
  9201. if (gl.noc > 0) {
  9202. gl.endPts = [];
  9203. for (var i = 0; i < gl.noc; i++) {
  9204. gl.endPts.push(bin.readUshort(data, offset));
  9205. offset += 2;
  9206. }
  9207. var instructionLength = bin.readUshort(data, offset);
  9208. offset += 2;
  9209. if (data.length - offset < instructionLength)
  9210. return null;
  9211. gl.instructions = bin.readBytes(data, offset, instructionLength);
  9212. offset += instructionLength;
  9213. var crdnum = gl.endPts[gl.noc - 1] + 1;
  9214. gl.flags = [];
  9215. for (var i = 0; i < crdnum; i++) {
  9216. var flag = data[offset];
  9217. offset++;
  9218. gl.flags.push(flag);
  9219. if ((flag & 8) != 0) {
  9220. var rep = data[offset];
  9221. offset++;
  9222. for (var j = 0; j < rep; j++) {
  9223. gl.flags.push(flag);
  9224. i++;
  9225. }
  9226. }
  9227. }
  9228. gl.xs = [];
  9229. for (var i = 0; i < crdnum; i++) {
  9230. var i8 = (gl.flags[i] & 2) != 0, same = (gl.flags[i] & 16) != 0;
  9231. if (i8) {
  9232. gl.xs.push(same ? data[offset] : -data[offset]);
  9233. offset++;
  9234. } else {
  9235. if (same)
  9236. gl.xs.push(0);
  9237. else {
  9238. gl.xs.push(bin.readShort(data, offset));
  9239. offset += 2;
  9240. }
  9241. }
  9242. }
  9243. gl.ys = [];
  9244. for (var i = 0; i < crdnum; i++) {
  9245. var i8 = (gl.flags[i] & 4) != 0, same = (gl.flags[i] & 32) != 0;
  9246. if (i8) {
  9247. gl.ys.push(same ? data[offset] : -data[offset]);
  9248. offset++;
  9249. } else {
  9250. if (same)
  9251. gl.ys.push(0);
  9252. else {
  9253. gl.ys.push(bin.readShort(data, offset));
  9254. offset += 2;
  9255. }
  9256. }
  9257. }
  9258. var x = 0, y = 0;
  9259. for (var i = 0; i < crdnum; i++) {
  9260. x += gl.xs[i];
  9261. y += gl.ys[i];
  9262. gl.xs[i] = x;
  9263. gl.ys[i] = y;
  9264. }
  9265. } else {
  9266. var ARG_1_AND_2_ARE_WORDS = 1 << 0;
  9267. var ARGS_ARE_XY_VALUES = 1 << 1;
  9268. var WE_HAVE_A_SCALE = 1 << 3;
  9269. var MORE_COMPONENTS = 1 << 5;
  9270. var WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6;
  9271. var WE_HAVE_A_TWO_BY_TWO = 1 << 7;
  9272. var WE_HAVE_INSTRUCTIONS = 1 << 8;
  9273. gl.parts = [];
  9274. var flags;
  9275. do {
  9276. flags = bin.readUshort(data, offset);
  9277. offset += 2;
  9278. var part = { m: { a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 }, p1: -1, p2: -1 };
  9279. gl.parts.push(part);
  9280. part.glyphIndex = bin.readUshort(data, offset);
  9281. offset += 2;
  9282. if (flags & ARG_1_AND_2_ARE_WORDS) {
  9283. var arg1 = bin.readShort(data, offset);
  9284. offset += 2;
  9285. var arg2 = bin.readShort(data, offset);
  9286. offset += 2;
  9287. } else {
  9288. var arg1 = bin.readInt8(data, offset);
  9289. offset++;
  9290. var arg2 = bin.readInt8(data, offset);
  9291. offset++;
  9292. }
  9293. if (flags & ARGS_ARE_XY_VALUES) {
  9294. part.m.tx = arg1;
  9295. part.m.ty = arg2;
  9296. } else {
  9297. part.p1 = arg1;
  9298. part.p2 = arg2;
  9299. }
  9300. if (flags & WE_HAVE_A_SCALE) {
  9301. part.m.a = part.m.d = bin.readF2dot14(data, offset);
  9302. offset += 2;
  9303. } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {
  9304. part.m.a = bin.readF2dot14(data, offset);
  9305. offset += 2;
  9306. part.m.d = bin.readF2dot14(data, offset);
  9307. offset += 2;
  9308. } else if (flags & WE_HAVE_A_TWO_BY_TWO) {
  9309. part.m.a = bin.readF2dot14(data, offset);
  9310. offset += 2;
  9311. part.m.b = bin.readF2dot14(data, offset);
  9312. offset += 2;
  9313. part.m.c = bin.readF2dot14(data, offset);
  9314. offset += 2;
  9315. part.m.d = bin.readF2dot14(data, offset);
  9316. offset += 2;
  9317. }
  9318. } while (flags & MORE_COMPONENTS);
  9319. if (flags & WE_HAVE_INSTRUCTIONS) {
  9320. var numInstr = bin.readUshort(data, offset);
  9321. offset += 2;
  9322. gl.instr = [];
  9323. for (var i = 0; i < numInstr; i++) {
  9324. gl.instr.push(data[offset]);
  9325. offset++;
  9326. }
  9327. }
  9328. }
  9329. return gl;
  9330. };
  9331. Typr.GPOS = {};
  9332. Typr.GPOS.parse = function(data, offset, length, font) {
  9333. return Typr._lctf.parse(data, offset, length, font, Typr.GPOS.subt);
  9334. };
  9335. Typr.GPOS.subt = function(data, ltype, offset) {
  9336. if (ltype != 2)
  9337. return null;
  9338. var bin = Typr._bin, offset0 = offset, tab = {};
  9339. tab.format = bin.readUshort(data, offset);
  9340. offset += 2;
  9341. var covOff = bin.readUshort(data, offset);
  9342. offset += 2;
  9343. tab.coverage = Typr._lctf.readCoverage(data, covOff + offset0);
  9344. tab.valFmt1 = bin.readUshort(data, offset);
  9345. offset += 2;
  9346. tab.valFmt2 = bin.readUshort(data, offset);
  9347. offset += 2;
  9348. var ones1 = Typr._lctf.numOfOnes(tab.valFmt1);
  9349. var ones2 = Typr._lctf.numOfOnes(tab.valFmt2);
  9350. if (tab.format == 1) {
  9351. tab.pairsets = [];
  9352. var count = bin.readUshort(data, offset);
  9353. offset += 2;
  9354. for (var i = 0; i < count; i++) {
  9355. var psoff = bin.readUshort(data, offset);
  9356. offset += 2;
  9357. psoff += offset0;
  9358. var pvcount = bin.readUshort(data, psoff);
  9359. psoff += 2;
  9360. var arr = [];
  9361. for (var j = 0; j < pvcount; j++) {
  9362. var gid2 = bin.readUshort(data, psoff);
  9363. psoff += 2;
  9364. var value1, value2;
  9365. if (tab.valFmt1 != 0) {
  9366. value1 = Typr._lctf.readValueRecord(data, psoff, tab.valFmt1);
  9367. psoff += ones1 * 2;
  9368. }
  9369. if (tab.valFmt2 != 0) {
  9370. value2 = Typr._lctf.readValueRecord(data, psoff, tab.valFmt2);
  9371. psoff += ones2 * 2;
  9372. }
  9373. arr.push({ gid2, val1: value1, val2: value2 });
  9374. }
  9375. tab.pairsets.push(arr);
  9376. }
  9377. }
  9378. if (tab.format == 2) {
  9379. var classDef1 = bin.readUshort(data, offset);
  9380. offset += 2;
  9381. var classDef2 = bin.readUshort(data, offset);
  9382. offset += 2;
  9383. var class1Count = bin.readUshort(data, offset);
  9384. offset += 2;
  9385. var class2Count = bin.readUshort(data, offset);
  9386. offset += 2;
  9387. tab.classDef1 = Typr._lctf.readClassDef(data, offset0 + classDef1);
  9388. tab.classDef2 = Typr._lctf.readClassDef(data, offset0 + classDef2);
  9389. tab.matrix = [];
  9390. for (var i = 0; i < class1Count; i++) {
  9391. var row = [];
  9392. for (var j = 0; j < class2Count; j++) {
  9393. var value1 = null, value2 = null;
  9394. if (tab.valFmt1 != 0) {
  9395. value1 = Typr._lctf.readValueRecord(data, offset, tab.valFmt1);
  9396. offset += ones1 * 2;
  9397. }
  9398. if (tab.valFmt2 != 0) {
  9399. value2 = Typr._lctf.readValueRecord(data, offset, tab.valFmt2);
  9400. offset += ones2 * 2;
  9401. }
  9402. row.push({ val1: value1, val2: value2 });
  9403. }
  9404. tab.matrix.push(row);
  9405. }
  9406. }
  9407. return tab;
  9408. };
  9409. Typr.GSUB = {};
  9410. Typr.GSUB.parse = function(data, offset, length, font) {
  9411. return Typr._lctf.parse(data, offset, length, font, Typr.GSUB.subt);
  9412. };
  9413. Typr.GSUB.subt = function(data, ltype, offset) {
  9414. var bin = Typr._bin, offset0 = offset, tab = {};
  9415. if (ltype != 1 && ltype != 4 && ltype != 5)
  9416. return null;
  9417. tab.fmt = bin.readUshort(data, offset);
  9418. offset += 2;
  9419. var covOff = bin.readUshort(data, offset);
  9420. offset += 2;
  9421. tab.coverage = Typr._lctf.readCoverage(data, covOff + offset0);
  9422. if (ltype == 1) {
  9423. if (tab.fmt == 1) {
  9424. tab.delta = bin.readShort(data, offset);
  9425. offset += 2;
  9426. } else if (tab.fmt == 2) {
  9427. var cnt = bin.readUshort(data, offset);
  9428. offset += 2;
  9429. tab.newg = bin.readUshorts(data, offset, cnt);
  9430. offset += tab.newg.length * 2;
  9431. }
  9432. } else if (ltype == 4) {
  9433. tab.vals = [];
  9434. var cnt = bin.readUshort(data, offset);
  9435. offset += 2;
  9436. for (var i = 0; i < cnt; i++) {
  9437. var loff = bin.readUshort(data, offset);
  9438. offset += 2;
  9439. tab.vals.push(Typr.GSUB.readLigatureSet(data, offset0 + loff));
  9440. }
  9441. } else if (ltype == 5) {
  9442. if (tab.fmt == 2) {
  9443. var cDefOffset = bin.readUshort(data, offset);
  9444. offset += 2;
  9445. tab.cDef = Typr._lctf.readClassDef(data, offset0 + cDefOffset);
  9446. tab.scset = [];
  9447. var subClassSetCount = bin.readUshort(data, offset);
  9448. offset += 2;
  9449. for (var i = 0; i < subClassSetCount; i++) {
  9450. var scsOff = bin.readUshort(data, offset);
  9451. offset += 2;
  9452. tab.scset.push(scsOff == 0 ? null : Typr.GSUB.readSubClassSet(data, offset0 + scsOff));
  9453. }
  9454. } else
  9455. console.log("unknown table format", tab.fmt);
  9456. }
  9457. return tab;
  9458. };
  9459. Typr.GSUB.readSubClassSet = function(data, offset) {
  9460. var rUs = Typr._bin.readUshort, offset0 = offset, lset = [];
  9461. var cnt = rUs(data, offset);
  9462. offset += 2;
  9463. for (var i = 0; i < cnt; i++) {
  9464. var loff = rUs(data, offset);
  9465. offset += 2;
  9466. lset.push(Typr.GSUB.readSubClassRule(data, offset0 + loff));
  9467. }
  9468. return lset;
  9469. };
  9470. Typr.GSUB.readSubClassRule = function(data, offset) {
  9471. var rUs = Typr._bin.readUshort, rule = {};
  9472. var gcount = rUs(data, offset);
  9473. offset += 2;
  9474. var scount = rUs(data, offset);
  9475. offset += 2;
  9476. rule.input = [];
  9477. for (var i = 0; i < gcount - 1; i++) {
  9478. rule.input.push(rUs(data, offset));
  9479. offset += 2;
  9480. }
  9481. rule.substLookupRecords = Typr.GSUB.readSubstLookupRecords(data, offset, scount);
  9482. return rule;
  9483. };
  9484. Typr.GSUB.readSubstLookupRecords = function(data, offset, cnt) {
  9485. var rUs = Typr._bin.readUshort;
  9486. var out = [];
  9487. for (var i = 0; i < cnt; i++) {
  9488. out.push(rUs(data, offset), rUs(data, offset + 2));
  9489. offset += 4;
  9490. }
  9491. return out;
  9492. };
  9493. Typr.GSUB.readChainSubClassSet = function(data, offset) {
  9494. var bin = Typr._bin, offset0 = offset, lset = [];
  9495. var cnt = bin.readUshort(data, offset);
  9496. offset += 2;
  9497. for (var i = 0; i < cnt; i++) {
  9498. var loff = bin.readUshort(data, offset);
  9499. offset += 2;
  9500. lset.push(Typr.GSUB.readChainSubClassRule(data, offset0 + loff));
  9501. }
  9502. return lset;
  9503. };
  9504. Typr.GSUB.readChainSubClassRule = function(data, offset) {
  9505. var bin = Typr._bin, rule = {};
  9506. var pps = ["backtrack", "input", "lookahead"];
  9507. for (var pi = 0; pi < pps.length; pi++) {
  9508. var cnt = bin.readUshort(data, offset);
  9509. offset += 2;
  9510. if (pi == 1)
  9511. cnt--;
  9512. rule[pps[pi]] = bin.readUshorts(data, offset, cnt);
  9513. offset += rule[pps[pi]].length * 2;
  9514. }
  9515. var cnt = bin.readUshort(data, offset);
  9516. offset += 2;
  9517. rule.subst = bin.readUshorts(data, offset, cnt * 2);
  9518. offset += rule.subst.length * 2;
  9519. return rule;
  9520. };
  9521. Typr.GSUB.readLigatureSet = function(data, offset) {
  9522. var bin = Typr._bin, offset0 = offset, lset = [];
  9523. var lcnt = bin.readUshort(data, offset);
  9524. offset += 2;
  9525. for (var j = 0; j < lcnt; j++) {
  9526. var loff = bin.readUshort(data, offset);
  9527. offset += 2;
  9528. lset.push(Typr.GSUB.readLigature(data, offset0 + loff));
  9529. }
  9530. return lset;
  9531. };
  9532. Typr.GSUB.readLigature = function(data, offset) {
  9533. var bin = Typr._bin, lig = { chain: [] };
  9534. lig.nglyph = bin.readUshort(data, offset);
  9535. offset += 2;
  9536. var ccnt = bin.readUshort(data, offset);
  9537. offset += 2;
  9538. for (var k = 0; k < ccnt - 1; k++) {
  9539. lig.chain.push(bin.readUshort(data, offset));
  9540. offset += 2;
  9541. }
  9542. return lig;
  9543. };
  9544. Typr.head = {};
  9545. Typr.head.parse = function(data, offset, length) {
  9546. var bin = Typr._bin;
  9547. var obj = {};
  9548. bin.readFixed(data, offset);
  9549. offset += 4;
  9550. obj.fontRevision = bin.readFixed(data, offset);
  9551. offset += 4;
  9552. bin.readUint(data, offset);
  9553. offset += 4;
  9554. bin.readUint(data, offset);
  9555. offset += 4;
  9556. obj.flags = bin.readUshort(data, offset);
  9557. offset += 2;
  9558. obj.unitsPerEm = bin.readUshort(data, offset);
  9559. offset += 2;
  9560. obj.created = bin.readUint64(data, offset);
  9561. offset += 8;
  9562. obj.modified = bin.readUint64(data, offset);
  9563. offset += 8;
  9564. obj.xMin = bin.readShort(data, offset);
  9565. offset += 2;
  9566. obj.yMin = bin.readShort(data, offset);
  9567. offset += 2;
  9568. obj.xMax = bin.readShort(data, offset);
  9569. offset += 2;
  9570. obj.yMax = bin.readShort(data, offset);
  9571. offset += 2;
  9572. obj.macStyle = bin.readUshort(data, offset);
  9573. offset += 2;
  9574. obj.lowestRecPPEM = bin.readUshort(data, offset);
  9575. offset += 2;
  9576. obj.fontDirectionHint = bin.readShort(data, offset);
  9577. offset += 2;
  9578. obj.indexToLocFormat = bin.readShort(data, offset);
  9579. offset += 2;
  9580. obj.glyphDataFormat = bin.readShort(data, offset);
  9581. offset += 2;
  9582. return obj;
  9583. };
  9584. Typr.hhea = {};
  9585. Typr.hhea.parse = function(data, offset, length) {
  9586. var bin = Typr._bin;
  9587. var obj = {};
  9588. bin.readFixed(data, offset);
  9589. offset += 4;
  9590. obj.ascender = bin.readShort(data, offset);
  9591. offset += 2;
  9592. obj.descender = bin.readShort(data, offset);
  9593. offset += 2;
  9594. obj.lineGap = bin.readShort(data, offset);
  9595. offset += 2;
  9596. obj.advanceWidthMax = bin.readUshort(data, offset);
  9597. offset += 2;
  9598. obj.minLeftSideBearing = bin.readShort(data, offset);
  9599. offset += 2;
  9600. obj.minRightSideBearing = bin.readShort(data, offset);
  9601. offset += 2;
  9602. obj.xMaxExtent = bin.readShort(data, offset);
  9603. offset += 2;
  9604. obj.caretSlopeRise = bin.readShort(data, offset);
  9605. offset += 2;
  9606. obj.caretSlopeRun = bin.readShort(data, offset);
  9607. offset += 2;
  9608. obj.caretOffset = bin.readShort(data, offset);
  9609. offset += 2;
  9610. offset += 4 * 2;
  9611. obj.metricDataFormat = bin.readShort(data, offset);
  9612. offset += 2;
  9613. obj.numberOfHMetrics = bin.readUshort(data, offset);
  9614. offset += 2;
  9615. return obj;
  9616. };
  9617. Typr.hmtx = {};
  9618. Typr.hmtx.parse = function(data, offset, length, font) {
  9619. var bin = Typr._bin;
  9620. var obj = {};
  9621. obj.aWidth = [];
  9622. obj.lsBearing = [];
  9623. var aw = 0, lsb = 0;
  9624. for (var i = 0; i < font.maxp.numGlyphs; i++) {
  9625. if (i < font.hhea.numberOfHMetrics) {
  9626. aw = bin.readUshort(data, offset);
  9627. offset += 2;
  9628. lsb = bin.readShort(data, offset);
  9629. offset += 2;
  9630. }
  9631. obj.aWidth.push(aw);
  9632. obj.lsBearing.push(lsb);
  9633. }
  9634. return obj;
  9635. };
  9636. Typr.kern = {};
  9637. Typr.kern.parse = function(data, offset, length, font) {
  9638. var bin = Typr._bin;
  9639. var version = bin.readUshort(data, offset);
  9640. offset += 2;
  9641. if (version == 1)
  9642. return Typr.kern.parseV1(data, offset - 2, length, font);
  9643. var nTables = bin.readUshort(data, offset);
  9644. offset += 2;
  9645. var map = { glyph1: [], rval: [] };
  9646. for (var i = 0; i < nTables; i++) {
  9647. offset += 2;
  9648. var length = bin.readUshort(data, offset);
  9649. offset += 2;
  9650. var coverage = bin.readUshort(data, offset);
  9651. offset += 2;
  9652. var format = coverage >>> 8;
  9653. format &= 15;
  9654. if (format == 0)
  9655. offset = Typr.kern.readFormat0(data, offset, map);
  9656. else
  9657. throw "unknown kern table format: " + format;
  9658. }
  9659. return map;
  9660. };
  9661. Typr.kern.parseV1 = function(data, offset, length, font) {
  9662. var bin = Typr._bin;
  9663. bin.readFixed(data, offset);
  9664. offset += 4;
  9665. var nTables = bin.readUint(data, offset);
  9666. offset += 4;
  9667. var map = { glyph1: [], rval: [] };
  9668. for (var i = 0; i < nTables; i++) {
  9669. bin.readUint(data, offset);
  9670. offset += 4;
  9671. var coverage = bin.readUshort(data, offset);
  9672. offset += 2;
  9673. bin.readUshort(data, offset);
  9674. offset += 2;
  9675. var format = coverage >>> 8;
  9676. format &= 15;
  9677. if (format == 0)
  9678. offset = Typr.kern.readFormat0(data, offset, map);
  9679. else
  9680. throw "unknown kern table format: " + format;
  9681. }
  9682. return map;
  9683. };
  9684. Typr.kern.readFormat0 = function(data, offset, map) {
  9685. var bin = Typr._bin;
  9686. var pleft = -1;
  9687. var nPairs = bin.readUshort(data, offset);
  9688. offset += 2;
  9689. bin.readUshort(data, offset);
  9690. offset += 2;
  9691. bin.readUshort(data, offset);
  9692. offset += 2;
  9693. bin.readUshort(data, offset);
  9694. offset += 2;
  9695. for (var j = 0; j < nPairs; j++) {
  9696. var left = bin.readUshort(data, offset);
  9697. offset += 2;
  9698. var right = bin.readUshort(data, offset);
  9699. offset += 2;
  9700. var value = bin.readShort(data, offset);
  9701. offset += 2;
  9702. if (left != pleft) {
  9703. map.glyph1.push(left);
  9704. map.rval.push({ glyph2: [], vals: [] });
  9705. }
  9706. var rval = map.rval[map.rval.length - 1];
  9707. rval.glyph2.push(right);
  9708. rval.vals.push(value);
  9709. pleft = left;
  9710. }
  9711. return offset;
  9712. };
  9713. Typr.loca = {};
  9714. Typr.loca.parse = function(data, offset, length, font) {
  9715. var bin = Typr._bin;
  9716. var obj = [];
  9717. var ver = font.head.indexToLocFormat;
  9718. var len = font.maxp.numGlyphs + 1;
  9719. if (ver == 0)
  9720. for (var i = 0; i < len; i++)
  9721. obj.push(bin.readUshort(data, offset + (i << 1)) << 1);
  9722. if (ver == 1)
  9723. for (var i = 0; i < len; i++)
  9724. obj.push(bin.readUint(data, offset + (i << 2)));
  9725. return obj;
  9726. };
  9727. Typr.maxp = {};
  9728. Typr.maxp.parse = function(data, offset, length) {
  9729. var bin = Typr._bin;
  9730. var obj = {};
  9731. var ver = bin.readUint(data, offset);
  9732. offset += 4;
  9733. obj.numGlyphs = bin.readUshort(data, offset);
  9734. offset += 2;
  9735. if (ver == 65536) {
  9736. obj.maxPoints = bin.readUshort(data, offset);
  9737. offset += 2;
  9738. obj.maxContours = bin.readUshort(data, offset);
  9739. offset += 2;
  9740. obj.maxCompositePoints = bin.readUshort(data, offset);
  9741. offset += 2;
  9742. obj.maxCompositeContours = bin.readUshort(data, offset);
  9743. offset += 2;
  9744. obj.maxZones = bin.readUshort(data, offset);
  9745. offset += 2;
  9746. obj.maxTwilightPoints = bin.readUshort(data, offset);
  9747. offset += 2;
  9748. obj.maxStorage = bin.readUshort(data, offset);
  9749. offset += 2;
  9750. obj.maxFunctionDefs = bin.readUshort(data, offset);
  9751. offset += 2;
  9752. obj.maxInstructionDefs = bin.readUshort(data, offset);
  9753. offset += 2;
  9754. obj.maxStackElements = bin.readUshort(data, offset);
  9755. offset += 2;
  9756. obj.maxSizeOfInstructions = bin.readUshort(data, offset);
  9757. offset += 2;
  9758. obj.maxComponentElements = bin.readUshort(data, offset);
  9759. offset += 2;
  9760. obj.maxComponentDepth = bin.readUshort(data, offset);
  9761. offset += 2;
  9762. }
  9763. return obj;
  9764. };
  9765. Typr.name = {};
  9766. Typr.name.parse = function(data, offset, length) {
  9767. var bin = Typr._bin;
  9768. var obj = {};
  9769. bin.readUshort(data, offset);
  9770. offset += 2;
  9771. var count = bin.readUshort(data, offset);
  9772. offset += 2;
  9773. bin.readUshort(data, offset);
  9774. offset += 2;
  9775. var offset0 = offset;
  9776. for (var i = 0; i < count; i++) {
  9777. var platformID = bin.readUshort(data, offset);
  9778. offset += 2;
  9779. var encodingID = bin.readUshort(data, offset);
  9780. offset += 2;
  9781. var languageID = bin.readUshort(data, offset);
  9782. offset += 2;
  9783. var nameID = bin.readUshort(data, offset);
  9784. offset += 2;
  9785. var length = bin.readUshort(data, offset);
  9786. offset += 2;
  9787. var noffset = bin.readUshort(data, offset);
  9788. offset += 2;
  9789. var plat = "p" + platformID;
  9790. if (obj[plat] == null)
  9791. obj[plat] = {};
  9792. var names = ["copyright", "fontFamily", "fontSubfamily", "ID", "fullName", "version", "postScriptName", "trademark", "manufacturer", "designer", "description", "urlVendor", "urlDesigner", "licence", "licenceURL", "---", "typoFamilyName", "typoSubfamilyName", "compatibleFull", "sampleText", "postScriptCID", "wwsFamilyName", "wwsSubfamilyName", "lightPalette", "darkPalette"];
  9793. var cname = names[nameID];
  9794. var soff = offset0 + count * 12 + noffset;
  9795. var str;
  9796. if (platformID == 0)
  9797. str = bin.readUnicode(data, soff, length / 2);
  9798. else if (platformID == 3 && encodingID == 0)
  9799. str = bin.readUnicode(data, soff, length / 2);
  9800. else if (encodingID == 0)
  9801. str = bin.readASCII(data, soff, length);
  9802. else if (encodingID == 1)
  9803. str = bin.readUnicode(data, soff, length / 2);
  9804. else if (encodingID == 3)
  9805. str = bin.readUnicode(data, soff, length / 2);
  9806. else if (platformID == 1) {
  9807. str = bin.readASCII(data, soff, length);
  9808. console.log("reading unknown MAC encoding " + encodingID + " as ASCII");
  9809. } else
  9810. throw "unknown encoding " + encodingID + ", platformID: " + platformID;
  9811. obj[plat][cname] = str;
  9812. obj[plat]._lang = languageID;
  9813. }
  9814. for (var p in obj)
  9815. if (obj[p].postScriptName != null && obj[p]._lang == 1033)
  9816. return obj[p];
  9817. for (var p in obj)
  9818. if (obj[p].postScriptName != null && obj[p]._lang == 3084)
  9819. return obj[p];
  9820. for (var p in obj)
  9821. if (obj[p].postScriptName != null)
  9822. return obj[p];
  9823. var tname;
  9824. for (var p in obj) {
  9825. tname = p;
  9826. break;
  9827. }
  9828. console.log("returning name table with languageID " + obj[tname]._lang);
  9829. return obj[tname];
  9830. };
  9831. Typr["OS/2"] = {};
  9832. Typr["OS/2"].parse = function(data, offset, length) {
  9833. var bin = Typr._bin;
  9834. var ver = bin.readUshort(data, offset);
  9835. offset += 2;
  9836. var obj = {};
  9837. if (ver == 0)
  9838. Typr["OS/2"].version0(data, offset, obj);
  9839. else if (ver == 1)
  9840. Typr["OS/2"].version1(data, offset, obj);
  9841. else if (ver == 2 || ver == 3 || ver == 4)
  9842. Typr["OS/2"].version2(data, offset, obj);
  9843. else if (ver == 5)
  9844. Typr["OS/2"].version5(data, offset, obj);
  9845. else
  9846. throw "unknown OS/2 table version: " + ver;
  9847. return obj;
  9848. };
  9849. Typr["OS/2"].version0 = function(data, offset, obj) {
  9850. var bin = Typr._bin;
  9851. obj.xAvgCharWidth = bin.readShort(data, offset);
  9852. offset += 2;
  9853. obj.usWeightClass = bin.readUshort(data, offset);
  9854. offset += 2;
  9855. obj.usWidthClass = bin.readUshort(data, offset);
  9856. offset += 2;
  9857. obj.fsType = bin.readUshort(data, offset);
  9858. offset += 2;
  9859. obj.ySubscriptXSize = bin.readShort(data, offset);
  9860. offset += 2;
  9861. obj.ySubscriptYSize = bin.readShort(data, offset);
  9862. offset += 2;
  9863. obj.ySubscriptXOffset = bin.readShort(data, offset);
  9864. offset += 2;
  9865. obj.ySubscriptYOffset = bin.readShort(data, offset);
  9866. offset += 2;
  9867. obj.ySuperscriptXSize = bin.readShort(data, offset);
  9868. offset += 2;
  9869. obj.ySuperscriptYSize = bin.readShort(data, offset);
  9870. offset += 2;
  9871. obj.ySuperscriptXOffset = bin.readShort(data, offset);
  9872. offset += 2;
  9873. obj.ySuperscriptYOffset = bin.readShort(data, offset);
  9874. offset += 2;
  9875. obj.yStrikeoutSize = bin.readShort(data, offset);
  9876. offset += 2;
  9877. obj.yStrikeoutPosition = bin.readShort(data, offset);
  9878. offset += 2;
  9879. obj.sFamilyClass = bin.readShort(data, offset);
  9880. offset += 2;
  9881. obj.panose = bin.readBytes(data, offset, 10);
  9882. offset += 10;
  9883. obj.ulUnicodeRange1 = bin.readUint(data, offset);
  9884. offset += 4;
  9885. obj.ulUnicodeRange2 = bin.readUint(data, offset);
  9886. offset += 4;
  9887. obj.ulUnicodeRange3 = bin.readUint(data, offset);
  9888. offset += 4;
  9889. obj.ulUnicodeRange4 = bin.readUint(data, offset);
  9890. offset += 4;
  9891. obj.achVendID = [bin.readInt8(data, offset), bin.readInt8(data, offset + 1), bin.readInt8(data, offset + 2), bin.readInt8(data, offset + 3)];
  9892. offset += 4;
  9893. obj.fsSelection = bin.readUshort(data, offset);
  9894. offset += 2;
  9895. obj.usFirstCharIndex = bin.readUshort(data, offset);
  9896. offset += 2;
  9897. obj.usLastCharIndex = bin.readUshort(data, offset);
  9898. offset += 2;
  9899. obj.sTypoAscender = bin.readShort(data, offset);
  9900. offset += 2;
  9901. obj.sTypoDescender = bin.readShort(data, offset);
  9902. offset += 2;
  9903. obj.sTypoLineGap = bin.readShort(data, offset);
  9904. offset += 2;
  9905. obj.usWinAscent = bin.readUshort(data, offset);
  9906. offset += 2;
  9907. obj.usWinDescent = bin.readUshort(data, offset);
  9908. offset += 2;
  9909. return offset;
  9910. };
  9911. Typr["OS/2"].version1 = function(data, offset, obj) {
  9912. var bin = Typr._bin;
  9913. offset = Typr["OS/2"].version0(data, offset, obj);
  9914. obj.ulCodePageRange1 = bin.readUint(data, offset);
  9915. offset += 4;
  9916. obj.ulCodePageRange2 = bin.readUint(data, offset);
  9917. offset += 4;
  9918. return offset;
  9919. };
  9920. Typr["OS/2"].version2 = function(data, offset, obj) {
  9921. var bin = Typr._bin;
  9922. offset = Typr["OS/2"].version1(data, offset, obj);
  9923. obj.sxHeight = bin.readShort(data, offset);
  9924. offset += 2;
  9925. obj.sCapHeight = bin.readShort(data, offset);
  9926. offset += 2;
  9927. obj.usDefault = bin.readUshort(data, offset);
  9928. offset += 2;
  9929. obj.usBreak = bin.readUshort(data, offset);
  9930. offset += 2;
  9931. obj.usMaxContext = bin.readUshort(data, offset);
  9932. offset += 2;
  9933. return offset;
  9934. };
  9935. Typr["OS/2"].version5 = function(data, offset, obj) {
  9936. var bin = Typr._bin;
  9937. offset = Typr["OS/2"].version2(data, offset, obj);
  9938. obj.usLowerOpticalPointSize = bin.readUshort(data, offset);
  9939. offset += 2;
  9940. obj.usUpperOpticalPointSize = bin.readUshort(data, offset);
  9941. offset += 2;
  9942. return offset;
  9943. };
  9944. Typr.post = {};
  9945. Typr.post.parse = function(data, offset, length) {
  9946. var bin = Typr._bin;
  9947. var obj = {};
  9948. obj.version = bin.readFixed(data, offset);
  9949. offset += 4;
  9950. obj.italicAngle = bin.readFixed(data, offset);
  9951. offset += 4;
  9952. obj.underlinePosition = bin.readShort(data, offset);
  9953. offset += 2;
  9954. obj.underlineThickness = bin.readShort(data, offset);
  9955. offset += 2;
  9956. return obj;
  9957. };
  9958. Typr.SVG = {};
  9959. Typr.SVG.parse = function(data, offset, length) {
  9960. var bin = Typr._bin;
  9961. var obj = { entries: [] };
  9962. var offset0 = offset;
  9963. bin.readUshort(data, offset);
  9964. offset += 2;
  9965. var svgDocIndexOffset = bin.readUint(data, offset);
  9966. offset += 4;
  9967. bin.readUint(data, offset);
  9968. offset += 4;
  9969. offset = svgDocIndexOffset + offset0;
  9970. var numEntries = bin.readUshort(data, offset);
  9971. offset += 2;
  9972. for (var i = 0; i < numEntries; i++) {
  9973. var startGlyphID = bin.readUshort(data, offset);
  9974. offset += 2;
  9975. var endGlyphID = bin.readUshort(data, offset);
  9976. offset += 2;
  9977. var svgDocOffset = bin.readUint(data, offset);
  9978. offset += 4;
  9979. var svgDocLength = bin.readUint(data, offset);
  9980. offset += 4;
  9981. var sbuf = new Uint8Array(data.buffer, offset0 + svgDocOffset + svgDocIndexOffset, svgDocLength);
  9982. var svg = bin.readUTF8(sbuf, 0, sbuf.length);
  9983. for (var f = startGlyphID; f <= endGlyphID; f++) {
  9984. obj.entries[f] = svg;
  9985. }
  9986. }
  9987. return obj;
  9988. };
  9989. Typr.SVG.toPath = function(str) {
  9990. var pth = { cmds: [], crds: [] };
  9991. if (str == null)
  9992. return pth;
  9993. var prsr = new DOMParser();
  9994. var doc = prsr["parseFromString"](str, "image/svg+xml");
  9995. var svg = doc.firstChild;
  9996. while (svg.tagName != "svg")
  9997. svg = svg.nextSibling;
  9998. var vb = svg.getAttribute("viewBox");
  9999. if (vb)
  10000. vb = vb.trim().split(" ").map(parseFloat);
  10001. else
  10002. vb = [0, 0, 1e3, 1e3];
  10003. Typr.SVG._toPath(svg.children, pth);
  10004. for (var i = 0; i < pth.crds.length; i += 2) {
  10005. var x = pth.crds[i], y = pth.crds[i + 1];
  10006. x -= vb[0];
  10007. y -= vb[1];
  10008. y = -y;
  10009. pth.crds[i] = x;
  10010. pth.crds[i + 1] = y;
  10011. }
  10012. return pth;
  10013. };
  10014. Typr.SVG._toPath = function(nds, pth, fill) {
  10015. for (var ni = 0; ni < nds.length; ni++) {
  10016. var nd = nds[ni], tn = nd.tagName;
  10017. var cfl = nd.getAttribute("fill");
  10018. if (cfl == null)
  10019. cfl = fill;
  10020. if (tn == "g")
  10021. Typr.SVG._toPath(nd.children, pth, cfl);
  10022. else if (tn == "path") {
  10023. pth.cmds.push(cfl ? cfl : "#000000");
  10024. var d = nd.getAttribute("d");
  10025. var toks = Typr.SVG._tokens(d);
  10026. Typr.SVG._toksToPath(toks, pth);
  10027. pth.cmds.push("X");
  10028. } else if (tn == "defs")
  10029. ;
  10030. else
  10031. console.log(tn, nd);
  10032. }
  10033. };
  10034. Typr.SVG._tokens = function(d) {
  10035. var ts = [], off = 0, rn = false, cn = "";
  10036. while (off < d.length) {
  10037. var cc = d.charCodeAt(off), ch = d.charAt(off);
  10038. off++;
  10039. var isNum = 48 <= cc && cc <= 57 || ch == "." || ch == "-";
  10040. if (rn) {
  10041. if (ch == "-") {
  10042. ts.push(parseFloat(cn));
  10043. cn = ch;
  10044. } else if (isNum)
  10045. cn += ch;
  10046. else {
  10047. ts.push(parseFloat(cn));
  10048. if (ch != "," && ch != " ")
  10049. ts.push(ch);
  10050. rn = false;
  10051. }
  10052. } else {
  10053. if (isNum) {
  10054. cn = ch;
  10055. rn = true;
  10056. } else if (ch != "," && ch != " ")
  10057. ts.push(ch);
  10058. }
  10059. }
  10060. if (rn)
  10061. ts.push(parseFloat(cn));
  10062. return ts;
  10063. };
  10064. Typr.SVG._toksToPath = function(ts, pth) {
  10065. var i = 0, x = 0, y = 0, ox = 0, oy = 0;
  10066. var pc = { M: 2, L: 2, H: 1, V: 1, S: 4, C: 6 };
  10067. var cmds = pth.cmds, crds = pth.crds;
  10068. while (i < ts.length) {
  10069. var cmd = ts[i];
  10070. i++;
  10071. if (cmd == "z") {
  10072. cmds.push("Z");
  10073. x = ox;
  10074. y = oy;
  10075. } else {
  10076. var cmu = cmd.toUpperCase();
  10077. var ps = pc[cmu], reps = Typr.SVG._reps(ts, i, ps);
  10078. for (var j = 0; j < reps; j++) {
  10079. var xi = 0, yi = 0;
  10080. if (cmd != cmu) {
  10081. xi = x;
  10082. yi = y;
  10083. }
  10084. if (cmu == "M") {
  10085. x = xi + ts[i++];
  10086. y = yi + ts[i++];
  10087. cmds.push("M");
  10088. crds.push(x, y);
  10089. ox = x;
  10090. oy = y;
  10091. } else if (cmu == "L") {
  10092. x = xi + ts[i++];
  10093. y = yi + ts[i++];
  10094. cmds.push("L");
  10095. crds.push(x, y);
  10096. } else if (cmu == "H") {
  10097. x = xi + ts[i++];
  10098. cmds.push("L");
  10099. crds.push(x, y);
  10100. } else if (cmu == "V") {
  10101. y = yi + ts[i++];
  10102. cmds.push("L");
  10103. crds.push(x, y);
  10104. } else if (cmu == "C") {
  10105. var x1 = xi + ts[i++], y1 = yi + ts[i++], x2 = xi + ts[i++], y2 = yi + ts[i++], x3 = xi + ts[i++], y3 = yi + ts[i++];
  10106. cmds.push("C");
  10107. crds.push(x1, y1, x2, y2, x3, y3);
  10108. x = x3;
  10109. y = y3;
  10110. } else if (cmu == "S") {
  10111. var co = Math.max(crds.length - 4, 0);
  10112. var x1 = x + x - crds[co], y1 = y + y - crds[co + 1];
  10113. var x2 = xi + ts[i++], y2 = yi + ts[i++], x3 = xi + ts[i++], y3 = yi + ts[i++];
  10114. cmds.push("C");
  10115. crds.push(x1, y1, x2, y2, x3, y3);
  10116. x = x3;
  10117. y = y3;
  10118. } else
  10119. console.log("Unknown SVG command " + cmd);
  10120. }
  10121. }
  10122. }
  10123. };
  10124. Typr.SVG._reps = function(ts, off, ps) {
  10125. var i = off;
  10126. while (i < ts.length) {
  10127. if (typeof ts[i] == "string")
  10128. break;
  10129. i += ps;
  10130. }
  10131. return (i - off) / ps;
  10132. };
  10133. if (Typr == null)
  10134. Typr = {};
  10135. if (Typr.U == null)
  10136. Typr.U = {};
  10137. Typr.U.codeToGlyph = function(font, code) {
  10138. var cmap = font.cmap;
  10139. var tind = -1;
  10140. if (cmap.p0e4 != null)
  10141. tind = cmap.p0e4;
  10142. else if (cmap.p3e1 != null)
  10143. tind = cmap.p3e1;
  10144. else if (cmap.p1e0 != null)
  10145. tind = cmap.p1e0;
  10146. if (tind == -1)
  10147. throw "no familiar platform and encoding!";
  10148. var tab = cmap.tables[tind];
  10149. if (tab.format == 0) {
  10150. if (code >= tab.map.length)
  10151. return 0;
  10152. return tab.map[code];
  10153. } else if (tab.format == 4) {
  10154. var sind = -1;
  10155. for (var i = 0; i < tab.endCount.length; i++)
  10156. if (code <= tab.endCount[i]) {
  10157. sind = i;
  10158. break;
  10159. }
  10160. if (sind == -1)
  10161. return 0;
  10162. if (tab.startCount[sind] > code)
  10163. return 0;
  10164. var gli = 0;
  10165. if (tab.idRangeOffset[sind] != 0)
  10166. gli = tab.glyphIdArray[code - tab.startCount[sind] + (tab.idRangeOffset[sind] >> 1) - (tab.idRangeOffset.length - sind)];
  10167. else
  10168. gli = code + tab.idDelta[sind];
  10169. return gli & 65535;
  10170. } else if (tab.format == 12) {
  10171. if (code > tab.groups[tab.groups.length - 1][1])
  10172. return 0;
  10173. for (var i = 0; i < tab.groups.length; i++) {
  10174. var grp = tab.groups[i];
  10175. if (grp[0] <= code && code <= grp[1])
  10176. return grp[2] + (code - grp[0]);
  10177. }
  10178. return 0;
  10179. } else
  10180. throw "unknown cmap table format " + tab.format;
  10181. };
  10182. Typr.U.glyphToPath = function(font, gid) {
  10183. var path = { cmds: [], crds: [] };
  10184. if (font.SVG && font.SVG.entries[gid]) {
  10185. var p = font.SVG.entries[gid];
  10186. if (p == null)
  10187. return path;
  10188. if (typeof p == "string") {
  10189. p = Typr.SVG.toPath(p);
  10190. font.SVG.entries[gid] = p;
  10191. }
  10192. return p;
  10193. } else if (font.CFF) {
  10194. var state2 = { x: 0, y: 0, stack: [], nStems: 0, haveWidth: false, width: font.CFF.Private ? font.CFF.Private.defaultWidthX : 0, open: false };
  10195. Typr.U._drawCFF(font.CFF.CharStrings[gid], state2, font.CFF, path);
  10196. } else if (font.glyf) {
  10197. Typr.U._drawGlyf(gid, font, path);
  10198. }
  10199. return path;
  10200. };
  10201. Typr.U._drawGlyf = function(gid, font, path) {
  10202. var gl = font.glyf[gid];
  10203. if (gl == null)
  10204. gl = font.glyf[gid] = Typr.glyf._parseGlyf(font, gid);
  10205. if (gl != null) {
  10206. if (gl.noc > -1)
  10207. Typr.U._simpleGlyph(gl, path);
  10208. else
  10209. Typr.U._compoGlyph(gl, font, path);
  10210. }
  10211. };
  10212. Typr.U._simpleGlyph = function(gl, p) {
  10213. for (var c = 0; c < gl.noc; c++) {
  10214. var i0 = c == 0 ? 0 : gl.endPts[c - 1] + 1;
  10215. var il = gl.endPts[c];
  10216. for (var i = i0; i <= il; i++) {
  10217. var pr = i == i0 ? il : i - 1;
  10218. var nx = i == il ? i0 : i + 1;
  10219. var onCurve = gl.flags[i] & 1;
  10220. var prOnCurve = gl.flags[pr] & 1;
  10221. var nxOnCurve = gl.flags[nx] & 1;
  10222. var x = gl.xs[i], y = gl.ys[i];
  10223. if (i == i0) {
  10224. if (onCurve) {
  10225. if (prOnCurve)
  10226. Typr.U.P.moveTo(p, gl.xs[pr], gl.ys[pr]);
  10227. else {
  10228. Typr.U.P.moveTo(p, x, y);
  10229. continue;
  10230. }
  10231. } else {
  10232. if (prOnCurve)
  10233. Typr.U.P.moveTo(p, gl.xs[pr], gl.ys[pr]);
  10234. else
  10235. Typr.U.P.moveTo(p, (gl.xs[pr] + x) / 2, (gl.ys[pr] + y) / 2);
  10236. }
  10237. }
  10238. if (onCurve) {
  10239. if (prOnCurve)
  10240. Typr.U.P.lineTo(p, x, y);
  10241. } else {
  10242. if (nxOnCurve)
  10243. Typr.U.P.qcurveTo(p, x, y, gl.xs[nx], gl.ys[nx]);
  10244. else
  10245. Typr.U.P.qcurveTo(p, x, y, (x + gl.xs[nx]) / 2, (y + gl.ys[nx]) / 2);
  10246. }
  10247. }
  10248. Typr.U.P.closePath(p);
  10249. }
  10250. };
  10251. Typr.U._compoGlyph = function(gl, font, p) {
  10252. for (var j = 0; j < gl.parts.length; j++) {
  10253. var path = { cmds: [], crds: [] };
  10254. var prt = gl.parts[j];
  10255. Typr.U._drawGlyf(prt.glyphIndex, font, path);
  10256. var m = prt.m;
  10257. for (var i = 0; i < path.crds.length; i += 2) {
  10258. var x = path.crds[i], y = path.crds[i + 1];
  10259. p.crds.push(x * m.a + y * m.b + m.tx);
  10260. p.crds.push(x * m.c + y * m.d + m.ty);
  10261. }
  10262. for (var i = 0; i < path.cmds.length; i++)
  10263. p.cmds.push(path.cmds[i]);
  10264. }
  10265. };
  10266. Typr.U._getGlyphClass = function(g, cd) {
  10267. var intr = Typr._lctf.getInterval(cd, g);
  10268. return intr == -1 ? 0 : cd[intr + 2];
  10269. };
  10270. Typr.U.getPairAdjustment = function(font, g1, g2) {
  10271. if (font.GPOS) {
  10272. var ltab = null;
  10273. for (var i = 0; i < font.GPOS.featureList.length; i++) {
  10274. var fl = font.GPOS.featureList[i];
  10275. if (fl.tag == "kern") {
  10276. for (var j = 0; j < fl.tab.length; j++)
  10277. if (font.GPOS.lookupList[fl.tab[j]].ltype == 2)
  10278. ltab = font.GPOS.lookupList[fl.tab[j]];
  10279. }
  10280. }
  10281. if (ltab) {
  10282. for (var i = 0; i < ltab.tabs.length; i++) {
  10283. var tab = ltab.tabs[i];
  10284. var ind = Typr._lctf.coverageIndex(tab.coverage, g1);
  10285. if (ind == -1)
  10286. continue;
  10287. var adj;
  10288. if (tab.format == 1) {
  10289. var right = tab.pairsets[ind];
  10290. for (var j = 0; j < right.length; j++)
  10291. if (right[j].gid2 == g2)
  10292. adj = right[j];
  10293. if (adj == null)
  10294. continue;
  10295. } else if (tab.format == 2) {
  10296. var c1 = Typr.U._getGlyphClass(g1, tab.classDef1);
  10297. var c2 = Typr.U._getGlyphClass(g2, tab.classDef2);
  10298. var adj = tab.matrix[c1][c2];
  10299. }
  10300. return adj.val1[2];
  10301. }
  10302. }
  10303. }
  10304. if (font.kern) {
  10305. var ind1 = font.kern.glyph1.indexOf(g1);
  10306. if (ind1 != -1) {
  10307. var ind2 = font.kern.rval[ind1].glyph2.indexOf(g2);
  10308. if (ind2 != -1)
  10309. return font.kern.rval[ind1].vals[ind2];
  10310. }
  10311. }
  10312. return 0;
  10313. };
  10314. Typr.U.stringToGlyphs = function(font, str) {
  10315. var gls = [];
  10316. for (var i = 0; i < str.length; i++) {
  10317. var cc = str.codePointAt(i);
  10318. if (cc > 65535)
  10319. i++;
  10320. gls.push(Typr.U.codeToGlyph(font, cc));
  10321. }
  10322. var gsub = font["GSUB"];
  10323. if (gsub == null)
  10324. return gls;
  10325. var llist = gsub.lookupList, flist = gsub.featureList;
  10326. var wsep = '\n " ,.:;!?() \u060C';
  10327. var R2 = "\u0622\u0623\u0624\u0625\u0627\u0629\u062F\u0630\u0631\u0632\u0648\u0671\u0672\u0673\u0675\u0676\u0677\u0688\u0689\u068A\u068B\u068C\u068D\u068E\u068F\u0690\u0691\u0692\u0693\u0694\u0695\u0696\u0697\u0698\u0699\u06C0\u06C3\u06C4\u06C5\u06C6\u06C7\u06C8\u06C9\u06CA\u06CB\u06CD\u06CF\u06D2\u06D3\u06D5\u06EE\u06EF\u0710\u0715\u0716\u0717\u0718\u0719\u071E\u0728\u072A\u072C\u072F\u074D\u0759\u075A\u075B\u076B\u076C\u0771\u0773\u0774\u0778\u0779\u0840\u0846\u0847\u0849\u0854\u0867\u0869\u086A\u08AA\u08AB\u08AC\u08AE\u08B1\u08B2\u08B9\u0AC5\u0AC7\u0AC9\u0ACA\u0ACE\u0ACF\u0AD0\u0AD1\u0AD2\u0ADD\u0AE1\u0AE4\u0AEF\u0B81\u0B83\u0B84\u0B85\u0B89\u0B8C\u0B8E\u0B8F\u0B91\u0BA9\u0BAA\u0BAB\u0BAC";
  10328. var L = "\uA872\u0ACD\u0AD7";
  10329. for (var ci = 0; ci < gls.length; ci++) {
  10330. var gl = gls[ci];
  10331. var slft = ci == 0 || wsep.indexOf(str[ci - 1]) != -1;
  10332. var srgt = ci == gls.length - 1 || wsep.indexOf(str[ci + 1]) != -1;
  10333. if (!slft && R2.indexOf(str[ci - 1]) != -1)
  10334. slft = true;
  10335. if (!srgt && R2.indexOf(str[ci]) != -1)
  10336. srgt = true;
  10337. if (!srgt && L.indexOf(str[ci + 1]) != -1)
  10338. srgt = true;
  10339. if (!slft && L.indexOf(str[ci]) != -1)
  10340. slft = true;
  10341. var feat = null;
  10342. if (slft)
  10343. feat = srgt ? "isol" : "init";
  10344. else
  10345. feat = srgt ? "fina" : "medi";
  10346. for (var fi = 0; fi < flist.length; fi++) {
  10347. if (flist[fi].tag != feat)
  10348. continue;
  10349. for (var ti = 0; ti < flist[fi].tab.length; ti++) {
  10350. var tab = llist[flist[fi].tab[ti]];
  10351. if (tab.ltype != 1)
  10352. continue;
  10353. Typr.U._applyType1(gls, ci, tab);
  10354. }
  10355. }
  10356. }
  10357. var cligs = ["rlig", "liga", "mset"];
  10358. for (var ci = 0; ci < gls.length; ci++) {
  10359. var gl = gls[ci];
  10360. var rlim = Math.min(3, gls.length - ci - 1);
  10361. for (var fi = 0; fi < flist.length; fi++) {
  10362. var fl = flist[fi];
  10363. if (cligs.indexOf(fl.tag) == -1)
  10364. continue;
  10365. for (var ti = 0; ti < fl.tab.length; ti++) {
  10366. var tab = llist[fl.tab[ti]];
  10367. for (var j = 0; j < tab.tabs.length; j++) {
  10368. if (tab.tabs[j] == null)
  10369. continue;
  10370. var ind = Typr._lctf.coverageIndex(tab.tabs[j].coverage, gl);
  10371. if (ind == -1)
  10372. continue;
  10373. if (tab.ltype == 4) {
  10374. var vals = tab.tabs[j].vals[ind];
  10375. for (var k = 0; k < vals.length; k++) {
  10376. var lig = vals[k], rl = lig.chain.length;
  10377. if (rl > rlim)
  10378. continue;
  10379. var good = true;
  10380. for (var l = 0; l < rl; l++)
  10381. if (lig.chain[l] != gls[ci + (1 + l)])
  10382. good = false;
  10383. if (!good)
  10384. continue;
  10385. gls[ci] = lig.nglyph;
  10386. for (var l = 0; l < rl; l++)
  10387. gls[ci + l + 1] = -1;
  10388. }
  10389. } else if (tab.ltype == 5) {
  10390. var ltab = tab.tabs[j];
  10391. if (ltab.fmt != 2)
  10392. continue;
  10393. var cind = Typr._lctf.getInterval(ltab.cDef, gl);
  10394. var cls = ltab.cDef[cind + 2], scs = ltab.scset[cls];
  10395. for (var i = 0; i < scs.length; i++) {
  10396. var sc = scs[i], inp = sc.input;
  10397. if (inp.length > rlim)
  10398. continue;
  10399. var good = true;
  10400. for (var l = 0; l < inp.length; l++) {
  10401. var cind2 = Typr._lctf.getInterval(ltab.cDef, gls[ci + 1 + l]);
  10402. if (cind == -1 && ltab.cDef[cind2 + 2] != inp[l]) {
  10403. good = false;
  10404. break;
  10405. }
  10406. }
  10407. if (!good)
  10408. continue;
  10409. var lrs = sc.substLookupRecords;
  10410. for (var k = 0; k < lrs.length; k += 2) {
  10411. lrs[k];
  10412. lrs[k + 1];
  10413. }
  10414. }
  10415. }
  10416. }
  10417. }
  10418. }
  10419. }
  10420. return gls;
  10421. };
  10422. Typr.U._applyType1 = function(gls, ci, tab) {
  10423. var gl = gls[ci];
  10424. for (var j = 0; j < tab.tabs.length; j++) {
  10425. var ttab = tab.tabs[j];
  10426. var ind = Typr._lctf.coverageIndex(ttab.coverage, gl);
  10427. if (ind == -1)
  10428. continue;
  10429. if (ttab.fmt == 1)
  10430. gls[ci] = gls[ci] + ttab.delta;
  10431. else
  10432. gls[ci] = ttab.newg[ind];
  10433. }
  10434. };
  10435. Typr.U.glyphsToPath = function(font, gls, clr) {
  10436. var tpath = { cmds: [], crds: [] };
  10437. var x = 0;
  10438. for (var i = 0; i < gls.length; i++) {
  10439. var gid = gls[i];
  10440. if (gid == -1)
  10441. continue;
  10442. var gid2 = i < gls.length - 1 && gls[i + 1] != -1 ? gls[i + 1] : 0;
  10443. var path = Typr.U.glyphToPath(font, gid);
  10444. for (var j = 0; j < path.crds.length; j += 2) {
  10445. tpath.crds.push(path.crds[j] + x);
  10446. tpath.crds.push(path.crds[j + 1]);
  10447. }
  10448. if (clr)
  10449. tpath.cmds.push(clr);
  10450. for (var j = 0; j < path.cmds.length; j++)
  10451. tpath.cmds.push(path.cmds[j]);
  10452. if (clr)
  10453. tpath.cmds.push("X");
  10454. x += font.hmtx.aWidth[gid];
  10455. if (i < gls.length - 1)
  10456. x += Typr.U.getPairAdjustment(font, gid, gid2);
  10457. }
  10458. return tpath;
  10459. };
  10460. Typr.U.pathToSVG = function(path, prec) {
  10461. if (prec == null)
  10462. prec = 5;
  10463. var out = [], co = 0, lmap = { M: 2, L: 2, Q: 4, C: 6 };
  10464. for (var i = 0; i < path.cmds.length; i++) {
  10465. var cmd = path.cmds[i], cn = co + (lmap[cmd] ? lmap[cmd] : 0);
  10466. out.push(cmd);
  10467. while (co < cn) {
  10468. var c = path.crds[co++];
  10469. out.push(parseFloat(c.toFixed(prec)) + (co == cn ? "" : " "));
  10470. }
  10471. }
  10472. return out.join("");
  10473. };
  10474. Typr.U.pathToContext = function(path, ctx) {
  10475. var c = 0, crds = path.crds;
  10476. for (var j = 0; j < path.cmds.length; j++) {
  10477. var cmd = path.cmds[j];
  10478. if (cmd == "M") {
  10479. ctx.moveTo(crds[c], crds[c + 1]);
  10480. c += 2;
  10481. } else if (cmd == "L") {
  10482. ctx.lineTo(crds[c], crds[c + 1]);
  10483. c += 2;
  10484. } else if (cmd == "C") {
  10485. ctx.bezierCurveTo(crds[c], crds[c + 1], crds[c + 2], crds[c + 3], crds[c + 4], crds[c + 5]);
  10486. c += 6;
  10487. } else if (cmd == "Q") {
  10488. ctx.quadraticCurveTo(crds[c], crds[c + 1], crds[c + 2], crds[c + 3]);
  10489. c += 4;
  10490. } else if (cmd.charAt(0) == "#") {
  10491. ctx.beginPath();
  10492. ctx.fillStyle = cmd;
  10493. } else if (cmd == "Z") {
  10494. ctx.closePath();
  10495. } else if (cmd == "X") {
  10496. ctx.fill();
  10497. }
  10498. }
  10499. };
  10500. Typr.U.P = {};
  10501. Typr.U.P.moveTo = function(p, x, y) {
  10502. p.cmds.push("M");
  10503. p.crds.push(x, y);
  10504. };
  10505. Typr.U.P.lineTo = function(p, x, y) {
  10506. p.cmds.push("L");
  10507. p.crds.push(x, y);
  10508. };
  10509. Typr.U.P.curveTo = function(p, a, b, c, d, e, f) {
  10510. p.cmds.push("C");
  10511. p.crds.push(a, b, c, d, e, f);
  10512. };
  10513. Typr.U.P.qcurveTo = function(p, a, b, c, d) {
  10514. p.cmds.push("Q");
  10515. p.crds.push(a, b, c, d);
  10516. };
  10517. Typr.U.P.closePath = function(p) {
  10518. p.cmds.push("Z");
  10519. };
  10520. Typr.U._drawCFF = function(cmds, state2, font, p) {
  10521. var stack = state2.stack;
  10522. var nStems = state2.nStems, haveWidth = state2.haveWidth, width = state2.width, open = state2.open;
  10523. var i = 0;
  10524. var x = state2.x, y = state2.y, c1x = 0, c1y = 0, c2x = 0, c2y = 0, c3x = 0, c3y = 0, c4x = 0, c4y = 0, jpx = 0, jpy = 0;
  10525. var o = { val: 0, size: 0 };
  10526. while (i < cmds.length) {
  10527. Typr.CFF.getCharString(cmds, i, o);
  10528. var v = o.val;
  10529. i += o.size;
  10530. if (v == "o1" || v == "o18") {
  10531. var hasWidthArg;
  10532. hasWidthArg = stack.length % 2 !== 0;
  10533. if (hasWidthArg && !haveWidth) {
  10534. width = stack.shift() + font.Private.nominalWidthX;
  10535. }
  10536. nStems += stack.length >> 1;
  10537. stack.length = 0;
  10538. haveWidth = true;
  10539. } else if (v == "o3" || v == "o23") {
  10540. var hasWidthArg;
  10541. hasWidthArg = stack.length % 2 !== 0;
  10542. if (hasWidthArg && !haveWidth) {
  10543. width = stack.shift() + font.Private.nominalWidthX;
  10544. }
  10545. nStems += stack.length >> 1;
  10546. stack.length = 0;
  10547. haveWidth = true;
  10548. } else if (v == "o4") {
  10549. if (stack.length > 1 && !haveWidth) {
  10550. width = stack.shift() + font.Private.nominalWidthX;
  10551. haveWidth = true;
  10552. }
  10553. if (open)
  10554. Typr.U.P.closePath(p);
  10555. y += stack.pop();
  10556. Typr.U.P.moveTo(p, x, y);
  10557. open = true;
  10558. } else if (v == "o5") {
  10559. while (stack.length > 0) {
  10560. x += stack.shift();
  10561. y += stack.shift();
  10562. Typr.U.P.lineTo(p, x, y);
  10563. }
  10564. } else if (v == "o6" || v == "o7") {
  10565. var count = stack.length;
  10566. var isX = v == "o6";
  10567. for (var j = 0; j < count; j++) {
  10568. var sval = stack.shift();
  10569. if (isX)
  10570. x += sval;
  10571. else
  10572. y += sval;
  10573. isX = !isX;
  10574. Typr.U.P.lineTo(p, x, y);
  10575. }
  10576. } else if (v == "o8" || v == "o24") {
  10577. var count = stack.length;
  10578. var index = 0;
  10579. while (index + 6 <= count) {
  10580. c1x = x + stack.shift();
  10581. c1y = y + stack.shift();
  10582. c2x = c1x + stack.shift();
  10583. c2y = c1y + stack.shift();
  10584. x = c2x + stack.shift();
  10585. y = c2y + stack.shift();
  10586. Typr.U.P.curveTo(p, c1x, c1y, c2x, c2y, x, y);
  10587. index += 6;
  10588. }
  10589. if (v == "o24") {
  10590. x += stack.shift();
  10591. y += stack.shift();
  10592. Typr.U.P.lineTo(p, x, y);
  10593. }
  10594. } else if (v == "o11")
  10595. break;
  10596. else if (v == "o1234" || v == "o1235" || v == "o1236" || v == "o1237") {
  10597. if (v == "o1234") {
  10598. c1x = x + stack.shift();
  10599. c1y = y;
  10600. c2x = c1x + stack.shift();
  10601. c2y = c1y + stack.shift();
  10602. jpx = c2x + stack.shift();
  10603. jpy = c2y;
  10604. c3x = jpx + stack.shift();
  10605. c3y = c2y;
  10606. c4x = c3x + stack.shift();
  10607. c4y = y;
  10608. x = c4x + stack.shift();
  10609. Typr.U.P.curveTo(p, c1x, c1y, c2x, c2y, jpx, jpy);
  10610. Typr.U.P.curveTo(p, c3x, c3y, c4x, c4y, x, y);
  10611. }
  10612. if (v == "o1235") {
  10613. c1x = x + stack.shift();
  10614. c1y = y + stack.shift();
  10615. c2x = c1x + stack.shift();
  10616. c2y = c1y + stack.shift();
  10617. jpx = c2x + stack.shift();
  10618. jpy = c2y + stack.shift();
  10619. c3x = jpx + stack.shift();
  10620. c3y = jpy + stack.shift();
  10621. c4x = c3x + stack.shift();
  10622. c4y = c3y + stack.shift();
  10623. x = c4x + stack.shift();
  10624. y = c4y + stack.shift();
  10625. stack.shift();
  10626. Typr.U.P.curveTo(p, c1x, c1y, c2x, c2y, jpx, jpy);
  10627. Typr.U.P.curveTo(p, c3x, c3y, c4x, c4y, x, y);
  10628. }
  10629. if (v == "o1236") {
  10630. c1x = x + stack.shift();
  10631. c1y = y + stack.shift();
  10632. c2x = c1x + stack.shift();
  10633. c2y = c1y + stack.shift();
  10634. jpx = c2x + stack.shift();
  10635. jpy = c2y;
  10636. c3x = jpx + stack.shift();
  10637. c3y = c2y;
  10638. c4x = c3x + stack.shift();
  10639. c4y = c3y + stack.shift();
  10640. x = c4x + stack.shift();
  10641. Typr.U.P.curveTo(p, c1x, c1y, c2x, c2y, jpx, jpy);
  10642. Typr.U.P.curveTo(p, c3x, c3y, c4x, c4y, x, y);
  10643. }
  10644. if (v == "o1237") {
  10645. c1x = x + stack.shift();
  10646. c1y = y + stack.shift();
  10647. c2x = c1x + stack.shift();
  10648. c2y = c1y + stack.shift();
  10649. jpx = c2x + stack.shift();
  10650. jpy = c2y + stack.shift();
  10651. c3x = jpx + stack.shift();
  10652. c3y = jpy + stack.shift();
  10653. c4x = c3x + stack.shift();
  10654. c4y = c3y + stack.shift();
  10655. if (Math.abs(c4x - x) > Math.abs(c4y - y)) {
  10656. x = c4x + stack.shift();
  10657. } else {
  10658. y = c4y + stack.shift();
  10659. }
  10660. Typr.U.P.curveTo(p, c1x, c1y, c2x, c2y, jpx, jpy);
  10661. Typr.U.P.curveTo(p, c3x, c3y, c4x, c4y, x, y);
  10662. }
  10663. } else if (v == "o14") {
  10664. if (stack.length > 0 && !haveWidth) {
  10665. width = stack.shift() + font.nominalWidthX;
  10666. haveWidth = true;
  10667. }
  10668. if (stack.length == 4) {
  10669. var adx = stack.shift();
  10670. var ady = stack.shift();
  10671. var bchar = stack.shift();
  10672. var achar = stack.shift();
  10673. var bind = Typr.CFF.glyphBySE(font, bchar);
  10674. var aind = Typr.CFF.glyphBySE(font, achar);
  10675. Typr.U._drawCFF(font.CharStrings[bind], state2, font, p);
  10676. state2.x = adx;
  10677. state2.y = ady;
  10678. Typr.U._drawCFF(font.CharStrings[aind], state2, font, p);
  10679. }
  10680. if (open) {
  10681. Typr.U.P.closePath(p);
  10682. open = false;
  10683. }
  10684. } else if (v == "o19" || v == "o20") {
  10685. var hasWidthArg;
  10686. hasWidthArg = stack.length % 2 !== 0;
  10687. if (hasWidthArg && !haveWidth) {
  10688. width = stack.shift() + font.Private.nominalWidthX;
  10689. }
  10690. nStems += stack.length >> 1;
  10691. stack.length = 0;
  10692. haveWidth = true;
  10693. i += nStems + 7 >> 3;
  10694. } else if (v == "o21") {
  10695. if (stack.length > 2 && !haveWidth) {
  10696. width = stack.shift() + font.Private.nominalWidthX;
  10697. haveWidth = true;
  10698. }
  10699. y += stack.pop();
  10700. x += stack.pop();
  10701. if (open)
  10702. Typr.U.P.closePath(p);
  10703. Typr.U.P.moveTo(p, x, y);
  10704. open = true;
  10705. } else if (v == "o22") {
  10706. if (stack.length > 1 && !haveWidth) {
  10707. width = stack.shift() + font.Private.nominalWidthX;
  10708. haveWidth = true;
  10709. }
  10710. x += stack.pop();
  10711. if (open)
  10712. Typr.U.P.closePath(p);
  10713. Typr.U.P.moveTo(p, x, y);
  10714. open = true;
  10715. } else if (v == "o25") {
  10716. while (stack.length > 6) {
  10717. x += stack.shift();
  10718. y += stack.shift();
  10719. Typr.U.P.lineTo(p, x, y);
  10720. }
  10721. c1x = x + stack.shift();
  10722. c1y = y + stack.shift();
  10723. c2x = c1x + stack.shift();
  10724. c2y = c1y + stack.shift();
  10725. x = c2x + stack.shift();
  10726. y = c2y + stack.shift();
  10727. Typr.U.P.curveTo(p, c1x, c1y, c2x, c2y, x, y);
  10728. } else if (v == "o26") {
  10729. if (stack.length % 2) {
  10730. x += stack.shift();
  10731. }
  10732. while (stack.length > 0) {
  10733. c1x = x;
  10734. c1y = y + stack.shift();
  10735. c2x = c1x + stack.shift();
  10736. c2y = c1y + stack.shift();
  10737. x = c2x;
  10738. y = c2y + stack.shift();
  10739. Typr.U.P.curveTo(p, c1x, c1y, c2x, c2y, x, y);
  10740. }
  10741. } else if (v == "o27") {
  10742. if (stack.length % 2) {
  10743. y += stack.shift();
  10744. }
  10745. while (stack.length > 0) {
  10746. c1x = x + stack.shift();
  10747. c1y = y;
  10748. c2x = c1x + stack.shift();
  10749. c2y = c1y + stack.shift();
  10750. x = c2x + stack.shift();
  10751. y = c2y;
  10752. Typr.U.P.curveTo(p, c1x, c1y, c2x, c2y, x, y);
  10753. }
  10754. } else if (v == "o10" || v == "o29") {
  10755. var obj = v == "o10" ? font.Private : font;
  10756. if (stack.length == 0) {
  10757. console.log("error: empty stack");
  10758. } else {
  10759. var ind = stack.pop();
  10760. var subr = obj.Subrs[ind + obj.Bias];
  10761. state2.x = x;
  10762. state2.y = y;
  10763. state2.nStems = nStems;
  10764. state2.haveWidth = haveWidth;
  10765. state2.width = width;
  10766. state2.open = open;
  10767. Typr.U._drawCFF(subr, state2, font, p);
  10768. x = state2.x;
  10769. y = state2.y;
  10770. nStems = state2.nStems;
  10771. haveWidth = state2.haveWidth;
  10772. width = state2.width;
  10773. open = state2.open;
  10774. }
  10775. } else if (v == "o30" || v == "o31") {
  10776. var count, count1 = stack.length;
  10777. var index = 0;
  10778. var alternate = v == "o31";
  10779. count = count1 & ~2;
  10780. index += count1 - count;
  10781. while (index < count) {
  10782. if (alternate) {
  10783. c1x = x + stack.shift();
  10784. c1y = y;
  10785. c2x = c1x + stack.shift();
  10786. c2y = c1y + stack.shift();
  10787. y = c2y + stack.shift();
  10788. if (count - index == 5) {
  10789. x = c2x + stack.shift();
  10790. index++;
  10791. } else
  10792. x = c2x;
  10793. alternate = false;
  10794. } else {
  10795. c1x = x;
  10796. c1y = y + stack.shift();
  10797. c2x = c1x + stack.shift();
  10798. c2y = c1y + stack.shift();
  10799. x = c2x + stack.shift();
  10800. if (count - index == 5) {
  10801. y = c2y + stack.shift();
  10802. index++;
  10803. } else
  10804. y = c2y;
  10805. alternate = true;
  10806. }
  10807. Typr.U.P.curveTo(p, c1x, c1y, c2x, c2y, x, y);
  10808. index += 4;
  10809. }
  10810. } else if ((v + "").charAt(0) == "o") {
  10811. console.log("Unknown operation: " + v, cmds);
  10812. throw v;
  10813. } else
  10814. stack.push(v);
  10815. }
  10816. state2.x = x;
  10817. state2.y = y;
  10818. state2.nStems = nStems;
  10819. state2.haveWidth = haveWidth;
  10820. state2.width = width;
  10821. state2.open = open;
  10822. };
  10823. var typr_js = Typr;
  10824. try {
  10825. top.typrMapping = top.typrMapping || void 0;
  10826. top.jobs = top.jobs || [];
  10827. top.currentMedia = top.currentMedia || void 0;
  10828. } catch {
  10829. }
  10830. const state$2 = {
  10831. study: {
  10832. videojs: /* @__PURE__ */ Object.create({}),
  10833. hacked: false,
  10834. answererWrapperUnsetMessage: void 0
  10835. }
  10836. };
  10837. const CXProject = Project.create({
  10838. name: "\u8D85\u661F\u5B66\u4E60\u901A",
  10839. domains: [
  10840. "chaoxing.com",
  10841. "edu.cn",
  10842. "org.cn",
  10843. "xueyinonline.com",
  10844. "hnsyu.net",
  10845. "qutjxjy.cn",
  10846. "ynny.cn"
  10847. ],
  10848. studyProject: true,
  10849. scripts: {
  10850. guide: new Script({
  10851. name: "\u{1F4A1} \u4F7F\u7528\u63D0\u793A",
  10852. url: [
  10853. ["\u9996\u9875", "https://www.chaoxing.com"],
  10854. ["\u65E7\u7248\u4E2A\u4EBA\u9996\u9875", "chaoxing.com/space/index"],
  10855. ["\u65B0\u7248\u4E2A\u4EBA\u9996\u9875", "chaoxing.com/base"],
  10856. ["\u8BFE\u7A0B\u9996\u9875", "chaoxing.com/mycourse"],
  10857. ["\u65B0\u7248\u8BFE\u7A0B\u9996\u9875", "chaoxing.com/mooc2-ans/mycourse"]
  10858. ],
  10859. namespace: "cx.guide",
  10860. configs: {
  10861. notes: {
  10862. defaultValue: `\u8BF7\u624B\u52A8\u8FDB\u5165\u89C6\u9891\u3001\u4F5C\u4E1A\u3001\u8003\u8BD5\u9875\u9762\uFF0C\u811A\u672C\u4F1A\u81EA\u52A8\u8FD0\u884C\u3002`
  10863. }
  10864. },
  10865. oncomplete() {
  10866. CommonProject.scripts.render.methods.pin(this);
  10867. }
  10868. }),
  10869. study: new Script({
  10870. name: "\u{1F5A5}\uFE0F \u8BFE\u7A0B\u5B66\u4E60",
  10871. namespace: "cx.new.study",
  10872. url: [
  10873. ["\u4EFB\u52A1\u70B9\u9875\u9762", "/knowledge/cards"],
  10874. ["\u9605\u8BFB\u4EFB\u52A1\u70B9", "/readsvr/book/mooc"]
  10875. ],
  10876. configs: {
  10877. notes: {
  10878. defaultValue: $creator.notes([
  10879. "\u81EA\u52A8\u7B54\u9898\u524D\u8BF7\u5728 \u201C\u901A\u7528-\u5168\u5C40\u8BBE\u7F6E\u201D \u4E2D\u8BBE\u7F6E\u9898\u5E93\u914D\u7F6E\u3002",
  10880. ["\u4EFB\u52A1\u70B9\u4E0D\u662F\u987A\u5E8F\u6267\u884C\uFF0C\u5982\u679C\u67D0\u4E00\u4E2A\u4EFB\u52A1\u6CA1\u6709\u52A8", "\u8BF7\u67E5\u770B\u662F\u5426\u6709\u5176\u4ED6\u4EFB\u52A1\u6B63\u5728\u5B66\u4E60\uFF0C\u8010\u5FC3\u7B49\u5F85\u5373\u53EF\u3002"],
  10881. "\u95EF\u5173\u6A21\u5F0F\u8BF7\u6CE8\u610F\u9898\u5E93\u5982\u679C\u6CA1\u5B8C\u6210\uFF0C\u9700\u8981\u81EA\u5DF1\u5B8C\u6210\u624D\u80FD\u89E3\u9501\u7AE0\u8282\u3002",
  10882. "\u4E0D\u8981\u6700\u5C0F\u5316\u6D4F\u89C8\u5668\uFF0C\u53EF\u80FD\u5BFC\u81F4\u811A\u672C\u6682\u505C\u3002"
  10883. ]).outerHTML
  10884. },
  10885. playbackRate: {
  10886. label: "\u89C6\u9891\u500D\u901F",
  10887. attrs: {
  10888. type: "range",
  10889. step: 0.5,
  10890. min: 1,
  10891. max: 16
  10892. },
  10893. defaultValue: 1,
  10894. onload() {
  10895. createRangeTooltip(
  10896. this,
  10897. "1",
  10898. (val) => (parseFloat(val) > 2 ? `${val}x - \u9AD8\u500D\u901F\u8B66\u544A\uFF01` : `${val}x`) + "\n\n\u9AD8\u500D\u901F(\u5927\u4E8E1\u500D)\u53EF\u80FD\u5BFC\u81F4: \n- \u5B66\u4E60\u8BB0\u5F55\u6E05\u7A7A\n- \u9891\u7E41\u9A8C\u8BC1\u7801\n\u8D85\u661F\u540E\u53F0\u53EF\u4EE5\u770B\u5230\u5B66\u4E60\u65F6\u957F\uFF0C\u8BF7\u8C28\u614E\u8BBE\u7F6E\u2757\n\u5982\u679C\u8BBE\u7F6E\u540E\u65E0\u6548\u5219\u662F\u8D85\u661F\u4E0D\u5141\u8BB8\u4F7F\u7528\u500D\u901F\u3002"
  10899. );
  10900. }
  10901. },
  10902. volume,
  10903. restudy,
  10904. autoNextPage: {
  10905. label: "\u81EA\u52A8\u4E0B\u4E00\u7AE0",
  10906. attrs: { type: "checkbox" },
  10907. defaultValue: true
  10908. },
  10909. reloadVideoWhenError: {
  10910. label: "\u89C6\u9891\u52A0\u8F7D\u9519\u8BEF\u65F6\u81EA\u52A8\u5237\u65B0",
  10911. attrs: { type: "checkbox" },
  10912. defaultValue: false
  10913. },
  10914. showTextareaWhenEdit: {
  10915. label: "\u7F16\u8F91\u65F6\u663E\u793A\u81EA\u5B9A\u4E49\u7F16\u8F91\u6846",
  10916. attrs: {
  10917. type: "checkbox",
  10918. title: "\u8D85\u661F\u9ED8\u8BA4\u7981\u6B62\u5728\u7F16\u8F91\u6846\u4E2D\u590D\u5236\u7C98\u8D34\uFF0C\u5F00\u542F\u6B64\u9009\u9879\u53EF\u4EE5\u5728\u6587\u672C\u6846\u7F16\u8F91\u65F6\u751F\u6210\u4E00\u4E2A\u81EA\u5B9A\u4E49\u7F16\u8F91\u6846\u8FDB\u884C\u7F16\u8F91\uFF0C\u811A\u672C\u4F1A\u5C06\u5185\u5BB9\u540C\u6B65\u5230\u7F16\u8F91\u6846\u4E2D\u3002"
  10919. },
  10920. defaultValue: true
  10921. },
  10922. enableMedia: {
  10923. separator: "\u4EFB\u52A1\u70B9\u5F00\u5173",
  10924. label: "\u5F00\u542F-\u89C6\u9891/\u97F3\u9891\u81EA\u52A8\u64AD\u653E",
  10925. attrs: { type: "checkbox", title: "\u5F00\u542F\uFF1A\u97F3\u9891\u548C\u89C6\u9891\u7684\u81EA\u52A8\u64AD\u653E" },
  10926. defaultValue: true
  10927. },
  10928. enablePPT: {
  10929. label: "\u5F00\u542F-PPT/\u4E66\u7C4D\u81EA\u52A8\u5B8C\u6210",
  10930. attrs: { type: "checkbox", title: "\u5F00\u542F\uFF1APPT/\u4E66\u7C4D\u81EA\u52A8\u7FFB\u9605" },
  10931. defaultValue: true
  10932. },
  10933. enableChapterTest: {
  10934. label: "\u5F00\u542F-\u7AE0\u8282\u6D4B\u8BD5\u81EA\u52A8\u7B54\u9898",
  10935. attrs: { type: "checkbox", title: "\u5F00\u542F\uFF1A\u7AE0\u8282\u6D4B\u8BD5\u81EA\u52A8\u7B54\u9898" },
  10936. defaultValue: true
  10937. }
  10938. },
  10939. onrender({ panel: panel2 }) {
  10940. var _a;
  10941. if (!((_a = CommonProject.scripts.settings.cfg.answererWrappers) == null ? void 0 : _a.length)) {
  10942. const setting = el("button", { className: "base-style-button-secondary" }, "\u901A\u7528-\u5168\u5C40\u8BBE\u7F6E");
  10943. setting.onclick = () => CommonProject.scripts.render.methods.pin(CommonProject.scripts.settings);
  10944. if (state$2.study.answererWrapperUnsetMessage === void 0) {
  10945. state$2.study.answererWrapperUnsetMessage = $message("warn", {
  10946. content: el("span", {}, ["\u68C0\u6D4B\u5230\u672A\u8BBE\u7F6E\u9898\u5E93\u914D\u7F6E\uFF0C\u5C06\u65E0\u6CD5\u81EA\u52A8\u7B54\u9898\uFF0C\u8BF7\u5207\u6362\u5230 ", setting, " \u9875\u9762\u8FDB\u884C\u914D\u7F6E\u3002"]),
  10947. duration: 0
  10948. });
  10949. }
  10950. }
  10951. },
  10952. async oncomplete() {
  10953. if (/\/readsvr\/book\/mooc/.test(location.href)) {
  10954. $console.log("\u6B63\u5728\u5B8C\u6210\u4E66\u7C4D/PPT...");
  10955. setTimeout(() => {
  10956. readweb.goto(epage);
  10957. }, 5e3);
  10958. return;
  10959. }
  10960. if (/\/knowledge\/cards/.test(location.href)) {
  10961. const updateMediaState = () => {
  10962. if (top.currentMedia) {
  10963. top.currentMedia.playbackRate = parseFloat(this.cfg.playbackRate.toString());
  10964. top.currentMedia.volume = this.cfg.volume;
  10965. }
  10966. };
  10967. this.onConfigChange("playbackRate", updateMediaState);
  10968. this.onConfigChange("volume", updateMediaState);
  10969. await study({
  10970. ...this.cfg,
  10971. playbackRate: parseFloat(this.cfg.playbackRate.toString()),
  10972. workOptions: CommonProject.scripts.settings.methods.getWorkOptions()
  10973. });
  10974. }
  10975. }
  10976. }),
  10977. work: new Script({
  10978. name: "\u270D\uFE0F \u4F5C\u4E1A\u8003\u8BD5\u811A\u672C",
  10979. url: [
  10980. ["\u4F5C\u4E1A\u9875\u9762", "/mooc2/work/dowork"],
  10981. ["\u8003\u8BD5\u6574\u5377\u9884\u89C8\u9875\u9762", "/mooc2/exam/preview"]
  10982. ],
  10983. namespace: "cx.new.work",
  10984. configs: { notes: workNotes },
  10985. async oncomplete() {
  10986. const isExam = /\/exam\/preview/.test(location.href);
  10987. commonWork(this, {
  10988. workerProvider: (opts) => workOrExam(isExam ? "exam" : "work", opts)
  10989. });
  10990. }
  10991. }),
  10992. autoRead: new Script({
  10993. name: "\u{1F5A5}\uFE0F \u81EA\u52A8\u9605\u8BFB",
  10994. url: [
  10995. ["\u9605\u8BFB\u9875\u9762", "/ztnodedetailcontroller/visitnodedetail"],
  10996. ["\u8BFE\u7A0B\u76EE\u5F55", /chaoxing.com\/course\/\d+\.html/],
  10997. ["\u8BFE\u7A0B\u76EE\u5F55", /chaoxing.com\/mooc-ans\/course\/\d+\.html/]
  10998. ],
  10999. namespace: "cx.new.auto-read",
  11000. configs: {
  11001. notes: {
  11002. defaultValue: $creator.notes(["\u9605\u8BFB\u4EFB\u52A1\u6B21\u65E5\u624D\u4F1A\u7EDF\u8BA1\u9605\u8BFB\u65F6\u957F"]).outerHTML
  11003. },
  11004. restartAfterFinish: {
  11005. label: "\u65E0\u9650\u9605\u8BFB",
  11006. attrs: { type: "checkbox", title: "\u9605\u8BFB\u5B8C\u6210\u6700\u540E\u4E00\u7AE0\u540E\u4ECE\u5934\u7B2C\u4E00\u7AE0\u7EE7\u7EED\u9605\u8BFB" },
  11007. defaultValue: false
  11008. }
  11009. },
  11010. oncomplete() {
  11011. if (location.href.includes("/ztnodedetailcontroller/visitnodedetail") === false) {
  11012. startAtFirst();
  11013. return;
  11014. }
  11015. let top2 = 0;
  11016. const interval = setInterval(() => {
  11017. top2 += (document.documentElement.scrollHeight - window.innerHeight) / 60;
  11018. window.scrollTo({
  11019. behavior: "smooth",
  11020. top: top2
  11021. });
  11022. }, 1e3);
  11023. setTimeout(() => {
  11024. clearInterval(interval);
  11025. const next2 = $el(".nodeItem.r i");
  11026. if (next2) {
  11027. next2.click();
  11028. } else {
  11029. if (this.cfg.restartAfterFinish) {
  11030. setTimeout(() => startAtFirst(), 3e3);
  11031. $message("info", { content: "\u5373\u5C06\u91CD\u65B0\u4ECE\u5934\u5F00\u59CB\u9605\u8BFB", duration: 10 });
  11032. $console.log("\u5373\u5C06\u91CD\u65B0\u4ECE\u5934\u5F00\u59CB\u9605\u8BFB");
  11033. } else {
  11034. $message("success", { content: "\u9605\u8BFB\u4EFB\u52A1\u5DF2\u5B8C\u6210", duration: 0 });
  11035. $console.log("\u672A\u68C0\u6D4B\u5230\u4E0B\u4E00\u9875");
  11036. }
  11037. }
  11038. }, (60 + 3) * 1e3);
  11039. function startAtFirst() {
  11040. const texts = $$el(".course_section .chapterText");
  11041. if (texts.length) {
  11042. texts[0].click();
  11043. }
  11044. }
  11045. }
  11046. }),
  11047. versionRedirect: new Script({
  11048. name: "\u7248\u672C\u5207\u6362\u811A\u672C",
  11049. url: [
  11050. ["", "mooc2=0"],
  11051. ["", "mycourse/studentcourse"],
  11052. ["", "work/getAllWork"],
  11053. ["", "work/doHomeWorkNew"],
  11054. ["", "exam/test\\?"],
  11055. ["", "exam/test/reVersionTestStartNew.*examsystem.*"]
  11056. ],
  11057. hideInPanel: true,
  11058. async oncomplete() {
  11059. if (top === window) {
  11060. $message("warn", {
  11061. content: "OCS\u7F51\u8BFE\u52A9\u624B\u4E0D\u652F\u6301\u65E7\u7248\u8D85\u661F, \u5373\u5C06\u5207\u6362\u5230\u8D85\u661F\u65B0\u7248, \u5982\u6709\u5176\u4ED6\u7B2C\u4E09\u65B9\u63D2\u4EF6\u8BF7\u5173\u95ED, \u53EF\u80FD\u6709\u517C\u5BB9\u95EE\u9898\u9891\u7E41\u9891\u7E41\u5207\u6362\u3002"
  11062. });
  11063. await $.sleep(1e3);
  11064. const experience = document.querySelector(".experience");
  11065. if (experience) {
  11066. experience.click();
  11067. } else {
  11068. const params = new URLSearchParams(window.location.href);
  11069. params.set("mooc2", "1");
  11070. params.set("newMooc", "true");
  11071. params.delete("examsystem");
  11072. window.location.replace(decodeURIComponent(params.toString()));
  11073. }
  11074. }
  11075. }
  11076. }),
  11077. examRedirect: new Script({
  11078. name: "\u8003\u8BD5\u6574\u5377\u9884\u89C8\u811A\u672C",
  11079. url: [
  11080. ["\u65B0\u7248\u8003\u8BD5\u9875\u9762", "exam-ans/exam/test/reVersionTestStartNew"],
  11081. ["\u65B0\u7248\u8003\u8BD5\u9875\u97622", "mooc-ans/exam/test/reVersionTestStartNew"]
  11082. ],
  11083. hideInPanel: true,
  11084. oncomplete() {
  11085. $message("info", { content: "\u5373\u5C06\u8DF3\u8F6C\u5230\u6574\u5377\u9884\u89C8\u9875\u9762\u8FDB\u884C\u8003\u8BD5\u3002" });
  11086. setTimeout(() => $gm.unsafeWindow.topreview(), 3e3);
  11087. }
  11088. }),
  11089. rateHack: new Script({
  11090. name: "\u5C4F\u853D\u500D\u901F\u9650\u5236",
  11091. hideInPanel: true,
  11092. url: [["", "/ananas/modules/video/"]],
  11093. onstart() {
  11094. rateHack();
  11095. }
  11096. }),
  11097. copyHack: new Script({
  11098. name: "\u5C4F\u853D\u590D\u5236\u7C98\u8D34\u9650\u5236",
  11099. hideInPanel: true,
  11100. url: [["\u6240\u6709\u9875\u9762", /.*/]],
  11101. methods() {
  11102. return {
  11103. hackEditorPaste() {
  11104. var _a, _b;
  11105. try {
  11106. const instants = ((_b = (_a = $gm.unsafeWindow) == null ? void 0 : _a.UE) == null ? void 0 : _b.instants) || [];
  11107. for (const key in instants) {
  11108. const ue = instants[key];
  11109. if (ue == null ? void 0 : ue.textarea) {
  11110. ue.body.addEventListener("click", async () => {
  11111. if (CXProject.scripts.study.cfg.showTextareaWhenEdit) {
  11112. const defaultText = el("span", { innerHTML: ue.textarea.value }).textContent;
  11113. $modal("prompt", {
  11114. content: "\u8BF7\u5728\u6B64\u6587\u672C\u6846\u8FDB\u884C\u7F16\u8F91\uFF0C\u9632\u6B62\u8D85\u661F\u65E0\u6CD5\u590D\u5236\u7C98\u8D34\u3002(\u5982\u9700\u5173\u95ED\u8BF7\u524D\u5F80\u8BBE\u7F6E: \u8BFE\u7A0B\u5B66\u4E60-\u7F16\u8F91\u65F6\u663E\u793A\u81EA\u5B9A\u4E49\u7F16\u8F91\u6846)",
  11115. width: 800,
  11116. inputDefaultValue: defaultText || "",
  11117. modalInputType: "textarea",
  11118. onConfirm: (val = "") => {
  11119. ue.setContent(
  11120. val.split("\n").map((line) => `<p>${line}</p>`).join("")
  11121. );
  11122. }
  11123. });
  11124. }
  11125. });
  11126. if ($gm.unsafeWindow.editorPaste) {
  11127. ue.removeListener("beforepaste", $gm.unsafeWindow.editorPaste);
  11128. }
  11129. if ($gm.unsafeWindow.myEditor_paste) {
  11130. ue.removeListener("beforepaste", $gm.unsafeWindow.myEditor_paste);
  11131. }
  11132. }
  11133. }
  11134. } catch {
  11135. }
  11136. }
  11137. };
  11138. },
  11139. oncomplete() {
  11140. const hackInterval = setInterval(() => {
  11141. if (typeof $gm.unsafeWindow.UE !== "undefined") {
  11142. clearInterval(hackInterval);
  11143. this.methods.hackEditorPaste();
  11144. console.log("\u5DF2\u89E3\u9664\u8F93\u5165\u6846\u65E0\u6CD5\u590D\u5236\u7C98\u8D34\u9650\u5236");
  11145. }
  11146. }, 500);
  11147. }
  11148. }),
  11149. studyDispatcher: new Script({
  11150. name: "\u8BFE\u7A0B\u5B66\u4E60\u8C03\u5EA6\u5668",
  11151. url: [["\u8BFE\u7A0B\u5B66\u4E60\u9875\u9762", "/mycourse/studentstudy"]],
  11152. namespace: "cx.new.study-dispatcher",
  11153. hideInPanel: true,
  11154. async oncomplete() {
  11155. const restudy2 = CXProject.scripts.study.cfg.restudy;
  11156. CommonProject.scripts.render.methods.pin(CXProject.scripts.study);
  11157. if (!restudy2) {
  11158. const params = new URLSearchParams(window.location.href);
  11159. const mooc = params.get("mooc2");
  11160. if (mooc === null) {
  11161. params.set("mooc2", "1");
  11162. window.location.replace(decodeURIComponent(params.toString()));
  11163. return;
  11164. }
  11165. let chapters = CXAnalyses.getChapterInfos();
  11166. chapters = chapters.filter((chapter) => chapter.unFinishCount !== 0);
  11167. if (chapters.length === 0) {
  11168. $message("warn", { content: "\u9875\u9762\u4EFB\u52A1\u70B9\u6570\u91CF\u4E3A\u7A7A! \u8BF7\u5237\u65B0\u91CD\u8BD5!" });
  11169. } else {
  11170. const params2 = new URLSearchParams(window.location.href);
  11171. const courseId = params2.get("courseId");
  11172. const classId = params2.get("clazzid");
  11173. setTimeout(() => {
  11174. if ($$el(`.posCatalog_active[id="cur${chapters[0].chapterId}"]`).length === 0) {
  11175. $gm.unsafeWindow.getTeacherAjax(courseId, classId, chapters[0].chapterId);
  11176. }
  11177. }, 1e3);
  11178. }
  11179. }
  11180. }
  11181. }),
  11182. cxSecretFontRecognize: new Script({
  11183. name: "\u7E41\u4F53\u5B57\u8BC6\u522B",
  11184. hideInPanel: true,
  11185. url: [
  11186. ["\u9898\u76EE\u9875\u9762", "work/doHomeWorkNew"],
  11187. ["\u8003\u8BD5\u6574\u5377\u9884\u89C8", "/mooc2/exam/preview"],
  11188. ["\u4F5C\u4E1A", "/mooc2/work/dowork"]
  11189. ],
  11190. async oncomplete() {
  11191. await mappingRecognize();
  11192. }
  11193. })
  11194. }
  11195. });
  11196. function workOrExam(type = "work", { answererWrappers, period, thread, redundanceWordsText }) {
  11197. $message("info", { content: `\u5F00\u59CB${type === "work" ? "\u4F5C\u4E1A" : "\u8003\u8BD5"}` });
  11198. CommonProject.scripts.workResults.methods.init({
  11199. questionPositionSyncHandlerType: "cx"
  11200. });
  11201. const workOrExamQuestionTitleTransform = (titles) => {
  11202. const optimizationTitle = titles.map((titleElement) => {
  11203. if (titleElement) {
  11204. const titleCloneEl = titleElement.cloneNode(true);
  11205. const childNodes = titleCloneEl.childNodes;
  11206. childNodes[0].remove();
  11207. childNodes[0].remove();
  11208. return optimizationElementWithImage(titleCloneEl).innerText;
  11209. }
  11210. return "";
  11211. }).join(",");
  11212. return removeRedundantWords(
  11213. StringUtils.of(optimizationTitle).nowrap().nospace().toString().trim(),
  11214. redundanceWordsText.split("\n")
  11215. );
  11216. };
  11217. const worker = new OCSWorker({
  11218. root: ".questionLi",
  11219. elements: {
  11220. title: [
  11221. (root2) => $el("h3", root2)
  11222. ],
  11223. options: ".answerBg .answer_p, .textDIV, .eidtDiv",
  11224. type: type === "exam" ? 'input[name^="type"]' : 'input[id^="answertype"]',
  11225. lineAnswerInput: ".line_answer input[name^=answer]",
  11226. lineSelectBox: ".line_answer_ct .selectBox ",
  11227. reading: ".reading_answer",
  11228. filling: ".filling_answer"
  11229. },
  11230. requestPeriod: period != null ? period : 3,
  11231. resolvePeriod: 0,
  11232. thread: thread != null ? thread : 1,
  11233. answerer: (elements, type2, ctx) => {
  11234. if (elements.title) {
  11235. const title = workOrExamQuestionTitleTransform(elements.title);
  11236. if (title) {
  11237. return CommonProject.scripts.apps.methods.searchAnswerInCaches(title, () => {
  11238. return defaultAnswerWrapperHandler(answererWrappers, {
  11239. type: type2,
  11240. title,
  11241. options: ctx.elements.options.map((o) => o.innerText).join("\n")
  11242. });
  11243. });
  11244. } else {
  11245. throw new Error("\u9898\u76EE\u4E3A\u7A7A\uFF0C\u8BF7\u67E5\u770B\u9898\u76EE\u662F\u5426\u4E3A\u7A7A\uFF0C\u6216\u8005\u5FFD\u7565\u6B64\u9898");
  11246. }
  11247. } else {
  11248. throw new Error("\u9898\u76EE\u4E3A\u7A7A\uFF0C\u8BF7\u67E5\u770B\u9898\u76EE\u662F\u5426\u4E3A\u7A7A\uFF0C\u6216\u8005\u5FFD\u7565\u6B64\u9898");
  11249. }
  11250. },
  11251. work: async (ctx) => {
  11252. var _a;
  11253. const { elements, searchInfos } = ctx;
  11254. const typeInput = elements.type[0];
  11255. const type2 = getQuestionType(parseInt(typeInput.value));
  11256. if (type2 && (type2 === "completion" || type2 === "multiple" || type2 === "judgement" || type2 === "single")) {
  11257. const resolver = defaultQuestionResolve(ctx)[type2];
  11258. return await resolver(
  11259. searchInfos,
  11260. elements.options.map((option) => optimizationElementWithImage(option)),
  11261. (type3, answer, option) => {
  11262. var _a2, _b, _c;
  11263. if (type3 === "judgement" || type3 === "single" || type3 === "multiple") {
  11264. if ((option == null ? void 0 : option.parentElement) && $$el('[class*="check_answer"]', option.parentElement).length === 0) {
  11265. option.click();
  11266. }
  11267. } else if (type3 === "completion" && answer.trim()) {
  11268. const text = option == null ? void 0 : option.querySelector("textarea");
  11269. const textareaFrame = option == null ? void 0 : option.querySelector("iframe");
  11270. if (text) {
  11271. text.value = answer;
  11272. }
  11273. if (textareaFrame == null ? void 0 : textareaFrame.contentDocument) {
  11274. textareaFrame.contentDocument.body.innerHTML = answer;
  11275. }
  11276. if ((_a2 = option == null ? void 0 : option.parentElement) == null ? void 0 : _a2.parentElement) {
  11277. (_c = $el("[onclick*=saveQuestion]", (_b = option == null ? void 0 : option.parentElement) == null ? void 0 : _b.parentElement)) == null ? void 0 : _c.click();
  11278. }
  11279. }
  11280. }
  11281. );
  11282. } else if (type2 && type2 === "line") {
  11283. for (const answers of searchInfos.map((info) => info.results.map((res) => res.answer))) {
  11284. let ans = answers;
  11285. if (ans.length === 1) {
  11286. ans = splitAnswer(ans[0]);
  11287. }
  11288. if (ans.filter(Boolean).length !== 0 && elements.lineAnswerInput) {
  11289. for (let index = 0; index < elements.lineSelectBox.length; index++) {
  11290. const box = elements.lineSelectBox[index];
  11291. if (ans[index]) {
  11292. (_a = $el(`li[data=${ans[index]}] a`, box)) == null ? void 0 : _a.click();
  11293. await $.sleep(200);
  11294. }
  11295. }
  11296. return { finish: true };
  11297. }
  11298. }
  11299. return { finish: false };
  11300. } else if (type2 && type2 === "fill") {
  11301. return readerAndFillHandle(searchInfos, elements.filling);
  11302. } else if (type2 && type2 === "reader") {
  11303. return readerAndFillHandle(searchInfos, elements.reading);
  11304. }
  11305. return { finish: false };
  11306. },
  11307. onResultsUpdate(res) {
  11308. CommonProject.scripts.workResults.methods.setResults(simplifyWorkResult(res, workOrExamQuestionTitleTransform));
  11309. },
  11310. onResolveUpdate(res) {
  11311. var _a;
  11312. if ((_a = res.result) == null ? void 0 : _a.finish) {
  11313. CommonProject.scripts.apps.methods.addQuestionCacheFromWorkResult(
  11314. simplifyWorkResult([res], workOrExamQuestionTitleTransform)
  11315. );
  11316. }
  11317. CommonProject.scripts.workResults.methods.updateWorkState(worker);
  11318. }
  11319. });
  11320. worker.doWork().then(() => {
  11321. $message("info", { content: "\u4F5C\u4E1A/\u8003\u8BD5\u5B8C\u6210\uFF0C\u8BF7\u81EA\u884C\u68C0\u67E5\u540E\u4FDD\u5B58\u6216\u63D0\u4EA4\u3002", duration: 0 });
  11322. worker.emit("done");
  11323. }).catch((err) => {
  11324. console.error(err);
  11325. $message("error", { content: "\u7B54\u9898\u7A0B\u5E8F\u53D1\u751F\u9519\u8BEF : " + err.message });
  11326. });
  11327. return worker;
  11328. }
  11329. async function mappingRecognize(doc = document) {
  11330. var _a, _b;
  11331. let typrMapping = /* @__PURE__ */ Object.create({});
  11332. try {
  11333. top.typrMapping = top.typrMapping || await loadTyprMapping();
  11334. typrMapping = top.typrMapping;
  11335. } catch {
  11336. typrMapping = await loadTyprMapping();
  11337. }
  11338. const fontFaceEl = Array.from(doc.head.querySelectorAll("style")).find(
  11339. (style) => {
  11340. var _a2;
  11341. return (_a2 = style.textContent) == null ? void 0 : _a2.includes("font-cxsecret");
  11342. }
  11343. );
  11344. const base64ToUint8Array = (base64) => {
  11345. const data = window.atob(base64);
  11346. const buffer = new Uint8Array(data.length);
  11347. for (let i = 0; i < data.length; ++i) {
  11348. buffer[i] = data.charCodeAt(i);
  11349. }
  11350. return buffer;
  11351. };
  11352. const fontMap = typrMapping;
  11353. if (fontFaceEl && Object.keys(fontMap).length > 0) {
  11354. const font = (_b = (_a = fontFaceEl.textContent) == null ? void 0 : _a.match(/base64,([\w\W]+?)'/)) == null ? void 0 : _b[1];
  11355. if (font) {
  11356. $console.log("\u6B63\u5728\u8BC6\u522B\u7E41\u4F53\u5B57");
  11357. const code = typr_js.parse(base64ToUint8Array(font));
  11358. const match = {};
  11359. for (let i = 19968; i < 40870; i++) {
  11360. const Glyph = typr_js.U.codeToGlyph(code, i);
  11361. if (!Glyph)
  11362. continue;
  11363. const path = typr_js.U.glyphToPath(code, Glyph);
  11364. const hex = md5(JSON.stringify(path)).slice(24);
  11365. match[i.toString()] = fontMap[hex];
  11366. }
  11367. const fonts = CXAnalyses.getSecretFont(doc);
  11368. fonts.forEach((el2, index) => {
  11369. let html = el2.innerHTML;
  11370. for (const key in match) {
  11371. const word = String.fromCharCode(parseInt(key));
  11372. const value = String.fromCharCode(match[key]);
  11373. while (html.indexOf(word) !== -1) {
  11374. html = html.replace(word, value);
  11375. }
  11376. }
  11377. el2.innerHTML = html;
  11378. el2.classList.remove("font-cxsecret");
  11379. });
  11380. $console.log("\u8BC6\u522B\u7E41\u4F53\u5B57\u5B8C\u6210\u3002");
  11381. } else {
  11382. $console.log("\u672A\u68C0\u6D4B\u5230\u7E41\u4F53\u5B57\u3002");
  11383. }
  11384. }
  11385. }
  11386. async function loadTyprMapping() {
  11387. try {
  11388. $console.log("\u6B63\u5728\u52A0\u8F7D\u7E41\u4F53\u5B57\u5E93\u3002");
  11389. return await request("https://cdn.ocsjs.com/resources/font/table.json", {
  11390. type: "GM_xmlhttpRequest",
  11391. method: "get",
  11392. responseType: "json"
  11393. });
  11394. } catch (err) {
  11395. $console.error("\u8F7D\u7E41\u4F53\u5B57\u5E93\u52A0\u8F7D\u5931\u8D25\uFF0C\u8BF7\u5237\u65B0\u9875\u9762\u91CD\u8BD5\uFF1A", String(err));
  11396. }
  11397. }
  11398. const CXAnalyses = {
  11399. isInSpecialMode() {
  11400. return Array.from((top == null ? void 0 : top.document.querySelectorAll(".catalog_points_sa,.catalog_points_er")) || []).length !== 0;
  11401. },
  11402. isStuckInBreakingMode() {
  11403. if (this.isInSpecialMode()) {
  11404. const chapter = top == null ? void 0 : top.document.querySelector(".posCatalog_active");
  11405. if (chapter) {
  11406. chapter.finish_count = chapter.finish_count ? chapter.finish_count + 1 : 1;
  11407. if (chapter.finish_count >= 2) {
  11408. chapter.finish_count = 1;
  11409. return true;
  11410. }
  11411. }
  11412. }
  11413. return false;
  11414. },
  11415. isInFinalTab() {
  11416. const tabs = Array.from((top == null ? void 0 : top.document.querySelectorAll(".prev_ul li")) || []);
  11417. return tabs.length && tabs[tabs.length - 1].classList.contains("active");
  11418. },
  11419. isInFinalChapter() {
  11420. var _a;
  11421. return (_a = Array.from((top == null ? void 0 : top.document.querySelectorAll(".posCatalog_select")) || []).pop()) == null ? void 0 : _a.classList.contains("posCatalog_active");
  11422. },
  11423. isFinishedAllChapters() {
  11424. return this.getChapterInfos().every((chapter) => chapter.unFinishCount === 0);
  11425. },
  11426. getChapterInfos() {
  11427. return Array.from((top == null ? void 0 : top.document.querySelectorAll('[onclick^="getTeacherAjax"]')) || []).map((el2) => {
  11428. var _a, _b, _c;
  11429. return {
  11430. chapterId: (_b = (_a = el2.getAttribute("onclick")) == null ? void 0 : _a.match(/\('(.*)','(.*)','(.*)'\)/)) == null ? void 0 : _b[3],
  11431. unFinishCount: parseInt(((_c = el2.parentElement.querySelector(".jobUnfinishCount")) == null ? void 0 : _c.value) || "0")
  11432. };
  11433. });
  11434. },
  11435. getSecretFont(doc = document) {
  11436. return Array.from(doc.querySelectorAll(".font-cxsecret")).map((font) => {
  11437. const after = font.querySelector(".after");
  11438. return after === null ? font : after;
  11439. });
  11440. }
  11441. };
  11442. function rateHack() {
  11443. state$2.study.hacked = false;
  11444. let dragCount = 0;
  11445. try {
  11446. hack();
  11447. window.document.addEventListener("readystatechange", hack);
  11448. window.addEventListener("load", hack);
  11449. } catch (e) {
  11450. console.error(e);
  11451. }
  11452. function hack() {
  11453. const videojs = $gm.unsafeWindow.videojs;
  11454. const Ext = $gm.unsafeWindow.Ext;
  11455. if (typeof videojs !== "undefined" && typeof Ext !== "undefined") {
  11456. if (state$2.study.hacked) {
  11457. return;
  11458. }
  11459. state$2.study.hacked = true;
  11460. const _origin = videojs.getPlugin("seekBarControl");
  11461. const plugin = videojs.extend(videojs.getPlugin("plugin"), {
  11462. constructor: function(videoExt, data) {
  11463. const _sendLog = data.sendLog;
  11464. data.sendLog = (...args) => {
  11465. var _a;
  11466. if (args[1] === "drag") {
  11467. dragCount++;
  11468. if (dragCount > 100) {
  11469. dragCount = 0;
  11470. (_a = $el("video")) == null ? void 0 : _a.pause();
  11471. }
  11472. } else {
  11473. _sendLog.apply(data, args);
  11474. }
  11475. };
  11476. _origin.apply(_origin.prototype, [videoExt, data]);
  11477. }
  11478. });
  11479. videojs.registerPlugin("seekBarControl", plugin);
  11480. Ext.define("ans.VideoJs", {
  11481. override: "ans.VideoJs",
  11482. constructor: function(data) {
  11483. this.addEvents(["seekstart"]);
  11484. this.mixins.observable.constructor.call(this, data);
  11485. const vjs = videojs(data.videojs, this.params2VideoOpt(data.params), function() {
  11486. });
  11487. Ext.fly(data.videojs).on("contextmenu", function(f) {
  11488. f.preventDefault();
  11489. });
  11490. Ext.fly(data.videojs).on("keydown", function(f) {
  11491. if (f.keyCode === 32 || f.keyCode === 37 || f.keyCode === 39 || f.keyCode === 107) {
  11492. f.preventDefault();
  11493. }
  11494. });
  11495. if (vjs.videoJsResolutionSwitcher) {
  11496. vjs.on("resolutionchange", function() {
  11497. const cr = vjs.currentResolution();
  11498. const re2 = cr.sources ? cr.sources[0].res : false;
  11499. Ext.setCookie("resolution", re2);
  11500. });
  11501. }
  11502. if (vjs.videoJsPlayLine) {
  11503. vjs.on("playlinechange", function() {
  11504. const cp = vjs.currentPlayline();
  11505. Ext.setCookie("net", cp.net);
  11506. });
  11507. }
  11508. }
  11509. });
  11510. }
  11511. }
  11512. }
  11513. async function study(opts) {
  11514. var _a;
  11515. await $.sleep(3e3);
  11516. const searchedJobs = [];
  11517. let searching = true;
  11518. let attachmentCount = ((_a = $gm.unsafeWindow.attachments) == null ? void 0 : _a.length) || 0;
  11519. setTimeout(() => {
  11520. searching = false;
  11521. }, 10 * 1e3);
  11522. const runJobs = async () => {
  11523. const job = searchJob(opts, searchedJobs);
  11524. if (job && job.func) {
  11525. try {
  11526. await job.func();
  11527. } catch (e) {
  11528. $console.error("\u672A\u77E5\u9519\u8BEF", e);
  11529. }
  11530. await $.sleep(1e3);
  11531. await runJobs();
  11532. } else if (attachmentCount > 0) {
  11533. attachmentCount--;
  11534. await $.sleep(1e3);
  11535. await runJobs();
  11536. } else if (searching) {
  11537. await $.sleep(1e3);
  11538. await runJobs();
  11539. }
  11540. };
  11541. await runJobs();
  11542. top._preChapterId = "";
  11543. const next2 = () => {
  11544. var _a2;
  11545. const curCourseId = $el("#curCourseId", top == null ? void 0 : top.document);
  11546. const curChapterId = $el("#curChapterId", top == null ? void 0 : top.document);
  11547. const curClazzId = $el("#curClazzId", top == null ? void 0 : top.document);
  11548. const count = $$el("#prev_tab .prev_ul li", top == null ? void 0 : top.document);
  11549. if (CXAnalyses.isInFinalTab()) {
  11550. if (CXAnalyses.isStuckInBreakingMode()) {
  11551. return $modal("alert", {
  11552. content: "\u68C0\u6D4B\u5230\u6B64\u7AE0\u8282\u91CD\u590D\u8FDB\u5165, \u4E3A\u4E86\u907F\u514D\u65E0\u9650\u91CD\u590D, \u8BF7\u81EA\u884C\u624B\u52A8\u5B8C\u6210\u540E\u624B\u52A8\u70B9\u51FB\u4E0B\u4E00\u7AE0, \u6216\u8005\u5237\u65B0\u91CD\u8BD5\u3002"
  11553. });
  11554. }
  11555. }
  11556. if (CXAnalyses.isInFinalChapter()) {
  11557. if (CXAnalyses.isFinishedAllChapters()) {
  11558. $modal("alert", { content: "\u5168\u90E8\u4EFB\u52A1\u70B9\u5DF2\u5B8C\u6210\uFF01" });
  11559. } else {
  11560. $modal("alert", { content: "\u5DF2\u7ECF\u62B5\u8FBE\u6700\u540E\u4E00\u4E2A\u7AE0\u8282\uFF01\u4F46\u4ECD\u7136\u6709\u4EFB\u52A1\u70B9\u672A\u5B8C\u6210\uFF0C\u8BF7\u624B\u52A8\u5207\u6362\u81F3\u672A\u5B8C\u6210\u7684\u7AE0\u8282\u3002" });
  11561. }
  11562. } else {
  11563. if (curChapterId && curCourseId && curClazzId) {
  11564. top._preChapterId = curChapterId.value;
  11565. (_a2 = $gm.unsafeWindow.top) == null ? void 0 : _a2.PCount.next(
  11566. count.length.toString(),
  11567. curChapterId.value,
  11568. curCourseId.value,
  11569. curClazzId.value,
  11570. ""
  11571. );
  11572. } else {
  11573. $console.warn("\u53C2\u6570\u9519\u8BEF\uFF0C\u65E0\u6CD5\u8DF3\u8F6C\u4E0B\u4E00\u7AE0\uFF0C\u8BF7\u5C1D\u8BD5\u624B\u52A8\u5207\u6362\u3002");
  11574. }
  11575. }
  11576. };
  11577. if (CXProject.scripts.study.cfg.autoNextPage) {
  11578. $console.info("\u9875\u9762\u4EFB\u52A1\u70B9\u5DF2\u5B8C\u6210\uFF0C\u5373\u5C06\u5207\u6362\u4E0B\u4E00\u7AE0\u3002");
  11579. await $.sleep(5e3);
  11580. next2();
  11581. } else {
  11582. $console.warn("\u9875\u9762\u4EFB\u52A1\u70B9\u5DF2\u5B8C\u6210\uFF0C\u81EA\u52A8\u4E0B\u4E00\u7AE0\u5DF2\u5173\u95ED\uFF0C\u8BF7\u624B\u52A8\u5207\u6362\u3002");
  11583. }
  11584. }
  11585. function searchIFrame(root2) {
  11586. var _a, _b;
  11587. let list = Array.from(root2.querySelectorAll("iframe"));
  11588. const result = [];
  11589. while (list.length) {
  11590. const frame = list.shift();
  11591. try {
  11592. if (frame && ((_a = frame == null ? void 0 : frame.contentWindow) == null ? void 0 : _a.document)) {
  11593. result.push(frame);
  11594. const frames = (_b = frame == null ? void 0 : frame.contentWindow) == null ? void 0 : _b.document.querySelectorAll("iframe");
  11595. list = list.concat(Array.from(frames || []));
  11596. }
  11597. } catch (e) {
  11598. console.log(e.message);
  11599. }
  11600. }
  11601. return result;
  11602. }
  11603. function searchJob(opts, searchedJobs) {
  11604. const knowCardWin = $gm.unsafeWindow;
  11605. const searchJobElement = (root2) => {
  11606. return domSearch(
  11607. {
  11608. media: "video,audio",
  11609. chapterTest: ".TiMu",
  11610. read: "#img.imglook"
  11611. },
  11612. root2.contentWindow.document
  11613. );
  11614. };
  11615. const search = (root2) => {
  11616. const win = root2.contentWindow;
  11617. const { media, read, chapterTest } = searchJobElement(root2);
  11618. if (win && (media || read || chapterTest)) {
  11619. const doc = win.document;
  11620. const attachment = knowCardWin.attachments[getValidNumber(win._jobindex, win.parent._jobindex)];
  11621. if (attachment && searchedJobs.find((job2) => job2.mid === attachment.property.mid) === void 0) {
  11622. const { name, title, bookname, author } = attachment.property;
  11623. const jobName = name || title || (bookname ? bookname + author : void 0) || "\u672A\u77E5\u4EFB\u52A1";
  11624. let func;
  11625. if (media) {
  11626. if (!CXProject.scripts.study.cfg.enableMedia) {
  11627. $console.warn(`\u97F3\u89C6\u9891\u81EA\u52A8\u5B66\u4E60\u529F\u80FD\u5DF2\u5173\u95ED\u3002${jobName} \u5373\u5C06\u8DF3\u8FC7`);
  11628. } else {
  11629. if (opts.restudy || attachment.job) {
  11630. func = () => {
  11631. $console.log(`\u5373\u5C06${opts.restudy ? "\u91CD\u65B0" : ""}\u64AD\u653E : `, jobName);
  11632. return mediaTask(opts, media, doc);
  11633. };
  11634. }
  11635. }
  11636. } else if (chapterTest) {
  11637. if (!CXProject.scripts.study.cfg.enableChapterTest) {
  11638. $console.warn(`\u7AE0\u8282\u6D4B\u8BD5\u81EA\u52A8\u7B54\u9898\u529F\u80FD\u5DF2\u5173\u95ED\u3002${jobName} \u5373\u5C06\u8DF3\u8FC7`);
  11639. } else {
  11640. const status = win.document.querySelector(".testTit_status");
  11641. const needWorkButNoJob = attachment.job === void 0 && (status == null ? void 0 : status.classList.contains(".testTit_status_complete")) === false;
  11642. if (attachment.job || needWorkButNoJob) {
  11643. if (attachment.job || needWorkButNoJob && CommonProject.scripts.settings.cfg["work-when-no-job"]) {
  11644. func = () => {
  11645. $console.log("\u5F00\u59CB\u7B54\u9898 : ", jobName);
  11646. return chapterTestTask(root2, opts.workOptions);
  11647. };
  11648. }
  11649. if (needWorkButNoJob && CommonProject.scripts.settings.cfg["work-when-no-job"] === false) {
  11650. $console.warn(
  11651. `\u5F53\u524D\u4F5C\u4E1A ${jobName} \u4E0D\u662F\u4EFB\u52A1\u70B9\uFF0C\u4F46\u5F85\u5B8C\u6210\uFF0C\u5982\u9700\u5F00\u542F\u81EA\u52A8\u7B54\u9898\u8BF7\u524D\u5F80\uFF1A\u901A\u7528-\u5168\u5C40\u8BBE\u7F6E\uFF0C\u5F00\u542F\u5F3A\u5236\u7B54\u9898\u3002`
  11652. );
  11653. }
  11654. }
  11655. }
  11656. } else if (read) {
  11657. if (!CXProject.scripts.study.cfg.enablePPT) {
  11658. $console.warn(`PPT/\u4E66\u7C4D\u9605\u8BFB\u529F\u80FD\u5DF2\u5173\u95ED\u3002${jobName} \u5373\u5C06\u8DF3\u8FC7`);
  11659. } else {
  11660. if (attachment.job) {
  11661. func = () => {
  11662. $console.log("\u6B63\u5728\u5B66\u4E60 \uFF1A", jobName);
  11663. return readTask(win);
  11664. };
  11665. }
  11666. }
  11667. }
  11668. const job2 = {
  11669. mid: attachment.property.mid,
  11670. attachment,
  11671. func
  11672. };
  11673. searchedJobs.push(job2);
  11674. return job2;
  11675. }
  11676. } else {
  11677. return void 0;
  11678. }
  11679. };
  11680. let job;
  11681. for (const iframe of searchIFrame(knowCardWin.document)) {
  11682. job = search(iframe);
  11683. if (job) {
  11684. return job;
  11685. }
  11686. }
  11687. return job;
  11688. }
  11689. function fixedVideoProgress() {
  11690. if (state$2.study.videojs) {
  11691. const { bar } = domSearch({ bar: ".vjs-control-bar" }, state$2.study.videojs);
  11692. if (bar) {
  11693. bar.style.opacity = "1";
  11694. }
  11695. }
  11696. }
  11697. async function mediaTask(setting, media, doc) {
  11698. const { playbackRate = 1, volume: volume2 = 0 } = setting;
  11699. const { videojs } = domSearch({ videojs: "#video,#audio" }, doc);
  11700. if (!videojs) {
  11701. $console.error("\u89C6\u9891\u68C0\u6D4B\u4E0D\u5230\uFF0C\u8BF7\u5C1D\u8BD5\u5237\u65B0\u6216\u8005\u624B\u52A8\u5207\u6362\u4E0B\u4E00\u7AE0\u3002");
  11702. return;
  11703. }
  11704. state$2.study.videojs = videojs;
  11705. top.currentMedia = media;
  11706. fixedVideoProgress();
  11707. let reloadInterval;
  11708. if (setting.reloadVideoWhenError) {
  11709. reloadInterval = setInterval(() => {
  11710. if (doc.documentElement.innerText.includes("\u7F51\u7EDC\u9519\u8BEF\u5BFC\u81F4\u89C6\u9891\u4E0B\u8F7D\u4E2D\u9014\u5931\u8D25")) {
  11711. $console.error("\u89C6\u9891\u52A0\u8F7D\u5931\u8D25\uFF0C\u5373\u5C06\u5237\u65B0\u9875\u9762");
  11712. setTimeout(() => {
  11713. location.reload();
  11714. }, 3e3);
  11715. }
  11716. }, 5e3);
  11717. }
  11718. await new Promise((resolve, reject) => {
  11719. const playFunction = async () => {
  11720. if (!media.ended) {
  11721. await $.sleep(1e3);
  11722. media.play();
  11723. media.playbackRate = playbackRate;
  11724. }
  11725. };
  11726. media.addEventListener("pause", playFunction);
  11727. media.addEventListener("ended", () => {
  11728. $console.log("\u89C6\u9891\u64AD\u653E\u5B8C\u6BD5");
  11729. media.removeEventListener("pause", playFunction);
  11730. clearInterval(reloadInterval);
  11731. resolve();
  11732. });
  11733. $console.log("\u89C6\u9891\u5F00\u59CB\u64AD\u653E");
  11734. media.volume = volume2;
  11735. playMedia(() => media.play()).then(() => {
  11736. media.playbackRate = playbackRate;
  11737. }).catch(reject);
  11738. });
  11739. }
  11740. async function readTask(win) {
  11741. const finishJob = win.finishJob;
  11742. if (finishJob)
  11743. finishJob();
  11744. await $.sleep(3e3);
  11745. }
  11746. async function chapterTestTask(frame, { answererWrappers, period, upload, thread, stopSecondWhenFinish, redundanceWordsText }) {
  11747. if (answererWrappers === void 0 || answererWrappers.length === 0) {
  11748. return $console.warn("\u68C0\u6D4B\u5230\u9898\u5E93\u914D\u7F6E\u4E3A\u7A7A\uFF0C\u65E0\u6CD5\u81EA\u52A8\u7B54\u9898\uFF0C\u8BF7\u524D\u5F80 \u201C\u901A\u7528-\u5168\u5C40\u8BBE\u7F6E\u201D \u9875\u9762\u8FDB\u884C\u914D\u7F6E\u3002");
  11749. }
  11750. $console.info("\u5F00\u59CB\u7AE0\u8282\u6D4B\u8BD5");
  11751. const frameWindow = frame.contentWindow;
  11752. const { TiMu } = domSearchAll({ TiMu: ".TiMu" }, frameWindow.document);
  11753. CommonProject.scripts.workResults.methods.init();
  11754. const chapterTestTaskQuestionTitleTransform = (titles) => {
  11755. const transformed = StringUtils.of(
  11756. titles.map((t2) => t2 ? optimizationElementWithImage(t2).innerText : "").join(",")
  11757. ).nowrap().nospace().toString().trim().replace(/^\d+[。、.]/, "").replace(/(\d+.\d+分)/, "").replace(/\(..题, .+?分\)/, "").replace(/[[(【(](.+题|名词解释|完形填空|阅读理解)[\])】)]/, "").trim();
  11758. return removeRedundantWords(transformed, redundanceWordsText.split("\n"));
  11759. };
  11760. const worker = new OCSWorker({
  11761. root: TiMu,
  11762. elements: {
  11763. title: ".Zy_TItle .clearfix",
  11764. options: "ul li .after,ul li textarea,ul textarea,ul li label:not(.before)",
  11765. type: 'input[id^="answertype"]',
  11766. lineAnswerInput: ".line_answer input[name^=answer]",
  11767. lineSelectBox: ".line_answer_ct .selectBox "
  11768. },
  11769. requestPeriod: period != null ? period : 3,
  11770. resolvePeriod: 0,
  11771. thread: thread != null ? thread : 1,
  11772. answerer: (elements, type, ctx) => {
  11773. const title = chapterTestTaskQuestionTitleTransform(elements.title);
  11774. if (title) {
  11775. return CommonProject.scripts.apps.methods.searchAnswerInCaches(title, () => {
  11776. return defaultAnswerWrapperHandler(answererWrappers, {
  11777. type,
  11778. title,
  11779. options: ctx.elements.options.map((o) => o.innerText).join("\n")
  11780. });
  11781. });
  11782. } else {
  11783. throw new Error("\u9898\u76EE\u4E3A\u7A7A\uFF0C\u8BF7\u67E5\u770B\u9898\u76EE\u662F\u5426\u4E3A\u7A7A\uFF0C\u6216\u8005\u5FFD\u7565\u6B64\u9898");
  11784. }
  11785. },
  11786. work: async (ctx) => {
  11787. var _a;
  11788. const { elements, searchInfos } = ctx;
  11789. const typeInput = elements.type[0];
  11790. const type = typeInput ? getQuestionType(parseInt(typeInput.value)) : void 0;
  11791. if (type && (type === "completion" || type === "multiple" || type === "judgement" || type === "single")) {
  11792. const resolver = defaultQuestionResolve(ctx)[type];
  11793. const handler = (type2, answer, option, ctx2) => {
  11794. var _a2, _b, _c, _d, _e, _f, _g;
  11795. if (type2 === "judgement" || type2 === "single" || type2 === "multiple") {
  11796. const checked = ((_b = (_a2 = option == null ? void 0 : option.parentElement) == null ? void 0 : _a2.querySelector("label input")) == null ? void 0 : _b.getAttribute("checked")) === "checked" || ((_c = option == null ? void 0 : option.parentElement) == null ? void 0 : _c.getAttribute("aria-checked")) === "true";
  11797. if (checked)
  11798. ;
  11799. else {
  11800. option == null ? void 0 : option.click();
  11801. }
  11802. } else if (type2 === "completion" && answer.trim()) {
  11803. const text = (_d = option == null ? void 0 : option.parentElement) == null ? void 0 : _d.querySelector("textarea");
  11804. const textareaFrame = (_e = option == null ? void 0 : option.parentElement) == null ? void 0 : _e.querySelector("iframe");
  11805. if (text) {
  11806. text.value = answer;
  11807. }
  11808. if (textareaFrame == null ? void 0 : textareaFrame.contentDocument) {
  11809. textareaFrame.contentDocument.body.innerHTML = answer;
  11810. }
  11811. if ((_f = option == null ? void 0 : option.parentElement) == null ? void 0 : _f.parentElement) {
  11812. (_g = $el("[onclick*=saveQuestion]", option.parentElement.parentElement)) == null ? void 0 : _g.click();
  11813. }
  11814. }
  11815. };
  11816. return await resolver(
  11817. searchInfos,
  11818. elements.options.map((option) => optimizationElementWithImage(option)),
  11819. handler
  11820. );
  11821. } else if (type && type === "line") {
  11822. for (const answers of searchInfos.map((info) => info.results.map((res) => res.answer))) {
  11823. let ans = answers;
  11824. if (ans.length === 1) {
  11825. ans = splitAnswer(ans[0]);
  11826. }
  11827. if (ans.filter(Boolean).length !== 0 && elements.lineAnswerInput) {
  11828. for (let index = 0; index < elements.lineSelectBox.length; index++) {
  11829. const box = elements.lineSelectBox[index];
  11830. if (ans[index]) {
  11831. (_a = $el(`li[data=${ans[index]}] a`, box)) == null ? void 0 : _a.click();
  11832. await $.sleep(200);
  11833. }
  11834. }
  11835. return { finish: true };
  11836. }
  11837. }
  11838. return { finish: false };
  11839. }
  11840. return { finish: false };
  11841. },
  11842. async onResultsUpdate(res, curr) {
  11843. var _a, _b, _c, _d, _e, _f, _g, _h, _i;
  11844. CommonProject.scripts.workResults.methods.setResults(
  11845. simplifyWorkResult(res, chapterTestTaskQuestionTitleTransform)
  11846. );
  11847. if (!((_a = curr.result) == null ? void 0 : _a.finish) && curr.resolving === false) {
  11848. const options = ((_c = (_b = curr.ctx) == null ? void 0 : _b.elements) == null ? void 0 : _c.options) || [];
  11849. const typeInput = (_e = (_d = curr.ctx) == null ? void 0 : _d.elements) == null ? void 0 : _e.type[0];
  11850. const type = typeInput ? getQuestionType(parseInt(typeInput.value)) : void 0;
  11851. const commonSetting = CommonProject.scripts.settings.cfg;
  11852. if (commonSetting["randomWork-choice"] && (type === "judgement" || type === "single" || type === "multiple")) {
  11853. $console.log("\u6B63\u5728\u968F\u673A\u4F5C\u7B54");
  11854. const option = options[Math.floor(Math.random() * options.length)];
  11855. (_g = (_f = option == null ? void 0 : option.parentElement) == null ? void 0 : _f.querySelector("a,label")) == null ? void 0 : _g.click();
  11856. } else if (commonSetting["randomWork-complete"] && type === "completion") {
  11857. $console.log("\u6B63\u5728\u968F\u673A\u4F5C\u7B54");
  11858. for (const option of options) {
  11859. const textarea = (_h = option == null ? void 0 : option.parentElement) == null ? void 0 : _h.querySelector("textarea");
  11860. const completeTexts = commonSetting["randomWork-completeTexts-textarea"].split("\n").filter(Boolean);
  11861. const text = completeTexts[Math.floor(Math.random() * completeTexts.length)];
  11862. const textareaFrame = (_i = option == null ? void 0 : option.parentElement) == null ? void 0 : _i.querySelector("iframe");
  11863. if (text) {
  11864. if (textarea) {
  11865. textarea.value = text;
  11866. }
  11867. if (textareaFrame == null ? void 0 : textareaFrame.contentDocument) {
  11868. textareaFrame.contentDocument.body.innerHTML = text;
  11869. }
  11870. } else {
  11871. $console.error("\u8BF7\u8BBE\u7F6E\u968F\u673A\u586B\u7A7A\u7684\u6587\u6848");
  11872. }
  11873. await $.sleep(500);
  11874. }
  11875. }
  11876. }
  11877. },
  11878. onResolveUpdate(res) {
  11879. var _a;
  11880. if ((_a = res.result) == null ? void 0 : _a.finish) {
  11881. CommonProject.scripts.apps.methods.addQuestionCacheFromWorkResult(
  11882. simplifyWorkResult([res], chapterTestTaskQuestionTitleTransform)
  11883. );
  11884. }
  11885. CommonProject.scripts.workResults.methods.updateWorkState(worker);
  11886. },
  11887. async onElementSearched(elements) {
  11888. const typeInput = elements.type[0];
  11889. const type = typeInput ? getQuestionType(parseInt(typeInput.value)) : void 0;
  11890. if (type === "judgement") {
  11891. elements.options.forEach((option) => {
  11892. if (option.innerText.includes("\u5BF9") || option.innerText.includes("\u9519"))
  11893. ;
  11894. else {
  11895. const ri = option.querySelector(".ri");
  11896. const span = document.createElement("span");
  11897. span.innerText = ri ? "\u221A" : "\xD7";
  11898. option.appendChild(span);
  11899. }
  11900. });
  11901. }
  11902. }
  11903. });
  11904. const results = await worker.doWork();
  11905. $console.info(`\u7B54\u9898\u5B8C\u6210\uFF0C\u5C06\u7B49\u5F85 ${stopSecondWhenFinish} \u79D2\u540E\u8FDB\u884C\u4FDD\u5B58\u6216\u63D0\u4EA4\u3002`);
  11906. await $.sleep(stopSecondWhenFinish * 1e3);
  11907. await worker.uploadHandler({
  11908. type: upload,
  11909. results,
  11910. async callback(finishedRate, uploadable) {
  11911. $console.info(`\u5B8C\u6210\u7387 ${finishedRate.toFixed(2)} : ${uploadable ? "5\u79D2\u540E\u5C06\u81EA\u52A8\u63D0\u4EA4" : "5\u79D2\u540E\u5C06\u81EA\u52A8\u4FDD\u5B58"} `);
  11912. await $.sleep(5e3);
  11913. if (uploadable) {
  11914. frameWindow.btnBlueSubmit();
  11915. await $.sleep(3e3);
  11916. frameWindow.submitCheckTimes();
  11917. } else {
  11918. frameWindow.alert = () => {
  11919. };
  11920. frameWindow.noSubmit();
  11921. }
  11922. }
  11923. });
  11924. worker.emit("done");
  11925. }
  11926. function getValidNumber(...nums) {
  11927. return nums.map((num) => typeof num === "number" ? num : void 0).find((num) => num !== void 0);
  11928. }
  11929. function getQuestionType(val) {
  11930. return val === 0 ? "single" : val === 1 ? "multiple" : val === 3 ? "judgement" : [2, 4, 5, 6, 7, 8, 9, 10].some((t2) => t2 === val) ? "completion" : val === 11 ? "line" : val === 14 ? "fill" : val === 15 ? "reader" : void 0;
  11931. }
  11932. async function readerAndFillHandle(searchInfos, list) {
  11933. var _a;
  11934. for (const answers of searchInfos.map((info) => info.results.map((res) => res.answer))) {
  11935. let ans = answers;
  11936. if (ans.length === 1) {
  11937. ans = splitAnswer(ans[0]);
  11938. }
  11939. if (ans.filter(Boolean).length !== 0 && list.length !== 0) {
  11940. for (let index = 0; index < ans.length; index++) {
  11941. const item = list[index];
  11942. if (item) {
  11943. (_a = $el(`span.saveSingleSelect[data="${ans[index]}"]`, item)) == null ? void 0 : _a.click();
  11944. await $.sleep(200);
  11945. }
  11946. }
  11947. return { finish: true };
  11948. }
  11949. }
  11950. return { finish: false };
  11951. }
  11952. const state$1 = {
  11953. study: {
  11954. currentMedia: void 0,
  11955. currentStudyLockId: 0
  11956. }
  11957. };
  11958. const _StudyLock = class {
  11959. constructor() {
  11960. _StudyLock.auto_inc++;
  11961. this.id = _StudyLock.auto_inc;
  11962. state$1.study.currentStudyLockId = this.id;
  11963. }
  11964. canStudy() {
  11965. return this.id === state$1.study.currentStudyLockId;
  11966. }
  11967. static getLock() {
  11968. return new _StudyLock();
  11969. }
  11970. };
  11971. let StudyLock = _StudyLock;
  11972. StudyLock.auto_inc = 0;
  11973. const IcveMoocProject = Project.create({
  11974. name: "\u667A\u6167\u804C\u6559(MOOC\u5B66\u9662)",
  11975. domains: [
  11976. "icve.com.cn",
  11977. "course.icve.com.cn",
  11978. "courshare.cn"
  11979. ],
  11980. studyProject: true,
  11981. scripts: {
  11982. guide: new Script({
  11983. name: "\u{1F4A1} \u4F7F\u7528\u63D0\u793A",
  11984. url: [
  11985. ["\u4E2A\u4EBA\u9996\u9875", "user.icve.com.cn"],
  11986. ["\u9996\u9875", "mooc.icve.com.cn"]
  11987. ],
  11988. namespace: "icve.guide",
  11989. configs: {
  11990. notes: {
  11991. defaultValue: $creator.notes(["\u8BF7\u70B9\u51FB\u4EFB\u610F\u8BFE\u7A0B\u8FDB\u5165\u3002"]).outerHTML
  11992. }
  11993. },
  11994. oncomplete() {
  11995. CommonProject.scripts.render.methods.pin(this);
  11996. }
  11997. }),
  11998. study: new Script({
  11999. name: "\u{1F5A5}\uFE0F \u8BFE\u7A0B\u5B66\u4E60",
  12000. namespace: "icve.study.main",
  12001. url: [["\u8BFE\u7A0B\u5B66\u4E60\u9875\u9762", "/learnspace/learn/learn/templateeight/index.action"]],
  12002. configs: {
  12003. notes: {
  12004. defaultValue: $creator.notes([
  12005. "\u5982\u679C\u89C6\u9891\u65E0\u6CD5\u64AD\u653E\uFF0C\u53EF\u4EE5\u624B\u52A8\u70B9\u51FB\u5176\u4ED6\u4EFB\u52A1\u8DF3\u8FC7\u89C6\u9891\u3002",
  12006. "\u7ECF\u8FC7\u6D4B\u8BD5\u89C6\u9891\u500D\u901F\u6700\u591A\u4E8C\u500D\uFF0C\u5426\u5219\u4F1A\u5224\u5B9A\u65E0\u6548\u3002",
  12007. "\u624B\u52A8\u8FDB\u5165\u4F5C\u4E1A\u9875\u9762\u624D\u80FD\u4F7F\u7528\u81EA\u52A8\u7B54\u9898\u3002"
  12008. ]).outerHTML
  12009. },
  12010. playbackRate: {
  12011. label: "\u89C6\u9891\u500D\u901F",
  12012. attrs: {
  12013. type: "range",
  12014. step: 0.5,
  12015. min: 1,
  12016. max: 16
  12017. },
  12018. defaultValue: 1,
  12019. onload() {
  12020. createRangeTooltip(
  12021. this,
  12022. "1",
  12023. (val) => (parseFloat(val) > 2 ? `${val}x - \u9AD8\u500D\u901F\u8B66\u544A\uFF01` : `${val}x`) + "\u9AD8\u500D\u901F\u53EF\u80FD\u5BFC\u81F4\u89C6\u9891\u65E0\u6CD5\u5B8C\u6210\u3002"
  12024. );
  12025. }
  12026. },
  12027. volume,
  12028. restudy,
  12029. showScrollBar: {
  12030. label: "\u663E\u793A\u53F3\u4FA7\u6EDA\u52A8\u6761",
  12031. attrs: { type: "checkbox" },
  12032. defaultValue: true
  12033. },
  12034. expandAll: {
  12035. label: "\u5C55\u5F00\u6240\u6709\u7AE0\u8282",
  12036. attrs: { type: "checkbox" },
  12037. defaultValue: true
  12038. },
  12039. switchPeriod: {
  12040. label: "\u4E0B\u4E00\u7AE0\u8282\u5207\u6362\u95F4\u9694\uFF08\u79D2\uFF09",
  12041. defaultValue: 10,
  12042. attrs: {
  12043. type: "number",
  12044. min: 0,
  12045. max: 999,
  12046. step: 1
  12047. }
  12048. }
  12049. },
  12050. async oncomplete() {
  12051. var _a;
  12052. CommonProject.scripts.render.methods.pin(this);
  12053. await $.sleep(3e3);
  12054. this.onConfigChange("volume", (v) => state$1.study.currentMedia && (state$1.study.currentMedia.volume = v));
  12055. this.onConfigChange(
  12056. "playbackRate",
  12057. (r) => state$1.study.currentMedia && (state$1.study.currentMedia.playbackRate = parseFloat(r.toString()))
  12058. );
  12059. const mainContentWin = (_a = $el("#mainContent")) == null ? void 0 : _a.contentWindow;
  12060. if (mainContentWin) {
  12061. $modal("confirm", {
  12062. content: el("div", [
  12063. "\u662F\u5426\u5F00\u59CB\u81EA\u52A8\u5B66\u4E60\u5F53\u524D\u7AE0\u8282\uFF1F",
  12064. el("br"),
  12065. "\u4F60\u4E5F\u53EF\u4EE5\u9009\u62E9\u4EFB\u610F\u7684\u7AE0\u8282\u8FDB\u884C\u70B9\u51FB\uFF0C\u811A\u672C\u4F1A\u81EA\u52A8\u5B66\u4E60\uFF0C\u5E76\u4E00\u76F4\u5F80\u4E0B\u5BFB\u627E\u7AE0\u8282\u3002"
  12066. ]),
  12067. cancelButtonText: "\u6211\u60F3\u624B\u52A8\u9009\u62E9\u7AE0\u8282",
  12068. confirmButtonText: "\u5F00\u59CB\u5B66\u4E60",
  12069. async onConfirm() {
  12070. study2(StudyLock.getLock());
  12071. scrollToJob();
  12072. }
  12073. });
  12074. }
  12075. if (this.cfg.showScrollBar) {
  12076. const bar = $el(".dumascroll_area", mainContentWin.document);
  12077. bar && (bar.style.overflow = "auto");
  12078. }
  12079. if (this.cfg.expandAll) {
  12080. $$el(".s_sectionlist,.s_sectionwrap", mainContentWin.document).forEach((el2) => el2.style.display = "block");
  12081. }
  12082. for (const job of $$el(".s_point[itemtype]", mainContentWin.document)) {
  12083. job.addEventListener("click", (e) => {
  12084. const lock = StudyLock.getLock();
  12085. if (e.isTrusted) {
  12086. if (job.getAttribute("itemtype") === "exam") {
  12087. return $message("info", {
  12088. duration: 60,
  12089. content: "\u68C0\u6D4B\u5230\u60A8\u624B\u52A8\u9009\u62E9\u4E86\u4F5C\u4E1A/\u8003\u8BD5\u7AE0\u8282\uFF0C\u5C06\u4E0D\u4F1A\u81EA\u52A8\u8DF3\u8F6C\uFF0C\u8BF7\u5B8C\u6210\u540E\u624B\u52A8\u9009\u62E9\u5176\u4ED6\u7AE0\u8282\uFF0C\u811A\u672C\u4F1A\u81EA\u52A8\u5B66\u4E60\u3002"
  12090. });
  12091. } else {
  12092. $message("info", { content: "\u68C0\u6D4B\u5230\u7AE0\u8282\u5207\u6362\uFF0C\u5373\u5C06\u81EA\u52A8\u5B66\u4E60..." });
  12093. }
  12094. }
  12095. setTimeout(() => {
  12096. study2(lock);
  12097. }, 3e3);
  12098. });
  12099. }
  12100. const scrollToJob = () => {
  12101. var _a2;
  12102. return (_a2 = $el(".s_pointerct", mainContentWin.document)) == null ? void 0 : _a2.scrollIntoView({ behavior: "smooth", block: "center" });
  12103. };
  12104. const study2 = async (studyLock) => {
  12105. var _a2;
  12106. const iframe = $el("iframe", mainContentWin.document);
  12107. const win = iframe == null ? void 0 : iframe.contentWindow;
  12108. if (win) {
  12109. const doc = win.document;
  12110. if (iframe.src.includes("content_video.action") || iframe.src.includes("content_audio.action")) {
  12111. $console.log("\u89C6\u9891/\u97F3\u9891\u64AD\u653E\u4E2D...");
  12112. try {
  12113. const media = await waitForMedia({ root: doc });
  12114. state$1.study.currentMedia = media;
  12115. media.playbackRate = parseFloat(this.cfg.playbackRate.toString());
  12116. media.volume = this.cfg.volume;
  12117. media.currentTime = 0;
  12118. await new Promise((resolve, reject) => {
  12119. try {
  12120. win.jwplayer().onComplete(async () => {
  12121. $console.log("\u89C6\u9891/\u97F3\u9891\u64AD\u653E\u5B8C\u6210\u3002");
  12122. await $.sleep(3e3);
  12123. resolve();
  12124. });
  12125. media.addEventListener("pause", async () => {
  12126. if (!media.ended) {
  12127. await waitForPopupQuestion(doc);
  12128. await $.sleep(1e3);
  12129. playMedia(() => media.play());
  12130. }
  12131. });
  12132. playMedia(() => media.play());
  12133. } catch (err) {
  12134. reject(err);
  12135. }
  12136. });
  12137. } catch (err) {
  12138. $message("error", { content: String(err) });
  12139. }
  12140. } else if (iframe.src.includes("content_doc.action")) {
  12141. await $.sleep(5e3);
  12142. }
  12143. }
  12144. $console.log(this.cfg.switchPeriod + " \u79D2\u540E\u5207\u6362\u4E0B\u4E00\u7AE0\u8282\u3002");
  12145. await $.sleep(this.cfg.switchPeriod * 1e3);
  12146. if (studyLock.canStudy()) {
  12147. let nextEl;
  12148. let isBellowCurrentJob = false;
  12149. const jobs = $$el(".s_point[itemtype]", mainContentWin.document);
  12150. for (let index = 0; index < jobs.length; index++) {
  12151. const job = jobs[index];
  12152. if (job.classList.contains("s_pointerct")) {
  12153. isBellowCurrentJob = true;
  12154. } else if (isBellowCurrentJob) {
  12155. if (job.querySelector(".done_icon_show") === null || this.cfg.restudy) {
  12156. $console.log("\u4E0B\u4E00\u7AE0\uFF1A", job.title || ((_a2 = $el(".s_pointti", job)) == null ? void 0 : _a2.title) || "\u672A\u77E5");
  12157. nextEl = job;
  12158. break;
  12159. }
  12160. }
  12161. }
  12162. if (nextEl) {
  12163. nextEl.click();
  12164. scrollToJob();
  12165. } else {
  12166. $modal("alert", { content: "\u5168\u90E8\u4EFB\u52A1\u5DF2\u5B8C\u6210" });
  12167. }
  12168. }
  12169. };
  12170. }
  12171. }),
  12172. work: new Script({
  12173. name: "\u270D\uFE0F \u4F5C\u4E1A\u8003\u8BD5\u811A\u672C",
  12174. url: [["\u4F5C\u4E1A\u8003\u8BD5\u9875\u9762", "/exam"]],
  12175. namespace: "icve.work",
  12176. configs: {
  12177. notes: {
  12178. defaultValue: $creator.notes([
  12179. "\u81EA\u52A8\u7B54\u9898\u524D\u8BF7\u5728 \u201C\u901A\u7528-\u5168\u5C40\u8BBE\u7F6E\u201D \u4E2D\u8BBE\u7F6E\u9898\u5E93\u914D\u7F6E\u3002",
  12180. "\u53EF\u4EE5\u642D\u914D \u201C\u901A\u7528-\u5728\u7EBF\u641C\u9898\u201D \u4E00\u8D77\u4F7F\u7528\u3002",
  12181. "\u8BF7\u624B\u52A8\u8FDB\u5165\u4F5C\u4E1A\u8003\u8BD5\u9875\u9762\u624D\u80FD\u4F7F\u7528\u81EA\u52A8\u7B54\u9898\u3002"
  12182. ]).outerHTML
  12183. }
  12184. },
  12185. async oncomplete() {
  12186. $message("info", { content: "\u81EA\u52A8\u7B54\u9898\u65F6\u8BF7\u52FF\u5207\u6362\u9898\u76EE\uFF0C\u5426\u5219\u53EF\u80FD\u5BFC\u81F4\u91CD\u590D\u641C\u9898\u6216\u8005\u811A\u672C\u5361\u4E3B\u3002" });
  12187. const resetToBegin = () => {
  12188. var _a;
  12189. (_a = document.querySelectorAll(`.sheet_nums [id*="sheetSeq"]`).item(0)) == null ? void 0 : _a.click();
  12190. };
  12191. commonWork(this, {
  12192. workerProvider: work$1,
  12193. beforeRunning: async () => {
  12194. resetToBegin();
  12195. await $.sleep(1e3);
  12196. },
  12197. onRestart: () => resetToBegin()
  12198. });
  12199. }
  12200. }),
  12201. workDispatcher: new Script({
  12202. name: "\u4F5C\u4E1A\u8C03\u5EA6\u811A\u672C",
  12203. url: [
  12204. ["\u4F5C\u4E1A\u8FDB\u5165\u9875\u9762", "/platformwebapi/student/exam/"],
  12205. ["\u786E\u8BA4\u4F5C\u4E1A\u9875\u9762", "/student/exam/studentExam_studentInfo.action"]
  12206. ],
  12207. hideInPanel: true,
  12208. oncomplete() {
  12209. if (/\/platformwebapi\/student\/exam/.test(window.location.href)) {
  12210. cors.on("icve-work-start", () => {
  12211. setTimeout(() => {
  12212. $gm.unsafeWindow.openExamInfo();
  12213. }, 3e3);
  12214. });
  12215. }
  12216. if (/\/student\/exam\/studentExam_studentInfo.action/.test(window.location.href)) {
  12217. setTimeout(() => {
  12218. $gm.unsafeWindow.enterExamPage();
  12219. }, 3e3);
  12220. }
  12221. }
  12222. })
  12223. }
  12224. });
  12225. function work$1({ answererWrappers, period, thread }) {
  12226. $message("info", { content: "\u5F00\u59CB\u4F5C\u4E1A" });
  12227. CommonProject.scripts.workResults.methods.init();
  12228. const titleTransform = (titles) => {
  12229. return titles.filter((t2) => t2 == null ? void 0 : t2.innerText).map((t2) => {
  12230. var _a, _b;
  12231. if (t2) {
  12232. const title = t2.cloneNode(true);
  12233. (_a = title.querySelector('[name*="questionIndex"]')) == null ? void 0 : _a.remove();
  12234. (_b = title.querySelector(".q_score")) == null ? void 0 : _b.remove();
  12235. return title.innerText.trim().replace(/^、/, "") || "";
  12236. }
  12237. return "";
  12238. }).join(",");
  12239. };
  12240. const workResults = [];
  12241. let totalQuestionCount = 0;
  12242. let requestIndex = 0;
  12243. let resolverIndex = 0;
  12244. const worker = new OCSWorker({
  12245. root: ".q_content",
  12246. elements: {
  12247. title: ".divQuestionTitle",
  12248. options: ".questionOptions .q_option,.questionOptions.divTextarea "
  12249. },
  12250. requestPeriod: period != null ? period : 3,
  12251. resolvePeriod: 1,
  12252. thread: thread != null ? thread : 1,
  12253. answerer: (elements, type, ctx) => {
  12254. const title = titleTransform(elements.title);
  12255. if (title) {
  12256. return CommonProject.scripts.apps.methods.searchAnswerInCaches(title, () => {
  12257. return defaultAnswerWrapperHandler(answererWrappers, {
  12258. type,
  12259. title,
  12260. options: ctx.elements.options.map((o) => o.innerText).join("\n")
  12261. });
  12262. });
  12263. } else {
  12264. throw new Error("\u9898\u76EE\u4E3A\u7A7A\uFF0C\u8BF7\u67E5\u770B\u9898\u76EE\u662F\u5426\u4E3A\u7A7A\uFF0C\u6216\u8005\u5FFD\u7565\u6B64\u9898");
  12265. }
  12266. },
  12267. work: {
  12268. handler(type, answer, option, ctx) {
  12269. var _a, _b;
  12270. if (type === "judgement" || type === "single" || type === "multiple") {
  12271. if (option.querySelector(".checkbox_on") === null) {
  12272. (_a = $el("div", option)) == null ? void 0 : _a.click();
  12273. }
  12274. } else if (type === "completion" && answer.trim()) {
  12275. const text = option.querySelector("textarea");
  12276. const textIframe = option.querySelector('iframe[id*="ueditor"]');
  12277. if (text) {
  12278. text.value = answer;
  12279. }
  12280. if (textIframe) {
  12281. const view = (_b = textIframe.contentWindow) == null ? void 0 : _b.document.querySelector(".view");
  12282. if (view) {
  12283. view.innerText = answer;
  12284. }
  12285. }
  12286. }
  12287. }
  12288. },
  12289. onResultsUpdate(res, currentResult) {
  12290. if (currentResult.result) {
  12291. workResults.push(...simplifyWorkResult([currentResult], titleTransform));
  12292. CommonProject.scripts.workResults.methods.setResults(workResults);
  12293. totalQuestionCount++;
  12294. requestIndex++;
  12295. resolverIndex++;
  12296. }
  12297. },
  12298. onResolveUpdate(res) {
  12299. var _a;
  12300. if ((_a = res.result) == null ? void 0 : _a.finish) {
  12301. CommonProject.scripts.apps.methods.addQuestionCacheFromWorkResult(simplifyWorkResult([res], titleTransform));
  12302. }
  12303. CommonProject.scripts.workResults.methods.updateWorkState({
  12304. totalQuestionCount,
  12305. requestIndex,
  12306. resolverIndex
  12307. });
  12308. }
  12309. });
  12310. const getNextBtn = () => document.querySelector(".paging_next");
  12311. let next2 = getNextBtn();
  12312. (async () => {
  12313. while (next2 && worker.isClose === false) {
  12314. await worker.doWork();
  12315. await $.sleep((period != null ? period : 3) * 1e3);
  12316. next2 = getNextBtn();
  12317. if (next2.style.display === "none") {
  12318. break;
  12319. } else {
  12320. next2 == null ? void 0 : next2.click();
  12321. await $.sleep((period != null ? period : 3) * 1e3);
  12322. }
  12323. }
  12324. $message("info", { content: "\u4F5C\u4E1A/\u8003\u8BD5\u5B8C\u6210\uFF0C\u8BF7\u81EA\u884C\u68C0\u67E5\u540E\u4FDD\u5B58\u6216\u63D0\u4EA4\u3002", duration: 0 });
  12325. worker.emit("done");
  12326. CommonProject.scripts.workResults.cfg.questionPositionSyncHandlerType = "icve";
  12327. })();
  12328. return worker;
  12329. }
  12330. function waitForPopupQuestion(dom) {
  12331. return new Promise((resolve) => {
  12332. const interval = setInterval(() => {
  12333. var _a, _b;
  12334. const el2 = $el(".popup-test", dom);
  12335. if (el2) {
  12336. clearInterval(interval);
  12337. const right_answer = ((_a = $el("#right_answer", el2)) == null ? void 0 : _a.value) || "A";
  12338. for (const answer of right_answer.split("")) {
  12339. const item = $el(`li.test-item-cell[curval="${answer}"]`, el2);
  12340. item == null ? void 0 : item.click();
  12341. }
  12342. (_b = $el('[name="save_btn"]', el2)) == null ? void 0 : _b.click();
  12343. setTimeout(() => {
  12344. var _a2;
  12345. (_a2 = $el('[name="continue_btn"]', el2)) == null ? void 0 : _a2.click();
  12346. resolve();
  12347. }, 3e3);
  12348. }
  12349. }, 1e3);
  12350. });
  12351. }
  12352. const state = {
  12353. studying: false,
  12354. studyingId: ""
  12355. };
  12356. const ZJYProject = Project.create({
  12357. name: "\u804C\u6559\u4E91",
  12358. domains: ["icve.com.cn", "zjy2.icve.com.cn", "zyk.icve.com.cn"],
  12359. studyProject: true,
  12360. scripts: {
  12361. guide: new Script({
  12362. name: "\u{1F5A5}\uFE0F \u4F7F\u7528\u63D0\u793A",
  12363. url: [
  12364. ["\u5B66\u4E60\u9875\u9762", "zjy2.icve.com.cn/study"],
  12365. ["\u8D44\u6E90\u5E93", "zyk.icve.com.cn/icve-study/"]
  12366. ],
  12367. namespace: "zjy.study.guide",
  12368. configs: {
  12369. notes: {
  12370. defaultValue: "\u8BF7\u70B9\u51FB\u4EFB\u610F\u7AE0\u8282\uFF0C\u8FDB\u5165\u5B66\u4E60\u3002"
  12371. }
  12372. }
  12373. }),
  12374. dispatcher: new Script({
  12375. name: "\u8C03\u5EA6\u5668",
  12376. url: [
  12377. ["\u5B66\u4E60\u9875\u9762", "zjy2.icve.com.cn/study"],
  12378. ["\u8D44\u6E90\u5E93", "zyk.icve.com.cn/icve-study/"]
  12379. ],
  12380. hideInPanel: true,
  12381. methods() {
  12382. return {
  12383. dispatch: () => {
  12384. if ([
  12385. "zjy2.icve.com.cn/study/coursePreview/spoccourseIndex/courseware",
  12386. "zyk.icve.com.cn/icve-study/coursePreview/courseware"
  12387. ].some((i) => window.location.href.includes(i))) {
  12388. ZJYProject.scripts.study.methods.main();
  12389. } else if (["icve-study/coursePreview/jobTes"].some((i) => window.location.href.includes(i))) {
  12390. ZJYProject.scripts.work.methods.main();
  12391. }
  12392. }
  12393. };
  12394. },
  12395. onhistorychange(type) {
  12396. if (type === "push") {
  12397. this.methods.dispatch();
  12398. }
  12399. },
  12400. oncomplete() {
  12401. this.methods.dispatch();
  12402. }
  12403. }),
  12404. study: new Script({
  12405. url: [
  12406. ["\u5B66\u4E60\u9875\u9762", "zjy2.icve.com.cn/study/coursePreview/spoccourseIndex/courseware"],
  12407. ["\u8D44\u6E90\u5E93\u5B66\u4E60\u9875\u9762", "zyk.icve.com.cn/icve-study/coursePreview/courseware"]
  12408. ],
  12409. name: "\u270D\uFE0F \u8BFE\u7A0B\u5B66\u4E60",
  12410. namespace: "zjy.study.main",
  12411. configs: {
  12412. notes: {
  12413. defaultValue: $creator.notes([
  12414. ["\u5982\u679C\u811A\u672C\u5361\u6B7B\u6216\u8005\u60A8\u4E0D\u60F3\u5B66\u4E60\uFF0C", "\u53EF\u4EE5\u70B9\u51FB\u5176\u4ED6\u4EFB\u610F\u7AE0\u8282\u7EE7\u7EED\u8FDB\u884C\u5B66\u4E60\u3002"],
  12415. "\u63D0\u793A\uFF1A\u804C\u6559\u4E91\u65E0\u6CD5\u4F7F\u7528\u500D\u901F\u3002"
  12416. ]).outerHTML
  12417. },
  12418. volume
  12419. },
  12420. methods() {
  12421. return {
  12422. main: async () => {
  12423. var _a;
  12424. const id = new URL(window.location.href).searchParams.get("id");
  12425. if (!id) {
  12426. return;
  12427. }
  12428. if (state.studying && id === state.studyingId) {
  12429. return;
  12430. }
  12431. state.studyingId = id;
  12432. state.studying = true;
  12433. await waitForLoad();
  12434. setTimeout(() => {
  12435. var _a2, _b;
  12436. (_a2 = $el(".el-message-box__wrapper")) == null ? void 0 : _a2.remove();
  12437. (_b = $el(".v-modal")) == null ? void 0 : _b.remove();
  12438. }, 3e3);
  12439. await waitForLoad();
  12440. const courseInfo = await start();
  12441. if (!courseInfo)
  12442. return;
  12443. $message("success", { content: "\u5F00\u59CB\u5B66\u4E60\uFF1A" + courseInfo.name });
  12444. $console.info("\u5F00\u59CB\u5B66\u4E60\uFF1A" + courseInfo.name);
  12445. if (["ppt", "doc", "pptx", "docx", "pdf"].some((i) => courseInfo.fileType === i)) {
  12446. await watchFile();
  12447. } else if (["video", "audio", "mp4"].some((i) => courseInfo.fileType === i)) {
  12448. if ((_a = $el(".guide")) == null ? void 0 : _a.innerHTML.includes("\u5F88\u62B1\u6B49\uFF0C\u60A8\u7684\u6D4F\u89C8\u5668\u4E0D\u652F\u6301\u64AD\u653E\u6B64\u7C7B\u6587\u4EF6")) {
  12449. $console.error(`\u4EFB\u52A1\u70B9 ${courseInfo.name}\uFF0C\u4E0D\u652F\u6301\u64AD\u653E\u3002`);
  12450. } else {
  12451. await watchMedia(this.cfg.volume);
  12452. }
  12453. } else {
  12454. $console.error(`\u672A\u77E5\u7684\u4EFB\u52A1\u70B9 ${courseInfo.name}\uFF0C\u7C7B\u578B ${courseInfo.fileType}\uFF0C\u8BF7\u8DDF\u4F5C\u8005\u8FDB\u884C\u53CD\u9988\u3002`);
  12455. }
  12456. $console.info("\u4EFB\u52A1\u70B9\u7ED3\u675F\uFF0C\u4E09\u79D2\u540E\u4E0B\u4E00\u7AE0");
  12457. await $.sleep(3e3);
  12458. await next();
  12459. }
  12460. };
  12461. }
  12462. }),
  12463. work: new Script({
  12464. url: [["\u4F5C\u4E1A\u9875\u9762", "icve-study/coursePreview/jobTes"]],
  12465. name: "\u270D\uFE0F \u4F5C\u4E1A\u811A\u672C",
  12466. namespace: "zjy.work.main",
  12467. configs: {
  12468. notes: {
  12469. defaultValue: $creator.notes([
  12470. "\u81EA\u52A8\u7B54\u9898\u524D\u8BF7\u5728 \u201C\u901A\u7528-\u5168\u5C40\u8BBE\u7F6E\u201D \u4E2D\u8BBE\u7F6E\u9898\u5E93\u914D\u7F6E\u3002",
  12471. "\u53EF\u4EE5\u642D\u914D \u201C\u901A\u7528-\u5728\u7EBF\u641C\u9898\u201D \u4E00\u8D77\u4F7F\u7528\u3002",
  12472. "\u8BF7\u624B\u52A8\u8FDB\u5165\u4F5C\u4E1A\u8003\u8BD5\u9875\u9762\u624D\u80FD\u4F7F\u7528\u81EA\u52A8\u7B54\u9898\u3002"
  12473. ]).outerHTML
  12474. }
  12475. },
  12476. methods() {
  12477. return {
  12478. main: async () => {
  12479. if (!["icve-study/coursePreview/jobTes"].some((i) => window.location.href.includes(i))) {
  12480. return;
  12481. }
  12482. await waitForQuestions();
  12483. commonWork(this, {
  12484. workerProvider: work
  12485. });
  12486. }
  12487. };
  12488. }
  12489. })
  12490. }
  12491. });
  12492. async function watchMedia(volume2) {
  12493. const media = await waitForMedia();
  12494. media.volume = volume2;
  12495. const success = await playMedia(() => media.play());
  12496. if (!success) {
  12497. return;
  12498. }
  12499. return new Promise((resolve, reject) => {
  12500. const interval = setInterval(() => {
  12501. if (media.ended) {
  12502. clearInterval(interval);
  12503. resolve();
  12504. } else if (media.paused) {
  12505. media.play();
  12506. }
  12507. }, 1e3);
  12508. });
  12509. }
  12510. async function watchFile() {
  12511. var _a;
  12512. const vue = (_a = $el(".el-carousel")) == null ? void 0 : _a.__vue__;
  12513. if (!vue) {
  12514. return;
  12515. }
  12516. for (let index = 0; index < vue.items.length; index++) {
  12517. await $.sleep(3e3);
  12518. vue.next();
  12519. }
  12520. }
  12521. async function start() {
  12522. var _a, _b;
  12523. const info = (_b = (_a = $el(".guide")) == null ? void 0 : _a.__vue__) == null ? void 0 : _b.courseList;
  12524. if ((info == null ? void 0 : info.id) !== void 0) {
  12525. return info;
  12526. } else {
  12527. return void 0;
  12528. }
  12529. }
  12530. async function next() {
  12531. var _a, _b, _c;
  12532. const nextObj = (_b = (_a = $el(".guide")) == null ? void 0 : _a.__vue__) == null ? void 0 : _b.nextObj;
  12533. if ((nextObj == null ? void 0 : nextObj.id) !== void 0) {
  12534. (_c = $el(".preOrNext .next .el-link")) == null ? void 0 : _c.click();
  12535. } else {
  12536. $message("success", {
  12537. duration: 0,
  12538. content: "\u5168\u90E8\u4EFB\u52A1\u5DF2\u5B8C\u6210\u3002"
  12539. });
  12540. $console.info("\u5168\u90E8\u4EFB\u52A1\u5DF2\u5B8C\u6210\u3002");
  12541. state.studying = false;
  12542. }
  12543. }
  12544. async function waitForLoad() {
  12545. return new Promise((resolve, reject) => {
  12546. const interval = setInterval(() => {
  12547. var _a;
  12548. if (((_a = $el(".guide")) == null ? void 0 : _a.__vue__) !== void 0) {
  12549. clearInterval(interval);
  12550. resolve();
  12551. }
  12552. }, 1e3);
  12553. });
  12554. }
  12555. async function waitForQuestions() {
  12556. return new Promise((resolve, reject) => {
  12557. const interval = setInterval(() => {
  12558. if ($el(".subjectList") !== void 0) {
  12559. clearInterval(interval);
  12560. resolve();
  12561. }
  12562. }, 1e3);
  12563. });
  12564. }
  12565. function work({ answererWrappers, period, thread }) {
  12566. $message("info", { content: "\u5F00\u59CB\u4F5C\u4E1A" });
  12567. CommonProject.scripts.workResults.methods.init({
  12568. questionPositionSyncHandlerType: "zjy"
  12569. });
  12570. const titleTransform = (titles) => {
  12571. return titles.filter((t2) => t2 == null ? void 0 : t2.innerText).map((t2) => t2 == null ? void 0 : t2.innerText).join(",");
  12572. };
  12573. const worker = new OCSWorker({
  12574. root: ".subjectDet",
  12575. elements: {
  12576. title: "h2,h3,h4,h5,h6",
  12577. options: ".optionList > div"
  12578. },
  12579. requestPeriod: period != null ? period : 3,
  12580. resolvePeriod: 1,
  12581. thread: thread != null ? thread : 1,
  12582. answerer: (elements, type, ctx) => {
  12583. const title = titleTransform(elements.title);
  12584. if (title) {
  12585. return CommonProject.scripts.apps.methods.searchAnswerInCaches(title, () => {
  12586. return defaultAnswerWrapperHandler(answererWrappers, {
  12587. type,
  12588. title,
  12589. options: ctx.elements.options.map((o) => o.innerText).join("\n")
  12590. });
  12591. });
  12592. } else {
  12593. throw new Error("\u9898\u76EE\u4E3A\u7A7A\uFF0C\u8BF7\u67E5\u770B\u9898\u76EE\u662F\u5426\u4E3A\u7A7A\uFF0C\u6216\u8005\u5FFD\u7565\u6B64\u9898");
  12594. }
  12595. },
  12596. work: {
  12597. handler(type, answer, option, ctx) {
  12598. var _a, _b;
  12599. if (type === "judgement" || type === "single" || type === "multiple") {
  12600. if (((_a = option.querySelector("input")) == null ? void 0 : _a.checked) !== true) {
  12601. (_b = option.querySelector("label")) == null ? void 0 : _b.click();
  12602. }
  12603. } else if (type === "completion" && answer.trim()) {
  12604. const text = option.querySelector("textarea");
  12605. if (text) {
  12606. text.value = answer;
  12607. }
  12608. }
  12609. }
  12610. },
  12611. onResultsUpdate(res) {
  12612. CommonProject.scripts.workResults.methods.setResults(simplifyWorkResult(res, titleTransform));
  12613. },
  12614. onResolveUpdate(res) {
  12615. var _a;
  12616. if ((_a = res.result) == null ? void 0 : _a.finish) {
  12617. CommonProject.scripts.apps.methods.addQuestionCacheFromWorkResult(simplifyWorkResult([res], titleTransform));
  12618. }
  12619. CommonProject.scripts.workResults.methods.updateWorkState(worker);
  12620. }
  12621. });
  12622. worker.doWork().then(() => {
  12623. $message("info", { content: "\u4F5C\u4E1A/\u8003\u8BD5\u5B8C\u6210\uFF0C\u8BF7\u81EA\u884C\u68C0\u67E5\u540E\u4FDD\u5B58\u6216\u63D0\u4EA4\u3002", duration: 0 });
  12624. worker.emit("done");
  12625. }).catch((err) => {
  12626. $message("error", { content: `\u4F5C\u4E1A/\u8003\u8BD5\u5931\u8D25: ${err}`, duration: 0 });
  12627. });
  12628. return worker;
  12629. }
  12630. function definedProjects() {
  12631. return [ZHSProject, CXProject, IcveMoocProject, ZJYProject, CommonProject, BackgroundProject];
  12632. }
  12633. exports2.$ = $;
  12634. exports2.$$el = $$el;
  12635. exports2.$const = $const;
  12636. exports2.$creator = $creator;
  12637. exports2.$el = $el;
  12638. exports2.$elements = $elements;
  12639. exports2.$gm = $gm;
  12640. exports2.$message = $message;
  12641. exports2.$modal = $modal;
  12642. exports2.$store = $store;
  12643. exports2.$string = $string;
  12644. exports2.AnswerWrapperParser = AnswerWrapperParser;
  12645. exports2.BackgroundProject = BackgroundProject;
  12646. exports2.BaseScript = BaseScript;
  12647. exports2.CXProject = CXProject;
  12648. exports2.CommonEventEmitter = CommonEventEmitter;
  12649. exports2.CommonProject = CommonProject;
  12650. exports2.ConfigElement = ConfigElement;
  12651. exports2.ContainerElement = ContainerElement;
  12652. exports2.CorsEventEmitter = CorsEventEmitter;
  12653. exports2.GMStoreProvider = GMStoreProvider;
  12654. exports2.HeaderElement = HeaderElement;
  12655. exports2.IcveMoocProject = IcveMoocProject;
  12656. exports2.LocalStoreChangeEvent = LocalStoreChangeEvent;
  12657. exports2.MessageElement = MessageElement;
  12658. exports2.ModalElement = ModalElement;
  12659. exports2.OCSWorker = OCSWorker;
  12660. exports2.ObjectStoreProvider = ObjectStoreProvider;
  12661. exports2.Project = Project;
  12662. exports2.RenderScript = RenderScript;
  12663. exports2.Script = Script;
  12664. exports2.ScriptPanelElement = ScriptPanelElement;
  12665. exports2.SearchInfosElement = SearchInfosElement;
  12666. exports2.StringUtils = StringUtils;
  12667. exports2.ZHSProject = ZHSProject;
  12668. exports2.ZJYProject = ZJYProject;
  12669. exports2.answerSimilar = answerSimilar;
  12670. exports2.clearString = clearString;
  12671. exports2.cors = cors;
  12672. exports2.defaultAnswerWrapperHandler = defaultAnswerWrapperHandler;
  12673. exports2.defaultQuestionResolve = defaultQuestionResolve;
  12674. exports2.defaultWorkTypeResolver = defaultWorkTypeResolver;
  12675. exports2.definedCustomElements = definedCustomElements;
  12676. exports2.definedProjects = definedProjects;
  12677. exports2.domSearch = domSearch;
  12678. exports2.domSearchAll = domSearchAll;
  12679. exports2.el = el;
  12680. exports2.enableElementDraggable = enableElementDraggable;
  12681. exports2.isPlainAnswer = isPlainAnswer;
  12682. exports2.removeRedundant = removeRedundant;
  12683. exports2.request = request;
  12684. exports2.splitAnswer = splitAnswer;
  12685. exports2.start = start$1;
  12686. Object.defineProperties(exports2, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
  12687. });
  12688.  
  12689.  
  12690. const STYLE = `/** 默认字体 */
  12691. /** 输入框默认边距 */
  12692. ul,
  12693. ol {
  12694. line-height: 26px;
  12695. padding-left: 22px;
  12696. margin: 0px;
  12697. }
  12698. a {
  12699. color: #1890ff;
  12700. }
  12701. hr {
  12702. border-style: solid;
  12703. border-color: #63636346;
  12704. border-width: 0px;
  12705. border-bottom: 1px solid #63636346;
  12706. margin-block-start: 1em;
  12707. margin-block-end: 1em;
  12708. }
  12709. .base-style-active-form-control {
  12710. border: 1px solid #ffffff00;
  12711. }
  12712. .base-style-active-form-control:focus {
  12713. border: 1px solid #0e8de290;
  12714. box-shadow: 0px 0px 4px #0e8de252;
  12715. }
  12716. .base-style-active-form-control:focus:not([type='checkbox'], [type='radio']) {
  12717. border: 1px solid #0e8de290;
  12718. box-shadow: 0px 0px 4px #0e8de252;
  12719. background-color: white !important;
  12720. }
  12721. .base-style-active-form-control:hover {
  12722. background-color: #ebeef4;
  12723. }
  12724. .base-style-input {
  12725. outline: none;
  12726. border: 1px solid #ffffff00;
  12727. padding: 2px 8px;
  12728. margin: 0px;
  12729. background-color: #eef2f7;
  12730. border-radius: 2px;
  12731. color: black;
  12732. }
  12733. .base-style-input::placeholder {
  12734. color: #bababa;
  12735. }
  12736. .base-style-button {
  12737. appearance: none;
  12738. -moz-appearance: none;
  12739. -webkit-appearance: none;
  12740. border-radius: 4px;
  12741. background-color: white;
  12742. border: 1px solid #2c92ff;
  12743. color: #409eff;
  12744. cursor: pointer !important;
  12745. margin-bottom: 4px;
  12746. }
  12747. .base-style-button:active {
  12748. box-shadow: 0px 0px 8px #0e8de2a5;
  12749. }
  12750. .base-style-button + .base-style-button {
  12751. margin-left: 12px;
  12752. }
  12753. .base-style-button:hover {
  12754. background-color: #7abbff24;
  12755. }
  12756. .base-style-button:disabled {
  12757. background-color: white;
  12758. border: 1px solid #c0c0c0;
  12759. color: #aeaeae;
  12760. cursor: not-allowed;
  12761. }
  12762. .base-style-button:disabled:active {
  12763. box-shadow: none;
  12764. }
  12765. .base-style-button-secondary {
  12766. appearance: none;
  12767. -moz-appearance: none;
  12768. -webkit-appearance: none;
  12769. border-radius: 4px;
  12770. border: 1px solid #2c92ff;
  12771. color: #409eff;
  12772. cursor: pointer !important;
  12773. margin-bottom: 4px;
  12774. color: gray;
  12775. background-color: white;
  12776. border: 1px solid #dcdcdc;
  12777. }
  12778. .base-style-button-secondary:active {
  12779. box-shadow: 0px 0px 8px #0e8de2a5;
  12780. }
  12781. .base-style-button-secondary + .base-style-button-secondary {
  12782. margin-left: 12px;
  12783. }
  12784. .base-style-button-secondary:hover {
  12785. background-color: #7abbff24;
  12786. }
  12787. .base-style-button-secondary:disabled {
  12788. background-color: white;
  12789. border: 1px solid #c0c0c0;
  12790. color: #aeaeae;
  12791. cursor: not-allowed;
  12792. }
  12793. .base-style-button-secondary:disabled:active {
  12794. box-shadow: none;
  12795. }
  12796. container-element.close {
  12797. display: none;
  12798. }
  12799. container-element.minimize {
  12800. min-width: unset;
  12801. }
  12802. container-element {
  12803. position: fixed;
  12804. top: 10%;
  12805. left: 10%;
  12806. z-index: 99999;
  12807. text-align: left;
  12808. min-width: 300px;
  12809. -webkit-font-smoothing: antialiased;
  12810. -moz-osx-font-smoothing: grayscale;
  12811. color: #636363;
  12812. box-shadow: 0 0 24px -12px #3f3f3f;
  12813. border-radius: 8px;
  12814. letter-spacing: 0.5px;
  12815. border: 1px solid #c1c1c1;
  12816. }
  12817. .header {
  12818. display: flex;
  12819. align-items: center;
  12820. background-color: white;
  12821. border-radius: 8px 8px 0px 0px;
  12822. user-select: none;
  12823. padding: 4px;
  12824. }
  12825. .header .profile {
  12826. flex: 1;
  12827. cursor: move;
  12828. }
  12829. .header .switch:hover,
  12830. .header .dropdown:hover {
  12831. background-color: #f3f3f3;
  12832. }
  12833. .header .close:hover {
  12834. background-color: #ff000038;
  12835. }
  12836. .header .switch,
  12837. .header .close {
  12838. cursor: pointer;
  12839. }
  12840. .header .dropdown {
  12841. line-height: 24px;
  12842. }
  12843. .header .switch,
  12844. .header .close,
  12845. .header .profile {
  12846. display: inline-flex;
  12847. align-items: center;
  12848. padding: 0px 8px;
  12849. }
  12850. .logo {
  12851. width: 18px;
  12852. height: 18px;
  12853. cursor: pointer;
  12854. }
  12855. .project-selector {
  12856. display: flex;
  12857. align-items: center;
  12858. }
  12859. .project-selector select {
  12860. background: #ffffff00;
  12861. border-radius: 4px;
  12862. border: 1px solid #63636346;
  12863. padding: 4px;
  12864. }
  12865. .project-selector.expand-all {
  12866. display: none;
  12867. }
  12868. .body {
  12869. overflow: auto;
  12870. width: auto;
  12871. height: 100%;
  12872. }
  12873. script-panel-element {
  12874. display: block;
  12875. background-color: white;
  12876. border-radius: 0px 0px 8px 8px;
  12877. padding: 0px 8px 12px 8px;
  12878. overflow: auto;
  12879. }
  12880. script-panel-element .script-panel-body {
  12881. padding: 0px 8px;
  12882. }
  12883. script-panel-element + script-panel-element {
  12884. margin-top: 12px;
  12885. }
  12886. .card + .card {
  12887. margin-top: 12px;
  12888. }
  12889. .card {
  12890. background-color: white;
  12891. border-radius: 2px;
  12892. padding: 0px 8px;
  12893. }
  12894. .notes {
  12895. background: #0099ff0e;
  12896. border-left: 4px solid #0099ff65;
  12897. width: -webkit-fill-available;
  12898. margin: 0px 8px;
  12899. line-height: 26px;
  12900. letter-spacing: 1px;
  12901. }
  12902. .tooltip {
  12903. z-index: 99999999999999;
  12904. margin: 12px 0px 0px 12px;
  12905. padding: 4px;
  12906. color: black;
  12907. background: #f0f0f0;
  12908. box-shadow: 0px 0px 4px #949494;
  12909. position: fixed;
  12910. white-space: normal;
  12911. max-width: 200px;
  12912. height: auto;
  12913. border-radius: 2px;
  12914. line-height: 18px;
  12915. }
  12916. .configs-container.lock {
  12917. filter: blur(1px);
  12918. user-select: none;
  12919. -webkit-user-select: none;
  12920. -moz-user-select: none;
  12921. -ms-user-select: none;
  12922. }
  12923. .configs-container .lock-wrapper {
  12924. cursor: not-allowed !important;
  12925. border-radius: 4px;
  12926. position: absolute;
  12927. left: 0px;
  12928. z-index: 1;
  12929. display: inline-flex;
  12930. align-items: center;
  12931. justify-content: center;
  12932. }
  12933. .configs-container .lock-message {
  12934. background-color: #ffffff7d;
  12935. border-radius: 4px;
  12936. box-shadow: 0px 0px 12px #6a6a6a98;
  12937. padding: 2px;
  12938. }
  12939. .configs {
  12940. display: table;
  12941. background: #e1e1e107;
  12942. width: -webkit-fill-available;
  12943. }
  12944. .configs .configs-body {
  12945. display: table-row-group;
  12946. }
  12947. .configs .configs-body config-element + config-element label {
  12948. padding-top: 4px;
  12949. }
  12950. .configs .configs-body config-element + config-element .config-wrapper {
  12951. padding-top: 4px;
  12952. }
  12953. .configs .configs-body config-element {
  12954. width: 100%;
  12955. display: table-row;
  12956. line-height: 26px;
  12957. }
  12958. .configs .configs-body config-element label {
  12959. white-space: nowrap;
  12960. color: #4e5969;
  12961. display: table-cell;
  12962. padding-right: 12px;
  12963. text-align: left;
  12964. vertical-align: top;
  12965. margin-right: 12px;
  12966. }
  12967. .configs .configs-body config-element .config-wrapper {
  12968. display: table-cell;
  12969. vertical-align: middle;
  12970. /** check box 的样式 */
  12971. }
  12972. .configs .configs-body config-element .config-wrapper select {
  12973. outline: none;
  12974. border: none;
  12975. border: 1px solid #e4e4e4;
  12976. border-radius: 4px;
  12977. padding: 2px 8px;
  12978. border: 1px solid #ffffff00;
  12979. }
  12980. .configs .configs-body config-element .config-wrapper select:focus {
  12981. border: 1px solid #0e8de290;
  12982. box-shadow: 0px 0px 4px #0e8de252;
  12983. }
  12984. .configs .configs-body config-element .config-wrapper select:focus:not([type='checkbox'], [type='radio']) {
  12985. border: 1px solid #0e8de290;
  12986. box-shadow: 0px 0px 4px #0e8de252;
  12987. background-color: white !important;
  12988. }
  12989. .configs .configs-body config-element .config-wrapper select:hover {
  12990. background-color: #ebeef4;
  12991. }
  12992. .configs .configs-body config-element .config-wrapper textarea {
  12993. padding: 2px 8px;
  12994. outline: none;
  12995. border: none;
  12996. border: 1px solid #ffffff00;
  12997. }
  12998. .configs .configs-body config-element .config-wrapper textarea:focus {
  12999. border: 1px solid #0e8de290;
  13000. box-shadow: 0px 0px 4px #0e8de252;
  13001. }
  13002. .configs .configs-body config-element .config-wrapper textarea:focus:not([type='checkbox'], [type='radio']) {
  13003. border: 1px solid #0e8de290;
  13004. box-shadow: 0px 0px 4px #0e8de252;
  13005. background-color: white !important;
  13006. }
  13007. .configs .configs-body config-element .config-wrapper textarea:hover {
  13008. background-color: #ebeef4;
  13009. }
  13010. .configs .configs-body config-element .config-wrapper input:not([type='button']) {
  13011. outline: none;
  13012. padding: 2px 8px;
  13013. margin: 0px;
  13014. background-color: #eef2f7;
  13015. border-radius: 2px;
  13016. color: black;
  13017. border: 1px solid #ffffff00;
  13018. }
  13019. .configs .configs-body config-element .config-wrapper input:not([type='button'])::placeholder {
  13020. color: #bababa;
  13021. }
  13022. .configs .configs-body config-element .config-wrapper input:not([type='button']):focus {
  13023. border: 1px solid #0e8de290;
  13024. box-shadow: 0px 0px 4px #0e8de252;
  13025. }
  13026. .configs
  13027. .configs-body
  13028. config-element
  13029. .config-wrapper
  13030. input:not([type='button']):focus:not([type='checkbox'], [type='radio']) {
  13031. border: 1px solid #0e8de290;
  13032. box-shadow: 0px 0px 4px #0e8de252;
  13033. background-color: white !important;
  13034. }
  13035. .configs .configs-body config-element .config-wrapper input:not([type='button']):hover {
  13036. background-color: #ebeef4;
  13037. }
  13038. .configs .configs-body config-element .config-wrapper input[type='range'] {
  13039. padding: 0px;
  13040. }
  13041. .configs .configs-body config-element .config-wrapper input[type='button'] {
  13042. appearance: none;
  13043. -moz-appearance: none;
  13044. -webkit-appearance: none;
  13045. border-radius: 4px;
  13046. background-color: white;
  13047. border: 1px solid #2c92ff;
  13048. color: #409eff;
  13049. cursor: pointer !important;
  13050. margin-bottom: 4px;
  13051. }
  13052. .configs .configs-body config-element .config-wrapper input[type='button']:active {
  13053. box-shadow: 0px 0px 8px #0e8de2a5;
  13054. }
  13055. .configs
  13056. .configs-body
  13057. config-element
  13058. .config-wrapper
  13059. input[type='button']
  13060. + .configs
  13061. .configs-body
  13062. config-element
  13063. .config-wrapper
  13064. input[type='button'] {
  13065. margin-left: 12px;
  13066. }
  13067. .configs .configs-body config-element .config-wrapper input[type='button']:hover {
  13068. background-color: #7abbff24;
  13069. }
  13070. .configs .configs-body config-element .config-wrapper input[type='button']:disabled {
  13071. background-color: white;
  13072. border: 1px solid #c0c0c0;
  13073. color: #aeaeae;
  13074. cursor: not-allowed;
  13075. }
  13076. .configs .configs-body config-element .config-wrapper input[type='button']:disabled:active {
  13077. box-shadow: none;
  13078. }
  13079. .configs .configs-body config-element .config-wrapper input[type='checkbox'] {
  13080. appearance: none;
  13081. -moz-appearance: none;
  13082. -webkit-appearance: none;
  13083. width: fit-content;
  13084. min-width: 36px;
  13085. height: 20px;
  13086. border-radius: 100px;
  13087. display: flex;
  13088. align-items: center;
  13089. padding: 2px 4px;
  13090. transition: all 0.2s ease-in-out;
  13091. width: auto;
  13092. }
  13093. .configs .configs-body config-element .config-wrapper input[type='checkbox']:checked {
  13094. background: #1890ff;
  13095. }
  13096. .configs .configs-body config-element .config-wrapper input[type='checkbox']:disabled {
  13097. background-color: #f7f7f78b;
  13098. }
  13099. .configs .configs-body config-element .config-wrapper input[type='checkbox']:checked::before {
  13100. transform: translate(100%, 0px);
  13101. }
  13102. .configs .configs-body config-element .config-wrapper input[type='checkbox']::before {
  13103. background-color: #fff;
  13104. border-radius: 9px;
  13105. box-shadow: 0 2px 4px #00230b33;
  13106. width: 14px;
  13107. height: 14px;
  13108. content: '';
  13109. }
  13110. .configs .configs-body config-element .config-wrapper input:not([type='checkbox'], [type='radio']),
  13111. .configs .configs-body config-element .config-wrapper textarea,
  13112. .configs .configs-body config-element .config-wrapper select {
  13113. width: -webkit-fill-available;
  13114. font-size: inherit;
  13115. }
  13116. .configs .configs-body config-element .config-wrapper input[type='checkbox'],
  13117. .configs .configs-body config-element .config-wrapper input[type='radio'],
  13118. .configs .configs-body config-element .config-wrapper input[type='range'] {
  13119. accent-color: #0e8ee2;
  13120. }
  13121. .configs .configs-body config-element .config-wrapper > *:not(.tooltip) {
  13122. background-color: #eef2f7;
  13123. border-radius: 2px;
  13124. color: black;
  13125. float: right;
  13126. }
  13127. .configs .configs-body config-element .config-wrapper > *:disabled {
  13128. cursor: not-allowed;
  13129. background-color: #f7f7f78b;
  13130. }
  13131. .message-container {
  13132. margin-bottom: 4px;
  13133. position: absolute;
  13134. bottom: 100%;
  13135. left: 50%;
  13136. width: 100%;
  13137. transform: translate(-50%, 0px);
  13138. min-width: 300px;
  13139. }
  13140. .message-container message-element {
  13141. display: flex;
  13142. border-radius: 4px;
  13143. padding: 4px 12px;
  13144. margin-bottom: 4px;
  13145. }
  13146. .message-container message-element .message-content-container {
  13147. margin-right: 8px;
  13148. flex: auto;
  13149. }
  13150. .message-container message-element .message-text {
  13151. letter-spacing: 1px;
  13152. font-weight: bold;
  13153. }
  13154. .message-container message-element .message-closer {
  13155. width: 18px;
  13156. min-width: 18px;
  13157. cursor: pointer;
  13158. background-color: #ffffffb3;
  13159. color: #a1a1a1;
  13160. border-radius: 100%;
  13161. text-align: center;
  13162. height: 18px;
  13163. vertical-align: middle;
  13164. font-size: 12px;
  13165. }
  13166. .message-container message-element.error {
  13167. background-color: #ffe6e6;
  13168. color: #c70208;
  13169. border: 1px solid #ff6b6ded;
  13170. }
  13171. .message-container message-element.info {
  13172. background-color: #c9e7ff;
  13173. color: #004d95;
  13174. border: 1px solid #1890ff69;
  13175. }
  13176. .message-container message-element.success {
  13177. background-color: #e8ffe0;
  13178. color: #3e8d0d;
  13179. border: 1px solid #6fd91d;
  13180. }
  13181. .message-container message-element.warn {
  13182. background-color: #ffefc8;
  13183. color: #9b7400;
  13184. border: 1px solid #ffc107;
  13185. }
  13186. modal-element {
  13187. position: absolute;
  13188. top: 50%;
  13189. left: 50%;
  13190. background-color: white;
  13191. border-radius: 4px;
  13192. box-shadow: 0px 0px 24px -12px black;
  13193. border: 1px solid #929292;
  13194. height: fit-content;
  13195. transform: translate(-50%, -50%);
  13196. padding: 12px 18px 18px 18px;
  13197. font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;
  13198. z-index: 99999999999;
  13199. line-height: 24px;
  13200. }
  13201. modal-element .modal-profile {
  13202. zoom: 0.9;
  13203. color: #969696;
  13204. user-select: none;
  13205. margin-bottom: 4px;
  13206. }
  13207. modal-element .modal-title {
  13208. font-size: 18px;
  13209. font-weight: bold;
  13210. user-select: none;
  13211. }
  13212. modal-element .modal-body {
  13213. margin: 12px 0px;
  13214. overflow: auto;
  13215. }
  13216. modal-element .modal-footer {
  13217. display: flex;
  13218. white-space: nowrap;
  13219. justify-content: end;
  13220. align-items: end;
  13221. }
  13222. modal-element .modal-footer * + * {
  13223. margin-left: 12px;
  13224. }
  13225. modal-element .modal-input {
  13226. outline: none;
  13227. padding: 2px 8px;
  13228. margin: 0px;
  13229. background-color: #eef2f7;
  13230. border-radius: 2px;
  13231. color: black;
  13232. border: 1px solid #ffffff00;
  13233. width: -webkit-fill-available;
  13234. }
  13235. modal-element .modal-input::placeholder {
  13236. color: #bababa;
  13237. }
  13238. modal-element .modal-input:focus {
  13239. border: 1px solid #0e8de290;
  13240. box-shadow: 0px 0px 4px #0e8de252;
  13241. }
  13242. modal-element .modal-input:focus:not([type='checkbox'], [type='radio']) {
  13243. border: 1px solid #0e8de290;
  13244. box-shadow: 0px 0px 4px #0e8de252;
  13245. background-color: white !important;
  13246. }
  13247. modal-element .modal-input:hover {
  13248. background-color: #ebeef4;
  13249. }
  13250. modal-element .modal-cancel-button {
  13251. appearance: none;
  13252. -moz-appearance: none;
  13253. -webkit-appearance: none;
  13254. border-radius: 4px;
  13255. border: 1px solid #2c92ff;
  13256. color: #409eff;
  13257. cursor: pointer !important;
  13258. margin-bottom: 4px;
  13259. color: gray;
  13260. background-color: white;
  13261. border: 1px solid #dcdcdc;
  13262. }
  13263. modal-element .modal-cancel-button:active {
  13264. box-shadow: 0px 0px 8px #0e8de2a5;
  13265. }
  13266. modal-element .modal-cancel-button + modal-element .modal-cancel-button {
  13267. margin-left: 12px;
  13268. }
  13269. modal-element .modal-cancel-button:hover {
  13270. background-color: #7abbff24;
  13271. }
  13272. modal-element .modal-cancel-button:disabled {
  13273. background-color: white;
  13274. border: 1px solid #c0c0c0;
  13275. color: #aeaeae;
  13276. cursor: not-allowed;
  13277. }
  13278. modal-element .modal-cancel-button:disabled:active {
  13279. box-shadow: none;
  13280. }
  13281. modal-element .modal-confirm-button {
  13282. appearance: none;
  13283. -moz-appearance: none;
  13284. -webkit-appearance: none;
  13285. border-radius: 4px;
  13286. background-color: white;
  13287. border: 1px solid #2c92ff;
  13288. color: #409eff;
  13289. cursor: pointer !important;
  13290. margin-bottom: 4px;
  13291. }
  13292. modal-element .modal-confirm-button:active {
  13293. box-shadow: 0px 0px 8px #0e8de2a5;
  13294. }
  13295. modal-element .modal-confirm-button + modal-element .modal-confirm-button {
  13296. margin-left: 12px;
  13297. }
  13298. modal-element .modal-confirm-button:hover {
  13299. background-color: #7abbff24;
  13300. }
  13301. modal-element .modal-confirm-button:disabled {
  13302. background-color: white;
  13303. border: 1px solid #c0c0c0;
  13304. color: #aeaeae;
  13305. cursor: not-allowed;
  13306. }
  13307. modal-element .modal-confirm-button:disabled:active {
  13308. box-shadow: none;
  13309. }
  13310. modal-element.alert .modal-input,
  13311. modal-element.alert .modal-cancel-button {
  13312. display: none;
  13313. }
  13314. modal-element.alert .modal-confirm-button {
  13315. margin: 0;
  13316. }
  13317. modal-element.prompt .modal-input,
  13318. modal-element.prompt .modal-cancel-button,
  13319. modal-element.prompt .modal-confirm-button {
  13320. display: block;
  13321. }
  13322. modal-element.confirm .modal-input {
  13323. display: none;
  13324. }
  13325. .modal-wrapper {
  13326. width: 100%;
  13327. height: 100%;
  13328. z-index: 9999;
  13329. position: fixed;
  13330. top: 0px;
  13331. left: 0px;
  13332. z-index: 9999999;
  13333. background-color: rgba(0, 0, 0, 0.265);
  13334. color: #636363;
  13335. font: 14px Menlo, Monaco, Consolas, 'Courier New', monospace;
  13336. }
  13337. .pointer {
  13338. cursor: pointer;
  13339. }
  13340. .separator {
  13341. display: flex;
  13342. align-items: center;
  13343. text-align: center;
  13344. padding: 4px 0px 8px 0px;
  13345. }
  13346. .separator::before,
  13347. .separator::after {
  13348. content: '';
  13349. flex: 1;
  13350. border-bottom: 1px solid #63636346;
  13351. }
  13352. .separator:not(:empty)::before {
  13353. margin-right: 0.25em;
  13354. }
  13355. .separator:not(:empty)::after {
  13356. margin-left: 0.25em;
  13357. }
  13358. .minimize .body,
  13359. .minimize .header .dropdown,
  13360. .minimize .footer {
  13361. display: none;
  13362. }
  13363. .minimize .header {
  13364. padding: 8px;
  13365. border-radius: 8px;
  13366. box-shadow: 0px 0px 24px -12px black;
  13367. }
  13368. .user-guide > li {
  13369. padding: 4px 0px;
  13370. }
  13371. .search-infos-question {
  13372. white-space: nowrap;
  13373. cursor: pointer;
  13374. padding: 4px 0px;
  13375. display: block;
  13376. overflow: hidden;
  13377. text-overflow: ellipsis;
  13378. }
  13379. .search-infos-question.hover {
  13380. color: #00488d;
  13381. }
  13382. .search-infos-question.active {
  13383. color: #1890ff;
  13384. }
  13385. .search-infos-question.error {
  13386. color: #ff6b6ded;
  13387. }
  13388. .search-infos-num {
  13389. width: 22px;
  13390. margin: 2px;
  13391. height: 20px;
  13392. border-radius: 4px;
  13393. display: inline-block;
  13394. color: white;
  13395. background-color: #63b4ff;
  13396. text-align: center;
  13397. cursor: pointer;
  13398. border: 1px solid #63b4ff;
  13399. }
  13400. .search-infos-num.requesting {
  13401. border: 1px solid #b6b6b6;
  13402. background-color: white;
  13403. color: inherit;
  13404. }
  13405. .search-infos-num.resolving {
  13406. border: 1px solid #1890ff;
  13407. background-color: white;
  13408. color: #1890ff;
  13409. }
  13410. .search-infos-num.active {
  13411. background-color: #1890ff;
  13412. color: white;
  13413. }
  13414. .search-infos-num.error {
  13415. border: 1px solid #ff8789ed;
  13416. background-color: #ff6b6ded;
  13417. color: white;
  13418. }
  13419. search-infos-element {
  13420. display: block;
  13421. overflow: auto;
  13422. }
  13423. search-infos-element .search-result {
  13424. margin-bottom: 12px;
  13425. padding-left: 12px;
  13426. }
  13427. search-infos-element .search-result .question {
  13428. font-weight: bold;
  13429. }
  13430. search-infos-element .search-result .answer {
  13431. color: #7c7c7c;
  13432. }
  13433. search-infos-element .search-result .answer code {
  13434. background-color: #f3f3f3;
  13435. padding: 2px 4px;
  13436. border-radius: 2px;
  13437. margin: 4px;
  13438. line-height: 20px;
  13439. }
  13440. search-infos-element .error {
  13441. color: #ff6b6ded;
  13442. display: inline-block;
  13443. padding-left: 12px;
  13444. }
  13445. .copy,
  13446. .question-title-extra-btn {
  13447. margin-left: 4px;
  13448. padding: 2px 4px;
  13449. border-radius: 2px;
  13450. box-shadow: 0 0 4px #b1b1b1;
  13451. cursor: pointer !important;
  13452. font-weight: normal;
  13453. font-size: 12px;
  13454. }
  13455. .work-result-question-container {
  13456. position: absolute;
  13457. width: 400px;
  13458. left: -100%;
  13459. top: 0px;
  13460. background: white;
  13461. border: 1px solid #cbcbcb;
  13462. border-radius: 4px;
  13463. box-shadow: 0px 0px 12px #d1cfcf;
  13464. padding: 12px;
  13465. }
  13466. .work-result-question-container .close-search-result {
  13467. font-size: 12px;
  13468. margin-left: 8px;
  13469. text-decoration: underline;
  13470. color: gray;
  13471. cursor: pointer;
  13472. }
  13473. .console {
  13474. max-height: 300px;
  13475. max-width: 400px;
  13476. overflow: auto;
  13477. background-color: #292929;
  13478. padding: 12px 6px;
  13479. color: #ececec;
  13480. font-size: 12px;
  13481. }
  13482. .console .item {
  13483. padding: 3px 0px;
  13484. border-radius: 2px;
  13485. }
  13486. .console .item .time {
  13487. color: #757575;
  13488. }
  13489. .console .item .info {
  13490. background-color: #2196f3a3;
  13491. }
  13492. .console .item .warn {
  13493. background-color: #ffc107db;
  13494. }
  13495. .console .item .error {
  13496. background-color: #f36c71cc;
  13497. }
  13498. .console .item .debug,
  13499. .console .item .log {
  13500. background-color: #9e9e9ec4;
  13501. }
  13502. .console *::selection {
  13503. background-color: #ffffff6b;
  13504. }
  13505. /* 设置滚动条的样式 */
  13506. ::-webkit-scrollbar {
  13507. width: 10px;
  13508. height: 10px;
  13509. }
  13510. /* 滚动槽 */
  13511. ::-webkit-scrollbar-track {
  13512. background: #ffffffd8;
  13513. border-radius: 4px;
  13514. margin: 4px;
  13515. }
  13516. /* 滚动条滑块 */
  13517. ::-webkit-scrollbar-thumb {
  13518. border-radius: 4px;
  13519. background: rgba(0, 0, 0, 0.253);
  13520. box-shadow: inset006pxrgba(0, 0, 0, 0.3);
  13521. }
  13522. .markdown {
  13523. max-width: 400px;
  13524. max-height: 50vh;
  13525. overflow: auto;
  13526. }
  13527. .markdown code {
  13528. padding: 2px 4px;
  13529. background-color: #f0f0f0;
  13530. border-radius: 6px;
  13531. font-size: 12px;
  13532. }
  13533. .markdown blockquote {
  13534. padding: 4px 4px 4px 12px;
  13535. margin: 0px;
  13536. color: #b5b5b5;
  13537. border-left: #ababab 2px solid;
  13538. }
  13539. .markdown blockquote p {
  13540. margin: 0px;
  13541. }
  13542. .markdown h1,
  13543. .markdown h2,
  13544. .markdown h3,
  13545. .markdown h4,
  13546. .markdown h5,
  13547. .markdown h6,
  13548. .markdown p {
  13549. margin: 8px 0px;
  13550. }
  13551. .dropdown {
  13552. position: relative;
  13553. display: inline-block;
  13554. }
  13555. .dropdown.active .dropdown-trigger-element {
  13556. color: #1890ff;
  13557. }
  13558. .dropdown-trigger-element {
  13559. cursor: pointer;
  13560. }
  13561. .dropdown-content {
  13562. display: none;
  13563. position: absolute;
  13564. background-color: #ffffff;
  13565. overflow: auto;
  13566. box-shadow: 0px 8px 16px 0px #00000033;
  13567. z-index: 1;
  13568. border-radius: 4px;
  13569. padding: 12px;
  13570. min-width: 120px;
  13571. }
  13572. .dropdown-content.show {
  13573. display: block;
  13574. }
  13575. .dropdown-content {
  13576. cursor: pointer;
  13577. z-index: 999;
  13578. }
  13579. .dropdown-content .dropdown-option {
  13580. white-space: nowrap;
  13581. }
  13582. .dropdown-content .dropdown-option:hover {
  13583. background-color: #f3f3f3;
  13584. }
  13585. .dropdown-content .dropdown-option.active {
  13586. color: #1890ff;
  13587. }
  13588. .space {
  13589. display: inline-block;
  13590. }
  13591. `;
  13592.  
  13593. /* eslint-disable no-undef */
  13594. /// <reference path="./global.d.ts" />
  13595.  
  13596. const { start, definedProjects, CommonProject } = OCS;
  13597.  
  13598. (function () {
  13599. 'use strict';
  13600.  
  13601. // 运行脚本
  13602. start({
  13603. style: STYLE,
  13604. projects: definedProjects(),
  13605. defaultPanelName: CommonProject.scripts.guide.namespace
  13606. });
  13607. })();