OCS 网课助手

OCS(online-course-script) 网课助手,专注于帮助大学生从网课中释放出来。让自己的时间把握在自己的手中,拥有人性化的操作页面,流畅的步骤提示,支持 智慧树,学习通,等网课的学习,作业。具体的功能请查看脚本悬浮窗中的教程页面,OCS官网 https://docs.ocsjs.com 。

目前為 2023-03-07 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name OCS 网课助手
  3. // @version 4.0.2
  4. // @description OCS(online-course-script) 网课助手,专注于帮助大学生从网课中释放出来。让自己的时间把握在自己的手中,拥有人性化的操作页面,流畅的步骤提示,支持 智慧树,学习通,等网课的学习,作业。具体的功能请查看脚本悬浮窗中的教程页面,OCS官网 https://docs.ocsjs.com 。
  5. // @author enncy
  6. // @license MIT
  7. // @match *://*.zhihuishu.com/*
  8. // @match *://*.chaoxing.com/*
  9. // @match *://*.edu.cn/*
  10. // @match *://*.org.cn/*
  11. // @grant GM_info
  12. // @grant GM_getTab
  13. // @grant GM_saveTab
  14. // @grant GM_setValue
  15. // @grant GM_getValue
  16. // @grant unsafeWindow
  17. // @grant GM_listValues
  18. // @grant GM_deleteValue
  19. // @grant GM_notification
  20. // @grant GM_xmlhttpRequest
  21. // @grant GM_getResourceText
  22. // @grant GM_addValueChangeListener
  23. // @grant GM_removeValueChangeListener
  24. // @run-at document-start
  25. // @namespace https://enncy.cn
  26. // @homepage https://docs.ocsjs.com
  27. // @source https://github.com/ocsjs/ocsjs
  28. // @icon https://cdn.ocsjs.com/logo.png
  29. // @connect enncy.cn
  30. // @connect icodef.com
  31. // @connect ocsjs.com
  32. // @connect localhost
  33. // ==/UserScript==
  34.  
  35. (function(global2, factory) {
  36. 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 = {}));
  37. })(this, function(exports2) {
  38. "use strict";
  39. var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
  40. function isObject$2(value) {
  41. var type = typeof value;
  42. return value != null && (type == "object" || type == "function");
  43. }
  44. var isObject_1 = isObject$2;
  45. var freeGlobal$1 = typeof commonjsGlobal == "object" && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;
  46. var _freeGlobal = freeGlobal$1;
  47. var freeGlobal = _freeGlobal;
  48. var freeSelf = typeof self == "object" && self && self.Object === Object && self;
  49. var root$3 = freeGlobal || freeSelf || Function("return this")();
  50. var _root = root$3;
  51. var root$2 = _root;
  52. var now$1 = function() {
  53. return root$2.Date.now();
  54. };
  55. var now_1 = now$1;
  56. var reWhitespace = /\s/;
  57. function trimmedEndIndex$1(string) {
  58. var index = string.length;
  59. while (index-- && reWhitespace.test(string.charAt(index))) {
  60. }
  61. return index;
  62. }
  63. var _trimmedEndIndex = trimmedEndIndex$1;
  64. var trimmedEndIndex = _trimmedEndIndex;
  65. var reTrimStart = /^\s+/;
  66. function baseTrim$1(string) {
  67. return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, "") : string;
  68. }
  69. var _baseTrim = baseTrim$1;
  70. var root$1 = _root;
  71. var Symbol$3 = root$1.Symbol;
  72. var _Symbol = Symbol$3;
  73. var Symbol$2 = _Symbol;
  74. var objectProto$1 = Object.prototype;
  75. var hasOwnProperty = objectProto$1.hasOwnProperty;
  76. var nativeObjectToString$1 = objectProto$1.toString;
  77. var symToStringTag$1 = Symbol$2 ? Symbol$2.toStringTag : void 0;
  78. function getRawTag$1(value) {
  79. var isOwn = hasOwnProperty.call(value, symToStringTag$1), tag = value[symToStringTag$1];
  80. try {
  81. value[symToStringTag$1] = void 0;
  82. var unmasked = true;
  83. } catch (e) {
  84. }
  85. var result = nativeObjectToString$1.call(value);
  86. if (unmasked) {
  87. if (isOwn) {
  88. value[symToStringTag$1] = tag;
  89. } else {
  90. delete value[symToStringTag$1];
  91. }
  92. }
  93. return result;
  94. }
  95. var _getRawTag = getRawTag$1;
  96. var objectProto = Object.prototype;
  97. var nativeObjectToString = objectProto.toString;
  98. function objectToString$1(value) {
  99. return nativeObjectToString.call(value);
  100. }
  101. var _objectToString = objectToString$1;
  102. var Symbol$1 = _Symbol, getRawTag = _getRawTag, objectToString = _objectToString;
  103. var nullTag = "[object Null]", undefinedTag = "[object Undefined]";
  104. var symToStringTag = Symbol$1 ? Symbol$1.toStringTag : void 0;
  105. function baseGetTag$1(value) {
  106. if (value == null) {
  107. return value === void 0 ? undefinedTag : nullTag;
  108. }
  109. return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);
  110. }
  111. var _baseGetTag = baseGetTag$1;
  112. function isObjectLike$1(value) {
  113. return value != null && typeof value == "object";
  114. }
  115. var isObjectLike_1 = isObjectLike$1;
  116. var baseGetTag = _baseGetTag, isObjectLike = isObjectLike_1;
  117. var symbolTag = "[object Symbol]";
  118. function isSymbol$1(value) {
  119. return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag;
  120. }
  121. var isSymbol_1 = isSymbol$1;
  122. var baseTrim = _baseTrim, isObject$1 = isObject_1, isSymbol = isSymbol_1;
  123. var NAN = 0 / 0;
  124. var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
  125. var reIsBinary = /^0b[01]+$/i;
  126. var reIsOctal = /^0o[0-7]+$/i;
  127. var freeParseInt = parseInt;
  128. function toNumber$1(value) {
  129. if (typeof value == "number") {
  130. return value;
  131. }
  132. if (isSymbol(value)) {
  133. return NAN;
  134. }
  135. if (isObject$1(value)) {
  136. var other = typeof value.valueOf == "function" ? value.valueOf() : value;
  137. value = isObject$1(other) ? other + "" : other;
  138. }
  139. if (typeof value != "string") {
  140. return value === 0 ? value : +value;
  141. }
  142. value = baseTrim(value);
  143. var isBinary = reIsBinary.test(value);
  144. return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
  145. }
  146. var toNumber_1 = toNumber$1;
  147. var isObject = isObject_1, now = now_1, toNumber = toNumber_1;
  148. var FUNC_ERROR_TEXT = "Expected a function";
  149. var nativeMax = Math.max, nativeMin = Math.min;
  150. function debounce(func, wait, options) {
  151. var lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true;
  152. if (typeof func != "function") {
  153. throw new TypeError(FUNC_ERROR_TEXT);
  154. }
  155. wait = toNumber(wait) || 0;
  156. if (isObject(options)) {
  157. leading = !!options.leading;
  158. maxing = "maxWait" in options;
  159. maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
  160. trailing = "trailing" in options ? !!options.trailing : trailing;
  161. }
  162. function invokeFunc(time) {
  163. var args = lastArgs, thisArg = lastThis;
  164. lastArgs = lastThis = void 0;
  165. lastInvokeTime = time;
  166. result = func.apply(thisArg, args);
  167. return result;
  168. }
  169. function leadingEdge(time) {
  170. lastInvokeTime = time;
  171. timerId = setTimeout(timerExpired, wait);
  172. return leading ? invokeFunc(time) : result;
  173. }
  174. function remainingWait(time) {
  175. var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall;
  176. return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
  177. }
  178. function shouldInvoke(time) {
  179. var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime;
  180. return lastCallTime === void 0 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
  181. }
  182. function timerExpired() {
  183. var time = now();
  184. if (shouldInvoke(time)) {
  185. return trailingEdge(time);
  186. }
  187. timerId = setTimeout(timerExpired, remainingWait(time));
  188. }
  189. function trailingEdge(time) {
  190. timerId = void 0;
  191. if (trailing && lastArgs) {
  192. return invokeFunc(time);
  193. }
  194. lastArgs = lastThis = void 0;
  195. return result;
  196. }
  197. function cancel() {
  198. if (timerId !== void 0) {
  199. clearTimeout(timerId);
  200. }
  201. lastInvokeTime = 0;
  202. lastArgs = lastCallTime = lastThis = timerId = void 0;
  203. }
  204. function flush() {
  205. return timerId === void 0 ? result : trailingEdge(now());
  206. }
  207. function debounced() {
  208. var time = now(), isInvoking = shouldInvoke(time);
  209. lastArgs = arguments;
  210. lastThis = this;
  211. lastCallTime = time;
  212. if (isInvoking) {
  213. if (timerId === void 0) {
  214. return leadingEdge(lastCallTime);
  215. }
  216. if (maxing) {
  217. clearTimeout(timerId);
  218. timerId = setTimeout(timerExpired, wait);
  219. return invokeFunc(lastCallTime);
  220. }
  221. }
  222. if (timerId === void 0) {
  223. timerId = setTimeout(timerExpired, wait);
  224. }
  225. return result;
  226. }
  227. debounced.cancel = cancel;
  228. debounced.flush = flush;
  229. return debounced;
  230. }
  231. var debounce_1 = debounce;
  232. const $string = {
  233. humpToTarget(value, target) {
  234. return value.replace(/([A-Z])/g, target + "$1").toLowerCase().split(target).slice(1).join(target);
  235. }
  236. };
  237. class StringUtils {
  238. constructor(_text) {
  239. this._text = _text;
  240. }
  241. static nowrap(str) {
  242. return (str == null ? void 0 : str.replace(/\n/g, "")) || "";
  243. }
  244. nowrap() {
  245. this._text = StringUtils.nowrap(this._text);
  246. return this;
  247. }
  248. static nospace(str) {
  249. return (str == null ? void 0 : str.replace(/ +/g, " ")) || "";
  250. }
  251. nospace() {
  252. this._text = StringUtils.nospace(this._text);
  253. return this;
  254. }
  255. static noSpecialChar(str) {
  256. return (str == null ? void 0 : str.replace(/[^\w\s]/gi, "")) || "";
  257. }
  258. noSpecialChar() {
  259. this._text = StringUtils.noSpecialChar(this._text);
  260. return this;
  261. }
  262. static max(str, len) {
  263. return str.length > len ? str.substring(0, len) + "..." : str;
  264. }
  265. max(len) {
  266. this._text = StringUtils.max(this._text, len);
  267. return this;
  268. }
  269. static hide(str, start2, end, replacer = "*") {
  270. return str.substring(0, start2) + str.substring(start2, end).replace(/./g, replacer) + str.substring(end);
  271. }
  272. hide(start2, end, replacer = "*") {
  273. this._text = StringUtils.hide(this._text, start2, end, replacer);
  274. return this;
  275. }
  276. static of(text) {
  277. return new StringUtils(text);
  278. }
  279. toString() {
  280. return this._text;
  281. }
  282. }
  283. const $const = {
  284. TAB_UID: "_uid_",
  285. TAB_URLS: "_urls_",
  286. TAB_CURRENT_PANEL_NAME: "_current_panel_name_"
  287. };
  288. class LocalStoreChangeEvent extends Event {
  289. constructor() {
  290. super(...arguments);
  291. this.key = "";
  292. }
  293. }
  294. const _ObjectStoreProvider = class {
  295. get(key, defaultValue) {
  296. var _a;
  297. return (_a = Reflect.get(_ObjectStoreProvider._source.store, key)) != null ? _a : defaultValue;
  298. }
  299. set(key, value) {
  300. var _a;
  301. const pre = Reflect.get(_ObjectStoreProvider._source.store, key);
  302. Reflect.set(_ObjectStoreProvider._source.store, key, value);
  303. (_a = _ObjectStoreProvider.storeListeners.get(key)) == null ? void 0 : _a.forEach((lis) => lis(value, pre));
  304. }
  305. delete(key) {
  306. Reflect.deleteProperty(_ObjectStoreProvider._source.store, key);
  307. }
  308. list() {
  309. return Object.keys(_ObjectStoreProvider._source.store);
  310. }
  311. async getTab(key) {
  312. return Reflect.get(_ObjectStoreProvider._source.tab, key);
  313. }
  314. async setTab(key, value) {
  315. var _a;
  316. Reflect.set(_ObjectStoreProvider._source.tab, key, value);
  317. (_a = _ObjectStoreProvider.tabListeners.get(key)) == null ? void 0 : _a.forEach((lis) => lis(value, this.getTab(key)));
  318. }
  319. addChangeListener(key, listener) {
  320. const listeners = _ObjectStoreProvider.storeListeners.get(key) || [];
  321. listeners.push(listener);
  322. _ObjectStoreProvider.storeListeners.set(key, listeners);
  323. }
  324. removeChangeListener(listener) {
  325. _ObjectStoreProvider.tabListeners.forEach((lis, key) => {
  326. const index = lis.findIndex((l) => l === listener);
  327. if (index !== -1) {
  328. lis.splice(index, 1);
  329. _ObjectStoreProvider.tabListeners.set(key, lis);
  330. }
  331. });
  332. }
  333. addTabChangeListener(key, listener) {
  334. const listeners = _ObjectStoreProvider.tabListeners.get(key) || [];
  335. listeners.push(listener);
  336. _ObjectStoreProvider.tabListeners.set(key, listeners);
  337. }
  338. removeTabChangeListener(key, listener) {
  339. const listeners = _ObjectStoreProvider.tabListeners.get(key) || [];
  340. const index = listeners.findIndex((l) => l === listener);
  341. if (index !== -1) {
  342. listeners.splice(index, 1);
  343. _ObjectStoreProvider.tabListeners.set(key, listeners);
  344. }
  345. }
  346. };
  347. let ObjectStoreProvider = _ObjectStoreProvider;
  348. ObjectStoreProvider._source = { store: {}, tab: {} };
  349. ObjectStoreProvider.storeListeners = /* @__PURE__ */ new Map();
  350. ObjectStoreProvider.tabListeners = /* @__PURE__ */ new Map();
  351. class GMStoreProvider {
  352. getTabChangeHandleKey(tabUid, key) {
  353. return `_tab_change_${tabUid}_${key}`;
  354. }
  355. get(key, defaultValue) {
  356. return GM_getValue(key, defaultValue);
  357. }
  358. set(key, value) {
  359. GM_setValue(key, value);
  360. }
  361. delete(key) {
  362. GM_deleteValue(key);
  363. }
  364. list() {
  365. return GM_listValues();
  366. }
  367. getTab(key) {
  368. return new Promise((resolve, reject) => {
  369. GM_getTab((tab = {}) => resolve(Reflect.get(tab, key)));
  370. });
  371. }
  372. setTab(key, value) {
  373. return new Promise((resolve, reject) => {
  374. GM_getTab((tab = {}) => {
  375. Reflect.set(tab, key, value);
  376. GM_saveTab(tab);
  377. this.set(this.getTabChangeHandleKey(Reflect.get(tab, $const.TAB_UID), key), value);
  378. resolve();
  379. });
  380. });
  381. }
  382. addChangeListener(key, listener) {
  383. return GM_addValueChangeListener(key, (_, pre, curr, remote) => {
  384. listener(pre, curr, remote);
  385. });
  386. }
  387. removeChangeListener(listenerId) {
  388. GM_removeValueChangeListener(listenerId);
  389. }
  390. async addTabChangeListener(key, listener) {
  391. const uid = await this.getTab($const.TAB_UID);
  392. return GM_addValueChangeListener(this.getTabChangeHandleKey(uid, key), (_, pre, curr) => {
  393. listener(curr, pre);
  394. });
  395. }
  396. removeTabChangeListener(key, listener) {
  397. return this.removeChangeListener(listener);
  398. }
  399. }
  400. const $store = typeof globalThis.unsafeWindow === "undefined" ? new ObjectStoreProvider() : new GMStoreProvider();
  401. const $ = {
  402. createConfigProxy(script) {
  403. var _a, _b;
  404. const proxy = new Proxy(script.cfg, {
  405. set(target, propertyKey, value) {
  406. const key = $.namespaceKey(script.namespace, propertyKey);
  407. $store.set(key, value);
  408. return Reflect.set(target, propertyKey, value);
  409. },
  410. get(target, propertyKey) {
  411. const value = $store.get($.namespaceKey(script.namespace, propertyKey));
  412. Reflect.set(target, propertyKey, value);
  413. return value;
  414. }
  415. });
  416. for (const key in script.configs) {
  417. if (Object.prototype.hasOwnProperty.call(script.configs, key)) {
  418. const element = Reflect.get(script.configs, key);
  419. Reflect.set(proxy, key, $store.get($.namespaceKey(script.namespace, key), element.defaultValue));
  420. }
  421. }
  422. if (script.namespace) {
  423. proxy.notes = (_b = (_a = script.configs) == null ? void 0 : _a.notes) == null ? void 0 : _b.defaultValue;
  424. }
  425. return proxy;
  426. },
  427. getAllRawConfigs(scripts) {
  428. const object = {};
  429. for (const script of scripts) {
  430. for (const key in script.configs) {
  431. if (Object.prototype.hasOwnProperty.call(script.configs, key)) {
  432. const { label, ...element } = script.configs[key];
  433. Reflect.set(object, $.namespaceKey(script.namespace, key), {
  434. label: $.namespaceKey(script.namespace, key),
  435. ...element
  436. });
  437. }
  438. }
  439. }
  440. return object;
  441. },
  442. getMatchedScripts(projects, urls) {
  443. var _a;
  444. const scripts = [];
  445. for (const project of projects) {
  446. for (const key in project.scripts) {
  447. if (Object.prototype.hasOwnProperty.call(project.scripts, key)) {
  448. const script = project.scripts[key];
  449. if ((_a = script.excludes) == null ? void 0 : _a.some((u) => urls.some((url) => RegExp(u[1]).test(url)))) {
  450. continue;
  451. }
  452. if (script.url.some((u) => urls.some((url) => RegExp(u[1]).test(url)))) {
  453. scripts.push(script);
  454. }
  455. }
  456. }
  457. }
  458. return scripts;
  459. },
  460. namespaceKey(namespace, key) {
  461. return namespace ? namespace + "." + key.toString() : key.toString();
  462. },
  463. uuid() {
  464. return "xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g, function(c) {
  465. const r = Math.random() * 16 | 0;
  466. const v = c === "x" ? r : r & 3 | 8;
  467. return v.toString(16);
  468. });
  469. },
  470. random(min, max) {
  471. return Math.round(Math.random() * (max - min)) + min;
  472. },
  473. async sleep(period) {
  474. return new Promise((resolve) => {
  475. setTimeout(resolve, period);
  476. });
  477. },
  478. isInBrowser() {
  479. return typeof window !== "undefined" && typeof window.document !== "undefined";
  480. },
  481. elementToRawObject(el2) {
  482. return {
  483. innerText: el2 == null ? void 0 : el2.innerText,
  484. innerHTML: el2 == null ? void 0 : el2.innerHTML,
  485. textContent: el2 == null ? void 0 : el2.textContent
  486. };
  487. },
  488. onresize(el2, handler) {
  489. const resize = debounce_1(() => {
  490. if (el2.parentNode === null) {
  491. window.removeEventListener("resize", resize);
  492. } else {
  493. handler(el2);
  494. }
  495. }, 200);
  496. resize();
  497. window.addEventListener("resize", resize);
  498. },
  499. simplifyWorkResult(results) {
  500. var _a, _b, _c, _d;
  501. const res = [];
  502. for (const wr of results) {
  503. res.push({
  504. requesting: wr.requesting,
  505. resolving: wr.resolving,
  506. error: wr.error,
  507. question: (((_b = (_a = wr.ctx) == null ? void 0 : _a.elements.title) == null ? void 0 : _b.map((t) => (t == null ? void 0 : t.innerText) || "").filter(Boolean).join(",")) || "\u65E0").replace(/\d+\.\s*\((.+题|名词解释|完形填空|阅读理解), .+分\)/, "").replace(/[[|(|【|(]..题[\]|)|】|)]/, ""),
  508. finish: (_c = wr.result) == null ? void 0 : _c.finish,
  509. searchResults: ((_d = wr.ctx) == null ? void 0 : _d.searchResults.map((sr) => {
  510. var _a2;
  511. return {
  512. error: (_a2 = sr.error) == null ? void 0 : _a2.message,
  513. name: sr.name,
  514. homepage: sr.homepage,
  515. results: sr.answers.map((ans) => [ans.question, ans.answer])
  516. };
  517. })) || []
  518. });
  519. }
  520. return res;
  521. },
  522. loadCustomElements(elements) {
  523. for (const element of elements) {
  524. const name = $string.humpToTarget(element.name, "-");
  525. if (customElements.get(name) === void 0) {
  526. customElements.define(name, element);
  527. }
  528. }
  529. }
  530. };
  531. async function start(startConfig) {
  532. const uid = await $store.getTab($const.TAB_UID);
  533. if (uid === void 0) {
  534. await $store.setTab($const.TAB_UID, $.uuid());
  535. }
  536. startConfig.projects = startConfig.projects.map((p) => {
  537. for (const key in p.scripts) {
  538. if (Object.prototype.hasOwnProperty.call(p.scripts, key)) {
  539. p.scripts[key].cfg = $.createConfigProxy(p.scripts[key]);
  540. }
  541. }
  542. return p;
  543. });
  544. const scripts = $.getMatchedScripts(startConfig.projects, [location.href]);
  545. scripts.forEach((script) => {
  546. var _a;
  547. script.emit("start", startConfig);
  548. (_a = script.onstart) == null ? void 0 : _a.call(script, startConfig);
  549. });
  550. let active = false;
  551. if (document.readyState === "interactive") {
  552. active = true;
  553. scripts.forEach((script) => {
  554. var _a;
  555. return (_a = script.onactive) == null ? void 0 : _a.call(script, startConfig);
  556. });
  557. }
  558. document.addEventListener("readystatechange", () => {
  559. if (document.readyState === "interactive" && active === false) {
  560. scripts.forEach((script) => {
  561. var _a;
  562. script.emit("active", startConfig);
  563. (_a = script.onactive) == null ? void 0 : _a.call(script, startConfig);
  564. });
  565. }
  566. if (document.readyState === "complete") {
  567. scripts.forEach((script) => {
  568. var _a;
  569. script.emit("complete");
  570. (_a = script.oncomplete) == null ? void 0 : _a.call(script, startConfig);
  571. });
  572. $store.getTab("_urls_").then((urls) => {
  573. $store.setTab(`_urls_`, Array.from(new Set(urls || [])).concat(location.href));
  574. });
  575. }
  576. });
  577. history.pushState = addFunctionEventListener(history, "pushState");
  578. history.replaceState = addFunctionEventListener(history, "replaceState");
  579. window.addEventListener("pushState", () => {
  580. scripts.forEach((script) => {
  581. var _a;
  582. script.emit("historychange", "push", startConfig);
  583. (_a = script.onhistorychange) == null ? void 0 : _a.call(script, "push", startConfig);
  584. });
  585. });
  586. window.addEventListener("replaceState", () => {
  587. scripts.forEach((script) => {
  588. var _a;
  589. script.emit("historychange", "replace", startConfig);
  590. (_a = script.onhistorychange) == null ? void 0 : _a.call(script, "replace", startConfig);
  591. });
  592. });
  593. window.onbeforeunload = (e) => {
  594. var _a;
  595. let prevent;
  596. for (const script of scripts) {
  597. script.emit("beforeunload");
  598. if ((_a = script.onbeforeunload) == null ? void 0 : _a.call(script, startConfig)) {
  599. prevent = true;
  600. }
  601. }
  602. if (prevent) {
  603. e.preventDefault();
  604. e.returnValue = true;
  605. return true;
  606. }
  607. };
  608. }
  609. function addFunctionEventListener(obj, type) {
  610. const origin = obj[type];
  611. return function(...args) {
  612. const res = origin.apply(this, args);
  613. const e = new Event(type.toString());
  614. e.arguments = args;
  615. window.dispatchEvent(e);
  616. return res;
  617. };
  618. }
  619. function el(tagName, attrsOrChildren, childrenOrHandler) {
  620. const element = document.createElement(tagName);
  621. if (attrsOrChildren) {
  622. if (Array.isArray(attrsOrChildren)) {
  623. element.append(...attrsOrChildren);
  624. } else if (typeof attrsOrChildren === "string") {
  625. element.append(attrsOrChildren);
  626. } else {
  627. const attrs = attrsOrChildren;
  628. for (const key in attrs) {
  629. if (Object.prototype.hasOwnProperty.call(attrs, key)) {
  630. const value = attrs[key];
  631. Reflect.set(element, key, value);
  632. }
  633. }
  634. }
  635. }
  636. if (childrenOrHandler) {
  637. if (typeof childrenOrHandler === "function") {
  638. childrenOrHandler.call(element, element);
  639. } else if (Array.isArray(childrenOrHandler)) {
  640. element.append(...childrenOrHandler);
  641. } else if (typeof childrenOrHandler === "string") {
  642. element.append(childrenOrHandler);
  643. }
  644. }
  645. return element;
  646. }
  647. function $el(selector, root2 = window.document) {
  648. return root2.querySelector(selector);
  649. }
  650. function $$el(selector, root2 = window.document) {
  651. return Array.from(root2.querySelectorAll(selector));
  652. }
  653. function enableElementDraggable(header, target, ondrag) {
  654. let pos1 = 0;
  655. let pos2 = 0;
  656. let pos3 = 0;
  657. let pos4 = 0;
  658. header.onmousedown = dragMouseDown;
  659. function dragMouseDown(e) {
  660. e = e || window.event;
  661. pos3 = e.clientX;
  662. pos4 = e.clientY;
  663. document.onmouseup = closeDragElement;
  664. document.onmousemove = elementDrag;
  665. }
  666. function elementDrag(e) {
  667. e = e || window.event;
  668. pos1 = pos3 - e.clientX;
  669. pos2 = pos4 - e.clientY;
  670. pos3 = e.clientX;
  671. pos4 = e.clientY;
  672. target.style.top = target.offsetTop - pos2 + "px";
  673. target.style.left = target.offsetLeft - pos1 + "px";
  674. }
  675. function closeDragElement() {
  676. ondrag == null ? void 0 : ondrag();
  677. document.onmouseup = null;
  678. document.onmousemove = null;
  679. }
  680. }
  681. class IElement extends HTMLElement {
  682. }
  683. class ConfigElement extends IElement {
  684. constructor() {
  685. super(...arguments);
  686. this.label = el("label");
  687. this.wrapper = el("div", { className: "config-wrapper" });
  688. this.key = "";
  689. }
  690. get value() {
  691. return $store.get(this.key);
  692. }
  693. connectedCallback() {
  694. var _a;
  695. const createInput = () => {
  696. this.provider = el("input");
  697. if (["checkbox", "radio"].some((t) => {
  698. var _a2;
  699. return t === ((_a2 = this.attrs) == null ? void 0 : _a2.type);
  700. })) {
  701. this.provider.checked = $store.get(this.key, this.defaultValue);
  702. const provider = this.provider;
  703. provider.onchange = () => {
  704. $store.set(this.key, provider.checked);
  705. };
  706. } else {
  707. this.provider.value = $store.get(this.key, this.defaultValue);
  708. this.provider.setAttribute("value", this.provider.value);
  709. this.provider.onchange = () => {
  710. const { min, max, type } = this.attrs || {};
  711. if (type === "number") {
  712. const val = parseFloat(this.provider.value);
  713. const _min = min ? parseFloat(min) : void 0;
  714. const _max = max ? parseFloat(max) : void 0;
  715. if (_min && val < _min) {
  716. this.provider.value = _min.toString();
  717. } else if (_max && val > _max) {
  718. this.provider.value = _max.toString();
  719. } else {
  720. $store.set(this.key, val);
  721. }
  722. } else {
  723. $store.set(this.key, this.provider.value);
  724. }
  725. };
  726. }
  727. };
  728. switch (this.tag) {
  729. case "input": {
  730. createInput();
  731. break;
  732. }
  733. case "select": {
  734. this.provider = el("select");
  735. this.provider.setAttribute("value", $store.get(this.key, this.defaultValue));
  736. this.provider.onchange = () => {
  737. $store.set(this.key, this.provider.value);
  738. };
  739. break;
  740. }
  741. case "textarea": {
  742. this.provider = el("textarea");
  743. this.provider.value = $store.get(this.key, this.defaultValue);
  744. this.provider.onchange = () => {
  745. $store.set(this.key, this.provider.value);
  746. };
  747. break;
  748. }
  749. default: {
  750. createInput();
  751. break;
  752. }
  753. }
  754. this.wrapper.replaceWith(this.provider);
  755. this.append(this.label, this.wrapper);
  756. for (const key in this.attrs) {
  757. if (Object.prototype.hasOwnProperty.call(this.attrs, key)) {
  758. Reflect.set(this.provider, key, Reflect.get(this.attrs, key));
  759. }
  760. }
  761. if (this.sync) {
  762. $store.addChangeListener(this.key, (pre, curr, remote) => {
  763. this.provider.value = curr;
  764. });
  765. }
  766. $creator.tooltip(this.provider);
  767. (_a = this._onload) == null ? void 0 : _a.call(this.provider, this);
  768. }
  769. }
  770. class ContainerElement extends IElement {
  771. constructor() {
  772. super(...arguments);
  773. this.header = $creator.tooltip(el("header-element", { className: "header", title: "\u83DC\u5355\u680F-\u53EF\u62D6\u52A8\u533A\u57DF" }));
  774. this.body = el("div", { className: "body", clientHeight: window.innerHeight / 2 });
  775. this.footer = el("div", { className: "footer" });
  776. }
  777. connectedCallback() {
  778. this.append(this.header, this.body, this.footer);
  779. $.onresize(this, (cont) => {
  780. cont.body.style.maxHeight = window.innerHeight - this.header.clientHeight - 100 + "px";
  781. cont.body.style.maxWidth = window.innerWidth - 50 + "px";
  782. });
  783. }
  784. }
  785. class HeaderElement extends IElement {
  786. connectedCallback() {
  787. this.append(
  788. this.profile || "",
  789. this.projectSelector || "",
  790. this.logo || "",
  791. this.visualSwitcher || "",
  792. this.closeButton || ""
  793. );
  794. }
  795. }
  796. class MessageElement extends IElement {
  797. constructor() {
  798. super(...arguments);
  799. this.closer = el("span", { className: "message-closer" }, "x");
  800. this.contentContainer = el("span", { className: "message-content-container" });
  801. this.type = "info";
  802. this.content = "";
  803. this.closeable = true;
  804. }
  805. connectedCallback() {
  806. this.classList.add(this.type);
  807. if (typeof this.content === "string") {
  808. this.contentContainer.innerHTML = this.content;
  809. } else {
  810. this.contentContainer.append(this.content);
  811. }
  812. this.duration = Math.max(this.duration === 0 ? 0 : this.duration || 5, 0);
  813. this.append(this.contentContainer);
  814. if (this.closeable) {
  815. this.append(this.closer);
  816. this.closer.addEventListener("click", () => {
  817. var _a;
  818. (_a = this.onClose) == null ? void 0 : _a.call(this);
  819. this.remove();
  820. });
  821. }
  822. if (this.duration) {
  823. setTimeout(() => {
  824. var _a;
  825. (_a = this.onClose) == null ? void 0 : _a.call(this);
  826. this.remove();
  827. }, this.duration * 1e3);
  828. }
  829. }
  830. }
  831. const $gm = {
  832. unsafeWindow: typeof globalThis.unsafeWindow === "undefined" ? globalThis.window : globalThis.unsafeWindow,
  833. getInfos() {
  834. return typeof GM_info === "undefined" ? void 0 : GM_info;
  835. },
  836. getTab(callback) {
  837. return typeof GM_getTab === "undefined" ? void 0 : GM_getTab(callback);
  838. },
  839. notification(content, options) {
  840. var _a;
  841. const { onclick, ondone, important, duration = 0 } = options || {};
  842. const { icon, name } = ((_a = $gm.getInfos()) == null ? void 0 : _a.script) || {};
  843. GM_notification({
  844. title: name,
  845. text: content,
  846. image: icon || "",
  847. highlight: important,
  848. onclick,
  849. ondone,
  850. silent: true,
  851. timeout: duration * 1e3
  852. });
  853. }
  854. };
  855. class ModelElement extends IElement {
  856. constructor() {
  857. var _a;
  858. super(...arguments);
  859. this.profile = el("div", {
  860. innerText: "\u5F39\u7A97\u6765\u81EA: OCS " + (((_a = $gm.getInfos()) == null ? void 0 : _a.script.version) || ""),
  861. className: "model-profile"
  862. });
  863. this._title = el("div", { className: "model-title" });
  864. this.body = el("div", { className: "model-body" });
  865. this.footer = el("div", { className: "model-footer" });
  866. this.modalInput = el("input", { className: "model-input" });
  867. this.type = "alert";
  868. this.content = "";
  869. this.inputDefaultValue = "";
  870. this.placeholder = "";
  871. }
  872. connectedCallback() {
  873. this.classList.add(this.type);
  874. this._title.innerText = this.title;
  875. this.body.append(typeof this.content === "string" ? el("div", { innerHTML: this.content }) : this.content);
  876. this.modalInput.placeholder = this.placeholder || "";
  877. this.modalInput.value = this.inputDefaultValue || "";
  878. this.footer.append(this.modalInput);
  879. this.append(this.profile, this._title, this.body, this.footer);
  880. this.style.width = (this.width || 400) + "px";
  881. if (this.cancelButton === void 0) {
  882. this.cancelButton = el("button", { className: "model-cancel-button" });
  883. this.cancelButton.innerText = this.cancelButtonText || "\u53D6\u6D88";
  884. this.cancelButton.addEventListener("click", () => {
  885. var _a, _b;
  886. (_a = this.onCancel) == null ? void 0 : _a.call(this);
  887. (_b = this.onClose) == null ? void 0 : _b.call(this);
  888. this.remove();
  889. });
  890. }
  891. if (this.confirmButton === void 0) {
  892. this.confirmButton = el("button", { className: "model-confirm-button" });
  893. this.confirmButton.innerText = this.confirmButtonText || "\u786E\u5B9A";
  894. this.confirmButton.addEventListener("click", async () => {
  895. var _a, _b;
  896. if (await ((_a = this.onConfirm) == null ? void 0 : _a.call(this, this.modalInput.value)) !== false) {
  897. this.remove();
  898. (_b = this.onClose) == null ? void 0 : _b.call(this, this.modalInput.value);
  899. }
  900. });
  901. }
  902. this.cancelButton !== null && this.footer.append(this.cancelButton);
  903. this.confirmButton !== null && this.footer.append(this.confirmButton);
  904. $.onresize(this.body, (modal) => {
  905. this.body.style.maxHeight = window.innerHeight - 100 + "px";
  906. this.body.style.maxWidth = window.innerWidth - 50 + "px";
  907. });
  908. }
  909. }
  910. class ScriptPanelElement extends IElement {
  911. constructor() {
  912. super(...arguments);
  913. this.separator = el("div", { className: "separator" });
  914. this.notesContainer = el("div", { className: "notes card" });
  915. this.configsContainer = el("div", { className: "configs card" });
  916. this.configsBody = el("div", { className: "configs-body" });
  917. this.body = el("div", { className: "script-panel-body" });
  918. }
  919. connectedCallback() {
  920. this.separator.innerText = this.name || "";
  921. this.append(this.separator);
  922. this.append(this.notesContainer);
  923. this.append(this.configsContainer);
  924. this.append(this.body);
  925. }
  926. }
  927. function defaultWorkTypeResolver(ctx) {
  928. function count(selector) {
  929. let c = 0;
  930. for (const option of ctx.elements.options || []) {
  931. if ((option == null ? void 0 : option.querySelector(selector)) !== null) {
  932. c++;
  933. }
  934. }
  935. return c;
  936. }
  937. return count('[type="radio"]') === 2 ? "judgement" : count('[type="radio"]') > 2 ? "single" : count('[type="checkbox"]') > 2 ? "multiple" : count("textarea") >= 1 ? "completion" : void 0;
  938. }
  939. function isPlainAnswer(answer) {
  940. if (answer.length > 8 || !/[A-Z]/.test(answer)) {
  941. return false;
  942. }
  943. const counter = {};
  944. let min = 0;
  945. for (let i = 0; i < answer.length; i++) {
  946. if (answer.charCodeAt(i) < min) {
  947. return false;
  948. }
  949. min = answer.charCodeAt(i);
  950. counter[min] = (counter[min] || 0) + 1;
  951. }
  952. for (const key in counter) {
  953. if (counter[key] !== 1) {
  954. return false;
  955. }
  956. }
  957. return true;
  958. }
  959. function splitAnswer(answer) {
  960. try {
  961. const json = JSON.parse(answer);
  962. if (Array.isArray(json)) {
  963. return json.map(String).filter((el2) => el2.trim().length > 0);
  964. }
  965. } catch {
  966. const seprators = ["===", "#", "---", "###", "|", ";"];
  967. for (const sep of seprators) {
  968. if (answer.split(sep).length > 1) {
  969. return answer.split(sep).filter((el2) => el2.trim().length > 0);
  970. }
  971. }
  972. }
  973. return [answer];
  974. }
  975. const transformImgLink = (str) => str.replace(/https?:\/\/.*?\.(png|jpg|jpeg|gif)/g, (match) => `<img src="${match}" />`);
  976. class SearchResultsElement extends IElement {
  977. constructor() {
  978. super(...arguments);
  979. this.results = [];
  980. this.question = "";
  981. }
  982. connectedCallback() {
  983. const question = transformImgLink(this.question || "\u65E0");
  984. this.append(
  985. el("div", [question, $creator.copy("\u590D\u5236", question)], (div) => {
  986. div.style.padding = "4px";
  987. }),
  988. el("hr")
  989. );
  990. this.append(
  991. ...this.results.map((res) => {
  992. return el("details", { open: true }, [
  993. el("summary", [el("a", { href: res.homepage, innerText: res.name })]),
  994. ...res.error ? [el("span", { className: "error" }, ["\u6B64\u9898\u5E93\u641C\u9898\u65F6\u53D1\u751F\u9519\u8BEF\uFF1A", res.error || "\u7F51\u7EDC\u9519\u8BEF\u6216\u8005\u672A\u77E5\u9519\u8BEF"])] : [
  995. ...res.results.map((ans) => {
  996. const title = transformImgLink(ans[0] || this.question || "\u65E0");
  997. const answer = transformImgLink(ans[1] || "\u65E0");
  998. return el("div", { className: "search-result" }, [
  999. el("div", { className: "question" }, [el("span", title), $creator.copy("\u590D\u5236", title)]),
  1000. el("div", { className: "answer" }, [
  1001. el("span", "\u7B54\u6848\uFF1A"),
  1002. ...splitAnswer(answer).map((a) => el("code", a)),
  1003. $creator.copy("\u590D\u5236", splitAnswer(answer).join(" "))
  1004. ])
  1005. ]);
  1006. })
  1007. ]
  1008. ]);
  1009. })
  1010. );
  1011. $.onresize(this, (sr) => {
  1012. sr.style.maxHeight = window.innerHeight / 2 + "px";
  1013. });
  1014. }
  1015. }
  1016. const definedCustomElements = [
  1017. ConfigElement,
  1018. ContainerElement,
  1019. HeaderElement,
  1020. ModelElement,
  1021. MessageElement,
  1022. ScriptPanelElement,
  1023. SearchResultsElement
  1024. ];
  1025. class CorsEventEmitter {
  1026. constructor() {
  1027. this.eventMap = /* @__PURE__ */ new Map();
  1028. }
  1029. eventKey(name) {
  1030. return "cors.events." + name;
  1031. }
  1032. tempKey(...args) {
  1033. return ["_temp_", ...args].join(".");
  1034. }
  1035. keyOfReturn(id) {
  1036. return this.tempKey("event", id, "return");
  1037. }
  1038. keyOfArguments(id) {
  1039. return this.tempKey("event", id, "arguments");
  1040. }
  1041. keyOfState(id) {
  1042. return this.tempKey("event", id, "state");
  1043. }
  1044. emit(name, args, callback) {
  1045. $store.getTab($const.TAB_UID).then((uid) => {
  1046. const id = $.uuid().replace(/-/g, "");
  1047. const key = uid + "." + this.eventKey(name);
  1048. $store.set(this.keyOfState(id), 0);
  1049. $store.set(this.keyOfArguments(id), args);
  1050. const listenerId = $store.addChangeListener(this.keyOfState(id), (pre, curr, remote) => {
  1051. $store.removeChangeListener(listenerId);
  1052. callback($store.get(this.keyOfReturn(id)), !!remote);
  1053. $store.delete(this.keyOfState(id));
  1054. $store.delete(this.keyOfReturn(id));
  1055. $store.delete(this.keyOfArguments(id));
  1056. }) || 0;
  1057. $store.set(key, ($store.get(key) ? String($store.get(key)).split(",") : []).concat(id).join(","));
  1058. }).catch(console.error);
  1059. }
  1060. on(name, handler) {
  1061. return new Promise((resolve) => {
  1062. $store.getTab($const.TAB_UID).then((uid) => {
  1063. const key = uid + "." + this.eventKey(name);
  1064. const originId = this.eventMap.get(key);
  1065. if (originId) {
  1066. resolve(originId);
  1067. } else {
  1068. const id = $store.addChangeListener(key, async (pre, curr, remote) => {
  1069. if (remote) {
  1070. const list = String(curr).split(",");
  1071. const id2 = list.pop();
  1072. if (id2) {
  1073. $store.set(this.keyOfReturn(id2), await handler($store.get(this.keyOfArguments(id2))));
  1074. setTimeout(() => {
  1075. $store.set(this.keyOfState(id2), 1);
  1076. $store.set(key, list.join(","));
  1077. }, 100);
  1078. }
  1079. }
  1080. }) || 0;
  1081. this.eventMap.set(key, id);
  1082. resolve(id);
  1083. }
  1084. }).catch(console.error);
  1085. });
  1086. }
  1087. off(name) {
  1088. const key = this.eventKey(name);
  1089. const originId = this.eventMap.get(key);
  1090. if (originId) {
  1091. this.eventMap.delete(key);
  1092. $store.removeChangeListener(originId);
  1093. }
  1094. }
  1095. }
  1096. if (typeof GM_listValues !== "undefined") {
  1097. window.onload = () => {
  1098. $store.list().forEach((key) => {
  1099. if (/_temp_.event.[0-9a-z]{32}.(state|return|arguments)/.test(key)) {
  1100. $store.delete(key);
  1101. }
  1102. if (/[0-9a-z]{32}.cors.events.model/.test(key)) {
  1103. $store.delete(key);
  1104. }
  1105. });
  1106. };
  1107. }
  1108. const cors = new CorsEventEmitter();
  1109. class Project {
  1110. constructor({ name, level, domains, scripts, studyProject }) {
  1111. this.name = name;
  1112. this.level = level;
  1113. this.domains = domains;
  1114. this.scripts = scripts;
  1115. this.studyProject = studyProject;
  1116. }
  1117. static create(opts) {
  1118. return new Project(opts);
  1119. }
  1120. }
  1121. var events = { exports: {} };
  1122. var R = typeof Reflect === "object" ? Reflect : null;
  1123. var ReflectApply = R && typeof R.apply === "function" ? R.apply : function ReflectApply2(target, receiver, args) {
  1124. return Function.prototype.apply.call(target, receiver, args);
  1125. };
  1126. var ReflectOwnKeys;
  1127. if (R && typeof R.ownKeys === "function") {
  1128. ReflectOwnKeys = R.ownKeys;
  1129. } else if (Object.getOwnPropertySymbols) {
  1130. ReflectOwnKeys = function ReflectOwnKeys2(target) {
  1131. return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target));
  1132. };
  1133. } else {
  1134. ReflectOwnKeys = function ReflectOwnKeys2(target) {
  1135. return Object.getOwnPropertyNames(target);
  1136. };
  1137. }
  1138. function ProcessEmitWarning(warning) {
  1139. if (console && console.warn)
  1140. console.warn(warning);
  1141. }
  1142. var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) {
  1143. return value !== value;
  1144. };
  1145. function EventEmitter() {
  1146. EventEmitter.init.call(this);
  1147. }
  1148. events.exports = EventEmitter;
  1149. events.exports.once = once;
  1150. EventEmitter.EventEmitter = EventEmitter;
  1151. EventEmitter.prototype._events = void 0;
  1152. EventEmitter.prototype._eventsCount = 0;
  1153. EventEmitter.prototype._maxListeners = void 0;
  1154. var defaultMaxListeners = 10;
  1155. function checkListener(listener) {
  1156. if (typeof listener !== "function") {
  1157. throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
  1158. }
  1159. }
  1160. Object.defineProperty(EventEmitter, "defaultMaxListeners", {
  1161. enumerable: true,
  1162. get: function() {
  1163. return defaultMaxListeners;
  1164. },
  1165. set: function(arg) {
  1166. if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) {
  1167. throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + ".");
  1168. }
  1169. defaultMaxListeners = arg;
  1170. }
  1171. });
  1172. EventEmitter.init = function() {
  1173. if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) {
  1174. this._events = /* @__PURE__ */ Object.create(null);
  1175. this._eventsCount = 0;
  1176. }
  1177. this._maxListeners = this._maxListeners || void 0;
  1178. };
  1179. EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
  1180. if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) {
  1181. throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + ".");
  1182. }
  1183. this._maxListeners = n;
  1184. return this;
  1185. };
  1186. function _getMaxListeners(that) {
  1187. if (that._maxListeners === void 0)
  1188. return EventEmitter.defaultMaxListeners;
  1189. return that._maxListeners;
  1190. }
  1191. EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
  1192. return _getMaxListeners(this);
  1193. };
  1194. EventEmitter.prototype.emit = function emit(type) {
  1195. var args = [];
  1196. for (var i = 1; i < arguments.length; i++)
  1197. args.push(arguments[i]);
  1198. var doError = type === "error";
  1199. var events2 = this._events;
  1200. if (events2 !== void 0)
  1201. doError = doError && events2.error === void 0;
  1202. else if (!doError)
  1203. return false;
  1204. if (doError) {
  1205. var er;
  1206. if (args.length > 0)
  1207. er = args[0];
  1208. if (er instanceof Error) {
  1209. throw er;
  1210. }
  1211. var err = new Error("Unhandled error." + (er ? " (" + er.message + ")" : ""));
  1212. err.context = er;
  1213. throw err;
  1214. }
  1215. var handler = events2[type];
  1216. if (handler === void 0)
  1217. return false;
  1218. if (typeof handler === "function") {
  1219. ReflectApply(handler, this, args);
  1220. } else {
  1221. var len = handler.length;
  1222. var listeners = arrayClone(handler, len);
  1223. for (var i = 0; i < len; ++i)
  1224. ReflectApply(listeners[i], this, args);
  1225. }
  1226. return true;
  1227. };
  1228. function _addListener(target, type, listener, prepend) {
  1229. var m;
  1230. var events2;
  1231. var existing;
  1232. checkListener(listener);
  1233. events2 = target._events;
  1234. if (events2 === void 0) {
  1235. events2 = target._events = /* @__PURE__ */ Object.create(null);
  1236. target._eventsCount = 0;
  1237. } else {
  1238. if (events2.newListener !== void 0) {
  1239. target.emit(
  1240. "newListener",
  1241. type,
  1242. listener.listener ? listener.listener : listener
  1243. );
  1244. events2 = target._events;
  1245. }
  1246. existing = events2[type];
  1247. }
  1248. if (existing === void 0) {
  1249. existing = events2[type] = listener;
  1250. ++target._eventsCount;
  1251. } else {
  1252. if (typeof existing === "function") {
  1253. existing = events2[type] = prepend ? [listener, existing] : [existing, listener];
  1254. } else if (prepend) {
  1255. existing.unshift(listener);
  1256. } else {
  1257. existing.push(listener);
  1258. }
  1259. m = _getMaxListeners(target);
  1260. if (m > 0 && existing.length > m && !existing.warned) {
  1261. existing.warned = true;
  1262. var w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit");
  1263. w.name = "MaxListenersExceededWarning";
  1264. w.emitter = target;
  1265. w.type = type;
  1266. w.count = existing.length;
  1267. ProcessEmitWarning(w);
  1268. }
  1269. }
  1270. return target;
  1271. }
  1272. EventEmitter.prototype.addListener = function addListener(type, listener) {
  1273. return _addListener(this, type, listener, false);
  1274. };
  1275. EventEmitter.prototype.on = EventEmitter.prototype.addListener;
  1276. EventEmitter.prototype.prependListener = function prependListener(type, listener) {
  1277. return _addListener(this, type, listener, true);
  1278. };
  1279. function onceWrapper() {
  1280. if (!this.fired) {
  1281. this.target.removeListener(this.type, this.wrapFn);
  1282. this.fired = true;
  1283. if (arguments.length === 0)
  1284. return this.listener.call(this.target);
  1285. return this.listener.apply(this.target, arguments);
  1286. }
  1287. }
  1288. function _onceWrap(target, type, listener) {
  1289. var state2 = { fired: false, wrapFn: void 0, target, type, listener };
  1290. var wrapped = onceWrapper.bind(state2);
  1291. wrapped.listener = listener;
  1292. state2.wrapFn = wrapped;
  1293. return wrapped;
  1294. }
  1295. EventEmitter.prototype.once = function once2(type, listener) {
  1296. checkListener(listener);
  1297. this.on(type, _onceWrap(this, type, listener));
  1298. return this;
  1299. };
  1300. EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) {
  1301. checkListener(listener);
  1302. this.prependListener(type, _onceWrap(this, type, listener));
  1303. return this;
  1304. };
  1305. EventEmitter.prototype.removeListener = function removeListener(type, listener) {
  1306. var list, events2, position, i, originalListener;
  1307. checkListener(listener);
  1308. events2 = this._events;
  1309. if (events2 === void 0)
  1310. return this;
  1311. list = events2[type];
  1312. if (list === void 0)
  1313. return this;
  1314. if (list === listener || list.listener === listener) {
  1315. if (--this._eventsCount === 0)
  1316. this._events = /* @__PURE__ */ Object.create(null);
  1317. else {
  1318. delete events2[type];
  1319. if (events2.removeListener)
  1320. this.emit("removeListener", type, list.listener || listener);
  1321. }
  1322. } else if (typeof list !== "function") {
  1323. position = -1;
  1324. for (i = list.length - 1; i >= 0; i--) {
  1325. if (list[i] === listener || list[i].listener === listener) {
  1326. originalListener = list[i].listener;
  1327. position = i;
  1328. break;
  1329. }
  1330. }
  1331. if (position < 0)
  1332. return this;
  1333. if (position === 0)
  1334. list.shift();
  1335. else {
  1336. spliceOne(list, position);
  1337. }
  1338. if (list.length === 1)
  1339. events2[type] = list[0];
  1340. if (events2.removeListener !== void 0)
  1341. this.emit("removeListener", type, originalListener || listener);
  1342. }
  1343. return this;
  1344. };
  1345. EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
  1346. EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) {
  1347. var listeners, events2, i;
  1348. events2 = this._events;
  1349. if (events2 === void 0)
  1350. return this;
  1351. if (events2.removeListener === void 0) {
  1352. if (arguments.length === 0) {
  1353. this._events = /* @__PURE__ */ Object.create(null);
  1354. this._eventsCount = 0;
  1355. } else if (events2[type] !== void 0) {
  1356. if (--this._eventsCount === 0)
  1357. this._events = /* @__PURE__ */ Object.create(null);
  1358. else
  1359. delete events2[type];
  1360. }
  1361. return this;
  1362. }
  1363. if (arguments.length === 0) {
  1364. var keys = Object.keys(events2);
  1365. var key;
  1366. for (i = 0; i < keys.length; ++i) {
  1367. key = keys[i];
  1368. if (key === "removeListener")
  1369. continue;
  1370. this.removeAllListeners(key);
  1371. }
  1372. this.removeAllListeners("removeListener");
  1373. this._events = /* @__PURE__ */ Object.create(null);
  1374. this._eventsCount = 0;
  1375. return this;
  1376. }
  1377. listeners = events2[type];
  1378. if (typeof listeners === "function") {
  1379. this.removeListener(type, listeners);
  1380. } else if (listeners !== void 0) {
  1381. for (i = listeners.length - 1; i >= 0; i--) {
  1382. this.removeListener(type, listeners[i]);
  1383. }
  1384. }
  1385. return this;
  1386. };
  1387. function _listeners(target, type, unwrap) {
  1388. var events2 = target._events;
  1389. if (events2 === void 0)
  1390. return [];
  1391. var evlistener = events2[type];
  1392. if (evlistener === void 0)
  1393. return [];
  1394. if (typeof evlistener === "function")
  1395. return unwrap ? [evlistener.listener || evlistener] : [evlistener];
  1396. return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
  1397. }
  1398. EventEmitter.prototype.listeners = function listeners(type) {
  1399. return _listeners(this, type, true);
  1400. };
  1401. EventEmitter.prototype.rawListeners = function rawListeners(type) {
  1402. return _listeners(this, type, false);
  1403. };
  1404. EventEmitter.listenerCount = function(emitter, type) {
  1405. if (typeof emitter.listenerCount === "function") {
  1406. return emitter.listenerCount(type);
  1407. } else {
  1408. return listenerCount.call(emitter, type);
  1409. }
  1410. };
  1411. EventEmitter.prototype.listenerCount = listenerCount;
  1412. function listenerCount(type) {
  1413. var events2 = this._events;
  1414. if (events2 !== void 0) {
  1415. var evlistener = events2[type];
  1416. if (typeof evlistener === "function") {
  1417. return 1;
  1418. } else if (evlistener !== void 0) {
  1419. return evlistener.length;
  1420. }
  1421. }
  1422. return 0;
  1423. }
  1424. EventEmitter.prototype.eventNames = function eventNames() {
  1425. return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
  1426. };
  1427. function arrayClone(arr, n) {
  1428. var copy = new Array(n);
  1429. for (var i = 0; i < n; ++i)
  1430. copy[i] = arr[i];
  1431. return copy;
  1432. }
  1433. function spliceOne(list, index) {
  1434. for (; index + 1 < list.length; index++)
  1435. list[index] = list[index + 1];
  1436. list.pop();
  1437. }
  1438. function unwrapListeners(arr) {
  1439. var ret = new Array(arr.length);
  1440. for (var i = 0; i < ret.length; ++i) {
  1441. ret[i] = arr[i].listener || arr[i];
  1442. }
  1443. return ret;
  1444. }
  1445. function once(emitter, name) {
  1446. return new Promise(function(resolve, reject) {
  1447. function errorListener(err) {
  1448. emitter.removeListener(name, resolver);
  1449. reject(err);
  1450. }
  1451. function resolver() {
  1452. if (typeof emitter.removeListener === "function") {
  1453. emitter.removeListener("error", errorListener);
  1454. }
  1455. resolve([].slice.call(arguments));
  1456. }
  1457. eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });
  1458. if (name !== "error") {
  1459. addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });
  1460. }
  1461. });
  1462. }
  1463. function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
  1464. if (typeof emitter.on === "function") {
  1465. eventTargetAgnosticAddListener(emitter, "error", handler, flags);
  1466. }
  1467. }
  1468. function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
  1469. if (typeof emitter.on === "function") {
  1470. if (flags.once) {
  1471. emitter.once(name, listener);
  1472. } else {
  1473. emitter.on(name, listener);
  1474. }
  1475. } else if (typeof emitter.addEventListener === "function") {
  1476. emitter.addEventListener(name, function wrapListener(arg) {
  1477. if (flags.once) {
  1478. emitter.removeEventListener(name, wrapListener);
  1479. }
  1480. listener(arg);
  1481. });
  1482. } else {
  1483. throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter);
  1484. }
  1485. }
  1486. var EventEmitter$1 = events.exports;
  1487. class CommonEventEmitter extends EventEmitter$1 {
  1488. on(eventName, listener) {
  1489. return super.on(eventName.toString(), listener);
  1490. }
  1491. once(eventName, listener) {
  1492. return super.once(eventName.toString(), listener);
  1493. }
  1494. emit(eventName, ...args) {
  1495. return super.emit(eventName.toString(), ...args);
  1496. }
  1497. off(eventName, listener) {
  1498. return super.off(eventName.toString(), listener);
  1499. }
  1500. }
  1501. class BaseScript extends CommonEventEmitter {
  1502. }
  1503. class Script extends BaseScript {
  1504. constructor({
  1505. name,
  1506. namespace,
  1507. url,
  1508. excludes,
  1509. configs,
  1510. hideInPanel,
  1511. onstart,
  1512. onactive,
  1513. oncomplete,
  1514. onbeforeunload,
  1515. onrender,
  1516. onhistorychange
  1517. }) {
  1518. super();
  1519. this.excludes = [];
  1520. this.cfg = {};
  1521. this.event = new EventEmitter$1();
  1522. this.name = name;
  1523. this.namespace = namespace;
  1524. this.url = url;
  1525. this.excludes = excludes;
  1526. this._configs = configs;
  1527. this.hideInPanel = hideInPanel;
  1528. this.onstart = onstart;
  1529. this.onactive = onactive;
  1530. this.oncomplete = oncomplete;
  1531. this.onbeforeunload = onbeforeunload;
  1532. this.onrender = onrender;
  1533. this.onhistorychange = onhistorychange;
  1534. }
  1535. get configs() {
  1536. if (!this._resolvedConfigs) {
  1537. this._resolvedConfigs = typeof this._configs === "function" ? this._configs() : this._configs;
  1538. }
  1539. return this._resolvedConfigs;
  1540. }
  1541. set configs(c) {
  1542. this._configs = c;
  1543. }
  1544. onConfigChange(key, handler) {
  1545. const _key = $.namespaceKey(this.namespace, key.toString());
  1546. return $store.addChangeListener(_key, (pre, curr, remote) => {
  1547. handler(curr, pre, !!remote);
  1548. });
  1549. }
  1550. offConfigChange(listener) {
  1551. $store.removeChangeListener(listener);
  1552. }
  1553. }
  1554. const panel = el("div");
  1555. const root = panel.attachShadow({ mode: "closed" });
  1556. const $elements = {
  1557. panel,
  1558. root,
  1559. messageContainer: el("div", { className: "message-container" }),
  1560. tooltip: el("div", { className: "tooltip" })
  1561. };
  1562. root.append($elements.messageContainer, $elements.tooltip);
  1563. const RenderScript = new Script({
  1564. name: "\u60AC\u6D6E\u7A97",
  1565. url: [["\u6240\u6709", /.*/]],
  1566. namespace: "render.panel",
  1567. configs: {
  1568. x: { defaultValue: window.innerWidth * 0.1 },
  1569. y: { defaultValue: window.innerWidth * 0.1 },
  1570. visual: { defaultValue: "normal" },
  1571. firstCloseAlert: {
  1572. defaultValue: true
  1573. },
  1574. fontsize: {
  1575. label: "\u5B57\u4F53\u5927\u5C0F\uFF08\u50CF\u7D20\uFF09",
  1576. attrs: { type: "number", min: 12, max: 24, step: 1 },
  1577. defaultValue: 14
  1578. },
  1579. switchPoint: {
  1580. label: "\u7A97\u53E3\u663E\u793A\u8FDE\u70B9\uFF08\u6B21\u6570\uFF09",
  1581. attrs: {
  1582. type: "number",
  1583. min: 3,
  1584. max: 10,
  1585. step: 1,
  1586. 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"
  1587. },
  1588. defaultValue: 3
  1589. }
  1590. },
  1591. async onactive({ style, projects }) {
  1592. $.loadCustomElements(definedCustomElements);
  1593. const matchedScripts = $.getMatchedScripts(projects, [location.href]).filter((s) => !s.hideInPanel);
  1594. const container = el("container-element");
  1595. const initHeader = (urls, currentPanelName) => {
  1596. const infos = $gm.getInfos();
  1597. container.header.logo = $creator.tooltip(
  1598. el("img", {
  1599. src: (infos == null ? void 0 : infos.script.icon) || "https://cdn.ocsjs.com/logo.png",
  1600. width: 18,
  1601. className: "logo",
  1602. title: "\u5B98\u65B9\u6559\u7A0B",
  1603. onclick: () => {
  1604. window.open((infos == null ? void 0 : infos.script.homepage) || "https://docs.ocsjs.com", "_blank");
  1605. }
  1606. })
  1607. );
  1608. container.header.profile = $creator.tooltip(
  1609. el(
  1610. "div",
  1611. { className: "profile", title: "\u83DC\u5355\u680F\uFF08\u53EF\u62D6\u52A8\u533A\u57DF\uFF09" },
  1612. `OCS${infos ? "-" : ""}${(infos == null ? void 0 : infos.script.version) || ""}`
  1613. )
  1614. );
  1615. const projectSelector = el(
  1616. "select",
  1617. {
  1618. id: "project-selector",
  1619. onchange: async () => {
  1620. await $store.setTab($const.TAB_CURRENT_PANEL_NAME, projectSelector.value);
  1621. }
  1622. },
  1623. async (select) => {
  1624. const sortedProjects = projects.sort(({ level: a = 0 }, { level: b = 0 }) => b - a);
  1625. for (const project of sortedProjects) {
  1626. const scripts = $.getMatchedScripts([project], urls).filter((s) => !s.hideInPanel).sort(({ level: a = 0 }, { level: b = 0 }) => b - a);
  1627. if (scripts.length) {
  1628. const group = el("optgroup", { label: project.name });
  1629. const options = scripts.map(
  1630. (script, i) => el("option", {
  1631. value: project.name + "-" + script.name,
  1632. label: script.name,
  1633. selected: isCurrentPanel(project.name, script, currentPanelName)
  1634. })
  1635. );
  1636. group.append(...options);
  1637. select.append(group);
  1638. }
  1639. }
  1640. }
  1641. );
  1642. const projectSelectorDiv = $creator.tooltip(
  1643. el(
  1644. "div",
  1645. {
  1646. className: "project-selector",
  1647. title: "\u70B9\u51FB\u9009\u62E9\u811A\u672C\u64CD\u4F5C\u9875\u9762\uFF0C\u90E8\u5206\u811A\u672C\u4F1A\u63D0\u4F9B\u64CD\u4F5C\u9875\u9762\uFF08\u5305\u542B\u811A\u672C\u8BBE\u7F6E\u548C\u811A\u672C\u63D0\u793A\uFF09\u3002"
  1648. },
  1649. [projectSelector]
  1650. )
  1651. );
  1652. container.header.projectSelector = projectSelectorDiv;
  1653. const isMinimize = () => this.cfg.visual === "minimize";
  1654. const visualSwitcher = $creator.tooltip(
  1655. el("div", {
  1656. className: "switch ",
  1657. title: isMinimize() ? "\u70B9\u51FB\u5C55\u5F00\u7A97\u53E3" : "\u70B9\u51FB\u6700\u5C0F\u5316\u7A97\u53E3",
  1658. innerText: isMinimize() ? "\u25A1" : "-",
  1659. onclick: () => {
  1660. this.cfg.visual = isMinimize() ? "normal" : "minimize";
  1661. visualSwitcher.title = isMinimize() ? "\u70B9\u51FB\u5C55\u5F00\u7A97\u53E3" : "\u70B9\u51FB\u6700\u5C0F\u5316\u7A97\u53E3";
  1662. visualSwitcher.innerText = isMinimize() ? "\u25A1" : "-";
  1663. }
  1664. })
  1665. );
  1666. container.header.visualSwitcher = visualSwitcher;
  1667. container.header.closeButton = $creator.tooltip(
  1668. el("div", {
  1669. className: "close ",
  1670. innerText: "x",
  1671. title: "\u70B9\u51FB\u5173\u95ED\u7A97\u53E3\uFF08\u4E0D\u4F1A\u5F71\u54CD\u811A\u672C\u8FD0\u884C\uFF0C\u8FDE\u7EED\u70B9\u51FB\u4E09\u6B21\u9875\u9762\u4EFB\u610F\u4F4D\u7F6E\u53EF\u4EE5\u91CD\u65B0\u5524\u51FA\u7A97\u53E3\uFF09",
  1672. onclick: () => {
  1673. if (this.cfg.firstCloseAlert) {
  1674. $model("confirm", {
  1675. content: $creator.notes([
  1676. "\u5173\u95ED\u811A\u672C\u9875\u9762\u540E\uFF0C\u5FEB\u901F\u70B9\u51FB\u9875\u9762\u4E09\u4E0B\uFF08\u53EF\u4EE5\u5728\u60AC\u6D6E\u7A97\u8BBE\u7F6E\u4E2D\u8C03\u6574\u6B21\u6570\uFF09\u5373\u53EF\u91CD\u65B0\u663E\u793A\u811A\u672C\u3002\u5982\u679C\u4E09\u4E0B\u65E0\u6548\uFF0C\u53EF\u4EE5\u5C1D\u8BD5\u5220\u9664\u811A\u672C\u91CD\u65B0\u5B89\u88C5\u3002",
  1677. "\u8BF7\u786E\u8BA4\u662F\u5426\u5173\u95ED\u3002\uFF08\u6B64\u540E\u4E0D\u518D\u663E\u793A\u6B64\u5F39\u7A97\uFF09"
  1678. ]),
  1679. onConfirm: () => {
  1680. this.cfg.visual = "close";
  1681. this.cfg.firstCloseAlert = false;
  1682. }
  1683. });
  1684. } else {
  1685. this.cfg.visual = "close";
  1686. }
  1687. }
  1688. })
  1689. );
  1690. container.header.replaceChildren();
  1691. container.header.append(
  1692. container.header.profile || "",
  1693. container.header.projectSelector || "",
  1694. container.header.logo || "",
  1695. container.header.visualSwitcher || "",
  1696. container.header.closeButton || ""
  1697. );
  1698. };
  1699. const initPanelAndScript = (projectName, script) => {
  1700. const panel2 = $creator.scriptPanel(script, { projectName });
  1701. script.projectName = projectName;
  1702. script.panel = panel2;
  1703. script.header = container.header;
  1704. return panel2;
  1705. };
  1706. const createBody = async (urls, currentPanelName) => {
  1707. const list = [];
  1708. for (const project of projects) {
  1709. const scripts = $.getMatchedScripts([project], urls).filter((s) => !s.hideInPanel);
  1710. for (const script of scripts) {
  1711. list.push({ script, panel: initPanelAndScript(project.name, script) });
  1712. }
  1713. }
  1714. const index = list.findIndex((i) => isCurrentPanel(i.script.projectName, i.script, currentPanelName));
  1715. const targetIndex = index === -1 ? 0 : index;
  1716. if (list[targetIndex]) {
  1717. return [list[targetIndex]];
  1718. } else {
  1719. return [list[0]];
  1720. }
  1721. };
  1722. const handlePosition = () => {
  1723. container.style.top = this.cfg.y + "px";
  1724. container.style.left = this.cfg.x + "px";
  1725. const positionHandler = () => {
  1726. this.cfg.x = container.offsetLeft;
  1727. this.cfg.y = container.offsetTop;
  1728. };
  1729. enableElementDraggable(container.header, container, positionHandler);
  1730. };
  1731. const handleVisible = () => {
  1732. const visual = (value) => {
  1733. container.className = "";
  1734. if (value === "minimize") {
  1735. container.classList.add("minimize");
  1736. } else if (value === "close") {
  1737. container.classList.add("close");
  1738. } else {
  1739. container.classList.add("normal");
  1740. }
  1741. };
  1742. window.addEventListener("click", (e) => {
  1743. if (e.detail === Math.max(this.cfg.switchPoint, 3)) {
  1744. container.style.top = e.y + "px";
  1745. container.style.left = e.x + "px";
  1746. this.cfg.x = e.x;
  1747. this.cfg.y = e.y;
  1748. this.cfg.visual = this.cfg.visual === "close" ? "normal" : this.cfg.visual;
  1749. }
  1750. });
  1751. this.onConfigChange("visual", (curr) => visual(curr));
  1752. visual(this.cfg.visual);
  1753. };
  1754. const renderBody = async (urls, currentPanelName) => {
  1755. var _a;
  1756. const list = await createBody(urls, currentPanelName);
  1757. container.body.replaceChildren(...list.map((i) => i.panel));
  1758. const scripts = list.map((i) => i.script);
  1759. const index = scripts.findIndex((s) => isCurrentPanel(s.projectName, s, currentPanelName));
  1760. const script = scripts[index === -1 ? 0 : index];
  1761. if (script == null ? void 0 : script.panel) {
  1762. (_a = script.onrender) == null ? void 0 : _a.call(script, { panel: script.panel, header: container.header });
  1763. script.emit("render", { panel: script.panel, header: container.header });
  1764. }
  1765. };
  1766. const initModelSystem = () => {
  1767. cors.on("model", async ([type, _attrs]) => {
  1768. return new Promise((resolve, reject) => {
  1769. const attrs = _attrs;
  1770. attrs.onCancel = () => resolve("");
  1771. attrs.onConfirm = resolve;
  1772. attrs.onClose = resolve;
  1773. $model(type, attrs);
  1774. });
  1775. });
  1776. };
  1777. const onFontsizeChange = () => {
  1778. container.style.font = `${this.cfg.fontsize}px Menlo, Monaco, Consolas, 'Courier New', monospace`;
  1779. };
  1780. const rerender = (urls, currentPanelName) => {
  1781. initHeader(urls, currentPanelName);
  1782. renderBody(urls, currentPanelName);
  1783. };
  1784. if (matchedScripts.length !== 0 && self === top) {
  1785. container.append(el("style", {}, style || ""), $elements.messageContainer);
  1786. container.body.append(el("div", { className: "card" }, [$creator.notes(["OCS\u8B66\u544A : ", "\u5F53\u524D\u6D4F\u89C8\u5668\u7248\u672C\u8FC7\u4F4E\u6216\u8005\u4E0D\u517C\u5BB9\uFF0C\u8BF7\u4E0B\u8F7D\u5176\u4ED6\u6D4F\u89C8\u5668\uFF0C", "\u4F8B\u5982\u8C37\u6B4C\u6D4F\u89C8\u5668\u6216\u8005\u5FAE\u8F6F\u6D4F\u89C8\u5668\u3002"])]));
  1787. $elements.root.append(container);
  1788. document.body.children[$.random(0, document.body.children.length - 1)].after($elements.panel);
  1789. initModelSystem();
  1790. handlePosition();
  1791. onFontsizeChange();
  1792. (async () => {
  1793. const urls = await $store.getTab($const.TAB_URLS);
  1794. const currentPanelName = await $store.getTab($const.TAB_CURRENT_PANEL_NAME);
  1795. rerender(urls || [], currentPanelName || "");
  1796. })();
  1797. $store.addTabChangeListener(
  1798. $const.TAB_URLS,
  1799. debounce_1(async (urls = [location.href]) => {
  1800. const currentPanelName = await $store.getTab($const.TAB_CURRENT_PANEL_NAME);
  1801. rerender(urls, currentPanelName);
  1802. }, 2e3)
  1803. );
  1804. $store.addTabChangeListener($const.TAB_CURRENT_PANEL_NAME, async (currentPanelName) => {
  1805. const urls = await $store.getTab($const.TAB_URLS);
  1806. rerender(urls, currentPanelName);
  1807. });
  1808. this.onConfigChange("fontsize", onFontsizeChange);
  1809. }
  1810. handleVisible();
  1811. }
  1812. });
  1813. function $model(type, attrs) {
  1814. if (self === top) {
  1815. const {
  1816. disableWrapperCloseable,
  1817. onConfirm,
  1818. onCancel,
  1819. onClose,
  1820. notification: notify,
  1821. notificationOptions,
  1822. ..._attrs
  1823. } = attrs;
  1824. if (notify) {
  1825. $gm.notification(
  1826. typeof _attrs.content === "string" ? _attrs.content : _attrs.content.innerText,
  1827. notificationOptions
  1828. );
  1829. }
  1830. const wrapper = el("div", { className: "model-wrapper" }, (wrapper2) => {
  1831. const model = el("model-element", {
  1832. async onConfirm(val) {
  1833. const isClose = await (onConfirm == null ? void 0 : onConfirm.apply(model, [val]));
  1834. if (isClose !== false) {
  1835. wrapper2.remove();
  1836. }
  1837. return isClose;
  1838. },
  1839. onCancel() {
  1840. onCancel == null ? void 0 : onCancel.apply(model);
  1841. wrapper2.remove();
  1842. },
  1843. onClose(val) {
  1844. onClose == null ? void 0 : onClose.apply(model, [val]);
  1845. wrapper2.remove();
  1846. },
  1847. type,
  1848. ..._attrs
  1849. });
  1850. wrapper2.append(model);
  1851. model.addEventListener("click", (e) => {
  1852. e.stopPropagation();
  1853. });
  1854. if (!disableWrapperCloseable) {
  1855. wrapper2.addEventListener("click", () => {
  1856. onClose == null ? void 0 : onClose.apply(model);
  1857. wrapper2.remove();
  1858. });
  1859. }
  1860. });
  1861. $elements.root.append(wrapper);
  1862. return wrapper;
  1863. } else {
  1864. cors.emit("model", [type, attrs], (args, remote) => {
  1865. var _a, _b;
  1866. if (args) {
  1867. (_a = attrs.onConfirm) == null ? void 0 : _a.call(attrs, args);
  1868. } else {
  1869. (_b = attrs.onCancel) == null ? void 0 : _b.call(attrs);
  1870. }
  1871. });
  1872. }
  1873. }
  1874. function $message(type, attrs) {
  1875. const message = el("message-element", { type, ...attrs });
  1876. $elements.messageContainer.append(message);
  1877. return message;
  1878. }
  1879. const RenderProject = Project.create({
  1880. name: "\u6E32\u67D3",
  1881. domains: [],
  1882. scripts: {
  1883. render: RenderScript
  1884. }
  1885. });
  1886. function isCurrentPanel(projectName, script, currentPanelName) {
  1887. return projectName + "-" + script.name === currentPanelName || script.namespace === currentPanelName;
  1888. }
  1889. const $creator = {
  1890. notes(lines, tag = "ul") {
  1891. return el(
  1892. tag,
  1893. lines.map((line) => el("li", Array.isArray(line) ? line.map((node) => el("div", [node])) : [line]))
  1894. );
  1895. },
  1896. tooltip(target) {
  1897. target.setAttribute("data-title", target.title);
  1898. if (typeof $gm.unsafeWindow !== "undefined") {
  1899. target.removeAttribute("title");
  1900. }
  1901. const onMouseMove = (e) => {
  1902. $elements.tooltip.style.top = e.y + "px";
  1903. $elements.tooltip.style.left = e.x + "px";
  1904. };
  1905. const showTitle = (e) => {
  1906. const dataTitle = target.getAttribute("data-title");
  1907. if (dataTitle) {
  1908. $elements.tooltip.innerHTML = dataTitle.split("\n").join("<br>") || "";
  1909. $elements.tooltip.style.top = e.y + "px";
  1910. $elements.tooltip.style.left = e.x + "px";
  1911. $elements.tooltip.style.display = "block";
  1912. } else {
  1913. $elements.tooltip.style.display = "none";
  1914. }
  1915. window.addEventListener("mousemove", onMouseMove);
  1916. };
  1917. const hideTitle = () => {
  1918. $elements.tooltip.style.display = "none";
  1919. window.removeEventListener("mousemove", onMouseMove);
  1920. };
  1921. hideTitle();
  1922. target.addEventListener("mouseenter", showTitle);
  1923. target.addEventListener("click", showTitle);
  1924. target.addEventListener("mouseout", hideTitle);
  1925. target.addEventListener("blur", hideTitle);
  1926. return target;
  1927. },
  1928. selectOptions(selectedValue = "", options) {
  1929. return options.map(
  1930. (opt) => el("option", { value: String(opt[0]), innerText: opt[1], title: opt[2] }, (opt2) => {
  1931. if (opt2.value === selectedValue) {
  1932. opt2.toggleAttribute("selected");
  1933. }
  1934. })
  1935. );
  1936. },
  1937. input(attrs, children, handler) {
  1938. return el("input", attrs, function(input) {
  1939. input.append(...children || []);
  1940. input.classList.add("base-style-input");
  1941. handler == null ? void 0 : handler.apply(this, [input]);
  1942. });
  1943. },
  1944. button(text, attrs, handler) {
  1945. return el("input", { type: "button", ...attrs }, function(btn) {
  1946. btn.value = text || "";
  1947. btn.classList.add("base-style-button");
  1948. handler == null ? void 0 : handler.apply(this, [btn]);
  1949. });
  1950. },
  1951. scriptPanel(script, opts) {
  1952. var _a, _b;
  1953. const scriptPanel = el("script-panel-element", { name: script.name });
  1954. script.onConfigChange("notes", (pre, curr) => {
  1955. scriptPanel.notesContainer.innerHTML = script.cfg.notes || "";
  1956. });
  1957. script.panel = scriptPanel;
  1958. scriptPanel.notesContainer.innerHTML = ((_b = (_a = script.configs) == null ? void 0 : _a.notes) == null ? void 0 : _b.defaultValue) || "";
  1959. const els = $creator.configs(script.namespace, script.configs || {}, opts.onload);
  1960. const elList = [];
  1961. for (const key in els) {
  1962. if (Object.prototype.hasOwnProperty.call(els, key)) {
  1963. elList.push(els[key]);
  1964. }
  1965. }
  1966. scriptPanel.configsBody.append(...elList);
  1967. scriptPanel.configsContainer.append(scriptPanel.configsBody);
  1968. return scriptPanel;
  1969. },
  1970. configs(namespace, configs, onload) {
  1971. const elements = /* @__PURE__ */ Object.create({});
  1972. for (const key in configs) {
  1973. if (Object.prototype.hasOwnProperty.call(configs, key)) {
  1974. const config = configs[key];
  1975. if (config.label !== void 0) {
  1976. const element = el("config-element", {
  1977. key: $.namespaceKey(namespace, key),
  1978. tag: config.tag,
  1979. sync: config.sync,
  1980. attrs: config.attrs,
  1981. _onload: config.onload,
  1982. defaultValue: config.defaultValue
  1983. });
  1984. onload == null ? void 0 : onload(element);
  1985. element.label.textContent = config.label;
  1986. elements[key] = element;
  1987. }
  1988. }
  1989. }
  1990. return elements;
  1991. },
  1992. copy(name, value) {
  1993. return el("span", "\u{1F4C4}" + name, (btn) => {
  1994. btn.className = "copy";
  1995. btn.addEventListener("click", () => {
  1996. btn.innerText = "\u5DF2\u590D\u5236\u221A";
  1997. navigator.clipboard.writeText(value);
  1998. setTimeout(() => {
  1999. btn.innerText = "\u{1F4C4}" + name;
  2000. }, 500);
  2001. });
  2002. });
  2003. },
  2004. preventText(opts) {
  2005. const { name, delay = 3, autoRemove = true, ondefault, onprevent } = opts;
  2006. const span = el("span", name);
  2007. span.style.textDecoration = "underline";
  2008. span.style.cursor = "pointer";
  2009. span.onclick = () => {
  2010. clearTimeout(id);
  2011. if (autoRemove) {
  2012. span.remove();
  2013. }
  2014. onprevent == null ? void 0 : onprevent(span);
  2015. };
  2016. const id = setTimeout(() => {
  2017. if (autoRemove) {
  2018. span.remove();
  2019. }
  2020. ondefault(span);
  2021. }, delay * 1e3);
  2022. return span;
  2023. },
  2024. workPreCheckMessage(options) {
  2025. const { onrun, ondone, ...opts } = options;
  2026. if (opts.answererWrappers.length === 0) {
  2027. $model("alert", { content: "\u68C0\u6D4B\u5230\u9898\u5E93\u914D\u7F6E\u4E3A\u7A7A\uFF0C\u65E0\u6CD5\u81EA\u52A8\u7B54\u9898\uFF0C\u8BF7\u524D\u5F80\u5168\u5C40\u8BBE\u7F6E\u9875\u9762\u8FDB\u884C\u914D\u7F6E\u3002" });
  2028. ondone == null ? void 0 : ondone(opts);
  2029. } else {
  2030. $message("info", {
  2031. duration: 5,
  2032. content: el("span", [
  2033. "5\u79D2\u540E\u81EA\u52A8\u7B54\u9898\u3002\u5E76\u5207\u6362\u5230\u201C\u901A\u7528-\u641C\u7D22\u7ED3\u679C\u201D\u3002",
  2034. $creator.preventText({
  2035. name: "\u70B9\u51FB\u53D6\u6D88\u6B64\u6B21\u7B54\u9898",
  2036. delay: 5,
  2037. ondefault: (span) => {
  2038. onrun(opts);
  2039. },
  2040. onprevent(span) {
  2041. $message("warn", { content: "\u5DF2\u5173\u95ED\u6B64\u6B21\u7684\u81EA\u52A8\u7B54\u9898\u3002" });
  2042. ondone == null ? void 0 : ondone(opts);
  2043. }
  2044. })
  2045. ])
  2046. });
  2047. }
  2048. }
  2049. };
  2050. const $script = {
  2051. async pin(script) {
  2052. if (script.projectName) {
  2053. await $store.setTab($const.TAB_CURRENT_PANEL_NAME, `${script.projectName}-${script.name}`);
  2054. } else if (script.namespace) {
  2055. await $store.setTab($const.TAB_CURRENT_PANEL_NAME, script.namespace);
  2056. } else {
  2057. console.warn("[OCS]", `${script.name} \u65E0\u6CD5\u7F6E\u9876\uFF0C projectName \u4E0E namespace \u90FD\u4E3A undefined`);
  2058. }
  2059. }
  2060. };
  2061. function domSearch(wrapper, root2 = window.document) {
  2062. const obj = /* @__PURE__ */ Object.create({});
  2063. Reflect.ownKeys(wrapper).forEach((key) => {
  2064. const item = wrapper[key.toString()];
  2065. Reflect.set(
  2066. obj,
  2067. key,
  2068. typeof item === "string" ? root2.querySelector(item) : typeof item === "function" ? item(root2) : item.map((fun) => fun(root2))
  2069. );
  2070. });
  2071. return obj;
  2072. }
  2073. function domSearchAll(wrapper, root2 = window.document) {
  2074. const obj = /* @__PURE__ */ Object.create({});
  2075. Reflect.ownKeys(wrapper).forEach((key) => {
  2076. const item = wrapper[key.toString()];
  2077. Reflect.set(
  2078. obj,
  2079. key,
  2080. typeof item === "string" ? Array.from(root2.querySelectorAll(item)) : typeof item === "function" ? item(root2) : item.map((fun) => fun(root2))
  2081. );
  2082. });
  2083. return obj;
  2084. }
  2085. var src = {
  2086. compareTwoStrings,
  2087. findBestMatch
  2088. };
  2089. function compareTwoStrings(first, second) {
  2090. first = first.replace(/\s+/g, "");
  2091. second = second.replace(/\s+/g, "");
  2092. if (first === second)
  2093. return 1;
  2094. if (first.length < 2 || second.length < 2)
  2095. return 0;
  2096. let firstBigrams = /* @__PURE__ */ new Map();
  2097. for (let i = 0; i < first.length - 1; i++) {
  2098. const bigram = first.substring(i, i + 2);
  2099. const count = firstBigrams.has(bigram) ? firstBigrams.get(bigram) + 1 : 1;
  2100. firstBigrams.set(bigram, count);
  2101. }
  2102. let intersectionSize = 0;
  2103. for (let i = 0; i < second.length - 1; i++) {
  2104. const bigram = second.substring(i, i + 2);
  2105. const count = firstBigrams.has(bigram) ? firstBigrams.get(bigram) : 0;
  2106. if (count > 0) {
  2107. firstBigrams.set(bigram, count - 1);
  2108. intersectionSize++;
  2109. }
  2110. }
  2111. return 2 * intersectionSize / (first.length + second.length - 2);
  2112. }
  2113. function findBestMatch(mainString, targetStrings) {
  2114. if (!areArgsValid(mainString, targetStrings))
  2115. throw new Error("Bad arguments: First argument should be a string, second should be an array of strings");
  2116. const ratings = [];
  2117. let bestMatchIndex = 0;
  2118. for (let i = 0; i < targetStrings.length; i++) {
  2119. const currentTargetString = targetStrings[i];
  2120. const currentRating = compareTwoStrings(mainString, currentTargetString);
  2121. ratings.push({ target: currentTargetString, rating: currentRating });
  2122. if (currentRating > ratings[bestMatchIndex].rating) {
  2123. bestMatchIndex = i;
  2124. }
  2125. }
  2126. const bestMatch = ratings[bestMatchIndex];
  2127. return { ratings, bestMatch, bestMatchIndex };
  2128. }
  2129. function areArgsValid(mainString, targetStrings) {
  2130. if (typeof mainString !== "string")
  2131. return false;
  2132. if (!Array.isArray(targetStrings))
  2133. return false;
  2134. if (!targetStrings.length)
  2135. return false;
  2136. if (targetStrings.find(function(s) {
  2137. return typeof s !== "string";
  2138. }))
  2139. return false;
  2140. return true;
  2141. }
  2142. function clearString(str, ...exclude) {
  2143. return str.trim().toLocaleLowerCase().replace(RegExp(`[^\\u4e00-\\u9fa5A-Za-z0-9${exclude.join("")}]*`, "g"), "");
  2144. }
  2145. function answerSimilar(answers, options) {
  2146. answers = answers.map(removeRedundant);
  2147. options = options.map(removeRedundant);
  2148. const similar = answers.length !== 0 ? options.map((option) => src.findBestMatch(option, answers).bestMatch) : options.map((opt) => ({ rating: 0, target: "" }));
  2149. return similar;
  2150. }
  2151. function removeRedundant(str) {
  2152. return (str == null ? void 0 : str.trim().replace(/[A-Z]{1}[^A-Za-z0-9\u4e00-\u9fa5]+([A-Za-z0-9\u4e00-\u9fa5]+)/, "$1")) || "";
  2153. }
  2154. function request(url, opts) {
  2155. return new Promise((resolve, reject) => {
  2156. try {
  2157. const { contentType = "json", method = "get", type = "fetch", data = {}, headers = {} } = opts || {};
  2158. const env = $.isInBrowser() ? "browser" : "node";
  2159. if (type === "GM_xmlhttpRequest" && env === "browser") {
  2160. if (typeof GM_xmlhttpRequest !== "undefined") {
  2161. GM_xmlhttpRequest({
  2162. url,
  2163. method: method === "get" ? "GET" : "POST",
  2164. data: new URLSearchParams(data).toString(),
  2165. headers,
  2166. responseType: "json",
  2167. onload: (response) => {
  2168. if (response.status === 200) {
  2169. if (contentType === "json") {
  2170. try {
  2171. resolve(JSON.parse(response.responseText));
  2172. } catch (error) {
  2173. reject(error);
  2174. }
  2175. } else {
  2176. resolve(response.responseText);
  2177. }
  2178. } else {
  2179. reject(response.responseText);
  2180. }
  2181. },
  2182. onerror: reject
  2183. });
  2184. } else {
  2185. reject(new Error("GM_xmlhttpRequest is not defined"));
  2186. }
  2187. } else {
  2188. const fet = env === "node" ? require("node-fetch").default : fetch;
  2189. fet(url, { contentType, body: method === "post" ? data : void 0, method, headers }).then((response) => {
  2190. if (contentType === "json") {
  2191. response.json().then(resolve).catch(reject);
  2192. } else {
  2193. response.text().then(resolve).catch(reject);
  2194. }
  2195. }).catch((error) => {
  2196. reject(new Error(error));
  2197. });
  2198. }
  2199. } catch (error) {
  2200. reject(error);
  2201. }
  2202. });
  2203. }
  2204. function defaultQuestionResolve(ctx) {
  2205. return {
  2206. async single(results, options, handler) {
  2207. for (const result of results) {
  2208. for (const answer of result.answers) {
  2209. const ans = StringUtils.nowrap(answer.answer).trim();
  2210. if (ans.length === 1 && isPlainAnswer(ans)) {
  2211. const index2 = ans.charCodeAt(0) - 65;
  2212. await handler("single", options[index2].innerText, options[index2], ctx);
  2213. await $.sleep(500);
  2214. return { finish: true, option: options[index2] };
  2215. }
  2216. }
  2217. }
  2218. const ratings = answerSimilar(
  2219. results.map((res) => res.answers.map((ans) => ans.answer)).flat(),
  2220. options.map((el2) => el2.innerText)
  2221. );
  2222. let index = -1;
  2223. let max = 0;
  2224. ratings.forEach((rating, i) => {
  2225. if (rating.rating > max) {
  2226. max = rating.rating;
  2227. index = i;
  2228. }
  2229. });
  2230. if (index !== -1 && max > 0.6) {
  2231. await handler("single", options[index].innerText, options[index], ctx);
  2232. await $.sleep(500);
  2233. return {
  2234. finish: true,
  2235. ratings: ratings.map((r) => r.rating)
  2236. };
  2237. }
  2238. return { finish: false };
  2239. },
  2240. async multiple(results, options, handler) {
  2241. const targetAnswers = [];
  2242. const targetOptions = [];
  2243. let count = 0;
  2244. for (const answers of results.map((res) => res.answers.map((ans) => ans.answer))) {
  2245. targetAnswers[count] = [];
  2246. targetOptions[count] = [];
  2247. options.forEach((el2, i) => {
  2248. if (answers.some((answer) => answer.includes(removeRedundant(el2.innerText)))) {
  2249. targetAnswers[count][i] = el2.innerText;
  2250. targetOptions[count][i] = el2;
  2251. }
  2252. });
  2253. for (const answer of answers) {
  2254. const ans = StringUtils.nowrap(answer).trim();
  2255. if (isPlainAnswer(ans)) {
  2256. for (let i = 0; i < ans.length; i++) {
  2257. const index2 = ans.charCodeAt(i) - 65;
  2258. targetAnswers[count][i] = options[index2].innerText;
  2259. targetOptions[count][i] = options[index2];
  2260. }
  2261. }
  2262. }
  2263. if (targetAnswers[count].length === 0) {
  2264. const ratings = answerSimilar(
  2265. answers,
  2266. options.map((el2) => el2.innerText)
  2267. ).sort((a, b) => b.rating - a.rating);
  2268. if (ratings.some((rating) => rating.rating > 0.6)) {
  2269. options.forEach((el2, i) => {
  2270. if (ratings[i].rating > 0.6) {
  2271. targetAnswers[count][i] = el2.innerText;
  2272. targetOptions[count][i] = el2;
  2273. }
  2274. });
  2275. }
  2276. }
  2277. count++;
  2278. }
  2279. let max = 0;
  2280. let index = -1;
  2281. for (let i = 0; i < targetOptions.length; i++) {
  2282. const len = targetAnswers[i].filter((ans) => ans !== void 0).length;
  2283. if (len > max) {
  2284. max = len;
  2285. index = i;
  2286. }
  2287. }
  2288. if (index === -1) {
  2289. return { finish: false };
  2290. } else {
  2291. targetAnswers[index] = targetAnswers[index].filter((ans) => ans !== void 0);
  2292. targetOptions[index] = targetOptions[index].filter((ans) => ans !== void 0);
  2293. for (let i = 0; i < targetOptions[index].length; i++) {
  2294. await handler("multiple", targetAnswers[index][i], targetOptions[index][i], ctx);
  2295. await $.sleep(500);
  2296. }
  2297. return { finish: true, targetOptions, targetAnswers };
  2298. }
  2299. },
  2300. async judgement(results, options, handler) {
  2301. for (const answers of results.map((res) => res.answers.map((ans) => ans.answer))) {
  2302. let matches = function(target, options2) {
  2303. return options2.some((option) => RegExp(clearString(option, "\u221A", "\xD7")).test(clearString(target, "\u221A", "\xD7")));
  2304. };
  2305. const correctWords = ["\u662F", "\u5BF9", "\u6B63\u786E", "\u221A", "\u5BF9\u7684", "\u662F\u7684", "\u6B63\u786E\u7684", "true", "yes", "1"];
  2306. const incorrectWords = [
  2307. "\u975E",
  2308. "\u5426",
  2309. "\u9519",
  2310. "\u9519\u8BEF",
  2311. "\xD7",
  2312. "X",
  2313. "\u9519\u7684",
  2314. "\u4E0D\u5BF9",
  2315. "\u4E0D\u6B63\u786E\u7684",
  2316. "\u4E0D\u6B63\u786E",
  2317. "\u4E0D\u662F",
  2318. "\u4E0D\u662F\u7684",
  2319. "false",
  2320. "no",
  2321. "0"
  2322. ];
  2323. const answerShowCorrect = answers.find((answer) => matches(answer, correctWords));
  2324. const answerShowIncorrect = answers.find((answer) => matches(answer, incorrectWords));
  2325. if (answerShowCorrect || answerShowIncorrect) {
  2326. let option;
  2327. for (const el2 of options) {
  2328. const textShowCorrect = matches(el2.innerText, correctWords);
  2329. const textShowIncorrect = matches(el2.innerText, incorrectWords);
  2330. if (answerShowCorrect && textShowCorrect) {
  2331. option = el2;
  2332. await handler("judgement", answerShowCorrect, el2, ctx);
  2333. await $.sleep(500);
  2334. break;
  2335. }
  2336. if (answerShowIncorrect && textShowIncorrect) {
  2337. option = el2;
  2338. await handler("judgement", answerShowIncorrect, el2, ctx);
  2339. await $.sleep(500);
  2340. break;
  2341. }
  2342. }
  2343. return { finish: true, option };
  2344. }
  2345. }
  2346. return { finish: false };
  2347. },
  2348. async completion(results, options, handler) {
  2349. for (const answers of results.map((res) => res.answers.map((ans) => ans.answer))) {
  2350. let ans = answers.filter((ans2) => ans2);
  2351. if (ans.length === 1) {
  2352. ans = splitAnswer(ans[0]);
  2353. }
  2354. if (ans.length !== 0 && (ans.length === options.length || options.length === 1)) {
  2355. if (ans.length === options.length) {
  2356. for (let index = 0; index < options.length; index++) {
  2357. const element = options[index];
  2358. await handler("completion", ans[index], element, ctx);
  2359. await $.sleep(500);
  2360. }
  2361. return { finish: true };
  2362. } else if (options.length === 1) {
  2363. await handler("completion", ans.join(" "), options[0], ctx);
  2364. await $.sleep(500);
  2365. return { finish: true };
  2366. }
  2367. return { finish: false };
  2368. }
  2369. }
  2370. return { finish: false };
  2371. }
  2372. };
  2373. }
  2374. class OCSWorker extends CommonEventEmitter {
  2375. constructor(opts) {
  2376. super();
  2377. this.isRunning = false;
  2378. this.isClose = false;
  2379. this.isStop = false;
  2380. this.requestIndex = 0;
  2381. this.resolverIndex = 0;
  2382. this.totalQuestionCount = 0;
  2383. this.locks = [];
  2384. this.opts = opts;
  2385. }
  2386. async doWork() {
  2387. var _a, _b, _c, _d;
  2388. this.requestIndex = 0;
  2389. this.resolverIndex = 0;
  2390. this.totalQuestionCount = 0;
  2391. this.once("close", () => {
  2392. this.isClose = true;
  2393. });
  2394. this.on("stop", () => {
  2395. this.isStop = true;
  2396. });
  2397. this.on("continuate", () => {
  2398. this.isStop = false;
  2399. });
  2400. this.emit("start");
  2401. this.isRunning = true;
  2402. const questionRoot = typeof this.opts.root === "string" ? Array.from(document.querySelectorAll(this.opts.root)) : this.opts.root;
  2403. this.totalQuestionCount = questionRoot.length;
  2404. this.locks = Array(this.totalQuestionCount).fill(1);
  2405. const results = [];
  2406. for (const q of questionRoot) {
  2407. const ctx = {
  2408. searchResults: [],
  2409. root: q,
  2410. elements: domSearchAll(this.opts.elements, q)
  2411. };
  2412. await ((_b = (_a = this.opts).onElementSearched) == null ? void 0 : _b.call(_a, ctx.elements));
  2413. ctx.elements.title = (_c = ctx.elements.title) == null ? void 0 : _c.filter(Boolean);
  2414. ctx.elements.options = (_d = ctx.elements.options) == null ? void 0 : _d.filter(Boolean);
  2415. results.push({
  2416. requesting: true,
  2417. resolving: true,
  2418. type: void 0,
  2419. ctx
  2420. });
  2421. }
  2422. const resolvers = [];
  2423. const requestThread = async () => {
  2424. var _a2, _b2, _c2;
  2425. while (this.locks.shift()) {
  2426. const i = this.requestIndex++;
  2427. const ctx = results[i].ctx || {};
  2428. if (this.isClose === true) {
  2429. this.isRunning = false;
  2430. this.emit("close");
  2431. this.emit("done");
  2432. return results;
  2433. }
  2434. let type;
  2435. let error;
  2436. if (typeof this.opts.work === "object") {
  2437. type = this.opts.work.type === void 0 ? defaultWorkTypeResolver(ctx) : typeof this.opts.work.type === "string" ? this.opts.work.type : this.opts.work.type(ctx);
  2438. }
  2439. if (this.isStop) {
  2440. await new Promise((resolve, reject) => {
  2441. const interval = setInterval(() => {
  2442. if (this.isStop === false) {
  2443. clearInterval(interval);
  2444. resolve();
  2445. }
  2446. }, 200);
  2447. });
  2448. }
  2449. const searchResults = await this.doAnswer(ctx.elements, type, ctx);
  2450. let resultPromise;
  2451. if (!searchResults) {
  2452. error = "\u7B54\u6848\u83B7\u53D6\u5931\u8D25, \u8BF7\u91CD\u65B0\u8FD0\u884C, \u6216\u8005\u5FFD\u7565\u6B64\u9898\u3002";
  2453. } else {
  2454. searchResults.forEach((res) => {
  2455. res.answers = res.answers.map((ans) => {
  2456. ans.answer = ans.answer ? ans.answer : "";
  2457. return ans;
  2458. });
  2459. });
  2460. ctx.searchResults = searchResults;
  2461. if (searchResults.length === 0) {
  2462. error = "\u641C\u7D22\u4E0D\u5230\u7B54\u6848, \u8BF7\u91CD\u65B0\u8FD0\u884C, \u6216\u8005\u5FFD\u7565\u6B64\u9898\u3002";
  2463. }
  2464. if (typeof this.opts.work === "object") {
  2465. if (ctx.elements.options) {
  2466. if (type) {
  2467. const resolver = defaultQuestionResolve(ctx)[type];
  2468. const handler = this.opts.work.handler;
  2469. resultPromise = async () => await resolver(searchResults, ctx.elements.options, handler);
  2470. } else {
  2471. error = "\u9898\u76EE\u7C7B\u578B\u89E3\u6790\u5931\u8D25, \u8BF7\u81EA\u884C\u63D0\u4F9B\u89E3\u6790\u5668, \u6216\u8005\u5FFD\u7565\u6B64\u9898\u3002";
  2472. }
  2473. } else {
  2474. 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";
  2475. }
  2476. } else {
  2477. const work = this.opts.work;
  2478. resultPromise = async () => await work(ctx);
  2479. }
  2480. }
  2481. const currentResult = {
  2482. requesting: false,
  2483. resolving: true,
  2484. ctx,
  2485. error,
  2486. type
  2487. };
  2488. results[i] = currentResult;
  2489. if (resultPromise) {
  2490. resolvers.push({
  2491. func: resultPromise,
  2492. index: i
  2493. });
  2494. } else {
  2495. resolvers.push({
  2496. func: async () => ({ finish: false }),
  2497. index: i
  2498. });
  2499. }
  2500. await ((_b2 = (_a2 = this.opts).onResultsUpdate) == null ? void 0 : _b2.call(_a2, results, currentResult));
  2501. await $.sleep(((_c2 = this.opts.requestPeriod) != null ? _c2 : 3) * 1e3);
  2502. }
  2503. };
  2504. const resolverThread = new Promise((resolve) => {
  2505. const start2 = async () => {
  2506. var _a2, _b2, _c2, _d2;
  2507. if (this.resolverIndex < this.totalQuestionCount) {
  2508. const resolver = resolvers.shift();
  2509. if (resolver) {
  2510. try {
  2511. const result = await resolver.func();
  2512. results[resolver.index].result = result;
  2513. results[resolver.index].resolving = false;
  2514. await ((_b2 = (_a2 = this.opts).onResultsUpdate) == null ? void 0 : _b2.call(_a2, results, results[resolver.index]));
  2515. await ((_d2 = (_c2 = this.opts).onResolveUpdate) == null ? void 0 : _d2.call(_c2, results[resolver.index]));
  2516. } catch (e) {
  2517. results[resolver.index].result = { finish: false };
  2518. results[resolver.index].resolving = false;
  2519. results[resolver.index].error = (e == null ? void 0 : e.message) || e;
  2520. }
  2521. this.resolverIndex++;
  2522. loop();
  2523. } else {
  2524. loop();
  2525. }
  2526. } else {
  2527. resolve();
  2528. }
  2529. };
  2530. const loop = async () => {
  2531. var _a2;
  2532. setTimeout(start2, ((_a2 = this.opts.resolvePeriod) != null ? _a2 : 0) * 1e3);
  2533. };
  2534. start2();
  2535. });
  2536. await Promise.all([
  2537. ...Array(Math.max(this.opts.thread || 1, 1)).fill("").map(() => requestThread()),
  2538. resolverThread
  2539. ]);
  2540. this.isRunning = false;
  2541. this.emit("done");
  2542. return results;
  2543. }
  2544. async doAnswer(elements, type, ctx) {
  2545. const { timeout: _t, retry: _r } = this.opts;
  2546. const timeout = _t != null ? _t : 60;
  2547. let retry = _r != null ? _r : 2;
  2548. const answer = async () => {
  2549. return await Promise.race([
  2550. this.opts.answerer(elements, type, ctx),
  2551. $.sleep(timeout * 1e3)
  2552. ]);
  2553. };
  2554. let answers = await answer();
  2555. if (!answers) {
  2556. while (retry && !answers) {
  2557. answers = await answer();
  2558. retry--;
  2559. }
  2560. }
  2561. return answers;
  2562. }
  2563. async uploadHandler(options) {
  2564. var _a;
  2565. const { results, type, callback } = options;
  2566. let finished = 0;
  2567. for (const result of results) {
  2568. if ((_a = result.result) == null ? void 0 : _a.finish) {
  2569. finished++;
  2570. }
  2571. }
  2572. const rate = results.length === 0 ? 0 : finished / results.length * 100;
  2573. if (type !== "nomove") {
  2574. if (type === "force") {
  2575. await callback(rate, true);
  2576. } else {
  2577. await callback(rate, type === "save" ? false : rate >= parseFloat(type.toString()));
  2578. }
  2579. }
  2580. }
  2581. }
  2582. async function defaultAnswerWrapperHandler(answererWrappers, env) {
  2583. const searchResults = [];
  2584. const temp = JSON.parse(JSON.stringify(answererWrappers));
  2585. await Promise.all(
  2586. temp.map(async (wrapper) => {
  2587. const {
  2588. name = "\u672A\u77E5\u9898\u5E93",
  2589. homepage = "#",
  2590. method = "get",
  2591. type = "fetch",
  2592. contentType = "json",
  2593. headers = {},
  2594. data: wrapperData = {},
  2595. handler = "return (res)=> [JSON.stringify(res), undefined]"
  2596. } = wrapper;
  2597. try {
  2598. let answers = [];
  2599. const data = /* @__PURE__ */ Object.create({});
  2600. Reflect.ownKeys(wrapperData).forEach((key) => {
  2601. Reflect.set(data, key, resolvePlaceHolder(wrapperData[key.toString()]));
  2602. });
  2603. let url = resolvePlaceHolder(wrapper.url);
  2604. url = method === "post" ? url : url + "?" + new URLSearchParams(data).toString();
  2605. const requestData = {
  2606. method,
  2607. contentType,
  2608. data,
  2609. type,
  2610. headers: JSON.parse(JSON.stringify(headers || {}))
  2611. };
  2612. const responseData = await request(url, requestData);
  2613. const info = Function(handler)()(responseData);
  2614. if (info && Array.isArray(info)) {
  2615. if (info.every((item) => Array.isArray(item))) {
  2616. answers = answers.concat(
  2617. info.map((item) => ({
  2618. question: item[0],
  2619. answer: item[1]
  2620. }))
  2621. );
  2622. } else {
  2623. answers.push({
  2624. question: info[0],
  2625. answer: info[1]
  2626. });
  2627. }
  2628. }
  2629. searchResults.push({
  2630. url: wrapper.url,
  2631. name,
  2632. homepage,
  2633. answers,
  2634. response: responseData,
  2635. data: requestData
  2636. });
  2637. } catch (error) {
  2638. searchResults.push({
  2639. url: wrapper.url,
  2640. name,
  2641. homepage,
  2642. answers: [],
  2643. response: void 0,
  2644. data: void 0,
  2645. error
  2646. });
  2647. }
  2648. })
  2649. );
  2650. function resolvePlaceHolder(str) {
  2651. if (typeof str === "string") {
  2652. const matches = str.match(/\${(.*?)}/g) || [];
  2653. matches.forEach((placeHolder) => {
  2654. const value = env[placeHolder.replace(/\${(.*)}/, "$1")];
  2655. str = str.replace(placeHolder, value);
  2656. });
  2657. }
  2658. return str;
  2659. }
  2660. return searchResults;
  2661. }
  2662. class AnswerWrapperParser {
  2663. static fromObject(json) {
  2664. const aw = json;
  2665. if (aw && Array.isArray(aw)) {
  2666. if (aw.length) {
  2667. for (let i = 0; i < aw.length; i++) {
  2668. const item = aw[i];
  2669. if (typeof item.name !== "string") {
  2670. throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 \u540D\u5B57(name) \u4E3A\u7A7A`);
  2671. }
  2672. if (typeof item.url !== "string") {
  2673. throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 \u63A5\u53E3\u5730\u5740(url) \u4E3A\u7A7A`);
  2674. }
  2675. if (typeof item.name !== "string") {
  2676. throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 \u89E3\u6790\u5668(handler) \u4E3A\u7A7A`);
  2677. }
  2678. if (item.headers && typeof item.headers !== "object") {
  2679. throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 \u5934\u90E8\u4FE1\u606F(header) \u5E94\u4E3A \u5BF9\u8C61 \u683C\u5F0F`);
  2680. }
  2681. if (item.data && typeof item.data !== "object") {
  2682. throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 \u63D0\u4EA4\u6570\u636E(data) \u5E94\u4E3A \u5BF9\u8C61 \u683C\u5F0F`);
  2683. }
  2684. const contentTypes = ["json", "text"];
  2685. if (item.contentType && contentTypes.every((i2) => i2 !== item.contentType)) {
  2686. throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 contentType \u5FC5\u987B\u4E3A\u4EE5\u4E0B\u9009\u9879\u4E2D\u7684\u4E00\u4E2A ${contentTypes.join(", ")}`);
  2687. }
  2688. const methods = ["post", "get"];
  2689. if (item.method && methods.every((i2) => i2 !== item.method)) {
  2690. throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 method \u5FC5\u987B\u4E3A\u4EE5\u4E0B\u9009\u9879\u4E2D\u7684\u4E00\u4E2A ${methods.join(", ")}`);
  2691. }
  2692. const types = ["fetch", "GM_xmlhttpRequest"];
  2693. if (item.type && types.every((i2) => i2 !== item.type)) {
  2694. throw new Error(`\u7B2C ${i + 1} \u4E2A\u9898\u5E93\u7684 type \u5FC5\u987B\u4E3A\u4EE5\u4E0B\u9009\u9879\u4E2D\u7684\u4E00\u4E2A ${types.join(", ")}`);
  2695. }
  2696. }
  2697. return aw;
  2698. } else {
  2699. throw new Error("\u9898\u5E93\u4E3A\u7A7A\uFF01");
  2700. }
  2701. } else {
  2702. throw new Error("\u9898\u5E93\u914D\u7F6E\u683C\u5F0F\u9519\u8BEF\uFF01");
  2703. }
  2704. }
  2705. static fromJSONString(json) {
  2706. const raw = json.toString();
  2707. try {
  2708. return JSON.parse(raw);
  2709. } catch {
  2710. throw new Error(`\u683C\u5F0F\u9519\u8BEF\uFF0C\u5FC5\u987B\u4E3A\uFF1Ajson\u5B57\u7B26\u4E32 \u6216 \u9898\u5E93\u914D\u7F6E\u94FE\u63A5`);
  2711. }
  2712. }
  2713. static async fromURL(url) {
  2714. const text = await request(url, {
  2715. contentType: "text",
  2716. method: "get",
  2717. type: "fetch"
  2718. });
  2719. return this.fromJSONString(text);
  2720. }
  2721. static fromBase64(base64) {
  2722. return this.fromJSONString(Buffer.from(base64, "base64").toString("utf8"));
  2723. }
  2724. static from(value) {
  2725. if (typeof value === "string") {
  2726. if (value.startsWith("http")) {
  2727. return this.fromURL(value);
  2728. } else {
  2729. return this.fromJSONString(value);
  2730. }
  2731. } else {
  2732. return this.fromObject(value);
  2733. }
  2734. }
  2735. }
  2736. const state$1 = {
  2737. console: {
  2738. listener: {
  2739. logs: 0
  2740. }
  2741. }
  2742. };
  2743. const BackgroundProject = Project.create({
  2744. name: "\u540E\u53F0",
  2745. domains: [],
  2746. level: -99,
  2747. scripts: {
  2748. app: new Script({
  2749. name: "\u8F6F\u4EF6\u914D\u7F6E\u540C\u6B65",
  2750. namespace: "background.app",
  2751. url: [["\u6240\u6709\u9875\u9762", /./]],
  2752. level: -1,
  2753. configs: {
  2754. notes: {
  2755. defaultValue: $creator.notes([
  2756. [el("span", ["\u5982\u679C\u60A8\u4F7F\u7528", el("a", { href: "https://docs.ocsjs.com/docs/app", target: "_blank" }, "OCS\u684C\u9762\u8F6F\u4EF6"), "\u542F\u52A8\u6D4F\u89C8\u5668\uFF0C\u5E76\u4F7F\u7528\u6B64\u811A\u672C\uFF0C"]), "\u6211\u4EEC\u4F1A\u540C\u6B65\u8F6F\u4EF6\u4E2D\u7684\u914D\u7F6E\u5230\u6B64\u811A\u672C\u4E0A\uFF0C\u65B9\u4FBF\u591A\u4E2A\u6D4F\u89C8\u5668\u7684\u7BA1\u7406\u3002"],
  2757. "\u5982\u679C\u4E0D\u662F\uFF0C\u60A8\u53EF\u4EE5\u5FFD\u7565\u6B64\u811A\u672C\u3002"
  2758. ]).outerHTML
  2759. },
  2760. sync: {
  2761. defaultValue: false
  2762. },
  2763. name: {
  2764. defaultValue: ""
  2765. }
  2766. },
  2767. onrender({ panel: panel2 }) {
  2768. const update = () => {
  2769. if (this.cfg.sync) {
  2770. const tip = el("div", { className: "notes card" }, [`\u5F53\u524D\u6210\u529F\u540C\u6B65\u8F6F\u4EF6\u4E2D \u201C${this.cfg.name}\u201D \u6587\u4EF6\u7684\u914D\u7F6E.`]);
  2771. panel2.append(tip);
  2772. }
  2773. };
  2774. update();
  2775. this.onConfigChange("sync", update);
  2776. },
  2777. async oncomplete() {
  2778. if (self === top) {
  2779. this.cfg.sync = false;
  2780. try {
  2781. const res = await request("https://ocs-app/browser", { type: "fetch", method: "get", contentType: "json" });
  2782. if (res.name && res.store) {
  2783. for (const key in res.store) {
  2784. if (Object.prototype.hasOwnProperty.call(res.store, key)) {
  2785. $store.set(key, res.store[key]);
  2786. }
  2787. }
  2788. this.cfg.name = res.name;
  2789. this.cfg.sync = true;
  2790. }
  2791. } catch {
  2792. }
  2793. }
  2794. }
  2795. }),
  2796. appLoginHelper: new Script({
  2797. name: "\u8F6F\u4EF6\u767B\u5F55\u8F85\u52A9",
  2798. url: [["\u8D85\u661F\u767B\u5F55", "passport2.chaoxing.com/login"], ["\u667A\u6167\u6811\u767B\u5F55", "passport.zhihuishu.com/login"]],
  2799. hideInPanel: true,
  2800. onactive() {
  2801. RenderProject.scripts.render.cfg.x = 10;
  2802. RenderProject.scripts.render.cfg.y = 10;
  2803. RenderProject.scripts.render.cfg.visual = "minimize";
  2804. }
  2805. }),
  2806. dev: new Script({
  2807. name: "\u5F00\u53D1\u8005\u8C03\u8BD5",
  2808. namespace: "background.dev",
  2809. url: [["\u6240\u6709\u9875\u9762", /./]],
  2810. configs: {
  2811. notes: {
  2812. 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"
  2813. }
  2814. },
  2815. onrender({ panel: panel2 }) {
  2816. const injectBtn = el("button", { className: "base-style-button" }, "\u70B9\u51FB\u6CE8\u5165\u5168\u5C40\u53D8\u91CF");
  2817. injectBtn.addEventListener("click", () => {
  2818. $gm.unsafeWindow.OCS_CONTEXT = self;
  2819. });
  2820. panel2.body.replaceChildren(el("div", { className: "card" }, [injectBtn]));
  2821. },
  2822. oncomplete() {
  2823. }
  2824. }),
  2825. console: new Script({
  2826. name: "\u65E5\u5FD7",
  2827. url: [["\u6240\u6709", /.*/]],
  2828. namespace: "render.console",
  2829. configs: {
  2830. logs: {
  2831. defaultValue: []
  2832. }
  2833. },
  2834. onrender({ panel: panel2 }) {
  2835. var _a;
  2836. this.offConfigChange(state$1.console.listener.logs);
  2837. const getTypeDesc = (type) => type === "info" ? "\u4FE1\u606F" : type === "error" ? "\u9519\u8BEF" : type === "warn" ? "\u8B66\u544A" : type === "debug" ? "\u8C03\u8BD5" : "\u65E5\u5FD7";
  2838. const showLogs = () => {
  2839. const div2 = el("div", { className: "card console" });
  2840. const logs2 = this.cfg.logs.map((log) => {
  2841. const date = new Date(log.time);
  2842. const item = el(
  2843. "div",
  2844. {
  2845. title: "\u53CC\u51FB\u590D\u5236\u65E5\u5FD7\u4FE1\u606F",
  2846. className: "item"
  2847. },
  2848. [
  2849. el(
  2850. "span",
  2851. { className: "time" },
  2852. `${date.getHours().toFixed(0).padStart(2, "0")}:${date.getMinutes().toFixed(0).padStart(2, "0")} `
  2853. ),
  2854. el("span", { className: log.type }, `[${getTypeDesc(log.type)}]`),
  2855. el("span", ":" + log.content)
  2856. ]
  2857. );
  2858. item.addEventListener("dblclick", () => {
  2859. navigator.clipboard.writeText(
  2860. Object.keys(log).map((k) => `${k}: ${log[k]}`).join("\n")
  2861. );
  2862. });
  2863. return item;
  2864. });
  2865. if (logs2.length) {
  2866. div2.replaceChildren(...logs2);
  2867. } else {
  2868. div2.replaceChildren(el("div", "\u6682\u65E0\u4EFB\u4F55\u65E5\u5FD7", (div3) => {
  2869. div3.style.textAlign = "center";
  2870. }));
  2871. }
  2872. return { div: div2, logs: logs2 };
  2873. };
  2874. state$1.console.listener.logs = this.onConfigChange("logs", () => {
  2875. var _a2;
  2876. const { div: div2, logs: logs2 } = showLogs();
  2877. panel2.replaceChildren(div2);
  2878. (_a2 = logs2.at(-1)) == null ? void 0 : _a2.scrollIntoView();
  2879. }) || 0;
  2880. const { div, logs } = showLogs();
  2881. panel2.replaceChildren(div);
  2882. (_a = logs.at(-1)) == null ? void 0 : _a.scrollIntoView();
  2883. }
  2884. }),
  2885. browserCheck: new Script({
  2886. name: "\u6D4F\u89C8\u5668\u7248\u672C\u68C0\u6D4B",
  2887. url: [["\u6240\u6709\u9875\u9762", /.*/]],
  2888. oncomplete() {
  2889. if (self === top) {
  2890. const match = navigator.userAgent.match(/Chrome\/(\d+)/);
  2891. const version = match ? parseInt(match[1]) : void 0;
  2892. if (version) {
  2893. if (version < 86) {
  2894. $model("alert", {
  2895. content: $creator.notes([
  2896. "\u68C0\u6D4B\u5230\u60A8\u5F53\u524D\u7684\u6D4F\u89C8\u5668\u7248\u672C\u8FC7\u4F4E\uFF0C\u53EF\u80FD\u5BFC\u81F4\u811A\u672C\u65E0\u6CD5\u8FD0\u884C\uFF0C\u8BF7\u4E0B\u8F7D/\u66F4\u65B0\u4EE5\u4E0B\u63A8\u8350\u6D4F\u89C8\u5668\uFF1A",
  2897. [
  2898. "- \u5FAE\u8F6F\u6D4F\u89C8\u5668(Edge) : ",
  2899. el("a", { href: "https://www.microsoft.com/zh-cn/edge", target: "_blank" }, "https://www.microsoft.com/zh-cn/edge")
  2900. ],
  2901. [
  2902. "- \u8C37\u6B4C\u6D4F\u89C8\u5668(Chrome) : ",
  2903. el("a", { href: "https://www.google.com/intl/zh-CN/chrome/", target: "_blank" }, "https://www.google.com/intl/zh-CN/chrome/")
  2904. ]
  2905. ]).outerHTML
  2906. });
  2907. }
  2908. }
  2909. }
  2910. }
  2911. })
  2912. }
  2913. });
  2914. const $console = new Proxy({}, {
  2915. get(target, key) {
  2916. return (...msg) => {
  2917. let logs = BackgroundProject.scripts.console.cfg.logs;
  2918. if (logs.length > 50) {
  2919. logs = logs.slice(-50);
  2920. }
  2921. logs = logs.concat({
  2922. type: key.toString(),
  2923. content: msg.join(" "),
  2924. time: Date.now(),
  2925. stack: (Error().stack || "").replace("Error", "")
  2926. });
  2927. BackgroundProject.scripts.console.cfg.logs = logs;
  2928. };
  2929. }
  2930. });
  2931. function getDefaults() {
  2932. return {
  2933. async: false,
  2934. baseUrl: null,
  2935. breaks: false,
  2936. extensions: null,
  2937. gfm: true,
  2938. headerIds: true,
  2939. headerPrefix: "",
  2940. highlight: null,
  2941. langPrefix: "language-",
  2942. mangle: true,
  2943. pedantic: false,
  2944. renderer: null,
  2945. sanitize: false,
  2946. sanitizer: null,
  2947. silent: false,
  2948. smartypants: false,
  2949. tokenizer: null,
  2950. walkTokens: null,
  2951. xhtml: false
  2952. };
  2953. }
  2954. let defaults = getDefaults();
  2955. function changeDefaults(newDefaults) {
  2956. defaults = newDefaults;
  2957. }
  2958. const escapeTest = /[&<>"']/;
  2959. const escapeReplace = new RegExp(escapeTest.source, "g");
  2960. const escapeTestNoEncode = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/;
  2961. const escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, "g");
  2962. const escapeReplacements = {
  2963. "&": "&amp;",
  2964. "<": "&lt;",
  2965. ">": "&gt;",
  2966. '"': "&quot;",
  2967. "'": "&#39;"
  2968. };
  2969. const getEscapeReplacement = (ch) => escapeReplacements[ch];
  2970. function escape$1(html, encode) {
  2971. if (encode) {
  2972. if (escapeTest.test(html)) {
  2973. return html.replace(escapeReplace, getEscapeReplacement);
  2974. }
  2975. } else {
  2976. if (escapeTestNoEncode.test(html)) {
  2977. return html.replace(escapeReplaceNoEncode, getEscapeReplacement);
  2978. }
  2979. }
  2980. return html;
  2981. }
  2982. const unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;
  2983. function unescape$1(html) {
  2984. return html.replace(unescapeTest, (_, n) => {
  2985. n = n.toLowerCase();
  2986. if (n === "colon")
  2987. return ":";
  2988. if (n.charAt(0) === "#") {
  2989. return n.charAt(1) === "x" ? String.fromCharCode(parseInt(n.substring(2), 16)) : String.fromCharCode(+n.substring(1));
  2990. }
  2991. return "";
  2992. });
  2993. }
  2994. const caret = /(^|[^\[])\^/g;
  2995. function edit(regex, opt) {
  2996. regex = typeof regex === "string" ? regex : regex.source;
  2997. opt = opt || "";
  2998. const obj = {
  2999. replace: (name, val) => {
  3000. val = val.source || val;
  3001. val = val.replace(caret, "$1");
  3002. regex = regex.replace(name, val);
  3003. return obj;
  3004. },
  3005. getRegex: () => {
  3006. return new RegExp(regex, opt);
  3007. }
  3008. };
  3009. return obj;
  3010. }
  3011. const nonWordAndColonTest = /[^\w:]/g;
  3012. const originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
  3013. function cleanUrl(sanitize, base, href) {
  3014. if (sanitize) {
  3015. let prot;
  3016. try {
  3017. prot = decodeURIComponent(unescape$1(href)).replace(nonWordAndColonTest, "").toLowerCase();
  3018. } catch (e) {
  3019. return null;
  3020. }
  3021. if (prot.indexOf("javascript:") === 0 || prot.indexOf("vbscript:") === 0 || prot.indexOf("data:") === 0) {
  3022. return null;
  3023. }
  3024. }
  3025. if (base && !originIndependentUrl.test(href)) {
  3026. href = resolveUrl(base, href);
  3027. }
  3028. try {
  3029. href = encodeURI(href).replace(/%25/g, "%");
  3030. } catch (e) {
  3031. return null;
  3032. }
  3033. return href;
  3034. }
  3035. const baseUrls = {};
  3036. const justDomain = /^[^:]+:\/*[^/]*$/;
  3037. const protocol = /^([^:]+:)[\s\S]*$/;
  3038. const domain = /^([^:]+:\/*[^/]*)[\s\S]*$/;
  3039. function resolveUrl(base, href) {
  3040. if (!baseUrls[" " + base]) {
  3041. if (justDomain.test(base)) {
  3042. baseUrls[" " + base] = base + "/";
  3043. } else {
  3044. baseUrls[" " + base] = rtrim(base, "/", true);
  3045. }
  3046. }
  3047. base = baseUrls[" " + base];
  3048. const relativeBase = base.indexOf(":") === -1;
  3049. if (href.substring(0, 2) === "//") {
  3050. if (relativeBase) {
  3051. return href;
  3052. }
  3053. return base.replace(protocol, "$1") + href;
  3054. } else if (href.charAt(0) === "/") {
  3055. if (relativeBase) {
  3056. return href;
  3057. }
  3058. return base.replace(domain, "$1") + href;
  3059. } else {
  3060. return base + href;
  3061. }
  3062. }
  3063. const noopTest = { exec: function noopTest2() {
  3064. } };
  3065. function merge(obj) {
  3066. let i = 1, target, key;
  3067. for (; i < arguments.length; i++) {
  3068. target = arguments[i];
  3069. for (key in target) {
  3070. if (Object.prototype.hasOwnProperty.call(target, key)) {
  3071. obj[key] = target[key];
  3072. }
  3073. }
  3074. }
  3075. return obj;
  3076. }
  3077. function splitCells(tableRow, count) {
  3078. const row = tableRow.replace(/\|/g, (match, offset, str) => {
  3079. let escaped = false, curr = offset;
  3080. while (--curr >= 0 && str[curr] === "\\")
  3081. escaped = !escaped;
  3082. if (escaped) {
  3083. return "|";
  3084. } else {
  3085. return " |";
  3086. }
  3087. }), cells = row.split(/ \|/);
  3088. let i = 0;
  3089. if (!cells[0].trim()) {
  3090. cells.shift();
  3091. }
  3092. if (cells.length > 0 && !cells[cells.length - 1].trim()) {
  3093. cells.pop();
  3094. }
  3095. if (cells.length > count) {
  3096. cells.splice(count);
  3097. } else {
  3098. while (cells.length < count)
  3099. cells.push("");
  3100. }
  3101. for (; i < cells.length; i++) {
  3102. cells[i] = cells[i].trim().replace(/\\\|/g, "|");
  3103. }
  3104. return cells;
  3105. }
  3106. function rtrim(str, c, invert) {
  3107. const l = str.length;
  3108. if (l === 0) {
  3109. return "";
  3110. }
  3111. let suffLen = 0;
  3112. while (suffLen < l) {
  3113. const currChar = str.charAt(l - suffLen - 1);
  3114. if (currChar === c && !invert) {
  3115. suffLen++;
  3116. } else if (currChar !== c && invert) {
  3117. suffLen++;
  3118. } else {
  3119. break;
  3120. }
  3121. }
  3122. return str.slice(0, l - suffLen);
  3123. }
  3124. function findClosingBracket(str, b) {
  3125. if (str.indexOf(b[1]) === -1) {
  3126. return -1;
  3127. }
  3128. const l = str.length;
  3129. let level = 0, i = 0;
  3130. for (; i < l; i++) {
  3131. if (str[i] === "\\") {
  3132. i++;
  3133. } else if (str[i] === b[0]) {
  3134. level++;
  3135. } else if (str[i] === b[1]) {
  3136. level--;
  3137. if (level < 0) {
  3138. return i;
  3139. }
  3140. }
  3141. }
  3142. return -1;
  3143. }
  3144. function checkSanitizeDeprecation(opt) {
  3145. if (opt && opt.sanitize && !opt.silent) {
  3146. 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");
  3147. }
  3148. }
  3149. function repeatString(pattern, count) {
  3150. if (count < 1) {
  3151. return "";
  3152. }
  3153. let result = "";
  3154. while (count > 1) {
  3155. if (count & 1) {
  3156. result += pattern;
  3157. }
  3158. count >>= 1;
  3159. pattern += pattern;
  3160. }
  3161. return result + pattern;
  3162. }
  3163. function outputLink(cap, link, raw, lexer) {
  3164. const href = link.href;
  3165. const title = link.title ? escape$1(link.title) : null;
  3166. const text = cap[1].replace(/\\([\[\]])/g, "$1");
  3167. if (cap[0].charAt(0) !== "!") {
  3168. lexer.state.inLink = true;
  3169. const token = {
  3170. type: "link",
  3171. raw,
  3172. href,
  3173. title,
  3174. text,
  3175. tokens: lexer.inlineTokens(text)
  3176. };
  3177. lexer.state.inLink = false;
  3178. return token;
  3179. }
  3180. return {
  3181. type: "image",
  3182. raw,
  3183. href,
  3184. title,
  3185. text: escape$1(text)
  3186. };
  3187. }
  3188. function indentCodeCompensation(raw, text) {
  3189. const matchIndentToCode = raw.match(/^(\s+)(?:```)/);
  3190. if (matchIndentToCode === null) {
  3191. return text;
  3192. }
  3193. const indentToCode = matchIndentToCode[1];
  3194. return text.split("\n").map((node) => {
  3195. const matchIndentInNode = node.match(/^\s+/);
  3196. if (matchIndentInNode === null) {
  3197. return node;
  3198. }
  3199. const [indentInNode] = matchIndentInNode;
  3200. if (indentInNode.length >= indentToCode.length) {
  3201. return node.slice(indentToCode.length);
  3202. }
  3203. return node;
  3204. }).join("\n");
  3205. }
  3206. class Tokenizer {
  3207. constructor(options) {
  3208. this.options = options || defaults;
  3209. }
  3210. space(src2) {
  3211. const cap = this.rules.block.newline.exec(src2);
  3212. if (cap && cap[0].length > 0) {
  3213. return {
  3214. type: "space",
  3215. raw: cap[0]
  3216. };
  3217. }
  3218. }
  3219. code(src2) {
  3220. const cap = this.rules.block.code.exec(src2);
  3221. if (cap) {
  3222. const text = cap[0].replace(/^ {1,4}/gm, "");
  3223. return {
  3224. type: "code",
  3225. raw: cap[0],
  3226. codeBlockStyle: "indented",
  3227. text: !this.options.pedantic ? rtrim(text, "\n") : text
  3228. };
  3229. }
  3230. }
  3231. fences(src2) {
  3232. const cap = this.rules.block.fences.exec(src2);
  3233. if (cap) {
  3234. const raw = cap[0];
  3235. const text = indentCodeCompensation(raw, cap[3] || "");
  3236. return {
  3237. type: "code",
  3238. raw,
  3239. lang: cap[2] ? cap[2].trim().replace(this.rules.inline._escapes, "$1") : cap[2],
  3240. text
  3241. };
  3242. }
  3243. }
  3244. heading(src2) {
  3245. const cap = this.rules.block.heading.exec(src2);
  3246. if (cap) {
  3247. let text = cap[2].trim();
  3248. if (/#$/.test(text)) {
  3249. const trimmed = rtrim(text, "#");
  3250. if (this.options.pedantic) {
  3251. text = trimmed.trim();
  3252. } else if (!trimmed || / $/.test(trimmed)) {
  3253. text = trimmed.trim();
  3254. }
  3255. }
  3256. return {
  3257. type: "heading",
  3258. raw: cap[0],
  3259. depth: cap[1].length,
  3260. text,
  3261. tokens: this.lexer.inline(text)
  3262. };
  3263. }
  3264. }
  3265. hr(src2) {
  3266. const cap = this.rules.block.hr.exec(src2);
  3267. if (cap) {
  3268. return {
  3269. type: "hr",
  3270. raw: cap[0]
  3271. };
  3272. }
  3273. }
  3274. blockquote(src2) {
  3275. const cap = this.rules.block.blockquote.exec(src2);
  3276. if (cap) {
  3277. const text = cap[0].replace(/^ *>[ \t]?/gm, "");
  3278. const top2 = this.lexer.state.top;
  3279. this.lexer.state.top = true;
  3280. const tokens = this.lexer.blockTokens(text);
  3281. this.lexer.state.top = top2;
  3282. return {
  3283. type: "blockquote",
  3284. raw: cap[0],
  3285. tokens,
  3286. text
  3287. };
  3288. }
  3289. }
  3290. list(src2) {
  3291. let cap = this.rules.block.list.exec(src2);
  3292. if (cap) {
  3293. let raw, istask, ischecked, indent, i, blankLine, endsWithBlankLine, line, nextLine, rawLine, itemContents, endEarly;
  3294. let bull = cap[1].trim();
  3295. const isordered = bull.length > 1;
  3296. const list = {
  3297. type: "list",
  3298. raw: "",
  3299. ordered: isordered,
  3300. start: isordered ? +bull.slice(0, -1) : "",
  3301. loose: false,
  3302. items: []
  3303. };
  3304. bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`;
  3305. if (this.options.pedantic) {
  3306. bull = isordered ? bull : "[*+-]";
  3307. }
  3308. const itemRegex = new RegExp(`^( {0,3}${bull})((?:[ ][^\\n]*)?(?:\\n|$))`);
  3309. while (src2) {
  3310. endEarly = false;
  3311. if (!(cap = itemRegex.exec(src2))) {
  3312. break;
  3313. }
  3314. if (this.rules.block.hr.test(src2)) {
  3315. break;
  3316. }
  3317. raw = cap[0];
  3318. src2 = src2.substring(raw.length);
  3319. line = cap[2].split("\n", 1)[0].replace(/^\t+/, (t) => " ".repeat(3 * t.length));
  3320. nextLine = src2.split("\n", 1)[0];
  3321. if (this.options.pedantic) {
  3322. indent = 2;
  3323. itemContents = line.trimLeft();
  3324. } else {
  3325. indent = cap[2].search(/[^ ]/);
  3326. indent = indent > 4 ? 1 : indent;
  3327. itemContents = line.slice(indent);
  3328. indent += cap[1].length;
  3329. }
  3330. blankLine = false;
  3331. if (!line && /^ *$/.test(nextLine)) {
  3332. raw += nextLine + "\n";
  3333. src2 = src2.substring(nextLine.length + 1);
  3334. endEarly = true;
  3335. }
  3336. if (!endEarly) {
  3337. const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`);
  3338. const hrRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`);
  3339. const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\`\`\`|~~~)`);
  3340. const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`);
  3341. while (src2) {
  3342. rawLine = src2.split("\n", 1)[0];
  3343. nextLine = rawLine;
  3344. if (this.options.pedantic) {
  3345. nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, " ");
  3346. }
  3347. if (fencesBeginRegex.test(nextLine)) {
  3348. break;
  3349. }
  3350. if (headingBeginRegex.test(nextLine)) {
  3351. break;
  3352. }
  3353. if (nextBulletRegex.test(nextLine)) {
  3354. break;
  3355. }
  3356. if (hrRegex.test(src2)) {
  3357. break;
  3358. }
  3359. if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) {
  3360. itemContents += "\n" + nextLine.slice(indent);
  3361. } else {
  3362. if (blankLine) {
  3363. break;
  3364. }
  3365. if (line.search(/[^ ]/) >= 4) {
  3366. break;
  3367. }
  3368. if (fencesBeginRegex.test(line)) {
  3369. break;
  3370. }
  3371. if (headingBeginRegex.test(line)) {
  3372. break;
  3373. }
  3374. if (hrRegex.test(line)) {
  3375. break;
  3376. }
  3377. itemContents += "\n" + nextLine;
  3378. }
  3379. if (!blankLine && !nextLine.trim()) {
  3380. blankLine = true;
  3381. }
  3382. raw += rawLine + "\n";
  3383. src2 = src2.substring(rawLine.length + 1);
  3384. line = nextLine.slice(indent);
  3385. }
  3386. }
  3387. if (!list.loose) {
  3388. if (endsWithBlankLine) {
  3389. list.loose = true;
  3390. } else if (/\n *\n *$/.test(raw)) {
  3391. endsWithBlankLine = true;
  3392. }
  3393. }
  3394. if (this.options.gfm) {
  3395. istask = /^\[[ xX]\] /.exec(itemContents);
  3396. if (istask) {
  3397. ischecked = istask[0] !== "[ ] ";
  3398. itemContents = itemContents.replace(/^\[[ xX]\] +/, "");
  3399. }
  3400. }
  3401. list.items.push({
  3402. type: "list_item",
  3403. raw,
  3404. task: !!istask,
  3405. checked: ischecked,
  3406. loose: false,
  3407. text: itemContents
  3408. });
  3409. list.raw += raw;
  3410. }
  3411. list.items[list.items.length - 1].raw = raw.trimRight();
  3412. list.items[list.items.length - 1].text = itemContents.trimRight();
  3413. list.raw = list.raw.trimRight();
  3414. const l = list.items.length;
  3415. for (i = 0; i < l; i++) {
  3416. this.lexer.state.top = false;
  3417. list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);
  3418. if (!list.loose) {
  3419. const spacers = list.items[i].tokens.filter((t) => t.type === "space");
  3420. const hasMultipleLineBreaks = spacers.length > 0 && spacers.some((t) => /\n.*\n/.test(t.raw));
  3421. list.loose = hasMultipleLineBreaks;
  3422. }
  3423. }
  3424. if (list.loose) {
  3425. for (i = 0; i < l; i++) {
  3426. list.items[i].loose = true;
  3427. }
  3428. }
  3429. return list;
  3430. }
  3431. }
  3432. html(src2) {
  3433. const cap = this.rules.block.html.exec(src2);
  3434. if (cap) {
  3435. const token = {
  3436. type: "html",
  3437. raw: cap[0],
  3438. pre: !this.options.sanitizer && (cap[1] === "pre" || cap[1] === "script" || cap[1] === "style"),
  3439. text: cap[0]
  3440. };
  3441. if (this.options.sanitize) {
  3442. const text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$1(cap[0]);
  3443. token.type = "paragraph";
  3444. token.text = text;
  3445. token.tokens = this.lexer.inline(text);
  3446. }
  3447. return token;
  3448. }
  3449. }
  3450. def(src2) {
  3451. const cap = this.rules.block.def.exec(src2);
  3452. if (cap) {
  3453. const tag = cap[1].toLowerCase().replace(/\s+/g, " ");
  3454. const href = cap[2] ? cap[2].replace(/^<(.*)>$/, "$1").replace(this.rules.inline._escapes, "$1") : "";
  3455. const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline._escapes, "$1") : cap[3];
  3456. return {
  3457. type: "def",
  3458. tag,
  3459. raw: cap[0],
  3460. href,
  3461. title
  3462. };
  3463. }
  3464. }
  3465. table(src2) {
  3466. const cap = this.rules.block.table.exec(src2);
  3467. if (cap) {
  3468. const item = {
  3469. type: "table",
  3470. header: splitCells(cap[1]).map((c) => {
  3471. return { text: c };
  3472. }),
  3473. align: cap[2].replace(/^ *|\| *$/g, "").split(/ *\| */),
  3474. rows: cap[3] && cap[3].trim() ? cap[3].replace(/\n[ \t]*$/, "").split("\n") : []
  3475. };
  3476. if (item.header.length === item.align.length) {
  3477. item.raw = cap[0];
  3478. let l = item.align.length;
  3479. let i, j, k, row;
  3480. for (i = 0; i < l; i++) {
  3481. if (/^ *-+: *$/.test(item.align[i])) {
  3482. item.align[i] = "right";
  3483. } else if (/^ *:-+: *$/.test(item.align[i])) {
  3484. item.align[i] = "center";
  3485. } else if (/^ *:-+ *$/.test(item.align[i])) {
  3486. item.align[i] = "left";
  3487. } else {
  3488. item.align[i] = null;
  3489. }
  3490. }
  3491. l = item.rows.length;
  3492. for (i = 0; i < l; i++) {
  3493. item.rows[i] = splitCells(item.rows[i], item.header.length).map((c) => {
  3494. return { text: c };
  3495. });
  3496. }
  3497. l = item.header.length;
  3498. for (j = 0; j < l; j++) {
  3499. item.header[j].tokens = this.lexer.inline(item.header[j].text);
  3500. }
  3501. l = item.rows.length;
  3502. for (j = 0; j < l; j++) {
  3503. row = item.rows[j];
  3504. for (k = 0; k < row.length; k++) {
  3505. row[k].tokens = this.lexer.inline(row[k].text);
  3506. }
  3507. }
  3508. return item;
  3509. }
  3510. }
  3511. }
  3512. lheading(src2) {
  3513. const cap = this.rules.block.lheading.exec(src2);
  3514. if (cap) {
  3515. return {
  3516. type: "heading",
  3517. raw: cap[0],
  3518. depth: cap[2].charAt(0) === "=" ? 1 : 2,
  3519. text: cap[1],
  3520. tokens: this.lexer.inline(cap[1])
  3521. };
  3522. }
  3523. }
  3524. paragraph(src2) {
  3525. const cap = this.rules.block.paragraph.exec(src2);
  3526. if (cap) {
  3527. const text = cap[1].charAt(cap[1].length - 1) === "\n" ? cap[1].slice(0, -1) : cap[1];
  3528. return {
  3529. type: "paragraph",
  3530. raw: cap[0],
  3531. text,
  3532. tokens: this.lexer.inline(text)
  3533. };
  3534. }
  3535. }
  3536. text(src2) {
  3537. const cap = this.rules.block.text.exec(src2);
  3538. if (cap) {
  3539. return {
  3540. type: "text",
  3541. raw: cap[0],
  3542. text: cap[0],
  3543. tokens: this.lexer.inline(cap[0])
  3544. };
  3545. }
  3546. }
  3547. escape(src2) {
  3548. const cap = this.rules.inline.escape.exec(src2);
  3549. if (cap) {
  3550. return {
  3551. type: "escape",
  3552. raw: cap[0],
  3553. text: escape$1(cap[1])
  3554. };
  3555. }
  3556. }
  3557. tag(src2) {
  3558. const cap = this.rules.inline.tag.exec(src2);
  3559. if (cap) {
  3560. if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {
  3561. this.lexer.state.inLink = true;
  3562. } else if (this.lexer.state.inLink && /^<\/a>/i.test(cap[0])) {
  3563. this.lexer.state.inLink = false;
  3564. }
  3565. if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
  3566. this.lexer.state.inRawBlock = true;
  3567. } else if (this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
  3568. this.lexer.state.inRawBlock = false;
  3569. }
  3570. return {
  3571. type: this.options.sanitize ? "text" : "html",
  3572. raw: cap[0],
  3573. inLink: this.lexer.state.inLink,
  3574. inRawBlock: this.lexer.state.inRawBlock,
  3575. text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$1(cap[0]) : cap[0]
  3576. };
  3577. }
  3578. }
  3579. link(src2) {
  3580. const cap = this.rules.inline.link.exec(src2);
  3581. if (cap) {
  3582. const trimmedUrl = cap[2].trim();
  3583. if (!this.options.pedantic && /^</.test(trimmedUrl)) {
  3584. if (!/>$/.test(trimmedUrl)) {
  3585. return;
  3586. }
  3587. const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), "\\");
  3588. if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {
  3589. return;
  3590. }
  3591. } else {
  3592. const lastParenIndex = findClosingBracket(cap[2], "()");
  3593. if (lastParenIndex > -1) {
  3594. const start2 = cap[0].indexOf("!") === 0 ? 5 : 4;
  3595. const linkLen = start2 + cap[1].length + lastParenIndex;
  3596. cap[2] = cap[2].substring(0, lastParenIndex);
  3597. cap[0] = cap[0].substring(0, linkLen).trim();
  3598. cap[3] = "";
  3599. }
  3600. }
  3601. let href = cap[2];
  3602. let title = "";
  3603. if (this.options.pedantic) {
  3604. const link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
  3605. if (link) {
  3606. href = link[1];
  3607. title = link[3];
  3608. }
  3609. } else {
  3610. title = cap[3] ? cap[3].slice(1, -1) : "";
  3611. }
  3612. href = href.trim();
  3613. if (/^</.test(href)) {
  3614. if (this.options.pedantic && !/>$/.test(trimmedUrl)) {
  3615. href = href.slice(1);
  3616. } else {
  3617. href = href.slice(1, -1);
  3618. }
  3619. }
  3620. return outputLink(cap, {
  3621. href: href ? href.replace(this.rules.inline._escapes, "$1") : href,
  3622. title: title ? title.replace(this.rules.inline._escapes, "$1") : title
  3623. }, cap[0], this.lexer);
  3624. }
  3625. }
  3626. reflink(src2, links) {
  3627. let cap;
  3628. if ((cap = this.rules.inline.reflink.exec(src2)) || (cap = this.rules.inline.nolink.exec(src2))) {
  3629. let link = (cap[2] || cap[1]).replace(/\s+/g, " ");
  3630. link = links[link.toLowerCase()];
  3631. if (!link) {
  3632. const text = cap[0].charAt(0);
  3633. return {
  3634. type: "text",
  3635. raw: text,
  3636. text
  3637. };
  3638. }
  3639. return outputLink(cap, link, cap[0], this.lexer);
  3640. }
  3641. }
  3642. emStrong(src2, maskedSrc, prevChar = "") {
  3643. let match = this.rules.inline.emStrong.lDelim.exec(src2);
  3644. if (!match)
  3645. return;
  3646. if (match[3] && prevChar.match(/[\p{L}\p{N}]/u))
  3647. return;
  3648. const nextChar = match[1] || match[2] || "";
  3649. if (!nextChar || nextChar && (prevChar === "" || this.rules.inline.punctuation.exec(prevChar))) {
  3650. const lLength = match[0].length - 1;
  3651. let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;
  3652. const endReg = match[0][0] === "*" ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;
  3653. endReg.lastIndex = 0;
  3654. maskedSrc = maskedSrc.slice(-1 * src2.length + lLength);
  3655. while ((match = endReg.exec(maskedSrc)) != null) {
  3656. rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];
  3657. if (!rDelim)
  3658. continue;
  3659. rLength = rDelim.length;
  3660. if (match[3] || match[4]) {
  3661. delimTotal += rLength;
  3662. continue;
  3663. } else if (match[5] || match[6]) {
  3664. if (lLength % 3 && !((lLength + rLength) % 3)) {
  3665. midDelimTotal += rLength;
  3666. continue;
  3667. }
  3668. }
  3669. delimTotal -= rLength;
  3670. if (delimTotal > 0)
  3671. continue;
  3672. rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);
  3673. const raw = src2.slice(0, lLength + match.index + (match[0].length - rDelim.length) + rLength);
  3674. if (Math.min(lLength, rLength) % 2) {
  3675. const text2 = raw.slice(1, -1);
  3676. return {
  3677. type: "em",
  3678. raw,
  3679. text: text2,
  3680. tokens: this.lexer.inlineTokens(text2)
  3681. };
  3682. }
  3683. const text = raw.slice(2, -2);
  3684. return {
  3685. type: "strong",
  3686. raw,
  3687. text,
  3688. tokens: this.lexer.inlineTokens(text)
  3689. };
  3690. }
  3691. }
  3692. }
  3693. codespan(src2) {
  3694. const cap = this.rules.inline.code.exec(src2);
  3695. if (cap) {
  3696. let text = cap[2].replace(/\n/g, " ");
  3697. const hasNonSpaceChars = /[^ ]/.test(text);
  3698. const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);
  3699. if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {
  3700. text = text.substring(1, text.length - 1);
  3701. }
  3702. text = escape$1(text, true);
  3703. return {
  3704. type: "codespan",
  3705. raw: cap[0],
  3706. text
  3707. };
  3708. }
  3709. }
  3710. br(src2) {
  3711. const cap = this.rules.inline.br.exec(src2);
  3712. if (cap) {
  3713. return {
  3714. type: "br",
  3715. raw: cap[0]
  3716. };
  3717. }
  3718. }
  3719. del(src2) {
  3720. const cap = this.rules.inline.del.exec(src2);
  3721. if (cap) {
  3722. return {
  3723. type: "del",
  3724. raw: cap[0],
  3725. text: cap[2],
  3726. tokens: this.lexer.inlineTokens(cap[2])
  3727. };
  3728. }
  3729. }
  3730. autolink(src2, mangle2) {
  3731. const cap = this.rules.inline.autolink.exec(src2);
  3732. if (cap) {
  3733. let text, href;
  3734. if (cap[2] === "@") {
  3735. text = escape$1(this.options.mangle ? mangle2(cap[1]) : cap[1]);
  3736. href = "mailto:" + text;
  3737. } else {
  3738. text = escape$1(cap[1]);
  3739. href = text;
  3740. }
  3741. return {
  3742. type: "link",
  3743. raw: cap[0],
  3744. text,
  3745. href,
  3746. tokens: [
  3747. {
  3748. type: "text",
  3749. raw: text,
  3750. text
  3751. }
  3752. ]
  3753. };
  3754. }
  3755. }
  3756. url(src2, mangle2) {
  3757. let cap;
  3758. if (cap = this.rules.inline.url.exec(src2)) {
  3759. let text, href;
  3760. if (cap[2] === "@") {
  3761. text = escape$1(this.options.mangle ? mangle2(cap[0]) : cap[0]);
  3762. href = "mailto:" + text;
  3763. } else {
  3764. let prevCapZero;
  3765. do {
  3766. prevCapZero = cap[0];
  3767. cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];
  3768. } while (prevCapZero !== cap[0]);
  3769. text = escape$1(cap[0]);
  3770. if (cap[1] === "www.") {
  3771. href = "http://" + cap[0];
  3772. } else {
  3773. href = cap[0];
  3774. }
  3775. }
  3776. return {
  3777. type: "link",
  3778. raw: cap[0],
  3779. text,
  3780. href,
  3781. tokens: [
  3782. {
  3783. type: "text",
  3784. raw: text,
  3785. text
  3786. }
  3787. ]
  3788. };
  3789. }
  3790. }
  3791. inlineText(src2, smartypants2) {
  3792. const cap = this.rules.inline.text.exec(src2);
  3793. if (cap) {
  3794. let text;
  3795. if (this.lexer.state.inRawBlock) {
  3796. text = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$1(cap[0]) : cap[0];
  3797. } else {
  3798. text = escape$1(this.options.smartypants ? smartypants2(cap[0]) : cap[0]);
  3799. }
  3800. return {
  3801. type: "text",
  3802. raw: cap[0],
  3803. text
  3804. };
  3805. }
  3806. }
  3807. }
  3808. const block = {
  3809. newline: /^(?: *(?:\n|$))+/,
  3810. code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,
  3811. fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?=\n|$)|$)/,
  3812. hr: /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,
  3813. heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,
  3814. blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
  3815. list: /^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/,
  3816. 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|$))",
  3817. def: /^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,
  3818. table: noopTest,
  3819. lheading: /^((?:.|\n(?!\n))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
  3820. _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,
  3821. text: /^[^\n]+/
  3822. };
  3823. block._label = /(?!\s*\])(?:\\.|[^\[\]\\])+/;
  3824. block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
  3825. block.def = edit(block.def).replace("label", block._label).replace("title", block._title).getRegex();
  3826. block.bullet = /(?:[*+-]|\d{1,9}[.)])/;
  3827. block.listItemStart = edit(/^( *)(bull) */).replace("bull", block.bullet).getRegex();
  3828. 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();
  3829. 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";
  3830. block._comment = /<!--(?!-?>)[\s\S]*?(?:-->|$)/;
  3831. block.html = edit(block.html, "i").replace("comment", block._comment).replace("tag", block._tag).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex();
  3832. 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();
  3833. block.blockquote = edit(block.blockquote).replace("paragraph", block.paragraph).getRegex();
  3834. block.normal = merge({}, block);
  3835. block.gfm = merge({}, block.normal, {
  3836. table: "^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"
  3837. });
  3838. 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();
  3839. 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();
  3840. block.pedantic = merge({}, block.normal, {
  3841. html: edit(
  3842. `^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`
  3843. ).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(),
  3844. def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
  3845. heading: /^(#{1,6})(.*)(?:\n+|$)/,
  3846. fences: noopTest,
  3847. lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
  3848. 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()
  3849. });
  3850. const inline = {
  3851. escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
  3852. autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
  3853. url: noopTest,
  3854. tag: "^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>",
  3855. link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,
  3856. reflink: /^!?\[(label)\]\[(ref)\]/,
  3857. nolink: /^!?\[(ref)\](?:\[\])?/,
  3858. reflinkSearch: "reflink|nolink(?!\\()",
  3859. emStrong: {
  3860. lDelim: /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,
  3861. rDelimAst: /^(?:[^_*\\]|\\.)*?\_\_(?:[^_*\\]|\\.)*?\*(?:[^_*\\]|\\.)*?(?=\_\_)|(?:[^*\\]|\\.)+(?=[^*])|[punct_](\*+)(?=[\s]|$)|(?:[^punct*_\s\\]|\\.)(\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|(?:[^punct*_\s\\]|\\.)(\*+)(?=[^punct*_\s])/,
  3862. rDelimUnd: /^(?:[^_*\\]|\\.)*?\*\*(?:[^_*\\]|\\.)*?\_(?:[^_*\\]|\\.)*?(?=\*\*)|(?:[^_\\]|\\.)+(?=[^_])|[punct*](\_+)(?=[\s]|$)|(?:[^punct*_\s\\]|\\.)(\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/
  3863. },
  3864. code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
  3865. br: /^( {2,}|\\)\n(?!\s*$)/,
  3866. del: noopTest,
  3867. text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,
  3868. punctuation: /^([\spunctuation])/
  3869. };
  3870. inline._punctuation = "!\"#$%&'()+\\-.,/:;<=>?@\\[\\]`^{|}~";
  3871. inline.punctuation = edit(inline.punctuation).replace(/punctuation/g, inline._punctuation).getRegex();
  3872. inline.blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g;
  3873. inline.escapedEmSt = /(?:^|[^\\])(?:\\\\)*\\[*_]/g;
  3874. inline._comment = edit(block._comment).replace("(?:-->|$)", "-->").getRegex();
  3875. inline.emStrong.lDelim = edit(inline.emStrong.lDelim).replace(/punct/g, inline._punctuation).getRegex();
  3876. inline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, "g").replace(/punct/g, inline._punctuation).getRegex();
  3877. inline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, "g").replace(/punct/g, inline._punctuation).getRegex();
  3878. inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
  3879. inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
  3880. 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])?)+(?![-_])/;
  3881. inline.autolink = edit(inline.autolink).replace("scheme", inline._scheme).replace("email", inline._email).getRegex();
  3882. inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
  3883. inline.tag = edit(inline.tag).replace("comment", inline._comment).replace("attribute", inline._attribute).getRegex();
  3884. inline._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
  3885. inline._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/;
  3886. inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
  3887. inline.link = edit(inline.link).replace("label", inline._label).replace("href", inline._href).replace("title", inline._title).getRegex();
  3888. inline.reflink = edit(inline.reflink).replace("label", inline._label).replace("ref", block._label).getRegex();
  3889. inline.nolink = edit(inline.nolink).replace("ref", block._label).getRegex();
  3890. inline.reflinkSearch = edit(inline.reflinkSearch, "g").replace("reflink", inline.reflink).replace("nolink", inline.nolink).getRegex();
  3891. inline.normal = merge({}, inline);
  3892. inline.pedantic = merge({}, inline.normal, {
  3893. strong: {
  3894. start: /^__|\*\*/,
  3895. middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
  3896. endAst: /\*\*(?!\*)/g,
  3897. endUnd: /__(?!_)/g
  3898. },
  3899. em: {
  3900. start: /^_|\*/,
  3901. middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,
  3902. endAst: /\*(?!\*)/g,
  3903. endUnd: /_(?!_)/g
  3904. },
  3905. link: edit(/^!?\[(label)\]\((.*?)\)/).replace("label", inline._label).getRegex(),
  3906. reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", inline._label).getRegex()
  3907. });
  3908. inline.gfm = merge({}, inline.normal, {
  3909. escape: edit(inline.escape).replace("])", "~|])").getRegex(),
  3910. _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
  3911. url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
  3912. _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,
  3913. del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,
  3914. text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/
  3915. });
  3916. inline.gfm.url = edit(inline.gfm.url, "i").replace("email", inline.gfm._extended_email).getRegex();
  3917. inline.breaks = merge({}, inline.gfm, {
  3918. br: edit(inline.br).replace("{2,}", "*").getRegex(),
  3919. text: edit(inline.gfm.text).replace("\\b_", "\\b_| {2,}\\n").replace(/\{2,\}/g, "*").getRegex()
  3920. });
  3921. function smartypants(text) {
  3922. 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");
  3923. }
  3924. function mangle(text) {
  3925. let out = "", i, ch;
  3926. const l = text.length;
  3927. for (i = 0; i < l; i++) {
  3928. ch = text.charCodeAt(i);
  3929. if (Math.random() > 0.5) {
  3930. ch = "x" + ch.toString(16);
  3931. }
  3932. out += "&#" + ch + ";";
  3933. }
  3934. return out;
  3935. }
  3936. class Lexer {
  3937. constructor(options) {
  3938. this.tokens = [];
  3939. this.tokens.links = /* @__PURE__ */ Object.create(null);
  3940. this.options = options || defaults;
  3941. this.options.tokenizer = this.options.tokenizer || new Tokenizer();
  3942. this.tokenizer = this.options.tokenizer;
  3943. this.tokenizer.options = this.options;
  3944. this.tokenizer.lexer = this;
  3945. this.inlineQueue = [];
  3946. this.state = {
  3947. inLink: false,
  3948. inRawBlock: false,
  3949. top: true
  3950. };
  3951. const rules = {
  3952. block: block.normal,
  3953. inline: inline.normal
  3954. };
  3955. if (this.options.pedantic) {
  3956. rules.block = block.pedantic;
  3957. rules.inline = inline.pedantic;
  3958. } else if (this.options.gfm) {
  3959. rules.block = block.gfm;
  3960. if (this.options.breaks) {
  3961. rules.inline = inline.breaks;
  3962. } else {
  3963. rules.inline = inline.gfm;
  3964. }
  3965. }
  3966. this.tokenizer.rules = rules;
  3967. }
  3968. static get rules() {
  3969. return {
  3970. block,
  3971. inline
  3972. };
  3973. }
  3974. static lex(src2, options) {
  3975. const lexer = new Lexer(options);
  3976. return lexer.lex(src2);
  3977. }
  3978. static lexInline(src2, options) {
  3979. const lexer = new Lexer(options);
  3980. return lexer.inlineTokens(src2);
  3981. }
  3982. lex(src2) {
  3983. src2 = src2.replace(/\r\n|\r/g, "\n");
  3984. this.blockTokens(src2, this.tokens);
  3985. let next;
  3986. while (next = this.inlineQueue.shift()) {
  3987. this.inlineTokens(next.src, next.tokens);
  3988. }
  3989. return this.tokens;
  3990. }
  3991. blockTokens(src2, tokens = []) {
  3992. if (this.options.pedantic) {
  3993. src2 = src2.replace(/\t/g, " ").replace(/^ +$/gm, "");
  3994. } else {
  3995. src2 = src2.replace(/^( *)(\t+)/gm, (_, leading, tabs) => {
  3996. return leading + " ".repeat(tabs.length);
  3997. });
  3998. }
  3999. let token, lastToken, cutSrc, lastParagraphClipped;
  4000. while (src2) {
  4001. if (this.options.extensions && this.options.extensions.block && this.options.extensions.block.some((extTokenizer) => {
  4002. if (token = extTokenizer.call({ lexer: this }, src2, tokens)) {
  4003. src2 = src2.substring(token.raw.length);
  4004. tokens.push(token);
  4005. return true;
  4006. }
  4007. return false;
  4008. })) {
  4009. continue;
  4010. }
  4011. if (token = this.tokenizer.space(src2)) {
  4012. src2 = src2.substring(token.raw.length);
  4013. if (token.raw.length === 1 && tokens.length > 0) {
  4014. tokens[tokens.length - 1].raw += "\n";
  4015. } else {
  4016. tokens.push(token);
  4017. }
  4018. continue;
  4019. }
  4020. if (token = this.tokenizer.code(src2)) {
  4021. src2 = src2.substring(token.raw.length);
  4022. lastToken = tokens[tokens.length - 1];
  4023. if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) {
  4024. lastToken.raw += "\n" + token.raw;
  4025. lastToken.text += "\n" + token.text;
  4026. this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
  4027. } else {
  4028. tokens.push(token);
  4029. }
  4030. continue;
  4031. }
  4032. if (token = this.tokenizer.fences(src2)) {
  4033. src2 = src2.substring(token.raw.length);
  4034. tokens.push(token);
  4035. continue;
  4036. }
  4037. if (token = this.tokenizer.heading(src2)) {
  4038. src2 = src2.substring(token.raw.length);
  4039. tokens.push(token);
  4040. continue;
  4041. }
  4042. if (token = this.tokenizer.hr(src2)) {
  4043. src2 = src2.substring(token.raw.length);
  4044. tokens.push(token);
  4045. continue;
  4046. }
  4047. if (token = this.tokenizer.blockquote(src2)) {
  4048. src2 = src2.substring(token.raw.length);
  4049. tokens.push(token);
  4050. continue;
  4051. }
  4052. if (token = this.tokenizer.list(src2)) {
  4053. src2 = src2.substring(token.raw.length);
  4054. tokens.push(token);
  4055. continue;
  4056. }
  4057. if (token = this.tokenizer.html(src2)) {
  4058. src2 = src2.substring(token.raw.length);
  4059. tokens.push(token);
  4060. continue;
  4061. }
  4062. if (token = this.tokenizer.def(src2)) {
  4063. src2 = src2.substring(token.raw.length);
  4064. lastToken = tokens[tokens.length - 1];
  4065. if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) {
  4066. lastToken.raw += "\n" + token.raw;
  4067. lastToken.text += "\n" + token.raw;
  4068. this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
  4069. } else if (!this.tokens.links[token.tag]) {
  4070. this.tokens.links[token.tag] = {
  4071. href: token.href,
  4072. title: token.title
  4073. };
  4074. }
  4075. continue;
  4076. }
  4077. if (token = this.tokenizer.table(src2)) {
  4078. src2 = src2.substring(token.raw.length);
  4079. tokens.push(token);
  4080. continue;
  4081. }
  4082. if (token = this.tokenizer.lheading(src2)) {
  4083. src2 = src2.substring(token.raw.length);
  4084. tokens.push(token);
  4085. continue;
  4086. }
  4087. cutSrc = src2;
  4088. if (this.options.extensions && this.options.extensions.startBlock) {
  4089. let startIndex = Infinity;
  4090. const tempSrc = src2.slice(1);
  4091. let tempStart;
  4092. this.options.extensions.startBlock.forEach(function(getStartIndex) {
  4093. tempStart = getStartIndex.call({ lexer: this }, tempSrc);
  4094. if (typeof tempStart === "number" && tempStart >= 0) {
  4095. startIndex = Math.min(startIndex, tempStart);
  4096. }
  4097. });
  4098. if (startIndex < Infinity && startIndex >= 0) {
  4099. cutSrc = src2.substring(0, startIndex + 1);
  4100. }
  4101. }
  4102. if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {
  4103. lastToken = tokens[tokens.length - 1];
  4104. if (lastParagraphClipped && lastToken.type === "paragraph") {
  4105. lastToken.raw += "\n" + token.raw;
  4106. lastToken.text += "\n" + token.text;
  4107. this.inlineQueue.pop();
  4108. this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
  4109. } else {
  4110. tokens.push(token);
  4111. }
  4112. lastParagraphClipped = cutSrc.length !== src2.length;
  4113. src2 = src2.substring(token.raw.length);
  4114. continue;
  4115. }
  4116. if (token = this.tokenizer.text(src2)) {
  4117. src2 = src2.substring(token.raw.length);
  4118. lastToken = tokens[tokens.length - 1];
  4119. if (lastToken && lastToken.type === "text") {
  4120. lastToken.raw += "\n" + token.raw;
  4121. lastToken.text += "\n" + token.text;
  4122. this.inlineQueue.pop();
  4123. this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
  4124. } else {
  4125. tokens.push(token);
  4126. }
  4127. continue;
  4128. }
  4129. if (src2) {
  4130. const errMsg = "Infinite loop on byte: " + src2.charCodeAt(0);
  4131. if (this.options.silent) {
  4132. console.error(errMsg);
  4133. break;
  4134. } else {
  4135. throw new Error(errMsg);
  4136. }
  4137. }
  4138. }
  4139. this.state.top = true;
  4140. return tokens;
  4141. }
  4142. inline(src2, tokens = []) {
  4143. this.inlineQueue.push({ src: src2, tokens });
  4144. return tokens;
  4145. }
  4146. inlineTokens(src2, tokens = []) {
  4147. let token, lastToken, cutSrc;
  4148. let maskedSrc = src2;
  4149. let match;
  4150. let keepPrevChar, prevChar;
  4151. if (this.tokens.links) {
  4152. const links = Object.keys(this.tokens.links);
  4153. if (links.length > 0) {
  4154. while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {
  4155. if (links.includes(match[0].slice(match[0].lastIndexOf("[") + 1, -1))) {
  4156. maskedSrc = maskedSrc.slice(0, match.index) + "[" + repeatString("a", match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);
  4157. }
  4158. }
  4159. }
  4160. }
  4161. while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {
  4162. maskedSrc = maskedSrc.slice(0, match.index) + "[" + repeatString("a", match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
  4163. }
  4164. while ((match = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) {
  4165. maskedSrc = maskedSrc.slice(0, match.index + match[0].length - 2) + "++" + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);
  4166. this.tokenizer.rules.inline.escapedEmSt.lastIndex--;
  4167. }
  4168. while (src2) {
  4169. if (!keepPrevChar) {
  4170. prevChar = "";
  4171. }
  4172. keepPrevChar = false;
  4173. if (this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some((extTokenizer) => {
  4174. if (token = extTokenizer.call({ lexer: this }, src2, tokens)) {
  4175. src2 = src2.substring(token.raw.length);
  4176. tokens.push(token);
  4177. return true;
  4178. }
  4179. return false;
  4180. })) {
  4181. continue;
  4182. }
  4183. if (token = this.tokenizer.escape(src2)) {
  4184. src2 = src2.substring(token.raw.length);
  4185. tokens.push(token);
  4186. continue;
  4187. }
  4188. if (token = this.tokenizer.tag(src2)) {
  4189. src2 = src2.substring(token.raw.length);
  4190. lastToken = tokens[tokens.length - 1];
  4191. if (lastToken && token.type === "text" && lastToken.type === "text") {
  4192. lastToken.raw += token.raw;
  4193. lastToken.text += token.text;
  4194. } else {
  4195. tokens.push(token);
  4196. }
  4197. continue;
  4198. }
  4199. if (token = this.tokenizer.link(src2)) {
  4200. src2 = src2.substring(token.raw.length);
  4201. tokens.push(token);
  4202. continue;
  4203. }
  4204. if (token = this.tokenizer.reflink(src2, this.tokens.links)) {
  4205. src2 = src2.substring(token.raw.length);
  4206. lastToken = tokens[tokens.length - 1];
  4207. if (lastToken && token.type === "text" && lastToken.type === "text") {
  4208. lastToken.raw += token.raw;
  4209. lastToken.text += token.text;
  4210. } else {
  4211. tokens.push(token);
  4212. }
  4213. continue;
  4214. }
  4215. if (token = this.tokenizer.emStrong(src2, maskedSrc, prevChar)) {
  4216. src2 = src2.substring(token.raw.length);
  4217. tokens.push(token);
  4218. continue;
  4219. }
  4220. if (token = this.tokenizer.codespan(src2)) {
  4221. src2 = src2.substring(token.raw.length);
  4222. tokens.push(token);
  4223. continue;
  4224. }
  4225. if (token = this.tokenizer.br(src2)) {
  4226. src2 = src2.substring(token.raw.length);
  4227. tokens.push(token);
  4228. continue;
  4229. }
  4230. if (token = this.tokenizer.del(src2)) {
  4231. src2 = src2.substring(token.raw.length);
  4232. tokens.push(token);
  4233. continue;
  4234. }
  4235. if (token = this.tokenizer.autolink(src2, mangle)) {
  4236. src2 = src2.substring(token.raw.length);
  4237. tokens.push(token);
  4238. continue;
  4239. }
  4240. if (!this.state.inLink && (token = this.tokenizer.url(src2, mangle))) {
  4241. src2 = src2.substring(token.raw.length);
  4242. tokens.push(token);
  4243. continue;
  4244. }
  4245. cutSrc = src2;
  4246. if (this.options.extensions && this.options.extensions.startInline) {
  4247. let startIndex = Infinity;
  4248. const tempSrc = src2.slice(1);
  4249. let tempStart;
  4250. this.options.extensions.startInline.forEach(function(getStartIndex) {
  4251. tempStart = getStartIndex.call({ lexer: this }, tempSrc);
  4252. if (typeof tempStart === "number" && tempStart >= 0) {
  4253. startIndex = Math.min(startIndex, tempStart);
  4254. }
  4255. });
  4256. if (startIndex < Infinity && startIndex >= 0) {
  4257. cutSrc = src2.substring(0, startIndex + 1);
  4258. }
  4259. }
  4260. if (token = this.tokenizer.inlineText(cutSrc, smartypants)) {
  4261. src2 = src2.substring(token.raw.length);
  4262. if (token.raw.slice(-1) !== "_") {
  4263. prevChar = token.raw.slice(-1);
  4264. }
  4265. keepPrevChar = true;
  4266. lastToken = tokens[tokens.length - 1];
  4267. if (lastToken && lastToken.type === "text") {
  4268. lastToken.raw += token.raw;
  4269. lastToken.text += token.text;
  4270. } else {
  4271. tokens.push(token);
  4272. }
  4273. continue;
  4274. }
  4275. if (src2) {
  4276. const errMsg = "Infinite loop on byte: " + src2.charCodeAt(0);
  4277. if (this.options.silent) {
  4278. console.error(errMsg);
  4279. break;
  4280. } else {
  4281. throw new Error(errMsg);
  4282. }
  4283. }
  4284. }
  4285. return tokens;
  4286. }
  4287. }
  4288. class Renderer {
  4289. constructor(options) {
  4290. this.options = options || defaults;
  4291. }
  4292. code(code, infostring, escaped) {
  4293. const lang = (infostring || "").match(/\S*/)[0];
  4294. if (this.options.highlight) {
  4295. const out = this.options.highlight(code, lang);
  4296. if (out != null && out !== code) {
  4297. escaped = true;
  4298. code = out;
  4299. }
  4300. }
  4301. code = code.replace(/\n$/, "") + "\n";
  4302. if (!lang) {
  4303. return "<pre><code>" + (escaped ? code : escape$1(code, true)) + "</code></pre>\n";
  4304. }
  4305. return '<pre><code class="' + this.options.langPrefix + escape$1(lang) + '">' + (escaped ? code : escape$1(code, true)) + "</code></pre>\n";
  4306. }
  4307. blockquote(quote) {
  4308. return `<blockquote>
  4309. ${quote}</blockquote>
  4310. `;
  4311. }
  4312. html(html) {
  4313. return html;
  4314. }
  4315. heading(text, level, raw, slugger) {
  4316. if (this.options.headerIds) {
  4317. const id = this.options.headerPrefix + slugger.slug(raw);
  4318. return `<h${level} id="${id}">${text}</h${level}>
  4319. `;
  4320. }
  4321. return `<h${level}>${text}</h${level}>
  4322. `;
  4323. }
  4324. hr() {
  4325. return this.options.xhtml ? "<hr/>\n" : "<hr>\n";
  4326. }
  4327. list(body, ordered, start2) {
  4328. const type = ordered ? "ol" : "ul", startatt = ordered && start2 !== 1 ? ' start="' + start2 + '"' : "";
  4329. return "<" + type + startatt + ">\n" + body + "</" + type + ">\n";
  4330. }
  4331. listitem(text) {
  4332. return `<li>${text}</li>
  4333. `;
  4334. }
  4335. checkbox(checked) {
  4336. return "<input " + (checked ? 'checked="" ' : "") + 'disabled="" type="checkbox"' + (this.options.xhtml ? " /" : "") + "> ";
  4337. }
  4338. paragraph(text) {
  4339. return `<p>${text}</p>
  4340. `;
  4341. }
  4342. table(header, body) {
  4343. if (body)
  4344. body = `<tbody>${body}</tbody>`;
  4345. return "<table>\n<thead>\n" + header + "</thead>\n" + body + "</table>\n";
  4346. }
  4347. tablerow(content) {
  4348. return `<tr>
  4349. ${content}</tr>
  4350. `;
  4351. }
  4352. tablecell(content, flags) {
  4353. const type = flags.header ? "th" : "td";
  4354. const tag = flags.align ? `<${type} align="${flags.align}">` : `<${type}>`;
  4355. return tag + content + `</${type}>
  4356. `;
  4357. }
  4358. strong(text) {
  4359. return `<strong>${text}</strong>`;
  4360. }
  4361. em(text) {
  4362. return `<em>${text}</em>`;
  4363. }
  4364. codespan(text) {
  4365. return `<code>${text}</code>`;
  4366. }
  4367. br() {
  4368. return this.options.xhtml ? "<br/>" : "<br>";
  4369. }
  4370. del(text) {
  4371. return `<del>${text}</del>`;
  4372. }
  4373. link(href, title, text) {
  4374. href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
  4375. if (href === null) {
  4376. return text;
  4377. }
  4378. let out = '<a href="' + href + '"';
  4379. if (title) {
  4380. out += ' title="' + title + '"';
  4381. }
  4382. out += ">" + text + "</a>";
  4383. return out;
  4384. }
  4385. image(href, title, text) {
  4386. href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
  4387. if (href === null) {
  4388. return text;
  4389. }
  4390. let out = `<img src="${href}" alt="${text}"`;
  4391. if (title) {
  4392. out += ` title="${title}"`;
  4393. }
  4394. out += this.options.xhtml ? "/>" : ">";
  4395. return out;
  4396. }
  4397. text(text) {
  4398. return text;
  4399. }
  4400. }
  4401. class TextRenderer {
  4402. strong(text) {
  4403. return text;
  4404. }
  4405. em(text) {
  4406. return text;
  4407. }
  4408. codespan(text) {
  4409. return text;
  4410. }
  4411. del(text) {
  4412. return text;
  4413. }
  4414. html(text) {
  4415. return text;
  4416. }
  4417. text(text) {
  4418. return text;
  4419. }
  4420. link(href, title, text) {
  4421. return "" + text;
  4422. }
  4423. image(href, title, text) {
  4424. return "" + text;
  4425. }
  4426. br() {
  4427. return "";
  4428. }
  4429. }
  4430. class Slugger {
  4431. constructor() {
  4432. this.seen = {};
  4433. }
  4434. serialize(value) {
  4435. return value.toLowerCase().trim().replace(/<[!\/a-z].*?>/ig, "").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, "").replace(/\s/g, "-");
  4436. }
  4437. getNextSafeSlug(originalSlug, isDryRun) {
  4438. let slug = originalSlug;
  4439. let occurenceAccumulator = 0;
  4440. if (this.seen.hasOwnProperty(slug)) {
  4441. occurenceAccumulator = this.seen[originalSlug];
  4442. do {
  4443. occurenceAccumulator++;
  4444. slug = originalSlug + "-" + occurenceAccumulator;
  4445. } while (this.seen.hasOwnProperty(slug));
  4446. }
  4447. if (!isDryRun) {
  4448. this.seen[originalSlug] = occurenceAccumulator;
  4449. this.seen[slug] = 0;
  4450. }
  4451. return slug;
  4452. }
  4453. slug(value, options = {}) {
  4454. const slug = this.serialize(value);
  4455. return this.getNextSafeSlug(slug, options.dryrun);
  4456. }
  4457. }
  4458. class Parser {
  4459. constructor(options) {
  4460. this.options = options || defaults;
  4461. this.options.renderer = this.options.renderer || new Renderer();
  4462. this.renderer = this.options.renderer;
  4463. this.renderer.options = this.options;
  4464. this.textRenderer = new TextRenderer();
  4465. this.slugger = new Slugger();
  4466. }
  4467. static parse(tokens, options) {
  4468. const parser = new Parser(options);
  4469. return parser.parse(tokens);
  4470. }
  4471. static parseInline(tokens, options) {
  4472. const parser = new Parser(options);
  4473. return parser.parseInline(tokens);
  4474. }
  4475. parse(tokens, top2 = true) {
  4476. let out = "", i, j, k, l2, l3, row, cell, header, body, token, ordered, start2, loose, itemBody, item, checked, task, checkbox, ret;
  4477. const l = tokens.length;
  4478. for (i = 0; i < l; i++) {
  4479. token = tokens[i];
  4480. if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
  4481. ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);
  4482. if (ret !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "paragraph", "text"].includes(token.type)) {
  4483. out += ret || "";
  4484. continue;
  4485. }
  4486. }
  4487. switch (token.type) {
  4488. case "space": {
  4489. continue;
  4490. }
  4491. case "hr": {
  4492. out += this.renderer.hr();
  4493. continue;
  4494. }
  4495. case "heading": {
  4496. out += this.renderer.heading(
  4497. this.parseInline(token.tokens),
  4498. token.depth,
  4499. unescape$1(this.parseInline(token.tokens, this.textRenderer)),
  4500. this.slugger
  4501. );
  4502. continue;
  4503. }
  4504. case "code": {
  4505. out += this.renderer.code(
  4506. token.text,
  4507. token.lang,
  4508. token.escaped
  4509. );
  4510. continue;
  4511. }
  4512. case "table": {
  4513. header = "";
  4514. cell = "";
  4515. l2 = token.header.length;
  4516. for (j = 0; j < l2; j++) {
  4517. cell += this.renderer.tablecell(
  4518. this.parseInline(token.header[j].tokens),
  4519. { header: true, align: token.align[j] }
  4520. );
  4521. }
  4522. header += this.renderer.tablerow(cell);
  4523. body = "";
  4524. l2 = token.rows.length;
  4525. for (j = 0; j < l2; j++) {
  4526. row = token.rows[j];
  4527. cell = "";
  4528. l3 = row.length;
  4529. for (k = 0; k < l3; k++) {
  4530. cell += this.renderer.tablecell(
  4531. this.parseInline(row[k].tokens),
  4532. { header: false, align: token.align[k] }
  4533. );
  4534. }
  4535. body += this.renderer.tablerow(cell);
  4536. }
  4537. out += this.renderer.table(header, body);
  4538. continue;
  4539. }
  4540. case "blockquote": {
  4541. body = this.parse(token.tokens);
  4542. out += this.renderer.blockquote(body);
  4543. continue;
  4544. }
  4545. case "list": {
  4546. ordered = token.ordered;
  4547. start2 = token.start;
  4548. loose = token.loose;
  4549. l2 = token.items.length;
  4550. body = "";
  4551. for (j = 0; j < l2; j++) {
  4552. item = token.items[j];
  4553. checked = item.checked;
  4554. task = item.task;
  4555. itemBody = "";
  4556. if (item.task) {
  4557. checkbox = this.renderer.checkbox(checked);
  4558. if (loose) {
  4559. if (item.tokens.length > 0 && item.tokens[0].type === "paragraph") {
  4560. item.tokens[0].text = checkbox + " " + item.tokens[0].text;
  4561. if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === "text") {
  4562. item.tokens[0].tokens[0].text = checkbox + " " + item.tokens[0].tokens[0].text;
  4563. }
  4564. } else {
  4565. item.tokens.unshift({
  4566. type: "text",
  4567. text: checkbox
  4568. });
  4569. }
  4570. } else {
  4571. itemBody += checkbox;
  4572. }
  4573. }
  4574. itemBody += this.parse(item.tokens, loose);
  4575. body += this.renderer.listitem(itemBody, task, checked);
  4576. }
  4577. out += this.renderer.list(body, ordered, start2);
  4578. continue;
  4579. }
  4580. case "html": {
  4581. out += this.renderer.html(token.text);
  4582. continue;
  4583. }
  4584. case "paragraph": {
  4585. out += this.renderer.paragraph(this.parseInline(token.tokens));
  4586. continue;
  4587. }
  4588. case "text": {
  4589. body = token.tokens ? this.parseInline(token.tokens) : token.text;
  4590. while (i + 1 < l && tokens[i + 1].type === "text") {
  4591. token = tokens[++i];
  4592. body += "\n" + (token.tokens ? this.parseInline(token.tokens) : token.text);
  4593. }
  4594. out += top2 ? this.renderer.paragraph(body) : body;
  4595. continue;
  4596. }
  4597. default: {
  4598. const errMsg = 'Token with "' + token.type + '" type was not found.';
  4599. if (this.options.silent) {
  4600. console.error(errMsg);
  4601. return;
  4602. } else {
  4603. throw new Error(errMsg);
  4604. }
  4605. }
  4606. }
  4607. }
  4608. return out;
  4609. }
  4610. parseInline(tokens, renderer) {
  4611. renderer = renderer || this.renderer;
  4612. let out = "", i, token, ret;
  4613. const l = tokens.length;
  4614. for (i = 0; i < l; i++) {
  4615. token = tokens[i];
  4616. if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
  4617. ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);
  4618. if (ret !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(token.type)) {
  4619. out += ret || "";
  4620. continue;
  4621. }
  4622. }
  4623. switch (token.type) {
  4624. case "escape": {
  4625. out += renderer.text(token.text);
  4626. break;
  4627. }
  4628. case "html": {
  4629. out += renderer.html(token.text);
  4630. break;
  4631. }
  4632. case "link": {
  4633. out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer));
  4634. break;
  4635. }
  4636. case "image": {
  4637. out += renderer.image(token.href, token.title, token.text);
  4638. break;
  4639. }
  4640. case "strong": {
  4641. out += renderer.strong(this.parseInline(token.tokens, renderer));
  4642. break;
  4643. }
  4644. case "em": {
  4645. out += renderer.em(this.parseInline(token.tokens, renderer));
  4646. break;
  4647. }
  4648. case "codespan": {
  4649. out += renderer.codespan(token.text);
  4650. break;
  4651. }
  4652. case "br": {
  4653. out += renderer.br();
  4654. break;
  4655. }
  4656. case "del": {
  4657. out += renderer.del(this.parseInline(token.tokens, renderer));
  4658. break;
  4659. }
  4660. case "text": {
  4661. out += renderer.text(token.text);
  4662. break;
  4663. }
  4664. default: {
  4665. const errMsg = 'Token with "' + token.type + '" type was not found.';
  4666. if (this.options.silent) {
  4667. console.error(errMsg);
  4668. return;
  4669. } else {
  4670. throw new Error(errMsg);
  4671. }
  4672. }
  4673. }
  4674. }
  4675. return out;
  4676. }
  4677. }
  4678. function marked(src2, opt, callback) {
  4679. if (typeof src2 === "undefined" || src2 === null) {
  4680. throw new Error("marked(): input parameter is undefined or null");
  4681. }
  4682. if (typeof src2 !== "string") {
  4683. throw new Error("marked(): input parameter is of type " + Object.prototype.toString.call(src2) + ", string expected");
  4684. }
  4685. if (typeof opt === "function") {
  4686. callback = opt;
  4687. opt = null;
  4688. }
  4689. opt = merge({}, marked.defaults, opt || {});
  4690. checkSanitizeDeprecation(opt);
  4691. if (callback) {
  4692. const highlight = opt.highlight;
  4693. let tokens;
  4694. try {
  4695. tokens = Lexer.lex(src2, opt);
  4696. } catch (e) {
  4697. return callback(e);
  4698. }
  4699. const done = function(err) {
  4700. let out;
  4701. if (!err) {
  4702. try {
  4703. if (opt.walkTokens) {
  4704. marked.walkTokens(tokens, opt.walkTokens);
  4705. }
  4706. out = Parser.parse(tokens, opt);
  4707. } catch (e) {
  4708. err = e;
  4709. }
  4710. }
  4711. opt.highlight = highlight;
  4712. return err ? callback(err) : callback(null, out);
  4713. };
  4714. if (!highlight || highlight.length < 3) {
  4715. return done();
  4716. }
  4717. delete opt.highlight;
  4718. if (!tokens.length)
  4719. return done();
  4720. let pending = 0;
  4721. marked.walkTokens(tokens, function(token) {
  4722. if (token.type === "code") {
  4723. pending++;
  4724. setTimeout(() => {
  4725. highlight(token.text, token.lang, function(err, code) {
  4726. if (err) {
  4727. return done(err);
  4728. }
  4729. if (code != null && code !== token.text) {
  4730. token.text = code;
  4731. token.escaped = true;
  4732. }
  4733. pending--;
  4734. if (pending === 0) {
  4735. done();
  4736. }
  4737. });
  4738. }, 0);
  4739. }
  4740. });
  4741. if (pending === 0) {
  4742. done();
  4743. }
  4744. return;
  4745. }
  4746. function onError(e) {
  4747. e.message += "\nPlease report this to https://github.com/markedjs/marked.";
  4748. if (opt.silent) {
  4749. return "<p>An error occurred:</p><pre>" + escape$1(e.message + "", true) + "</pre>";
  4750. }
  4751. throw e;
  4752. }
  4753. try {
  4754. const tokens = Lexer.lex(src2, opt);
  4755. if (opt.walkTokens) {
  4756. if (opt.async) {
  4757. return Promise.all(marked.walkTokens(tokens, opt.walkTokens)).then(() => {
  4758. return Parser.parse(tokens, opt);
  4759. }).catch(onError);
  4760. }
  4761. marked.walkTokens(tokens, opt.walkTokens);
  4762. }
  4763. return Parser.parse(tokens, opt);
  4764. } catch (e) {
  4765. onError(e);
  4766. }
  4767. }
  4768. marked.options = marked.setOptions = function(opt) {
  4769. merge(marked.defaults, opt);
  4770. changeDefaults(marked.defaults);
  4771. return marked;
  4772. };
  4773. marked.getDefaults = getDefaults;
  4774. marked.defaults = defaults;
  4775. marked.use = function(...args) {
  4776. const extensions = marked.defaults.extensions || { renderers: {}, childTokens: {} };
  4777. args.forEach((pack) => {
  4778. const opts = merge({}, pack);
  4779. opts.async = marked.defaults.async || opts.async;
  4780. if (pack.extensions) {
  4781. pack.extensions.forEach((ext) => {
  4782. if (!ext.name) {
  4783. throw new Error("extension name required");
  4784. }
  4785. if (ext.renderer) {
  4786. const prevRenderer = extensions.renderers[ext.name];
  4787. if (prevRenderer) {
  4788. extensions.renderers[ext.name] = function(...args2) {
  4789. let ret = ext.renderer.apply(this, args2);
  4790. if (ret === false) {
  4791. ret = prevRenderer.apply(this, args2);
  4792. }
  4793. return ret;
  4794. };
  4795. } else {
  4796. extensions.renderers[ext.name] = ext.renderer;
  4797. }
  4798. }
  4799. if (ext.tokenizer) {
  4800. if (!ext.level || ext.level !== "block" && ext.level !== "inline") {
  4801. throw new Error("extension level must be 'block' or 'inline'");
  4802. }
  4803. if (extensions[ext.level]) {
  4804. extensions[ext.level].unshift(ext.tokenizer);
  4805. } else {
  4806. extensions[ext.level] = [ext.tokenizer];
  4807. }
  4808. if (ext.start) {
  4809. if (ext.level === "block") {
  4810. if (extensions.startBlock) {
  4811. extensions.startBlock.push(ext.start);
  4812. } else {
  4813. extensions.startBlock = [ext.start];
  4814. }
  4815. } else if (ext.level === "inline") {
  4816. if (extensions.startInline) {
  4817. extensions.startInline.push(ext.start);
  4818. } else {
  4819. extensions.startInline = [ext.start];
  4820. }
  4821. }
  4822. }
  4823. }
  4824. if (ext.childTokens) {
  4825. extensions.childTokens[ext.name] = ext.childTokens;
  4826. }
  4827. });
  4828. opts.extensions = extensions;
  4829. }
  4830. if (pack.renderer) {
  4831. const renderer = marked.defaults.renderer || new Renderer();
  4832. for (const prop in pack.renderer) {
  4833. const prevRenderer = renderer[prop];
  4834. renderer[prop] = (...args2) => {
  4835. let ret = pack.renderer[prop].apply(renderer, args2);
  4836. if (ret === false) {
  4837. ret = prevRenderer.apply(renderer, args2);
  4838. }
  4839. return ret;
  4840. };
  4841. }
  4842. opts.renderer = renderer;
  4843. }
  4844. if (pack.tokenizer) {
  4845. const tokenizer = marked.defaults.tokenizer || new Tokenizer();
  4846. for (const prop in pack.tokenizer) {
  4847. const prevTokenizer = tokenizer[prop];
  4848. tokenizer[prop] = (...args2) => {
  4849. let ret = pack.tokenizer[prop].apply(tokenizer, args2);
  4850. if (ret === false) {
  4851. ret = prevTokenizer.apply(tokenizer, args2);
  4852. }
  4853. return ret;
  4854. };
  4855. }
  4856. opts.tokenizer = tokenizer;
  4857. }
  4858. if (pack.walkTokens) {
  4859. const walkTokens = marked.defaults.walkTokens;
  4860. opts.walkTokens = function(token) {
  4861. let values = [];
  4862. values.push(pack.walkTokens.call(this, token));
  4863. if (walkTokens) {
  4864. values = values.concat(walkTokens.call(this, token));
  4865. }
  4866. return values;
  4867. };
  4868. }
  4869. marked.setOptions(opts);
  4870. });
  4871. };
  4872. marked.walkTokens = function(tokens, callback) {
  4873. let values = [];
  4874. for (const token of tokens) {
  4875. values = values.concat(callback.call(marked, token));
  4876. switch (token.type) {
  4877. case "table": {
  4878. for (const cell of token.header) {
  4879. values = values.concat(marked.walkTokens(cell.tokens, callback));
  4880. }
  4881. for (const row of token.rows) {
  4882. for (const cell of row) {
  4883. values = values.concat(marked.walkTokens(cell.tokens, callback));
  4884. }
  4885. }
  4886. break;
  4887. }
  4888. case "list": {
  4889. values = values.concat(marked.walkTokens(token.items, callback));
  4890. break;
  4891. }
  4892. default: {
  4893. if (marked.defaults.extensions && marked.defaults.extensions.childTokens && marked.defaults.extensions.childTokens[token.type]) {
  4894. marked.defaults.extensions.childTokens[token.type].forEach(function(childTokens) {
  4895. values = values.concat(marked.walkTokens(token[childTokens], callback));
  4896. });
  4897. } else if (token.tokens) {
  4898. values = values.concat(marked.walkTokens(token.tokens, callback));
  4899. }
  4900. }
  4901. }
  4902. }
  4903. return values;
  4904. };
  4905. marked.parseInline = function(src2, opt) {
  4906. if (typeof src2 === "undefined" || src2 === null) {
  4907. throw new Error("marked.parseInline(): input parameter is undefined or null");
  4908. }
  4909. if (typeof src2 !== "string") {
  4910. throw new Error("marked.parseInline(): input parameter is of type " + Object.prototype.toString.call(src2) + ", string expected");
  4911. }
  4912. opt = merge({}, marked.defaults, opt || {});
  4913. checkSanitizeDeprecation(opt);
  4914. try {
  4915. const tokens = Lexer.lexInline(src2, opt);
  4916. if (opt.walkTokens) {
  4917. marked.walkTokens(tokens, opt.walkTokens);
  4918. }
  4919. return Parser.parseInline(tokens, opt);
  4920. } catch (e) {
  4921. e.message += "\nPlease report this to https://github.com/markedjs/marked.";
  4922. if (opt.silent) {
  4923. return "<p>An error occurred:</p><pre>" + escape$1(e.message + "", true) + "</pre>";
  4924. }
  4925. throw e;
  4926. }
  4927. };
  4928. marked.Parser = Parser;
  4929. marked.parser = Parser.parse;
  4930. marked.Renderer = Renderer;
  4931. marked.TextRenderer = TextRenderer;
  4932. marked.Lexer = Lexer;
  4933. marked.lexer = Lexer.lex;
  4934. marked.Tokenizer = Tokenizer;
  4935. marked.Slugger = Slugger;
  4936. marked.parse = marked;
  4937. marked.options;
  4938. marked.setOptions;
  4939. marked.use;
  4940. marked.walkTokens;
  4941. marked.parseInline;
  4942. Parser.parse;
  4943. Lexer.lex;
  4944. function markdown(md) {
  4945. return marked.parse(md);
  4946. }
  4947. const CommonProject = Project.create({
  4948. name: "\u901A\u7528",
  4949. domains: [],
  4950. level: 1,
  4951. scripts: {
  4952. guide: new Script({
  4953. name: "\u4F7F\u7528\u6559\u7A0B",
  4954. url: [["\u6240\u6709\u9875\u9762", /.*/]],
  4955. namespace: "common.guide",
  4956. onrender({ panel: panel2, header }) {
  4957. const guide = createGuide({ panel: panel2, header });
  4958. const home = el("button", { className: "base-style-button-secondary" }, "\u{1F3E1}\u5B98\u7F51\u6559\u7A0B");
  4959. home.onclick = () => window.open("https://docs.ocsjs.com", "_blank");
  4960. const notify = el("button", { className: "base-style-button-secondary" }, "\u2728\u67E5\u770B\u901A\u77E5\u63D0\u793A");
  4961. notify.onclick = () => $script.pin(CommonProject.scripts.notify);
  4962. const changeLog = el("button", { className: "base-style-button-secondary" }, "\u{1F4C4}\u67E5\u770B\u66F4\u65B0\u65E5\u5FD7");
  4963. changeLog.onclick = () => $script.pin(CommonProject.scripts.changelog);
  4964. changeLog.style.marginBottom = "12px";
  4965. guide.style.width = "400px";
  4966. panel2.body.replaceChildren(home, notify, changeLog, guide);
  4967. }
  4968. }),
  4969. notify: new Script({
  4970. name: "\u901A\u77E5\u63D0\u793A",
  4971. url: [["", /.*/]],
  4972. namespace: "common.notify",
  4973. configs: {
  4974. notes: {
  4975. defaultValue: $creator.notes([
  4976. "\u6B64\u9875\u9762\u5B9E\u65F6\u66F4\u65B0\uFF0C\u5927\u5BB6\u9047\u5230\u95EE\u9898\u53EF\u4EE5\u770B\u770B\u901A\u77E5",
  4977. "\u6216\u8005\u8FDB\u5165\u4E0A\u65B9\u5B98\u7F51\u91CC\u7684\u4EA4\u6D41\u7FA4\u8FDB\u884C\u53CD\u9988"
  4978. ]).outerHTML
  4979. }
  4980. },
  4981. async onrender({ panel: panel2 }) {
  4982. panel2.body.replaceChildren("\u52A0\u8F7D\u4E2D...");
  4983. const md = await request("https://cdn.ocsjs.com/articles/ocs/notify.md", {
  4984. type: "fetch",
  4985. contentType: "text",
  4986. method: "get"
  4987. });
  4988. panel2.body.replaceChildren(el("div", { className: "card markdown", innerHTML: markdown(md) }));
  4989. }
  4990. }),
  4991. settings: new Script({
  4992. name: "\u5168\u5C40\u8BBE\u7F6E",
  4993. url: [["\u6240\u6709\u9875\u9762", /.*/]],
  4994. namespace: "common.settings",
  4995. configs: {
  4996. notes: {
  4997. defaultValue: $creator.notes([
  4998. "\u60F3\u8981\u81EA\u52A8\u7B54\u9898\u5FC5\u987B\u8BBE\u7F6E \u201C\u9898\u5E93\u914D\u7F6E\u201D ",
  4999. "\u8BBE\u7F6E\u540E\u8FDB\u5165\u7AE0\u8282\u6D4B\u8BD5\uFF0C\u4F5C\u4E1A\uFF0C\u8003\u8BD5\u9875\u9762\u5373\u53EF\u81EA\u52A8\u7B54\u9898\u3002"
  5000. ]).outerHTML
  5001. },
  5002. notification: {
  5003. label: "\u5F00\u542F\u7CFB\u7EDF\u901A\u77E5",
  5004. defaultValue: true,
  5005. attrs: {
  5006. 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",
  5007. type: "checkbox"
  5008. }
  5009. },
  5010. answererWrappers: {
  5011. defaultValue: []
  5012. },
  5013. answererWrappersButton: {
  5014. label: "\u9898\u5E93\u914D\u7F6E",
  5015. defaultValue: "\u70B9\u51FB\u914D\u7F6E",
  5016. attrs: {
  5017. type: "button"
  5018. },
  5019. onload() {
  5020. const aws = CommonProject.scripts.settings.cfg.answererWrappers || [];
  5021. this.value = aws.length ? "\u5F53\u524D\u6709" + aws.length + "\u4E2A\u53EF\u7528\u9898\u5E93" : "\u70B9\u51FB\u914D\u7F6E";
  5022. this.onclick = () => {
  5023. const aw = CommonProject.scripts.settings.cfg.answererWrappers || [];
  5024. const copy = $creator.copy("\u590D\u5236\u9898\u5E93\u914D\u7F6E", JSON.stringify(aw));
  5025. const list = el("div", [
  5026. el("div", aw.length ? ["\u4EE5\u4E0B\u662F\u5DF2\u7ECF\u89E3\u6790\u8FC7\u7684\u9898\u5E93\u914D\u7F6E\uFF1A", copy] : ""),
  5027. ...createAnswererWrapperList(aw)
  5028. ]);
  5029. const model = $model("prompt", {
  5030. content: el("div", [
  5031. "\u5177\u4F53\u914D\u7F6E\u6559\u7A0B\uFF0C\u8BF7\u67E5\u770B\u5B98\u7F51\uFF1A",
  5032. el("a", { href: "https://docs.ocsjs.com/docs/work" }, "\u81EA\u52A8\u7B54\u9898\u6559\u7A0B"),
  5033. list
  5034. ]),
  5035. placeholder: aw.length ? "\u91CD\u65B0\u8F93\u5165" : "\u8F93\u5165\u9898\u5E93\u914D\u7F6E",
  5036. cancelButton: el("button", {
  5037. className: "model-cancel-button",
  5038. innerText: "\u6E05\u7A7A\u9898\u5E93\u914D\u7F6E",
  5039. onclick() {
  5040. $message("success", { content: "\u5DF2\u6E05\u7A7A\uFF0C\u5728\u7B54\u9898\u524D\u8BF7\u8BB0\u5F97\u91CD\u65B0\u914D\u7F6E\u3002" });
  5041. model == null ? void 0 : model.remove();
  5042. CommonProject.scripts.settings.cfg.answererWrappers = [];
  5043. }
  5044. }),
  5045. async onConfirm(value) {
  5046. if (value) {
  5047. try {
  5048. const aw2 = await AnswerWrapperParser.from(value);
  5049. if (aw2.length) {
  5050. CommonProject.scripts.settings.cfg.answererWrappers = aw2;
  5051. $model("alert", {
  5052. content: el("div", [
  5053. el("div", "\u914D\u7F6E\u6210\u529F\uFF0C\u6253\u5F00\u5177\u6709\u7B54\u9898\u811A\u672C\u7684\u9875\u9762\u540E\u5373\u53EF\u81EA\u52A8\u7B54\u9898\uFF0C\u89E3\u6790\u5230\u7684\u9898\u5E93\u5982\u4E0B\u6240\u793A:"),
  5054. ...createAnswererWrapperList(aw2)
  5055. ])
  5056. });
  5057. } else {
  5058. $model("alert", { content: "\u9898\u5E93\u914D\u7F6E\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u914D\u7F6E\u3002" });
  5059. }
  5060. } catch (e) {
  5061. $model("alert", {
  5062. content: el("div", [el("div", "\u89E3\u6790\u5931\u8D25\uFF0C\u539F\u56E0\u5982\u4E0B :"), el("div", e.message)])
  5063. });
  5064. }
  5065. } else {
  5066. $model("alert", {
  5067. content: el("div", "\u4E0D\u80FD\u4E3A\u7A7A\uFF01")
  5068. });
  5069. }
  5070. }
  5071. });
  5072. };
  5073. }
  5074. },
  5075. skipAnswered: {
  5076. label: "\u8DF3\u8FC7\u5DF2\u7ECF\u5B8C\u6210\u7684\u9898\u76EE",
  5077. attrs: { type: "checkbox", title: "\u5F53\u9898\u76EE\u4E2D\u7684\u9009\u9879\u5927\u4E8E\u4E00\u4E2A\u5DF2\u7ECF\u88AB\u9009\u4E2D\uFF0C\u5219\u5C06\u8DF3\u8FC7\u6B64\u9898\u7684\u7B54\u9898\u3002" },
  5078. defaultValue: true
  5079. },
  5080. uncheckAllChoice: {
  5081. label: "\u6E05\u7A7A\u7B54\u6848",
  5082. attrs: { type: "checkbox", title: "\u5728\u8003\u8BD5\u5F00\u59CB\u524D\uFF0C\u6E05\u7A7A\u6240\u6709\u5DF2\u7ECF\u9009\u62E9\u8FC7\u7684\u7B54\u6848\u3002" },
  5083. defaultValue: false
  5084. },
  5085. thread: {
  5086. label: "\u7EBF\u7A0B\u6570\u91CF\uFF08\u4E2A\uFF09",
  5087. attrs: {
  5088. type: "number",
  5089. min: "1",
  5090. step: "1",
  5091. max: "3",
  5092. 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"
  5093. },
  5094. defaultValue: 1
  5095. },
  5096. period: {
  5097. label: "\u7B54\u9898\u95F4\u9694\uFF08\u79D2\uFF09",
  5098. attrs: {
  5099. type: "number",
  5100. min: "0",
  5101. step: "1",
  5102. max: "60",
  5103. 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"
  5104. },
  5105. defaultValue: 3
  5106. },
  5107. timeout: {
  5108. label: "\u5904\u7406\u8D85\u65F6\u65F6\u95F4\uFF08\u79D2\uFF09",
  5109. attrs: { type: "number", min: "10", step: "1", max: "60", title: "\u6BCF\u9053\u9898\u6700\u591A\u505An\u79D2, \u8D85\u8FC7\u5219\u8DF3\u8FC7\u6B64\u9898\u3002" },
  5110. defaultValue: 30
  5111. },
  5112. retry: {
  5113. label: "\u8D85\u65F6\u91CD\u8BD5\u6B21\u6570",
  5114. attrs: { type: "number", min: "0", step: "1", max: "3" },
  5115. defaultValue: 1
  5116. }
  5117. },
  5118. oncomplete() {
  5119. this.onConfigChange("notification", (open) => {
  5120. if (open) {
  5121. $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", {
  5122. duration: 5
  5123. });
  5124. }
  5125. });
  5126. },
  5127. onbeforeunload() {
  5128. }
  5129. }),
  5130. onlineSearch: new Script({
  5131. name: "\u5728\u7EBF\u641C\u9898",
  5132. url: [["\u6240\u6709\u9875\u9762", /.*/]],
  5133. namespace: "common.online-search",
  5134. configs: {
  5135. notes: {
  5136. 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"
  5137. },
  5138. selectSearch: {
  5139. label: "\u5212\u8BCD\u641C\u7D22",
  5140. defaultValue: true,
  5141. attrs: { type: "checkbox", title: "\u4F7F\u7528\u9F20\u6807\u6ED1\u52A8\u9009\u62E9\u9875\u9762\u4E2D\u7684\u9898\u76EE\u8FDB\u884C\u641C\u7D22\u3002" }
  5142. },
  5143. selection: {
  5144. defaultValue: ""
  5145. }
  5146. },
  5147. oncomplete() {
  5148. if (this.cfg.selectSearch) {
  5149. document.addEventListener(
  5150. "selectionchange",
  5151. debounce_1(() => {
  5152. var _a;
  5153. this.cfg.selection = ((_a = document.getSelection()) == null ? void 0 : _a.toString()) || "";
  5154. }, 500)
  5155. );
  5156. }
  5157. },
  5158. onrender({ panel: panel2 }) {
  5159. const content = el("div", "\u8BF7\u8F93\u5165\u9898\u76EE\u8FDB\u884C\u641C\u7D22\uFF1A", (content2) => {
  5160. content2.style.marginBottom = "12px";
  5161. });
  5162. const input = el("input", { placeholder: "\u8BF7\u5C3D\u91CF\u4FDD\u8BC1\u9898\u76EE\u5B8C\u6574\uFF0C\u4E0D\u8981\u6F0F\u5B57\u54E6\u3002" }, (input2) => {
  5163. input2.className = "base-style-input";
  5164. input2.style.flex = "1";
  5165. });
  5166. const search = async (value) => {
  5167. content.replaceChildren(el("span", "\u641C\u7D22\u4E2D..."));
  5168. if (value) {
  5169. const t = Date.now();
  5170. const results = await defaultAnswerWrapperHandler(CommonProject.scripts.settings.cfg.answererWrappers, {
  5171. title: value
  5172. });
  5173. const resume = ((Date.now() - t) / 1e3).toFixed(2);
  5174. content.replaceChildren(
  5175. el(
  5176. "div",
  5177. [
  5178. el("div", `\u641C\u7D22\u5230 ${results.map((r) => r.answers).flat().length} \u4E2A\u7ED3\u679C\uFF0C\u5171\u8017\u65F6 ${resume} \u79D2`),
  5179. el("search-results-element", {
  5180. results: results.map((res) => ({
  5181. results: res.answers.map((ans) => [ans.question, ans.answer]),
  5182. homepage: res.homepage,
  5183. name: res.name
  5184. })),
  5185. question: value
  5186. })
  5187. ],
  5188. (div) => {
  5189. div.style.width = "400px";
  5190. }
  5191. )
  5192. );
  5193. } else {
  5194. content.replaceChildren(el("span", "\u9898\u76EE\u4E0D\u80FD\u4E3A\u7A7A\uFF01"));
  5195. }
  5196. };
  5197. const button = el("button", "\u641C\u7D22", (button2) => {
  5198. button2.className = "base-style-button";
  5199. button2.onclick = () => {
  5200. search(input.value);
  5201. };
  5202. });
  5203. const searchContainer = el("div", [input, button], (div) => {
  5204. div.style.display = "flex";
  5205. });
  5206. this.onConfigChange("selection", (curr) => {
  5207. if (input.parentElement) {
  5208. input.value = curr;
  5209. }
  5210. });
  5211. panel2.body.append(el("div", [el("hr"), content, searchContainer]));
  5212. }
  5213. }),
  5214. workResults: new Script({
  5215. name: "\u641C\u7D22\u7ED3\u679C",
  5216. url: [["\u6240\u6709\u9875\u9762", /.*/]],
  5217. namespace: "common.work-results",
  5218. configs: {
  5219. notes: {
  5220. defaultValue: $creator.notes([
  5221. "\u8B66\u544A\uFF1A\u7981\u6B62\u4E0E\u5176\u4ED6\u811A\u672C\u4E00\u8D77\u4F7F\u7528\uFF0C\u5426\u5219\u51FA\u73B0\u7B54\u6848\u9009\u4E0D\u4E0A\u6216\u8005\u5176\u4ED6\u95EE\u9898\u4E00\u5F8B\u540E\u679C\u81EA\u8D1F\u3002",
  5222. "\u70B9\u51FB\u9898\u76EE\u5E8F\u53F7\uFF0C\u67E5\u770B\u641C\u7D22\u7ED3\u679C",
  5223. "\u6BCF\u6B21\u81EA\u52A8\u7B54\u9898\u5F00\u59CB\u524D\uFF0C\u90FD\u4F1A\u6E05\u7A7A\u4E0A\u4E00\u6B21\u7684\u641C\u7D22\u7ED3\u679C\u3002"
  5224. ]).outerHTML
  5225. },
  5226. type: {
  5227. label: "\u663E\u793A\u7C7B\u578B",
  5228. tag: "select",
  5229. attrs: { title: "\u4F7F\u7528\u9898\u76EE\u5217\u8868\u53EF\u80FD\u4F1A\u9020\u6210\u9875\u9762\u5361\u987F\u3002" },
  5230. defaultValue: "numbers",
  5231. onload() {
  5232. this.append(
  5233. ...$creator.selectOptions(this.getAttribute("value"), [
  5234. ["numbers", "\u5E8F\u53F7\u5217\u8868"],
  5235. ["questions", "\u9898\u76EE\u5217\u8868"]
  5236. ])
  5237. );
  5238. }
  5239. },
  5240. totalQuestionCount: {
  5241. defaultValue: 0
  5242. },
  5243. requestIndex: {
  5244. defaultValue: 0
  5245. },
  5246. resolverIndex: {
  5247. defaultValue: 0
  5248. },
  5249. currentResultIndex: {
  5250. defaultValue: 0
  5251. }
  5252. },
  5253. onrender({ panel: panel2 }) {
  5254. let scrollPercent = 0;
  5255. const list = el("div");
  5256. let mouseoverIndex = -1;
  5257. list.onscroll = () => {
  5258. scrollPercent = list.scrollTop / list.scrollHeight;
  5259. };
  5260. const setNumStyle = (result, num, index) => {
  5261. if (result.requesting) {
  5262. num.classList.add("requesting");
  5263. } else if (result.resolving) {
  5264. num.classList.add("resolving");
  5265. } else if (result.error || result.searchResults.length === 0 || result.finish === false) {
  5266. num.classList.add("error");
  5267. } else if (index === this.cfg.currentResultIndex) {
  5268. num.classList.add("active");
  5269. }
  5270. };
  5271. const render = async () => {
  5272. const results = await $store.getTab("common.work-results.results");
  5273. if (results == null ? void 0 : results.length) {
  5274. if (results[this.cfg.currentResultIndex] === void 0) {
  5275. this.cfg.currentResultIndex = 0;
  5276. }
  5277. if (this.cfg.type === "numbers") {
  5278. const resultContainer = el("div", {}, (res) => {
  5279. res.style.width = "400px";
  5280. });
  5281. list.style.width = "400px";
  5282. list.style.marginBottom = "12px";
  5283. list.style.maxHeight = window.innerHeight / 2 + "px";
  5284. const nums = results.map((result, index) => {
  5285. return el("span", { className: "search-results-num", innerText: (index + 1).toString() }, (num) => {
  5286. setNumStyle(result, num, index);
  5287. num.onclick = () => {
  5288. for (const n of nums) {
  5289. n.classList.remove("active");
  5290. }
  5291. num.classList.add("active");
  5292. this.cfg.currentResultIndex = index;
  5293. resultContainer.replaceChildren(createResult(result));
  5294. };
  5295. });
  5296. });
  5297. list.replaceChildren(...nums);
  5298. resultContainer.replaceChildren(createResult(results[this.cfg.currentResultIndex]));
  5299. panel2.body.replaceChildren(list, resultContainer);
  5300. } else {
  5301. list.style.width = "400px";
  5302. list.style.overflow = "auto";
  5303. list.style.maxHeight = window.innerHeight / 2 + "px";
  5304. const resultContainer = el("div", { className: "work-result-question-container" });
  5305. const nums = [];
  5306. const questions = results.map((result, index) => {
  5307. const num = el(
  5308. "span",
  5309. {
  5310. className: "search-results-num",
  5311. innerHTML: (index + 1).toString()
  5312. },
  5313. (num2) => {
  5314. num2.style.marginRight = "12px";
  5315. num2.style.display = "inline-block";
  5316. setNumStyle(result, num2, index);
  5317. }
  5318. );
  5319. nums.push(num);
  5320. return el(
  5321. "div",
  5322. [num, result.question],
  5323. (question) => {
  5324. question.className = "search-results-question";
  5325. if (result.requesting === false && result.resolving === false && (result.error || result.searchResults.length === 0 || result.finish === false)) {
  5326. question.classList.add("error");
  5327. } else if (index === this.cfg.currentResultIndex) {
  5328. question.classList.add("active");
  5329. }
  5330. question.onmouseover = () => {
  5331. mouseoverIndex = index;
  5332. question.classList.add("hover");
  5333. resultContainer.replaceChildren(createResult(result));
  5334. };
  5335. question.onmouseleave = () => {
  5336. mouseoverIndex = -1;
  5337. question.classList.remove("hover");
  5338. resultContainer.replaceChildren(createResult(results[this.cfg.currentResultIndex]));
  5339. };
  5340. question.onclick = () => {
  5341. for (const n of nums) {
  5342. n.classList.remove("active");
  5343. }
  5344. for (const q of questions) {
  5345. q.classList.remove("active");
  5346. }
  5347. nums[index].classList.add("active");
  5348. question.classList.add("active");
  5349. this.cfg.currentResultIndex = index;
  5350. resultContainer.replaceChildren(createResult(result));
  5351. };
  5352. }
  5353. );
  5354. });
  5355. list.replaceChildren(...questions);
  5356. if (mouseoverIndex === -1) {
  5357. resultContainer.replaceChildren(createResult(results[this.cfg.currentResultIndex]));
  5358. } else {
  5359. resultContainer.replaceChildren(createResult(results[mouseoverIndex]));
  5360. }
  5361. panel2.body.replaceChildren(
  5362. el("div", [list, el("div", {}, [resultContainer])], (div) => {
  5363. div.style.display = "flex";
  5364. })
  5365. );
  5366. }
  5367. } else {
  5368. panel2.body.replaceChildren(
  5369. el("div", "\u26A0\uFE0F\u6682\u65E0\u4EFB\u4F55\u641C\u7D22\u7ED3\u679C", (div) => {
  5370. div.style.textAlign = "center";
  5371. })
  5372. );
  5373. }
  5374. list.scrollTo({
  5375. top: scrollPercent * list.scrollHeight,
  5376. behavior: "auto"
  5377. });
  5378. const tip = el("div", [
  5379. el("div", { className: "search-results-num requesting" }, "n"),
  5380. "\u8868\u793A\u641C\u7D22\u4E2D ",
  5381. el("br"),
  5382. el("div", { className: "search-results-num resolving" }, "n"),
  5383. "\u8868\u793A\u5DF2\u641C\u7D22\u4F46\u672A\u5F00\u59CB\u7B54\u9898 ",
  5384. el("br"),
  5385. el("div", { className: "search-results-num" }, "n"),
  5386. "\u8868\u793A\u5DF2\u641C\u7D22\u5DF2\u7B54\u9898 "
  5387. ]);
  5388. panel2.body.prepend(
  5389. el("hr"),
  5390. el(
  5391. "div",
  5392. [
  5393. `\u5F53\u524D\u641C\u9898: ${this.cfg.requestIndex + 1}/${this.cfg.totalQuestionCount}`,
  5394. " , ",
  5395. `\u5F53\u524D\u7B54\u9898: ${this.cfg.resolverIndex + 1}/${this.cfg.totalQuestionCount}`,
  5396. " , ",
  5397. el("a", "\u67E5\u770B\u63D0\u793A", (btn) => {
  5398. btn.addEventListener("click", () => {
  5399. $model("confirm", {
  5400. content: tip
  5401. });
  5402. });
  5403. })
  5404. ],
  5405. (div) => {
  5406. div.style.marginBottom = "12px";
  5407. }
  5408. ),
  5409. el("hr")
  5410. );
  5411. };
  5412. const createResult = (result) => {
  5413. if (result) {
  5414. const error = el("span", {}, (el2) => el2.style.color = "red");
  5415. if (result.requesting && result.resolving) {
  5416. return el("div", [result.question, el("hr"), "\u5F53\u524D\u9898\u76EE\u8FD8\u672A\u5F00\u59CB\u641C\u7D22\uFF0C\u8BF7\u7A0D\u7B49\u3002"]);
  5417. } else {
  5418. if (result.error) {
  5419. error.innerText = result.error;
  5420. return el("div", [result.question, el("hr"), error]);
  5421. } else if (result.searchResults.length === 0) {
  5422. error.innerText = "\u6B64\u9898\u672A\u641C\u7D22\u5230\u7B54\u6848";
  5423. return el("div", [result.question, el("hr"), error]);
  5424. } else {
  5425. error.innerText = "\u6B64\u9898\u672A\u5B8C\u6210, \u53EF\u80FD\u662F\u6CA1\u6709\u5339\u914D\u7684\u9009\u9879\u3002";
  5426. return el("div", [
  5427. ...result.finish ? [] : [result.resolving ? "\u6B63\u5728\u7B49\u5F85\u7B54\u9898\u4E2D\uFF0C\u8BF7\u7A0D\u7B49\u3002" : error],
  5428. el("search-results-element", {
  5429. results: result.searchResults,
  5430. question: result.question
  5431. })
  5432. ]);
  5433. }
  5434. }
  5435. } else {
  5436. return el("div", "undefined");
  5437. }
  5438. };
  5439. render();
  5440. this.onConfigChange("type", render);
  5441. this.onConfigChange("resolverIndex", render);
  5442. $store.addChangeListener("common.work-results.result", debounce_1(render, 1e3, { maxWait: 1e3 }));
  5443. }
  5444. }),
  5445. changelog: new Script({
  5446. name: "\u7248\u672C\u66F4\u65B0",
  5447. url: [["", /.*/]],
  5448. namespace: "common.changelog",
  5449. configs: {
  5450. notes: {
  5451. defaultValue: $creator.notes(["\u6B64\u9875\u9762\u5B9E\u65F6\u66F4\u65B0\uFF0C\u9047\u5230\u95EE\u9898\u53EF\u4EE5\u67E5\u770B\u6700\u65B0\u7248\u672C\u662F\u5426\u4FEE\u590D\u3002"]).outerHTML
  5452. }
  5453. },
  5454. async onrender({ panel: panel2 }) {
  5455. panel2.body.replaceChildren("\u52A0\u8F7D\u4E2D...");
  5456. const md = await request("https://cdn.ocsjs.com/articles/ocs/changelog.md", {
  5457. type: "fetch",
  5458. contentType: "text",
  5459. method: "get"
  5460. });
  5461. panel2.body.replaceChildren(el("div", { className: "markdown card", innerHTML: markdown(md) }));
  5462. }
  5463. }),
  5464. hack: new Script({
  5465. name: "\u9875\u9762\u590D\u5236\u7C98\u8D34\u9650\u5236\u89E3\u9664",
  5466. url: [["\u6240\u6709\u9875\u9762", /.*/]],
  5467. hideInPanel: true,
  5468. onactive() {
  5469. enableCopy();
  5470. },
  5471. oncomplete() {
  5472. enableCopy();
  5473. setTimeout(() => enableCopy(), 3e3);
  5474. }
  5475. }),
  5476. disableDialog: new Script({
  5477. name: "\u7981\u6B62\u5F39\u7A97",
  5478. url: [],
  5479. onstart() {
  5480. try {
  5481. $gm.unsafeWindow.alert = (msg) => $console.warn(`\u5DF2\u62E6\u622A\u5F39\u7A97: ${msg}`);
  5482. window.alert = self.alert = (msg) => $console.warn(`\u5DF2\u62E6\u622A\u5F39\u7A97: ${msg}`);
  5483. } catch (e) {
  5484. }
  5485. }
  5486. })
  5487. }
  5488. });
  5489. function enableCopy() {
  5490. try {
  5491. const d = document;
  5492. const b = document.body;
  5493. d.onselectstart = d.oncopy = d.onpaste = d.onkeydown = d.oncontextmenu = () => true;
  5494. b.onselectstart = b.oncopy = b.onpaste = b.onkeydown = b.oncontextmenu = () => true;
  5495. } catch (err) {
  5496. console.error("\u9875\u9762\u590D\u5236\u7C98\u8D34\u529F\u80FD\u5F00\u542F\u5931\u8D25", err);
  5497. }
  5498. const style = document.createElement("style");
  5499. style.innerHTML = `
  5500. html * {
  5501. -webkit-user-select: text !important;
  5502. -khtml-user-select: text !important;
  5503. -moz-user-select: text !important;
  5504. -ms-user-select: text !important;
  5505. user-select: text !important;
  5506. }`;
  5507. document.body.appendChild(style);
  5508. }
  5509. function createAnswererWrapperList(aw) {
  5510. return aw.map(
  5511. (item) => el(
  5512. "details",
  5513. [
  5514. el("summary", [item.name]),
  5515. el("ul", [
  5516. el("li", ["\u540D\u5B57 ", item.name]),
  5517. el("li", { innerHTML: `\u5B98\u7F51 <a target="_blank" href=${item.homepage}>${item.homepage || "\u65E0"}</a>` }),
  5518. el("li", ["\u63A5\u53E3 ", item.url]),
  5519. el("li", ["\u8BF7\u6C42\u65B9\u6CD5 ", item.method]),
  5520. el("li", ["\u8BF7\u6C42\u7C7B\u578B ", item.type]),
  5521. el("li", ["\u8BF7\u6C42\u5934 ", JSON.stringify(item.headers, null, 4) || "\u65E0"]),
  5522. el("li", ["\u8BF7\u6C42\u4F53 ", JSON.stringify(item.data, null, 4) || "\u65E0"])
  5523. ])
  5524. ],
  5525. (details) => {
  5526. details.style.paddingLeft = "12px";
  5527. }
  5528. )
  5529. );
  5530. }
  5531. const createGuide = ({ panel: panel2, header }) => {
  5532. return el("div", { className: "user-guide card" }, [
  5533. $creator.notes(
  5534. [
  5535. "\u6253\u5F00\u4EFB\u610F\u7F51\u8BFE\u5E73\u53F0\uFF0C\u7B49\u5F85\u811A\u672C\u52A0\u8F7D\uFF0C",
  5536. "\u811A\u672C\u52A0\u8F7D\u540E\u67E5\u770B\u6BCF\u4E2A\u7F51\u8BFE\u4E0D\u540C\u7684\u4F7F\u7528\u63D0\u793A\u3002",
  5537. "\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",
  5538. [
  5539. "\u4EE5\u4E0B\u662F\u5168\u90E8\u652F\u6301\u7684\u7F51\u8BFE\u4EE5\u53CA\u5305\u542B\u7684\u811A\u672C\uFF08\u70B9\u51FB\u4E0B\u5217\u8BE6\u60C5\u5C55\u5F00\u67E5\u770B\uFF09:",
  5540. ...definedProjects().filter((p) => p.studyProject).map((project) => {
  5541. return el("details", [
  5542. el("summary", project.name),
  5543. el(
  5544. "ul",
  5545. Object.keys(project.scripts).map((key) => {
  5546. const script = project.scripts[key];
  5547. return el(
  5548. "li",
  5549. [
  5550. el("b", script.name),
  5551. $creator.notes([
  5552. el("span", ["\u64CD\u4F5C\u9762\u677F\uFF1A", script.hideInPanel ? "\u9690\u85CF" : "\u663E\u793A"]),
  5553. [
  5554. "\u8FD0\u884C\u9875\u9762\uFF1A",
  5555. el(
  5556. "ul",
  5557. script.url.map(
  5558. (i) => el("li", [
  5559. i[0],
  5560. "\uFF1A",
  5561. i[1] instanceof RegExp ? i[1].toString().replace(/\\/g, "").slice(1, -1) : el("a", { href: i[1], target: "_blank" }, i[1])
  5562. ])
  5563. )
  5564. )
  5565. ]
  5566. ])
  5567. ],
  5568. (li) => {
  5569. li.style.marginBottom = "12px";
  5570. }
  5571. );
  5572. }),
  5573. (ul) => {
  5574. ul.style.paddingLeft = "42px";
  5575. }
  5576. )
  5577. ]);
  5578. }),
  5579. el("br")
  5580. ],
  5581. [
  5582. "\u6700\u540E\u6E29\u99A8\u63D0\u793A: ",
  5583. "- \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",
  5584. "- \u4EFB\u4F55\u5176\u4ED6\u7591\u95EE\u8BF7\u524D\u5F80\u5B98\u7F51\u67E5\u770B\u4EA4\u6D41\u7FA4\uFF0C\u8FDB\u5165\u4EA4\u6D41\u7FA4\u540E\u5E26\u622A\u56FE\u8FDB\u884C\u53CD\u9988\u3002",
  5585. "- \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"
  5586. ]
  5587. ],
  5588. "ol"
  5589. )
  5590. ]);
  5591. };
  5592. function createRangeTooltip(input, defaultValue, transform) {
  5593. input.addEventListener("change", () => {
  5594. input.setAttribute("data-title", transform(input.value || input.getAttribute("value") || defaultValue));
  5595. });
  5596. input.setAttribute("data-title", transform(input.value || input.getAttribute("value") || defaultValue));
  5597. }
  5598. const volume = {
  5599. label: "\u97F3\u91CF\u8C03\u8282",
  5600. attrs: { type: "range", step: "0.05", min: "0", max: "1" },
  5601. defaultValue: 0,
  5602. onload() {
  5603. createRangeTooltip(this, "0", (val) => `${parseFloat(val) * 100}%`);
  5604. }
  5605. };
  5606. const restudy = {
  5607. label: "\u590D\u4E60\u6A21\u5F0F",
  5608. attrs: { title: "\u5DF2\u7ECF\u5B8C\u6210\u7684\u89C6\u9891\u7EE7\u7EED\u5B66\u4E60", type: "checkbox" },
  5609. defaultValue: false
  5610. };
  5611. const definition = {
  5612. label: "\u6E05\u6670\u5EA6",
  5613. tag: "select",
  5614. defaultValue: "line1bq",
  5615. onload() {
  5616. this.append(
  5617. ...$creator.selectOptions(this.getAttribute("value"), [
  5618. ["line1bq", "\u6D41\u7545"],
  5619. ["line1gq", "\u9AD8\u6E05"]
  5620. ])
  5621. );
  5622. }
  5623. };
  5624. const auto = {
  5625. label: "\u5F00\u542F\u81EA\u52A8\u7B54\u9898",
  5626. attrs: { type: "checkbox" },
  5627. defaultValue: false
  5628. };
  5629. const workConfigs = {
  5630. notes: {
  5631. defaultValue: $creator.notes([
  5632. "\u81EA\u52A8\u7B54\u9898\u524D\u8BF7\u5728 \u201C\u901A\u7528-\u5168\u5C40\u8BBE\u7F6E\u201D \u4E2D\u8BBE\u7F6E\u9898\u5E93\u914D\u7F6E\u3002",
  5633. "\u53EF\u4EE5\u642D\u914D \u201C\u901A\u7528-\u5728\u7EBF\u641C\u9898\u201D \u4E00\u8D77\u4F7F\u7528\u3002"
  5634. ]).outerHTML
  5635. },
  5636. auto: {
  5637. label: "\u5F00\u542F\u81EA\u52A8\u7B54\u9898",
  5638. attrs: { type: "checkbox" },
  5639. defaultValue: true
  5640. },
  5641. upload: {
  5642. label: "\u7B54\u9898\u5B8C\u6210\u540E",
  5643. tag: "select",
  5644. defaultValue: "save",
  5645. attrs: { title: "\u7B54\u9898\u5B8C\u6210\u540E\u7684\u8BBE\u7F6E, \u9F20\u6807\u60AC\u6D6E\u5728\u9009\u9879\u4E0A\u53EF\u4EE5\u67E5\u770B\u6BCF\u4E2A\u9009\u9879\u7684\u5177\u4F53\u89E3\u91CA\u3002" },
  5646. onload() {
  5647. this.append(
  5648. ...$creator.selectOptions(this.getAttribute("value"), [
  5649. ["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"],
  5650. ["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"],
  5651. ...[10, 20, 30, 40, 50, 60, 70, 80, 90].map((rate) => [
  5652. rate.toString(),
  5653. `\u641C\u5230${rate}%\u7684\u9898\u76EE\u5219\u81EA\u52A8\u63D0\u4EA4`,
  5654. `\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`
  5655. ]),
  5656. ["100", "\u6BCF\u4E2A\u9898\u76EE\u90FD\u67E5\u5230\u7B54\u6848\u624D\u81EA\u52A8\u63D0\u4EA4", "\u7B54\u6848\u4E0D\u4E00\u5B9A\u6B63\u786E"],
  5657. ["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"]
  5658. ])
  5659. );
  5660. }
  5661. }
  5662. };
  5663. function createWorkerControl(script, getWorker) {
  5664. var _a;
  5665. const worker = getWorker();
  5666. let stop2 = true;
  5667. const startBtn = $creator.button("\u25B6\uFE0F\u5F00\u59CB\u7B54\u9898");
  5668. const restartBtn = $creator.button("\u21A9\uFE0F\u91CD\u65B0\u7B54\u9898");
  5669. const controlBtn = $creator.button("\u23F8\uFE0F\u6682\u505C\u7B54\u9898");
  5670. const stopMessage = $message("warn", { duration: 10, content: "\u6682\u505C\u4E2D..." });
  5671. stopMessage.style.display = "none";
  5672. startBtn.onclick = () => {
  5673. var _a2;
  5674. startBtn.remove();
  5675. (_a2 = script.panel) == null ? void 0 : _a2.body.replaceChildren(el("hr"), restartBtn, controlBtn);
  5676. script.event.emit("start");
  5677. };
  5678. restartBtn.onclick = () => script.event.emit("restart");
  5679. controlBtn.onclick = () => {
  5680. var _a2;
  5681. stop2 = !stop2;
  5682. const worker2 = getWorker();
  5683. (_a2 = worker2 == null ? void 0 : worker2.emit) == null ? void 0 : _a2.call(worker2, stop2 ? "continuate" : "stop");
  5684. controlBtn.value = stop2 ? "\u23F8\uFE0F\u6682\u505C\u7B54\u9898" : "\u25B6\uFE0F\u7EE7\u7EED\u7B54\u9898";
  5685. stopMessage.style.display = stop2 ? "none" : "display";
  5686. };
  5687. script.event.on("done", () => controlBtn.disabled = true);
  5688. if (script.panel) {
  5689. script.panel.body.style.textAlign = "right";
  5690. }
  5691. (_a = script.panel) == null ? void 0 : _a.body.replaceChildren(el("hr"), ...(worker == null ? void 0 : worker.isRunning) ? [restartBtn, controlBtn] : [startBtn]);
  5692. }
  5693. function optimizationTextWithImage(root2) {
  5694. if (root2) {
  5695. const el2 = root2.cloneNode(true);
  5696. for (const img of Array.from(el2.querySelectorAll("img"))) {
  5697. img.after(img.src);
  5698. }
  5699. return el2.innerText;
  5700. } else {
  5701. return "";
  5702. }
  5703. }
  5704. let stop = false;
  5705. const hasCapture = false;
  5706. const ZHSProject = Project.create({
  5707. name: "\u667A\u6167\u6811",
  5708. level: 99,
  5709. domains: ["zhihuishu.com"],
  5710. studyProject: true,
  5711. scripts: {
  5712. guide: new Script({
  5713. name: "\u4F7F\u7528\u63D0\u793A",
  5714. url: [
  5715. ["\u5B66\u4E60\u9996\u9875", "https://onlineweb.zhihuishu.com/onlinestuh5"],
  5716. ["\u9996\u9875", "https://www.zhihuishu.com/"]
  5717. ],
  5718. level: 1,
  5719. namespace: "zhs.guide",
  5720. configs: {
  5721. notes: {
  5722. defaultValue: $creator.notes([
  5723. "\u8BF7\u624B\u52A8\u8FDB\u5165\u89C6\u9891\u3001\u4F5C\u4E1A\u3001\u8003\u8BD5\u9875\u9762\uFF0C\u811A\u672C\u4F1A\u81EA\u52A8\u8FD0\u884C\u3002",
  5724. "\u5174\u8DA3\u8BFE\u4F1A\u81EA\u52A8\u4E0B\u4E00\u4E2A\uFF0C\u6240\u4EE5\u4E0D\u63D0\u4F9B\u811A\u672C\u3002",
  5725. "\u6821\u5185\u5B66\u5206\u8BFE\u7684\u8003\u8BD5\u811A\u672C\u8FD8\u672A\u63D0\u4F9B\uFF0C\u8BF7\u624B\u52A8(\u5212\u8BCD)\u641C\u9898\u3002"
  5726. ]).outerHTML
  5727. }
  5728. },
  5729. oncomplete() {
  5730. $script.pin(this);
  5731. }
  5732. }),
  5733. "gxk-study": new Script({
  5734. name: "\u5171\u4EAB\u8BFE\u5B66\u4E60\u811A\u672C",
  5735. url: [["\u5171\u4EAB\u8BFE\u5B66\u4E60\u9875\u9762", "studyvideoh5.zhihuishu.com"]],
  5736. level: 999,
  5737. namespace: "zhs.gxk.study",
  5738. configs: {
  5739. notes: {
  5740. defaultValue: $creator.notes([
  5741. "\u7AE0\u8282\u6D4B\u8BD5\u8BF7\u5927\u5BB6\u89C2\u770B\u5B8C\u89C6\u9891\u540E\u624B\u52A8\u6253\u5F00\u3002",
  5742. [
  5743. "\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",
  5744. "\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",
  5745. "\u6BCF\u5929\u5B9A\u65F6\u534A\u5C0F\u65F6\u53EF\u83B7\u5F97\u4E00\u5206\u4E60\u60EF\u5206\u3002",
  5746. "\u5982\u679C\u4E0D\u60F3\u8981\u4E60\u60EF\u5206\u53EF\u5FFD\u7565\u3002"
  5747. ]
  5748. ]).outerHTML
  5749. },
  5750. studyRecord: {
  5751. defaultValue: []
  5752. },
  5753. stopTime: {
  5754. label: "\u5B9A\u65F6\u505C\u6B62",
  5755. tag: "select",
  5756. attrs: { title: "\u5230\u65F6\u95F4\u540E\u81EA\u52A8\u6682\u505C\u811A\u672C" },
  5757. defaultValue: "0",
  5758. onload() {
  5759. this.append(
  5760. ...$creator.selectOptions(this.getAttribute("value"), [
  5761. [0, "\u5173\u95ED"],
  5762. [0.5, "\u534A\u5C0F\u65F6\u540E"],
  5763. [1, "\u4E00\u5C0F\u65F6\u540E"],
  5764. [2, "\u4E24\u5C0F\u65F6\u540E"]
  5765. ])
  5766. );
  5767. }
  5768. },
  5769. restudy,
  5770. volume,
  5771. definition,
  5772. playbackRate: {
  5773. label: "\u89C6\u9891\u500D\u901F",
  5774. tag: "select",
  5775. defaultValue: 1,
  5776. onload() {
  5777. this.append(
  5778. ...$creator.selectOptions(
  5779. this.getAttribute("value"),
  5780. [1, 1.25, 1.5].map((rate) => [rate, rate + "x"])
  5781. )
  5782. );
  5783. }
  5784. }
  5785. },
  5786. onrender({ panel: panel2 }) {
  5787. panel2.body.append(
  5788. el("hr"),
  5789. $creator.button("\u23F0\u68C0\u6D4B\u662F\u5426\u9700\u8981\u89C4\u5F8B\u5B66\u4E60", {}, (btn) => {
  5790. btn.style.marginRight = "12px";
  5791. btn.onclick = () => {
  5792. $el(".iconbaizhoumoshi-xueqianbidu").click();
  5793. setTimeout(() => {
  5794. var _a;
  5795. const num = parseInt(
  5796. ((_a = $el(".preschool-Mustread-div").innerText.match(/学习习惯成绩((\d+)分)/)) == null ? void 0 : _a[1]) || "0"
  5797. );
  5798. $model("alert", {
  5799. 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")
  5800. });
  5801. }, 100);
  5802. };
  5803. }),
  5804. $creator.button("\u{1F4D8}\u67E5\u770B\u5B66\u4E60\u8BB0\u5F55", {}, (btn) => {
  5805. btn.onclick = () => {
  5806. $model("alert", {
  5807. title: "\u5B66\u4E60\u8BB0\u5F55",
  5808. content: $creator.notes(
  5809. this.cfg.studyRecord.map((r) => {
  5810. const date = new Date(r.date);
  5811. return [
  5812. `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, "0")}-${date.getDate().toString().padStart(2, "0")}`,
  5813. $creator.notes(r.courses.map((course) => `${course.name} - ${optimizeSecond(course.time)}`))
  5814. ];
  5815. })
  5816. )
  5817. });
  5818. };
  5819. })
  5820. );
  5821. },
  5822. onactive() {
  5823. this.cfg.stopTime = "0";
  5824. const records = this.cfg.studyRecord;
  5825. const record = records.find(
  5826. (record2) => new Date(record2.date).toLocaleDateString() === new Date().toLocaleDateString()
  5827. );
  5828. if (!record) {
  5829. records.push({ date: Date.now(), courses: [] });
  5830. this.cfg.studyRecord = records;
  5831. }
  5832. },
  5833. oncomplete() {
  5834. var _a;
  5835. $script.pin(this);
  5836. const vue = (_a = $el(".video-study")) == null ? void 0 : _a.__vue__;
  5837. let stopInterval = 0;
  5838. let stopMessage;
  5839. this.onConfigChange("stopTime", () => {
  5840. var _a2;
  5841. clearInterval(stopInterval);
  5842. stopMessage == null ? void 0 : stopMessage.remove();
  5843. if (this.cfg.stopTime === "0") {
  5844. $message("info", { content: "\u5B9A\u65F6\u505C\u6B62\u5DF2\u5173\u95ED" });
  5845. } else {
  5846. let stopCount = parseFloat(this.cfg.stopTime) * 60 * 60;
  5847. stopInterval = setInterval(() => {
  5848. if (stopCount > 0 && hasCapture === false) {
  5849. stopCount--;
  5850. } else {
  5851. clearInterval(stopInterval);
  5852. stop = true;
  5853. $el("video").pause();
  5854. $model("alert", { content: "\u811A\u672C\u6682\u505C\uFF0C\u5DF2\u83B7\u5F97\u4ECA\u65E5\u5E73\u65F6\u5206\uFF0C\u5982\u9700\u7EE7\u7EED\u89C2\u770B\uFF0C\u8BF7\u5237\u65B0\u9875\u9762\u3002" });
  5855. }
  5856. }, 1e3);
  5857. const val = (_a2 = [
  5858. [0.5, "\u534A\u5C0F\u65F6\u540E"],
  5859. [1, "\u4E00\u5C0F\u65F6\u540E"],
  5860. [2, "\u4E24\u5C0F\u65F6\u540E"]
  5861. ].find((t) => t[0].toString() === this.cfg.stopTime)) == null ? void 0 : _a2[0];
  5862. const date = new Date();
  5863. date.setMinutes(date.getMinutes() + val * 60);
  5864. stopMessage = $message("info", {
  5865. duration: 0,
  5866. content: `\u5728 ${date.toLocaleTimeString()} \u811A\u672C\u5C06\u81EA\u52A8\u6682\u505C`
  5867. });
  5868. }
  5869. });
  5870. this.onConfigChange("volume", (curr) => {
  5871. $el("video").volume = curr;
  5872. });
  5873. this.onConfigChange("playbackRate", (curr) => {
  5874. switchPlaybackRate(parseFloat(curr.toString()));
  5875. });
  5876. this.onConfigChange("definition", (curr) => {
  5877. switchLine(curr);
  5878. });
  5879. const hideDialog = () => {
  5880. $$el(".el-dialog__wrapper").forEach((dialog) => {
  5881. dialog.remove();
  5882. });
  5883. };
  5884. const closeTestDialog = async () => {
  5885. const items = $$el(".topic-item");
  5886. if (items.length !== 0) {
  5887. items[0].click();
  5888. await $.sleep(1e3);
  5889. vue.testDialog = false;
  5890. }
  5891. };
  5892. const finish = () => {
  5893. $model("alert", {
  5894. 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"
  5895. });
  5896. };
  5897. const fixProcessBar = () => {
  5898. const bar = $el(".controlsBar");
  5899. bar.style.display = "block";
  5900. };
  5901. let timeMessage;
  5902. const calculateTime = () => {
  5903. var _a2, _b;
  5904. try {
  5905. const vue2 = (_a2 = $el(".video-study")) == null ? void 0 : _a2.__vue__;
  5906. const videos = vue2.videoList.map((v) => v.videoLessons).flat().map((l) => (l == null ? void 0 : l.videoSmallLessons) || l).flat().filter((v) => v.isStudiedLesson === 0);
  5907. const allTime = videos.map((l) => l.videoSec || 0).reduce((pre, curr) => pre + curr, 0);
  5908. if (timeMessage) {
  5909. timeMessage.remove();
  5910. }
  5911. const record = this.cfg.studyRecord.find(
  5912. (r) => new Date(r.date).toLocaleDateString() === new Date().toLocaleDateString()
  5913. );
  5914. timeMessage = $message("info", {
  5915. duration: 0,
  5916. content: `\u8FD8\u5269${videos.length - 1}\u4E2A\u89C6\u9891\uFF0C\u603B\u65F6\u957F${(allTime / (60 * 60)).toFixed(
  5917. 2
  5918. )}\u5C0F\u65F6\uFF0C\u4ECA\u65E5\u5DF2\u5B66\u4E60${optimizeSecond(
  5919. ((_b = record == null ? void 0 : record.courses.find((c) => c.name === vue2.data.courseInfo.name)) == null ? void 0 : _b.time) || 0
  5920. )}`
  5921. });
  5922. } catch {
  5923. }
  5924. };
  5925. const interval = setInterval(async () => {
  5926. if (vue.videoList.length) {
  5927. clearInterval(interval);
  5928. hack();
  5929. hideDialog();
  5930. setInterval(() => {
  5931. closeTestDialog();
  5932. fixProcessBar();
  5933. $$el(".v-modal,.mask").forEach((modal) => {
  5934. modal.remove();
  5935. });
  5936. if (!stop) {
  5937. const records = this.cfg.studyRecord;
  5938. const record = records.find(
  5939. (r) => new Date(r.date).toLocaleDateString() === new Date().toLocaleDateString()
  5940. );
  5941. if (record) {
  5942. record.courses = (record == null ? void 0 : record.courses) || [];
  5943. const course = record == null ? void 0 : record.courses.find((c) => c.name === vue.data.courseInfo.name);
  5944. if (course) {
  5945. course.time = course.time + 3;
  5946. } else {
  5947. record.courses.push({ name: vue.data.courseInfo.name, time: 0 });
  5948. }
  5949. this.cfg.studyRecord = records;
  5950. }
  5951. }
  5952. }, 3e3);
  5953. let list = $$el("li.clearfix.video");
  5954. if (!this.cfg.restudy) {
  5955. list = list.filter((el2) => el2.querySelector(".time_icofinish") === null);
  5956. }
  5957. if (list.length === 0) {
  5958. finish();
  5959. } else {
  5960. $message("info", { content: "3\u79D2\u540E\u5F00\u59CB\u5B66\u4E60", duration: 3 });
  5961. const study2 = async () => {
  5962. if (stop === false) {
  5963. const item = list.shift();
  5964. if (item) {
  5965. await $.sleep(3e3);
  5966. item.click();
  5967. await $.sleep(5e3);
  5968. watch(
  5969. { volume: this.cfg.volume, playbackRate: this.cfg.playbackRate, definition: this.cfg.definition },
  5970. study2
  5971. );
  5972. calculateTime();
  5973. } else {
  5974. finish();
  5975. }
  5976. } else {
  5977. $message("warn", {
  5978. 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"
  5979. });
  5980. }
  5981. };
  5982. study2();
  5983. }
  5984. }
  5985. }, 1e3);
  5986. setTimeout(() => {
  5987. if (vue.videoList.length === 0) {
  5988. finish();
  5989. clearInterval(interval);
  5990. }
  5991. }, 10 * 1e3);
  5992. }
  5993. }),
  5994. "xnk-study": new Script({
  5995. name: "\u6821\u5185\u8BFE\u5B66\u4E60\u811A\u672C",
  5996. url: [["\u6821\u5185\u8BFE\u5B66\u4E60\u9875\u9762", "zhihuishu.com/aidedteaching/sourceLearning"]],
  5997. namespace: "zhs.xnk.study",
  5998. configs: {
  5999. notes: {
  6000. 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
  6001. },
  6002. restudy,
  6003. volume
  6004. },
  6005. oncomplete() {
  6006. $script.pin(this);
  6007. const finish = () => {
  6008. $model("alert", {
  6009. 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"
  6010. });
  6011. };
  6012. this.onConfigChange("volume", (curr) => {
  6013. $el("video").volume = curr;
  6014. });
  6015. let list = [];
  6016. const interval = setInterval(async () => {
  6017. list = $$el(".icon-video").map((icon) => icon.parentElement);
  6018. if (list.length) {
  6019. clearInterval(interval);
  6020. if (!this.cfg.restudy) {
  6021. list = list.filter((el2) => el2.querySelector(".icon-finish") === null);
  6022. }
  6023. const item = list[0];
  6024. if (item) {
  6025. if (item.classList.contains("active")) {
  6026. watch({ volume: this.cfg.volume, playbackRate: 1 }, () => {
  6027. if (list[1])
  6028. list[1].click();
  6029. });
  6030. } else {
  6031. item.click();
  6032. }
  6033. }
  6034. }
  6035. }, 1e3);
  6036. setTimeout(() => {
  6037. if (list.length === 0) {
  6038. finish();
  6039. clearInterval(interval);
  6040. }
  6041. }, 10 * 1e3);
  6042. }
  6043. }),
  6044. "gxk-work-and-exam-guide": new Script({
  6045. name: "\u5171\u4EAB\u8BFE\u4F5C\u4E1A\u8003\u8BD5\u63D0\u793A",
  6046. url: [["\u5171\u4EAB\u8BFE\u4F5C\u4E1A\u8003\u8BD5\u5217\u8868\u9875\u9762", "zhihuishu.com/stuExamWeb.html#/webExamList\\?"]],
  6047. namespace: "zhs.work.gxk-guide",
  6048. level: 999,
  6049. configs: {
  6050. notes: {
  6051. defaultValue: $creator.notes(
  6052. [
  6053. [
  6054. el("b", "\u5728\u8FDB\u884C\u4F5C\u4E1A\u6216\u8005\u8003\u8BD5\u4E4B\u524D\uFF0C\u8BF7\u5728\u201D\u901A\u7528-\u5168\u5C40\u8BBE\u7F6E\u201C\u4E2D\u8BBE\u7F6E\u597D\u9898\u5E93\u914D\u7F6E"),
  6055. el("b", "\u5E76\u5728\u4F5C\u4E1A\u548C\u8003\u8BD5\u811A\u672C\u4E2D\u5F00\u542F\u81EA\u52A8\u7B54\u9898\u9009\u9879\uFF0C\u5426\u5219\u5C06\u65E0\u6CD5\u6B63\u5E38\u7B54\u9898\u3002")
  6056. ],
  6057. "\u8003\u8BD5\u81EA\u52A8\u7B54\u9898\u5728\u8BBE\u7F6E\u4E2D\u5F00\u542F\uFF0C\u5E76\u70B9\u51FB\u8FDB\u5165\u5373\u53EF\u4F7F\u7528",
  6058. "\u8FDB\u5165\u8003\u8BD5\u9875\u9762\u540E\u9700\u8981\u5237\u65B0\u4E00\u4E0B\u3002",
  6059. "\u8003\u8BD5\u529F\u80FD\u56E0\u4E3A\u88AB\u9891\u7E41\u9488\u5BF9\u6240\u4EE5\u4E0D\u7A33\u5B9A, \u5927\u5BB6\u9884\u7559\u597D\u5176\u4ED6\u641C\u9898\u65B9\u5F0F\u3002"
  6060. ],
  6061. "ol"
  6062. ).outerHTML
  6063. }
  6064. },
  6065. oncomplete() {
  6066. $script.pin(this);
  6067. }
  6068. }),
  6069. "gxk-work": new Script({
  6070. name: "\u5171\u4EAB\u8BFE\u4F5C\u4E1A\u811A\u672C",
  6071. url: [
  6072. ["\u5171\u4EAB\u8BFE\u4F5C\u4E1A\u9875\u9762", "zhihuishu.com/stuExamWeb.html#/webExamList/dohomework"],
  6073. ["\u5171\u4EAB\u8BFE\u4F5C\u4E1A\u8003\u8BD5\u5217\u8868\u9875\u9762", "zhihuishu.com/stuExamWeb.html#/webExamList\\?"]
  6074. ],
  6075. namespace: "zhs.gxk.work",
  6076. level: 99,
  6077. configs: workConfigs,
  6078. oncomplete() {
  6079. $script.pin(this);
  6080. const changeMsg = () => $message("info", { content: "\u68C0\u6D4B\u5230\u8BBE\u7F6E\u66F4\u6539\uFF0C\u8BF7\u91CD\u65B0\u8FDB\u5165\uFF0C\u6216\u8005\u5237\u65B0\u4F5C\u4E1A\u9875\u9762\u8FDB\u884C\u7B54\u9898\u3002" });
  6081. this.onConfigChange("upload", changeMsg);
  6082. this.onConfigChange("auto", changeMsg);
  6083. let worker;
  6084. let warn;
  6085. this.on("render", () => createWorkerControl(this, () => worker));
  6086. this.event.on("start", () => start2());
  6087. this.event.on("restart", () => {
  6088. worker == null ? void 0 : worker.emit("close");
  6089. $message("info", { content: "3\u79D2\u540E\u91CD\u65B0\u7B54\u9898\u3002" });
  6090. setTimeout(start2, 3e3);
  6091. });
  6092. const start2 = () => {
  6093. warn == null ? void 0 : warn.remove();
  6094. recognize();
  6095. $creator.workPreCheckMessage({
  6096. onrun: (opts) => {
  6097. worker = gxkWorkOrExam("work", opts);
  6098. },
  6099. ondone: () => this.event.emit("done"),
  6100. upload: this.cfg.upload,
  6101. ...CommonProject.scripts.settings.cfg
  6102. });
  6103. };
  6104. if (/zhihuishu.com\/stuExamWeb.html#\/webExamList\/dohomework/.test(location.href)) {
  6105. createWorkerControl(this, () => worker);
  6106. if (this.cfg.auto === false) {
  6107. this.event.emit("done");
  6108. warn = $message("warn", {
  6109. duration: 0,
  6110. content: "\u81EA\u52A8\u7B54\u9898\u5DF2\u88AB\u5173\u95ED\uFF01\u8BF7\u624B\u52A8\u70B9\u51FB\u5F00\u59CB\u7B54\u9898\uFF0C\u6216\u8005\u5FFD\u7565\u6B64\u8B66\u544A"
  6111. });
  6112. } else {
  6113. const interval = setInterval(() => {
  6114. var _a;
  6115. const vue = (_a = $el("#app > div")) == null ? void 0 : _a.__vue__;
  6116. if (vue == null ? void 0 : vue.alllQuestionTest) {
  6117. clearInterval(interval);
  6118. start2();
  6119. }
  6120. }, 1e3);
  6121. }
  6122. }
  6123. }
  6124. }),
  6125. "gxk-exam": new Script({
  6126. name: "\u5171\u4EAB\u8BFE\u8003\u8BD5\u811A\u672C",
  6127. url: [
  6128. ["\u5171\u4EAB\u8BFE\u8003\u8BD5\u9875\u9762", "zhihuishu.com/stuExamWeb.html#/webExamList/doexamination"],
  6129. ["\u5171\u4EAB\u8BFE\u4F5C\u4E1A\u8003\u8BD5\u5217\u8868\u9875\u9762", "zhihuishu.com/stuExamWeb.html#/webExamList\\?"]
  6130. ],
  6131. namespace: "zhs.gxk.exam",
  6132. level: 99,
  6133. configs: {
  6134. notes: {
  6135. defaultValue: $creator.notes([
  6136. "\u7B54\u9898\u524D\u8BF7\u5728 \u201C\u901A\u7528-\u5168\u5C40\u8BBE\u7F6E\u201D \u4E2D\u8BBE\u7F6E\u9898\u5E93\u914D\u7F6E\uFF0C\u624D\u80FD\u5F00\u59CB\u81EA\u52A8\u7B54\u9898\u3002",
  6137. "\u53EF\u4EE5\u642D\u914D \u201C\u901A\u7528-\u5728\u7EBF\u641C\u9898\u201D \u4E00\u8D77\u4F7F\u7528\u3002",
  6138. "\u8003\u8BD5\u8BF7\u5728\u811A\u672C\u81EA\u52A8\u7B54\u9898\u5B8C\u6210\u540E\u81EA\u884C\u68C0\u67E5\uFF0C\u81EA\u5DF1\u70B9\u51FB\u63D0\u4EA4\uFF0C\u811A\u672C\u4E0D\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002",
  6139. "\u5982\u679C\u5F00\u542F\u540E\u811A\u672C\u4ECD\u7136\u6CA1\u6709\u53CD\u5E94\uFF0C\u8BF7\u5237\u65B0\u9875\u9762\u91CD\u8BD5\u3002"
  6140. ]).outerHTML
  6141. },
  6142. auto: {
  6143. label: "\u5F00\u542F\u81EA\u52A8\u7B54\u9898",
  6144. attrs: { type: "checkbox" },
  6145. defaultValue: false
  6146. }
  6147. },
  6148. async oncomplete() {
  6149. $script.pin(this);
  6150. const changeMsg = () => $message("info", { content: "\u68C0\u6D4B\u5230\u8BBE\u7F6E\u66F4\u6539\uFF0C\u8BF7\u91CD\u65B0\u8FDB\u5165\uFF0C\u6216\u8005\u5237\u65B0\u4F5C\u4E1A\u9875\u9762\u8FDB\u884C\u7B54\u9898\u3002" });
  6151. this.onConfigChange("auto", changeMsg);
  6152. let worker;
  6153. this.on("render", () => createWorkerControl(this, () => worker));
  6154. this.event.on("start", () => start2());
  6155. this.event.on("restart", () => {
  6156. worker == null ? void 0 : worker.emit("close");
  6157. $message("info", { content: "3\u79D2\u540E\u91CD\u65B0\u7B54\u9898\u3002" });
  6158. setTimeout(start2, 3e3);
  6159. });
  6160. const start2 = () => {
  6161. $creator.workPreCheckMessage({
  6162. onrun: (opts) => {
  6163. worker = gxkWorkOrExam("exam", opts);
  6164. },
  6165. ondone: () => {
  6166. this.event.emit("done");
  6167. },
  6168. upload: "nomove",
  6169. ...CommonProject.scripts.settings.cfg
  6170. });
  6171. };
  6172. if (/zhihuishu.com\/stuExamWeb.html#\/webExamList\/doexamination/.test(location.href)) {
  6173. createWorkerControl(this, () => worker);
  6174. if (this.cfg.auto) {
  6175. await waitForQuestionsLoad();
  6176. recognize();
  6177. start2();
  6178. } else {
  6179. this.event.emit("done");
  6180. $message("warn", {
  6181. duration: 0,
  6182. content: "\u81EA\u52A8\u7B54\u9898\u5DF2\u88AB\u5173\u95ED\uFF01\u8BF7\u624B\u52A8\u70B9\u51FB\u5F00\u59CB\u7B54\u9898\uFF0C\u6216\u8005\u5FFD\u7565\u6B64\u8B66\u544A"
  6183. });
  6184. }
  6185. }
  6186. }
  6187. }),
  6188. "xnk-work": new Script({
  6189. name: "\u6821\u5185\u8BFE\u4F5C\u4E1A\u8003\u8BD5\u811A\u672C",
  6190. url: [["\u6821\u5185\u8BFE\u8003\u8BD5\u9875\u9762", "zhihuishu.com/atHomeworkExam/stu/homeworkQ/exerciseList"]],
  6191. namespace: "zhs.xnk.work",
  6192. level: 99,
  6193. configs: workConfigs,
  6194. oncomplete() {
  6195. $script.pin(this);
  6196. const changeMsg = () => $message("info", { content: "\u68C0\u6D4B\u5230\u8BBE\u7F6E\u66F4\u6539\uFF0C\u8BF7\u91CD\u65B0\u8FDB\u5165\uFF0C\u6216\u8005\u5237\u65B0\u4F5C\u4E1A\u9875\u9762\u8FDB\u884C\u7B54\u9898\u3002" });
  6197. this.onConfigChange("upload", changeMsg);
  6198. this.onConfigChange("auto", changeMsg);
  6199. let worker;
  6200. createWorkerControl(this, () => worker);
  6201. this.on("render", () => createWorkerControl(this, () => worker));
  6202. this.on("start", () => start2());
  6203. this.event.on("restart", () => {
  6204. worker == null ? void 0 : worker.emit("close");
  6205. $message("info", { content: "3\u79D2\u540E\u91CD\u65B0\u7B54\u9898\u3002" });
  6206. setTimeout(start2, 3e3);
  6207. });
  6208. if (this.cfg.auto === false) {
  6209. return $message("warn", {
  6210. duration: 0,
  6211. content: "\u81EA\u52A8\u7B54\u9898\u5DF2\u88AB\u5173\u95ED\uFF01\u8BF7\u624B\u52A8\u70B9\u51FB\u5F00\u59CB\u7B54\u9898\uFF0C\u6216\u8005\u5FFD\u7565\u6B64\u8B66\u544A"
  6212. });
  6213. }
  6214. const start2 = () => {
  6215. $creator.workPreCheckMessage({
  6216. onrun: (opts) => {
  6217. worker = xnkWork(opts);
  6218. },
  6219. ondone: () => {
  6220. this.event.emit("done");
  6221. },
  6222. upload: this.cfg.upload,
  6223. ...CommonProject.scripts.settings.cfg
  6224. });
  6225. };
  6226. }
  6227. })
  6228. }
  6229. });
  6230. async function watch(options, onended) {
  6231. let video = $el("video");
  6232. const set = async () => {
  6233. switchLine(options.definition);
  6234. await $.sleep(1e3);
  6235. switchPlaybackRate(options.playbackRate);
  6236. await $.sleep(500);
  6237. video = $el("video");
  6238. video.currentTime = 1;
  6239. await $.sleep(500);
  6240. video.volume = options.volume;
  6241. await $.sleep(500);
  6242. };
  6243. await set();
  6244. video.play().catch(() => {
  6245. $model("alert", {
  6246. content: "\u7531\u4E8E\u6D4F\u89C8\u5668\u4FDD\u62A4\u9650\u5236\uFF0C\u5982\u679C\u8981\u64AD\u653E\u5E26\u6709\u97F3\u91CF\u7684\u89C6\u9891\uFF0C\u60A8\u5FC5\u987B\u5148\u70B9\u51FB\u9875\u9762\u4E0A\u7684\u4EFB\u610F\u4F4D\u7F6E\u624D\u80FD\u8FDB\u884C\u89C6\u9891\u7684\u64AD\u653E\u3002",
  6247. onClose: async () => {
  6248. video.play();
  6249. }
  6250. });
  6251. });
  6252. video.onpause = async () => {
  6253. if (!video.ended && stop === false) {
  6254. await waitForCaptcha();
  6255. await $.sleep(1e3);
  6256. video.play();
  6257. }
  6258. };
  6259. video.onended = onended;
  6260. }
  6261. function switchLine(definition2 = "line1bq") {
  6262. var _a;
  6263. (_a = $el(`.definiLines .${definition2}`)) == null ? void 0 : _a.click();
  6264. }
  6265. function switchPlaybackRate(playbackRate) {
  6266. var _a;
  6267. (_a = $el(`.speedList [rate="${playbackRate === 1 ? "1.0" : playbackRate}"]`)) == null ? void 0 : _a.click();
  6268. }
  6269. function checkForCaptcha(update) {
  6270. let modal;
  6271. return setInterval(() => {
  6272. if ($el(".yidun_popup")) {
  6273. update(true);
  6274. if (modal === void 0) {
  6275. modal = $model("alert", { content: "\u5F53\u524D\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\uFF0C\u8BF7\u8F93\u5165\u540E\u65B9\u53EF\u7EE7\u7EED\u8FD0\u884C\u3002" });
  6276. }
  6277. } else {
  6278. if (modal) {
  6279. update(false);
  6280. modal.remove();
  6281. modal = void 0;
  6282. }
  6283. }
  6284. }, 1e3);
  6285. }
  6286. function waitForCaptcha() {
  6287. const popup = document.querySelector(".yidun_popup");
  6288. if (popup) {
  6289. $message("warn", { content: "\u5F53\u524D\u68C0\u6D4B\u5230\u9A8C\u8BC1\u7801\uFF0C\u8BF7\u8F93\u5165\u540E\u65B9\u53EF\u7EE7\u7EED\u8FD0\u884C\u3002" });
  6290. return new Promise((resolve, reject) => {
  6291. const interval = setInterval(() => {
  6292. const popup2 = document.querySelector(".yidun_popup");
  6293. if (popup2 === null) {
  6294. clearInterval(interval);
  6295. resolve();
  6296. }
  6297. }, 1e3);
  6298. });
  6299. }
  6300. }
  6301. function waitForQuestionsLoad() {
  6302. return new Promise((resolve) => {
  6303. const interval = setInterval(() => {
  6304. var _a;
  6305. const vue = (_a = $el("#app > div")) == null ? void 0 : _a.__vue__;
  6306. if (vue == null ? void 0 : vue.alllQuestionTest) {
  6307. clearInterval(interval);
  6308. resolve();
  6309. }
  6310. }, 1e3);
  6311. });
  6312. }
  6313. function hack() {
  6314. var _a;
  6315. const vue = (_a = $el(".video-study")) == null ? void 0 : _a.__vue__;
  6316. const empty = () => {
  6317. };
  6318. vue.checkout = empty;
  6319. vue.notTrustScript = empty;
  6320. vue.checkoutNotTrustScript = empty;
  6321. const _videoClick = vue.videoClick;
  6322. vue.videoClick = function(...args) {
  6323. const e = new PointerEvent("click");
  6324. const event = /* @__PURE__ */ Object.create({ isTrusted: true });
  6325. Object.setPrototypeOf(event, e);
  6326. args[args.length - 1] = event;
  6327. return _videoClick.apply(vue, args);
  6328. };
  6329. vue.videoClick = function(...args) {
  6330. args[args.length - 1] = { isTrusted: true };
  6331. return _videoClick.apply(vue, args);
  6332. };
  6333. }
  6334. function recognize() {
  6335. for (const div of $$el(".subject_describe > div")) {
  6336. div.__vue__.$el.innerHTML = div.__vue__._data.shadowDom.textContent;
  6337. }
  6338. }
  6339. function gxkWorkOrExam(type = "work", { answererWrappers, period, timeout, retry, upload, thread }) {
  6340. $message("info", { content: `\u5F00\u59CB${type === "work" ? "\u4F5C\u4E1A" : "\u8003\u8BD5"}` });
  6341. $store.setTab("common.work-results.results", []);
  6342. $script.pin(CommonProject.scripts.workResults);
  6343. const worker = new OCSWorker({
  6344. root: ".examPaper_subject",
  6345. elements: {
  6346. title: ".subject_describe,.smallStem_describe",
  6347. options: ".subject_node .nodeLab"
  6348. },
  6349. requestPeriod: period != null ? period : 3,
  6350. resolvePeriod: 1,
  6351. timeout: timeout != null ? timeout : 30,
  6352. retry: retry != null ? retry : 2,
  6353. thread: thread != null ? thread : 1,
  6354. answerer: (elements, type2, ctx) => defaultAnswerWrapperHandler(answererWrappers, {
  6355. type: type2,
  6356. title: elements.title.filter((t) => t.innerText).map((t) => optimizationTextWithImage(t)).join(","),
  6357. root: ctx.root
  6358. }),
  6359. work: {
  6360. handler(type2, answer, option) {
  6361. var _a;
  6362. if (type2 === "judgement" || type2 === "single" || type2 === "multiple") {
  6363. if (!((_a = option.querySelector("input")) == null ? void 0 : _a.checked)) {
  6364. option.click();
  6365. }
  6366. } else if (type2 === "completion" && answer.trim()) {
  6367. const text = option.querySelector("textarea");
  6368. if (text) {
  6369. text.value = answer;
  6370. }
  6371. }
  6372. }
  6373. },
  6374. onResultsUpdate(res) {
  6375. $store.setTab("common.work-results.results", $.simplifyWorkResult(res));
  6376. },
  6377. onResolveUpdate(res) {
  6378. CommonProject.scripts.workResults.cfg.totalQuestionCount = worker.totalQuestionCount;
  6379. CommonProject.scripts.workResults.cfg.requestIndex = worker.requestIndex;
  6380. CommonProject.scripts.workResults.cfg.resolverIndex = worker.resolverIndex;
  6381. }
  6382. });
  6383. checkForCaptcha((hasCaptcha) => {
  6384. if (hasCaptcha) {
  6385. worker.emit("stop");
  6386. } else {
  6387. worker.emit("continuate");
  6388. }
  6389. });
  6390. worker.doWork().then(async (results) => {
  6391. if (type === "exam") {
  6392. $message("info", { content: "\u8003\u8BD5\u5B8C\u6210\uFF0C\u4E3A\u4E86\u5B89\u5168\u8003\u8651\uFF0C\u8BF7\u81EA\u884C\u68C0\u67E5\u540E\u81EA\u884C\u70B9\u51FB\u63D0\u4EA4\uFF01" });
  6393. } else {
  6394. await worker.uploadHandler({
  6395. type: upload,
  6396. results,
  6397. async callback(finishedRate, uploadable) {
  6398. var _a;
  6399. $message("info", {
  6400. content: `\u5B8C\u6210\u7387 ${finishedRate.toFixed(2)} : ${uploadable ? "5\u79D2\u540E\u5C06\u81EA\u52A8\u63D0\u4EA4" : "5\u79D2\u540E\u5C06\u81EA\u52A8\u4FDD\u5B58"} `
  6401. });
  6402. await $.sleep(5e3);
  6403. const saveBtn = $el(".btnStyleX:not(.btnStyleXSumit)");
  6404. const uploadBtn = $el(".btnStyleXSumit");
  6405. if (uploadable) {
  6406. uploadBtn == null ? void 0 : uploadBtn.click();
  6407. } else {
  6408. saveBtn == null ? void 0 : saveBtn.click();
  6409. }
  6410. await $.sleep(2e3);
  6411. (_a = $el("[role='dialog'] .el-button--primary")) == null ? void 0 : _a.click();
  6412. }
  6413. });
  6414. }
  6415. const text = el("span", "\u6B63\u5728\u4FDD\u5B58\u9898\u76EE\u4E2D\uFF0C\u8BF7\u52FF\u64CD\u4F5C...");
  6416. const modal = $model("alert", { content: text });
  6417. for (let index = 0; index < worker.totalQuestionCount; index++) {
  6418. $el("div.examPaper_box > div.switch-btn-box > button:nth-child(2)").click();
  6419. await $.sleep(1e3);
  6420. }
  6421. text.innerText = "\u6240\u6709\u9898\u76EE\u4FDD\u5B58\u6210\u529F\u3002";
  6422. setTimeout(() => modal == null ? void 0 : modal.remove(), 3e3);
  6423. $message("success", { duration: 0, content: "\u4F5C\u4E1A\u5DF2\u5B8C\u6210\u3002" });
  6424. }).catch((err) => {
  6425. $message("error", { content: "\u7B54\u9898\u7A0B\u5E8F\u53D1\u751F\u9519\u8BEF : " + err.message });
  6426. });
  6427. return worker;
  6428. }
  6429. function xnkWork({ answererWrappers, period, timeout, retry, thread }) {
  6430. $message("info", { content: "\u5F00\u59CB\u4F5C\u4E1A" });
  6431. $store.setTab("common.work-results.results", []);
  6432. $script.pin(CommonProject.scripts.workResults);
  6433. const worker = new OCSWorker({
  6434. root: ".questionBox",
  6435. elements: {
  6436. title: ".questionContent",
  6437. options: ".optionUl label",
  6438. questionTit: ".questionTit"
  6439. },
  6440. requestPeriod: period != null ? period : 3,
  6441. resolvePeriod: 1,
  6442. timeout: timeout != null ? timeout : 30,
  6443. retry: retry != null ? retry : 2,
  6444. thread: thread != null ? thread : 1,
  6445. answerer: (elements, type, ctx) => {
  6446. const title = StringUtils.nowrap(elements.title[0].innerText).trim();
  6447. if (title) {
  6448. return defaultAnswerWrapperHandler(answererWrappers, { type, title, root: ctx.root });
  6449. } else {
  6450. throw new Error("\u9898\u76EE\u4E3A\u7A7A\uFF0C\u8BF7\u67E5\u770B\u9898\u76EE\u662F\u5426\u4E3A\u7A7A\uFF0C\u6216\u8005\u5FFD\u7565\u6B64\u9898");
  6451. }
  6452. },
  6453. work: {
  6454. handler(type, answer, option, ctx) {
  6455. var _a;
  6456. if (type === "judgement" || type === "single" || type === "multiple") {
  6457. if (((_a = option.querySelector("input")) == null ? void 0 : _a.checked) === false) {
  6458. option.click();
  6459. }
  6460. } else if (type === "completion" && answer.trim()) {
  6461. const text = option.querySelector("textarea");
  6462. if (text) {
  6463. text.value = answer;
  6464. }
  6465. }
  6466. }
  6467. },
  6468. onResultsUpdate(res) {
  6469. $store.setTab("common.work-results.results", $.simplifyWorkResult(res));
  6470. },
  6471. onResolveUpdate(res) {
  6472. CommonProject.scripts.workResults.cfg.totalQuestionCount = worker.totalQuestionCount;
  6473. CommonProject.scripts.workResults.cfg.requestIndex = worker.requestIndex;
  6474. CommonProject.scripts.workResults.cfg.resolverIndex = worker.resolverIndex;
  6475. }
  6476. });
  6477. const getBtn = () => document.querySelector("span.Topicswitchingbtn:nth-child(2)");
  6478. let next = getBtn();
  6479. (async () => {
  6480. while (next && worker.isClose === false) {
  6481. await worker.doWork();
  6482. await $.sleep((period != null ? period : 3) * 1e3);
  6483. next = getBtn();
  6484. next == null ? void 0 : next.click();
  6485. await $.sleep((period != null ? period : 3) * 1e3);
  6486. }
  6487. })();
  6488. return worker;
  6489. }
  6490. function optimizeSecond(second) {
  6491. return second / 3600 < 1 ? `${(second / 60).toFixed(2)}\u5206\u949F` : `${(second / 3600).toFixed(2)}\u5C0F\u65F6`;
  6492. }
  6493. var md5$1 = { exports: {} };
  6494. var crypt = { exports: {} };
  6495. (function() {
  6496. var base64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", crypt$1 = {
  6497. rotl: function(n, b) {
  6498. return n << b | n >>> 32 - b;
  6499. },
  6500. rotr: function(n, b) {
  6501. return n << 32 - b | n >>> b;
  6502. },
  6503. endian: function(n) {
  6504. if (n.constructor == Number) {
  6505. return crypt$1.rotl(n, 8) & 16711935 | crypt$1.rotl(n, 24) & 4278255360;
  6506. }
  6507. for (var i = 0; i < n.length; i++)
  6508. n[i] = crypt$1.endian(n[i]);
  6509. return n;
  6510. },
  6511. randomBytes: function(n) {
  6512. for (var bytes = []; n > 0; n--)
  6513. bytes.push(Math.floor(Math.random() * 256));
  6514. return bytes;
  6515. },
  6516. bytesToWords: function(bytes) {
  6517. for (var words = [], i = 0, b = 0; i < bytes.length; i++, b += 8)
  6518. words[b >>> 5] |= bytes[i] << 24 - b % 32;
  6519. return words;
  6520. },
  6521. wordsToBytes: function(words) {
  6522. for (var bytes = [], b = 0; b < words.length * 32; b += 8)
  6523. bytes.push(words[b >>> 5] >>> 24 - b % 32 & 255);
  6524. return bytes;
  6525. },
  6526. bytesToHex: function(bytes) {
  6527. for (var hex = [], i = 0; i < bytes.length; i++) {
  6528. hex.push((bytes[i] >>> 4).toString(16));
  6529. hex.push((bytes[i] & 15).toString(16));
  6530. }
  6531. return hex.join("");
  6532. },
  6533. hexToBytes: function(hex) {
  6534. for (var bytes = [], c = 0; c < hex.length; c += 2)
  6535. bytes.push(parseInt(hex.substr(c, 2), 16));
  6536. return bytes;
  6537. },
  6538. bytesToBase64: function(bytes) {
  6539. for (var base64 = [], i = 0; i < bytes.length; i += 3) {
  6540. var triplet = bytes[i] << 16 | bytes[i + 1] << 8 | bytes[i + 2];
  6541. for (var j = 0; j < 4; j++)
  6542. if (i * 8 + j * 6 <= bytes.length * 8)
  6543. base64.push(base64map.charAt(triplet >>> 6 * (3 - j) & 63));
  6544. else
  6545. base64.push("=");
  6546. }
  6547. return base64.join("");
  6548. },
  6549. base64ToBytes: function(base64) {
  6550. base64 = base64.replace(/[^A-Z0-9+\/]/ig, "");
  6551. for (var bytes = [], i = 0, imod4 = 0; i < base64.length; imod4 = ++i % 4) {
  6552. if (imod4 == 0)
  6553. continue;
  6554. 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);
  6555. }
  6556. return bytes;
  6557. }
  6558. };
  6559. crypt.exports = crypt$1;
  6560. })();
  6561. var charenc = {
  6562. utf8: {
  6563. stringToBytes: function(str) {
  6564. return charenc.bin.stringToBytes(unescape(encodeURIComponent(str)));
  6565. },
  6566. bytesToString: function(bytes) {
  6567. return decodeURIComponent(escape(charenc.bin.bytesToString(bytes)));
  6568. }
  6569. },
  6570. bin: {
  6571. stringToBytes: function(str) {
  6572. for (var bytes = [], i = 0; i < str.length; i++)
  6573. bytes.push(str.charCodeAt(i) & 255);
  6574. return bytes;
  6575. },
  6576. bytesToString: function(bytes) {
  6577. for (var str = [], i = 0; i < bytes.length; i++)
  6578. str.push(String.fromCharCode(bytes[i]));
  6579. return str.join("");
  6580. }
  6581. }
  6582. };
  6583. var charenc_1 = charenc;
  6584. /*!
  6585. * Determine if an object is a Buffer
  6586. *
  6587. * @author Feross Aboukhadijeh <https://feross.org>
  6588. * @license MIT
  6589. */
  6590. var isBuffer_1 = function(obj) {
  6591. return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer);
  6592. };
  6593. function isBuffer(obj) {
  6594. return !!obj.constructor && typeof obj.constructor.isBuffer === "function" && obj.constructor.isBuffer(obj);
  6595. }
  6596. function isSlowBuffer(obj) {
  6597. return typeof obj.readFloatLE === "function" && typeof obj.slice === "function" && isBuffer(obj.slice(0, 0));
  6598. }
  6599. (function() {
  6600. var crypt$1 = crypt.exports, utf8 = charenc_1.utf8, isBuffer2 = isBuffer_1, bin = charenc_1.bin, md52 = function(message, options) {
  6601. if (message.constructor == String)
  6602. if (options && options.encoding === "binary")
  6603. message = bin.stringToBytes(message);
  6604. else
  6605. message = utf8.stringToBytes(message);
  6606. else if (isBuffer2(message))
  6607. message = Array.prototype.slice.call(message, 0);
  6608. else if (!Array.isArray(message) && message.constructor !== Uint8Array)
  6609. message = message.toString();
  6610. var m = crypt$1.bytesToWords(message), l = message.length * 8, a = 1732584193, b = -271733879, c = -1732584194, d = 271733878;
  6611. for (var i = 0; i < m.length; i++) {
  6612. m[i] = (m[i] << 8 | m[i] >>> 24) & 16711935 | (m[i] << 24 | m[i] >>> 8) & 4278255360;
  6613. }
  6614. m[l >>> 5] |= 128 << l % 32;
  6615. m[(l + 64 >>> 9 << 4) + 14] = l;
  6616. var FF = md52._ff, GG = md52._gg, HH = md52._hh, II = md52._ii;
  6617. for (var i = 0; i < m.length; i += 16) {
  6618. var aa = a, bb = b, cc = c, dd = d;
  6619. a = FF(a, b, c, d, m[i + 0], 7, -680876936);
  6620. d = FF(d, a, b, c, m[i + 1], 12, -389564586);
  6621. c = FF(c, d, a, b, m[i + 2], 17, 606105819);
  6622. b = FF(b, c, d, a, m[i + 3], 22, -1044525330);
  6623. a = FF(a, b, c, d, m[i + 4], 7, -176418897);
  6624. d = FF(d, a, b, c, m[i + 5], 12, 1200080426);
  6625. c = FF(c, d, a, b, m[i + 6], 17, -1473231341);
  6626. b = FF(b, c, d, a, m[i + 7], 22, -45705983);
  6627. a = FF(a, b, c, d, m[i + 8], 7, 1770035416);
  6628. d = FF(d, a, b, c, m[i + 9], 12, -1958414417);
  6629. c = FF(c, d, a, b, m[i + 10], 17, -42063);
  6630. b = FF(b, c, d, a, m[i + 11], 22, -1990404162);
  6631. a = FF(a, b, c, d, m[i + 12], 7, 1804603682);
  6632. d = FF(d, a, b, c, m[i + 13], 12, -40341101);
  6633. c = FF(c, d, a, b, m[i + 14], 17, -1502002290);
  6634. b = FF(b, c, d, a, m[i + 15], 22, 1236535329);
  6635. a = GG(a, b, c, d, m[i + 1], 5, -165796510);
  6636. d = GG(d, a, b, c, m[i + 6], 9, -1069501632);
  6637. c = GG(c, d, a, b, m[i + 11], 14, 643717713);
  6638. b = GG(b, c, d, a, m[i + 0], 20, -373897302);
  6639. a = GG(a, b, c, d, m[i + 5], 5, -701558691);
  6640. d = GG(d, a, b, c, m[i + 10], 9, 38016083);
  6641. c = GG(c, d, a, b, m[i + 15], 14, -660478335);
  6642. b = GG(b, c, d, a, m[i + 4], 20, -405537848);
  6643. a = GG(a, b, c, d, m[i + 9], 5, 568446438);
  6644. d = GG(d, a, b, c, m[i + 14], 9, -1019803690);
  6645. c = GG(c, d, a, b, m[i + 3], 14, -187363961);
  6646. b = GG(b, c, d, a, m[i + 8], 20, 1163531501);
  6647. a = GG(a, b, c, d, m[i + 13], 5, -1444681467);
  6648. d = GG(d, a, b, c, m[i + 2], 9, -51403784);
  6649. c = GG(c, d, a, b, m[i + 7], 14, 1735328473);
  6650. b = GG(b, c, d, a, m[i + 12], 20, -1926607734);
  6651. a = HH(a, b, c, d, m[i + 5], 4, -378558);
  6652. d = HH(d, a, b, c, m[i + 8], 11, -2022574463);
  6653. c = HH(c, d, a, b, m[i + 11], 16, 1839030562);
  6654. b = HH(b, c, d, a, m[i + 14], 23, -35309556);
  6655. a = HH(a, b, c, d, m[i + 1], 4, -1530992060);
  6656. d = HH(d, a, b, c, m[i + 4], 11, 1272893353);
  6657. c = HH(c, d, a, b, m[i + 7], 16, -155497632);
  6658. b = HH(b, c, d, a, m[i + 10], 23, -1094730640);
  6659. a = HH(a, b, c, d, m[i + 13], 4, 681279174);
  6660. d = HH(d, a, b, c, m[i + 0], 11, -358537222);
  6661. c = HH(c, d, a, b, m[i + 3], 16, -722521979);
  6662. b = HH(b, c, d, a, m[i + 6], 23, 76029189);
  6663. a = HH(a, b, c, d, m[i + 9], 4, -640364487);
  6664. d = HH(d, a, b, c, m[i + 12], 11, -421815835);
  6665. c = HH(c, d, a, b, m[i + 15], 16, 530742520);
  6666. b = HH(b, c, d, a, m[i + 2], 23, -995338651);
  6667. a = II(a, b, c, d, m[i + 0], 6, -198630844);
  6668. d = II(d, a, b, c, m[i + 7], 10, 1126891415);
  6669. c = II(c, d, a, b, m[i + 14], 15, -1416354905);
  6670. b = II(b, c, d, a, m[i + 5], 21, -57434055);
  6671. a = II(a, b, c, d, m[i + 12], 6, 1700485571);
  6672. d = II(d, a, b, c, m[i + 3], 10, -1894986606);
  6673. c = II(c, d, a, b, m[i + 10], 15, -1051523);
  6674. b = II(b, c, d, a, m[i + 1], 21, -2054922799);
  6675. a = II(a, b, c, d, m[i + 8], 6, 1873313359);
  6676. d = II(d, a, b, c, m[i + 15], 10, -30611744);
  6677. c = II(c, d, a, b, m[i + 6], 15, -1560198380);
  6678. b = II(b, c, d, a, m[i + 13], 21, 1309151649);
  6679. a = II(a, b, c, d, m[i + 4], 6, -145523070);
  6680. d = II(d, a, b, c, m[i + 11], 10, -1120210379);
  6681. c = II(c, d, a, b, m[i + 2], 15, 718787259);
  6682. b = II(b, c, d, a, m[i + 9], 21, -343485551);
  6683. a = a + aa >>> 0;
  6684. b = b + bb >>> 0;
  6685. c = c + cc >>> 0;
  6686. d = d + dd >>> 0;
  6687. }
  6688. return crypt$1.endian([a, b, c, d]);
  6689. };
  6690. md52._ff = function(a, b, c, d, x, s, t) {
  6691. var n = a + (b & c | ~b & d) + (x >>> 0) + t;
  6692. return (n << s | n >>> 32 - s) + b;
  6693. };
  6694. md52._gg = function(a, b, c, d, x, s, t) {
  6695. var n = a + (b & d | c & ~d) + (x >>> 0) + t;
  6696. return (n << s | n >>> 32 - s) + b;
  6697. };
  6698. md52._hh = function(a, b, c, d, x, s, t) {
  6699. var n = a + (b ^ c ^ d) + (x >>> 0) + t;
  6700. return (n << s | n >>> 32 - s) + b;
  6701. };
  6702. md52._ii = function(a, b, c, d, x, s, t) {
  6703. var n = a + (c ^ (b | ~d)) + (x >>> 0) + t;
  6704. return (n << s | n >>> 32 - s) + b;
  6705. };
  6706. md52._blocksize = 16;
  6707. md52._digestsize = 16;
  6708. md5$1.exports = function(message, options) {
  6709. if (message === void 0 || message === null)
  6710. throw new Error("Illegal argument " + message);
  6711. var digestbytes = crypt$1.wordsToBytes(md52(message, options));
  6712. return options && options.asBytes ? digestbytes : options && options.asString ? bin.bytesToString(digestbytes) : crypt$1.bytesToHex(digestbytes);
  6713. };
  6714. })();
  6715. var md5 = md5$1.exports;
  6716. var Typr = {};
  6717. Typr.parse = function(buff) {
  6718. var bin = Typr._bin;
  6719. var data = new Uint8Array(buff);
  6720. var offset = 0;
  6721. bin.readFixed(data, offset);
  6722. offset += 4;
  6723. var numTables = bin.readUshort(data, offset);
  6724. offset += 2;
  6725. bin.readUshort(data, offset);
  6726. offset += 2;
  6727. bin.readUshort(data, offset);
  6728. offset += 2;
  6729. bin.readUshort(data, offset);
  6730. offset += 2;
  6731. var tags = ["cmap", "head", "hhea", "maxp", "hmtx", "name", "OS/2", "post", "loca", "glyf", "kern", "CFF ", "GPOS", "GSUB", "SVG "];
  6732. var obj = { _data: data };
  6733. var tabs = {};
  6734. for (var i = 0; i < numTables; i++) {
  6735. var tag = bin.readASCII(data, offset, 4);
  6736. offset += 4;
  6737. bin.readUint(data, offset);
  6738. offset += 4;
  6739. var toffset = bin.readUint(data, offset);
  6740. offset += 4;
  6741. var length = bin.readUint(data, offset);
  6742. offset += 4;
  6743. tabs[tag] = { offset: toffset, length };
  6744. }
  6745. for (var i = 0; i < tags.length; i++) {
  6746. var t = tags[i];
  6747. if (tabs[t])
  6748. obj[t.trim()] = Typr[t.trim()].parse(data, tabs[t].offset, tabs[t].length, obj);
  6749. }
  6750. return obj;
  6751. };
  6752. Typr._tabOffset = function(data, tab) {
  6753. var bin = Typr._bin;
  6754. var numTables = bin.readUshort(data, 4);
  6755. var offset = 12;
  6756. for (var i = 0; i < numTables; i++) {
  6757. var tag = bin.readASCII(data, offset, 4);
  6758. offset += 4;
  6759. bin.readUint(data, offset);
  6760. offset += 4;
  6761. var toffset = bin.readUint(data, offset);
  6762. offset += 4;
  6763. bin.readUint(data, offset);
  6764. offset += 4;
  6765. if (tag == tab)
  6766. return toffset;
  6767. }
  6768. return 0;
  6769. };
  6770. Typr._bin = { readFixed: function(data, o) {
  6771. return (data[o] << 8 | data[o + 1]) + (data[o + 2] << 8 | data[o + 3]) / (256 * 256 + 4);
  6772. }, readF2dot14: function(data, o) {
  6773. var num = Typr._bin.readShort(data, o);
  6774. return num / 16384;
  6775. }, readInt: function(buff, p) {
  6776. var a = Typr._bin.t.uint8;
  6777. a[0] = buff[p + 3];
  6778. a[1] = buff[p + 2];
  6779. a[2] = buff[p + 1];
  6780. a[3] = buff[p];
  6781. return Typr._bin.t.int32[0];
  6782. }, readInt8: function(buff, p) {
  6783. var a = Typr._bin.t.uint8;
  6784. a[0] = buff[p];
  6785. return Typr._bin.t.int8[0];
  6786. }, readShort: function(buff, p) {
  6787. var a = Typr._bin.t.uint8;
  6788. a[1] = buff[p];
  6789. a[0] = buff[p + 1];
  6790. return Typr._bin.t.int16[0];
  6791. }, readUshort: function(buff, p) {
  6792. return buff[p] << 8 | buff[p + 1];
  6793. }, readUshorts: function(buff, p, len) {
  6794. var arr = [];
  6795. for (var i = 0; i < len; i++)
  6796. arr.push(Typr._bin.readUshort(buff, p + i * 2));
  6797. return arr;
  6798. }, readUint: function(buff, p) {
  6799. var a = Typr._bin.t.uint8;
  6800. a[3] = buff[p];
  6801. a[2] = buff[p + 1];
  6802. a[1] = buff[p + 2];
  6803. a[0] = buff[p + 3];
  6804. return Typr._bin.t.uint32[0];
  6805. }, readUint64: function(buff, p) {
  6806. return Typr._bin.readUint(buff, p) * (4294967295 + 1) + Typr._bin.readUint(buff, p + 4);
  6807. }, readASCII: function(buff, p, l) {
  6808. var s = "";
  6809. for (var i = 0; i < l; i++)
  6810. s += String.fromCharCode(buff[p + i]);
  6811. return s;
  6812. }, readUnicode: function(buff, p, l) {
  6813. var s = "";
  6814. for (var i = 0; i < l; i++) {
  6815. var c = buff[p++] << 8 | buff[p++];
  6816. s += String.fromCharCode(c);
  6817. }
  6818. return s;
  6819. }, _tdec: window["TextDecoder"] ? new window["TextDecoder"]() : null, readUTF8: function(buff, p, l) {
  6820. var tdec = Typr._bin._tdec;
  6821. if (tdec && p == 0 && l == buff.length)
  6822. return tdec["decode"](buff);
  6823. return Typr._bin.readASCII(buff, p, l);
  6824. }, readBytes: function(buff, p, l) {
  6825. var arr = [];
  6826. for (var i = 0; i < l; i++)
  6827. arr.push(buff[p + i]);
  6828. return arr;
  6829. }, readASCIIArray: function(buff, p, l) {
  6830. var s = [];
  6831. for (var i = 0; i < l; i++)
  6832. s.push(String.fromCharCode(buff[p + i]));
  6833. return s;
  6834. } };
  6835. Typr._bin.t = { buff: new ArrayBuffer(8) };
  6836. Typr._bin.t.int8 = new Int8Array(Typr._bin.t.buff);
  6837. Typr._bin.t.uint8 = new Uint8Array(Typr._bin.t.buff);
  6838. Typr._bin.t.int16 = new Int16Array(Typr._bin.t.buff);
  6839. Typr._bin.t.uint16 = new Uint16Array(Typr._bin.t.buff);
  6840. Typr._bin.t.int32 = new Int32Array(Typr._bin.t.buff);
  6841. Typr._bin.t.uint32 = new Uint32Array(Typr._bin.t.buff);
  6842. Typr._lctf = {};
  6843. Typr._lctf.parse = function(data, offset, length, font, subt) {
  6844. var bin = Typr._bin;
  6845. var obj = {};
  6846. var offset0 = offset;
  6847. bin.readFixed(data, offset);
  6848. offset += 4;
  6849. var offScriptList = bin.readUshort(data, offset);
  6850. offset += 2;
  6851. var offFeatureList = bin.readUshort(data, offset);
  6852. offset += 2;
  6853. var offLookupList = bin.readUshort(data, offset);
  6854. offset += 2;
  6855. obj.scriptList = Typr._lctf.readScriptList(data, offset0 + offScriptList);
  6856. obj.featureList = Typr._lctf.readFeatureList(data, offset0 + offFeatureList);
  6857. obj.lookupList = Typr._lctf.readLookupList(data, offset0 + offLookupList, subt);
  6858. return obj;
  6859. };
  6860. Typr._lctf.readLookupList = function(data, offset, subt) {
  6861. var bin = Typr._bin;
  6862. var offset0 = offset;
  6863. var obj = [];
  6864. var count = bin.readUshort(data, offset);
  6865. offset += 2;
  6866. for (var i = 0; i < count; i++) {
  6867. var noff = bin.readUshort(data, offset);
  6868. offset += 2;
  6869. var lut = Typr._lctf.readLookupTable(data, offset0 + noff, subt);
  6870. obj.push(lut);
  6871. }
  6872. return obj;
  6873. };
  6874. Typr._lctf.readLookupTable = function(data, offset, subt) {
  6875. var bin = Typr._bin;
  6876. var offset0 = offset;
  6877. var obj = { tabs: [] };
  6878. obj.ltype = bin.readUshort(data, offset);
  6879. offset += 2;
  6880. obj.flag = bin.readUshort(data, offset);
  6881. offset += 2;
  6882. var cnt = bin.readUshort(data, offset);
  6883. offset += 2;
  6884. for (var i = 0; i < cnt; i++) {
  6885. var noff = bin.readUshort(data, offset);
  6886. offset += 2;
  6887. var tab = subt(data, obj.ltype, offset0 + noff);
  6888. obj.tabs.push(tab);
  6889. }
  6890. return obj;
  6891. };
  6892. Typr._lctf.numOfOnes = function(n) {
  6893. var num = 0;
  6894. for (var i = 0; i < 32; i++)
  6895. if ((n >>> i & 1) != 0)
  6896. num++;
  6897. return num;
  6898. };
  6899. Typr._lctf.readClassDef = function(data, offset) {
  6900. var bin = Typr._bin;
  6901. var obj = [];
  6902. var format = bin.readUshort(data, offset);
  6903. offset += 2;
  6904. if (format == 1) {
  6905. var startGlyph = bin.readUshort(data, offset);
  6906. offset += 2;
  6907. var glyphCount = bin.readUshort(data, offset);
  6908. offset += 2;
  6909. for (var i = 0; i < glyphCount; i++) {
  6910. obj.push(startGlyph + i);
  6911. obj.push(startGlyph + i);
  6912. obj.push(bin.readUshort(data, offset));
  6913. offset += 2;
  6914. }
  6915. }
  6916. if (format == 2) {
  6917. var count = bin.readUshort(data, offset);
  6918. offset += 2;
  6919. for (var i = 0; i < count; i++) {
  6920. obj.push(bin.readUshort(data, offset));
  6921. offset += 2;
  6922. obj.push(bin.readUshort(data, offset));
  6923. offset += 2;
  6924. obj.push(bin.readUshort(data, offset));
  6925. offset += 2;
  6926. }
  6927. }
  6928. return obj;
  6929. };
  6930. Typr._lctf.getInterval = function(tab, val) {
  6931. for (var i = 0; i < tab.length; i += 3) {
  6932. var start2 = tab[i], end = tab[i + 1];
  6933. tab[i + 2];
  6934. if (start2 <= val && val <= end)
  6935. return i;
  6936. }
  6937. return -1;
  6938. };
  6939. Typr._lctf.readValueRecord = function(data, offset, valFmt) {
  6940. var bin = Typr._bin;
  6941. var arr = [];
  6942. arr.push(valFmt & 1 ? bin.readShort(data, offset) : 0);
  6943. offset += valFmt & 1 ? 2 : 0;
  6944. arr.push(valFmt & 2 ? bin.readShort(data, offset) : 0);
  6945. offset += valFmt & 2 ? 2 : 0;
  6946. arr.push(valFmt & 4 ? bin.readShort(data, offset) : 0);
  6947. offset += valFmt & 4 ? 2 : 0;
  6948. arr.push(valFmt & 8 ? bin.readShort(data, offset) : 0);
  6949. offset += valFmt & 8 ? 2 : 0;
  6950. return arr;
  6951. };
  6952. Typr._lctf.readCoverage = function(data, offset) {
  6953. var bin = Typr._bin;
  6954. var cvg = {};
  6955. cvg.fmt = bin.readUshort(data, offset);
  6956. offset += 2;
  6957. var count = bin.readUshort(data, offset);
  6958. offset += 2;
  6959. if (cvg.fmt == 1)
  6960. cvg.tab = bin.readUshorts(data, offset, count);
  6961. if (cvg.fmt == 2)
  6962. cvg.tab = bin.readUshorts(data, offset, count * 3);
  6963. return cvg;
  6964. };
  6965. Typr._lctf.coverageIndex = function(cvg, val) {
  6966. var tab = cvg.tab;
  6967. if (cvg.fmt == 1)
  6968. return tab.indexOf(val);
  6969. if (cvg.fmt == 2) {
  6970. var ind = Typr._lctf.getInterval(tab, val);
  6971. if (ind != -1)
  6972. return tab[ind + 2] + (val - tab[ind]);
  6973. }
  6974. return -1;
  6975. };
  6976. Typr._lctf.readFeatureList = function(data, offset) {
  6977. var bin = Typr._bin;
  6978. var offset0 = offset;
  6979. var obj = [];
  6980. var count = bin.readUshort(data, offset);
  6981. offset += 2;
  6982. for (var i = 0; i < count; i++) {
  6983. var tag = bin.readASCII(data, offset, 4);
  6984. offset += 4;
  6985. var noff = bin.readUshort(data, offset);
  6986. offset += 2;
  6987. obj.push({ tag: tag.trim(), tab: Typr._lctf.readFeatureTable(data, offset0 + noff) });
  6988. }
  6989. return obj;
  6990. };
  6991. Typr._lctf.readFeatureTable = function(data, offset) {
  6992. var bin = Typr._bin;
  6993. bin.readUshort(data, offset);
  6994. offset += 2;
  6995. var lookupCount = bin.readUshort(data, offset);
  6996. offset += 2;
  6997. var indices = [];
  6998. for (var i = 0; i < lookupCount; i++)
  6999. indices.push(bin.readUshort(data, offset + 2 * i));
  7000. return indices;
  7001. };
  7002. Typr._lctf.readScriptList = function(data, offset) {
  7003. var bin = Typr._bin;
  7004. var offset0 = offset;
  7005. var obj = {};
  7006. var count = bin.readUshort(data, offset);
  7007. offset += 2;
  7008. for (var i = 0; i < count; i++) {
  7009. var tag = bin.readASCII(data, offset, 4);
  7010. offset += 4;
  7011. var noff = bin.readUshort(data, offset);
  7012. offset += 2;
  7013. obj[tag.trim()] = Typr._lctf.readScriptTable(data, offset0 + noff);
  7014. }
  7015. return obj;
  7016. };
  7017. Typr._lctf.readScriptTable = function(data, offset) {
  7018. var bin = Typr._bin;
  7019. var offset0 = offset;
  7020. var obj = {};
  7021. var defLangSysOff = bin.readUshort(data, offset);
  7022. offset += 2;
  7023. obj.default = Typr._lctf.readLangSysTable(data, offset0 + defLangSysOff);
  7024. var langSysCount = bin.readUshort(data, offset);
  7025. offset += 2;
  7026. for (var i = 0; i < langSysCount; i++) {
  7027. var tag = bin.readASCII(data, offset, 4);
  7028. offset += 4;
  7029. var langSysOff = bin.readUshort(data, offset);
  7030. offset += 2;
  7031. obj[tag.trim()] = Typr._lctf.readLangSysTable(data, offset0 + langSysOff);
  7032. }
  7033. return obj;
  7034. };
  7035. Typr._lctf.readLangSysTable = function(data, offset) {
  7036. var bin = Typr._bin;
  7037. var obj = {};
  7038. bin.readUshort(data, offset);
  7039. offset += 2;
  7040. obj.reqFeature = bin.readUshort(data, offset);
  7041. offset += 2;
  7042. var featureCount = bin.readUshort(data, offset);
  7043. offset += 2;
  7044. obj.features = bin.readUshorts(data, offset, featureCount);
  7045. return obj;
  7046. };
  7047. Typr.CFF = {};
  7048. Typr.CFF.parse = function(data, offset, length) {
  7049. var bin = Typr._bin;
  7050. data = new Uint8Array(data.buffer, offset, length);
  7051. offset = 0;
  7052. data[offset];
  7053. offset++;
  7054. data[offset];
  7055. offset++;
  7056. data[offset];
  7057. offset++;
  7058. data[offset];
  7059. offset++;
  7060. var ninds = [];
  7061. offset = Typr.CFF.readIndex(data, offset, ninds);
  7062. var names = [];
  7063. for (var i = 0; i < ninds.length - 1; i++)
  7064. names.push(bin.readASCII(data, offset + ninds[i], ninds[i + 1] - ninds[i]));
  7065. offset += ninds[ninds.length - 1];
  7066. var tdinds = [];
  7067. offset = Typr.CFF.readIndex(data, offset, tdinds);
  7068. var topDicts = [];
  7069. for (var i = 0; i < tdinds.length - 1; i++)
  7070. topDicts.push(Typr.CFF.readDict(data, offset + tdinds[i], offset + tdinds[i + 1]));
  7071. offset += tdinds[tdinds.length - 1];
  7072. var topdict = topDicts[0];
  7073. var sinds = [];
  7074. offset = Typr.CFF.readIndex(data, offset, sinds);
  7075. var strings = [];
  7076. for (var i = 0; i < sinds.length - 1; i++)
  7077. strings.push(bin.readASCII(data, offset + sinds[i], sinds[i + 1] - sinds[i]));
  7078. offset += sinds[sinds.length - 1];
  7079. Typr.CFF.readSubrs(data, offset, topdict);
  7080. if (topdict.CharStrings) {
  7081. offset = topdict.CharStrings;
  7082. var sinds = [];
  7083. offset = Typr.CFF.readIndex(data, offset, sinds);
  7084. var cstr = [];
  7085. for (var i = 0; i < sinds.length - 1; i++)
  7086. cstr.push(bin.readBytes(data, offset + sinds[i], sinds[i + 1] - sinds[i]));
  7087. topdict.CharStrings = cstr;
  7088. }
  7089. if (topdict.Encoding)
  7090. topdict.Encoding = Typr.CFF.readEncoding(data, topdict.Encoding, topdict.CharStrings.length);
  7091. if (topdict.charset)
  7092. topdict.charset = Typr.CFF.readCharset(data, topdict.charset, topdict.CharStrings.length);
  7093. if (topdict.Private) {
  7094. offset = topdict.Private[1];
  7095. topdict.Private = Typr.CFF.readDict(data, offset, offset + topdict.Private[0]);
  7096. if (topdict.Private.Subrs)
  7097. Typr.CFF.readSubrs(data, offset + topdict.Private.Subrs, topdict.Private);
  7098. }
  7099. var obj = {};
  7100. for (var p in topdict) {
  7101. if (["FamilyName", "FullName", "Notice", "version", "Copyright"].indexOf(p) != -1)
  7102. obj[p] = strings[topdict[p] - 426 + 35];
  7103. else
  7104. obj[p] = topdict[p];
  7105. }
  7106. return obj;
  7107. };
  7108. Typr.CFF.readSubrs = function(data, offset, obj) {
  7109. var bin = Typr._bin;
  7110. var gsubinds = [];
  7111. offset = Typr.CFF.readIndex(data, offset, gsubinds);
  7112. var bias, nSubrs = gsubinds.length;
  7113. if (nSubrs < 1240)
  7114. bias = 107;
  7115. else if (nSubrs < 33900)
  7116. bias = 1131;
  7117. else
  7118. bias = 32768;
  7119. obj.Bias = bias;
  7120. obj.Subrs = [];
  7121. for (var i = 0; i < gsubinds.length - 1; i++)
  7122. obj.Subrs.push(bin.readBytes(data, offset + gsubinds[i], gsubinds[i + 1] - gsubinds[i]));
  7123. };
  7124. 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];
  7125. Typr.CFF.glyphByUnicode = function(cff, code) {
  7126. for (var i = 0; i < cff.charset.length; i++)
  7127. if (cff.charset[i] == code)
  7128. return i;
  7129. return -1;
  7130. };
  7131. Typr.CFF.glyphBySE = function(cff, charcode) {
  7132. if (charcode < 0 || charcode > 255)
  7133. return -1;
  7134. return Typr.CFF.glyphByUnicode(cff, Typr.CFF.tableSE[charcode]);
  7135. };
  7136. Typr.CFF.readEncoding = function(data, offset, num) {
  7137. Typr._bin;
  7138. var array = [".notdef"];
  7139. var format = data[offset];
  7140. offset++;
  7141. if (format == 0) {
  7142. var nCodes = data[offset];
  7143. offset++;
  7144. for (var i = 0; i < nCodes; i++)
  7145. array.push(data[offset + i]);
  7146. } else
  7147. throw "error: unknown encoding format: " + format;
  7148. return array;
  7149. };
  7150. Typr.CFF.readCharset = function(data, offset, num) {
  7151. var bin = Typr._bin;
  7152. var charset = [".notdef"];
  7153. var format = data[offset];
  7154. offset++;
  7155. if (format == 0) {
  7156. for (var i = 0; i < num; i++) {
  7157. var first = bin.readUshort(data, offset);
  7158. offset += 2;
  7159. charset.push(first);
  7160. }
  7161. } else if (format == 1 || format == 2) {
  7162. while (charset.length < num) {
  7163. var first = bin.readUshort(data, offset);
  7164. offset += 2;
  7165. var nLeft = 0;
  7166. if (format == 1) {
  7167. nLeft = data[offset];
  7168. offset++;
  7169. } else {
  7170. nLeft = bin.readUshort(data, offset);
  7171. offset += 2;
  7172. }
  7173. for (var i = 0; i <= nLeft; i++) {
  7174. charset.push(first);
  7175. first++;
  7176. }
  7177. }
  7178. } else
  7179. throw "error: format: " + format;
  7180. return charset;
  7181. };
  7182. Typr.CFF.readIndex = function(data, offset, inds) {
  7183. var bin = Typr._bin;
  7184. var count = bin.readUshort(data, offset);
  7185. offset += 2;
  7186. var offsize = data[offset];
  7187. offset++;
  7188. if (offsize == 1)
  7189. for (var i = 0; i < count + 1; i++)
  7190. inds.push(data[offset + i]);
  7191. else if (offsize == 2)
  7192. for (var i = 0; i < count + 1; i++)
  7193. inds.push(bin.readUshort(data, offset + i * 2));
  7194. else if (offsize == 3)
  7195. for (var i = 0; i < count + 1; i++)
  7196. inds.push(bin.readUint(data, offset + i * 3 - 1) & 16777215);
  7197. else if (count != 0)
  7198. throw "unsupported offset size: " + offsize + ", count: " + count;
  7199. offset += (count + 1) * offsize;
  7200. return offset - 1;
  7201. };
  7202. Typr.CFF.getCharString = function(data, offset, o) {
  7203. var bin = Typr._bin;
  7204. var b0 = data[offset], b1 = data[offset + 1];
  7205. data[offset + 2];
  7206. data[offset + 3];
  7207. data[offset + 4];
  7208. var vs = 1;
  7209. var op = null, val = null;
  7210. if (b0 <= 20) {
  7211. op = b0;
  7212. vs = 1;
  7213. }
  7214. if (b0 == 12) {
  7215. op = b0 * 100 + b1;
  7216. vs = 2;
  7217. }
  7218. if (21 <= b0 && b0 <= 27) {
  7219. op = b0;
  7220. vs = 1;
  7221. }
  7222. if (b0 == 28) {
  7223. val = bin.readShort(data, offset + 1);
  7224. vs = 3;
  7225. }
  7226. if (29 <= b0 && b0 <= 31) {
  7227. op = b0;
  7228. vs = 1;
  7229. }
  7230. if (32 <= b0 && b0 <= 246) {
  7231. val = b0 - 139;
  7232. vs = 1;
  7233. }
  7234. if (247 <= b0 && b0 <= 250) {
  7235. val = (b0 - 247) * 256 + b1 + 108;
  7236. vs = 2;
  7237. }
  7238. if (251 <= b0 && b0 <= 254) {
  7239. val = -(b0 - 251) * 256 - b1 - 108;
  7240. vs = 2;
  7241. }
  7242. if (b0 == 255) {
  7243. val = bin.readInt(data, offset + 1) / 65535;
  7244. vs = 5;
  7245. }
  7246. o.val = val != null ? val : "o" + op;
  7247. o.size = vs;
  7248. };
  7249. Typr.CFF.readCharString = function(data, offset, length) {
  7250. var end = offset + length;
  7251. var bin = Typr._bin;
  7252. var arr = [];
  7253. while (offset < end) {
  7254. var b0 = data[offset], b1 = data[offset + 1];
  7255. data[offset + 2];
  7256. data[offset + 3];
  7257. data[offset + 4];
  7258. var vs = 1;
  7259. var op = null, val = null;
  7260. if (b0 <= 20) {
  7261. op = b0;
  7262. vs = 1;
  7263. }
  7264. if (b0 == 12) {
  7265. op = b0 * 100 + b1;
  7266. vs = 2;
  7267. }
  7268. if (b0 == 19 || b0 == 20) {
  7269. op = b0;
  7270. vs = 2;
  7271. }
  7272. if (21 <= b0 && b0 <= 27) {
  7273. op = b0;
  7274. vs = 1;
  7275. }
  7276. if (b0 == 28) {
  7277. val = bin.readShort(data, offset + 1);
  7278. vs = 3;
  7279. }
  7280. if (29 <= b0 && b0 <= 31) {
  7281. op = b0;
  7282. vs = 1;
  7283. }
  7284. if (32 <= b0 && b0 <= 246) {
  7285. val = b0 - 139;
  7286. vs = 1;
  7287. }
  7288. if (247 <= b0 && b0 <= 250) {
  7289. val = (b0 - 247) * 256 + b1 + 108;
  7290. vs = 2;
  7291. }
  7292. if (251 <= b0 && b0 <= 254) {
  7293. val = -(b0 - 251) * 256 - b1 - 108;
  7294. vs = 2;
  7295. }
  7296. if (b0 == 255) {
  7297. val = bin.readInt(data, offset + 1) / 65535;
  7298. vs = 5;
  7299. }
  7300. arr.push(val != null ? val : "o" + op);
  7301. offset += vs;
  7302. }
  7303. return arr;
  7304. };
  7305. Typr.CFF.readDict = function(data, offset, end) {
  7306. var bin = Typr._bin;
  7307. var dict = {};
  7308. var carr = [];
  7309. while (offset < end) {
  7310. var b0 = data[offset], b1 = data[offset + 1];
  7311. data[offset + 2];
  7312. data[offset + 3];
  7313. data[offset + 4];
  7314. var vs = 1;
  7315. var key = null, val = null;
  7316. if (b0 == 28) {
  7317. val = bin.readShort(data, offset + 1);
  7318. vs = 3;
  7319. }
  7320. if (b0 == 29) {
  7321. val = bin.readInt(data, offset + 1);
  7322. vs = 5;
  7323. }
  7324. if (32 <= b0 && b0 <= 246) {
  7325. val = b0 - 139;
  7326. vs = 1;
  7327. }
  7328. if (247 <= b0 && b0 <= 250) {
  7329. val = (b0 - 247) * 256 + b1 + 108;
  7330. vs = 2;
  7331. }
  7332. if (251 <= b0 && b0 <= 254) {
  7333. val = -(b0 - 251) * 256 - b1 - 108;
  7334. vs = 2;
  7335. }
  7336. if (b0 == 255) {
  7337. val = bin.readInt(data, offset + 1) / 65535;
  7338. vs = 5;
  7339. throw "unknown number";
  7340. }
  7341. if (b0 == 30) {
  7342. var nibs = [];
  7343. vs = 1;
  7344. while (true) {
  7345. var b = data[offset + vs];
  7346. vs++;
  7347. var nib0 = b >> 4, nib1 = b & 15;
  7348. if (nib0 != 15)
  7349. nibs.push(nib0);
  7350. if (nib1 != 15)
  7351. nibs.push(nib1);
  7352. if (nib1 == 15)
  7353. break;
  7354. }
  7355. var s = "";
  7356. var chars = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ".", "e", "e-", "reserved", "-", "endOfNumber"];
  7357. for (var i = 0; i < nibs.length; i++)
  7358. s += chars[nibs[i]];
  7359. val = parseFloat(s);
  7360. }
  7361. if (b0 <= 21) {
  7362. var keys = ["version", "Notice", "FullName", "FamilyName", "Weight", "FontBBox", "BlueValues", "OtherBlues", "FamilyBlues", "FamilyOtherBlues", "StdHW", "StdVW", "escape", "UniqueID", "XUID", "charset", "Encoding", "CharStrings", "Private", "Subrs", "defaultWidthX", "nominalWidthX"];
  7363. key = keys[b0];
  7364. vs = 1;
  7365. if (b0 == 12) {
  7366. 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"];
  7367. key = keys[b1];
  7368. vs = 2;
  7369. }
  7370. }
  7371. if (key != null) {
  7372. dict[key] = carr.length == 1 ? carr[0] : carr;
  7373. carr = [];
  7374. } else
  7375. carr.push(val);
  7376. offset += vs;
  7377. }
  7378. return dict;
  7379. };
  7380. Typr.cmap = {};
  7381. Typr.cmap.parse = function(data, offset, length) {
  7382. data = new Uint8Array(data.buffer, offset, length);
  7383. offset = 0;
  7384. var bin = Typr._bin;
  7385. var obj = {};
  7386. bin.readUshort(data, offset);
  7387. offset += 2;
  7388. var numTables = bin.readUshort(data, offset);
  7389. offset += 2;
  7390. var offs = [];
  7391. obj.tables = [];
  7392. for (var i = 0; i < numTables; i++) {
  7393. var platformID = bin.readUshort(data, offset);
  7394. offset += 2;
  7395. var encodingID = bin.readUshort(data, offset);
  7396. offset += 2;
  7397. var noffset = bin.readUint(data, offset);
  7398. offset += 4;
  7399. var id = "p" + platformID + "e" + encodingID;
  7400. var tind = offs.indexOf(noffset);
  7401. if (tind == -1) {
  7402. tind = obj.tables.length;
  7403. var subt;
  7404. offs.push(noffset);
  7405. var format = bin.readUshort(data, noffset);
  7406. if (format == 0)
  7407. subt = Typr.cmap.parse0(data, noffset);
  7408. else if (format == 4)
  7409. subt = Typr.cmap.parse4(data, noffset);
  7410. else if (format == 6)
  7411. subt = Typr.cmap.parse6(data, noffset);
  7412. else if (format == 12)
  7413. subt = Typr.cmap.parse12(data, noffset);
  7414. else
  7415. console.log("unknown format: " + format, platformID, encodingID, noffset);
  7416. obj.tables.push(subt);
  7417. }
  7418. if (obj[id] != null)
  7419. throw "multiple tables for one platform+encoding";
  7420. obj[id] = tind;
  7421. }
  7422. return obj;
  7423. };
  7424. Typr.cmap.parse0 = function(data, offset) {
  7425. var bin = Typr._bin;
  7426. var obj = {};
  7427. obj.format = bin.readUshort(data, offset);
  7428. offset += 2;
  7429. var len = bin.readUshort(data, offset);
  7430. offset += 2;
  7431. bin.readUshort(data, offset);
  7432. offset += 2;
  7433. obj.map = [];
  7434. for (var i = 0; i < len - 6; i++)
  7435. obj.map.push(data[offset + i]);
  7436. return obj;
  7437. };
  7438. Typr.cmap.parse4 = function(data, offset) {
  7439. var bin = Typr._bin;
  7440. var offset0 = offset;
  7441. var obj = {};
  7442. obj.format = bin.readUshort(data, offset);
  7443. offset += 2;
  7444. var length = bin.readUshort(data, offset);
  7445. offset += 2;
  7446. bin.readUshort(data, offset);
  7447. offset += 2;
  7448. var segCountX2 = bin.readUshort(data, offset);
  7449. offset += 2;
  7450. var segCount = segCountX2 / 2;
  7451. obj.searchRange = bin.readUshort(data, offset);
  7452. offset += 2;
  7453. obj.entrySelector = bin.readUshort(data, offset);
  7454. offset += 2;
  7455. obj.rangeShift = bin.readUshort(data, offset);
  7456. offset += 2;
  7457. obj.endCount = bin.readUshorts(data, offset, segCount);
  7458. offset += segCount * 2;
  7459. offset += 2;
  7460. obj.startCount = bin.readUshorts(data, offset, segCount);
  7461. offset += segCount * 2;
  7462. obj.idDelta = [];
  7463. for (var i = 0; i < segCount; i++) {
  7464. obj.idDelta.push(bin.readShort(data, offset));
  7465. offset += 2;
  7466. }
  7467. obj.idRangeOffset = bin.readUshorts(data, offset, segCount);
  7468. offset += segCount * 2;
  7469. obj.glyphIdArray = [];
  7470. while (offset < offset0 + length) {
  7471. obj.glyphIdArray.push(bin.readUshort(data, offset));
  7472. offset += 2;
  7473. }
  7474. return obj;
  7475. };
  7476. Typr.cmap.parse6 = function(data, offset) {
  7477. var bin = Typr._bin;
  7478. var obj = {};
  7479. obj.format = bin.readUshort(data, offset);
  7480. offset += 2;
  7481. bin.readUshort(data, offset);
  7482. offset += 2;
  7483. bin.readUshort(data, offset);
  7484. offset += 2;
  7485. obj.firstCode = bin.readUshort(data, offset);
  7486. offset += 2;
  7487. var entryCount = bin.readUshort(data, offset);
  7488. offset += 2;
  7489. obj.glyphIdArray = [];
  7490. for (var i = 0; i < entryCount; i++) {
  7491. obj.glyphIdArray.push(bin.readUshort(data, offset));
  7492. offset += 2;
  7493. }
  7494. return obj;
  7495. };
  7496. Typr.cmap.parse12 = function(data, offset) {
  7497. var bin = Typr._bin;
  7498. var obj = {};
  7499. obj.format = bin.readUshort(data, offset);
  7500. offset += 2;
  7501. offset += 2;
  7502. bin.readUint(data, offset);
  7503. offset += 4;
  7504. bin.readUint(data, offset);
  7505. offset += 4;
  7506. var nGroups = bin.readUint(data, offset);
  7507. offset += 4;
  7508. obj.groups = [];
  7509. for (var i = 0; i < nGroups; i++) {
  7510. var off = offset + i * 12;
  7511. var startCharCode = bin.readUint(data, off + 0);
  7512. var endCharCode = bin.readUint(data, off + 4);
  7513. var startGlyphID = bin.readUint(data, off + 8);
  7514. obj.groups.push([startCharCode, endCharCode, startGlyphID]);
  7515. }
  7516. return obj;
  7517. };
  7518. Typr.glyf = {};
  7519. Typr.glyf.parse = function(data, offset, length, font) {
  7520. var obj = [];
  7521. for (var g = 0; g < font.maxp.numGlyphs; g++)
  7522. obj.push(null);
  7523. return obj;
  7524. };
  7525. Typr.glyf._parseGlyf = function(font, g) {
  7526. var bin = Typr._bin;
  7527. var data = font._data;
  7528. var offset = Typr._tabOffset(data, "glyf") + font.loca[g];
  7529. if (font.loca[g] == font.loca[g + 1])
  7530. return null;
  7531. var gl = {};
  7532. gl.noc = bin.readShort(data, offset);
  7533. offset += 2;
  7534. gl.xMin = bin.readShort(data, offset);
  7535. offset += 2;
  7536. gl.yMin = bin.readShort(data, offset);
  7537. offset += 2;
  7538. gl.xMax = bin.readShort(data, offset);
  7539. offset += 2;
  7540. gl.yMax = bin.readShort(data, offset);
  7541. offset += 2;
  7542. if (gl.xMin >= gl.xMax || gl.yMin >= gl.yMax)
  7543. return null;
  7544. if (gl.noc > 0) {
  7545. gl.endPts = [];
  7546. for (var i = 0; i < gl.noc; i++) {
  7547. gl.endPts.push(bin.readUshort(data, offset));
  7548. offset += 2;
  7549. }
  7550. var instructionLength = bin.readUshort(data, offset);
  7551. offset += 2;
  7552. if (data.length - offset < instructionLength)
  7553. return null;
  7554. gl.instructions = bin.readBytes(data, offset, instructionLength);
  7555. offset += instructionLength;
  7556. var crdnum = gl.endPts[gl.noc - 1] + 1;
  7557. gl.flags = [];
  7558. for (var i = 0; i < crdnum; i++) {
  7559. var flag = data[offset];
  7560. offset++;
  7561. gl.flags.push(flag);
  7562. if ((flag & 8) != 0) {
  7563. var rep = data[offset];
  7564. offset++;
  7565. for (var j = 0; j < rep; j++) {
  7566. gl.flags.push(flag);
  7567. i++;
  7568. }
  7569. }
  7570. }
  7571. gl.xs = [];
  7572. for (var i = 0; i < crdnum; i++) {
  7573. var i8 = (gl.flags[i] & 2) != 0, same = (gl.flags[i] & 16) != 0;
  7574. if (i8) {
  7575. gl.xs.push(same ? data[offset] : -data[offset]);
  7576. offset++;
  7577. } else {
  7578. if (same)
  7579. gl.xs.push(0);
  7580. else {
  7581. gl.xs.push(bin.readShort(data, offset));
  7582. offset += 2;
  7583. }
  7584. }
  7585. }
  7586. gl.ys = [];
  7587. for (var i = 0; i < crdnum; i++) {
  7588. var i8 = (gl.flags[i] & 4) != 0, same = (gl.flags[i] & 32) != 0;
  7589. if (i8) {
  7590. gl.ys.push(same ? data[offset] : -data[offset]);
  7591. offset++;
  7592. } else {
  7593. if (same)
  7594. gl.ys.push(0);
  7595. else {
  7596. gl.ys.push(bin.readShort(data, offset));
  7597. offset += 2;
  7598. }
  7599. }
  7600. }
  7601. var x = 0, y = 0;
  7602. for (var i = 0; i < crdnum; i++) {
  7603. x += gl.xs[i];
  7604. y += gl.ys[i];
  7605. gl.xs[i] = x;
  7606. gl.ys[i] = y;
  7607. }
  7608. } else {
  7609. var ARG_1_AND_2_ARE_WORDS = 1 << 0;
  7610. var ARGS_ARE_XY_VALUES = 1 << 1;
  7611. var WE_HAVE_A_SCALE = 1 << 3;
  7612. var MORE_COMPONENTS = 1 << 5;
  7613. var WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6;
  7614. var WE_HAVE_A_TWO_BY_TWO = 1 << 7;
  7615. var WE_HAVE_INSTRUCTIONS = 1 << 8;
  7616. gl.parts = [];
  7617. var flags;
  7618. do {
  7619. flags = bin.readUshort(data, offset);
  7620. offset += 2;
  7621. var part = { m: { a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 }, p1: -1, p2: -1 };
  7622. gl.parts.push(part);
  7623. part.glyphIndex = bin.readUshort(data, offset);
  7624. offset += 2;
  7625. if (flags & ARG_1_AND_2_ARE_WORDS) {
  7626. var arg1 = bin.readShort(data, offset);
  7627. offset += 2;
  7628. var arg2 = bin.readShort(data, offset);
  7629. offset += 2;
  7630. } else {
  7631. var arg1 = bin.readInt8(data, offset);
  7632. offset++;
  7633. var arg2 = bin.readInt8(data, offset);
  7634. offset++;
  7635. }
  7636. if (flags & ARGS_ARE_XY_VALUES) {
  7637. part.m.tx = arg1;
  7638. part.m.ty = arg2;
  7639. } else {
  7640. part.p1 = arg1;
  7641. part.p2 = arg2;
  7642. }
  7643. if (flags & WE_HAVE_A_SCALE) {
  7644. part.m.a = part.m.d = bin.readF2dot14(data, offset);
  7645. offset += 2;
  7646. } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {
  7647. part.m.a = bin.readF2dot14(data, offset);
  7648. offset += 2;
  7649. part.m.d = bin.readF2dot14(data, offset);
  7650. offset += 2;
  7651. } else if (flags & WE_HAVE_A_TWO_BY_TWO) {
  7652. part.m.a = bin.readF2dot14(data, offset);
  7653. offset += 2;
  7654. part.m.b = bin.readF2dot14(data, offset);
  7655. offset += 2;
  7656. part.m.c = bin.readF2dot14(data, offset);
  7657. offset += 2;
  7658. part.m.d = bin.readF2dot14(data, offset);
  7659. offset += 2;
  7660. }
  7661. } while (flags & MORE_COMPONENTS);
  7662. if (flags & WE_HAVE_INSTRUCTIONS) {
  7663. var numInstr = bin.readUshort(data, offset);
  7664. offset += 2;
  7665. gl.instr = [];
  7666. for (var i = 0; i < numInstr; i++) {
  7667. gl.instr.push(data[offset]);
  7668. offset++;
  7669. }
  7670. }
  7671. }
  7672. return gl;
  7673. };
  7674. Typr.GPOS = {};
  7675. Typr.GPOS.parse = function(data, offset, length, font) {
  7676. return Typr._lctf.parse(data, offset, length, font, Typr.GPOS.subt);
  7677. };
  7678. Typr.GPOS.subt = function(data, ltype, offset) {
  7679. if (ltype != 2)
  7680. return null;
  7681. var bin = Typr._bin, offset0 = offset, tab = {};
  7682. tab.format = bin.readUshort(data, offset);
  7683. offset += 2;
  7684. var covOff = bin.readUshort(data, offset);
  7685. offset += 2;
  7686. tab.coverage = Typr._lctf.readCoverage(data, covOff + offset0);
  7687. tab.valFmt1 = bin.readUshort(data, offset);
  7688. offset += 2;
  7689. tab.valFmt2 = bin.readUshort(data, offset);
  7690. offset += 2;
  7691. var ones1 = Typr._lctf.numOfOnes(tab.valFmt1);
  7692. var ones2 = Typr._lctf.numOfOnes(tab.valFmt2);
  7693. if (tab.format == 1) {
  7694. tab.pairsets = [];
  7695. var count = bin.readUshort(data, offset);
  7696. offset += 2;
  7697. for (var i = 0; i < count; i++) {
  7698. var psoff = bin.readUshort(data, offset);
  7699. offset += 2;
  7700. psoff += offset0;
  7701. var pvcount = bin.readUshort(data, psoff);
  7702. psoff += 2;
  7703. var arr = [];
  7704. for (var j = 0; j < pvcount; j++) {
  7705. var gid2 = bin.readUshort(data, psoff);
  7706. psoff += 2;
  7707. var value1, value2;
  7708. if (tab.valFmt1 != 0) {
  7709. value1 = Typr._lctf.readValueRecord(data, psoff, tab.valFmt1);
  7710. psoff += ones1 * 2;
  7711. }
  7712. if (tab.valFmt2 != 0) {
  7713. value2 = Typr._lctf.readValueRecord(data, psoff, tab.valFmt2);
  7714. psoff += ones2 * 2;
  7715. }
  7716. arr.push({ gid2, val1: value1, val2: value2 });
  7717. }
  7718. tab.pairsets.push(arr);
  7719. }
  7720. }
  7721. if (tab.format == 2) {
  7722. var classDef1 = bin.readUshort(data, offset);
  7723. offset += 2;
  7724. var classDef2 = bin.readUshort(data, offset);
  7725. offset += 2;
  7726. var class1Count = bin.readUshort(data, offset);
  7727. offset += 2;
  7728. var class2Count = bin.readUshort(data, offset);
  7729. offset += 2;
  7730. tab.classDef1 = Typr._lctf.readClassDef(data, offset0 + classDef1);
  7731. tab.classDef2 = Typr._lctf.readClassDef(data, offset0 + classDef2);
  7732. tab.matrix = [];
  7733. for (var i = 0; i < class1Count; i++) {
  7734. var row = [];
  7735. for (var j = 0; j < class2Count; j++) {
  7736. var value1 = null, value2 = null;
  7737. if (tab.valFmt1 != 0) {
  7738. value1 = Typr._lctf.readValueRecord(data, offset, tab.valFmt1);
  7739. offset += ones1 * 2;
  7740. }
  7741. if (tab.valFmt2 != 0) {
  7742. value2 = Typr._lctf.readValueRecord(data, offset, tab.valFmt2);
  7743. offset += ones2 * 2;
  7744. }
  7745. row.push({ val1: value1, val2: value2 });
  7746. }
  7747. tab.matrix.push(row);
  7748. }
  7749. }
  7750. return tab;
  7751. };
  7752. Typr.GSUB = {};
  7753. Typr.GSUB.parse = function(data, offset, length, font) {
  7754. return Typr._lctf.parse(data, offset, length, font, Typr.GSUB.subt);
  7755. };
  7756. Typr.GSUB.subt = function(data, ltype, offset) {
  7757. var bin = Typr._bin, offset0 = offset, tab = {};
  7758. if (ltype != 1 && ltype != 4 && ltype != 5)
  7759. return null;
  7760. tab.fmt = bin.readUshort(data, offset);
  7761. offset += 2;
  7762. var covOff = bin.readUshort(data, offset);
  7763. offset += 2;
  7764. tab.coverage = Typr._lctf.readCoverage(data, covOff + offset0);
  7765. if (ltype == 1) {
  7766. if (tab.fmt == 1) {
  7767. tab.delta = bin.readShort(data, offset);
  7768. offset += 2;
  7769. } else if (tab.fmt == 2) {
  7770. var cnt = bin.readUshort(data, offset);
  7771. offset += 2;
  7772. tab.newg = bin.readUshorts(data, offset, cnt);
  7773. offset += tab.newg.length * 2;
  7774. }
  7775. } else if (ltype == 4) {
  7776. tab.vals = [];
  7777. var cnt = bin.readUshort(data, offset);
  7778. offset += 2;
  7779. for (var i = 0; i < cnt; i++) {
  7780. var loff = bin.readUshort(data, offset);
  7781. offset += 2;
  7782. tab.vals.push(Typr.GSUB.readLigatureSet(data, offset0 + loff));
  7783. }
  7784. } else if (ltype == 5) {
  7785. if (tab.fmt == 2) {
  7786. var cDefOffset = bin.readUshort(data, offset);
  7787. offset += 2;
  7788. tab.cDef = Typr._lctf.readClassDef(data, offset0 + cDefOffset);
  7789. tab.scset = [];
  7790. var subClassSetCount = bin.readUshort(data, offset);
  7791. offset += 2;
  7792. for (var i = 0; i < subClassSetCount; i++) {
  7793. var scsOff = bin.readUshort(data, offset);
  7794. offset += 2;
  7795. tab.scset.push(scsOff == 0 ? null : Typr.GSUB.readSubClassSet(data, offset0 + scsOff));
  7796. }
  7797. } else
  7798. console.log("unknown table format", tab.fmt);
  7799. }
  7800. return tab;
  7801. };
  7802. Typr.GSUB.readSubClassSet = function(data, offset) {
  7803. var rUs = Typr._bin.readUshort, offset0 = offset, lset = [];
  7804. var cnt = rUs(data, offset);
  7805. offset += 2;
  7806. for (var i = 0; i < cnt; i++) {
  7807. var loff = rUs(data, offset);
  7808. offset += 2;
  7809. lset.push(Typr.GSUB.readSubClassRule(data, offset0 + loff));
  7810. }
  7811. return lset;
  7812. };
  7813. Typr.GSUB.readSubClassRule = function(data, offset) {
  7814. var rUs = Typr._bin.readUshort, rule = {};
  7815. var gcount = rUs(data, offset);
  7816. offset += 2;
  7817. var scount = rUs(data, offset);
  7818. offset += 2;
  7819. rule.input = [];
  7820. for (var i = 0; i < gcount - 1; i++) {
  7821. rule.input.push(rUs(data, offset));
  7822. offset += 2;
  7823. }
  7824. rule.substLookupRecords = Typr.GSUB.readSubstLookupRecords(data, offset, scount);
  7825. return rule;
  7826. };
  7827. Typr.GSUB.readSubstLookupRecords = function(data, offset, cnt) {
  7828. var rUs = Typr._bin.readUshort;
  7829. var out = [];
  7830. for (var i = 0; i < cnt; i++) {
  7831. out.push(rUs(data, offset), rUs(data, offset + 2));
  7832. offset += 4;
  7833. }
  7834. return out;
  7835. };
  7836. Typr.GSUB.readChainSubClassSet = function(data, offset) {
  7837. var bin = Typr._bin, offset0 = offset, lset = [];
  7838. var cnt = bin.readUshort(data, offset);
  7839. offset += 2;
  7840. for (var i = 0; i < cnt; i++) {
  7841. var loff = bin.readUshort(data, offset);
  7842. offset += 2;
  7843. lset.push(Typr.GSUB.readChainSubClassRule(data, offset0 + loff));
  7844. }
  7845. return lset;
  7846. };
  7847. Typr.GSUB.readChainSubClassRule = function(data, offset) {
  7848. var bin = Typr._bin, rule = {};
  7849. var pps = ["backtrack", "input", "lookahead"];
  7850. for (var pi = 0; pi < pps.length; pi++) {
  7851. var cnt = bin.readUshort(data, offset);
  7852. offset += 2;
  7853. if (pi == 1)
  7854. cnt--;
  7855. rule[pps[pi]] = bin.readUshorts(data, offset, cnt);
  7856. offset += rule[pps[pi]].length * 2;
  7857. }
  7858. var cnt = bin.readUshort(data, offset);
  7859. offset += 2;
  7860. rule.subst = bin.readUshorts(data, offset, cnt * 2);
  7861. offset += rule.subst.length * 2;
  7862. return rule;
  7863. };
  7864. Typr.GSUB.readLigatureSet = function(data, offset) {
  7865. var bin = Typr._bin, offset0 = offset, lset = [];
  7866. var lcnt = bin.readUshort(data, offset);
  7867. offset += 2;
  7868. for (var j = 0; j < lcnt; j++) {
  7869. var loff = bin.readUshort(data, offset);
  7870. offset += 2;
  7871. lset.push(Typr.GSUB.readLigature(data, offset0 + loff));
  7872. }
  7873. return lset;
  7874. };
  7875. Typr.GSUB.readLigature = function(data, offset) {
  7876. var bin = Typr._bin, lig = { chain: [] };
  7877. lig.nglyph = bin.readUshort(data, offset);
  7878. offset += 2;
  7879. var ccnt = bin.readUshort(data, offset);
  7880. offset += 2;
  7881. for (var k = 0; k < ccnt - 1; k++) {
  7882. lig.chain.push(bin.readUshort(data, offset));
  7883. offset += 2;
  7884. }
  7885. return lig;
  7886. };
  7887. Typr.head = {};
  7888. Typr.head.parse = function(data, offset, length) {
  7889. var bin = Typr._bin;
  7890. var obj = {};
  7891. bin.readFixed(data, offset);
  7892. offset += 4;
  7893. obj.fontRevision = bin.readFixed(data, offset);
  7894. offset += 4;
  7895. bin.readUint(data, offset);
  7896. offset += 4;
  7897. bin.readUint(data, offset);
  7898. offset += 4;
  7899. obj.flags = bin.readUshort(data, offset);
  7900. offset += 2;
  7901. obj.unitsPerEm = bin.readUshort(data, offset);
  7902. offset += 2;
  7903. obj.created = bin.readUint64(data, offset);
  7904. offset += 8;
  7905. obj.modified = bin.readUint64(data, offset);
  7906. offset += 8;
  7907. obj.xMin = bin.readShort(data, offset);
  7908. offset += 2;
  7909. obj.yMin = bin.readShort(data, offset);
  7910. offset += 2;
  7911. obj.xMax = bin.readShort(data, offset);
  7912. offset += 2;
  7913. obj.yMax = bin.readShort(data, offset);
  7914. offset += 2;
  7915. obj.macStyle = bin.readUshort(data, offset);
  7916. offset += 2;
  7917. obj.lowestRecPPEM = bin.readUshort(data, offset);
  7918. offset += 2;
  7919. obj.fontDirectionHint = bin.readShort(data, offset);
  7920. offset += 2;
  7921. obj.indexToLocFormat = bin.readShort(data, offset);
  7922. offset += 2;
  7923. obj.glyphDataFormat = bin.readShort(data, offset);
  7924. offset += 2;
  7925. return obj;
  7926. };
  7927. Typr.hhea = {};
  7928. Typr.hhea.parse = function(data, offset, length) {
  7929. var bin = Typr._bin;
  7930. var obj = {};
  7931. bin.readFixed(data, offset);
  7932. offset += 4;
  7933. obj.ascender = bin.readShort(data, offset);
  7934. offset += 2;
  7935. obj.descender = bin.readShort(data, offset);
  7936. offset += 2;
  7937. obj.lineGap = bin.readShort(data, offset);
  7938. offset += 2;
  7939. obj.advanceWidthMax = bin.readUshort(data, offset);
  7940. offset += 2;
  7941. obj.minLeftSideBearing = bin.readShort(data, offset);
  7942. offset += 2;
  7943. obj.minRightSideBearing = bin.readShort(data, offset);
  7944. offset += 2;
  7945. obj.xMaxExtent = bin.readShort(data, offset);
  7946. offset += 2;
  7947. obj.caretSlopeRise = bin.readShort(data, offset);
  7948. offset += 2;
  7949. obj.caretSlopeRun = bin.readShort(data, offset);
  7950. offset += 2;
  7951. obj.caretOffset = bin.readShort(data, offset);
  7952. offset += 2;
  7953. offset += 4 * 2;
  7954. obj.metricDataFormat = bin.readShort(data, offset);
  7955. offset += 2;
  7956. obj.numberOfHMetrics = bin.readUshort(data, offset);
  7957. offset += 2;
  7958. return obj;
  7959. };
  7960. Typr.hmtx = {};
  7961. Typr.hmtx.parse = function(data, offset, length, font) {
  7962. var bin = Typr._bin;
  7963. var obj = {};
  7964. obj.aWidth = [];
  7965. obj.lsBearing = [];
  7966. var aw = 0, lsb = 0;
  7967. for (var i = 0; i < font.maxp.numGlyphs; i++) {
  7968. if (i < font.hhea.numberOfHMetrics) {
  7969. aw = bin.readUshort(data, offset);
  7970. offset += 2;
  7971. lsb = bin.readShort(data, offset);
  7972. offset += 2;
  7973. }
  7974. obj.aWidth.push(aw);
  7975. obj.lsBearing.push(lsb);
  7976. }
  7977. return obj;
  7978. };
  7979. Typr.kern = {};
  7980. Typr.kern.parse = function(data, offset, length, font) {
  7981. var bin = Typr._bin;
  7982. var version = bin.readUshort(data, offset);
  7983. offset += 2;
  7984. if (version == 1)
  7985. return Typr.kern.parseV1(data, offset - 2, length, font);
  7986. var nTables = bin.readUshort(data, offset);
  7987. offset += 2;
  7988. var map = { glyph1: [], rval: [] };
  7989. for (var i = 0; i < nTables; i++) {
  7990. offset += 2;
  7991. var length = bin.readUshort(data, offset);
  7992. offset += 2;
  7993. var coverage = bin.readUshort(data, offset);
  7994. offset += 2;
  7995. var format = coverage >>> 8;
  7996. format &= 15;
  7997. if (format == 0)
  7998. offset = Typr.kern.readFormat0(data, offset, map);
  7999. else
  8000. throw "unknown kern table format: " + format;
  8001. }
  8002. return map;
  8003. };
  8004. Typr.kern.parseV1 = function(data, offset, length, font) {
  8005. var bin = Typr._bin;
  8006. bin.readFixed(data, offset);
  8007. offset += 4;
  8008. var nTables = bin.readUint(data, offset);
  8009. offset += 4;
  8010. var map = { glyph1: [], rval: [] };
  8011. for (var i = 0; i < nTables; i++) {
  8012. bin.readUint(data, offset);
  8013. offset += 4;
  8014. var coverage = bin.readUshort(data, offset);
  8015. offset += 2;
  8016. bin.readUshort(data, offset);
  8017. offset += 2;
  8018. var format = coverage >>> 8;
  8019. format &= 15;
  8020. if (format == 0)
  8021. offset = Typr.kern.readFormat0(data, offset, map);
  8022. else
  8023. throw "unknown kern table format: " + format;
  8024. }
  8025. return map;
  8026. };
  8027. Typr.kern.readFormat0 = function(data, offset, map) {
  8028. var bin = Typr._bin;
  8029. var pleft = -1;
  8030. var nPairs = bin.readUshort(data, offset);
  8031. offset += 2;
  8032. bin.readUshort(data, offset);
  8033. offset += 2;
  8034. bin.readUshort(data, offset);
  8035. offset += 2;
  8036. bin.readUshort(data, offset);
  8037. offset += 2;
  8038. for (var j = 0; j < nPairs; j++) {
  8039. var left = bin.readUshort(data, offset);
  8040. offset += 2;
  8041. var right = bin.readUshort(data, offset);
  8042. offset += 2;
  8043. var value = bin.readShort(data, offset);
  8044. offset += 2;
  8045. if (left != pleft) {
  8046. map.glyph1.push(left);
  8047. map.rval.push({ glyph2: [], vals: [] });
  8048. }
  8049. var rval = map.rval[map.rval.length - 1];
  8050. rval.glyph2.push(right);
  8051. rval.vals.push(value);
  8052. pleft = left;
  8053. }
  8054. return offset;
  8055. };
  8056. Typr.loca = {};
  8057. Typr.loca.parse = function(data, offset, length, font) {
  8058. var bin = Typr._bin;
  8059. var obj = [];
  8060. var ver = font.head.indexToLocFormat;
  8061. var len = font.maxp.numGlyphs + 1;
  8062. if (ver == 0)
  8063. for (var i = 0; i < len; i++)
  8064. obj.push(bin.readUshort(data, offset + (i << 1)) << 1);
  8065. if (ver == 1)
  8066. for (var i = 0; i < len; i++)
  8067. obj.push(bin.readUint(data, offset + (i << 2)));
  8068. return obj;
  8069. };
  8070. Typr.maxp = {};
  8071. Typr.maxp.parse = function(data, offset, length) {
  8072. var bin = Typr._bin;
  8073. var obj = {};
  8074. var ver = bin.readUint(data, offset);
  8075. offset += 4;
  8076. obj.numGlyphs = bin.readUshort(data, offset);
  8077. offset += 2;
  8078. if (ver == 65536) {
  8079. obj.maxPoints = bin.readUshort(data, offset);
  8080. offset += 2;
  8081. obj.maxContours = bin.readUshort(data, offset);
  8082. offset += 2;
  8083. obj.maxCompositePoints = bin.readUshort(data, offset);
  8084. offset += 2;
  8085. obj.maxCompositeContours = bin.readUshort(data, offset);
  8086. offset += 2;
  8087. obj.maxZones = bin.readUshort(data, offset);
  8088. offset += 2;
  8089. obj.maxTwilightPoints = bin.readUshort(data, offset);
  8090. offset += 2;
  8091. obj.maxStorage = bin.readUshort(data, offset);
  8092. offset += 2;
  8093. obj.maxFunctionDefs = bin.readUshort(data, offset);
  8094. offset += 2;
  8095. obj.maxInstructionDefs = bin.readUshort(data, offset);
  8096. offset += 2;
  8097. obj.maxStackElements = bin.readUshort(data, offset);
  8098. offset += 2;
  8099. obj.maxSizeOfInstructions = bin.readUshort(data, offset);
  8100. offset += 2;
  8101. obj.maxComponentElements = bin.readUshort(data, offset);
  8102. offset += 2;
  8103. obj.maxComponentDepth = bin.readUshort(data, offset);
  8104. offset += 2;
  8105. }
  8106. return obj;
  8107. };
  8108. Typr.name = {};
  8109. Typr.name.parse = function(data, offset, length) {
  8110. var bin = Typr._bin;
  8111. var obj = {};
  8112. bin.readUshort(data, offset);
  8113. offset += 2;
  8114. var count = bin.readUshort(data, offset);
  8115. offset += 2;
  8116. bin.readUshort(data, offset);
  8117. offset += 2;
  8118. var offset0 = offset;
  8119. for (var i = 0; i < count; i++) {
  8120. var platformID = bin.readUshort(data, offset);
  8121. offset += 2;
  8122. var encodingID = bin.readUshort(data, offset);
  8123. offset += 2;
  8124. var languageID = bin.readUshort(data, offset);
  8125. offset += 2;
  8126. var nameID = bin.readUshort(data, offset);
  8127. offset += 2;
  8128. var length = bin.readUshort(data, offset);
  8129. offset += 2;
  8130. var noffset = bin.readUshort(data, offset);
  8131. offset += 2;
  8132. var plat = "p" + platformID;
  8133. if (obj[plat] == null)
  8134. obj[plat] = {};
  8135. 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"];
  8136. var cname = names[nameID];
  8137. var soff = offset0 + count * 12 + noffset;
  8138. var str;
  8139. if (platformID == 0)
  8140. str = bin.readUnicode(data, soff, length / 2);
  8141. else if (platformID == 3 && encodingID == 0)
  8142. str = bin.readUnicode(data, soff, length / 2);
  8143. else if (encodingID == 0)
  8144. str = bin.readASCII(data, soff, length);
  8145. else if (encodingID == 1)
  8146. str = bin.readUnicode(data, soff, length / 2);
  8147. else if (encodingID == 3)
  8148. str = bin.readUnicode(data, soff, length / 2);
  8149. else if (platformID == 1) {
  8150. str = bin.readASCII(data, soff, length);
  8151. console.log("reading unknown MAC encoding " + encodingID + " as ASCII");
  8152. } else
  8153. throw "unknown encoding " + encodingID + ", platformID: " + platformID;
  8154. obj[plat][cname] = str;
  8155. obj[plat]._lang = languageID;
  8156. }
  8157. for (var p in obj)
  8158. if (obj[p].postScriptName != null && obj[p]._lang == 1033)
  8159. return obj[p];
  8160. for (var p in obj)
  8161. if (obj[p].postScriptName != null && obj[p]._lang == 3084)
  8162. return obj[p];
  8163. for (var p in obj)
  8164. if (obj[p].postScriptName != null)
  8165. return obj[p];
  8166. var tname;
  8167. for (var p in obj) {
  8168. tname = p;
  8169. break;
  8170. }
  8171. console.log("returning name table with languageID " + obj[tname]._lang);
  8172. return obj[tname];
  8173. };
  8174. Typr["OS/2"] = {};
  8175. Typr["OS/2"].parse = function(data, offset, length) {
  8176. var bin = Typr._bin;
  8177. var ver = bin.readUshort(data, offset);
  8178. offset += 2;
  8179. var obj = {};
  8180. if (ver == 0)
  8181. Typr["OS/2"].version0(data, offset, obj);
  8182. else if (ver == 1)
  8183. Typr["OS/2"].version1(data, offset, obj);
  8184. else if (ver == 2 || ver == 3 || ver == 4)
  8185. Typr["OS/2"].version2(data, offset, obj);
  8186. else if (ver == 5)
  8187. Typr["OS/2"].version5(data, offset, obj);
  8188. else
  8189. throw "unknown OS/2 table version: " + ver;
  8190. return obj;
  8191. };
  8192. Typr["OS/2"].version0 = function(data, offset, obj) {
  8193. var bin = Typr._bin;
  8194. obj.xAvgCharWidth = bin.readShort(data, offset);
  8195. offset += 2;
  8196. obj.usWeightClass = bin.readUshort(data, offset);
  8197. offset += 2;
  8198. obj.usWidthClass = bin.readUshort(data, offset);
  8199. offset += 2;
  8200. obj.fsType = bin.readUshort(data, offset);
  8201. offset += 2;
  8202. obj.ySubscriptXSize = bin.readShort(data, offset);
  8203. offset += 2;
  8204. obj.ySubscriptYSize = bin.readShort(data, offset);
  8205. offset += 2;
  8206. obj.ySubscriptXOffset = bin.readShort(data, offset);
  8207. offset += 2;
  8208. obj.ySubscriptYOffset = bin.readShort(data, offset);
  8209. offset += 2;
  8210. obj.ySuperscriptXSize = bin.readShort(data, offset);
  8211. offset += 2;
  8212. obj.ySuperscriptYSize = bin.readShort(data, offset);
  8213. offset += 2;
  8214. obj.ySuperscriptXOffset = bin.readShort(data, offset);
  8215. offset += 2;
  8216. obj.ySuperscriptYOffset = bin.readShort(data, offset);
  8217. offset += 2;
  8218. obj.yStrikeoutSize = bin.readShort(data, offset);
  8219. offset += 2;
  8220. obj.yStrikeoutPosition = bin.readShort(data, offset);
  8221. offset += 2;
  8222. obj.sFamilyClass = bin.readShort(data, offset);
  8223. offset += 2;
  8224. obj.panose = bin.readBytes(data, offset, 10);
  8225. offset += 10;
  8226. obj.ulUnicodeRange1 = bin.readUint(data, offset);
  8227. offset += 4;
  8228. obj.ulUnicodeRange2 = bin.readUint(data, offset);
  8229. offset += 4;
  8230. obj.ulUnicodeRange3 = bin.readUint(data, offset);
  8231. offset += 4;
  8232. obj.ulUnicodeRange4 = bin.readUint(data, offset);
  8233. offset += 4;
  8234. obj.achVendID = [bin.readInt8(data, offset), bin.readInt8(data, offset + 1), bin.readInt8(data, offset + 2), bin.readInt8(data, offset + 3)];
  8235. offset += 4;
  8236. obj.fsSelection = bin.readUshort(data, offset);
  8237. offset += 2;
  8238. obj.usFirstCharIndex = bin.readUshort(data, offset);
  8239. offset += 2;
  8240. obj.usLastCharIndex = bin.readUshort(data, offset);
  8241. offset += 2;
  8242. obj.sTypoAscender = bin.readShort(data, offset);
  8243. offset += 2;
  8244. obj.sTypoDescender = bin.readShort(data, offset);
  8245. offset += 2;
  8246. obj.sTypoLineGap = bin.readShort(data, offset);
  8247. offset += 2;
  8248. obj.usWinAscent = bin.readUshort(data, offset);
  8249. offset += 2;
  8250. obj.usWinDescent = bin.readUshort(data, offset);
  8251. offset += 2;
  8252. return offset;
  8253. };
  8254. Typr["OS/2"].version1 = function(data, offset, obj) {
  8255. var bin = Typr._bin;
  8256. offset = Typr["OS/2"].version0(data, offset, obj);
  8257. obj.ulCodePageRange1 = bin.readUint(data, offset);
  8258. offset += 4;
  8259. obj.ulCodePageRange2 = bin.readUint(data, offset);
  8260. offset += 4;
  8261. return offset;
  8262. };
  8263. Typr["OS/2"].version2 = function(data, offset, obj) {
  8264. var bin = Typr._bin;
  8265. offset = Typr["OS/2"].version1(data, offset, obj);
  8266. obj.sxHeight = bin.readShort(data, offset);
  8267. offset += 2;
  8268. obj.sCapHeight = bin.readShort(data, offset);
  8269. offset += 2;
  8270. obj.usDefault = bin.readUshort(data, offset);
  8271. offset += 2;
  8272. obj.usBreak = bin.readUshort(data, offset);
  8273. offset += 2;
  8274. obj.usMaxContext = bin.readUshort(data, offset);
  8275. offset += 2;
  8276. return offset;
  8277. };
  8278. Typr["OS/2"].version5 = function(data, offset, obj) {
  8279. var bin = Typr._bin;
  8280. offset = Typr["OS/2"].version2(data, offset, obj);
  8281. obj.usLowerOpticalPointSize = bin.readUshort(data, offset);
  8282. offset += 2;
  8283. obj.usUpperOpticalPointSize = bin.readUshort(data, offset);
  8284. offset += 2;
  8285. return offset;
  8286. };
  8287. Typr.post = {};
  8288. Typr.post.parse = function(data, offset, length) {
  8289. var bin = Typr._bin;
  8290. var obj = {};
  8291. obj.version = bin.readFixed(data, offset);
  8292. offset += 4;
  8293. obj.italicAngle = bin.readFixed(data, offset);
  8294. offset += 4;
  8295. obj.underlinePosition = bin.readShort(data, offset);
  8296. offset += 2;
  8297. obj.underlineThickness = bin.readShort(data, offset);
  8298. offset += 2;
  8299. return obj;
  8300. };
  8301. Typr.SVG = {};
  8302. Typr.SVG.parse = function(data, offset, length) {
  8303. var bin = Typr._bin;
  8304. var obj = { entries: [] };
  8305. var offset0 = offset;
  8306. bin.readUshort(data, offset);
  8307. offset += 2;
  8308. var svgDocIndexOffset = bin.readUint(data, offset);
  8309. offset += 4;
  8310. bin.readUint(data, offset);
  8311. offset += 4;
  8312. offset = svgDocIndexOffset + offset0;
  8313. var numEntries = bin.readUshort(data, offset);
  8314. offset += 2;
  8315. for (var i = 0; i < numEntries; i++) {
  8316. var startGlyphID = bin.readUshort(data, offset);
  8317. offset += 2;
  8318. var endGlyphID = bin.readUshort(data, offset);
  8319. offset += 2;
  8320. var svgDocOffset = bin.readUint(data, offset);
  8321. offset += 4;
  8322. var svgDocLength = bin.readUint(data, offset);
  8323. offset += 4;
  8324. var sbuf = new Uint8Array(data.buffer, offset0 + svgDocOffset + svgDocIndexOffset, svgDocLength);
  8325. var svg = bin.readUTF8(sbuf, 0, sbuf.length);
  8326. for (var f = startGlyphID; f <= endGlyphID; f++) {
  8327. obj.entries[f] = svg;
  8328. }
  8329. }
  8330. return obj;
  8331. };
  8332. Typr.SVG.toPath = function(str) {
  8333. var pth = { cmds: [], crds: [] };
  8334. if (str == null)
  8335. return pth;
  8336. var prsr = new DOMParser();
  8337. var doc = prsr["parseFromString"](str, "image/svg+xml");
  8338. var svg = doc.firstChild;
  8339. while (svg.tagName != "svg")
  8340. svg = svg.nextSibling;
  8341. var vb = svg.getAttribute("viewBox");
  8342. if (vb)
  8343. vb = vb.trim().split(" ").map(parseFloat);
  8344. else
  8345. vb = [0, 0, 1e3, 1e3];
  8346. Typr.SVG._toPath(svg.children, pth);
  8347. for (var i = 0; i < pth.crds.length; i += 2) {
  8348. var x = pth.crds[i], y = pth.crds[i + 1];
  8349. x -= vb[0];
  8350. y -= vb[1];
  8351. y = -y;
  8352. pth.crds[i] = x;
  8353. pth.crds[i + 1] = y;
  8354. }
  8355. return pth;
  8356. };
  8357. Typr.SVG._toPath = function(nds, pth, fill) {
  8358. for (var ni = 0; ni < nds.length; ni++) {
  8359. var nd = nds[ni], tn = nd.tagName;
  8360. var cfl = nd.getAttribute("fill");
  8361. if (cfl == null)
  8362. cfl = fill;
  8363. if (tn == "g")
  8364. Typr.SVG._toPath(nd.children, pth, cfl);
  8365. else if (tn == "path") {
  8366. pth.cmds.push(cfl ? cfl : "#000000");
  8367. var d = nd.getAttribute("d");
  8368. var toks = Typr.SVG._tokens(d);
  8369. Typr.SVG._toksToPath(toks, pth);
  8370. pth.cmds.push("X");
  8371. } else if (tn == "defs")
  8372. ;
  8373. else
  8374. console.log(tn, nd);
  8375. }
  8376. };
  8377. Typr.SVG._tokens = function(d) {
  8378. var ts = [], off = 0, rn = false, cn = "";
  8379. while (off < d.length) {
  8380. var cc = d.charCodeAt(off), ch = d.charAt(off);
  8381. off++;
  8382. var isNum = 48 <= cc && cc <= 57 || ch == "." || ch == "-";
  8383. if (rn) {
  8384. if (ch == "-") {
  8385. ts.push(parseFloat(cn));
  8386. cn = ch;
  8387. } else if (isNum)
  8388. cn += ch;
  8389. else {
  8390. ts.push(parseFloat(cn));
  8391. if (ch != "," && ch != " ")
  8392. ts.push(ch);
  8393. rn = false;
  8394. }
  8395. } else {
  8396. if (isNum) {
  8397. cn = ch;
  8398. rn = true;
  8399. } else if (ch != "," && ch != " ")
  8400. ts.push(ch);
  8401. }
  8402. }
  8403. if (rn)
  8404. ts.push(parseFloat(cn));
  8405. return ts;
  8406. };
  8407. Typr.SVG._toksToPath = function(ts, pth) {
  8408. var i = 0, x = 0, y = 0, ox = 0, oy = 0;
  8409. var pc = { M: 2, L: 2, H: 1, V: 1, S: 4, C: 6 };
  8410. var cmds = pth.cmds, crds = pth.crds;
  8411. while (i < ts.length) {
  8412. var cmd = ts[i];
  8413. i++;
  8414. if (cmd == "z") {
  8415. cmds.push("Z");
  8416. x = ox;
  8417. y = oy;
  8418. } else {
  8419. var cmu = cmd.toUpperCase();
  8420. var ps = pc[cmu], reps = Typr.SVG._reps(ts, i, ps);
  8421. for (var j = 0; j < reps; j++) {
  8422. var xi = 0, yi = 0;
  8423. if (cmd != cmu) {
  8424. xi = x;
  8425. yi = y;
  8426. }
  8427. if (cmu == "M") {
  8428. x = xi + ts[i++];
  8429. y = yi + ts[i++];
  8430. cmds.push("M");
  8431. crds.push(x, y);
  8432. ox = x;
  8433. oy = y;
  8434. } else if (cmu == "L") {
  8435. x = xi + ts[i++];
  8436. y = yi + ts[i++];
  8437. cmds.push("L");
  8438. crds.push(x, y);
  8439. } else if (cmu == "H") {
  8440. x = xi + ts[i++];
  8441. cmds.push("L");
  8442. crds.push(x, y);
  8443. } else if (cmu == "V") {
  8444. y = yi + ts[i++];
  8445. cmds.push("L");
  8446. crds.push(x, y);
  8447. } else if (cmu == "C") {
  8448. 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++];
  8449. cmds.push("C");
  8450. crds.push(x1, y1, x2, y2, x3, y3);
  8451. x = x3;
  8452. y = y3;
  8453. } else if (cmu == "S") {
  8454. var co = Math.max(crds.length - 4, 0);
  8455. var x1 = x + x - crds[co], y1 = y + y - crds[co + 1];
  8456. var x2 = xi + ts[i++], y2 = yi + ts[i++], x3 = xi + ts[i++], y3 = yi + ts[i++];
  8457. cmds.push("C");
  8458. crds.push(x1, y1, x2, y2, x3, y3);
  8459. x = x3;
  8460. y = y3;
  8461. } else
  8462. console.log("Unknown SVG command " + cmd);
  8463. }
  8464. }
  8465. }
  8466. };
  8467. Typr.SVG._reps = function(ts, off, ps) {
  8468. var i = off;
  8469. while (i < ts.length) {
  8470. if (typeof ts[i] == "string")
  8471. break;
  8472. i += ps;
  8473. }
  8474. return (i - off) / ps;
  8475. };
  8476. if (Typr == null)
  8477. Typr = {};
  8478. if (Typr.U == null)
  8479. Typr.U = {};
  8480. Typr.U.codeToGlyph = function(font, code) {
  8481. var cmap = font.cmap;
  8482. var tind = -1;
  8483. if (cmap.p0e4 != null)
  8484. tind = cmap.p0e4;
  8485. else if (cmap.p3e1 != null)
  8486. tind = cmap.p3e1;
  8487. else if (cmap.p1e0 != null)
  8488. tind = cmap.p1e0;
  8489. if (tind == -1)
  8490. throw "no familiar platform and encoding!";
  8491. var tab = cmap.tables[tind];
  8492. if (tab.format == 0) {
  8493. if (code >= tab.map.length)
  8494. return 0;
  8495. return tab.map[code];
  8496. } else if (tab.format == 4) {
  8497. var sind = -1;
  8498. for (var i = 0; i < tab.endCount.length; i++)
  8499. if (code <= tab.endCount[i]) {
  8500. sind = i;
  8501. break;
  8502. }
  8503. if (sind == -1)
  8504. return 0;
  8505. if (tab.startCount[sind] > code)
  8506. return 0;
  8507. var gli = 0;
  8508. if (tab.idRangeOffset[sind] != 0)
  8509. gli = tab.glyphIdArray[code - tab.startCount[sind] + (tab.idRangeOffset[sind] >> 1) - (tab.idRangeOffset.length - sind)];
  8510. else
  8511. gli = code + tab.idDelta[sind];
  8512. return gli & 65535;
  8513. } else if (tab.format == 12) {
  8514. if (code > tab.groups[tab.groups.length - 1][1])
  8515. return 0;
  8516. for (var i = 0; i < tab.groups.length; i++) {
  8517. var grp = tab.groups[i];
  8518. if (grp[0] <= code && code <= grp[1])
  8519. return grp[2] + (code - grp[0]);
  8520. }
  8521. return 0;
  8522. } else
  8523. throw "unknown cmap table format " + tab.format;
  8524. };
  8525. Typr.U.glyphToPath = function(font, gid) {
  8526. var path = { cmds: [], crds: [] };
  8527. if (font.SVG && font.SVG.entries[gid]) {
  8528. var p = font.SVG.entries[gid];
  8529. if (p == null)
  8530. return path;
  8531. if (typeof p == "string") {
  8532. p = Typr.SVG.toPath(p);
  8533. font.SVG.entries[gid] = p;
  8534. }
  8535. return p;
  8536. } else if (font.CFF) {
  8537. var state2 = { x: 0, y: 0, stack: [], nStems: 0, haveWidth: false, width: font.CFF.Private ? font.CFF.Private.defaultWidthX : 0, open: false };
  8538. Typr.U._drawCFF(font.CFF.CharStrings[gid], state2, font.CFF, path);
  8539. } else if (font.glyf) {
  8540. Typr.U._drawGlyf(gid, font, path);
  8541. }
  8542. return path;
  8543. };
  8544. Typr.U._drawGlyf = function(gid, font, path) {
  8545. var gl = font.glyf[gid];
  8546. if (gl == null)
  8547. gl = font.glyf[gid] = Typr.glyf._parseGlyf(font, gid);
  8548. if (gl != null) {
  8549. if (gl.noc > -1)
  8550. Typr.U._simpleGlyph(gl, path);
  8551. else
  8552. Typr.U._compoGlyph(gl, font, path);
  8553. }
  8554. };
  8555. Typr.U._simpleGlyph = function(gl, p) {
  8556. for (var c = 0; c < gl.noc; c++) {
  8557. var i0 = c == 0 ? 0 : gl.endPts[c - 1] + 1;
  8558. var il = gl.endPts[c];
  8559. for (var i = i0; i <= il; i++) {
  8560. var pr = i == i0 ? il : i - 1;
  8561. var nx = i == il ? i0 : i + 1;
  8562. var onCurve = gl.flags[i] & 1;
  8563. var prOnCurve = gl.flags[pr] & 1;
  8564. var nxOnCurve = gl.flags[nx] & 1;
  8565. var x = gl.xs[i], y = gl.ys[i];
  8566. if (i == i0) {
  8567. if (onCurve) {
  8568. if (prOnCurve)
  8569. Typr.U.P.moveTo(p, gl.xs[pr], gl.ys[pr]);
  8570. else {
  8571. Typr.U.P.moveTo(p, x, y);
  8572. continue;
  8573. }
  8574. } else {
  8575. if (prOnCurve)
  8576. Typr.U.P.moveTo(p, gl.xs[pr], gl.ys[pr]);
  8577. else
  8578. Typr.U.P.moveTo(p, (gl.xs[pr] + x) / 2, (gl.ys[pr] + y) / 2);
  8579. }
  8580. }
  8581. if (onCurve) {
  8582. if (prOnCurve)
  8583. Typr.U.P.lineTo(p, x, y);
  8584. } else {
  8585. if (nxOnCurve)
  8586. Typr.U.P.qcurveTo(p, x, y, gl.xs[nx], gl.ys[nx]);
  8587. else
  8588. Typr.U.P.qcurveTo(p, x, y, (x + gl.xs[nx]) / 2, (y + gl.ys[nx]) / 2);
  8589. }
  8590. }
  8591. Typr.U.P.closePath(p);
  8592. }
  8593. };
  8594. Typr.U._compoGlyph = function(gl, font, p) {
  8595. for (var j = 0; j < gl.parts.length; j++) {
  8596. var path = { cmds: [], crds: [] };
  8597. var prt = gl.parts[j];
  8598. Typr.U._drawGlyf(prt.glyphIndex, font, path);
  8599. var m = prt.m;
  8600. for (var i = 0; i < path.crds.length; i += 2) {
  8601. var x = path.crds[i], y = path.crds[i + 1];
  8602. p.crds.push(x * m.a + y * m.b + m.tx);
  8603. p.crds.push(x * m.c + y * m.d + m.ty);
  8604. }
  8605. for (var i = 0; i < path.cmds.length; i++)
  8606. p.cmds.push(path.cmds[i]);
  8607. }
  8608. };
  8609. Typr.U._getGlyphClass = function(g, cd) {
  8610. var intr = Typr._lctf.getInterval(cd, g);
  8611. return intr == -1 ? 0 : cd[intr + 2];
  8612. };
  8613. Typr.U.getPairAdjustment = function(font, g1, g2) {
  8614. if (font.GPOS) {
  8615. var ltab = null;
  8616. for (var i = 0; i < font.GPOS.featureList.length; i++) {
  8617. var fl = font.GPOS.featureList[i];
  8618. if (fl.tag == "kern") {
  8619. for (var j = 0; j < fl.tab.length; j++)
  8620. if (font.GPOS.lookupList[fl.tab[j]].ltype == 2)
  8621. ltab = font.GPOS.lookupList[fl.tab[j]];
  8622. }
  8623. }
  8624. if (ltab) {
  8625. for (var i = 0; i < ltab.tabs.length; i++) {
  8626. var tab = ltab.tabs[i];
  8627. var ind = Typr._lctf.coverageIndex(tab.coverage, g1);
  8628. if (ind == -1)
  8629. continue;
  8630. var adj;
  8631. if (tab.format == 1) {
  8632. var right = tab.pairsets[ind];
  8633. for (var j = 0; j < right.length; j++)
  8634. if (right[j].gid2 == g2)
  8635. adj = right[j];
  8636. if (adj == null)
  8637. continue;
  8638. } else if (tab.format == 2) {
  8639. var c1 = Typr.U._getGlyphClass(g1, tab.classDef1);
  8640. var c2 = Typr.U._getGlyphClass(g2, tab.classDef2);
  8641. var adj = tab.matrix[c1][c2];
  8642. }
  8643. return adj.val1[2];
  8644. }
  8645. }
  8646. }
  8647. if (font.kern) {
  8648. var ind1 = font.kern.glyph1.indexOf(g1);
  8649. if (ind1 != -1) {
  8650. var ind2 = font.kern.rval[ind1].glyph2.indexOf(g2);
  8651. if (ind2 != -1)
  8652. return font.kern.rval[ind1].vals[ind2];
  8653. }
  8654. }
  8655. return 0;
  8656. };
  8657. Typr.U.stringToGlyphs = function(font, str) {
  8658. var gls = [];
  8659. for (var i = 0; i < str.length; i++) {
  8660. var cc = str.codePointAt(i);
  8661. if (cc > 65535)
  8662. i++;
  8663. gls.push(Typr.U.codeToGlyph(font, cc));
  8664. }
  8665. var gsub = font["GSUB"];
  8666. if (gsub == null)
  8667. return gls;
  8668. var llist = gsub.lookupList, flist = gsub.featureList;
  8669. var wsep = '\n " ,.:;!?() \u060C';
  8670. 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";
  8671. var L = "\uA872\u0ACD\u0AD7";
  8672. for (var ci = 0; ci < gls.length; ci++) {
  8673. var gl = gls[ci];
  8674. var slft = ci == 0 || wsep.indexOf(str[ci - 1]) != -1;
  8675. var srgt = ci == gls.length - 1 || wsep.indexOf(str[ci + 1]) != -1;
  8676. if (!slft && R2.indexOf(str[ci - 1]) != -1)
  8677. slft = true;
  8678. if (!srgt && R2.indexOf(str[ci]) != -1)
  8679. srgt = true;
  8680. if (!srgt && L.indexOf(str[ci + 1]) != -1)
  8681. srgt = true;
  8682. if (!slft && L.indexOf(str[ci]) != -1)
  8683. slft = true;
  8684. var feat = null;
  8685. if (slft)
  8686. feat = srgt ? "isol" : "init";
  8687. else
  8688. feat = srgt ? "fina" : "medi";
  8689. for (var fi = 0; fi < flist.length; fi++) {
  8690. if (flist[fi].tag != feat)
  8691. continue;
  8692. for (var ti = 0; ti < flist[fi].tab.length; ti++) {
  8693. var tab = llist[flist[fi].tab[ti]];
  8694. if (tab.ltype != 1)
  8695. continue;
  8696. Typr.U._applyType1(gls, ci, tab);
  8697. }
  8698. }
  8699. }
  8700. var cligs = ["rlig", "liga", "mset"];
  8701. for (var ci = 0; ci < gls.length; ci++) {
  8702. var gl = gls[ci];
  8703. var rlim = Math.min(3, gls.length - ci - 1);
  8704. for (var fi = 0; fi < flist.length; fi++) {
  8705. var fl = flist[fi];
  8706. if (cligs.indexOf(fl.tag) == -1)
  8707. continue;
  8708. for (var ti = 0; ti < fl.tab.length; ti++) {
  8709. var tab = llist[fl.tab[ti]];
  8710. for (var j = 0; j < tab.tabs.length; j++) {
  8711. if (tab.tabs[j] == null)
  8712. continue;
  8713. var ind = Typr._lctf.coverageIndex(tab.tabs[j].coverage, gl);
  8714. if (ind == -1)
  8715. continue;
  8716. if (tab.ltype == 4) {
  8717. var vals = tab.tabs[j].vals[ind];
  8718. for (var k = 0; k < vals.length; k++) {
  8719. var lig = vals[k], rl = lig.chain.length;
  8720. if (rl > rlim)
  8721. continue;
  8722. var good = true;
  8723. for (var l = 0; l < rl; l++)
  8724. if (lig.chain[l] != gls[ci + (1 + l)])
  8725. good = false;
  8726. if (!good)
  8727. continue;
  8728. gls[ci] = lig.nglyph;
  8729. for (var l = 0; l < rl; l++)
  8730. gls[ci + l + 1] = -1;
  8731. }
  8732. } else if (tab.ltype == 5) {
  8733. var ltab = tab.tabs[j];
  8734. if (ltab.fmt != 2)
  8735. continue;
  8736. var cind = Typr._lctf.getInterval(ltab.cDef, gl);
  8737. var cls = ltab.cDef[cind + 2], scs = ltab.scset[cls];
  8738. for (var i = 0; i < scs.length; i++) {
  8739. var sc = scs[i], inp = sc.input;
  8740. if (inp.length > rlim)
  8741. continue;
  8742. var good = true;
  8743. for (var l = 0; l < inp.length; l++) {
  8744. var cind2 = Typr._lctf.getInterval(ltab.cDef, gls[ci + 1 + l]);
  8745. if (cind == -1 && ltab.cDef[cind2 + 2] != inp[l]) {
  8746. good = false;
  8747. break;
  8748. }
  8749. }
  8750. if (!good)
  8751. continue;
  8752. var lrs = sc.substLookupRecords;
  8753. for (var k = 0; k < lrs.length; k += 2) {
  8754. lrs[k];
  8755. lrs[k + 1];
  8756. }
  8757. }
  8758. }
  8759. }
  8760. }
  8761. }
  8762. }
  8763. return gls;
  8764. };
  8765. Typr.U._applyType1 = function(gls, ci, tab) {
  8766. var gl = gls[ci];
  8767. for (var j = 0; j < tab.tabs.length; j++) {
  8768. var ttab = tab.tabs[j];
  8769. var ind = Typr._lctf.coverageIndex(ttab.coverage, gl);
  8770. if (ind == -1)
  8771. continue;
  8772. if (ttab.fmt == 1)
  8773. gls[ci] = gls[ci] + ttab.delta;
  8774. else
  8775. gls[ci] = ttab.newg[ind];
  8776. }
  8777. };
  8778. Typr.U.glyphsToPath = function(font, gls, clr) {
  8779. var tpath = { cmds: [], crds: [] };
  8780. var x = 0;
  8781. for (var i = 0; i < gls.length; i++) {
  8782. var gid = gls[i];
  8783. if (gid == -1)
  8784. continue;
  8785. var gid2 = i < gls.length - 1 && gls[i + 1] != -1 ? gls[i + 1] : 0;
  8786. var path = Typr.U.glyphToPath(font, gid);
  8787. for (var j = 0; j < path.crds.length; j += 2) {
  8788. tpath.crds.push(path.crds[j] + x);
  8789. tpath.crds.push(path.crds[j + 1]);
  8790. }
  8791. if (clr)
  8792. tpath.cmds.push(clr);
  8793. for (var j = 0; j < path.cmds.length; j++)
  8794. tpath.cmds.push(path.cmds[j]);
  8795. if (clr)
  8796. tpath.cmds.push("X");
  8797. x += font.hmtx.aWidth[gid];
  8798. if (i < gls.length - 1)
  8799. x += Typr.U.getPairAdjustment(font, gid, gid2);
  8800. }
  8801. return tpath;
  8802. };
  8803. Typr.U.pathToSVG = function(path, prec) {
  8804. if (prec == null)
  8805. prec = 5;
  8806. var out = [], co = 0, lmap = { M: 2, L: 2, Q: 4, C: 6 };
  8807. for (var i = 0; i < path.cmds.length; i++) {
  8808. var cmd = path.cmds[i], cn = co + (lmap[cmd] ? lmap[cmd] : 0);
  8809. out.push(cmd);
  8810. while (co < cn) {
  8811. var c = path.crds[co++];
  8812. out.push(parseFloat(c.toFixed(prec)) + (co == cn ? "" : " "));
  8813. }
  8814. }
  8815. return out.join("");
  8816. };
  8817. Typr.U.pathToContext = function(path, ctx) {
  8818. var c = 0, crds = path.crds;
  8819. for (var j = 0; j < path.cmds.length; j++) {
  8820. var cmd = path.cmds[j];
  8821. if (cmd == "M") {
  8822. ctx.moveTo(crds[c], crds[c + 1]);
  8823. c += 2;
  8824. } else if (cmd == "L") {
  8825. ctx.lineTo(crds[c], crds[c + 1]);
  8826. c += 2;
  8827. } else if (cmd == "C") {
  8828. ctx.bezierCurveTo(crds[c], crds[c + 1], crds[c + 2], crds[c + 3], crds[c + 4], crds[c + 5]);
  8829. c += 6;
  8830. } else if (cmd == "Q") {
  8831. ctx.quadraticCurveTo(crds[c], crds[c + 1], crds[c + 2], crds[c + 3]);
  8832. c += 4;
  8833. } else if (cmd.charAt(0) == "#") {
  8834. ctx.beginPath();
  8835. ctx.fillStyle = cmd;
  8836. } else if (cmd == "Z") {
  8837. ctx.closePath();
  8838. } else if (cmd == "X") {
  8839. ctx.fill();
  8840. }
  8841. }
  8842. };
  8843. Typr.U.P = {};
  8844. Typr.U.P.moveTo = function(p, x, y) {
  8845. p.cmds.push("M");
  8846. p.crds.push(x, y);
  8847. };
  8848. Typr.U.P.lineTo = function(p, x, y) {
  8849. p.cmds.push("L");
  8850. p.crds.push(x, y);
  8851. };
  8852. Typr.U.P.curveTo = function(p, a, b, c, d, e, f) {
  8853. p.cmds.push("C");
  8854. p.crds.push(a, b, c, d, e, f);
  8855. };
  8856. Typr.U.P.qcurveTo = function(p, a, b, c, d) {
  8857. p.cmds.push("Q");
  8858. p.crds.push(a, b, c, d);
  8859. };
  8860. Typr.U.P.closePath = function(p) {
  8861. p.cmds.push("Z");
  8862. };
  8863. Typr.U._drawCFF = function(cmds, state2, font, p) {
  8864. var stack = state2.stack;
  8865. var nStems = state2.nStems, haveWidth = state2.haveWidth, width = state2.width, open = state2.open;
  8866. var i = 0;
  8867. 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;
  8868. var o = { val: 0, size: 0 };
  8869. while (i < cmds.length) {
  8870. Typr.CFF.getCharString(cmds, i, o);
  8871. var v = o.val;
  8872. i += o.size;
  8873. if (v == "o1" || v == "o18") {
  8874. var hasWidthArg;
  8875. hasWidthArg = stack.length % 2 !== 0;
  8876. if (hasWidthArg && !haveWidth) {
  8877. width = stack.shift() + font.Private.nominalWidthX;
  8878. }
  8879. nStems += stack.length >> 1;
  8880. stack.length = 0;
  8881. haveWidth = true;
  8882. } else if (v == "o3" || v == "o23") {
  8883. var hasWidthArg;
  8884. hasWidthArg = stack.length % 2 !== 0;
  8885. if (hasWidthArg && !haveWidth) {
  8886. width = stack.shift() + font.Private.nominalWidthX;
  8887. }
  8888. nStems += stack.length >> 1;
  8889. stack.length = 0;
  8890. haveWidth = true;
  8891. } else if (v == "o4") {
  8892. if (stack.length > 1 && !haveWidth) {
  8893. width = stack.shift() + font.Private.nominalWidthX;
  8894. haveWidth = true;
  8895. }
  8896. if (open)
  8897. Typr.U.P.closePath(p);
  8898. y += stack.pop();
  8899. Typr.U.P.moveTo(p, x, y);
  8900. open = true;
  8901. } else if (v == "o5") {
  8902. while (stack.length > 0) {
  8903. x += stack.shift();
  8904. y += stack.shift();
  8905. Typr.U.P.lineTo(p, x, y);
  8906. }
  8907. } else if (v == "o6" || v == "o7") {
  8908. var count = stack.length;
  8909. var isX = v == "o6";
  8910. for (var j = 0; j < count; j++) {
  8911. var sval = stack.shift();
  8912. if (isX)
  8913. x += sval;
  8914. else
  8915. y += sval;
  8916. isX = !isX;
  8917. Typr.U.P.lineTo(p, x, y);
  8918. }
  8919. } else if (v == "o8" || v == "o24") {
  8920. var count = stack.length;
  8921. var index = 0;
  8922. while (index + 6 <= count) {
  8923. c1x = x + stack.shift();
  8924. c1y = y + stack.shift();
  8925. c2x = c1x + stack.shift();
  8926. c2y = c1y + stack.shift();
  8927. x = c2x + stack.shift();
  8928. y = c2y + stack.shift();
  8929. Typr.U.P.curveTo(p, c1x, c1y, c2x, c2y, x, y);
  8930. index += 6;
  8931. }
  8932. if (v == "o24") {
  8933. x += stack.shift();
  8934. y += stack.shift();
  8935. Typr.U.P.lineTo(p, x, y);
  8936. }
  8937. } else if (v == "o11")
  8938. break;
  8939. else if (v == "o1234" || v == "o1235" || v == "o1236" || v == "o1237") {
  8940. if (v == "o1234") {
  8941. c1x = x + stack.shift();
  8942. c1y = y;
  8943. c2x = c1x + stack.shift();
  8944. c2y = c1y + stack.shift();
  8945. jpx = c2x + stack.shift();
  8946. jpy = c2y;
  8947. c3x = jpx + stack.shift();
  8948. c3y = c2y;
  8949. c4x = c3x + stack.shift();
  8950. c4y = y;
  8951. x = c4x + stack.shift();
  8952. Typr.U.P.curveTo(p, c1x, c1y, c2x, c2y, jpx, jpy);
  8953. Typr.U.P.curveTo(p, c3x, c3y, c4x, c4y, x, y);
  8954. }
  8955. if (v == "o1235") {
  8956. c1x = x + stack.shift();
  8957. c1y = y + stack.shift();
  8958. c2x = c1x + stack.shift();
  8959. c2y = c1y + stack.shift();
  8960. jpx = c2x + stack.shift();
  8961. jpy = c2y + stack.shift();
  8962. c3x = jpx + stack.shift();
  8963. c3y = jpy + stack.shift();
  8964. c4x = c3x + stack.shift();
  8965. c4y = c3y + stack.shift();
  8966. x = c4x + stack.shift();
  8967. y = c4y + stack.shift();
  8968. stack.shift();
  8969. Typr.U.P.curveTo(p, c1x, c1y, c2x, c2y, jpx, jpy);
  8970. Typr.U.P.curveTo(p, c3x, c3y, c4x, c4y, x, y);
  8971. }
  8972. if (v == "o1236") {
  8973. c1x = x + stack.shift();
  8974. c1y = y + stack.shift();
  8975. c2x = c1x + stack.shift();
  8976. c2y = c1y + stack.shift();
  8977. jpx = c2x + stack.shift();
  8978. jpy = c2y;
  8979. c3x = jpx + stack.shift();
  8980. c3y = c2y;
  8981. c4x = c3x + stack.shift();
  8982. c4y = c3y + stack.shift();
  8983. x = c4x + stack.shift();
  8984. Typr.U.P.curveTo(p, c1x, c1y, c2x, c2y, jpx, jpy);
  8985. Typr.U.P.curveTo(p, c3x, c3y, c4x, c4y, x, y);
  8986. }
  8987. if (v == "o1237") {
  8988. c1x = x + stack.shift();
  8989. c1y = y + stack.shift();
  8990. c2x = c1x + stack.shift();
  8991. c2y = c1y + stack.shift();
  8992. jpx = c2x + stack.shift();
  8993. jpy = c2y + stack.shift();
  8994. c3x = jpx + stack.shift();
  8995. c3y = jpy + stack.shift();
  8996. c4x = c3x + stack.shift();
  8997. c4y = c3y + stack.shift();
  8998. if (Math.abs(c4x - x) > Math.abs(c4y - y)) {
  8999. x = c4x + stack.shift();
  9000. } else {
  9001. y = c4y + stack.shift();
  9002. }
  9003. Typr.U.P.curveTo(p, c1x, c1y, c2x, c2y, jpx, jpy);
  9004. Typr.U.P.curveTo(p, c3x, c3y, c4x, c4y, x, y);
  9005. }
  9006. } else if (v == "o14") {
  9007. if (stack.length > 0 && !haveWidth) {
  9008. width = stack.shift() + font.nominalWidthX;
  9009. haveWidth = true;
  9010. }
  9011. if (stack.length == 4) {
  9012. var adx = stack.shift();
  9013. var ady = stack.shift();
  9014. var bchar = stack.shift();
  9015. var achar = stack.shift();
  9016. var bind = Typr.CFF.glyphBySE(font, bchar);
  9017. var aind = Typr.CFF.glyphBySE(font, achar);
  9018. Typr.U._drawCFF(font.CharStrings[bind], state2, font, p);
  9019. state2.x = adx;
  9020. state2.y = ady;
  9021. Typr.U._drawCFF(font.CharStrings[aind], state2, font, p);
  9022. }
  9023. if (open) {
  9024. Typr.U.P.closePath(p);
  9025. open = false;
  9026. }
  9027. } else if (v == "o19" || v == "o20") {
  9028. var hasWidthArg;
  9029. hasWidthArg = stack.length % 2 !== 0;
  9030. if (hasWidthArg && !haveWidth) {
  9031. width = stack.shift() + font.Private.nominalWidthX;
  9032. }
  9033. nStems += stack.length >> 1;
  9034. stack.length = 0;
  9035. haveWidth = true;
  9036. i += nStems + 7 >> 3;
  9037. } else if (v == "o21") {
  9038. if (stack.length > 2 && !haveWidth) {
  9039. width = stack.shift() + font.Private.nominalWidthX;
  9040. haveWidth = true;
  9041. }
  9042. y += stack.pop();
  9043. x += stack.pop();
  9044. if (open)
  9045. Typr.U.P.closePath(p);
  9046. Typr.U.P.moveTo(p, x, y);
  9047. open = true;
  9048. } else if (v == "o22") {
  9049. if (stack.length > 1 && !haveWidth) {
  9050. width = stack.shift() + font.Private.nominalWidthX;
  9051. haveWidth = true;
  9052. }
  9053. x += stack.pop();
  9054. if (open)
  9055. Typr.U.P.closePath(p);
  9056. Typr.U.P.moveTo(p, x, y);
  9057. open = true;
  9058. } else if (v == "o25") {
  9059. while (stack.length > 6) {
  9060. x += stack.shift();
  9061. y += stack.shift();
  9062. Typr.U.P.lineTo(p, x, y);
  9063. }
  9064. c1x = x + stack.shift();
  9065. c1y = y + stack.shift();
  9066. c2x = c1x + stack.shift();
  9067. c2y = c1y + stack.shift();
  9068. x = c2x + stack.shift();
  9069. y = c2y + stack.shift();
  9070. Typr.U.P.curveTo(p, c1x, c1y, c2x, c2y, x, y);
  9071. } else if (v == "o26") {
  9072. if (stack.length % 2) {
  9073. x += stack.shift();
  9074. }
  9075. while (stack.length > 0) {
  9076. c1x = x;
  9077. c1y = y + stack.shift();
  9078. c2x = c1x + stack.shift();
  9079. c2y = c1y + stack.shift();
  9080. x = c2x;
  9081. y = c2y + stack.shift();
  9082. Typr.U.P.curveTo(p, c1x, c1y, c2x, c2y, x, y);
  9083. }
  9084. } else if (v == "o27") {
  9085. if (stack.length % 2) {
  9086. y += stack.shift();
  9087. }
  9088. while (stack.length > 0) {
  9089. c1x = x + stack.shift();
  9090. c1y = y;
  9091. c2x = c1x + stack.shift();
  9092. c2y = c1y + stack.shift();
  9093. x = c2x + stack.shift();
  9094. y = c2y;
  9095. Typr.U.P.curveTo(p, c1x, c1y, c2x, c2y, x, y);
  9096. }
  9097. } else if (v == "o10" || v == "o29") {
  9098. var obj = v == "o10" ? font.Private : font;
  9099. if (stack.length == 0) {
  9100. console.log("error: empty stack");
  9101. } else {
  9102. var ind = stack.pop();
  9103. var subr = obj.Subrs[ind + obj.Bias];
  9104. state2.x = x;
  9105. state2.y = y;
  9106. state2.nStems = nStems;
  9107. state2.haveWidth = haveWidth;
  9108. state2.width = width;
  9109. state2.open = open;
  9110. Typr.U._drawCFF(subr, state2, font, p);
  9111. x = state2.x;
  9112. y = state2.y;
  9113. nStems = state2.nStems;
  9114. haveWidth = state2.haveWidth;
  9115. width = state2.width;
  9116. open = state2.open;
  9117. }
  9118. } else if (v == "o30" || v == "o31") {
  9119. var count, count1 = stack.length;
  9120. var index = 0;
  9121. var alternate = v == "o31";
  9122. count = count1 & ~2;
  9123. index += count1 - count;
  9124. while (index < count) {
  9125. if (alternate) {
  9126. c1x = x + stack.shift();
  9127. c1y = y;
  9128. c2x = c1x + stack.shift();
  9129. c2y = c1y + stack.shift();
  9130. y = c2y + stack.shift();
  9131. if (count - index == 5) {
  9132. x = c2x + stack.shift();
  9133. index++;
  9134. } else
  9135. x = c2x;
  9136. alternate = false;
  9137. } else {
  9138. c1x = x;
  9139. c1y = y + stack.shift();
  9140. c2x = c1x + stack.shift();
  9141. c2y = c1y + stack.shift();
  9142. x = c2x + stack.shift();
  9143. if (count - index == 5) {
  9144. y = c2y + stack.shift();
  9145. index++;
  9146. } else
  9147. y = c2y;
  9148. alternate = true;
  9149. }
  9150. Typr.U.P.curveTo(p, c1x, c1y, c2x, c2y, x, y);
  9151. index += 4;
  9152. }
  9153. } else if ((v + "").charAt(0) == "o") {
  9154. console.log("Unknown operation: " + v, cmds);
  9155. throw v;
  9156. } else
  9157. stack.push(v);
  9158. }
  9159. state2.x = x;
  9160. state2.y = y;
  9161. state2.nStems = nStems;
  9162. state2.haveWidth = haveWidth;
  9163. state2.width = width;
  9164. state2.open = open;
  9165. };
  9166. var typr_js = Typr;
  9167. $gm.unsafeWindow.typrMapping = void 0;
  9168. const state = {
  9169. study: {
  9170. currentMedia: void 0,
  9171. videojs: /* @__PURE__ */ Object.create({})
  9172. }
  9173. };
  9174. const CXProject = Project.create({
  9175. name: "\u5B66\u4E60\u901A",
  9176. level: 99,
  9177. domains: ["chaoxing.com", "edu.cn", "org.cn"],
  9178. studyProject: true,
  9179. scripts: {
  9180. study: new Script({
  9181. name: "\u8BFE\u7A0B\u5B66\u4E60",
  9182. namespace: "cx.new.study",
  9183. url: [
  9184. ["\u4EFB\u52A1\u70B9\u9875\u9762", "/knowledge/cards"],
  9185. ["\u9605\u8BFB\u4EFB\u52A1\u70B9", "/readsvr/book/mooc"]
  9186. ],
  9187. configs: {
  9188. playbackRate: {
  9189. label: "\u89C6\u9891\u500D\u901F",
  9190. attrs: {
  9191. type: "range",
  9192. title: "\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\n\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",
  9193. step: 0.5,
  9194. min: 1,
  9195. max: 16
  9196. },
  9197. defaultValue: 1,
  9198. onload() {
  9199. createRangeTooltip(this, "1", (val) => parseFloat(val) > 2 ? `${val}x - \u9AD8\u500D\u901F\u8B66\u544A\uFF01` : `${val}x`);
  9200. }
  9201. },
  9202. volume,
  9203. restudy,
  9204. ...workConfigs,
  9205. forceWork: {
  9206. label: "\u5F3A\u5236\u7B54\u9898",
  9207. defaultValue: false,
  9208. attrs: {
  9209. type: "checkbox",
  9210. title: "\u5F53\u7AE0\u8282\u6D4B\u8BD5\u4E0D\u662F\u4EFB\u52A1\u70B9\u65F6\uFF0C\u5F3A\u5236\u81EA\u52A8\u7B54\u9898\u3002\n(\u5DE6\u4E0A\u89D2\u6709\u9EC4\u70B9\u7684\u4EE3\u8868\u6B64\u5C0F\u8282\u662F\u4EFB\u52A1\u70B9)\n(\u4E00\u822C\u6765\u8BF4\u4E0D\u662F\u4EFB\u52A1\u70B9\u7684\u7AE0\u8282\u6D4B\u8BD5\u662F\u4E0D\u8BA1\u5206\u7684)"
  9211. }
  9212. },
  9213. "randomWork-choice": {
  9214. defaultValue: false,
  9215. label: "\u968F\u673A\u9009\u62E9",
  9216. attrs: { type: "checkbox", title: "\u968F\u673A\u9009\u62E9\u4EFB\u610F\u4E00\u4E2A\u9009\u9879" }
  9217. },
  9218. "randomWork-complete": {
  9219. defaultValue: false,
  9220. label: "\u968F\u673A\u586B\u7A7A",
  9221. attrs: { type: "checkbox", title: "\u968F\u673A\u586B\u5199\u4EE5\u4E0B\u4EFB\u610F\u4E00\u4E2A\u6587\u6848" }
  9222. },
  9223. "randomWork-completeTexts-textarea": {
  9224. defaultValue: ["\u4E0D\u4F1A", "\u4E0D\u77E5\u9053", "\u4E0D\u6E05\u695A", "\u4E0D\u61C2", "\u4E0D\u4F1A\u5199"].join("\n"),
  9225. label: "\u968F\u673A\u586B\u7A7A\u6587\u6848",
  9226. tag: "textarea",
  9227. attrs: { title: "\u6BCF\u884C\u4E00\u4E2A\uFF0C\u968F\u673A\u586B\u5165" }
  9228. },
  9229. tasks: {
  9230. defaultValue: []
  9231. }
  9232. },
  9233. onrender({ panel: panel2 }) {
  9234. var _a;
  9235. if (!((_a = CommonProject.scripts.settings.cfg.answererWrappers) == null ? void 0 : _a.length)) {
  9236. const setting = el("button", { className: "base-style-button-secondary" }, "\u5168\u5C40\u8BBE\u7F6E");
  9237. setting.onclick = () => $script.pin(CommonProject.scripts.settings);
  9238. panel2.body.replaceChildren(el("hr"), el("div", {}, ["\u3010\u8B66\u544A\u3011\u68C0\u6D4B\u5230\u672A\u8BBE\u7F6E\u9898\u5E93\u914D\u7F6E\uFF0C\u5C06\u65E0\u6CD5\u81EA\u52A8\u7B54\u9898\uFF0C", el("br"), "\u8BF7\u5207\u6362\u5230 ", setting, " \u9875\u9762\u8FDB\u884C\u914D\u7F6E\u3002"]));
  9239. }
  9240. },
  9241. async oncomplete() {
  9242. if (/\/readsvr\/book\/mooc/.test(location.href)) {
  9243. $console.log("\u9605\u8BFB\u811A\u672C\u542F\u52A8");
  9244. setTimeout(() => {
  9245. readweb.goto(epage);
  9246. }, 5e3);
  9247. return;
  9248. }
  9249. await $.sleep(5e3);
  9250. const updateMediaState = () => {
  9251. if (state.study.currentMedia) {
  9252. state.study.currentMedia.playbackRate = parseFloat(this.cfg.playbackRate.toString());
  9253. state.study.currentMedia.volume = this.cfg.volume;
  9254. }
  9255. };
  9256. this.onConfigChange("playbackRate", updateMediaState);
  9257. this.onConfigChange("volume", updateMediaState);
  9258. await study({
  9259. ...this.cfg,
  9260. playbackRate: parseFloat(this.cfg.playbackRate.toString()),
  9261. workOptions: { ...CommonProject.scripts.settings.cfg, upload: this.cfg.upload }
  9262. });
  9263. }
  9264. }),
  9265. chapterGuide: new Script({
  9266. name: "\u7AE0\u8282\u63D0\u793A",
  9267. namespace: "cx.chapter.guide",
  9268. url: [["\u8BFE\u7A0B\u7AE0\u8282", "/mooc2-ans/mycourse/studentcourse"]],
  9269. level: 9,
  9270. configs: {
  9271. notes: { defaultValue: "\u8BF7\u70B9\u51FB\u4EFB\u610F\u7AE0\u8282\u8FDB\u5165\u8BFE\u7A0B\u3002" },
  9272. autoStudy: {
  9273. label: "5\u79D2\u540E\u81EA\u52A8\u8FDB\u5165\u8BFE\u7A0B",
  9274. defaultValue: true,
  9275. attrs: { type: "checkbox" }
  9276. }
  9277. },
  9278. oncomplete() {
  9279. $script.pin(this);
  9280. const run = () => {
  9281. if (this.cfg.autoStudy) {
  9282. this.cfg.notes = "\u8BF7\u70B9\u51FB\u4EFB\u610F\u7AE0\u8282\u8FDB\u5165\u8BFE\u7A0B\uFF0C5\u79D2\u540E\u81EA\u52A8\u8FDB\u5165\u3002";
  9283. const list = $$el(".catalog_task .catalog_jindu");
  9284. setTimeout(() => {
  9285. if (list.length) {
  9286. list[0].click();
  9287. } else {
  9288. this.cfg.notes = "\u5168\u90E8\u4EFB\u52A1\u5DF2\u5B8C\u6210\uFF01";
  9289. $model("alert", {
  9290. content: "\u5168\u90E8\u4EFB\u52A1\u5DF2\u5B8C\u6210\uFF01",
  9291. notification: true,
  9292. notificationOptions: { important: true, duration: 0 }
  9293. });
  9294. }
  9295. }, 5e3);
  9296. }
  9297. };
  9298. run();
  9299. this.onConfigChange("autoStudy", run);
  9300. }
  9301. }),
  9302. work: new Script({
  9303. name: "\u4F5C\u4E1A\u811A\u672C",
  9304. url: [["\u4F5C\u4E1A\u9875\u9762", "/mooc2/work/dowork"]],
  9305. namespace: "cx.new.work",
  9306. level: 99,
  9307. configs: workConfigs,
  9308. async oncomplete() {
  9309. const changeMsg = () => $message("info", { content: "\u68C0\u6D4B\u5230\u8BBE\u7F6E\u66F4\u6539\uFF0C\u8BF7\u91CD\u65B0\u8FDB\u5165\uFF0C\u6216\u8005\u5237\u65B0\u4F5C\u4E1A\u9875\u9762\u8FDB\u884C\u7B54\u9898\u3002" });
  9310. this.onConfigChange("upload", changeMsg);
  9311. this.onConfigChange("auto", changeMsg);
  9312. let worker;
  9313. let warn;
  9314. this.on("render", () => createWorkerControl(this, () => worker));
  9315. this.event.on("start", () => start2());
  9316. this.event.on("restart", () => {
  9317. worker == null ? void 0 : worker.emit("close");
  9318. $message("info", { content: "3\u79D2\u540E\u91CD\u65B0\u7B54\u9898\u3002" });
  9319. setTimeout(start2, 3e3);
  9320. });
  9321. const start2 = async () => {
  9322. warn == null ? void 0 : warn.remove();
  9323. await mappingRecognize();
  9324. worker = workOrExam("work", { upload: this.cfg.upload, ...CommonProject.scripts.settings.cfg });
  9325. };
  9326. if (this.cfg.auto) {
  9327. $creator.workPreCheckMessage({
  9328. onrun: start2,
  9329. ondone: () => {
  9330. this.event.emit("done");
  9331. },
  9332. upload: this.cfg.upload,
  9333. ...CommonProject.scripts.settings.cfg
  9334. });
  9335. } else {
  9336. this.event.emit("done");
  9337. warn = $message("warn", {
  9338. duration: 0,
  9339. content: "\u81EA\u52A8\u7B54\u9898\u5DF2\u88AB\u5173\u95ED\uFF01\u8BF7\u624B\u52A8\u70B9\u51FB\u5F00\u59CB\u7B54\u9898\uFF0C\u6216\u8005\u5FFD\u7565\u6B64\u8B66\u544A"
  9340. });
  9341. }
  9342. }
  9343. }),
  9344. examRedirect: new Script({
  9345. name: "\u8003\u8BD5\u6574\u5377\u9884\u89C8\u811A\u672C",
  9346. url: [["\u65B0\u7248\u8003\u8BD5\u9875\u9762", "exam-ans/exam/test/reVersionTestStartNew"]],
  9347. hideInPanel: true,
  9348. oncomplete() {
  9349. $message("info", { content: "\u5373\u5C06\u8DF3\u8F6C\u5230\u6574\u5377\u9884\u89C8\u9875\u9762\u8FDB\u884C\u8003\u8BD5\u3002" });
  9350. setTimeout(() => $gm.unsafeWindow.topreview(), 3e3);
  9351. }
  9352. }),
  9353. exam: new Script({
  9354. name: "\u8003\u8BD5\u811A\u672C",
  9355. url: [["\u6574\u5377\u9884\u89C8\u9875\u9762", "/mooc2/exam/preview"]],
  9356. namespace: "cx.new.exam",
  9357. level: 99,
  9358. configs: {
  9359. notes: {
  9360. defaultValue: $creator.notes([
  9361. "\u7B54\u9898\u524D\u8BF7\u5728 \u201C\u901A\u7528-\u5168\u5C40\u8BBE\u7F6E\u201D \u4E2D\u8BBE\u7F6E\u9898\u5E93\u914D\u7F6E\uFF0C\u624D\u80FD\u5F00\u59CB\u81EA\u52A8\u7B54\u9898\u3002",
  9362. "\u53EF\u4EE5\u642D\u914D \u201C\u901A\u7528-\u5728\u7EBF\u641C\u9898\u201D \u4E00\u8D77\u4F7F\u7528\u3002",
  9363. "\u8003\u8BD5\u8BF7\u5728\u811A\u672C\u81EA\u52A8\u7B54\u9898\u5B8C\u6210\u540E\u81EA\u884C\u68C0\u67E5\uFF0C\u81EA\u5DF1\u70B9\u51FB\u63D0\u4EA4\uFF0C\u811A\u672C\u4E0D\u4F1A\u81EA\u52A8\u63D0\u4EA4\u3002",
  9364. "\u5982\u679C\u5F00\u542F\u540E\u811A\u672C\u4ECD\u7136\u6CA1\u6709\u53CD\u5E94\uFF0C\u8BF7\u5237\u65B0\u9875\u9762\u91CD\u8BD5\u3002"
  9365. ]).outerHTML
  9366. },
  9367. auto
  9368. },
  9369. async oncomplete() {
  9370. $$el("body > .mask_div").forEach((el2) => el2.remove());
  9371. const changeMsg = () => $message("info", { content: "\u68C0\u6D4B\u5230\u8BBE\u7F6E\u66F4\u6539\uFF0C\u8BF7\u91CD\u65B0\u8FDB\u5165\uFF0C\u6216\u8005\u5237\u65B0\u4F5C\u4E1A\u9875\u9762\u8FDB\u884C\u7B54\u9898\u3002" });
  9372. this.onConfigChange("auto", changeMsg);
  9373. let worker;
  9374. let warn;
  9375. this.event.on("start", () => start2());
  9376. this.event.on("restart", () => {
  9377. worker == null ? void 0 : worker.emit("close");
  9378. $message("info", { content: "3\u79D2\u540E\u91CD\u65B0\u7B54\u9898\u3002" });
  9379. setTimeout(start2, 3e3);
  9380. });
  9381. const start2 = async () => {
  9382. warn == null ? void 0 : warn.remove();
  9383. await mappingRecognize();
  9384. worker = workOrExam("exam", { upload: "nomove", ...CommonProject.scripts.settings.cfg });
  9385. };
  9386. createWorkerControl(this, () => worker);
  9387. this.on("render", () => createWorkerControl(this, () => worker));
  9388. if (this.cfg.auto) {
  9389. $creator.workPreCheckMessage({
  9390. onrun: start2,
  9391. ondone: () => {
  9392. this.event.emit("done");
  9393. },
  9394. upload: "nomove",
  9395. ...CommonProject.scripts.settings.cfg
  9396. });
  9397. } else {
  9398. this.event.emit("done");
  9399. warn = $message("warn", {
  9400. duration: 0,
  9401. content: "\u81EA\u52A8\u7B54\u9898\u5DF2\u88AB\u5173\u95ED\uFF01\u8BF7\u624B\u52A8\u70B9\u51FB\u5F00\u59CB\u7B54\u9898\uFF0C\u6216\u8005\u5FFD\u7565\u6B64\u8B66\u544A"
  9402. });
  9403. }
  9404. }
  9405. }),
  9406. guide: new Script({
  9407. name: "\u4F7F\u7528\u63D0\u793A",
  9408. url: [
  9409. ["\u9996\u9875", "https://www.chaoxing.com"],
  9410. ["\u65E7\u7248\u4E2A\u4EBA\u9996\u9875", "chaoxing.com/space/index"],
  9411. ["\u65B0\u7248\u4E2A\u4EBA\u9996\u9875", "chaoxing.com/base"],
  9412. ["\u8BFE\u7A0B\u9996\u9875", "chaoxing.com/mycourse"]
  9413. ],
  9414. level: 99,
  9415. namespace: "cx.guide",
  9416. configs: {
  9417. notes: {
  9418. 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`
  9419. }
  9420. },
  9421. onactive() {
  9422. $script.pin(this);
  9423. }
  9424. }),
  9425. versionRedirect: new Script({
  9426. name: "\u7248\u672C\u5207\u6362\u811A\u672C",
  9427. url: [
  9428. ["", "mooc2=0"],
  9429. ["", "mycourse/studentcourse"],
  9430. ["", "work/getAllWork"],
  9431. ["", "work/doHomeWorkNew"],
  9432. ["", "exam/test\\?"],
  9433. ["", "exam/test/reVersionTestStartNew.*examsystem.*"]
  9434. ],
  9435. hideInPanel: true,
  9436. async oncomplete() {
  9437. if (top === window) {
  9438. $message("warn", {
  9439. 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"
  9440. });
  9441. await $.sleep(1e3);
  9442. const experience = document.querySelector(".experience");
  9443. if (experience) {
  9444. experience.click();
  9445. } else {
  9446. const params = new URLSearchParams(window.location.href);
  9447. params.set("mooc2", "1");
  9448. params.set("newMooc", "true");
  9449. params.delete("examsystem");
  9450. window.location.replace(decodeURIComponent(params.toString()));
  9451. }
  9452. }
  9453. }
  9454. }),
  9455. rateHack: new Script({
  9456. name: "\u5C4F\u853D\u500D\u901F\u9650\u5236",
  9457. hideInPanel: true,
  9458. url: [["", "/ananas/modules/video/"]],
  9459. onstart() {
  9460. rateHack();
  9461. }
  9462. }),
  9463. copyHack: new Script({
  9464. name: "\u5C4F\u853D\u590D\u5236\u7C98\u8D34\u9650\u5236",
  9465. hideInPanel: true,
  9466. url: [["\u6240\u6709\u9875\u9762", /.*/]],
  9467. onstart() {
  9468. var _a;
  9469. try {
  9470. if (typeof $gm.unsafeWindow.$EDITORUI !== "undefined") {
  9471. const EDITORUI = $gm.unsafeWindow.$EDITORUI;
  9472. for (const key in EDITORUI) {
  9473. const ui = EDITORUI[key];
  9474. if (((_a = ui == null ? void 0 : ui.__proto__) == null ? void 0 : _a.uiName) === "editor") {
  9475. ui.editor.removeListener("beforepaste", $gm.unsafeWindow.editorPaste);
  9476. $console.log("\u6210\u529F\u5C4F\u853D\u590D\u5236\u7C98\u8D34\u9650\u5236");
  9477. }
  9478. }
  9479. }
  9480. } catch {
  9481. }
  9482. },
  9483. oncomplete() {
  9484. var _a;
  9485. (_a = this.onstart) == null ? void 0 : _a.call(this);
  9486. setTimeout(() => {
  9487. var _a2;
  9488. return (_a2 = this.onstart) == null ? void 0 : _a2.call(this);
  9489. }, 5e3);
  9490. }
  9491. }),
  9492. recognize: new Script({
  9493. name: "\u7E41\u4F53\u5B57\u8BC6\u522B",
  9494. url: [["\u7AE0\u8282\u6D4B\u8BD5", "/work/doHomeWorkNew"]],
  9495. hideInPanel: true,
  9496. oncomplete() {
  9497. setTimeout(async () => {
  9498. await mappingRecognize();
  9499. }, 3e3);
  9500. }
  9501. }),
  9502. studyDispatcher: new Script({
  9503. name: "\u8BFE\u7A0B\u5B66\u4E60\u8C03\u5EA6\u5668",
  9504. url: [["\u8BFE\u7A0B\u5B66\u4E60\u9875\u9762", "/mycourse/studentstudy"]],
  9505. namespace: "cx.new.study-dispatcher",
  9506. hideInPanel: true,
  9507. async oncomplete() {
  9508. const restudy2 = CXProject.scripts.study.cfg.restudy;
  9509. $script.pin(CXProject.scripts.study);
  9510. if (!restudy2) {
  9511. const params = new URLSearchParams(window.location.href);
  9512. const mooc = params.get("mooc2");
  9513. if (mooc === null) {
  9514. params.set("mooc2", "1");
  9515. window.location.replace(decodeURIComponent(params.toString()));
  9516. return;
  9517. }
  9518. let chapters = CXAnalyses.getChapterInfos();
  9519. chapters = chapters.filter((chapter) => chapter.unFinishCount !== 0);
  9520. if (chapters.length === 0) {
  9521. $message("warn", { content: "\u9875\u9762\u4EFB\u52A1\u70B9\u6570\u91CF\u4E3A\u7A7A! \u8BF7\u5237\u65B0\u91CD\u8BD5!" });
  9522. } else {
  9523. const params2 = new URLSearchParams(window.location.href);
  9524. const courseId = params2.get("courseId");
  9525. const classId = params2.get("clazzid");
  9526. setTimeout(() => {
  9527. if ($$el(`.posCatalog_active[id="cur${chapters[0].chapterId}"]`).length === 0) {
  9528. $gm.unsafeWindow.getTeacherAjax(courseId, classId, chapters[0].chapterId);
  9529. }
  9530. }, 1e3);
  9531. }
  9532. }
  9533. }
  9534. })
  9535. }
  9536. });
  9537. function workOrExam(type = "work", { answererWrappers, period, timeout, retry, upload, thread, skipAnswered, uncheckAllChoice }) {
  9538. $message("info", { content: `\u5F00\u59CB${type === "work" ? "\u4F5C\u4E1A" : "\u8003\u8BD5"}` });
  9539. $store.setTab("common.work-results.results", []);
  9540. $script.pin(CommonProject.scripts.workResults);
  9541. const worker = new OCSWorker({
  9542. root: ".questionLi",
  9543. elements: {
  9544. title: [
  9545. (root2) => $el("h3", root2)
  9546. ],
  9547. options: ".answerBg .answer_p, .textDIV, .eidtDiv",
  9548. type: type === "exam" ? 'input[name^="type"]' : 'input[id^="answertype"]',
  9549. lineAnswerInput: ".line_answer input[name^=answer]",
  9550. lineSelectBox: ".line_answer_ct .selectBox ",
  9551. checkedChoice: '[class*="check_answer"]',
  9552. reading: ".reading_answer",
  9553. filling: ".filling_answer"
  9554. },
  9555. requestPeriod: period != null ? period : 3,
  9556. resolvePeriod: 0,
  9557. timeout: timeout != null ? timeout : 30,
  9558. retry: retry != null ? retry : 2,
  9559. thread: thread != null ? thread : 1,
  9560. answerer: (elements, type2, ctx) => {
  9561. const title = StringUtils.of(
  9562. elements.title.filter((t) => t.innerText).map((t) => optimizationTextWithImage(t)).join(",")
  9563. ).nowrap().nospace().toString().trim().replace(/\d+\.\s*\((.+题|名词解释|完形填空|阅读理解), .+分\)/, "").replace(/[[|(|【|(]..题[\]|)|】|)]/, "").trim();
  9564. if (title) {
  9565. return defaultAnswerWrapperHandler(answererWrappers, { type: type2, title, root: ctx.root });
  9566. } else {
  9567. throw new Error("\u9898\u76EE\u4E3A\u7A7A\uFF0C\u8BF7\u67E5\u770B\u9898\u76EE\u662F\u5426\u4E3A\u7A7A\uFF0C\u6216\u8005\u5FFD\u7565\u6B64\u9898");
  9568. }
  9569. },
  9570. work: async (ctx) => {
  9571. var _a;
  9572. const { elements, searchResults } = ctx;
  9573. const typeInput = elements.type[0];
  9574. const type2 = getQuestionType(parseInt(typeInput.value));
  9575. if (type2 && (type2 === "completion" || type2 === "multiple" || type2 === "judgement" || type2 === "single")) {
  9576. const resolver = defaultQuestionResolve(ctx)[type2];
  9577. return await resolver(searchResults, elements.options, (type3, answer, option) => {
  9578. var _a2;
  9579. if (skipAnswered && elements.checkedChoice.length)
  9580. ;
  9581. else {
  9582. if (type3 === "judgement" || type3 === "single" || type3 === "multiple") {
  9583. if (elements.checkedChoice.length === 0) {
  9584. option.click();
  9585. }
  9586. } else if (type3 === "completion" && answer.trim()) {
  9587. const text = option.querySelector("textarea");
  9588. const textareaFrame = option.querySelector("iframe");
  9589. if (text) {
  9590. text.value = answer;
  9591. }
  9592. if (textareaFrame == null ? void 0 : textareaFrame.contentDocument) {
  9593. textareaFrame.contentDocument.body.innerHTML = answer;
  9594. }
  9595. if (option.parentElement) {
  9596. (_a2 = $el("[onclick*=saveQuestion]", option.parentElement)) == null ? void 0 : _a2.click();
  9597. }
  9598. }
  9599. }
  9600. });
  9601. } else if (type2 && type2 === "line") {
  9602. for (const answers of searchResults.map((res) => res.answers.map((ans) => ans.answer))) {
  9603. let ans = answers;
  9604. if (ans.length === 1) {
  9605. ans = splitAnswer(ans[0]);
  9606. }
  9607. if (ans.filter(Boolean).length !== 0 && elements.lineAnswerInput) {
  9608. for (let index = 0; index < elements.lineSelectBox.length; index++) {
  9609. const box = elements.lineSelectBox[index];
  9610. if (ans[index]) {
  9611. (_a = $el(`li[data=${ans[index]}] a`, box)) == null ? void 0 : _a.click();
  9612. await $.sleep(200);
  9613. }
  9614. }
  9615. return { finish: true };
  9616. }
  9617. }
  9618. return { finish: false };
  9619. } else if (type2 && type2 === "fill") {
  9620. return readerAndFillHandle(searchResults, elements.filling);
  9621. } else if (type2 && type2 === "reader") {
  9622. return readerAndFillHandle(searchResults, elements.reading);
  9623. }
  9624. return { finish: false };
  9625. },
  9626. onResultsUpdate(res) {
  9627. $store.setTab("common.work-results.results", $.simplifyWorkResult(res));
  9628. },
  9629. onResolveUpdate(res) {
  9630. CommonProject.scripts.workResults.cfg.totalQuestionCount = worker.totalQuestionCount;
  9631. CommonProject.scripts.workResults.cfg.requestIndex = worker.requestIndex;
  9632. CommonProject.scripts.workResults.cfg.resolverIndex = worker.resolverIndex;
  9633. },
  9634. async onElementSearched(elements) {
  9635. var _a;
  9636. if (uncheckAllChoice) {
  9637. for (const el2 of elements.checkedChoice) {
  9638. (_a = el2.parentElement) == null ? void 0 : _a.click();
  9639. await $.sleep(200);
  9640. }
  9641. }
  9642. }
  9643. });
  9644. worker.doWork().then((results) => {
  9645. if (type === "exam") {
  9646. $message("success", { duration: 0, content: "\u8003\u8BD5\u5B8C\u6210\uFF0C\u4E3A\u4E86\u5B89\u5168\u8003\u8651\uFF0C\u8BF7\u81EA\u884C\u68C0\u67E5\u540E\u81EA\u884C\u70B9\u51FB\u63D0\u4EA4\uFF01" });
  9647. } else {
  9648. worker.uploadHandler({
  9649. type: upload,
  9650. results,
  9651. async callback(finishedRate, uploadable) {
  9652. $message("info", {
  9653. content: `\u5B8C\u6210\u7387 ${finishedRate.toFixed(2)} : ${uploadable ? "5\u79D2\u540E\u5C06\u81EA\u52A8\u63D0\u4EA4" : "5\u79D2\u540E\u5C06\u81EA\u52A8\u4FDD\u5B58"} `
  9654. });
  9655. await $.sleep(5e3);
  9656. if (uploadable) {
  9657. $el(".completeBtn").click();
  9658. await $.sleep(2e3);
  9659. $gm.unsafeWindow.submitWork();
  9660. } else {
  9661. $gm.unsafeWindow.saveWork();
  9662. }
  9663. }
  9664. });
  9665. }
  9666. }).catch((err) => {
  9667. $message("error", { content: "\u7B54\u9898\u7A0B\u5E8F\u53D1\u751F\u9519\u8BEF : " + err.message });
  9668. });
  9669. return worker;
  9670. }
  9671. async function mappingRecognize() {
  9672. var _a, _b;
  9673. $gm.unsafeWindow.typrMapping = $gm.unsafeWindow.top.typrMapping || $gm.unsafeWindow.typrMapping || await loadTyprMapping();
  9674. const fontFaceEl = Array.from(document.head.querySelectorAll("style")).find(
  9675. (style) => {
  9676. var _a2;
  9677. return (_a2 = style.textContent) == null ? void 0 : _a2.includes("font-cxsecret");
  9678. }
  9679. );
  9680. const fontMap = $gm.unsafeWindow.typrMapping;
  9681. if (fontFaceEl) {
  9682. const font = (_b = (_a = fontFaceEl.textContent) == null ? void 0 : _a.match(/base64,([\w\W]+?)'/)) == null ? void 0 : _b[1];
  9683. if (font) {
  9684. $console.log("\u6B63\u5728\u8BC6\u522B\u7E41\u4F53\u5B57");
  9685. const code = typr_js.parse(base64ToUint8Array(font));
  9686. const match = {};
  9687. for (let i = 19968; i < 40870; i++) {
  9688. const Glyph = typr_js.U.codeToGlyph(code, i);
  9689. if (!Glyph)
  9690. continue;
  9691. const path = typr_js.U.glyphToPath(code, Glyph);
  9692. const hex = md5(JSON.stringify(path)).slice(24);
  9693. match[i.toString()] = fontMap[hex];
  9694. }
  9695. const fonts = CXAnalyses.getSecretFont();
  9696. fonts.forEach((el2, index) => {
  9697. let html = el2.innerHTML;
  9698. for (const key in match) {
  9699. const word = String.fromCharCode(parseInt(key));
  9700. const value = String.fromCharCode(match[key]);
  9701. while (html.indexOf(word) !== -1) {
  9702. html = html.replace(word, value);
  9703. }
  9704. }
  9705. el2.innerHTML = html;
  9706. el2.classList.remove("font-cxsecret");
  9707. });
  9708. $console.log("\u8BC6\u522B\u7E41\u4F53\u5B57\u5B8C\u6210\u3002");
  9709. }
  9710. }
  9711. function base64ToUint8Array(base64) {
  9712. const data = window.atob(base64);
  9713. const buffer = new Uint8Array(data.length);
  9714. for (let i = 0; i < data.length; ++i) {
  9715. buffer[i] = data.charCodeAt(i);
  9716. }
  9717. return buffer;
  9718. }
  9719. }
  9720. async function loadTyprMapping() {
  9721. $console.log("\u6B63\u5728\u52A0\u8F7D\u7E41\u4F53\u5B57\u5E93\u3002");
  9722. return await request("https://cdn.ocsjs.com/resources/font/table.json", {
  9723. type: "GM_xmlhttpRequest",
  9724. method: "get",
  9725. contentType: "json"
  9726. });
  9727. }
  9728. const CXAnalyses = {
  9729. isInBreakingMode() {
  9730. return Array.from((top == null ? void 0 : top.document.querySelectorAll(".catalog_points_sa")) || []).length !== 0;
  9731. },
  9732. isStuckInBreakingMode() {
  9733. if (this.isInBreakingMode()) {
  9734. const chapter = top == null ? void 0 : top.document.querySelector(".posCatalog_active");
  9735. if (chapter) {
  9736. chapter.finish_count = chapter.finish_count ? chapter.finish_count + 1 : 1;
  9737. if (chapter.finish_count >= 2) {
  9738. chapter.finish_count = 1;
  9739. return true;
  9740. }
  9741. }
  9742. }
  9743. return false;
  9744. },
  9745. isInFinalTab() {
  9746. const tabs = Array.from((top == null ? void 0 : top.document.querySelectorAll(".prev_ul li")) || []);
  9747. return tabs.length && tabs[tabs.length - 1].classList.contains("active");
  9748. },
  9749. isInFinalChapter() {
  9750. var _a;
  9751. return (_a = Array.from((top == null ? void 0 : top.document.querySelectorAll(".posCatalog_select")) || []).pop()) == null ? void 0 : _a.classList.contains("posCatalog_active");
  9752. },
  9753. isFinishedAllChapters() {
  9754. return this.getChapterInfos().every((chapter) => chapter.unFinishCount === 0);
  9755. },
  9756. getChapterInfos() {
  9757. return Array.from((top == null ? void 0 : top.document.querySelectorAll('[onclick^="getTeacherAjax"]')) || []).map((el2) => {
  9758. var _a, _b, _c;
  9759. return {
  9760. chapterId: (_b = (_a = el2.getAttribute("onclick")) == null ? void 0 : _a.match(/\('(.*)','(.*)','(.*)'\)/)) == null ? void 0 : _b[3],
  9761. unFinishCount: parseInt(((_c = el2.parentElement.querySelector(".jobUnfinishCount")) == null ? void 0 : _c.value) || "0")
  9762. };
  9763. });
  9764. },
  9765. getSecretFont(doc = document) {
  9766. return Array.from(doc.querySelectorAll(".font-cxsecret")).map((font) => {
  9767. const after = font.querySelector(".after");
  9768. return after === null ? font : after;
  9769. });
  9770. }
  9771. };
  9772. function rateHack() {
  9773. try {
  9774. hack2();
  9775. window.document.addEventListener("readystatechange", hack2);
  9776. window.addEventListener("load", hack2);
  9777. } catch (e) {
  9778. console.error(e);
  9779. }
  9780. function hack2() {
  9781. const videojs = $gm.unsafeWindow.videojs;
  9782. const Ext = $gm.unsafeWindow.Ext;
  9783. if (typeof videojs !== "undefined" && typeof Ext !== "undefined") {
  9784. Ext.define("ans.VideoJs", {
  9785. override: "ans.VideoJs",
  9786. constructor: function(b) {
  9787. b = b || {};
  9788. const e = this;
  9789. e.addEvents(["seekstart"]);
  9790. e.mixins.observable.constructor.call(e, b);
  9791. const c = videojs(b.videojs, e.params2VideoOpt(b.params), function() {
  9792. });
  9793. Ext.fly(b.videojs).on("contextmenu", function(f) {
  9794. f.preventDefault();
  9795. });
  9796. Ext.fly(b.videojs).on("keydown", function(f) {
  9797. if (f.keyCode === 32 || f.keyCode === 37 || f.keyCode === 39 || f.keyCode === 107) {
  9798. f.preventDefault();
  9799. }
  9800. });
  9801. if (c.videoJsResolutionSwitcher) {
  9802. c.on("resolutionchange", function() {
  9803. const g = c.currentResolution();
  9804. const f = g.sources ? g.sources[0].res : false;
  9805. Ext.setCookie("resolution", f);
  9806. });
  9807. }
  9808. }
  9809. });
  9810. }
  9811. }
  9812. }
  9813. async function study(opts) {
  9814. var _a;
  9815. const tasks = searchTask(opts);
  9816. for (const task of tasks) {
  9817. try {
  9818. await $.sleep(3e3);
  9819. await task();
  9820. } catch (e) {
  9821. $console.error("\u672A\u77E5\u9519\u8BEF", e);
  9822. }
  9823. }
  9824. const { next } = domSearch({ next: '.next[onclick^="PCount.next"]' }, top == null ? void 0 : top.document);
  9825. if (next !== null && next.style.display === "block") {
  9826. if (CXAnalyses.isInFinalTab()) {
  9827. if (CXAnalyses.isStuckInBreakingMode()) {
  9828. $message("warn", {
  9829. 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"
  9830. });
  9831. return;
  9832. }
  9833. }
  9834. $console.log("\u5B8C\u6210, \u5373\u5C06\u8DF3\u8F6C, \u5982\u5361\u6B7B\u8BF7\u81EA\u884C\u70B9\u51FB\u4E0B\u4E00\u7AE0\u3002");
  9835. await $.sleep(3e3);
  9836. next.click();
  9837. await $.sleep(3e3);
  9838. (_a = domSearch({ confirm: ".jobFinishTip .nextChapter" }, top == null ? void 0 : top.document).confirm) == null ? void 0 : _a.click();
  9839. } else {
  9840. if (CXAnalyses.isInFinalChapter()) {
  9841. if (CXAnalyses.isFinishedAllChapters()) {
  9842. $message("success", { content: "\u5168\u90E8\u4EFB\u52A1\u70B9\u5DF2\u5B8C\u6210\uFF01" });
  9843. } else {
  9844. $message("warn", { 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" });
  9845. }
  9846. } else {
  9847. $message("error", { content: "\u4E0B\u4E00\u7AE0\u6309\u94AE\u4E0D\u5B58\u5728\uFF0C\u8BF7\u5C1D\u8BD5\u5237\u65B0\u6216\u8005\u624B\u52A8\u5207\u6362\u4E0B\u4E00\u7AE0\u3002" });
  9848. }
  9849. }
  9850. }
  9851. function searchIFrame(root2) {
  9852. var _a, _b;
  9853. let list = Array.from(root2.querySelectorAll("iframe"));
  9854. const result = [];
  9855. while (list.length) {
  9856. const frame = list.shift();
  9857. try {
  9858. if (frame && ((_a = frame == null ? void 0 : frame.contentWindow) == null ? void 0 : _a.document)) {
  9859. result.push(frame);
  9860. const frames = (_b = frame == null ? void 0 : frame.contentWindow) == null ? void 0 : _b.document.querySelectorAll("iframe");
  9861. list = list.concat(Array.from(frames || []));
  9862. }
  9863. } catch (e) {
  9864. console.log(e.message);
  9865. console.log({ frame });
  9866. }
  9867. }
  9868. return result;
  9869. }
  9870. function searchTask(opts) {
  9871. return searchIFrame(document).map((frame) => {
  9872. const { media, read, chapterTest } = domSearch(
  9873. {
  9874. media: "video,audio",
  9875. chapterTest: ".TiMu",
  9876. read: "#img.imglook"
  9877. },
  9878. frame.contentDocument || document
  9879. );
  9880. function getJob() {
  9881. if (media) {
  9882. return mediaTask(opts, media, frame);
  9883. } else if (read) {
  9884. return readTask(frame);
  9885. } else if (chapterTest) {
  9886. return chapterTestTask(frame, opts.auto, opts.workOptions);
  9887. }
  9888. }
  9889. if (media || read || chapterTest) {
  9890. return () => {
  9891. var _a, _b, _c, _d, _e;
  9892. let _parent = frame.contentWindow;
  9893. let jobIndex = getValidNumber((_a = frame.contentWindow) == null ? void 0 : _a._jobindex, _parent._jobindex);
  9894. while (_parent) {
  9895. jobIndex = getValidNumber(jobIndex, (_b = frame.contentWindow) == null ? void 0 : _b._jobindex, _parent._jobindex);
  9896. const attachments = ((_c = _parent == null ? void 0 : _parent.JC) == null ? void 0 : _c.attachments) || _parent.attachments;
  9897. if (attachments && typeof jobIndex === "number") {
  9898. const { name, title, bookname, author } = ((_d = attachments[jobIndex]) == null ? void 0 : _d.property) || {};
  9899. const jobName = name || title || (bookname ? bookname + author : void 0) || "\u672A\u77E5\u4EFB\u52A1";
  9900. if (opts.restudy && !chapterTest && !read) {
  9901. $console.log(jobName, "\u5373\u5C06\u91CD\u65B0\u5B66\u4E60\u3002");
  9902. return getJob();
  9903. } else if (((_e = attachments[jobIndex]) == null ? void 0 : _e.job) === true) {
  9904. $console.log(jobName, "\u5373\u5C06\u5F00\u59CB\u3002");
  9905. return getJob();
  9906. } else if (chapterTest && opts.forceWork) {
  9907. $console.log(jobName, "\u5F00\u542F\u5F3A\u5236\u7B54\u9898\u3002");
  9908. return getJob();
  9909. } else {
  9910. $console.log(jobName, "\u5DF2\u7ECF\u5B8C\u6210\uFF0C\u5373\u5C06\u8DF3\u8FC7\u3002");
  9911. break;
  9912. }
  9913. }
  9914. if (_parent.parent === _parent) {
  9915. break;
  9916. }
  9917. _parent = _parent.parent;
  9918. }
  9919. };
  9920. } else {
  9921. return void 0;
  9922. }
  9923. }).filter((f) => f);
  9924. }
  9925. function fixedVideoProgress() {
  9926. if (state.study.videojs) {
  9927. const { bar } = domSearch({ bar: ".vjs-control-bar" }, state.study.videojs);
  9928. if (bar) {
  9929. bar.style.opacity = "1";
  9930. }
  9931. }
  9932. }
  9933. function mediaTask(setting, media, frame) {
  9934. const { playbackRate = 1, volume: volume2 = 0 } = setting;
  9935. const { videojs } = domSearch({ videojs: "#video,#audio" }, frame.contentDocument || document);
  9936. if (!videojs) {
  9937. $message("error", { content: "\u89C6\u9891\u68C0\u6D4B\u4E0D\u5230\uFF0C\u8BF7\u5C1D\u8BD5\u5237\u65B0\u6216\u8005\u624B\u52A8\u5207\u6362\u4E0B\u4E00\u7AE0\u3002" });
  9938. return;
  9939. }
  9940. state.study.videojs = videojs;
  9941. state.study.currentMedia = media;
  9942. fixedVideoProgress();
  9943. return new Promise((resolve) => {
  9944. if (media) {
  9945. media.volume = volume2;
  9946. media.play();
  9947. media.playbackRate = playbackRate;
  9948. async function playFunction() {
  9949. if (!media.ended && !media.__played__) {
  9950. await $.sleep(1e3);
  9951. media.play();
  9952. } else {
  9953. media.__played__ = true;
  9954. $console.log("\u89C6\u9891\u64AD\u653E\u5B8C\u6BD5");
  9955. media.removeEventListener("pause", playFunction);
  9956. }
  9957. }
  9958. media.addEventListener("pause", playFunction);
  9959. media.addEventListener("ended", () => resolve());
  9960. }
  9961. });
  9962. }
  9963. async function readTask(frame) {
  9964. var _a;
  9965. const finishJob = (_a = frame == null ? void 0 : frame.contentWindow) == null ? void 0 : _a.finishJob;
  9966. if (finishJob)
  9967. finishJob();
  9968. await $.sleep(3e3);
  9969. }
  9970. async function chapterTestTask(frame, auto2, { answererWrappers, period, timeout, retry, upload, thread, skipAnswered }) {
  9971. var _a;
  9972. if (!auto2) {
  9973. return $console.warn("\u81EA\u52A8\u7B54\u9898\u672A\u5F00\u542F\uFF0C\u8BF7\u5728\u8BFE\u7A0B\u5B66\u4E60\u8BBE\u7F6E\u4E2D\u5F00\u542F\u6216\u8005\u5FFD\u7565\u6B64\u4FE1\u606F\u3002");
  9974. }
  9975. if (answererWrappers === void 0 || answererWrappers.length === 0) {
  9976. return $console.warn("\u68C0\u6D4B\u5230\u9898\u5E93\u914D\u7F6E\u4E3A\u7A7A\uFF0C\u65E0\u6CD5\u81EA\u52A8\u7B54\u9898\uFF0C\u8BF7\u524D\u5F80\u5168\u5C40\u8BBE\u7F6E\u9875\u9762\u8FDB\u884C\u914D\u7F6E\u3002");
  9977. }
  9978. $console.info("\u5F00\u59CB\u7AE0\u8282\u6D4B\u8BD5");
  9979. const frameWindow = (_a = frame.contentWindow) == null ? void 0 : _a.window;
  9980. const { TiMu } = domSearchAll({ TiMu: ".TiMu" }, frameWindow.document);
  9981. $store.setTab("common.work-results.results", []);
  9982. $script.pin(CommonProject.scripts.workResults);
  9983. const worker = new OCSWorker({
  9984. root: TiMu,
  9985. elements: {
  9986. title: ".Zy_TItle .clearfix",
  9987. options: "ul li .after,ul li textarea,ul textarea,ul li label:not(.before)",
  9988. type: 'input[id^="answertype"]',
  9989. lineAnswerInput: ".line_answer input[name^=answer]",
  9990. lineSelectBox: ".line_answer_ct .selectBox ",
  9991. checkedChoice: '[class="before-after-checkbox Hover"]'
  9992. },
  9993. requestPeriod: period != null ? period : 3,
  9994. resolvePeriod: 0,
  9995. timeout: timeout != null ? timeout : 30,
  9996. retry: retry != null ? retry : 2,
  9997. thread: thread != null ? thread : 1,
  9998. answerer: (elements, type, ctx) => {
  9999. const title = StringUtils.of(
  10000. elements.title.filter((t) => t.innerText).map((t) => optimizationTextWithImage(t)).join(",")
  10001. ).nowrap().nospace().toString().trim().replace(/\d+\.\s*\((.+题|名词解释|完形填空|阅读理解), .+分\)/, "").replace(/[[|(|【|(]..题[\]|)|】|)]/, "").trim();
  10002. if (title) {
  10003. return defaultAnswerWrapperHandler(answererWrappers, { type, title, root: ctx.root });
  10004. } else {
  10005. throw new Error("\u9898\u76EE\u4E3A\u7A7A\uFF0C\u8BF7\u67E5\u770B\u9898\u76EE\u662F\u5426\u4E3A\u7A7A\uFF0C\u6216\u8005\u5FFD\u7565\u6B64\u9898");
  10006. }
  10007. },
  10008. work: async (ctx) => {
  10009. const { elements, searchResults } = ctx;
  10010. const typeInput = elements.type[0];
  10011. const type = typeInput ? getQuestionType(parseInt(typeInput.value)) : void 0;
  10012. if (type && (type === "completion" || type === "multiple" || type === "judgement" || type === "single")) {
  10013. const resolver = defaultQuestionResolve(ctx)[type];
  10014. const handler = (type2, answer, option) => {
  10015. var _a2;
  10016. if (skipAnswered && elements.checkedChoice.length)
  10017. ;
  10018. else {
  10019. if (type2 === "judgement" || type2 === "single" || type2 === "multiple") {
  10020. if (elements.checkedChoice.length === 0) {
  10021. option.click();
  10022. }
  10023. } else if (type2 === "completion" && answer.trim()) {
  10024. const text = option.querySelector("textarea");
  10025. const textareaFrame = option.querySelector("iframe");
  10026. if (text) {
  10027. text.value = answer;
  10028. }
  10029. if (textareaFrame == null ? void 0 : textareaFrame.contentDocument) {
  10030. textareaFrame.contentDocument.body.innerHTML = answer;
  10031. }
  10032. if (option.parentElement) {
  10033. (_a2 = $el("[onclick*=saveQuestion]", option.parentElement)) == null ? void 0 : _a2.click();
  10034. }
  10035. }
  10036. }
  10037. };
  10038. return await resolver(searchResults, elements.options, handler);
  10039. } else if (type && type === "line") {
  10040. for (const answers of searchResults.map((res) => res.answers.map((ans) => ans.answer))) {
  10041. let ans = answers;
  10042. if (ans.length === 1) {
  10043. ans = splitAnswer(ans[0]);
  10044. }
  10045. if (ans.filter(Boolean).length !== 0 && elements.lineAnswerInput) {
  10046. for (let index = 0; index < elements.lineSelectBox.length; index++) {
  10047. const box = elements.lineSelectBox[index];
  10048. if (ans[index]) {
  10049. $el(`li[data=${ans[index]}] a`, box).click();
  10050. await $.sleep(200);
  10051. }
  10052. }
  10053. return { finish: true };
  10054. }
  10055. }
  10056. return { finish: false };
  10057. }
  10058. return { finish: false };
  10059. },
  10060. async onResultsUpdate(res, curr) {
  10061. var _a2, _b, _c, _d, _e, _f, _g, _h, _i;
  10062. await $store.setTab("common.work-results.results", $.simplifyWorkResult(res));
  10063. if (!((_a2 = curr.result) == null ? void 0 : _a2.finish) && curr.resolving === false) {
  10064. const options = ((_c = (_b = curr.ctx) == null ? void 0 : _b.elements) == null ? void 0 : _c.options) || [];
  10065. const typeInput = (_e = (_d = curr.ctx) == null ? void 0 : _d.elements) == null ? void 0 : _e.type[0];
  10066. const type = typeInput ? getQuestionType(parseInt(typeInput.value)) : void 0;
  10067. if (CXProject.scripts.study.cfg["randomWork-choice"] && (type === "judgement" || type === "single" || type === "multiple")) {
  10068. $console.log("\u6B63\u5728\u968F\u673A\u4F5C\u7B54");
  10069. const option = options[Math.floor(Math.random() * options.length)];
  10070. (_g = (_f = option.parentElement) == null ? void 0 : _f.querySelector("a,label")) == null ? void 0 : _g.click();
  10071. } else if (CXProject.scripts.study.cfg["randomWork-complete"] && type === "completion") {
  10072. $console.log("\u6B63\u5728\u968F\u673A\u4F5C\u7B54");
  10073. for (const option of options) {
  10074. const textarea = (_h = option.parentElement) == null ? void 0 : _h.querySelector("textarea");
  10075. const completeTexts = CXProject.scripts.study.cfg["randomWork-completeTexts-textarea"].split("\n").filter(Boolean);
  10076. const text = completeTexts[Math.floor(Math.random() * completeTexts.length)];
  10077. const textareaFrame = (_i = option.parentElement) == null ? void 0 : _i.querySelector("iframe");
  10078. if (text) {
  10079. if (textarea) {
  10080. textarea.value = text;
  10081. }
  10082. if (textareaFrame == null ? void 0 : textareaFrame.contentDocument) {
  10083. textareaFrame.contentDocument.body.innerHTML = text;
  10084. }
  10085. } else {
  10086. $console.error("\u8BF7\u8BBE\u7F6E\u968F\u673A\u586B\u7A7A\u7684\u6587\u6848");
  10087. }
  10088. await $.sleep(500);
  10089. }
  10090. }
  10091. }
  10092. },
  10093. onResolveUpdate(res) {
  10094. CommonProject.scripts.workResults.cfg.totalQuestionCount = worker.totalQuestionCount;
  10095. CommonProject.scripts.workResults.cfg.requestIndex = worker.requestIndex;
  10096. CommonProject.scripts.workResults.cfg.resolverIndex = worker.resolverIndex;
  10097. },
  10098. async onElementSearched(elements) {
  10099. const typeInput = elements.type[0];
  10100. const type = typeInput ? getQuestionType(parseInt(typeInput.value)) : void 0;
  10101. if (type === "judgement") {
  10102. elements.options.forEach((option) => {
  10103. const ri = option.querySelector(".ri");
  10104. const span = document.createElement("span");
  10105. span.innerText = ri ? "\u221A" : "\xD7";
  10106. option.appendChild(span);
  10107. });
  10108. }
  10109. }
  10110. });
  10111. const results = await worker.doWork();
  10112. await worker.uploadHandler({
  10113. type: upload,
  10114. results,
  10115. async callback(finishedRate, uploadable) {
  10116. $message("info", {
  10117. content: `\u5B8C\u6210\u7387 ${finishedRate.toFixed(2)} : ${uploadable ? "5\u79D2\u540E\u5C06\u81EA\u52A8\u63D0\u4EA4" : "5\u79D2\u540E\u5C06\u81EA\u52A8\u4FDD\u5B58"} `
  10118. });
  10119. await $.sleep(5e3);
  10120. if (uploadable) {
  10121. frameWindow.btnBlueSubmit();
  10122. await $.sleep(3e3);
  10123. frameWindow.submitCheckTimes();
  10124. } else {
  10125. frameWindow.alert = () => {
  10126. };
  10127. frameWindow.noSubmit();
  10128. }
  10129. }
  10130. });
  10131. }
  10132. function getValidNumber(...nums) {
  10133. return nums.map((num) => typeof num === "number" ? num : void 0).find((num) => num !== void 0);
  10134. }
  10135. function getQuestionType(val) {
  10136. return val === 0 ? "single" : val === 1 ? "multiple" : val === 3 ? "judgement" : [2, 4, 5, 6, 7].some((t) => t === val) ? "completion" : val === 11 ? "line" : val === 14 ? "fill" : val === 15 ? "reader" : void 0;
  10137. }
  10138. async function readerAndFillHandle(searchResults, list) {
  10139. var _a;
  10140. for (const answers of searchResults.map((res) => res.answers.map((ans) => ans.answer))) {
  10141. let ans = answers;
  10142. if (ans.length === 1) {
  10143. ans = splitAnswer(ans[0]);
  10144. }
  10145. if (ans.filter(Boolean).length !== 0 && list.length !== 0) {
  10146. for (let index = 0; index < ans.length; index++) {
  10147. const item = list[index];
  10148. if (item) {
  10149. (_a = $el(`span.saveSingleSelect[data="${ans[index]}"]`, item)) == null ? void 0 : _a.click();
  10150. await $.sleep(200);
  10151. }
  10152. }
  10153. return { finish: true };
  10154. }
  10155. }
  10156. return { finish: false };
  10157. }
  10158. function definedProjects() {
  10159. return [BackgroundProject, RenderProject, CommonProject, ZHSProject, CXProject];
  10160. }
  10161. exports2.$ = $;
  10162. exports2.$$el = $$el;
  10163. exports2.$creator = $creator;
  10164. exports2.$el = $el;
  10165. exports2.$elements = $elements;
  10166. exports2.$gm = $gm;
  10167. exports2.$message = $message;
  10168. exports2.$model = $model;
  10169. exports2.$script = $script;
  10170. exports2.$store = $store;
  10171. exports2.$string = $string;
  10172. exports2.AnswerWrapperParser = AnswerWrapperParser;
  10173. exports2.BackgroundProject = BackgroundProject;
  10174. exports2.BaseScript = BaseScript;
  10175. exports2.CXProject = CXProject;
  10176. exports2.CommonEventEmitter = CommonEventEmitter;
  10177. exports2.CommonProject = CommonProject;
  10178. exports2.ConfigElement = ConfigElement;
  10179. exports2.ContainerElement = ContainerElement;
  10180. exports2.CorsEventEmitter = CorsEventEmitter;
  10181. exports2.GMStoreProvider = GMStoreProvider;
  10182. exports2.HeaderElement = HeaderElement;
  10183. exports2.LocalStoreChangeEvent = LocalStoreChangeEvent;
  10184. exports2.MessageElement = MessageElement;
  10185. exports2.ModelElement = ModelElement;
  10186. exports2.OCSWorker = OCSWorker;
  10187. exports2.ObjectStoreProvider = ObjectStoreProvider;
  10188. exports2.Project = Project;
  10189. exports2.RenderProject = RenderProject;
  10190. exports2.Script = Script;
  10191. exports2.ScriptPanelElement = ScriptPanelElement;
  10192. exports2.SearchResultsElement = SearchResultsElement;
  10193. exports2.StringUtils = StringUtils;
  10194. exports2.ZHSProject = ZHSProject;
  10195. exports2.answerSimilar = answerSimilar;
  10196. exports2.clearString = clearString;
  10197. exports2.cors = cors;
  10198. exports2.defaultAnswerWrapperHandler = defaultAnswerWrapperHandler;
  10199. exports2.defaultQuestionResolve = defaultQuestionResolve;
  10200. exports2.defaultWorkTypeResolver = defaultWorkTypeResolver;
  10201. exports2.definedCustomElements = definedCustomElements;
  10202. exports2.definedProjects = definedProjects;
  10203. exports2.domSearch = domSearch;
  10204. exports2.domSearchAll = domSearchAll;
  10205. exports2.el = el;
  10206. exports2.enableElementDraggable = enableElementDraggable;
  10207. exports2.isPlainAnswer = isPlainAnswer;
  10208. exports2.removeRedundant = removeRedundant;
  10209. exports2.request = request;
  10210. exports2.splitAnswer = splitAnswer;
  10211. exports2.start = start;
  10212. Object.defineProperties(exports2, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
  10213. });
  10214.  
  10215.  
  10216. const STYLE = `/** 默认字体 */
  10217. /** 输入框默认边距 */
  10218. ul,
  10219. ol {
  10220. padding-left: 16px;
  10221. margin: 0px;
  10222. }
  10223. a {
  10224. color: #1890ff;
  10225. }
  10226. hr {
  10227. border-style: solid;
  10228. border-color: #63636346;
  10229. border-width: 0px;
  10230. border-bottom: 1px solid #63636346;
  10231. margin-block-start: 1em;
  10232. margin-block-end: 1em;
  10233. }
  10234. .base-style-active-form-control {
  10235. border: 1px solid #ffffff00;
  10236. }
  10237. .base-style-active-form-control:focus {
  10238. border: 1px solid #0e8de290;
  10239. box-shadow: 0px 0px 4px #0e8de252;
  10240. }
  10241. .base-style-active-form-control:focus:not([type='checkbox'], [type='radio']) {
  10242. border: 1px solid #0e8de290;
  10243. box-shadow: 0px 0px 4px #0e8de252;
  10244. background-color: white !important;
  10245. }
  10246. .base-style-active-form-control:hover {
  10247. background-color: #ebeef4;
  10248. }
  10249. .base-style-input {
  10250. outline: none;
  10251. border: 1px solid #ffffff00;
  10252. padding: 2px 8px;
  10253. margin: 0px;
  10254. background-color: #eef2f7;
  10255. border-radius: 2px;
  10256. color: black;
  10257. }
  10258. .base-style-input::placeholder {
  10259. color: #bababa;
  10260. }
  10261. .base-style-button {
  10262. appearance: none;
  10263. border-radius: 4px;
  10264. background-color: white;
  10265. border: 1px solid #2c92ff;
  10266. color: #409eff;
  10267. cursor: pointer;
  10268. margin-bottom: 4px;
  10269. }
  10270. .base-style-button:active {
  10271. box-shadow: 0px 0px 8px #0e8de2a5;
  10272. }
  10273. .base-style-button + .base-style-button {
  10274. margin-left: 12px;
  10275. }
  10276. .base-style-button:hover {
  10277. background-color: #7abbff24;
  10278. }
  10279. .base-style-button:disabled {
  10280. background-color: white;
  10281. border: 1px solid #c0c0c0;
  10282. color: #aeaeae;
  10283. cursor: not-allowed;
  10284. }
  10285. .base-style-button:disabled:active {
  10286. box-shadow: none;
  10287. }
  10288. .base-style-button-secondary {
  10289. appearance: none;
  10290. border-radius: 4px;
  10291. border: 1px solid #2c92ff;
  10292. color: #409eff;
  10293. cursor: pointer;
  10294. margin-bottom: 4px;
  10295. color: gray;
  10296. background-color: white;
  10297. border: 1px solid #dcdcdc;
  10298. }
  10299. .base-style-button-secondary:active {
  10300. box-shadow: 0px 0px 8px #0e8de2a5;
  10301. }
  10302. .base-style-button-secondary + .base-style-button-secondary {
  10303. margin-left: 12px;
  10304. }
  10305. .base-style-button-secondary:hover {
  10306. background-color: #7abbff24;
  10307. }
  10308. .base-style-button-secondary:disabled {
  10309. background-color: white;
  10310. border: 1px solid #c0c0c0;
  10311. color: #aeaeae;
  10312. cursor: not-allowed;
  10313. }
  10314. .base-style-button-secondary:disabled:active {
  10315. box-shadow: none;
  10316. }
  10317. container-element.close {
  10318. display: none;
  10319. }
  10320. container-element.minimize {
  10321. min-width: unset;
  10322. }
  10323. container-element {
  10324. position: fixed;
  10325. top: 10%;
  10326. left: 10%;
  10327. z-index: 99999;
  10328. text-align: left;
  10329. min-width: 300px;
  10330. -webkit-font-smoothing: antialiased;
  10331. -moz-osx-font-smoothing: grayscale;
  10332. color: #636363;
  10333. }
  10334. .header {
  10335. cursor: move;
  10336. white-space: nowrap;
  10337. justify-content: end;
  10338. display: flex;
  10339. line-height: 32px;
  10340. height: 32px;
  10341. vertical-align: middle;
  10342. background: #fbfbfbee;
  10343. border-radius: 4px;
  10344. border: 1px solid #e6e6e6;
  10345. box-shadow: 0 0 24px -12px #3f3f3f;
  10346. user-select: none;
  10347. padding-right: 12px;
  10348. margin: 0px 24px 10px 24px;
  10349. margin-bottom: 4px;
  10350. }
  10351. .header .profile {
  10352. flex: 1;
  10353. }
  10354. .header > * {
  10355. margin-left: 12px;
  10356. }
  10357. .header > * {
  10358. height: 18px;
  10359. line-height: 18px;
  10360. margin-top: calc((32px - 18px) / 2);
  10361. }
  10362. .close,
  10363. .switch,
  10364. .panel-switch,
  10365. .logo {
  10366. color: black;
  10367. width: 18px;
  10368. height: 18px;
  10369. cursor: pointer;
  10370. border-radius: 100%;
  10371. font-size: 12px;
  10372. display: inline-flex;
  10373. align-items: center;
  10374. justify-content: center;
  10375. }
  10376. .close {
  10377. background: #ff00004f;
  10378. }
  10379. .switch {
  10380. background: #ffa6003e;
  10381. }
  10382. .panel-switch {
  10383. background: #14a00d50;
  10384. }
  10385. .project-selector {
  10386. display: flex;
  10387. align-items: center;
  10388. }
  10389. .project-selector select {
  10390. background: #ffffff00;
  10391. border-radius: 4px;
  10392. border: 1px solid #63636346;
  10393. padding: 4px;
  10394. }
  10395. .project-selector.expand-all {
  10396. display: none;
  10397. }
  10398. .body {
  10399. padding: 0px 24px 24px 24px;
  10400. overflow: auto;
  10401. width: auto;
  10402. height: 100%;
  10403. }
  10404. script-panel-element {
  10405. display: block;
  10406. background-color: white;
  10407. box-shadow: 0 0 24px -12px #3f3f3f;
  10408. border: 1px solid #e6e6e6;
  10409. border-radius: 4px;
  10410. padding: 8px 8px 12px 8px;
  10411. resize: both;
  10412. overflow: auto;
  10413. }
  10414. script-panel-element .script-panel-body {
  10415. padding: 0px 8px;
  10416. }
  10417. script-panel-element + script-panel-element {
  10418. margin-top: 12px;
  10419. }
  10420. .card + .card {
  10421. margin-top: 12px;
  10422. }
  10423. .card {
  10424. background-color: white;
  10425. border-radius: 2px;
  10426. padding: 0px 8px;
  10427. }
  10428. .notes {
  10429. background: #0099ff0e;
  10430. border-left: 4px solid #0099ff65;
  10431. width: -webkit-fill-available;
  10432. margin: 0px 8px;
  10433. line-height: 22px;
  10434. }
  10435. .tooltip {
  10436. z-index: 99999999999999;
  10437. margin: 12px 0px 0px 12px;
  10438. padding: 4px;
  10439. color: black;
  10440. background: #f0f0f0;
  10441. box-shadow: 0px 0px 4px #949494;
  10442. position: fixed;
  10443. white-space: normal;
  10444. max-width: 200px;
  10445. height: auto;
  10446. border-radius: 2px;
  10447. line-height: 18px;
  10448. }
  10449. .configs {
  10450. display: table;
  10451. background: #e1e1e107;
  10452. width: -webkit-fill-available;
  10453. }
  10454. .configs .configs-body {
  10455. display: table-row-group;
  10456. }
  10457. .configs .configs-body config-element + config-element label {
  10458. padding-top: 3px;
  10459. }
  10460. .configs .configs-body config-element + config-element .config-wrapper {
  10461. padding-top: 3px;
  10462. }
  10463. .configs .configs-body config-element {
  10464. width: 100%;
  10465. display: table-row;
  10466. }
  10467. .configs .configs-body config-element label {
  10468. white-space: nowrap;
  10469. color: #4e5969;
  10470. display: table-cell;
  10471. padding-right: 12px;
  10472. text-align: left;
  10473. vertical-align: top;
  10474. margin-right: 12px;
  10475. }
  10476. .configs .configs-body config-element .config-wrapper {
  10477. display: table-cell;
  10478. vertical-align: middle;
  10479. /** check box 的样式 */
  10480. }
  10481. .configs .configs-body config-element .config-wrapper select {
  10482. outline: none;
  10483. border: none;
  10484. border: 1px solid #e4e4e4;
  10485. border-radius: 4px;
  10486. padding: 2px 8px;
  10487. border: 1px solid #ffffff00;
  10488. }
  10489. .configs .configs-body config-element .config-wrapper select:focus {
  10490. border: 1px solid #0e8de290;
  10491. box-shadow: 0px 0px 4px #0e8de252;
  10492. }
  10493. .configs .configs-body config-element .config-wrapper select:focus:not([type='checkbox'], [type='radio']) {
  10494. border: 1px solid #0e8de290;
  10495. box-shadow: 0px 0px 4px #0e8de252;
  10496. background-color: white !important;
  10497. }
  10498. .configs .configs-body config-element .config-wrapper select:hover {
  10499. background-color: #ebeef4;
  10500. }
  10501. .configs .configs-body config-element .config-wrapper textarea {
  10502. padding: 2px 8px;
  10503. outline: none;
  10504. border: none;
  10505. border: 1px solid #ffffff00;
  10506. }
  10507. .configs .configs-body config-element .config-wrapper textarea:focus {
  10508. border: 1px solid #0e8de290;
  10509. box-shadow: 0px 0px 4px #0e8de252;
  10510. }
  10511. .configs .configs-body config-element .config-wrapper textarea:focus:not([type='checkbox'], [type='radio']) {
  10512. border: 1px solid #0e8de290;
  10513. box-shadow: 0px 0px 4px #0e8de252;
  10514. background-color: white !important;
  10515. }
  10516. .configs .configs-body config-element .config-wrapper textarea:hover {
  10517. background-color: #ebeef4;
  10518. }
  10519. .configs .configs-body config-element .config-wrapper input:not([type='button']) {
  10520. outline: none;
  10521. padding: 2px 8px;
  10522. margin: 0px;
  10523. background-color: #eef2f7;
  10524. border-radius: 2px;
  10525. color: black;
  10526. border: 1px solid #ffffff00;
  10527. }
  10528. .configs .configs-body config-element .config-wrapper input:not([type='button'])::placeholder {
  10529. color: #bababa;
  10530. }
  10531. .configs .configs-body config-element .config-wrapper input:not([type='button']):focus {
  10532. border: 1px solid #0e8de290;
  10533. box-shadow: 0px 0px 4px #0e8de252;
  10534. }
  10535. .configs .configs-body config-element .config-wrapper input:not([type='button']):focus:not([type='checkbox'], [type='radio']) {
  10536. border: 1px solid #0e8de290;
  10537. box-shadow: 0px 0px 4px #0e8de252;
  10538. background-color: white !important;
  10539. }
  10540. .configs .configs-body config-element .config-wrapper input:not([type='button']):hover {
  10541. background-color: #ebeef4;
  10542. }
  10543. .configs .configs-body config-element .config-wrapper input[type='range'] {
  10544. padding: 0px;
  10545. }
  10546. .configs .configs-body config-element .config-wrapper input[type='button'] {
  10547. appearance: none;
  10548. border-radius: 4px;
  10549. background-color: white;
  10550. border: 1px solid #2c92ff;
  10551. color: #409eff;
  10552. cursor: pointer;
  10553. margin-bottom: 4px;
  10554. }
  10555. .configs .configs-body config-element .config-wrapper input[type='button']:active {
  10556. box-shadow: 0px 0px 8px #0e8de2a5;
  10557. }
  10558. .configs .configs-body config-element .config-wrapper input[type='button'] + .configs .configs-body config-element .config-wrapper input[type='button'] {
  10559. margin-left: 12px;
  10560. }
  10561. .configs .configs-body config-element .config-wrapper input[type='button']:hover {
  10562. background-color: #7abbff24;
  10563. }
  10564. .configs .configs-body config-element .config-wrapper input[type='button']:disabled {
  10565. background-color: white;
  10566. border: 1px solid #c0c0c0;
  10567. color: #aeaeae;
  10568. cursor: not-allowed;
  10569. }
  10570. .configs .configs-body config-element .config-wrapper input[type='button']:disabled:active {
  10571. box-shadow: none;
  10572. }
  10573. .configs .configs-body config-element .config-wrapper input[type='checkbox'] {
  10574. appearance: none;
  10575. width: fit-content;
  10576. min-width: 36px;
  10577. height: 20px;
  10578. border-radius: 100px;
  10579. display: flex;
  10580. align-items: center;
  10581. padding: 2px 4px;
  10582. transition: all 0.2s ease-in-out;
  10583. width: auto;
  10584. }
  10585. .configs .configs-body config-element .config-wrapper input[type='checkbox']:checked {
  10586. background: #1890ff;
  10587. }
  10588. .configs .configs-body config-element .config-wrapper input[type='checkbox']:disabled {
  10589. background-color: #f7f7f78b;
  10590. }
  10591. .configs .configs-body config-element .config-wrapper input[type='checkbox']:checked::before {
  10592. transform: translate(100%, 0px);
  10593. }
  10594. .configs .configs-body config-element .config-wrapper input[type='checkbox']::before {
  10595. background-color: #fff;
  10596. border-radius: 9px;
  10597. box-shadow: 0 2px 4px #00230b33;
  10598. width: 14px;
  10599. height: 14px;
  10600. content: '';
  10601. }
  10602. .configs .configs-body config-element .config-wrapper input:not([type='checkbox'], [type='radio']),
  10603. .configs .configs-body config-element .config-wrapper textarea,
  10604. .configs .configs-body config-element .config-wrapper select {
  10605. width: -webkit-fill-available;
  10606. font-size: inherit;
  10607. }
  10608. .configs .configs-body config-element .config-wrapper input[type='checkbox'],
  10609. .configs .configs-body config-element .config-wrapper input[type='radio'],
  10610. .configs .configs-body config-element .config-wrapper input[type='range'] {
  10611. accent-color: #0e8ee2;
  10612. }
  10613. .configs .configs-body config-element .config-wrapper > *:not(.tooltip) {
  10614. background-color: #eef2f7;
  10615. border-radius: 2px;
  10616. color: black;
  10617. float: right;
  10618. }
  10619. .configs .configs-body config-element .config-wrapper > *:disabled {
  10620. cursor: not-allowed;
  10621. background-color: #f7f7f78b;
  10622. }
  10623. .message-container {
  10624. margin-bottom: 4px;
  10625. position: absolute;
  10626. bottom: 100%;
  10627. left: 50%;
  10628. width: 100%;
  10629. transform: translate(-50%, 0px);
  10630. min-width: 300px;
  10631. }
  10632. .message-container message-element {
  10633. display: flex;
  10634. border-radius: 4px;
  10635. padding: 4px 12px;
  10636. margin: 0px 24px 4px 24px;
  10637. }
  10638. .message-container message-element .message-content-container {
  10639. margin-right: 8px;
  10640. flex: auto;
  10641. }
  10642. .message-container message-element .message-text {
  10643. letter-spacing: 1px;
  10644. font-weight: bold;
  10645. }
  10646. .message-container message-element .message-closer {
  10647. width: 18px;
  10648. min-width: 18px;
  10649. cursor: pointer;
  10650. background-color: #ffffffb3;
  10651. color: #a1a1a1;
  10652. border-radius: 100%;
  10653. text-align: center;
  10654. height: 18px;
  10655. vertical-align: middle;
  10656. font-size: 12px;
  10657. }
  10658. .message-container message-element.error {
  10659. background-color: #ffe6e6;
  10660. color: #c70208;
  10661. border: 1px solid #ff6b6ded;
  10662. }
  10663. .message-container message-element.info {
  10664. background-color: #c9e7ff;
  10665. color: #004d95;
  10666. border: 1px solid #1890ff69;
  10667. }
  10668. .message-container message-element.success {
  10669. background-color: #e8ffe0;
  10670. color: #3e8d0d;
  10671. border: 1px solid #6fd91d;
  10672. }
  10673. .message-container message-element.warn {
  10674. background-color: #ffefc8;
  10675. color: #9b7400;
  10676. border: 1px solid #ffc107;
  10677. }
  10678. model-element {
  10679. position: absolute;
  10680. top: 50%;
  10681. left: 50%;
  10682. background-color: white;
  10683. border-radius: 4px;
  10684. box-shadow: 0px 0px 24px -12px black;
  10685. border: 1px solid #929292;
  10686. height: fit-content;
  10687. transform: translate(-50%, -50%);
  10688. padding: 12px 18px 18px 18px;
  10689. font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;
  10690. z-index: 99999999999;
  10691. }
  10692. model-element .model-profile {
  10693. zoom: 0.9;
  10694. color: #969696;
  10695. user-select: none;
  10696. margin-bottom: 4px;
  10697. }
  10698. model-element .model-title {
  10699. font-size: 18px;
  10700. font-weight: bold;
  10701. user-select: none;
  10702. }
  10703. model-element .model-body {
  10704. margin: 12px 0px;
  10705. overflow: auto;
  10706. }
  10707. model-element .model-footer {
  10708. display: flex;
  10709. white-space: nowrap;
  10710. justify-content: end;
  10711. }
  10712. model-element .model-footer * + * {
  10713. margin-left: 12px;
  10714. }
  10715. model-element .model-input {
  10716. outline: none;
  10717. padding: 2px 8px;
  10718. margin: 0px;
  10719. background-color: #eef2f7;
  10720. border-radius: 2px;
  10721. color: black;
  10722. border: 1px solid #ffffff00;
  10723. width: -webkit-fill-available;
  10724. }
  10725. model-element .model-input::placeholder {
  10726. color: #bababa;
  10727. }
  10728. model-element .model-input:focus {
  10729. border: 1px solid #0e8de290;
  10730. box-shadow: 0px 0px 4px #0e8de252;
  10731. }
  10732. model-element .model-input:focus:not([type='checkbox'], [type='radio']) {
  10733. border: 1px solid #0e8de290;
  10734. box-shadow: 0px 0px 4px #0e8de252;
  10735. background-color: white !important;
  10736. }
  10737. model-element .model-input:hover {
  10738. background-color: #ebeef4;
  10739. }
  10740. model-element .model-cancel-button {
  10741. appearance: none;
  10742. border-radius: 4px;
  10743. border: 1px solid #2c92ff;
  10744. color: #409eff;
  10745. cursor: pointer;
  10746. margin-bottom: 4px;
  10747. color: gray;
  10748. background-color: white;
  10749. border: 1px solid #dcdcdc;
  10750. }
  10751. model-element .model-cancel-button:active {
  10752. box-shadow: 0px 0px 8px #0e8de2a5;
  10753. }
  10754. model-element .model-cancel-button + model-element .model-cancel-button {
  10755. margin-left: 12px;
  10756. }
  10757. model-element .model-cancel-button:hover {
  10758. background-color: #7abbff24;
  10759. }
  10760. model-element .model-cancel-button:disabled {
  10761. background-color: white;
  10762. border: 1px solid #c0c0c0;
  10763. color: #aeaeae;
  10764. cursor: not-allowed;
  10765. }
  10766. model-element .model-cancel-button:disabled:active {
  10767. box-shadow: none;
  10768. }
  10769. model-element .model-confirm-button {
  10770. appearance: none;
  10771. border-radius: 4px;
  10772. background-color: white;
  10773. border: 1px solid #2c92ff;
  10774. color: #409eff;
  10775. cursor: pointer;
  10776. margin-bottom: 4px;
  10777. }
  10778. model-element .model-confirm-button:active {
  10779. box-shadow: 0px 0px 8px #0e8de2a5;
  10780. }
  10781. model-element .model-confirm-button + model-element .model-confirm-button {
  10782. margin-left: 12px;
  10783. }
  10784. model-element .model-confirm-button:hover {
  10785. background-color: #7abbff24;
  10786. }
  10787. model-element .model-confirm-button:disabled {
  10788. background-color: white;
  10789. border: 1px solid #c0c0c0;
  10790. color: #aeaeae;
  10791. cursor: not-allowed;
  10792. }
  10793. model-element .model-confirm-button:disabled:active {
  10794. box-shadow: none;
  10795. }
  10796. model-element.alert .model-input,
  10797. model-element.alert .model-cancel-button {
  10798. display: none;
  10799. }
  10800. model-element.alert .model-confirm-button {
  10801. margin: 0;
  10802. }
  10803. model-element.prompt .model-input,
  10804. model-element.prompt .model-cancel-button,
  10805. model-element.prompt .model-confirm-button {
  10806. display: block;
  10807. }
  10808. model-element.confirm .model-input {
  10809. display: none;
  10810. }
  10811. .model-wrapper {
  10812. width: 100%;
  10813. height: 100%;
  10814. z-index: 9999;
  10815. position: fixed;
  10816. top: 0px;
  10817. left: 0px;
  10818. z-index: 9999999;
  10819. background-color: rgba(0, 0, 0, 0.265);
  10820. color: #636363;
  10821. font: 14px Menlo, Monaco, Consolas, 'Courier New', monospace;
  10822. }
  10823. .pointer {
  10824. cursor: pointer;
  10825. }
  10826. .separator {
  10827. display: flex;
  10828. align-items: center;
  10829. text-align: center;
  10830. padding: 4px 0px;
  10831. }
  10832. .separator::before,
  10833. .separator::after {
  10834. content: '';
  10835. flex: 1;
  10836. border-bottom: 1px solid #63636346;
  10837. }
  10838. .separator:not(:empty)::before {
  10839. margin-right: 0.25em;
  10840. }
  10841. .separator:not(:empty)::after {
  10842. margin-left: 0.25em;
  10843. }
  10844. .minimize .body,
  10845. .minimize .footer,
  10846. .minimize .project-selector,
  10847. .minimize .panel-switch {
  10848. display: none;
  10849. }
  10850. .user-guide > li {
  10851. padding: 4px 0px;
  10852. }
  10853. .search-results-question {
  10854. white-space: nowrap;
  10855. cursor: pointer;
  10856. padding: 4px 0px;
  10857. display: block;
  10858. overflow: hidden;
  10859. text-overflow: ellipsis;
  10860. }
  10861. .search-results-question.hover {
  10862. color: #00488d;
  10863. }
  10864. .search-results-question.active {
  10865. color: #1890ff;
  10866. }
  10867. .search-results-question.error {
  10868. color: #ff6b6ded;
  10869. }
  10870. .search-results-num {
  10871. width: 22px;
  10872. margin: 2px;
  10873. height: 20px;
  10874. border-radius: 4px;
  10875. display: inline-block;
  10876. color: white;
  10877. background-color: #63b4ff;
  10878. text-align: center;
  10879. cursor: pointer;
  10880. border: 1px solid #63b4ff;
  10881. }
  10882. .search-results-num.requesting {
  10883. border: 1px solid #b6b6b6;
  10884. background-color: white;
  10885. color: inherit;
  10886. }
  10887. .search-results-num.resolving {
  10888. border: 1px solid #1890ff;
  10889. background-color: white;
  10890. color: #1890ff;
  10891. }
  10892. .search-results-num.active {
  10893. background-color: #1890ff;
  10894. color: white;
  10895. }
  10896. .search-results-num.error {
  10897. border: 1px solid #ff8789ed;
  10898. background-color: #ff6b6ded;
  10899. color: white;
  10900. }
  10901. search-results-element {
  10902. display: block;
  10903. overflow: auto;
  10904. }
  10905. search-results-element .search-result {
  10906. margin-bottom: 12px;
  10907. padding-left: 12px;
  10908. }
  10909. search-results-element .search-result .question {
  10910. font-weight: bold;
  10911. }
  10912. search-results-element .search-result .answer {
  10913. color: #7c7c7c;
  10914. }
  10915. search-results-element .search-result .answer code {
  10916. background-color: #f3f3f3;
  10917. padding: 2px 4px;
  10918. border-radius: 2px;
  10919. margin: 4px;
  10920. line-height: 20px;
  10921. }
  10922. search-results-element .search-result .copy {
  10923. display: none;
  10924. }
  10925. search-results-element .search-result:hover .copy {
  10926. display: inline;
  10927. font-size: 12px;
  10928. }
  10929. .copy {
  10930. margin-left: 4px;
  10931. padding: 2px 4px;
  10932. border-radius: 2px;
  10933. box-shadow: 0 0 4px #b1b1b1;
  10934. cursor: pointer;
  10935. font-weight: normal;
  10936. font-size: 12px;
  10937. }
  10938. .work-result-question-container {
  10939. position: absolute;
  10940. width: 400px;
  10941. left: -85%;
  10942. top: 0px;
  10943. background: white;
  10944. border: 1px solid #cbcbcb;
  10945. border-radius: 4px;
  10946. box-shadow: 0px 0px 12px #d1cfcf;
  10947. padding: 12px;
  10948. }
  10949. .work-result-question-container .close-search-result {
  10950. font-size: 12px;
  10951. margin-left: 8px;
  10952. text-decoration: underline;
  10953. color: gray;
  10954. cursor: pointer;
  10955. }
  10956. .console {
  10957. max-height: 300px;
  10958. max-width: 400px;
  10959. overflow: auto;
  10960. background-color: #292929;
  10961. padding: 12px 6px;
  10962. color: #ececec;
  10963. font-size: 12px;
  10964. }
  10965. .console .item {
  10966. padding: 3px 0px;
  10967. border-radius: 2px;
  10968. }
  10969. .console .item .time {
  10970. color: #757575;
  10971. }
  10972. .console .item .info {
  10973. background-color: #2196f3a3;
  10974. }
  10975. .console .item .warn {
  10976. background-color: #ffc107db;
  10977. }
  10978. .console .item .error {
  10979. background-color: #f36c71cc;
  10980. }
  10981. .console .item .debug,
  10982. .console .item .log {
  10983. background-color: #9e9e9ec4;
  10984. }
  10985. .console *::selection {
  10986. background-color: #ffffff6b;
  10987. }
  10988. /* 设置滚动条的样式 */
  10989. ::-webkit-scrollbar {
  10990. width: 10px;
  10991. height: 10px;
  10992. }
  10993. /* 滚动槽 */
  10994. ::-webkit-scrollbar-track {
  10995. background: #ffffffd8;
  10996. border-radius: 4px;
  10997. margin: 4px;
  10998. }
  10999. /* 滚动条滑块 */
  11000. ::-webkit-scrollbar-thumb {
  11001. border-radius: 4px;
  11002. background: rgba(0, 0, 0, 0.253);
  11003. box-shadow: inset006pxrgba(0, 0, 0, 0.3);
  11004. }
  11005. .markdown {
  11006. max-width: 400px;
  11007. max-height: 50vh;
  11008. overflow: auto;
  11009. }
  11010. .markdown code {
  11011. padding: 2px 4px;
  11012. background-color: #f0f0f0;
  11013. border-radius: 6px;
  11014. font-size: 12px;
  11015. }
  11016. .markdown blockquote {
  11017. padding: 4px 4px 4px 12px;
  11018. margin: 0px;
  11019. color: #b5b5b5;
  11020. border-left: #ababab 2px solid;
  11021. }
  11022. .markdown blockquote p {
  11023. margin: 0px;
  11024. }
  11025. .markdown h1,
  11026. .markdown h2,
  11027. .markdown h3,
  11028. .markdown h4,
  11029. .markdown h5,
  11030. .markdown h6,
  11031. .markdown p {
  11032. margin: 8px 0px;
  11033. }
  11034. `;
  11035.  
  11036. /* eslint-disable no-undef */
  11037. /// <reference path="./global.d.ts" />
  11038.  
  11039. const { start, definedProjects } = OCS;
  11040.  
  11041. (function () {
  11042. 'use strict';
  11043.  
  11044. // 运行脚本
  11045. start({
  11046. style: STYLE,
  11047. projects: definedProjects()
  11048. });
  11049. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址