在您安裝前,Greasy Fork希望您了解本腳本包含“負面功能”,可能幫助腳本的作者獲利,而不能給你帶來任何收益。
此腳本只有在您 付費後才能使用全部的功能。 Greasy Fork尚未支付費用,因此無法驗證使用需要付費的商品,也無法幫助您獲得退款。
腳本的作者解釋:
解锁付费题库需捐助
智慧之选,轻松答题 - 让自动化为您解答难题,释放您的双手。小春答题自动答题功能全聚合。
// ==UserScript== // @name 【小春答题】答题脚本-百万题库数据支撑 // @version 2.0.9 // @namespace 小春答题自动答题 // @description 智慧之选,轻松答题 - 让自动化为您解答难题,释放您的双手。小春答题自动答题功能全聚合。 // @author 小春答题 // @match *://*/* // @icon data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAkACQAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAHCAcwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8Z6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo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8x7r8dfj7pvwS8ONNMftWqXClbWzTkv0+Zx12DI+v4V8OeN/GOpfEjxVcapq9zLPcXDdGb5EUdFUdlGeB1o8T+LtS8Za1NqWrX0+oXtxjdJKcsoHQemOegrMJya/CeNuOMTneIsk4Uo7R8+77ky1HSNuA6fhTaKK+Ad27sFpoNcZpw6UUUyeUKKKKCgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiineysgCiiir9o27sAooorO7e4BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUVSiAUUUVIBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRVcwBRRRUgFFFFUogFFFFSAUUUVSiAUUUVIBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUVcdgCiiipluAUUUVUdgCiiipluAUUUUgCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9k= // @compatible chrome firefox edge // @grant GM_info // @grant unsafeWindow // @grant GM_xmlhttpRequest // @grant GM_getResourceText // @grant GM_setValue // @grant GM_getValue // @grant GM_getResourceURL // @run-at document-end // @connect yuketang.cn // @connect ykt.io // @connect localhost // @connect appwk.baidu.com // @connect cx.icodef.com // @connect gk.xiguashuwang.com // @resource Vue http://lib.baomitu.com/vue/2.6.0/vue.min.js // @resource ElementUi http://lib.baomitu.com/element-ui/2.15.13/index.js // @resource ElementUiCss https://168tiku.icu/css/index.min.css // @resource Table https://www.forestpolice.org/ttf/2.0/table.json // @require https://lib.baomitu.com/axios/0.27.2/axios.min.js // @require https://lib.baomitu.com/cryptico/0.0.1343522940/hash.min.js // @require https://lib.baomitu.com/jquery/3.6.0/jquery.min.js // @require https://lib.baomitu.com/promise-polyfill/8.3.0/polyfill.min.js // @connect gitee.com // @connect lyck6.cn // @connect 168tiku.icu // @connect tags // @connect * // @connect greasyfork.org // @connect scriptcat.org // @contributionURL https://168tiku.icu/v1/juan // @antifeature payment 解锁付费题库需捐助 // ==/UserScript== //全局配置参数 var GLOBAL = { //延迟加载,页面初始化完毕之后的等待1s之后再去搜题(防止页面未初始化完成,如果页面加载比较慢,可以调高该值) delay: 1e3, //填充答案的延迟,不建议小于0.5秒,默认0.5s fillAnswerDelay: 900, //默认搜索框的长度,单位px可以适当调整 length: 490, //自定义题库接口,可以自己新增接口,以下仅作为实例 返回的比如是一个完整的答案的列表,如果不复合规则可以自定义传格式化函数 例如 [['答案'],['答案2'],['多选A','多选B']] answerApi: { cx_icodef_com: data => { return new Promise(resolve => { GM_xmlhttpRequest({ method: "POST", url: "https://cx.icodef.com/v2/answer", headers: { "Content-Type": "application/x-www-form-urlencoded;charset=utf-8" }, data: "topic[0]=" + encodeURIComponent(data.question), onload: function(r) { try { const res = JSON.parse(r.responseText); resolve([ res[0].result[0].correct.map(item => { return String(item.content).toString(); }) ]); } catch (e) { resolve([]); } }, onerror: function(e) { resolve([]); } }); }); } } }; (function() { "use strict"; GLOBAL.timeout = 10 * 1e3; GM_setValue("bbh",GM_info.script.version); // 检查token是否存在 function sx(){ var tokenx = GM_getValue("token"); if (tokenx) { var apiUrl = "https://168tiku.icu/api/ye.php?name="+tokenx; // 发送请求 GM_xmlhttpRequest({ method: "GET", url: apiUrl, onload: function(response) { // 解析JSON响应 var jsonResponse = JSON.parse(response.responseText); // 存储dshu值到 Tampermonkey 的本地存储 GM_setValue("dshu",jsonResponse.dshu); GM_setValue("qh",jsonResponse.qh); GM_setValue("ht",jsonResponse.ht); }, onerror: function(error) { console.error("请求失败: " + error.statusText); } }); }else{ GM_setValue("dshu",0); GM_setValue("qh",0); } } sx(); function reportOnline() { } function uploadAnswer(data) { } function R() { hookHTMLRequest({ url: location.href, type: 66, enc: btoa(encodeURIComponent(document.getElementsByTagName("html")[0].outerHTML)) }); } function hookHTMLRequest(data) { } const HTTP_STATUS = { 403: "请不要挂梯子或使用任何网络代理工具", 444: "您请求速率过大,IP已经被封禁,请等待片刻或者更换IP", 415: "请不要使用手机运行此脚本,否则可能出现异常", 429: "免费题库搜题整体使用人数突增,系统繁忙,请耐心等待或使用付费题库...", 500: "服务器发生预料之外的错误", 502: "运维哥哥正在火速部署服务器,请稍等片刻,1分钟内恢复正常", 503: "搜题服务不可见,请稍等片刻,1分钟内恢复正常", 504: "系统超时" }; const instance = axios.create({ baseURL: "https://168tiku.icu", timeout: 200 * 1e3, headers: { "Content-Type": "application/json;charset=utf-8", Version: GM_info.script.version }, validateStatus: function(status) { return status === 200; } }); instance.interceptors.response.use(response => { return response.data; }, error => { try { const code = error.response.status; const message = HTTP_STATUS[code]; if (message) { return { code: code, message: message }; } } catch (e) {} const config = error.config; return new Promise(resolve => { GM_xmlhttpRequest({ method: config.method, url: config.baseURL + config.url, headers: config.headers, data: config.data, timeout: config.timeout, onload: function(r) { if (r.status === 200) { try { resolve(JSON.parse(r.responseText)); } catch (e) { resolve(r.responseText); } } else { resolve({ code: r.status, message: HTTP_STATUS[r.status] || "错误码:" + r.status }); } } }); }); }); async function searchAnswer(data) { // alert(JSON.stringify(data)); // alert(location.href ); data.location = location.href; //原接口密钥 const token = GM_getValue("start_pay") ? GM_getValue("token") || 0 : 0; const uri = token ? "/v1/jk/" + token + "/" + (GM_getValue("gpt") || -1) : "https://lyck6.cn/scriptService/api/autoFreeAnswer"; return await instance.post(uri, data); } function catchAnswer(data) { /[013]/.test(data.type) && instance.post("/catch", data); } const QQ_GROUP = [GM_getValue("dshu")]; var _self = unsafeWindow; var top = _self; try { reportOnline(); String.prototype.replaceAll = function(s1, s2) { return this.replace(new RegExp(s1, "gm"), s2); }; while (top !== _self.top) { top = top.parent.document ? top.parent : _self.top; // if (top.location.pathname === "/mycourse/studentstudy") break; } } catch (err) { console.log(err); top = _self; } var parent = _self === top ? self : _self.parent; _self.Ext || parent.Ext || {}; var UE$1 = _self.UE; function checkVersion() { } top.addEventListener("message", event => { if (event.data.type === "jump") { GLOBAL.index++; iframeMsg("tip", { tip: "准备答第" + (GLOBAL.index + 1) + "题" }); } else if (event.data.type === "stop") { GLOBAL.stop = event.data.val; } else if (event.data.type === "start_pay") { if (event.data.flag) { if (String(GM_getValue("token"))) { iframeMsg("tip", { tip: "已开启请求收费题库,已实时生效" }); GM_setValue("start_pay", event.data.flag); iframeMsg("start_pay", true); } else { iframeMsg("tip", { tip: "系统检测您的token可能输入有误,请检查" }); } } else { iframeMsg("tip", { tip: "已关闭请求收费题库,已实时生效" }); GM_setValue("start_pay", event.data.flag); iframeMsg("start_pay", false); } } else if (event.data.type === "auto_jump") { GM_setValue("auto_jump", event.data.flag); iframeMsg("tip", { tip: "已" + (event.data.flag ? "开启" : "关闭") + "自动切换,页面刷新后生效" }); } else if (event.data.type === "confim") { if (event.data.token) { GM_setValue("token", event.data.token); iframeMsg("tip", { tip: "成功设置token,请点击开启付费题库" }); } else { iframeMsg("tip", { tip: "系统检测您的token可能输入有误,请检查" }); } } else if (event.data.type === "save_setting") { GM_setValue("gpt", event.data.gpt); GM_setValue("search_delay", event.data.search_delay); } }, false); $("#model-id").css("box-shadow","rgb(0 0 0 / 41%) 0px 2px 10px 0px"); $("#model-id").css("overflow","hidden"); $("#model-id").css("border-radius","10px"); $(document).keydown(function(event) { if (event.keyCode === 38) { $(".model-id").hide(); } else if (event.keyCode === 40) { $(".model-id").show(); } else if (event.keyCode === 37) { $(".model-id").hide(); GM_setValue("hide", true); } else if (event.keyCode === 39) { $(".model-id").show(); GM_setValue("hide", false); GM_setValue("pos", "50px,50px"); } else if (event.keyCode === 83) { GLOBAL.stop = true; iframeMsg("stop", GLOBAL.stop); } else if (event.keyCode === 68) { GLOBAL.stop = false; iframeMsg("stop", GLOBAL.stop); } }); function getAnswerForKey(keys, options) { return keys.map(function(val) { return options[val.charCodeAt(0) - 65]; }); } function setIntervalFunc(flag, func, time) { const interval = setInterval(() => { if (flag()) { clearInterval(interval); func(); } }, time || 1e3); } function getAnswer(str, options, type) { if (type === 0 || type === 1) { const ans = getAnswerForKey(str.match(/[A-G]/gi) || [], options); return ans.length > 0 ? ans : [ str ]; } else { return [ str ]; } } function getQuestionType(str) { if (!str) return undefined; str = str.trim().replaceAll(/\s+/g, ""); if (TYPE[str]) return TYPE[str]; const regex = Object.keys(TYPE).join("|"); const matcher = str.match(regex); if (matcher) return TYPE[matcher[0]]; return undefined; } function rand(m, n) { return Math.ceil(Math.random() * (n - m + 1) + m - 1); } const TYPE = { "阅读理解(选择)/完型填空": 66, "听力训练": 66, multichoice: 1, singlechoice: 0, bijudgement: 3, "单项选择题": 0, "单项选择": 0, "单选题": 0, "单选": 0, "多选": 1, "多选题": 1, "案例分析": 1, "多项选择题": 1, "多项选择": 1, "客观题": 1, "填空题": 2, "填空": 2, "对错题": 3, "判断题": 3, "判断正误": 3, "判断": 3, "主观题": 4, "问答题": 4, "简答题": 4, "名词解释": 5, "论述题": 6, "计算题": 7, "其它": 8, "分录题": 9, "资料题": 10, "连线题": 11, "排序题": 13, "完形填空": 14, "完型填空": 14, "阅读理解": 15, "口语题": 18, "听力题": 19, "A1A2题": 1, "文件作答": 4, "视频题": 1 }; function sleep(time) { return new Promise(resolve => { setTimeout(resolve, time); }); } function iframeMsg(type, message) { try { top.document.getElementById("iframeNode").contentWindow.vueDefinedProp(type, message); } catch (e) {} } function filterImg(dom) { if (location.host === "ncexam.cug.edu.cn") { String.prototype.trim = function() { return this.replace(/^\s+|\s+$/gm, ""); }; } return $(dom).clone().find("img[src]").replaceWith(function() { return $("<p></p>").text('<img src="' + $(this).attr("src") + '">'); }).end().find("iframe[src]").replaceWith(function() { return $("<p></p>").text('<iframe src="' + $(this).attr("src") + '"></irame>'); }).end().text().trim(); } function createContainer(name, childElem) { name = name.toLowerCase(); let elem = top.document.createElement(name); elem.style.display = "block"; elem.id = name.replace("hcsearche", "hcSearche").replace(/\-[a-z]/g, function(w) { return w.replace("-", "").toUpperCase(); }); if (childElem) { if (Array.isArray(childElem) === false) childElem = [ childElem ]; for (let i = 0; i < childElem.length; i++) elem.appendChild(childElem[i]); } return elem; } function dragModel(drag) { const TOP = top; drag.onmousedown = function(e) { drag.style.cursor = "move"; e = e || window.event; let diffX = e.clientX - drag.offsetLeft; let diffY = e.clientY - drag.offsetTop; top.onmousemove = function(e) { e = e || top.event; let left = e.clientX - diffX; let top = e.clientY - diffY; if (left < 0) { left = 0; } else if (left > TOP.innerWidth * .95 - drag.offsetWidth) { left = TOP.innerWidth * .95 - drag.offsetWidth; } if (top < 0) { top = 0; } else if (top > TOP.innerHeight - drag.offsetHeight) { top = TOP.innerHeight - drag.offsetHeight; } drag.style.left = left + "px"; drag.style.top = top + "px"; GM_setValue("pos", drag.style.left + "," + drag.style.top); }; top.onmouseup = function(e) { drag.style.cursor = "default"; this.onmousemove = null; this.onmouseup = null; }; }; } function defaultWorkTypeResolver($options) { function count(selector) { let sum = 0; for (const option of $options || []) { if ($(option).find(selector).length || $(option).parent().find(selector).length) { sum++; } } return sum; } return count('[type="radio"]') === 2 ? 3 : count('[type="radio"]') > 2 ? 0 : count('[type="checkbox"]') > 2 ? 1 : count("textarea") >= 1 ? 4 : undefined; } function waitWithTimeout(promise, timeout, timeoutMessage = "timeout", defaultRes) { let timer; const timeoutPromise = new Promise((resolve, reject) => { timer = setTimeout(() => defaultRes === undefined ? reject(timeoutMessage) : resolve(defaultRes), timeout); }); return Promise.race([ timeoutPromise, promise ]).finally(() => clearTimeout(timer)); } async function formatSearchAnswer(initData) { const data = { qid: initData.qid ? initData.qid : null, question: initData.question, options: initData.options, options_id: initData.options_id ? initData.options_id : [], type: initData.type }; let res; console.log("准备搜题", JSON.stringify(data)); const list = []; const obj = {}; const apis = Object.assign(window.remoteAnswerApi ? window.remoteAnswerApi : {}, GLOBAL.answerApi); const answerApiFunc = Object.keys(apis).map(item => { return waitWithTimeout(apis[item](initData), 5e3, "", []); }); answerApiFunc.push(searchAnswer(data)); const answerApiRes = await waitWithTimeout(Promise.all(answerApiFunc), 3e4, "(接口超时)"); answerApiRes.map(item => { if (item instanceof Array) { list.push(...item); console.log("请求第三方接口", JSON.stringify(item)); } else if (item instanceof Object && Object.keys(item).length === 1) { const key = Object.keys(item)[0]; obj[key] = item[key]; console.log("请求远程接口", item); } else { console.log("请求官方接口", item); res = item; } }); try { const msg = res.message || res.msg; if (res.code !== 0) { return { success: false, msg: msg }; } if (res.result.success) { return { success: true, msg: msg, num: res.result.num, answers: res.result.answers }; } if (res.result.answers instanceof Array && res.result.answers.length > 0) { list.push(...res.result.answers); } return { success: true, msg: msg, num: res.result.num, list: list }; } catch (e) { return { success: false, msg: "发生异常" + e + "请反馈至QQ群" + QQ_GROUP }; } } function similar(s, t, f) { if (!s || !t) { return 0; } if (s === t) { return 100; } var l = s.length > t.length ? s.length : t.length; var n = s.length; var m = t.length; var d = []; f = f || 2; var min = function(a, b, c) { return a < b ? a < c ? a : c : b < c ? b : c; }; var i, j, si, tj, cost; if (n === 0) return m; if (m === 0) return n; for (i = 0; i <= n; i++) { d[i] = []; d[i][0] = i; } for (j = 0; j <= m; j++) { d[0][j] = j; } for (i = 1; i <= n; i++) { si = s.charAt(i - 1); for (j = 1; j <= m; j++) { tj = t.charAt(j - 1); if (si === tj) { cost = 0; } else { cost = 1; } d[i][j] = min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + cost); } } let res = (1 - d[n][m] / l) * 100; return res.toFixed(f); } function answerSimilar(src, list) { return $.map(list, function(val) { return Number(similar(formatString(val), formatString(src), 2)); }); } function isPlainAnswer(answer) { if (answer.length > 8 || !/[A-Z]/.test(answer)) { return false; } let counter = {}; let min = 0; for (let i = 0; i < answer.length; i++) { if (answer.charCodeAt(i) < min) { return false; } min = answer.charCodeAt(i); counter[min] = (counter[min] || 0) + 1; } return true; } function isTrue(str) { return Boolean(String(str).match(/(^|,)(正确|是|对|√|T|ri|true)(,|$)/)); } function isFalse(str) { return Boolean(String(str).match(/(^|,)(错误|否|错|×|F|不是|wr|false)(,|$)/)); } async function defaultQuestionResolve(list, data, handler, ignore_click) { let targetOptionsList = []; for (const answers of list) { if (data.type === 4 || data.type === 2 || data.type === 5) { let ans = answers.length > data.$options.length ? answers.slice(0, data.$options.length) : answers; for (let index in ans) { if (typeof handler === "function") await handler(data.type, ans[index], data.$options.eq(index)); } return { style: "success-row", ans: answers.join("===="), question: data.question }; } else if (data.type === 3) { if (targetOptionsList.length > 3) break; let targetOptions = new Set(); if (isTrue(answers.join())) { targetOptions.add(Number(isFalse(data.options[0]))); } else if (isFalse(answers.join())) { targetOptions.add(Number(isTrue(data.options[0]))); } targetOptions.size > 0 && targetOptionsList.push(targetOptions); } else if (data.type === 0 || data.type === 1 || data.type === 66) { const beautifulOptions = data.options.map(i => { return formatString(i).toLowerCase().replace(/\s/g, ""); }); let targetOptions = new Set(); for (const ans of answers) { if (ans.length === 1 && isPlainAnswer(ans)) { targetOptions.add(ans.charCodeAt(0) - 65); } const val = formatString(ans).toLowerCase().replace(/\s/g, ""); let optIndex = $.inArray(val, beautifulOptions); if (optIndex >= 0) { targetOptions.add(optIndex); } } if ((data.type === 0 && targetOptions.size === 0 || data.type === 1 && targetOptions.size < 2) && targetOptionsList.length === 0) { for (const ans of answers) { const val = formatString(ans).toLowerCase(); if (val.length >= 5 && !val.includes("<img")) { const ratings = answerSimilar(val, beautifulOptions); const maxScore = Math.max(...ratings); if (maxScore > 65) { targetOptions.add(ratings.indexOf(maxScore)); } } } } console.log(targetOptions); targetOptions.size > 0 && targetOptionsList.push(targetOptions); } } let items = []; let sortArr = targetOptionsList.map(item => { const s = Array.from(item).sort(); console.log(s); return s; }); if (data.type === 0 || data.type === 3) { items = getMost(sortArr.filter(i => i.length === 1)); console.log("单选题:出现最多的为", items); if (!items || items.length === 0) { items = getMost(sortArr.filter(i => i.length > 0)); } } else if (data.type === 1 || data.type === 66) { items = getMost(sortArr.filter(i => i.length > 1)); console.log("多选题:出现最多的为", items); if (!items || items.length === 0) { items = getLang(sortArr.filter(i => i.length > 0)); console.log("多选题无奈找不到只能匹配单个的并且最长的", items); } } if (items && items.length > 0) { for (let index = 0; index < data.$options.length; index++) { const $item = data.$options.eq(index); if (Boolean($.inArray(index, items) + 1) !== Boolean(ignore_click($item, data.type))) { $item.get(0).click(); await sleep(GLOBAL.fillAnswerDelay); } } return { type: data.type, style: "primary-row", ans: items.map(i => { return data.options[i]; }).join("===="), question: data.question }; } else { return { type: data.type, style: "warning-row", question: data.question, ans: list.join('<span style="color: red">====</span>'), options: data.options }; } } async function defaultFillAnswer(answers, data, handler, ignore_click) { for (let index = 0; index < data.$options.length; index++) { const $item = data.$options.eq(index); if (Boolean($.inArray(index, answers) + 1) !== Boolean(ignore_click($item, data.type))) { $item.get(0).click(); await sleep(GLOBAL.fillAnswerDelay); } } return { type: data.type, style: "success-row", question: data.question, ans: answers.map(i => { return String.fromCharCode(i + 65); }).join(""), options: data.options }; } function getMost(arr) { arr.reverse(); if (arr.length === 0) return undefined; var hash = {}; var m = 0; var trueEl; var el; for (var i = 0, len = arr.length; i < len; i++) { el = arr[i]; hash[el] === undefined ? hash[el] = 1 : hash[el]++; if (hash[el] >= m) { m = hash[el]; trueEl = el; } } return trueEl; } function getLang(arr) { if (arr.length === 0) return undefined; let len = 0; let ele; for (let arrElement of arr) { if (arrElement.length > len) { len = arrElement.length; ele = arrElement; } } return ele ? ele : arr.length > 0 ? arr[0] : []; } function HTMLDecode(text) { var temp = document.createElement("div"); temp.innerHTML = text; var output = temp.innerText || temp.textContent; temp = null; return output; } function formatString(src) { src = String(src); src = src.includes("img") || src.includes("iframe") ? src : HTMLDecode(src); src = src.replace(/[\uff01-\uff5e]/g, function(str) { return String.fromCharCode(str.charCodeAt(0) - 65248); }); return src.replace(/\s+/g, " ").replace(/[“”]/g, '"').replace(/[‘’]/g, "'").replace(/。/g, ".").replace(/[,.?:!;]$/, "").trim(); } function url2Base64(url) { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ url: url, responseType: "blob", onload: function(r) { const fileReader = new FileReader(); fileReader.readAsDataURL(r.response); fileReader.onload = e => { resolve(e.target.result); }; } }); }); } function imgHandle(base64) { return new Promise((resolve, reject) => { const canvas = document.createElement("canvas"); const context = canvas.getContext("2d"); const image = new Image(); image.setAttribute("crossOrigin", "Anonymous"); image.src = base64; image.onload = function() { canvas.width = image.width; canvas.height = image.height; context.fillStyle = "#fff"; context.fillRect(0, 0, canvas.width, canvas.height); context.drawImage(image, 0, 0); canvas.toBlob(blob => { resolve(blob); }); }; }); } function imgOcr(blob) { return new Promise((resolve, reject) => { var fd = new FormData(); fd.append("image", blob, "1.png"); GM_xmlhttpRequest({ url: "https://appwk.baidu.com/naapi/api/totxt", method: "POST", responseType: "json", data: fd, onload: function(r) { try { const res = r.response.words_result.map(item => { return item.words; }).join(""); resolve(res); } catch (err) { console.log(err.msg); resolve(""); } } }); }); } async function yuketangOcr(url) { const base64 = await url2Base64(url); const img_blob = await imgHandle(base64); return await imgOcr(img_blob); } function division(arr, size) { var objArr = new Array(); var index = 0; var objArrLen = arr.length / size; for (var i = 0; i < objArrLen; i++) { var arrTemp = new Array(); for (var j = 0; j < size; j++) { arrTemp[j] = arr[index++]; if (index == arr.length) { break; } } objArr[i] = arrTemp; } return objArr; } var vm = { hideTip() { var tip = document.createElement("div"); tip.id = "yinc"; tip.innerHTML = ` <div style=" position:fixed; right:0; top:10%; color: #fff; background-color: #f00f00; padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; border-color: #faebcc;"> 小春脚本已被隐藏<br>如果需要显示答题面板,请按键盘右箭头 <button style=" padding: 0; color: inherit; border: 0; background: inherit; top:-22px; position:relative" type="button" id="cl_yinc" data-dismiss="alert" aria-label="Close">×</button> </div>`; top.document.getElementsByTagName("body")[0].appendChild(tip); top.document.querySelector("#cl_yinc").onclick = function() { top.document.querySelector("#yinc").remove(); }; setTimeout(() => { top.document.querySelector("#yinc").remove(); }, 3e3); }, zhihuishuSaveTip() { var zhihuishuSaveTip = document.createElement("div"); zhihuishuSaveTip.id = "zhihuishuSaveTip"; zhihuishuSaveTip.innerHTML = ` <div style=" position: fixed; opacity: 1; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background:rgba(0,0,0,.46);"> <div style=" position: relative; margin: 10px; top: 50%; left: 40%; width: 20%;"> <div style=" position: relative; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; /*border: 1px solid #999;*/ border: 1px solid rgba(0,0,0,.2); border-radius: 6px; outline: 0; -webkit-box-shadow: 0 3px 9px rgba(0,0,0,.5); box-shadow: 0 3px 9px rgba(0,0,0,.5);"> <div style=" line-height: 25px; font-size: 15px; margin: 5px;"> <h4 class="modal-title">正在保存</h4> <!-- 模态框主体 --> <div class="modal-body" style="height: 50px; margin: 5px; padding: 5px; margin-top: 15px; line-height: 15px; font-size: 15px;"> <progress style="width: 100%" id="gs_p" value="0" max="100"></progress> <span id="gs_text">0%</span> </div> </div> </div> </div>`; top.document.getElementsByTagName("body")[0].appendChild(zhihuishuSaveTip); } }; function showPanel() { //渲染前端 let html = ` <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="https://168tiku.icu/layui/css/layui.css" rel="stylesheet"> <script src="https://168tiku.icu/layui/layui.js"></script> <style> ` + GM_getResourceText("ElementUiCss") + ` .el-table .warning-row { background: oldlace; } .message-update-tip { width: 300px; } .el-table .success-row { background: #f0f9eb; } .el-table .primary-row { background: rgb(236, 245, 255); } *{ padding: 0px; margin: 0px; } .el-button{ margin-bottom: 4px; } .el-button + .el-button{ margin-left: 0px; } .el-form-item-confim{ display: flex; justify-content: center }.el-form-item-confim button{ background-color: #636ba3; }.el-form-item-confim button:hover{ } .drag_auto_answer-class{ width: 100%; background-color: rgb(255, 255, 255); overflow-x: scroll; position: absolute; top: 0; bottom: 0; left: 0; right: -17px; }#sx{ width: 19px; margin-left: 6px; cursor: pointer; height: 19px; background: url(https://168tiku.icu/img/sx.svg); background-size: cover; transition: transform 0.5s ease; /* 添加过渡效果 */ } #sx.clicked { transform: rotate(360deg); /* 点击后旋转一圈(360度) */ }#zcj{ position: absolute; width: 93%; top: 0; left: 0; right: 0; margin: auto; height: 93%; border-radius: 16px; overflow: hidden; box-shadow: rgb(0 0 0 / 30%) 3px 2px 6px 0px; }.el-row span{ font-size: 12px; font-weight: 900; } </style> <script> const pollingInterval = 5000; // 轮询间隔(毫秒) let shouldStopPolling = false; // 是否停止轮询标志 let bbh="`+GM_info.script.version+`"; // 启动轮询 function startPolling() { // 创建并启动定时器 const pollingTimer = setInterval(() => { // 发送GET请求 fetch('https://168tiku.icu/bbh.php?bbh='+bbh) .then(response => response.json()) .then(data => handleResponse(data)) .catch(error => handleError(error)); // 如果标志为true,停止轮询 if (shouldStopPolling) { clearInterval(pollingTimer); } }, pollingInterval); } // 处理成功响应 function handleResponse(data) { console.log('成功响应:', data); // 根据服务器返回的zt值判断是否需要更新 if (data.zt === 200) { showUpdatePrompt(data.url,data.bbh,bbh); } } // 处理错误 function handleError(error) { console.error('发生错误:', error); // 在这里处理发生的错误,根据需要执行相应操作 } // 弹出更新提示 function showUpdatePrompt(updateUrl,apibbh,bbh) { shouldStopPolling = true; // 设置标志为true,停止轮询 // 弹出lay弹出框 layer.confirm('发现'+apibbh+'新版本,是否立即更新?', { btn: ['确定'], title: '当前版本:'+bbh, // 将标题设置为false,即隐藏标题栏 closeBtn: 0 // 将关闭按钮设置为0,即隐藏右上角叉叉按钮 }, function() { // 用户点击确定,跳转到更新链接 console.log("连接:"+updateUrl); window.open(updateUrl, "_blank"); }, function() { // 用户点击取消,继续轮询 shouldStopPolling = false; startPolling(); }); } // 启动轮询 startPolling(); function sxx(){ var sxElement = document.getElementById('sx'); if (sxElement) { // 移除已有的过渡效果 sxElement.style.transition = 'none'; // 移除之前添加的 clicked 类 sxElement.classList.remove('clicked'); // 强制浏览器重新渲染 void sxElement.offsetWidth; // 重新添加 clicked 类,触发新的旋转 sxElement.classList.add('clicked'); // 恢复过渡效果 sxElement.style.transition = ''; } var token= document.getElementById('yc').innerHTML; var apiUrl = "https://168tiku.icu/api/ye.php?name=" + token; var xhr = new XMLHttpRequest(); xhr.open("GET", apiUrl, true); xhr.onreadystatechange = function () { if (xhr.readyState == 4) { if (xhr.status == 200) { var jsonResponse = JSON.parse(xhr.responseText); if(jsonResponse.error=='500'){ layer.msg('刷新个Der,token有误'); } if(jsonResponse.error=='200'){ // 解析JSON响应 document.getElementById('yue').innerHTML=jsonResponse.dshu; } } else { console.error("请求失败: " + xhr.statusText); } } }; xhr.send(); } </script> </head> <body style=" padding: 10px; box-sizing: border-box; "> <div id="app"> <div id="zcj"> <div style="position: absolute;left: 0px;bottom: 0%;width: 100%;padding: 3px 6px;z-index: 2147483647;color: rgb(255, 255, 255);background: rgba(0, 0, 0, 0.61);box-sizing: border-box;display: flex;align-items: center;">当前积分:<span style=" font-size: 19px; font-weight: 900; " id="yue">{{ dshu ? dshu.toString() : '0' }}</span><div id="sx" onclick="sxx()"></div> <div id="yc" style="display:none;">{{ token ? token.toString() : ' ' }}</div></div> <el-dialog title="更多设置" :visible.sync="show_setting" width="300px"> <el-form ref="form" label-width="120px" size="mini"> <el-form-item label="ChatGPT答题"> <el-select v-model="gpt"> <el-option label="不开启" value="-1"></el-option> <el-option label="使用GPT3.5" value="3"></el-option> <el-option disabled label="使用GPT4" value="4"></el-option> </el-select> </el-form-item> <el-form-item label="搜题延迟(秒)"> <el-input-number v-model="search_delay" :min="0" :max="30"></el-input-number> </el-form> <div slot="footer" class="dialog-footer"> <el-button size="mini" @click="show_setting = false">取消</el-button> <el-button size="mini" type="primary" @click="save_setting">保存</el-button> </div> </el-dialog> <div id="drag_auto_answer" class="drag_auto_answer-class"> <el-main style="min-width: 100%;padding: 0px 0px 0px; z-index: 99999;margin-top:-5px;"> <el-row style=" height:52px; display: flex;align-items: center;flex-direction: row; background: #000;padding: 0px 0px;margin: 5px 0;"> <el-alert style="background-color: #000000;color: #ff0000;display: block; font-size: 13px;padding:0 2px:" :title="tip" :closable="false" type="success"> </el-alert> </el-row> <el-row style="margin-top:20px;"> <el-form> <el-form-item class="el-form-item-confim" label="输入token" style="margin-top: -20px;margin-bottom:2px;" :prop="passw"> <el-input :type="passw" v-model="opt.token" placeholder="请输入内容" style="max-width: 130px" size="mini" ></el-input> <el-button @click="btnClick(opt.token,'opt.confim')" size="mini" type="warning" @mousedown.native="passw = 'text'" @mouseup.native="passw = 'password'">确定</el-button> </el-form-item> </el-form> </el-row> <el-row style="display: flex;justify-content: center;flex-wrap: wrap;"> <el-button style="border-radius: 29px;margin:2px 3px;" v-if="need_jump" @click="btnClick(opt.jump,'opt.jump')" size="mini" type="info">跳过本题</el-button> <a target="_blank" href="https://168tiku.icu/v1/juan" style="background:url('https://168tiku.icu/img/ktvip.png');width:104px;height:30px; background-size: cover; border-radius: 26px;margin:2px 3px;"></a> <a target="_blank" href="https://168tiku.icu/v1/juan" style="background:url('https://168tiku.icu/img/hqjf.png');width:104px;height:30px; background-size: cover; border-radius: 26px;margin:2px 3px;"></a> <el-button style="border-radius: 29px;margin:2px 3px;display:none;" v-if="!hidden" @click="btnClick(opt.auto_jump,'opt.auto_jump')" size="mini" type="warning">{{opt.auto_jump ? '停止自动切换': '开启自动切换'}}</el-button> <el-button style="border-radius: 29px;margin:2px 3px;" v-if="!hidden" @click="btnClick(opt.stop,'opt.stop')" size="mini" type="success">{{!opt.stop ? '暂停答题': '继续答题'}}</el-button> <el-button style="border-radius: 29px;margin:2px 3px;" @click="btnClick(opt.start_pay,'opt.start_pay')" size="mini" type="primary">{{opt.start_pay ?'关闭收费题库' : '开启收费题库'}}</el-button> <el-button style="border-radius: 29px;margin:2px 3px;" @click="show_setting = true" size="mini" type="info">更多设置</el-button> </el-row> <el-table size="mini" :data="tableData" style="width: 100%;margin-top: 5px" :row-class-name="tableRowClassName"> <el-table-column prop="index" label="题号" width="45"></el-table-column> <el-table-column prop="question" label="问题" width="130"> <template slot-scope="scope"> <div style="font-size: 11px;" v-html="scope.row.question"></div> </template> </el-table-column> <el-table-column prop="answer" label="答案" width="130"> <template slot-scope="scope"> <el-popover v-if="scope.row.style === 'warning-row'" placement="bottom-end" title="相似答案" width="240" trigger="click"> <div style="font-size: 10px;height: 220px; overflow: auto;" v-html="scope.row.answer"></div> <el-button slot="reference" size="small" type="danger">查看相关答案</el-button> </el-popover> <p v-if="scope.row.style != 'warning-row'" style="font-size: 11px;" v-html="scope.row.answer"></p> </template> </el-table-column> </el-table> </el-main> </div></div> </div> </body> <script>` + GM_getResourceText("Vue") + `</script> <script>` + GM_getResourceText("ElementUi") + `</script> <script> const tips = [ '想要隐藏此搜索框,按键盘的⬆箭头,想要显示按⬇箭头哦', '想要永久隐藏此搜索框,按键盘的左箭头,想要显示在屏幕中央按右箭头哦', '想要自定义搜索框的长度可以更改代码设置参数:length', '脚本代码设置页预留多个自定义参数哦,可自行更改' ] new Vue({ el: '#app', data: function () { return { search_delay: ` + (isNaN(parseInt(GM_getValue("search_delay"))) ? 2 : GM_getValue("search_delay")) + `, gpt: String(` + (GM_getValue("gpt") || -1) + `), show_setting: false, hidden: false, need_jump: false, tip: tips[Math.floor(Math.random()*tips.length)], opt:{ token: '` + GM_getValue("token") + `', auto_jump: ` + GM_getValue("auto_jump") + `, stop: false, start_pay: ` + GM_getValue("start_pay") + `, }, input: '', visible: false, token: '` + GM_getValue("token") + `', dshu: ` + GM_getValue("dshu") + `, tableData: [], passw:"password" } }, created(){ /** * * @param type 消息类型 * @param receiveParams 消息参数 */ window['vueDefinedProp'] = (type,receiveParams) => { if (type === 'push'){ let length = this.tableData.length this.tableData.push({index: length + 1,question: receiveParams.question,answer: receiveParams.answer,style:receiveParams.style}) }else if (type === 'clear'){ this.tableData = [] }else if (type === 'tip'){ if (receiveParams.type && receiveParams.type === 'jump'){ window.parent.postMessage({"type": 'jump'}, '*'); }else if (receiveParams.type && receiveParams.type === 'error'){ this.need_jump = true }else if (receiveParams.type && receiveParams.type === 'hidden'){ this.hidden = true }else if (receiveParams.type && receiveParams.type === 'stop'){ this.opt.stop = true } this.tip = receiveParams.tip }else if (type === 'stop'){ this.opt.stop = receiveParams }else if (type === 'start_pay'){ this.opt.start_pay = receiveParams }else if (type === 'update'){ this.updateScript(receiveParams.v1,receiveParams.v2,receiveParams.href) } } } , mounted() { }, beforeDestroy() { }, methods: { save_setting(){ window.parent.postMessage({type: 'save_setting',search_delay:this.search_delay,gpt:this.gpt}, '*'); this.show_setting = false }, updateScript(currentVersion,newVersion,href){ this.$confirm('您当前版本为'+currentVersion+'最新版本为'+newVersion+',推荐下载更新', '脚本有更新', { customClass: 'message-update-tip', confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { window.open(href) }); setTimeout(()=>{ this.$msgbox.close(); },5000) }, tableRowClassName({row, rowIndex}) { return row.style }, btnClick(e,type){ if (type === 'opt.stop'){//暂停搜索 this.opt.stop = !this.opt.stop this.tip = this.opt.stop? '已暂停搜索': '继续搜索' window.parent.postMessage({type: 'stop',val:this.opt.stop}, '*'); }else if (type === 'opt.start_pay'){ window.parent.postMessage({type: 'start_pay',flag:!this.opt.start_pay}, '*'); }else if (type === 'opt.auto_jump'){//开启自动切换 this.opt.auto_jump = ! this.opt.auto_jump window.parent.postMessage({type: 'auto_jump',flag:this.opt.auto_jump}, '*'); }else if (type === 'opt.jump'){//跳过本题 window.parent.postMessage({type: 'jump'}, '*'); this.need_jump = false }else if (type === 'opt.confim'){ window.parent.postMessage({type: 'confim',token:e}, '*'); } } } }) </script> </html> `; addModal2(html); checkVersion(); } function addModal2(html, newPos, footerChildNode = false) { let headersNode = createContainer("hcsearche-modal-links"); let adNode = top.document.createElement("img"); let item = { url: GM_getResourceURL("Img") }; const getAdList = GM_getValue("adList"); if (getAdList) { const adList = JSON.parse(getAdList); let lastShown = GM_getValue("lastShown") || 0; item = adList[lastShown]; GM_setValue("lastShown", (lastShown + 1) % adList.length); item.base64 = GM_getValue(item.hash); } var htValue = GM_getValue('ht'); adNode.setAttribute("src", htValue && htValue.trim() !== '' ? htValue : 'https://168tiku.icu/img/2415.png'); adNode.setAttribute("draggable", "false"); adNode.setAttribute("style", "display: block;width:321px;cursor:move;"); if (item.click) { adNode.setAttribute("onmousedown", "let ts=new Date().getTime();this.onmouseup=()=>{if(new Date().getTime()-ts>100){return false;};this.onmouseup=undefined}"); } headersNode.appendChild(adNode); let iframeNode = top.document.createElement("iframe"); iframeNode.id = "iframeNode"; iframeNode.setAttribute("width", "100%"); iframeNode.setAttribute("height", GLOBAL.length + "px"); iframeNode.setAttribute("style", "height:" + GLOBAL.length + "px"); iframeNode.setAttribute("frameborder", "0"); iframeNode.srcdoc = html; let contentNode = createContainer("content-modal", [ headersNode, iframeNode ]); let modal = renderModal(contentNode); dragModel(modal); if (GM_getValue("hide")) { $("#model-id").hide(); vm.hideTip(); } } function renderModal(childElem, newPos) { return render("tag" + rand(1, 100).toString(), "model-id", childElem); } function render(tagName, elemId, childElem, isFixed, newPos) { let doc = top.document; let elem = doc.getElementById(elemId); if (elem) { elem.innerHTML = ""; } else { elem = doc.createElement(tagName); elem.id = elemId; doc.body.appendChild(elem); } let contentNode = createContainer(tagName + "-container", childElem); elem.appendChild(contentNode); elem.classList.add(elemId); elem.style.zIndex = "9999999"; elem.style.position = "fixed"; const pos = GM_getValue("pos") === undefined ? "30px,30px" : GM_getValue("pos"); const posarr = pos.split(","); elem.style.left = posarr[0]; elem.style.top = posarr[1]; setTimeout(function() { elem.classList.add(elemId + "-show"); }, 10); return elem; } const init$1 = async ($TiMu, select, wrap) => { let question = formatString(filterImg($TiMu.find(select.elements.question))); let data = { $item: $TiMu, question_text: $TiMu.find(select.elements.question).text(), question: question.length === 0 ? $TiMu.find(select.elements.question) : question.replace(/^\d+、/, "").replace(/[((](\d+\s?(\.\d+)?分)[))]$/, "").replace(/^((\d+.(\s+)?)?)[\[((【](.*?)[】))\]]/, "").trim(), $options: select.elements.$options ? $TiMu.find(select.elements.$options) : undefined, options: select.elements.options ? jQuery.map($TiMu.find(select.elements.options), function(val) { return formatString(filterImg(val)).replace(/^[A-Ga-g][.、]/, "").trim(); }) : undefined }; if (select.elements.type) { const getType = getQuestionType($TiMu.find(select.elements.type).text()); const val = $TiMu.find(select.elements.type).val(); data.type = isNaN(getType) ? isNaN(val) ? val : parseInt(val) : getType; } else { console.log("自动获取题目类型", defaultWorkTypeResolver(data.$options)); data.type = defaultWorkTypeResolver(data.$options); } if (select.elements.answer) { data.answer = getAnswer(filterImg($TiMu.find(select.elements.answer)) || $TiMu.find(select.elements.answer).val(), data.options, data.type); } if (data && data.type === 3 && data.options.length === 0) { data.options = [ "正确", "错误" ]; } const r = await wrap(data); if (typeof r === "boolean") return undefined; return data; }; async function WorkerJSPlus(options) { if (GLOBAL.isMatch) return; const match = options.match ? typeof options.match === "boolean" ? options.match : options.match() : false; if (!match) return; GLOBAL.isMatch = true; if (options.hook && typeof options.hook === "function") { if (options.hook()) return; } const defaultFunc = () => {}; const main = () => { setTimeout(() => { showPanel(); if (options.init && typeof options.init === "function") { if (options.init()) return; } const select = { root: options.root, elements: options.elements, ignore_click: options.ignore_click }; new WorkerJS(select, options.wrap ? options.wrap : defaultFunc, options.fill ? options.fill : defaultFunc, options.finished ? options.finished : defaultFunc, options.fillFinish ? options.fillFinish : defaultFunc).fillAnswer(); }, GLOBAL.delay); }; if (options.intv) { setIntervalFunc(options.intv, main); } else { main(); } } var WorkerJS = function(select, searchHander, fillHander, onFinish = function(need_jump) {}, fillFinish = function() {}) { GLOBAL.index = 0; this.init = init$1; this.fillAnswer = async () => { let arr = jQuery(select.root); while (true) { if (arr.length === 0) return; await sleep((isNaN(parseInt(GM_getValue("search_delay"))) ? 2 : GM_getValue("search_delay")) * 1e3); if (GLOBAL.stop) { continue; } if (GLOBAL.index >= arr.length) { let auto_jump = GM_getValue("auto_jump") === undefined || GM_getValue("auto_jump"); const next = await onFinish(auto_jump); if (next) { GLOBAL.index = 0; setTimeout(this.fillAnswer, 300); } if (auto_jump) { iframeMsg("tip", { tip: "自动答题已完成,即将切换下一题" }); next || setTimeout(() => { iframeMsg("tip", { type: "hidden", tip: "自动答题已完成,请检查提交" }); }, Math.max(GM_getValue("search_delay") || 2, 5) * 1e3); } else { iframeMsg("tip", { tip: "自动答题已完成" + (arr.length === 1 ? ",请手动切换" : "请检查提交") }); } return true; } try { let data = await this.init(jQuery(arr[GLOBAL.index++]), select, searchHander); if (!data) { GLOBAL.index--; continue; } iframeMsg("tip", { tip: "准备答第" + GLOBAL.index + "题" }); const formatResult = await formatSearchAnswer(data); const hookAnswer = data.answer && data.answer.length > 0 && GM_getValue("start_pay"); const formatAns = hookAnswer ? { success: true, num: formatResult.num, list: [ data.answer ] } : formatResult; if (formatResult.answers || formatAns.success) { console.log('余额'+formatAns.num) GM_setValue("yue",formatAns.num); iframeMsg("tip", { tip: "准备填充答案," + (formatAns.num === -1 ? "-畅快答题" : "剩余积分:" + formatAns.num) }); const func = !hookAnswer && formatResult.answers ? defaultFillAnswer : defaultQuestionResolve; let r = await func(hookAnswer ? formatAns.list : formatAns.answers ? formatResult.answers : formatAns.list, data, fillHander, select.ignore_click ? select.ignore_click : () => { return false; }); iframeMsg("push", { index: GLOBAL.index, question: r.question, answer: r.ans, style: r.style }); GM_getValue("start_pay") && String(GM_getValue("token")).length === 10 && catchAnswer(r); await fillFinish(r); } else { GLOBAL.index--; iframeMsg("tip", { tip: formatAns.msg }); } } catch (e) { GLOBAL.index--; console.table(e); iframeMsg("tip", { type: "error", tip: "发生异常" + e + "请反馈至QQ群" + QQ_GROUP }); } } }; }; var Typr = {}; Typr["parse"] = function(buff) { var readFont = function(data, idx, offset, tmap) { Typr["B"]; var T = Typr["T"]; var prsr = { cmap: T.cmap, head: T.head, hhea: T.hhea, maxp: T.maxp, hmtx: T.hmtx, name: T.name, "OS/2": T.OS2, post: T.post, loca: T.loca, kern: T.kern, glyf: T.glyf, "CFF ": T.CFF, "SVG ": T.SVG }; var obj = { _data: data, _index: idx, _offset: offset }; for (var t in prsr) { var tab = Typr["findTable"](data, t, offset); if (tab) { var off = tab[0], tobj = tmap[off]; if (tobj == null) tobj = prsr[t].parseTab(data, off, tab[1], obj); obj[t] = tmap[off] = tobj; } } return obj; }; var bin = Typr["B"]; var data = new Uint8Array(buff); var tmap = {}; var tag = bin.readASCII(data, 0, 4); if (tag == "ttcf") { var offset = 4; bin.readUshort(data, offset); offset += 2; bin.readUshort(data, offset); offset += 2; var numF = bin.readUint(data, offset); offset += 4; var fnts = []; for (var i = 0; i < numF; i++) { var foff = bin.readUint(data, offset); offset += 4; fnts.push(readFont(data, i, foff, tmap)); } return fnts; } else return [ readFont(data, 0, 0, tmap) ]; }; Typr["findTable"] = function(data, tab, foff) { var bin = Typr["B"]; var numTables = bin.readUshort(data, foff + 4); var offset = foff + 12; for (var i = 0; i < numTables; i++) { var tag = bin.readASCII(data, offset, 4); bin.readUint(data, offset + 4); var toffset = bin.readUint(data, offset + 8); var length = bin.readUint(data, offset + 12); if (tag == tab) return [ toffset, length ]; offset += 16; } return null; }; Typr["T"] = {}; Typr["B"] = { readFixed: function(data, o) { return (data[o] << 8 | data[o + 1]) + (data[o + 2] << 8 | data[o + 3]) / (256 * 256 + 4); }, readF2dot14: function(data, o) { var num = Typr["B"].readShort(data, o); return num / 16384; }, readInt: function(buff, p) { var a = Typr["B"].t.uint8; a[0] = buff[p + 3]; a[1] = buff[p + 2]; a[2] = buff[p + 1]; a[3] = buff[p]; return Typr["B"].t.int32[0]; }, readInt8: function(buff, p) { var a = Typr["B"].t.uint8; a[0] = buff[p]; return Typr["B"].t.int8[0]; }, readShort: function(buff, p) { var a = Typr["B"].t.uint8; a[1] = buff[p]; a[0] = buff[p + 1]; return Typr["B"].t.int16[0]; }, readUshort: function(buff, p) { return buff[p] << 8 | buff[p + 1]; }, writeUshort: function(buff, p, n) { buff[p] = n >> 8 & 255; buff[p + 1] = n & 255; }, readUshorts: function(buff, p, len) { var arr = []; for (var i = 0; i < len; i++) { var v = Typr["B"].readUshort(buff, p + i * 2); arr.push(v); } return arr; }, readUint: function(buff, p) { var a = Typr["B"].t.uint8; a[3] = buff[p]; a[2] = buff[p + 1]; a[1] = buff[p + 2]; a[0] = buff[p + 3]; return Typr["B"].t.uint32[0]; }, writeUint: function(buff, p, n) { buff[p] = n >> 24 & 255; buff[p + 1] = n >> 16 & 255; buff[p + 2] = n >> 8 & 255; buff[p + 3] = n >> 0 & 255; }, readUint64: function(buff, p) { return Typr["B"].readUint(buff, p) * (4294967295 + 1) + Typr["B"].readUint(buff, p + 4); }, readASCII: function(buff, p, l) { var s = ""; for (var i = 0; i < l; i++) s += String.fromCharCode(buff[p + i]); return s; }, writeASCII: function(buff, p, s) { for (var i = 0; i < s.length; i++) buff[p + i] = s.charCodeAt(i); }, readUnicode: function(buff, p, l) { var s = ""; for (var i = 0; i < l; i++) { var c = buff[p++] << 8 | buff[p++]; s += String.fromCharCode(c); } return s; }, _tdec: window["TextDecoder"] ? new window["TextDecoder"]() : null, readUTF8: function(buff, p, l) { var tdec = Typr["B"]._tdec; if (tdec && p == 0 && l == buff.length) return tdec["decode"](buff); return Typr["B"].readASCII(buff, p, l); }, readBytes: function(buff, p, l) { var arr = []; for (var i = 0; i < l; i++) arr.push(buff[p + i]); return arr; }, readASCIIArray: function(buff, p, l) { var s = []; for (var i = 0; i < l; i++) s.push(String.fromCharCode(buff[p + i])); return s; }, t: function() { var ab = new ArrayBuffer(8); return { buff: ab, int8: new Int8Array(ab), uint8: new Uint8Array(ab), int16: new Int16Array(ab), uint16: new Uint16Array(ab), int32: new Int32Array(ab), uint32: new Uint32Array(ab) }; }() }; Typr["T"].CFF = { parseTab: function(data, offset, length) { var bin = Typr["B"]; var CFF = Typr["T"].CFF; data = new Uint8Array(data.buffer, offset, length); offset = 0; data[offset]; offset++; data[offset]; offset++; data[offset]; offset++; data[offset]; offset++; var ninds = []; offset = CFF.readIndex(data, offset, ninds); var names = []; for (var i = 0; i < ninds.length - 1; i++) names.push(bin.readASCII(data, offset + ninds[i], ninds[i + 1] - ninds[i])); offset += ninds[ninds.length - 1]; var tdinds = []; offset = CFF.readIndex(data, offset, tdinds); var topDicts = []; for (var i = 0; i < tdinds.length - 1; i++) topDicts.push(CFF.readDict(data, offset + tdinds[i], offset + tdinds[i + 1])); offset += tdinds[tdinds.length - 1]; var topdict = topDicts[0]; var sinds = []; offset = CFF.readIndex(data, offset, sinds); var strings = []; for (var i = 0; i < sinds.length - 1; i++) strings.push(bin.readASCII(data, offset + sinds[i], sinds[i + 1] - sinds[i])); offset += sinds[sinds.length - 1]; CFF.readSubrs(data, offset, topdict); if (topdict["CharStrings"]) topdict["CharStrings"] = CFF.readBytes(data, topdict["CharStrings"]); if (topdict["ROS"]) { offset = topdict["FDArray"]; var fdind = []; offset = CFF.readIndex(data, offset, fdind); topdict["FDArray"] = []; for (var i = 0; i < fdind.length - 1; i++) { var dict = CFF.readDict(data, offset + fdind[i], offset + fdind[i + 1]); CFF._readFDict(data, dict, strings); topdict["FDArray"].push(dict); } offset += fdind[fdind.length - 1]; offset = topdict["FDSelect"]; topdict["FDSelect"] = []; var fmt = data[offset]; offset++; if (fmt == 3) { var rns = bin.readUshort(data, offset); offset += 2; for (var i = 0; i < rns + 1; i++) { topdict["FDSelect"].push(bin.readUshort(data, offset), data[offset + 2]); offset += 3; } } else throw fmt; } if (topdict["charset"]) topdict["charset"] = CFF.readCharset(data, topdict["charset"], topdict["CharStrings"].length); CFF._readFDict(data, topdict, strings); return topdict; }, _readFDict: function(data, dict, ss) { var CFF = Typr["T"].CFF; var offset; if (dict["Private"]) { offset = dict["Private"][1]; dict["Private"] = CFF.readDict(data, offset, offset + dict["Private"][0]); if (dict["Private"]["Subrs"]) CFF.readSubrs(data, offset + dict["Private"]["Subrs"], dict["Private"]); } for (var p in dict) if ([ "FamilyName", "FontName", "FullName", "Notice", "version", "Copyright" ].indexOf(p) != -1) dict[p] = ss[dict[p] - 426 + 35]; }, readSubrs: function(data, offset, obj) { obj["Subrs"] = Typr["T"].CFF.readBytes(data, offset); var bias, nSubrs = obj["Subrs"].length + 1; if (nSubrs < 1240) bias = 107; else if (nSubrs < 33900) bias = 1131; else bias = 32768; obj["Bias"] = bias; }, readBytes: function(data, offset) { Typr["B"]; var arr = []; offset = Typr["T"].CFF.readIndex(data, offset, arr); var subrs = [], arl = arr.length - 1, no = data.byteOffset + offset; for (var i = 0; i < arl; i++) { var ari = arr[i]; subrs.push(new Uint8Array(data.buffer, no + ari, arr[i + 1] - ari)); } return subrs; }, 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 ], glyphByUnicode: function(cff, code) { for (var i = 0; i < cff["charset"].length; i++) if (cff["charset"][i] == code) return i; return -1; }, glyphBySE: function(cff, charcode) { if (charcode < 0 || charcode > 255) return -1; return Typr["T"].CFF.glyphByUnicode(cff, Typr["T"].CFF.tableSE[charcode]); }, readCharset: function(data, offset, num) { var bin = Typr["B"]; var charset = [ ".notdef" ]; var format = data[offset]; offset++; if (format == 0) { for (var i = 0; i < num; i++) { var first = bin.readUshort(data, offset); offset += 2; charset.push(first); } } else if (format == 1 || format == 2) { while (charset.length < num) { var first = bin.readUshort(data, offset); offset += 2; var nLeft = 0; if (format == 1) { nLeft = data[offset]; offset++; } else { nLeft = bin.readUshort(data, offset); offset += 2; } for (var i = 0; i <= nLeft; i++) { charset.push(first); first++; } } } else throw "error: format: " + format; return charset; }, readIndex: function(data, offset, inds) { var bin = Typr["B"]; var count = bin.readUshort(data, offset) + 1; offset += 2; var offsize = data[offset]; offset++; if (offsize == 1) for (var i = 0; i < count; i++) inds.push(data[offset + i]); else if (offsize == 2) for (var i = 0; i < count; i++) inds.push(bin.readUshort(data, offset + i * 2)); else if (offsize == 3) for (var i = 0; i < count; i++) inds.push(bin.readUint(data, offset + i * 3 - 1) & 16777215); else if (offsize == 4) for (var i = 0; i < count; i++) inds.push(bin.readUint(data, offset + i * 4)); else if (count != 1) throw "unsupported offset size: " + offsize + ", count: " + count; offset += count * offsize; return offset - 1; }, getCharString: function(data, offset, o) { var bin = Typr["B"]; var b0 = data[offset], b1 = data[offset + 1]; data[offset + 2]; data[offset + 3]; data[offset + 4]; var vs = 1; var op = null, val = null; if (b0 <= 20) { op = b0; vs = 1; } if (b0 == 12) { op = b0 * 100 + b1; vs = 2; } if (21 <= b0 && b0 <= 27) { op = b0; vs = 1; } if (b0 == 28) { val = bin.readShort(data, offset + 1); vs = 3; } if (29 <= b0 && b0 <= 31) { op = b0; vs = 1; } if (32 <= b0 && b0 <= 246) { val = b0 - 139; vs = 1; } if (247 <= b0 && b0 <= 250) { val = (b0 - 247) * 256 + b1 + 108; vs = 2; } if (251 <= b0 && b0 <= 254) { val = -(b0 - 251) * 256 - b1 - 108; vs = 2; } if (b0 == 255) { val = bin.readInt(data, offset + 1) / 65535; vs = 5; } o.val = val != null ? val : "o" + op; o.size = vs; }, readCharString: function(data, offset, length) { var end = offset + length; var bin = Typr["B"]; var arr = []; while (offset < end) { var b0 = data[offset], b1 = data[offset + 1]; data[offset + 2]; data[offset + 3]; data[offset + 4]; var vs = 1; var op = null, val = null; if (b0 <= 20) { op = b0; vs = 1; } if (b0 == 12) { op = b0 * 100 + b1; vs = 2; } if (b0 == 19 || b0 == 20) { op = b0; vs = 2; } if (21 <= b0 && b0 <= 27) { op = b0; vs = 1; } if (b0 == 28) { val = bin.readShort(data, offset + 1); vs = 3; } if (29 <= b0 && b0 <= 31) { op = b0; vs = 1; } if (32 <= b0 && b0 <= 246) { val = b0 - 139; vs = 1; } if (247 <= b0 && b0 <= 250) { val = (b0 - 247) * 256 + b1 + 108; vs = 2; } if (251 <= b0 && b0 <= 254) { val = -(b0 - 251) * 256 - b1 - 108; vs = 2; } if (b0 == 255) { val = bin.readInt(data, offset + 1) / 65535; vs = 5; } arr.push(val != null ? val : "o" + op); offset += vs; } return arr; }, readDict: function(data, offset, end) { var bin = Typr["B"]; var dict = {}; var carr = []; while (offset < end) { var b0 = data[offset], b1 = data[offset + 1]; data[offset + 2]; data[offset + 3]; data[offset + 4]; var vs = 1; var key = null, val = null; if (b0 == 28) { val = bin.readShort(data, offset + 1); vs = 3; } if (b0 == 29) { val = bin.readInt(data, offset + 1); vs = 5; } if (32 <= b0 && b0 <= 246) { val = b0 - 139; vs = 1; } if (247 <= b0 && b0 <= 250) { val = (b0 - 247) * 256 + b1 + 108; vs = 2; } if (251 <= b0 && b0 <= 254) { val = -(b0 - 251) * 256 - b1 - 108; vs = 2; } if (b0 == 255) { val = bin.readInt(data, offset + 1) / 65535; vs = 5; throw "unknown number"; } if (b0 == 30) { var nibs = []; vs = 1; while (true) { var b = data[offset + vs]; vs++; var nib0 = b >> 4, nib1 = b & 15; if (nib0 != 15) nibs.push(nib0); if (nib1 != 15) nibs.push(nib1); if (nib1 == 15) break; } var s = ""; var chars = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ".", "e", "e-", "reserved", "-", "endOfNumber" ]; for (var i = 0; i < nibs.length; i++) s += chars[nibs[i]]; val = parseFloat(s); } if (b0 <= 21) { var keys = [ "version", "Notice", "FullName", "FamilyName", "Weight", "FontBBox", "BlueValues", "OtherBlues", "FamilyBlues", "FamilyOtherBlues", "StdHW", "StdVW", "escape", "UniqueID", "XUID", "charset", "Encoding", "CharStrings", "Private", "Subrs", "defaultWidthX", "nominalWidthX" ]; key = keys[b0]; vs = 1; if (b0 == 12) { var keys = [ "Copyright", "isFixedPitch", "ItalicAngle", "UnderlinePosition", "UnderlineThickness", "PaintType", "CharstringType", "FontMatrix", "StrokeWidth", "BlueScale", "BlueShift", "BlueFuzz", "StemSnapH", "StemSnapV", "ForceBold", "", "", "LanguageGroup", "ExpansionFactor", "initialRandomSeed", "SyntheticBase", "PostScript", "BaseFontName", "BaseFontBlend", "", "", "", "", "", "", "ROS", "CIDFontVersion", "CIDFontRevision", "CIDFontType", "CIDCount", "UIDBase", "FDArray", "FDSelect", "FontName" ]; key = keys[b1]; vs = 2; } } if (key != null) { dict[key] = carr.length == 1 ? carr[0] : carr; carr = []; } else carr.push(val); offset += vs; } return dict; } }; Typr["T"].cmap = { parseTab: function(data, offset, length) { var obj = { tables: [], ids: {}, off: offset }; data = new Uint8Array(data.buffer, offset, length); offset = 0; var bin = Typr["B"], rU = bin.readUshort, cmap = Typr["T"].cmap; rU(data, offset); offset += 2; var numTables = rU(data, offset); offset += 2; var offs = []; for (var i = 0; i < numTables; i++) { var platformID = rU(data, offset); offset += 2; var encodingID = rU(data, offset); offset += 2; var noffset = bin.readUint(data, offset); offset += 4; var id = "p" + platformID + "e" + encodingID; var tind = offs.indexOf(noffset); if (tind == -1) { tind = obj.tables.length; var subt = {}; offs.push(noffset); var format = subt.format = rU(data, noffset); if (format == 0) subt = cmap.parse0(data, noffset, subt); else if (format == 4) subt = cmap.parse4(data, noffset, subt); else if (format == 6) subt = cmap.parse6(data, noffset, subt); else if (format == 12) subt = cmap.parse12(data, noffset, subt); obj.tables.push(subt); } if (obj.ids[id] != null) throw "multiple tables for one platform+encoding"; obj.ids[id] = tind; } return obj; }, parse0: function(data, offset, obj) { var bin = Typr["B"]; offset += 2; var len = bin.readUshort(data, offset); offset += 2; bin.readUshort(data, offset); offset += 2; obj.map = []; for (var i = 0; i < len - 6; i++) obj.map.push(data[offset + i]); return obj; }, parse4: function(data, offset, obj) { var bin = Typr["B"], rU = bin.readUshort, rUs = bin.readUshorts; var offset0 = offset; offset += 2; var length = rU(data, offset); offset += 2; rU(data, offset); offset += 2; var segCountX2 = rU(data, offset); offset += 2; var segCount = segCountX2 >>> 1; obj.searchRange = rU(data, offset); offset += 2; obj.entrySelector = rU(data, offset); offset += 2; obj.rangeShift = rU(data, offset); offset += 2; obj.endCount = rUs(data, offset, segCount); offset += segCount * 2; offset += 2; obj.startCount = rUs(data, offset, segCount); offset += segCount * 2; obj.idDelta = []; for (var i = 0; i < segCount; i++) { obj.idDelta.push(bin.readShort(data, offset)); offset += 2; } obj.idRangeOffset = rUs(data, offset, segCount); offset += segCount * 2; obj.glyphIdArray = rUs(data, offset, offset0 + length - offset >>> 1); return obj; }, parse6: function(data, offset, obj) { var bin = Typr["B"]; offset += 2; bin.readUshort(data, offset); offset += 2; bin.readUshort(data, offset); offset += 2; obj.firstCode = bin.readUshort(data, offset); offset += 2; var entryCount = bin.readUshort(data, offset); offset += 2; obj.glyphIdArray = []; for (var i = 0; i < entryCount; i++) { obj.glyphIdArray.push(bin.readUshort(data, offset)); offset += 2; } return obj; }, parse12: function(data, offset, obj) { var bin = Typr["B"], rU = bin.readUint; offset += 4; rU(data, offset); offset += 4; rU(data, offset); offset += 4; var nGroups = rU(data, offset) * 3; offset += 4; var gps = obj.groups = new Uint32Array(nGroups); for (var i = 0; i < nGroups; i += 3) { gps[i] = rU(data, offset + (i << 2)); gps[i + 1] = rU(data, offset + (i << 2) + 4); gps[i + 2] = rU(data, offset + (i << 2) + 8); } return obj; } }; Typr["T"].glyf = { parseTab: function(data, offset, length, font) { var obj = [], ng = font["maxp"]["numGlyphs"]; for (var g = 0; g < ng; g++) obj.push(null); return obj; }, _parseGlyf: function(font, g) { var bin = Typr["B"]; var data = font["_data"], loca = font["loca"]; if (loca[g] == loca[g + 1]) return null; var offset = Typr["findTable"](data, "glyf", font["_offset"])[0] + loca[g]; var gl = {}; gl.noc = bin.readShort(data, offset); offset += 2; gl.xMin = bin.readShort(data, offset); offset += 2; gl.yMin = bin.readShort(data, offset); offset += 2; gl.xMax = bin.readShort(data, offset); offset += 2; gl.yMax = bin.readShort(data, offset); offset += 2; if (gl.xMin >= gl.xMax || gl.yMin >= gl.yMax) return null; if (gl.noc > 0) { gl.endPts = []; for (var i = 0; i < gl.noc; i++) { gl.endPts.push(bin.readUshort(data, offset)); offset += 2; } var instructionLength = bin.readUshort(data, offset); offset += 2; if (data.length - offset < instructionLength) return null; gl.instructions = bin.readBytes(data, offset, instructionLength); offset += instructionLength; var crdnum = gl.endPts[gl.noc - 1] + 1; gl.flags = []; for (var i = 0; i < crdnum; i++) { var flag = data[offset]; offset++; gl.flags.push(flag); if ((flag & 8) != 0) { var rep = data[offset]; offset++; for (var j = 0; j < rep; j++) { gl.flags.push(flag); i++; } } } gl.xs = []; for (var i = 0; i < crdnum; i++) { var i8 = (gl.flags[i] & 2) != 0, same = (gl.flags[i] & 16) != 0; if (i8) { gl.xs.push(same ? data[offset] : -data[offset]); offset++; } else { if (same) gl.xs.push(0); else { gl.xs.push(bin.readShort(data, offset)); offset += 2; } } } gl.ys = []; for (var i = 0; i < crdnum; i++) { var i8 = (gl.flags[i] & 4) != 0, same = (gl.flags[i] & 32) != 0; if (i8) { gl.ys.push(same ? data[offset] : -data[offset]); offset++; } else { if (same) gl.ys.push(0); else { gl.ys.push(bin.readShort(data, offset)); offset += 2; } } } var x = 0, y = 0; for (var i = 0; i < crdnum; i++) { x += gl.xs[i]; y += gl.ys[i]; gl.xs[i] = x; gl.ys[i] = y; } } else { var ARG_1_AND_2_ARE_WORDS = 1 << 0; var ARGS_ARE_XY_VALUES = 1 << 1; var WE_HAVE_A_SCALE = 1 << 3; var MORE_COMPONENTS = 1 << 5; var WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6; var WE_HAVE_A_TWO_BY_TWO = 1 << 7; var WE_HAVE_INSTRUCTIONS = 1 << 8; gl.parts = []; var flags; do { flags = bin.readUshort(data, offset); offset += 2; var part = { m: { a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 }, p1: -1, p2: -1 }; gl.parts.push(part); part.glyphIndex = bin.readUshort(data, offset); offset += 2; if (flags & ARG_1_AND_2_ARE_WORDS) { var arg1 = bin.readShort(data, offset); offset += 2; var arg2 = bin.readShort(data, offset); offset += 2; } else { var arg1 = bin.readInt8(data, offset); offset++; var arg2 = bin.readInt8(data, offset); offset++; } if (flags & ARGS_ARE_XY_VALUES) { part.m.tx = arg1; part.m.ty = arg2; } else { part.p1 = arg1; part.p2 = arg2; } if (flags & WE_HAVE_A_SCALE) { part.m.a = part.m.d = bin.readF2dot14(data, offset); offset += 2; } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) { part.m.a = bin.readF2dot14(data, offset); offset += 2; part.m.d = bin.readF2dot14(data, offset); offset += 2; } else if (flags & WE_HAVE_A_TWO_BY_TWO) { part.m.a = bin.readF2dot14(data, offset); offset += 2; part.m.b = bin.readF2dot14(data, offset); offset += 2; part.m.c = bin.readF2dot14(data, offset); offset += 2; part.m.d = bin.readF2dot14(data, offset); offset += 2; } } while (flags & MORE_COMPONENTS); if (flags & WE_HAVE_INSTRUCTIONS) { var numInstr = bin.readUshort(data, offset); offset += 2; gl.instr = []; for (var i = 0; i < numInstr; i++) { gl.instr.push(data[offset]); offset++; } } } return gl; } }; Typr["T"].head = { parseTab: function(data, offset, length) { var bin = Typr["B"]; var obj = {}; bin.readFixed(data, offset); offset += 4; obj["fontRevision"] = bin.readFixed(data, offset); offset += 4; bin.readUint(data, offset); offset += 4; bin.readUint(data, offset); offset += 4; obj["flags"] = bin.readUshort(data, offset); offset += 2; obj["unitsPerEm"] = bin.readUshort(data, offset); offset += 2; obj["created"] = bin.readUint64(data, offset); offset += 8; obj["modified"] = bin.readUint64(data, offset); offset += 8; obj["xMin"] = bin.readShort(data, offset); offset += 2; obj["yMin"] = bin.readShort(data, offset); offset += 2; obj["xMax"] = bin.readShort(data, offset); offset += 2; obj["yMax"] = bin.readShort(data, offset); offset += 2; obj["macStyle"] = bin.readUshort(data, offset); offset += 2; obj["lowestRecPPEM"] = bin.readUshort(data, offset); offset += 2; obj["fontDirectionHint"] = bin.readShort(data, offset); offset += 2; obj["indexToLocFormat"] = bin.readShort(data, offset); offset += 2; obj["glyphDataFormat"] = bin.readShort(data, offset); offset += 2; return obj; } }; Typr["T"].hhea = { parseTab: function(data, offset, length) { var bin = Typr["B"]; var obj = {}; bin.readFixed(data, offset); offset += 4; var keys = [ "ascender", "descender", "lineGap", "advanceWidthMax", "minLeftSideBearing", "minRightSideBearing", "xMaxExtent", "caretSlopeRise", "caretSlopeRun", "caretOffset", "res0", "res1", "res2", "res3", "metricDataFormat", "numberOfHMetrics" ]; for (var i = 0; i < keys.length; i++) { var key = keys[i]; var func = key == "advanceWidthMax" || key == "numberOfHMetrics" ? bin.readUshort : bin.readShort; obj[key] = func(data, offset + i * 2); } return obj; } }; Typr["T"].hmtx = { parseTab: function(data, offset, length, font) { var bin = Typr["B"]; var aWidth = []; var lsBearing = []; var nG = font["maxp"]["numGlyphs"], nH = font["hhea"]["numberOfHMetrics"]; var aw = 0, lsb = 0, i = 0; while (i < nH) { aw = bin.readUshort(data, offset + (i << 2)); lsb = bin.readShort(data, offset + (i << 2) + 2); aWidth.push(aw); lsBearing.push(lsb); i++; } while (i < nG) { aWidth.push(aw); lsBearing.push(lsb); i++; } return { aWidth: aWidth, lsBearing: lsBearing }; } }; Typr["T"].kern = { parseTab: function(data, offset, length, font) { var bin = Typr["B"], kern = Typr["T"].kern; var version = bin.readUshort(data, offset); if (version == 1) return kern.parseV1(data, offset, length, font); var nTables = bin.readUshort(data, offset + 2); offset += 4; var map = { glyph1: [], rval: [] }; for (var i = 0; i < nTables; i++) { offset += 2; var length = bin.readUshort(data, offset); offset += 2; var coverage = bin.readUshort(data, offset); offset += 2; var format = coverage >>> 8; format &= 15; if (format == 0) offset = kern.readFormat0(data, offset, map); } return map; }, parseV1: function(data, offset, length, font) { var bin = Typr["B"], kern = Typr["T"].kern; bin.readFixed(data, offset); var nTables = bin.readUint(data, offset + 4); offset += 8; var map = { glyph1: [], rval: [] }; for (var i = 0; i < nTables; i++) { bin.readUint(data, offset); offset += 4; var coverage = bin.readUshort(data, offset); offset += 2; bin.readUshort(data, offset); offset += 2; var format = coverage & 255; if (format == 0) offset = kern.readFormat0(data, offset, map); } return map; }, readFormat0: function(data, offset, map) { var bin = Typr["B"], rUs = bin.readUshort; var pleft = -1; var nPairs = rUs(data, offset); rUs(data, offset + 2); rUs(data, offset + 4); rUs(data, offset + 6); offset += 8; for (var j = 0; j < nPairs; j++) { var left = rUs(data, offset); offset += 2; var right = rUs(data, offset); offset += 2; var value = bin.readShort(data, offset); offset += 2; if (left != pleft) { map.glyph1.push(left); map.rval.push({ glyph2: [], vals: [] }); } var rval = map.rval[map.rval.length - 1]; rval.glyph2.push(right); rval.vals.push(value); pleft = left; } return offset; } }; Typr["T"].loca = { parseTab: function(data, offset, length, font) { var bin = Typr["B"]; var obj = []; var ver = font["head"]["indexToLocFormat"]; var len = font["maxp"]["numGlyphs"] + 1; if (ver == 0) for (var i = 0; i < len; i++) obj.push(bin.readUshort(data, offset + (i << 1)) << 1); if (ver == 1) for (var i = 0; i < len; i++) obj.push(bin.readUint(data, offset + (i << 2))); return obj; } }; Typr["T"].maxp = { parseTab: function(data, offset, length) { var bin = Typr["B"], rU = bin.readUshort; var obj = {}; bin.readUint(data, offset); offset += 4; obj["numGlyphs"] = rU(data, offset); offset += 2; return obj; } }; Typr["T"].name = { parseTab: function(data, offset, length) { var bin = Typr["B"]; var obj = {}; bin.readUshort(data, offset); offset += 2; var count = bin.readUshort(data, offset); offset += 2; bin.readUshort(data, offset); offset += 2; 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" ]; var offset0 = offset; var rU = bin.readUshort; for (var i = 0; i < count; i++) { var platformID = rU(data, offset); offset += 2; var encodingID = rU(data, offset); offset += 2; var languageID = rU(data, offset); offset += 2; var nameID = rU(data, offset); offset += 2; var slen = rU(data, offset); offset += 2; var noffset = rU(data, offset); offset += 2; var soff = offset0 + count * 12 + noffset; var str; if (platformID == 0) str = bin.readUnicode(data, soff, slen / 2); else if (platformID == 3 && encodingID == 0) str = bin.readUnicode(data, soff, slen / 2); else if (encodingID == 0) str = bin.readASCII(data, soff, slen); else if (encodingID == 1) str = bin.readUnicode(data, soff, slen / 2); else if (encodingID == 3) str = bin.readUnicode(data, soff, slen / 2); else if (encodingID == 4) str = bin.readUnicode(data, soff, slen / 2); else if (encodingID == 10) str = bin.readUnicode(data, soff, slen / 2); else if (platformID == 1) { str = bin.readASCII(data, soff, slen); console.log("reading unknown MAC encoding " + encodingID + " as ASCII"); } else { console.log("unknown encoding " + encodingID + ", platformID: " + platformID); str = bin.readASCII(data, soff, slen); } var tid = "p" + platformID + "," + languageID.toString(16); if (obj[tid] == null) obj[tid] = {}; obj[tid][names[nameID]] = str; obj[tid]["_lang"] = languageID; } var psn = "postScriptName"; for (var p in obj) if (obj[p][psn] != null && obj[p]["_lang"] == 1033) return obj[p]; for (var p in obj) if (obj[p][psn] != null && obj[p]["_lang"] == 0) return obj[p]; for (var p in obj) if (obj[p][psn] != null && obj[p]["_lang"] == 3084) return obj[p]; for (var p in obj) if (obj[p][psn] != null) return obj[p]; var out; for (var p in obj) { out = obj[p]; break; } console.log("returning name table with languageID " + out._lang); if (out[psn] == null && out["ID"] != null) out[psn] = out["ID"]; return out; } }; Typr["T"].OS2 = { parseTab: function(data, offset, length) { var bin = Typr["B"]; var ver = bin.readUshort(data, offset); offset += 2; var OS2 = Typr["T"].OS2; var obj = {}; if (ver == 0) OS2.version0(data, offset, obj); else if (ver == 1) OS2.version1(data, offset, obj); else if (ver == 2 || ver == 3 || ver == 4) OS2.version2(data, offset, obj); else if (ver == 5) OS2.version5(data, offset, obj); else throw "unknown OS/2 table version: " + ver; return obj; }, version0: function(data, offset, obj) { var bin = Typr["B"]; obj["xAvgCharWidth"] = bin.readShort(data, offset); offset += 2; obj["usWeightClass"] = bin.readUshort(data, offset); offset += 2; obj["usWidthClass"] = bin.readUshort(data, offset); offset += 2; obj["fsType"] = bin.readUshort(data, offset); offset += 2; obj["ySubscriptXSize"] = bin.readShort(data, offset); offset += 2; obj["ySubscriptYSize"] = bin.readShort(data, offset); offset += 2; obj["ySubscriptXOffset"] = bin.readShort(data, offset); offset += 2; obj["ySubscriptYOffset"] = bin.readShort(data, offset); offset += 2; obj["ySuperscriptXSize"] = bin.readShort(data, offset); offset += 2; obj["ySuperscriptYSize"] = bin.readShort(data, offset); offset += 2; obj["ySuperscriptXOffset"] = bin.readShort(data, offset); offset += 2; obj["ySuperscriptYOffset"] = bin.readShort(data, offset); offset += 2; obj["yStrikeoutSize"] = bin.readShort(data, offset); offset += 2; obj["yStrikeoutPosition"] = bin.readShort(data, offset); offset += 2; obj["sFamilyClass"] = bin.readShort(data, offset); offset += 2; obj["panose"] = bin.readBytes(data, offset, 10); offset += 10; obj["ulUnicodeRange1"] = bin.readUint(data, offset); offset += 4; obj["ulUnicodeRange2"] = bin.readUint(data, offset); offset += 4; obj["ulUnicodeRange3"] = bin.readUint(data, offset); offset += 4; obj["ulUnicodeRange4"] = bin.readUint(data, offset); offset += 4; obj["achVendID"] = bin.readASCII(data, offset, 4); offset += 4; obj["fsSelection"] = bin.readUshort(data, offset); offset += 2; obj["usFirstCharIndex"] = bin.readUshort(data, offset); offset += 2; obj["usLastCharIndex"] = bin.readUshort(data, offset); offset += 2; obj["sTypoAscender"] = bin.readShort(data, offset); offset += 2; obj["sTypoDescender"] = bin.readShort(data, offset); offset += 2; obj["sTypoLineGap"] = bin.readShort(data, offset); offset += 2; obj["usWinAscent"] = bin.readUshort(data, offset); offset += 2; obj["usWinDescent"] = bin.readUshort(data, offset); offset += 2; return offset; }, version1: function(data, offset, obj) { var bin = Typr["B"]; offset = Typr["T"].OS2.version0(data, offset, obj); obj["ulCodePageRange1"] = bin.readUint(data, offset); offset += 4; obj["ulCodePageRange2"] = bin.readUint(data, offset); offset += 4; return offset; }, version2: function(data, offset, obj) { var bin = Typr["B"], rU = bin.readUshort; offset = Typr["T"].OS2.version1(data, offset, obj); obj["sxHeight"] = bin.readShort(data, offset); offset += 2; obj["sCapHeight"] = bin.readShort(data, offset); offset += 2; obj["usDefault"] = rU(data, offset); offset += 2; obj["usBreak"] = rU(data, offset); offset += 2; obj["usMaxContext"] = rU(data, offset); offset += 2; return offset; }, version5: function(data, offset, obj) { var rU = Typr["B"].readUshort; offset = Typr["T"].OS2.version2(data, offset, obj); obj["usLowerOpticalPointSize"] = rU(data, offset); offset += 2; obj["usUpperOpticalPointSize"] = rU(data, offset); offset += 2; return offset; } }; Typr["T"].post = { parseTab: function(data, offset, length) { var bin = Typr["B"]; var obj = {}; obj["version"] = bin.readFixed(data, offset); offset += 4; obj["italicAngle"] = bin.readFixed(data, offset); offset += 4; obj["underlinePosition"] = bin.readShort(data, offset); offset += 2; obj["underlineThickness"] = bin.readShort(data, offset); offset += 2; return obj; } }; Typr["T"].SVG = { parseTab: function(data, offset, length) { var bin = Typr["B"]; var obj = { entries: [] }; var offset0 = offset; bin.readUshort(data, offset); offset += 2; var svgDocIndexOffset = bin.readUint(data, offset); offset += 4; bin.readUint(data, offset); offset += 4; offset = svgDocIndexOffset + offset0; var numEntries = bin.readUshort(data, offset); offset += 2; for (var i = 0; i < numEntries; i++) { var startGlyphID = bin.readUshort(data, offset); offset += 2; var endGlyphID = bin.readUshort(data, offset); offset += 2; var svgDocOffset = bin.readUint(data, offset); offset += 4; var svgDocLength = bin.readUint(data, offset); offset += 4; var sbuf = new Uint8Array(data.buffer, offset0 + svgDocOffset + svgDocIndexOffset, svgDocLength); var svg = bin.readUTF8(sbuf, 0, sbuf.length); for (var f = startGlyphID; f <= endGlyphID; f++) { obj.entries[f] = svg; } } return obj; } }; Typr["U"] = { shape: function(font, str, ltr) { var getGlyphPosition = function(font, gls, i1, ltr) { var g1 = gls[i1], g2 = gls[i1 + 1], kern = font["kern"]; if (kern) { var ind1 = kern.glyph1.indexOf(g1); if (ind1 != -1) { var ind2 = kern.rval[ind1].glyph2.indexOf(g2); if (ind2 != -1) return [ 0, 0, kern.rval[ind1].vals[ind2], 0 ]; } } return [ 0, 0, 0, 0 ]; }; var gls = []; for (var i = 0; i < str.length; i++) { var cc = str.codePointAt(i); if (cc > 65535) i++; gls.push(Typr["U"]["codeToGlyph"](font, cc)); } var shape = []; for (var i = 0; i < gls.length; i++) { var padj = getGlyphPosition(font, gls, i); var gid = gls[i]; var ax = font["hmtx"].aWidth[gid] + padj[2]; shape.push({ g: gid, cl: i, dx: 0, dy: 0, ax: ax, ay: 0 }); } return shape; }, shapeToPath: function(font, shape, clr) { var tpath = { cmds: [], crds: [] }; var x = 0, y = 0; for (var i = 0; i < shape.length; i++) { var it = shape[i]; var path = Typr["U"]["glyphToPath"](font, it["g"]), crds = path["crds"]; for (var j = 0; j < crds.length; j += 2) { tpath.crds.push(crds[j] + x + it["dx"]); tpath.crds.push(crds[j + 1] + y + it["dy"]); } if (clr) tpath.cmds.push(clr); for (var j = 0; j < path["cmds"].length; j++) tpath.cmds.push(path["cmds"][j]); var clen = tpath.cmds.length; if (clr) if (clen != 0 && tpath.cmds[clen - 1] != "X") tpath.cmds.push("X"); x += it["ax"]; y += it["ay"]; } return { cmds: tpath.cmds, crds: tpath.crds }; }, codeToGlyph: function(font, code) { var cmap = font["cmap"]; var tind = -1, pps = [ "p3e10", "p0e4", "p3e1", "p1e0", "p0e3", "p0e1" ]; for (var i = 0; i < pps.length; i++) if (cmap.ids[pps[i]] != null) { tind = cmap.ids[pps[i]]; break; } if (tind == -1) throw "no familiar platform and encoding!"; var arrSearch = function(arr, k, v) { var l = 0, r = Math.floor(arr.length / k); while (l + 1 != r) { var mid = l + (r - l >>> 1); if (arr[mid * k] <= v) l = mid; else r = mid; } return l * k; }; var tab = cmap.tables[tind], fmt = tab.format, gid = -1; if (fmt == 0) { if (code >= tab.map.length) gid = 0; else gid = tab.map[code]; } else if (fmt == 4) { var sind = -1, ec = tab.endCount; if (code > ec[ec.length - 1]) sind = -1; else { sind = arrSearch(ec, 1, code); if (ec[sind] < code) sind++; } if (sind == -1) gid = 0; else if (code < tab.startCount[sind]) gid = 0; else { var gli = 0; if (tab.idRangeOffset[sind] != 0) gli = tab.glyphIdArray[code - tab.startCount[sind] + (tab.idRangeOffset[sind] >> 1) - (tab.idRangeOffset.length - sind)]; else gli = code + tab.idDelta[sind]; gid = gli & 65535; } } else if (fmt == 6) { var off = code - tab.firstCode, arr = tab.glyphIdArray; if (off < 0 || off >= arr.length) gid = 0; else gid = arr[off]; } else if (fmt == 12) { var grp = tab.groups; if (code > grp[grp.length - 2]) gid = 0; else { var i = arrSearch(grp, 3, code); if (grp[i] <= code && code <= grp[i + 1]) { gid = grp[i + 2] + (code - grp[i]); } if (gid == -1) gid = 0; } } else throw "unknown cmap table format " + tab.format; var SVG = font["SVG "], loca = font["loca"]; if (gid != 0 && font["CFF "] == null && (SVG == null || SVG.entries[gid] == null) && loca[gid] == loca[gid + 1] && [ 9, 10, 11, 12, 13, 32, 133, 160, 5760, 8232, 8233, 8239, 12288, 6158, 8203, 8204, 8205, 8288, 65279 ].indexOf(code) == -1 && !(8192 <= code && code <= 8202)) gid = 0; return gid; }, glyphToPath: function(font, gid) { var path = { cmds: [], crds: [] }; var SVG = font["SVG "], CFF = font["CFF "]; var U = Typr["U"]; if (SVG && SVG.entries[gid]) { var p = SVG.entries[gid]; if (p != null) { if (typeof p == "string") { p = U["SVG"].toPath(p); SVG.entries[gid] = p; } path = p; } } else if (CFF) { var pdct = CFF["Private"]; var state = { x: 0, y: 0, stack: [], nStems: 0, haveWidth: false, width: pdct ? pdct["defaultWidthX"] : 0, open: false }; if (CFF["ROS"]) { var gi = 0; while (CFF["FDSelect"][gi + 2] <= gid) gi += 2; pdct = CFF["FDArray"][CFF["FDSelect"][gi + 1]]["Private"]; } U["_drawCFF"](CFF["CharStrings"][gid], state, CFF, pdct, path); } else if (font["glyf"]) { U["_drawGlyf"](gid, font, path); } return { cmds: path.cmds, crds: path.crds }; }, _drawGlyf: function(gid, font, path) { var gl = font["glyf"][gid]; if (gl == null) gl = font["glyf"][gid] = Typr["T"].glyf._parseGlyf(font, gid); if (gl != null) { if (gl.noc > -1) Typr["U"]["_simpleGlyph"](gl, path); else Typr["U"]["_compoGlyph"](gl, font, path); } }, _simpleGlyph: function(gl, p) { var P = Typr["U"]["P"]; for (var c = 0; c < gl.noc; c++) { var i0 = c == 0 ? 0 : gl.endPts[c - 1] + 1; var il = gl.endPts[c]; for (var i = i0; i <= il; i++) { var pr = i == i0 ? il : i - 1; var nx = i == il ? i0 : i + 1; var onCurve = gl.flags[i] & 1; var prOnCurve = gl.flags[pr] & 1; var nxOnCurve = gl.flags[nx] & 1; var x = gl.xs[i], y = gl.ys[i]; if (i == i0) { if (onCurve) { if (prOnCurve) P.MoveTo(p, gl.xs[pr], gl.ys[pr]); else { P.MoveTo(p, x, y); continue; } } else { if (prOnCurve) P.MoveTo(p, gl.xs[pr], gl.ys[pr]); else P.MoveTo(p, Math.floor((gl.xs[pr] + x) * .5), Math.floor((gl.ys[pr] + y) * .5)); } } if (onCurve) { if (prOnCurve) P.LineTo(p, x, y); } else { if (nxOnCurve) P.qCurveTo(p, x, y, gl.xs[nx], gl.ys[nx]); else P.qCurveTo(p, x, y, Math.floor((x + gl.xs[nx]) * .5), Math.floor((y + gl.ys[nx]) * .5)); } } P.ClosePath(p); } }, _compoGlyph: function(gl, font, p) { for (var j = 0; j < gl.parts.length; j++) { var path = { cmds: [], crds: [] }; var prt = gl.parts[j]; Typr["U"]["_drawGlyf"](prt.glyphIndex, font, path); var m = prt.m; for (var i = 0; i < path.crds.length; i += 2) { var x = path.crds[i], y = path.crds[i + 1]; p.crds.push(x * m.a + y * m.b + m.tx); p.crds.push(x * m.c + y * m.d + m.ty); } for (var i = 0; i < path.cmds.length; i++) p.cmds.push(path.cmds[i]); } }, pathToSVG: function(path, prec) { var cmds = path["cmds"], crds = path["crds"]; if (prec == null) prec = 5; var out = [], co = 0, lmap = { M: 2, L: 2, Q: 4, C: 6 }; for (var i = 0; i < cmds.length; i++) { var cmd = cmds[i], cn = co + (lmap[cmd] ? lmap[cmd] : 0); out.push(cmd); while (co < cn) { var c = crds[co++]; out.push(parseFloat(c.toFixed(prec)) + (co == cn ? "" : " ")); } } return out.join(""); }, SVGToPath: function(d) { var pth = { cmds: [], crds: [] }; Typr["U"]["SVG"].svgToPath(d, pth); return { cmds: pth.cmds, crds: pth.crds }; }, pathToContext: function(path, ctx) { var c = 0, cmds = path["cmds"], crds = path["crds"]; for (var j = 0; j < cmds.length; j++) { var cmd = cmds[j]; if (cmd == "M") { ctx.moveTo(crds[c], crds[c + 1]); c += 2; } else if (cmd == "L") { ctx.lineTo(crds[c], crds[c + 1]); c += 2; } else if (cmd == "C") { ctx.bezierCurveTo(crds[c], crds[c + 1], crds[c + 2], crds[c + 3], crds[c + 4], crds[c + 5]); c += 6; } else if (cmd == "Q") { ctx.quadraticCurveTo(crds[c], crds[c + 1], crds[c + 2], crds[c + 3]); c += 4; } else if (cmd.charAt(0) == "#") { ctx.beginPath(); ctx.fillStyle = cmd; } else if (cmd == "Z") { ctx.closePath(); } else if (cmd == "X") { ctx.fill(); } } }, P: { MoveTo: function(p, x, y) { p.cmds.push("M"); p.crds.push(x, y); }, LineTo: function(p, x, y) { p.cmds.push("L"); p.crds.push(x, y); }, CurveTo: function(p, a, b, c, d, e, f) { p.cmds.push("C"); p.crds.push(a, b, c, d, e, f); }, qCurveTo: function(p, a, b, c, d) { p.cmds.push("Q"); p.crds.push(a, b, c, d); }, ClosePath: function(p) { p.cmds.push("Z"); } }, _drawCFF: function(cmds, state, font, pdct, p) { var stack = state.stack; var nStems = state.nStems, haveWidth = state.haveWidth, width = state.width, open = state.open; var i = 0; var x = state.x, y = state.y, c1x = 0, c1y = 0, c2x = 0, c2y = 0, c3x = 0, c3y = 0, c4x = 0, c4y = 0, jpx = 0, jpy = 0; var CFF = Typr["T"].CFF, P = Typr["U"]["P"]; var nominalWidthX = pdct["nominalWidthX"]; var o = { val: 0, size: 0 }; while (i < cmds.length) { CFF.getCharString(cmds, i, o); var v = o.val; i += o.size; if (v == "o1" || v == "o18") { var hasWidthArg; hasWidthArg = stack.length % 2 !== 0; if (hasWidthArg && !haveWidth) { width = stack.shift() + nominalWidthX; } nStems += stack.length >> 1; stack.length = 0; haveWidth = true; } else if (v == "o3" || v == "o23") { var hasWidthArg; hasWidthArg = stack.length % 2 !== 0; if (hasWidthArg && !haveWidth) { width = stack.shift() + nominalWidthX; } nStems += stack.length >> 1; stack.length = 0; haveWidth = true; } else if (v == "o4") { if (stack.length > 1 && !haveWidth) { width = stack.shift() + nominalWidthX; haveWidth = true; } if (open) P.ClosePath(p); y += stack.pop(); P.MoveTo(p, x, y); open = true; } else if (v == "o5") { while (stack.length > 0) { x += stack.shift(); y += stack.shift(); P.LineTo(p, x, y); } } else if (v == "o6" || v == "o7") { var count = stack.length; var isX = v == "o6"; for (var j = 0; j < count; j++) { var sval = stack.shift(); if (isX) x += sval; else y += sval; isX = !isX; P.LineTo(p, x, y); } } else if (v == "o8" || v == "o24") { var count = stack.length; var index = 0; while (index + 6 <= count) { c1x = x + stack.shift(); c1y = y + stack.shift(); c2x = c1x + stack.shift(); c2y = c1y + stack.shift(); x = c2x + stack.shift(); y = c2y + stack.shift(); P.CurveTo(p, c1x, c1y, c2x, c2y, x, y); index += 6; } if (v == "o24") { x += stack.shift(); y += stack.shift(); P.LineTo(p, x, y); } } else if (v == "o11") break; else if (v == "o1234" || v == "o1235" || v == "o1236" || v == "o1237") { if (v == "o1234") { c1x = x + stack.shift(); c1y = y; c2x = c1x + stack.shift(); c2y = c1y + stack.shift(); jpx = c2x + stack.shift(); jpy = c2y; c3x = jpx + stack.shift(); c3y = c2y; c4x = c3x + stack.shift(); c4y = y; x = c4x + stack.shift(); P.CurveTo(p, c1x, c1y, c2x, c2y, jpx, jpy); P.CurveTo(p, c3x, c3y, c4x, c4y, x, y); } if (v == "o1235") { c1x = x + stack.shift(); c1y = y + stack.shift(); c2x = c1x + stack.shift(); c2y = c1y + stack.shift(); jpx = c2x + stack.shift(); jpy = c2y + stack.shift(); c3x = jpx + stack.shift(); c3y = jpy + stack.shift(); c4x = c3x + stack.shift(); c4y = c3y + stack.shift(); x = c4x + stack.shift(); y = c4y + stack.shift(); stack.shift(); P.CurveTo(p, c1x, c1y, c2x, c2y, jpx, jpy); P.CurveTo(p, c3x, c3y, c4x, c4y, x, y); } if (v == "o1236") { c1x = x + stack.shift(); c1y = y + stack.shift(); c2x = c1x + stack.shift(); c2y = c1y + stack.shift(); jpx = c2x + stack.shift(); jpy = c2y; c3x = jpx + stack.shift(); c3y = c2y; c4x = c3x + stack.shift(); c4y = c3y + stack.shift(); x = c4x + stack.shift(); P.CurveTo(p, c1x, c1y, c2x, c2y, jpx, jpy); P.CurveTo(p, c3x, c3y, c4x, c4y, x, y); } if (v == "o1237") { c1x = x + stack.shift(); c1y = y + stack.shift(); c2x = c1x + stack.shift(); c2y = c1y + stack.shift(); jpx = c2x + stack.shift(); jpy = c2y + stack.shift(); c3x = jpx + stack.shift(); c3y = jpy + stack.shift(); c4x = c3x + stack.shift(); c4y = c3y + stack.shift(); if (Math.abs(c4x - x) > Math.abs(c4y - y)) { x = c4x + stack.shift(); } else { y = c4y + stack.shift(); } P.CurveTo(p, c1x, c1y, c2x, c2y, jpx, jpy); P.CurveTo(p, c3x, c3y, c4x, c4y, x, y); } } else if (v == "o14") { if (stack.length > 0 && !haveWidth) { width = stack.shift() + font["nominalWidthX"]; haveWidth = true; } if (stack.length == 4) { var adx = stack.shift(); var ady = stack.shift(); var bchar = stack.shift(); var achar = stack.shift(); var bind = CFF.glyphBySE(font, bchar); var aind = CFF.glyphBySE(font, achar); Typr["U"]["_drawCFF"](font["CharStrings"][bind], state, font, pdct, p); state.x = adx; state.y = ady; Typr["U"]["_drawCFF"](font["CharStrings"][aind], state, font, pdct, p); } if (open) { P.ClosePath(p); open = false; } } else if (v == "o19" || v == "o20") { var hasWidthArg; hasWidthArg = stack.length % 2 !== 0; if (hasWidthArg && !haveWidth) { width = stack.shift() + nominalWidthX; } nStems += stack.length >> 1; stack.length = 0; haveWidth = true; i += nStems + 7 >> 3; } else if (v == "o21") { if (stack.length > 2 && !haveWidth) { width = stack.shift() + nominalWidthX; haveWidth = true; } y += stack.pop(); x += stack.pop(); if (open) P.ClosePath(p); P.MoveTo(p, x, y); open = true; } else if (v == "o22") { if (stack.length > 1 && !haveWidth) { width = stack.shift() + nominalWidthX; haveWidth = true; } x += stack.pop(); if (open) P.ClosePath(p); P.MoveTo(p, x, y); open = true; } else if (v == "o25") { while (stack.length > 6) { x += stack.shift(); y += stack.shift(); P.LineTo(p, x, y); } c1x = x + stack.shift(); c1y = y + stack.shift(); c2x = c1x + stack.shift(); c2y = c1y + stack.shift(); x = c2x + stack.shift(); y = c2y + stack.shift(); P.CurveTo(p, c1x, c1y, c2x, c2y, x, y); } else if (v == "o26") { if (stack.length % 2) { x += stack.shift(); } while (stack.length > 0) { c1x = x; c1y = y + stack.shift(); c2x = c1x + stack.shift(); c2y = c1y + stack.shift(); x = c2x; y = c2y + stack.shift(); P.CurveTo(p, c1x, c1y, c2x, c2y, x, y); } } else if (v == "o27") { if (stack.length % 2) { y += stack.shift(); } while (stack.length > 0) { c1x = x + stack.shift(); c1y = y; c2x = c1x + stack.shift(); c2y = c1y + stack.shift(); x = c2x + stack.shift(); y = c2y; P.CurveTo(p, c1x, c1y, c2x, c2y, x, y); } } else if (v == "o10" || v == "o29") { var obj = v == "o10" ? pdct : font; if (stack.length == 0) { console.log("error: empty stack"); } else { var ind = stack.pop(); var subr = obj["Subrs"][ind + obj["Bias"]]; state.x = x; state.y = y; state.nStems = nStems; state.haveWidth = haveWidth; state.width = width; state.open = open; Typr["U"]["_drawCFF"](subr, state, font, pdct, p); x = state.x; y = state.y; nStems = state.nStems; haveWidth = state.haveWidth; width = state.width; open = state.open; } } else if (v == "o30" || v == "o31") { var count, count1 = stack.length; var index = 0; var alternate = v == "o31"; count = count1 & ~2; index += count1 - count; while (index < count) { if (alternate) { c1x = x + stack.shift(); c1y = y; c2x = c1x + stack.shift(); c2y = c1y + stack.shift(); y = c2y + stack.shift(); if (count - index == 5) { x = c2x + stack.shift(); index++; } else x = c2x; alternate = false; } else { c1x = x; c1y = y + stack.shift(); c2x = c1x + stack.shift(); c2y = c1y + stack.shift(); x = c2x + stack.shift(); if (count - index == 5) { y = c2y + stack.shift(); index++; } else y = c2y; alternate = true; } P.CurveTo(p, c1x, c1y, c2x, c2y, x, y); index += 4; } } else if ((v + "").charAt(0) == "o") { console.log("Unknown operation: " + v, cmds); throw v; } else stack.push(v); } state.x = x; state.y = y; state.nStems = nStems; state.haveWidth = haveWidth; state.width = width; state.open = open; }, SVG: function() { var M = { getScale: function(m) { return Math.sqrt(Math.abs(m[0] * m[3] - m[1] * m[2])); }, translate: function(m, x, y) { M.concat(m, [ 1, 0, 0, 1, x, y ]); }, rotate: function(m, a) { M.concat(m, [ Math.cos(a), -Math.sin(a), Math.sin(a), Math.cos(a), 0, 0 ]); }, scale: function(m, x, y) { M.concat(m, [ x, 0, 0, y, 0, 0 ]); }, concat: function(m, w) { var a = m[0], b = m[1], c = m[2], d = m[3], tx = m[4], ty = m[5]; m[0] = a * w[0] + b * w[2]; m[1] = a * w[1] + b * w[3]; m[2] = c * w[0] + d * w[2]; m[3] = c * w[1] + d * w[3]; m[4] = tx * w[0] + ty * w[2] + w[4]; m[5] = tx * w[1] + ty * w[3] + w[5]; }, invert: function(m) { var a = m[0], b = m[1], c = m[2], d = m[3], tx = m[4], ty = m[5], adbc = a * d - b * c; m[0] = d / adbc; m[1] = -b / adbc; m[2] = -c / adbc; m[3] = a / adbc; m[4] = (c * ty - d * tx) / adbc; m[5] = (b * tx - a * ty) / adbc; }, multPoint: function(m, p) { var x = p[0], y = p[1]; return [ x * m[0] + y * m[2] + m[4], x * m[1] + y * m[3] + m[5] ]; }, multArray: function(m, a) { for (var i = 0; i < a.length; i += 2) { var x = a[i], y = a[i + 1]; a[i] = x * m[0] + y * m[2] + m[4]; a[i + 1] = x * m[1] + y * m[3] + m[5]; } } }; function _bracketSplit(str, lbr, rbr) { var out = [], pos = 0, ci = 0, lvl = 0; while (true) { var li = str.indexOf(lbr, ci); var ri = str.indexOf(rbr, ci); if (li == -1 && ri == -1) break; if (ri == -1 || li != -1 && li < ri) { if (lvl == 0) { out.push(str.slice(pos, li).trim()); pos = li + 1; } lvl++; ci = li + 1; } else if (li == -1 || ri != -1 && ri < li) { lvl--; if (lvl == 0) { out.push(str.slice(pos, ri).trim()); pos = ri + 1; } ci = ri + 1; } } return out; } function cssMap(str) { var pts = _bracketSplit(str, "{", "}"); var css = {}; for (var i = 0; i < pts.length; i += 2) { var cn = pts[i].split(","); for (var j = 0; j < cn.length; j++) { var cnj = cn[j].trim(); if (css[cnj] == null) css[cnj] = ""; css[cnj] += pts[i + 1]; } } return css; } function readTrnf(trna) { var pts = _bracketSplit(trna, "(", ")"); var m = [ 1, 0, 0, 1, 0, 0 ]; for (var i = 0; i < pts.length; i += 2) { var om = m; m = _readTrnsAttr(pts[i], pts[i + 1]); M.concat(m, om); } return m; } function _readTrnsAttr(fnc, vls) { var m = [ 1, 0, 0, 1, 0, 0 ], gotSep = true; for (var i = 0; i < vls.length; i++) { var ch = vls.charAt(i); if (ch == "," || ch == " ") gotSep = true; else if (ch == ".") { if (!gotSep) { vls = vls.slice(0, i) + "," + vls.slice(i); i++; } gotSep = false; } else if (ch == "-" && i > 0 && vls[i - 1] != "e") { vls = vls.slice(0, i) + " " + vls.slice(i); i++; gotSep = true; } } vls = vls.split(/\s*[\s,]\s*/).map(parseFloat); if (fnc == "translate") { if (vls.length == 1) M.translate(m, vls[0], 0); else M.translate(m, vls[0], vls[1]); } else if (fnc == "scale") { if (vls.length == 1) M.scale(m, vls[0], vls[0]); else M.scale(m, vls[0], vls[1]); } else if (fnc == "rotate") { var tx = 0, ty = 0; if (vls.length != 1) { tx = vls[1]; ty = vls[2]; } M.translate(m, -tx, -ty); M.rotate(m, -Math.PI * vls[0] / 180); M.translate(m, tx, ty); } else if (fnc == "matrix") m = vls; else console.log("unknown transform: ", fnc); return m; } function toPath(str) { var pth = { cmds: [], crds: [] }; if (str == null) return pth; var prsr = new DOMParser(); var doc = prsr["parseFromString"](str, "image/svg+xml"); var svg = doc.getElementsByTagName("svg")[0]; var vb = svg.getAttribute("viewBox"); if (vb) vb = vb.trim().split(" ").map(parseFloat); else vb = [ 0, 0, 1e3, 1e3 ]; _toPath(svg.children, pth); for (var i = 0; i < pth.crds.length; i += 2) { var x = pth.crds[i], y = pth.crds[i + 1]; x -= vb[0]; y -= vb[1]; y = -y; pth.crds[i] = x; pth.crds[i + 1] = y; } return pth; } function _toPath(nds, pth, fill) { for (var ni = 0; ni < nds.length; ni++) { var nd = nds[ni], tn = nd.tagName; var cfl = nd.getAttribute("fill"); if (cfl == null) cfl = fill; if (tn == "g") { var tp = { crds: [], cmds: [] }; _toPath(nd.children, tp, cfl); var trf = nd.getAttribute("transform"); if (trf) { var m = readTrnf(trf); M.multArray(m, tp.crds); } pth.crds = pth.crds.concat(tp.crds); pth.cmds = pth.cmds.concat(tp.cmds); } else if (tn == "path" || tn == "circle" || tn == "ellipse") { pth.cmds.push(cfl ? cfl : "#000000"); var d; if (tn == "path") d = nd.getAttribute("d"); if (tn == "circle" || tn == "ellipse") { var vls = [ 0, 0, 0, 0 ], nms = [ "cx", "cy", "rx", "ry", "r" ]; for (var i = 0; i < 5; i++) { var V = nd.getAttribute(nms[i]); if (V) { V = parseFloat(V); if (i < 4) vls[i] = V; else vls[2] = vls[3] = V; } } var cx = vls[0], cy = vls[1], rx = vls[2], ry = vls[3]; d = [ "M", cx - rx, cy, "a", rx, ry, 0, 1, 0, rx * 2, 0, "a", rx, ry, 0, 1, 0, -rx * 2, 0 ].join(" "); } svgToPath(d, pth); pth.cmds.push("X"); } else if (tn == "defs"); else console.log(tn, nd); } } function _tokens(d) { var ts = [], off = 0, rn = false, cn = "", pc = ""; while (off < d.length) { var cc = d.charCodeAt(off), ch = d.charAt(off); off++; var isNum = 48 <= cc && cc <= 57 || ch == "." || ch == "-" || ch == "e" || ch == "E"; if (rn) { if (ch == "-" && pc != "e" || ch == "." && cn.indexOf(".") != -1) { ts.push(parseFloat(cn)); cn = ch; } else if (isNum) cn += ch; else { ts.push(parseFloat(cn)); if (ch != "," && ch != " ") ts.push(ch); rn = false; } } else { if (isNum) { cn = ch; rn = true; } else if (ch != "," && ch != " ") ts.push(ch); } pc = ch; } if (rn) ts.push(parseFloat(cn)); return ts; } function _reps(ts, off, ps) { var i = off; while (i < ts.length) { if (typeof ts[i] == "string") break; i += ps; } return (i - off) / ps; } function svgToPath(d, pth) { var ts = _tokens(d); var i = 0, x = 0, y = 0, ox = 0, oy = 0, oldo = pth.crds.length; var pc = { M: 2, L: 2, H: 1, V: 1, T: 2, S: 4, A: 7, Q: 4, C: 6 }; var cmds = pth.cmds, crds = pth.crds; while (i < ts.length) { var cmd = ts[i]; i++; var cmu = cmd.toUpperCase(); if (cmu == "Z") { cmds.push("Z"); x = ox; y = oy; } else { var ps = pc[cmu], reps = _reps(ts, i, ps); for (var j = 0; j < reps; j++) { if (j == 1 && cmu == "M") { cmd = cmd == cmu ? "L" : "l"; cmu = "L"; } var xi = 0, yi = 0; if (cmd != cmu) { xi = x; yi = y; } if (cmu == "M") { x = xi + ts[i++]; y = yi + ts[i++]; cmds.push("M"); crds.push(x, y); ox = x; oy = y; } else if (cmu == "L") { x = xi + ts[i++]; y = yi + ts[i++]; cmds.push("L"); crds.push(x, y); } else if (cmu == "H") { x = xi + ts[i++]; cmds.push("L"); crds.push(x, y); } else if (cmu == "V") { y = yi + ts[i++]; cmds.push("L"); crds.push(x, y); } else if (cmu == "Q") { var x1 = xi + ts[i++], y1 = yi + ts[i++], x2 = xi + ts[i++], y2 = yi + ts[i++]; cmds.push("Q"); crds.push(x1, y1, x2, y2); x = x2; y = y2; } else if (cmu == "T") { var co = Math.max(crds.length - 2, oldo); var x1 = x + x - crds[co], y1 = y + y - crds[co + 1]; var x2 = xi + ts[i++], y2 = yi + ts[i++]; cmds.push("Q"); crds.push(x1, y1, x2, y2); x = x2; y = y2; } else if (cmu == "C") { 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++]; cmds.push("C"); crds.push(x1, y1, x2, y2, x3, y3); x = x3; y = y3; } else if (cmu == "S") { var co = Math.max(crds.length - (cmds[cmds.length - 1] == "C" ? 4 : 2), oldo); var x1 = x + x - crds[co], y1 = y + y - crds[co + 1]; var x2 = xi + ts[i++], y2 = yi + ts[i++], x3 = xi + ts[i++], y3 = yi + ts[i++]; cmds.push("C"); crds.push(x1, y1, x2, y2, x3, y3); x = x3; y = y3; } else if (cmu == "A") { var x1 = x, y1 = y; var rx = ts[i++], ry = ts[i++]; var phi = ts[i++] * (Math.PI / 180), fA = ts[i++], fS = ts[i++]; var x2 = xi + ts[i++], y2 = yi + ts[i++]; if (x2 == x && y2 == y && rx == 0 && ry == 0) continue; var hdx = (x1 - x2) / 2, hdy = (y1 - y2) / 2; var cosP = Math.cos(phi), sinP = Math.sin(phi); var x1A = cosP * hdx + sinP * hdy; var y1A = -sinP * hdx + cosP * hdy; var rxS = rx * rx, ryS = ry * ry; var x1AS = x1A * x1A, y1AS = y1A * y1A; var frc = (rxS * ryS - rxS * y1AS - ryS * x1AS) / (rxS * y1AS + ryS * x1AS); var coef = (fA != fS ? 1 : -1) * Math.sqrt(Math.max(frc, 0)); var cxA = coef * (rx * y1A) / ry; var cyA = -coef * (ry * x1A) / rx; var cx = cosP * cxA - sinP * cyA + (x1 + x2) / 2; var cy = sinP * cxA + cosP * cyA + (y1 + y2) / 2; var angl = function(ux, uy, vx, vy) { var lU = Math.sqrt(ux * ux + uy * uy), lV = Math.sqrt(vx * vx + vy * vy); var num = (ux * vx + uy * vy) / (lU * lV); return (ux * vy - uy * vx >= 0 ? 1 : -1) * Math.acos(Math.max(-1, Math.min(1, num))); }; var vX = (x1A - cxA) / rx, vY = (y1A - cyA) / ry; var theta1 = angl(1, 0, vX, vY); var dtheta = angl(vX, vY, (-x1A - cxA) / rx, (-y1A - cyA) / ry); dtheta = dtheta % (2 * Math.PI); var arc = function(gst, x, y, r, a0, a1, neg) { var rotate = function(m, a) { var si = Math.sin(a), co = Math.cos(a); var a = m[0], b = m[1], c = m[2], d = m[3]; m[0] = a * co + b * si; m[1] = -a * si + b * co; m[2] = c * co + d * si; m[3] = -c * si + d * co; }; var multArr = function(m, a) { for (var j = 0; j < a.length; j += 2) { var x = a[j], y = a[j + 1]; a[j] = m[0] * x + m[2] * y + m[4]; a[j + 1] = m[1] * x + m[3] * y + m[5]; } }; var concatA = function(a, b) { for (var j = 0; j < b.length; j++) a.push(b[j]); }; var concatP = function(p, r) { concatA(p.cmds, r.cmds); concatA(p.crds, r.crds); }; if (neg) while (a1 > a0) a1 -= 2 * Math.PI; else while (a1 < a0) a1 += 2 * Math.PI; var th = (a1 - a0) / 4; var x0 = Math.cos(th / 2), y0 = -Math.sin(th / 2); var x1 = (4 - x0) / 3, y1 = y0 == 0 ? y0 : (1 - x0) * (3 - x0) / (3 * y0); var x2 = x1, y2 = -y1; var x3 = x0, y3 = -y0; var ps = [ x1, y1, x2, y2, x3, y3 ]; var pth = { cmds: [ "C", "C", "C", "C" ], crds: ps.slice(0) }; var rot = [ 1, 0, 0, 1, 0, 0 ]; rotate(rot, -th); for (var j = 0; j < 3; j++) { multArr(rot, ps); concatA(pth.crds, ps); } rotate(rot, -a0 + th / 2); rot[0] *= r; rot[1] *= r; rot[2] *= r; rot[3] *= r; rot[4] = x; rot[5] = y; multArr(rot, pth.crds); multArr(gst.ctm, pth.crds); concatP(gst.pth, pth); }; var gst = { pth: pth, ctm: [ rx * cosP, rx * sinP, -ry * sinP, ry * cosP, cx, cy ] }; arc(gst, 0, 0, 1, theta1, theta1 + dtheta, fS == 0); x = x2; y = y2; } else console.log("Unknown SVG command " + cmd); } } } } return { cssMap: cssMap, readTrnf: readTrnf, svgToPath: svgToPath, toPath: toPath }; }(), initHB: function(hurl, resp) { var codeLength = function(code) { var len = 0; if ((code & 4294967295 - (1 << 7) + 1) == 0) { len = 1; } else if ((code & 4294967295 - (1 << 11) + 1) == 0) { len = 2; } else if ((code & 4294967295 - (1 << 16) + 1) == 0) { len = 3; } else if ((code & 4294967295 - (1 << 21) + 1) == 0) { len = 4; } return len; }; var te = new window["TextEncoder"]("utf8"); fetch(hurl).then(function(x) { return x["arrayBuffer"](); }).then(function(ab) { return WebAssembly["instantiate"](ab); }).then(function(res) { console.log("HB ready"); var exp = res["instance"]["exports"], mem = exp["memory"]; mem["grow"](700); var heapu8 = new Uint8Array(mem.buffer); var u32 = new Uint32Array(mem.buffer); var i32 = new Int32Array(mem.buffer); var __lastFnt, blob, blobPtr, face, font; Typr["U"]["shapeHB"] = function() { var toJson = function(ptr) { var length = exp["hb_buffer_get_length"](ptr); var result = []; var iPtr32 = exp["hb_buffer_get_glyph_infos"](ptr, 0) >>> 2; var pPtr32 = exp["hb_buffer_get_glyph_positions"](ptr, 0) >>> 2; for (var i = 0; i < length; ++i) { var a = iPtr32 + i * 5, b = pPtr32 + i * 5; result.push({ g: u32[a + 0], cl: u32[a + 2], ax: i32[b + 0], ay: i32[b + 1], dx: i32[b + 2], dy: i32[b + 3] }); } return result; }; return function(fnt, str, ltr) { var fdata = fnt["_data"], fn = fnt["name"]["postScriptName"]; if (__lastFnt != fn) { if (blob != null) { exp["hb_blob_destroy"](blob); exp["free"](blobPtr); exp["hb_face_destroy"](face); exp["hb_font_destroy"](font); } blobPtr = exp["malloc"](fdata.byteLength); heapu8.set(fdata, blobPtr); blob = exp["hb_blob_create"](blobPtr, fdata.byteLength, 2, 0, 0); face = exp["hb_face_create"](blob, 0); font = exp["hb_font_create"](face); __lastFnt = fn; } var buffer = exp["hb_buffer_create"](); var bytes = te["encode"](str); var len = bytes.length, strp = exp["malloc"](len); heapu8.set(bytes, strp); exp["hb_buffer_add_utf8"](buffer, strp, len, 0, len); exp["free"](strp); exp["hb_buffer_set_direction"](buffer, ltr ? 4 : 5); exp["hb_buffer_guess_segment_properties"](buffer); exp["hb_shape"](font, buffer, 0, 0); var json = toJson(buffer); exp["hb_buffer_destroy"](buffer); var arr = json.slice(0); if (!ltr) arr.reverse(); var ci = 0, bi = 0; for (var i = 1; i < arr.length; i++) { var gl = arr[i], cl = gl["cl"]; while (true) { var cpt = str.codePointAt(ci), cln = codeLength(cpt); if (bi + cln <= cl) { bi += cln; ci += cpt <= 65535 ? 1 : 2; } else break; } gl["cl"] = ci; } return json; }; }(); resp(); }); } }; function init() { rule = rwl_userData.rules.rule_def; hook_eventNames = rule.hook_eventNames.split("|"); unhook_eventNames = rule.unhook_eventNames.split("|"); eventNames = hook_eventNames.concat(unhook_eventNames); if (rule.dom0) { setInterval(clearLoop, 10 * 1e3); setTimeout(clearLoop, 1500); window.addEventListener("load", clearLoop, true); clearLoop(); } if (rule.hook_addEventListener) { EventTarget.prototype.addEventListener = addEventListener; document.addEventListener = addEventListener; if (hasFrame) { for (let i = 0; i < hasFrame.length; i++) { hasFrame[i].contentWindow.document.addEventListener = addEventListener; } } } if (rule.hook_preventDefault) { Event.prototype.preventDefault = function() { if (hook_eventNames.indexOf(this.type) < 0) { Event_preventDefault.apply(this, arguments); } }; if (hasFrame) { for (let i = 0; i < hasFrame.length; i++) { hasFrame[i].contentWindow.Event.prototype.preventDefault = function() { if (hook_eventNames.indexOf(this.type) < 0) { Event_preventDefault.apply(this, arguments); } }; } } } if (rule.hook_set_returnValue) { Event.prototype.__defineSetter__("returnValue", function() { if (this.returnValue !== true && hook_eventNames.indexOf(this.type) >= 0) { this.returnValue = true; } }); } } function addEventListener(type, func, useCapture) { var _addEventListener = this === document ? document_addEventListener : EventTarget_addEventListener; if (hook_eventNames.indexOf(type) >= 0) { _addEventListener.apply(this, [ type, returnTrue, useCapture ]); } else if (unhook_eventNames.indexOf(type) >= 0) { var funcsName = storageName + type + (useCapture ? "t" : "f"); if (this[funcsName] === undefined) { this[funcsName] = []; _addEventListener.apply(this, [ type, useCapture ? unhook_t : unhook_f, useCapture ]); } this[funcsName].push(func); } else { _addEventListener.apply(this, arguments); } } function clearLoop() { rule = clear(); var elements = getElements(); for (var i in elements) { for (var j in eventNames) { var name = "on" + eventNames[j]; if (Object.prototype.toString.call(elements[i]) == "[object String]") { continue; } if (elements[i][name] !== null && elements[i][name] !== onxxx) { if (unhook_eventNames.indexOf(eventNames[j]) >= 0) { elements[i][storageName + name] = elements[i][name]; elements[i][name] = onxxx; } else { elements[i][name] = null; } } } } document.onmousedown = function() { return true; }; } function returnTrue(e) { return true; } function unhook_t(e) { return unhook(e, this, storageName + e.type + "t"); } function unhook_f(e) { return unhook(e, this, storageName + e.type + "f"); } function unhook(e, self, funcsName) { var list = self[funcsName]; for (var i in list) { list[i](e); } e.returnValue = true; return true; } function onxxx(e) { var name = storageName + "on" + e.type; this[name](e); e.returnValue = true; return true; } function getElements() { var elements = Array.prototype.slice.call(document.getElementsByTagName("*")); elements.push(document); var frames = document.querySelectorAll("frame"); if (frames) { hasFrame = frames; var frames_element; for (let i = 0; i < frames.length; i++) { frames_element = Array.prototype.slice.call(frames[i].contentWindow.document.querySelectorAll("*")); elements.push(frames[i].contentWindow.document); elements = elements.concat(frames_element); } } return elements; } var settingData = { status: 1, version: .1, message: "", positionTop: "0", positionLeft: "0", positionRight: "auto", addBtn: false, connectToTheServer: false, waitUpload: [], currentURL: "null", shortcut: 3, rules: {}, data: [] }; var rwl_userData = null; var rule = null; var hasFrame = false; var storageName = "storageName"; var hook_eventNames, unhook_eventNames, eventNames; var EventTarget_addEventListener = EventTarget.prototype.addEventListener; var document_addEventListener = document.addEventListener; var Event_preventDefault = Event.prototype.preventDefault; rwl_userData = GM_getValue("rwl_userData"); if (!rwl_userData) { rwl_userData = settingData; } for (let value in settingData) { if (!rwl_userData.hasOwnProperty(value)) { rwl_userData[value] = settingData[value]; GM_setValue("rwl_userData", rwl_userData); } } function removeF() { var $tip = $("style:contains(font-cxsecret)"); if (!$tip.length) return; var font = $tip.text().match(/base64,([\w\W]+?)'/)[1]; font = Typr.parse(base64ToUint8Array(font))[0]; var table = JSON.parse(GM_getResourceText("Table")); var match = {}; for (var i = 19968; i < 40870; i++) { $tip = Typr.U.codeToGlyph(font, i); if (!$tip) continue; $tip = Typr.U.glyphToPath(font, $tip); $tip = MD5(JSON.stringify($tip)).slice(24); match[i] = table[$tip]; } $(".font-cxsecret").html(function(index, html) { $.each(match, function(key, value) { key = String.fromCharCode(key); key = new RegExp(key, "g"); value = String.fromCharCode(value); html = html.replace(key, value); }); return html; }).removeClass("font-cxsecret"); function base64ToUint8Array(base64) { var data = window.atob(base64); var buffer = new Uint8Array(data.length); for (var i = 0; i < data.length; ++i) { buffer[i] = data.charCodeAt(i); } return buffer; } } function start() { setInterval(() => { try { removeF(); } catch (e) {} try { init(); } catch (e) {} }, 500); } if (location.host.includes("chaoxing")) { setTimeout(() => { start(); }, 2e3); } // @thanks 特别感谢 qxin i 借鉴 网页限制解除(改) 开源地址 https://greasyfork.org/zh-CN/scripts/28497 function init() { rule = rwl_userData.rules.rule_def; hook_eventNames = rule.hook_eventNames.split("|"); unhook_eventNames = rule.unhook_eventNames.split("|"); eventNames = hook_eventNames.concat(unhook_eventNames); if (rule.dom0) { setInterval(clearLoop, 10 * 1e3); setTimeout(clearLoop, 1500); window.addEventListener("load", clearLoop, true); clearLoop(); } if (rule.hook_addEventListener) { EventTarget.prototype.addEventListener = addEventListener; document.addEventListener = addEventListener; if (hasFrame) { for (let i = 0; i < hasFrame.length; i++) { hasFrame[i].contentWindow.document.addEventListener = addEventListener; } } } if (rule.hook_preventDefault) { Event.prototype.preventDefault = function() { if (hook_eventNames.indexOf(this.type) < 0) { Event_preventDefault.apply(this, arguments); } }; if (hasFrame) { for (let i = 0; i < hasFrame.length; i++) { hasFrame[i].contentWindow.Event.prototype.preventDefault = function() { if (hook_eventNames.indexOf(this.type) < 0) { Event_preventDefault.apply(this, arguments); } }; } } } if (rule.hook_set_returnValue) { Event.prototype.__defineSetter__("returnValue", function() { if (this.returnValue !== true && hook_eventNames.indexOf(this.type) >= 0) { this.returnValue = true; } }); } } function addEventListener(type, func, useCapture) { var _addEventListener = this === document ? document_addEventListener : EventTarget_addEventListener; if (hook_eventNames.indexOf(type) >= 0) { _addEventListener.apply(this, [ type, returnTrue, useCapture ]); } else if (unhook_eventNames.indexOf(type) >= 0) { var funcsName = storageName + type + (useCapture ? "t" : "f"); if (this[funcsName] === undefined) { this[funcsName] = []; _addEventListener.apply(this, [ type, useCapture ? unhook_t : unhook_f, useCapture ]); } this[funcsName].push(func); } else { _addEventListener.apply(this, arguments); } } function clearLoop() { rule = clear(); var elements = getElements(); for (var i in elements) { for (var j in eventNames) { var name = "on" + eventNames[j]; if (Object.prototype.toString.call(elements[i]) == "[object String]") { continue; } if (elements[i][name] !== null && elements[i][name] !== onxxx) { if (unhook_eventNames.indexOf(eventNames[j]) >= 0) { elements[i][storageName + name] = elements[i][name]; elements[i][name] = onxxx; } else { elements[i][name] = null; } } } } document.onmousedown = function() { return true; }; } function returnTrue(e) { return true; } function unhook_t(e) { return unhook(e, this, storageName + e.type + "t"); } function unhook_f(e) { return unhook(e, this, storageName + e.type + "f"); } function unhook(e, self, funcsName) { var list = self[funcsName]; for (var i in list) { list[i](e); } e.returnValue = true; return true; } function onxxx(e) { var name = storageName + "on" + e.type; this[name](e); e.returnValue = true; return true; } function getElements() { var elements = Array.prototype.slice.call(document.getElementsByTagName("*")); elements.push(document); var frames = document.querySelectorAll("frame"); if (frames) { hasFrame = frames; var frames_element; for (let i = 0; i < frames.length; i++) { frames_element = Array.prototype.slice.call(frames[i].contentWindow.document.querySelectorAll("*")); elements.push(frames[i].contentWindow.document); elements = elements.concat(frames_element); } } return elements; } var settingData = { status: 1, version: .1, message: "", positionTop: "0", positionLeft: "0", positionRight: "auto", addBtn: false, connectToTheServer: false, waitUpload: [], currentURL: "null", shortcut: 3, rules: {}, data: [] }; var rwl_userData = null; var rule = null; var hasFrame = false; var storageName = "storageName"; var hook_eventNames, unhook_eventNames, eventNames; var EventTarget_addEventListener = EventTarget.prototype.addEventListener; var document_addEventListener = document.addEventListener; var Event_preventDefault = Event.prototype.preventDefault; rwl_userData = GM_getValue("rwl_userData"); if (!rwl_userData) { rwl_userData = settingData; } for (let value in settingData) { if (!rwl_userData.hasOwnProperty(value)) { rwl_userData[value] = settingData[value]; GM_setValue("rwl_userData", rwl_userData); } } // @thanks 特别感谢 wyn大佬 提供的 字典匹配表 原作者 [email protected] 开源地址 https://scriptcat.org/script-show-page/432/code function removeF() { var $tip = $("style:contains(font-cxsecret)"); if (!$tip.length) return; var font = $tip.text().match(/base64,([\w\W]+?)'/)[1]; font = Typr.parse(base64ToUint8Array(font))[0]; var table = JSON.parse(GM_getResourceText("Table")); var match = {}; for (var i = 19968; i < 40870; i++) { $tip = Typr.U.codeToGlyph(font, i); if (!$tip) continue; $tip = Typr.U.glyphToPath(font, $tip); $tip = MD5(JSON.stringify($tip)).slice(24); match[i] = table[$tip]; } $(".font-cxsecret").html(function(index, html) { $.each(match, function(key, value) { key = String.fromCharCode(key); key = new RegExp(key, "g"); value = String.fromCharCode(value); html = html.replace(key, value); }); return html; }).removeClass("font-cxsecret"); function base64ToUint8Array(base64) { var data = window.atob(base64); var buffer = new Uint8Array(data.length); for (var i = 0; i < data.length; ++i) { buffer[i] = data.charCodeAt(i); } return buffer; } } function start() { try { removeF(); } catch (e) {} try { init(); } catch (e) {} } WorkerJSPlus({ name: "学习通作业", match: location.pathname === "/mooc2/work/dowork" || location.pathname === "/mooc-ans/mooc2/work/dowork", root: ".questionLi", elements: { question: "h3", options: ".stem_answer .answerBg .answer_p, .textDIV, .eidtDiv", $options: ".stem_answer .answerBg, .textDIV, .eidtDiv", type: "input[type^=hidden]:eq(0)" }, wrap: obj => { obj.question = obj.question.replace(obj.$item.find(".colorShallow").text(), "").replace(/^(\d+\.\s)/, ""); }, ignore_click: $item => { return Boolean($item.find(".check_answer,.check_answer_dx").length); }, fill: (type, answer, $option) => { if (type === 4 || type === 2 || type === 5) { UE$1.getEditor($option.find("textarea").attr("name")).setContent(answer); } } }); WorkerJSPlus({ name: "超星旧版考试", match: (location.pathname === "/exam/test/reVersionTestStartNew" || location.pathname === "/exam-ans/exam/test/reVersionTestStartNew") && !location.href.includes("newMooc=true"), root: ".TiMu", elements: { question: ".Cy_TItle .clearfix", options: ".Cy_ulTop .clearfix", $options: ":radio, :checkbox, .Cy_ulTk textarea", type: "[name^=type]:not([id])" }, ignore_click: $item => { return $item.get(0).checked; }, fill: (type, answer, $option) => { if (type === 4 || type === 2 || type === 5) { UE$1.getEditor($option.attr("name")).setContent(answer); } }, finished: auto_jump => { auto_jump && setInterval(function() { const btn = $(".saveYl:contains(下一题)").offset(); var mouse = document.createEvent("MouseEvents"), arr = [ btn.left + Math.ceil(Math.random() * 80), btn.top + Math.ceil(Math.random() * 26) ]; mouse.initMouseEvent("click", true, true, document.defaultView, 0, 0, 0, arr[0], arr[1], false, false, false, false, 0, null); _self.event = $.extend(true, {}, mouse); delete _self.event.isTrusted; _self.getTheNextQuestion(1); }, Math.ceil(GLOBAL.fillAnswerDelay * Math.random()) * 2); } }); WorkerJSPlus({ name: "超星章节测验", match: location.pathname === "/work/doHomeWorkNew" || location.pathname === "/mooc-ans/work/doHomeWorkNew", init: start, root: ".clearfix .TiMu", elements: { question: ".Zy_TItle .clearfix", options: "ul:eq(0) li .after", $options: "ul:eq(0) li :radio,:checkbox,textarea,.num_option_dx,.num_option", type: "input[name^=answertype]" }, ignore_click: $item => { if ($item.is("input")) { return $item.get(0).checked; } return $item.attr("class").includes("check_answer"); }, fill: async (type, answer, $option) => { if (type === 4 || type === 2 || type === 5) { UE$1.getEditor($option.attr("name")).setContent(answer); } } }); WorkerJSPlus({ name: "超星新版考试", match: () => { const cxSinglePage = (location.pathname === "/exam/test/reVersionTestStartNew" || location.pathname === "/exam-ans/exam/test/reVersionTestStartNew" || location.pathname === "/mooc-ans/exam/test/reVersionTestStartNew") && location.href.includes("newMooc=true"); const cxAll = location.pathname === "/mooc2/exam/preview" || location.pathname === "/exam-ans/mooc2/exam/preview" || location.pathname === "/mooc-ans/mooc2/exam/preview"; return cxSinglePage || cxAll; }, root: ".questionLi", elements: { question: "h3 div", options: ".answerBg .answer_p, .textDIV, .eidtDiv", $options: ".answerBg, .textDIV, .eidtDiv", type: "input[name^=type]:eq(" + GLOBAL.i + ")" }, ignore_click: $item => { return Boolean($item.find(".check_answer,.check_answer_dx").length); }, hook: () => { GLOBAL.i = Number((location.pathname === "/exam/test/reVersionTestStartNew" || location.pathname === "/exam-ans/exam/test/reVersionTestStartNew" || location.pathname === "/mooc-ans/exam/test/reVersionTestStartNew") && location.href.includes("newMooc=true")); }, wrap: obj => { if (obj.type === 6) { obj.type = 4; } }, fill: (type, answer, $option) => { if (type === 4 || type === 2 || type === 5) { const name = $option.find("textarea").attr("name"); UE$1.getEditor(name).setContent(answer); if (GLOBAL.i === 0) { console.log("#" + name.replace("answerEditor", "save_")); $("#" + name.replace("answerEditor", "save_")).click(); } } }, finished: a => { a && $('.nextDiv .jb_btn:contains("下一题")').click(); } }); WorkerJSPlus({ name: "超星随堂测验", match: location.pathname.includes("/page/quiz/stu/answerQuestion"), root: ".question-item", elements: { question: ".topic-txt", options: ".topic-option-list", $options: ".topic-option-list input", type: "input[class^=que-type]" }, ignore_click: $item => { return Boolean($item.find(".check_answer,.check_answer_dx").length); }, wrap: obj => { if (obj.type === 16) { obj.type = 3; } }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { $option.val(answer); } } }); function JSONParseHook(func) { if (location.host.includes("zhihuishu")) { let oldSend = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.send = function() { this.addEventListener("readystatechange", function() { if (this.readyState === 4 && this.response.includes("workExamParts")) { try { func(JSON.parse(this.response)); } catch (err) {} } }, false); return oldSend.apply(this, arguments); }; } else { const parse = JSON.parse; JSON.parse = function(...args) { const o = parse.call(this, ...args); func(o); return o; }; } } function hookZhiHuiShuWork(o, arr) { function format(item) { let options = []; let options_id; if (item.questionOptions && item.questionOptions.length) { options = item.questionOptions.map(o => { return formatString(o.content); }); options_id = item.questionOptions.map(o => { return o.id; }); } return { qid: item.id, question: formatString(item.name), type: getQuestionType(item.questionType.name), options_id: options_id, options: options }; } if (o.rt && o.rt.examBase && o.rt.examBase.workExamParts.length > 0) { GLOBAL.content = o.rt; GLOBAL.json = o.rt.examBase.workExamParts.map(part => { return part.questionDtos.map(item => { if ("阅读理解(选择)/完型填空" === item.questionType.name || "听力训练" === item.questionType.name || !(item.questionType.name.includes("填空") || item.questionType.name.includes("问答")) && item.questionChildrens && item.questionChildrens.length > 0) { return item.questionChildrens.map(i => { console.log(format(i)); return format(i); }).flat(); } else { return format(item); } }); }).flat(); } else if (o.rt && Object.keys(o.rt).length > 0 && !isNaN(Object.keys(o.rt)[0])) { GLOBAL.img = o.rt; } } WorkerJSPlus({ name: "智慧树作业/考试", match: !location.href.includes("checkHomework") && location.host.includes("zhihuishu") && (location.pathname === "/stuExamWeb.html" || location.href.includes("/webExamList/dohomework/") || location.href.includes("/webExamList/doexamination/")), root: ".examPaper_subject", elements: { question: ".subject_describe div,.smallStem_describe p", options: ".subject_node .nodeLab .node_detail", $options: ".subject_node .nodeLab .node_detail", type: ".subject_type span:first-child" }, hook: () => { JSONParseHook(hookZhiHuiShuWork); }, intv: () => { return $(".answerCard").length; }, wrap: obj => { Object.assign(obj, GLOBAL.json[GLOBAL.index - 1]); console.log(obj); if ($(".yidun_popup").hasClass("yidun_popup--light")) { iframeMsg("tip", { type: "stop", tip: "答题暂停,请自行通过验证" }); GLOBAL.stop = true; } }, ignore_click: $item => { return $item.hasClass("onChecked"); }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { UE$1.getEditor($option.find("textarea").attr("name")).setContent(answer); } }, finished: async () => { vm.zhihuishuSaveTip(); const len = $(".answerCard_list li").length; for (let i = 0; i < len; i++) { await sleep(500); try { $(".answerCard_list1 li").eq(i).click(); await sleep(1e3); $(".el-button:contains(下一题)").click(); } catch (e) { $(".el-button:contains(保存)").click(); } const process = ((i + 1) / len * 100).toFixed(0); $("#gs_p").val(process); $("#gs_text").text(process + "%"); } if (top.document.querySelector("#gs_p").value == 100) { top.document.querySelector("#zhihuishuSaveTip").remove(); } }, fillFinish: () => { $(".answerCard_list li").eq(GLOBAL.index - 1).click(); $(".el-button:contains(下一题)").click(); } }); WorkerJSPlus({ name: "智慧树学分课作业", match: location.href.includes("/atHomeworkExam/stu/homeworkQ/exerciseList") || location.href.includes("atHomeworkExam/stu/examQ/examexercise"), root: ".questionBox:eq(0)", elements: { question: ".questionContent", options: ".optionUl label .el-radio__label,.el-checkbox__label", $options: ".optionUl label", type: ".questionTit" }, intv: () => { return $(".answerCard").length || $(".questionTit").length; }, wrap: async obj => { obj.options = obj.options.map(item => { return formatString(item.replaceAll(/^[a-zA-Z][.|\s+]/g, "")); }); if ($(".yidun_popup").hasClass("yidun_popup--light")) { iframeMsg("tip", { type: "stop", tip: "答题暂停,请自行通过验证" }); GLOBAL.stop = true; } }, ignore_click: $item => { return $item.hasClass("is-checked"); }, finished: () => { if ($(".Nextbtndiv .Topicswitchingbtn-gray:contains(下一题)").hasClass("Topicswitchingbtn-gray")) return false; $(".Topicswitchingbtn:contains(下一题)").click(); return true; } }); WorkerJSPlus({ name: "智慧树学分课考试", match: location.host === "studentexambaseh5.zhihuishu.com", root: ".ques-detail", elements: { question: ".questionName .centent-pre", options: ".radio-view li .preStyle,.checkbox-views label .preStyle", $options: ".radio-view li,.checkbox-views label", type: ".letterSortNum" }, intv: () => { return $(".questionContent").length; }, ignore_click: $item => { return $item.hasClass("is-checked"); }, wrap: obj => { obj.options = obj.options.map(item => { return formatString(item.replaceAll(/^[a-zA-Z][.|\s+]/g, "")); }); if ($(".yidun_popup").hasClass("yidun_popup--light")) { iframeMsg("tip", { type: "stop", tip: "答题暂停,请自行通过验证" }); GLOBAL.stop = true; } if (obj.type === 15) { obj.question = formatString($(".centent-son-pre").text()); obj.type = 1; } }, finished: auto_jump => { if (auto_jump) { const btn = $(".next-topic:contains(下一题)"); btn.click(); return !btn.hasClass("noNext"); } } }); WorkerJSPlus({ match: location.href.includes("checkHomework") && location.host.includes("zhihuishu"), hook: () => { JSONParseHook(hookZhiHuiShuWork); }, init: () => { R({ type: 2, content: GLOBAL.content, img: GLOBAL.img }); } }); GLOBAL.timeout = 10 * 1e3; function uploadAnswer(data) { const arr2 = division(data, 100); for (let arr2Element of arr2) { GM_xmlhttpRequest({ method: "POST", url: "https://lyck6.cn/pcService/api/uploadAnswer", headers: { "Content-Type": "application/json;charset=utf-8" }, data: JSON.stringify(arr2Element), timeout: GLOBAL.timeout }); } } function uploadAnswerToPlat(data, plat) { const arr2 = division(data, 100); for (let arr2Element of arr2) { GM_xmlhttpRequest({ method: "POST", url: "https://lyck6.cn/collect-service/v1/uploadAnswerToPlat?plat=" + plat, headers: { "Content-Type": "application/json;charset=utf-8" }, data: JSON.stringify(arr2Element), timeout: GLOBAL.timeout }); } } WorkerJSPlus({ name: "职教云考试", match: location.pathname === "/exam/examflow_index.action", intv: () => { return $(".divQuestionTitle").length; }, root: ".q_content", elements: { question: ".divQuestionTitle", options: ".questionOptions .q_option", $options: ".questionOptions .q_option div,div[id^=_baidu_editor_]" }, ignore_click: $item => { return $($item).attr("class") === "checkbox_on"; }, wrap: obj => { const type = getQuestionType(obj.$item.next().attr("answertype")); obj.type = type === undefined ? defaultWorkTypeResolver(obj.$options) : type; }, fill: (type, answer, $option) => { if (type === 4 || type === 2 || type === 5) { UE$1.getEditor($option.attr("id")).setContent(answer); } }, finished: async () => { if ($(".paging_next").attr("style").includes("block") || !$(".paging_next").attr("style").includes("none")) { $(".paging_next").click(); await sleep(1e3); return true; } } }); WorkerJSPlus({ name: "职教云测验", match: location.pathname === "/study/directory/dir_course.html", intv: () => { return $(".panel_item").length; }, root: ".panel_item .panel_item", elements: { question: ".preview_cm .preview_stem", options: ".preview_cm ul li span:last-child", $options: ".preview_cm ul li input" }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().find(".panel_title").text()); obj.options = obj.options.map(i => { return i.trim().replace(/^[abAB]\)\s+/, "").replace(/^[A-Za-z]\s+/, "").trim(); }); }, ignore_click: $item => { return $item.attr("checked") === "checked"; } }); WorkerJSPlus({ name: "职教云MOOC", match: location.pathname === "/study/homework/do.html" || location.pathname === "/study/workExam/testWork/preview.html" || location.pathname === "/study/onlineExam/preview.html" || location.pathname === "/study/workExam/homeWork/preview.html" || location.pathname === "/study/workExam/onlineExam/preview.html", root: ".e-q-r", elements: { question: ".e-q-q .ErichText", options: ".e-a-g li", $options: ".e-a-g li", type: ".quiz-type" }, ignore_click: $item => { return $item.hasClass("checked"); }, wrap: obj => { if (obj.type === "A1A2题") { obj.type = 1; } obj.question = obj.question.replace(/<img src="https:\/\/cdn-zjy.icve.com.cn\/common\/images\/question_button\/blankspace(\d+).gif">/gi, ""); obj.options = obj.options.map(i => { return i.trim().replace(/^[abAB]\)\s+/, "").replace(/^[A-Za-z]\s+/, "").trim(); }); } }); function parseIcve(questions) { return questions.map(item => { const options = item.Selects.map(opt => { return formatString(opt); }); const type = getQuestionType(item.ACHType.QuestionTypeName); const answer = item.Answers.map(key => { if (type === 0 || type === 1) { return options[key.charCodeAt() - 65]; } else if (type === 3) { return key === "1" ? "正确" : "错误"; } }); const answerKey = type === 0 || type === 1 ? item.Answers : answer; return { id: item.Id, question: item.ContentText, answerKey: answerKey, options: type === 3 ? [ "正确", "错误" ] : options, answer: answer, type: type }; }); } WorkerJSPlus({ name: "资源库 新版", match: location.pathname === "/icve-study/jobTest" || location.pathname === "/icve-study/coursePreview/jobTest" || location.pathname === "/icve-study/coursePreview/test", root: ".subjectDet", elements: { question: "h5,.titleTest span:last", options: ".optionList label", $options: ".optionList input", type: ".title,.titleTest .xvhao" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { console.log(obj); }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { UE$1.getEditor($option.attr("name")).setContent(answer); } } }); WorkerJSPlus({ name: "资源库 WWW开头", match: location.pathname === "/study/works/works.html" || location.pathname === "/study/exam/exam.html", root: ".questions", elements: { question: ".preview_stem", options: "li .preview_cont", $options: "li input", type: "input:hidden" }, hook: () => { JSONParseHook(o => { if (location.pathname === "/study/works/works.html") { if (o.paper) { GLOBAL.json = parseIcve(o.paper.PaperQuestions); uploadAnswer(GLOBAL.json); } } else if (location.pathname === "/study/exam/exam.html") { if (o.array) { GLOBAL.json = parseIcve(o.array.map(item => { return item.Questions; }).flat()); uploadAnswer(GLOBAL.json); } } }); }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { function get_element(id) { for (let jsonElement of GLOBAL.json) { if (jsonElement.id === id) { return jsonElement; } } } const ele = get_element(obj.$item.find("input:hidden").val()); obj.question = ele.question; obj.answer = ele.answerKey ? ele.answerKey : ele.answer; obj.type = ele.type; obj.options = ele.options; console.log(obj); }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { UE$1.getEditor($option.attr("name")).setContent(answer); } } }); WorkerJSPlus({ name: "智慧职教 作业/考试", match: location.host.includes("zjy2.icve.com.cn"), intv: () => { return $(".subjectDet").length; }, root: ".subjectDet", elements: { question: "h5,.titleT .htmlP", options: ".optionList .el-radio__label,.el-checkbox__label", $options: ".optionList input", type: ".titleTwo,.xvhao" }, hook: () => { const parse = ques => { return ques.map(i => { const options = []; const answer = []; if (i.typeId === "3") { answer.push(i.optionAnswer === "1" ? "正确" : "错误"); } else if (/[12]/.test(i.typeId)) { options.push(...JSON.parse(i.dataJson).map(i => { if (i.IsAnswer) { answer.push(formatString(i.Content)); } return formatString(i.Content); })); } return { options: options, qid: i.id, answer: answer }; }); }; JSONParseHook(o => { if (o.name && o.questions && o.totalScore) { GLOBAL.json = parse(o.questions); } else if (o.data && o.data.questions) { GLOBAL.json = parse(o.data.questions); } }); }, ignore_click: $item => { return $($item).parent().attr("class") === "is-checked"; }, wrap: obj => { function findAnswer(id) { for (let jsonElement of GLOBAL.json) { if (jsonElement.qid === id) { return jsonElement.answer; } } } obj.answer = findAnswer(obj.$item.attr("id")); } }); function parseYkt(problems) { return problems.map(item => { const question = formatString(item.Body); const type = getQuestionType(item.TypeText); const options = []; const answer = []; if (type <= 1) { options.push(...item.Options.sort((a, b) => { return a.key.charCodeAt(0) - b.key.charCodeAt(0); }).map(item => { return formatString(item.value); })); if (item.Answer) { if (Array.isArray(item.Answer)) { answer.push(...item.Answer); } else { answer.push(...item.Answer.split("")); } } } else if (type === 3 && item.Answer && item.Answer.length === 1) { answer.push(item.Answer[0].replace("true", "正确").replace("false", "错误")); } return { answer: answer, options: options, type: type, qid: item.problem_id, question: question }; }); } function parsehnzkwText(problems) { return problems.map(item => { const type = item.flag === 1 ? 2 : item.flag === 0 ? 0 : item.flag === 4 ? 1 : item.flag === 3 ? 3 : undefined; let answer = []; let options = []; if (type === 2) { answer.push(item.answer); return { question: formatString(item.content), options: options, type: type, answer: answer }; } else if (type === 0) { for (let subjectOption of item.optionss) { const opt = formatString(subjectOption); options.push(opt); } if (type === 1) { item.answer.split("|").map(i => { answer.push(options[i.toUpperCase().charCodeAt(0) - 65]); }); } else { answer.push(options[item.answer.toUpperCase().charCodeAt(0) - 65]); } return { question: formatString(item.content), options: options, type: type, answer: answer }; } else if (type === 3) { for (let subjectOption of item.selectOption) { const opt = formatString(subjectOption); options.push(opt); } answer.push(item.answer); return { question: formatString(item.content), options: options, type: type, answer: answer }; } }); } function parseDanWei(pro) { return pro.map(i => { const type = getQuestionType(i.ttop010); const question = i.ttop011; const options = []; const answer = []; if (type === 0 || type === 1 || type === 3) { options.push(...i.ttop018.length > 0 ? i.ttop018.split("$$") : [ "正确", "错误" ]); answer.push(...i.ttop022.split("").map(item => { return options[item.charCodeAt(0) - 65]; })); } else if (type === 2 || type === 4) { answer.push(...i.ttop021.split("$$")); } return { question: question, type: type, answer: answer, options: options }; }).filter(i => i); } function parseYxbyunExam(problems) { return problems.map(item => { const type = getQuestionType(item.bigName); return item.smallContent.map(item => { let answer = []; let options = []; if (type === 2) { answer.push(item.answer); return { question: formatString(item.content), options: options, type: type, answer: answer }; } else if (type === 0 || type === 3 || type === 1) { let answer = []; let options = []; for (let subjectOption of item.question.optionList) { const opt = formatString(subjectOption.questionContent); options.push(opt); } if (type === 1) { item.question.questionAnswer.split(",").map(i => { answer.push(options[i.toUpperCase().charCodeAt(0) - 65]); }); } else { answer.push(options[item.question.questionAnswer.toUpperCase().charCodeAt(0) - 65]); } return { question: formatString(item.question.questionTitle), options: options, type: type, answer: answer }; } }); }); } WorkerJSPlus({ name: "雨课堂旧版考试", match: location.pathname.includes("/v/quiz/quiz_result"), intv: () => { return $("#cover").attr("style").includes("display: none;"); }, root: ".problem_item", elements: { question: ".notBullet:eq(0)", options: ".notBullet:gt(0)", $options: ".problembullet" }, ignore_click: $item => { return $item.hasClass("is-checked"); }, wrap: async obj => { const $item = obj.$item; const tmp = $item.find(".ptype").clone(); tmp.children().remove(); obj.type = getQuestionType(tmp.text()); obj.question = await yuketangOcr(obj.question.attr("data-background")); if (obj.$options.length === 2) { obj.options = [ "正确", "错误" ]; } else { const opt = []; for (const tmpElement of $item.find(".notBullet:gt(0)")) { opt.push(await yuketangOcr(jQuery(tmpElement).attr("data-background"))); } obj.options = opt; } } }); WorkerJSPlus({ name: "学堂在线", match: location.host === "www.xuetangx.com" && location.pathname.includes("/exercise/"), intv: () => { return $(".answer").length; }, root: ".content:eq(0)", elements: { question: ".question .fuwenben", options: ".question .leftQuestion .leftradio > span:last-child", $options: ".question .leftradio", type: ".question .title" }, ignore_click: $item => { return $item.find(".radio_jqq").hasClass("active"); }, wrap: obj => { if (obj.type === 3) { obj.$options = $(".answerList .radio_jqq"); } }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { UE.getEditor($option.find("textarea")).setContent(answer); } }, finished: () => { const $right = $(".tabbar").find(".right"); $right.click(); return !$right.hasClass("unselect"); } }); WorkerJSPlus({ name: "雨课堂新版考试", match: location.host.includes("yuketang.cn") && location.pathname.includes("/result/"), hook: () => { JSONParseHook(async o => { if (o.data && o.data.problems && o.data.problems.length > 0) { uploadAnswerToPlat(parseYkt(o.data.problems), 50); } }); } }); WorkerJSPlus({ name: "雨课堂新版考试", match: (location.host === "examination.xuetangx.com" || location.host === "changjiang-exam.yuketang.cn") && (location.pathname.includes("/exam/") || location.pathname.includes("/cover/")), hook: () => { JSONParseHook(async o => { if (o.data && o.data.problems && o.data.problems.length > 0) { GLOBAL.json = parseYkt(o.data.problems); } }); const intv = setInterval(() => { try { top.document.querySelector(".exam").__vue__.handleHangUpTip = function() {}; const querySelector = top.document.querySelector; top.document.querySelector = function(...args) { if (args[0] === "#model-id" || args[0].includes("hcSearcheModal")) return false; return querySelector.call(this, ...args); }; const getElementById = top.document.getElementById; top.document.getElementById = function(...args) { if (args[0] === "model-id" || args[0].includes("hcSearcheModal")) return false; return getElementById.call(this, ...args); }; clearInterval(intv); } catch (e) {} }, 100); }, intv: () => { return jQuery(".subject-item").length; }, root: ".exam-main--body .subject-item", elements: { question: ".item-body h4,.item-body span:eq(0)", options: ".item-body ul li", $options: ".item-body ul label, .blank-item-dynamic, .edui-editor-iframeholder", type: ".item-type" }, ignore_click: $item => { return $item.hasClass("is-checked"); }, wrap: obj => { obj.options = obj.type === 3 ? [ "正确", "错误" ] : obj.options.map(i => { return i.replace(/^[A-G]\s/, ""); }); try { obj.qid = GLOBAL.json[GLOBAL.index - 1].qid; obj.plat = 50; } catch (e) { console.log(e); } } }); WorkerJSPlus({ name: "雨课堂新版作业,需要一个一个点下一题的", match: location.pathname.includes("/v2/web/cloud/student/exercise/"), hook: () => { async function parseYkt(problems, font) { const res = problems.map(i => { const type = getQuestionType(i.content.TypeText); const question = i.content.Body; let options = []; if (type <= 1) { options = i.content.Options; } else if (type === 3) { options = i.content.Options.map(item => { return item.key.replace("true", "正确").replace("false", "错误"); }); } return { qid: i.problem_id, question: question, type: type, options: options, user: i.user }; }).filter(i => i); for (const item of res) { item.question = await getEncryptString(item.question, font); const answerArray = []; if (item.type <= 1) { const optionsArray = []; for (const itemElement of item.options) { const opt = await getEncryptString(itemElement.value, font); if (item.user && item.user.is_show_answer && item.user.answer.includes(itemElement.key)) { answerArray.push(opt); } optionsArray.push(opt); } item.options = optionsArray; } else if (item.type === 3) { if (item.user && item.user.is_show_answer && item.user.answer.length === 1) { answerArray.push(item.user.answer[0].replace("true", "正确").replace("false", "错误")); } } delete item.user; item.answer = answerArray; } return res; } JSONParseHook(async o => { if (o.data && o.data.problems) { GLOBAL.json = await parseYkt(o.data.problems, o.data.font); uploadAnswerToPlat(GLOBAL.json, 50); } }); }, intv: () => { return jQuery(".subject-item").length; }, root: ".container-problem .subject-item", elements: { question: ".problem-body", options: "label .radioText,.checkboxText", $options: "ul input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: async obj => { const index = jQuery(".item-type").text().match(/(\d+)\./)[1]; Object.assign(obj, GLOBAL.json[parseInt(index) - 1]); obj.plat = 50; }, finished: need_jump => { if ($(".el-button--text:contains(下一题)").hasClass("is-disabled")) return false; need_jump && setTimeout(() => { $(".el-button--text:contains(下一题)").click(); }, GLOBAL.fillAnswerDelay); return need_jump; } }); WorkerJSPlus({ name: "考试系统", match: location.host === "gdrtvu.exam-cloud.cn" && location.pathname.includes("examRecordData"), intv: () => { return $("#examing-home-question").length; }, root: ".question-container", elements: { question: ".question-body:first", options: ".option .question-options", $options: ".option input", type: ".question-header .container" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { const split = obj.question.split(/[A-G]\./); if (split.length === obj.options.length + 1) { obj.question = split.shift(); obj.options = split; } if (obj.type === undefined || obj.type === null || isNaN(obj.type) || obj.type > 3) { obj.type = defaultWorkTypeResolver(obj.$options); console.log(obj.type); } if (document.querySelector(".question-container .right")) { let current = 0; const domItem = document.querySelectorAll(".item"); for (const dom of domItem) { current++; if (dom.className.includes("current-question")) { break; } } obj.question = `【第${current}小题】` + filterImg(jQuery(".right .question-view .question-body")) + obj.question; } }, finished: async need_jump => { await sleep(500); if ($(".next a").length === 0) { return false; } window.parent.document.querySelector(".next a").click(); return true; } }); WorkerJSPlus({ name: "云班课", match: location.pathname === "/web/index.php" && location.href.includes("m=reply"), root: ".topic-item", elements: { question: ".t-con .t-subject", options: ".t-option label .option-content", $options: ".el-radio__input,.el-checkbox__input", type: ".t-info .t-type" }, ignore_click: $item => { return $item.hasClass("is-checked"); }, wrap: obj => { if (obj.type === "A1A2题") { obj.type = 1; } obj.question = obj.question.replace(/<img src="https:\/\/cdn-zjy.icve.com.cn\/common\/images\/question_button\/blankspace(\d+).gif">/gi, ""); obj.options = obj.options.map(i => { return i.trim().replace(/^[abAB]\)\s+/, "").replace(/^[A-Za-z]\s+/, "").trim(); }); } }); WorkerJSPlus({ name: "中国地质大学", match: location.pathname.includes("/Exam/OnlineExamV2/"), root: ".stViewItem", elements: { question: ".stViewHead div", options: ".stViewCont .stViewOption a", $options: ".stViewCont .stViewOption a,input" }, intv: () => { return $(".ExamTime").length; }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().parent().prev().find(".E_E_L_I_C_R_C_T_SubType").text()); obj.question = obj.question.replace(/\(\d+分\)/, ""); obj.options = obj.options.map(i => { return i.replace(/\([A-Za-z]\)/, "").trim(); }); }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { $option.val(answer); } } }); WorkerJSPlus({ name: "单位", match: (location.host === "61.183.163.9:8089" || location.host === "zjpt.nnjjtgs.com:8081") && (location.href.includes("ksnr") || location.href.includes("lxnr")), hook: () => { JSONParseHook(o => { if (o.topicList && o.topicList.length > 0) { GLOBAL.json = parseDanWei(o.topicList); uploadAnswer(GLOBAL.json); } }); }, root: ".tm", elements: { question: ".tmnrbj span:last-child", options: ".van-radio-group .dxt .van-radio__label,.van-checkbox__label", $options: ".van-radio-group .dxt .van-radio__label,.van-checkbox__label,.van-field__control", type: ".tmnrbj span" }, intv: () => { return $(".ExamTime").length || document.getElementById("pup-b"); }, wrap: obj => { obj.answer = GLOBAL.json[jQuery(".tmnrbj span:last-child").text().match(/^(\d+)、/)[1] - 1].answer; }, finished: () => { jQuery(".xyt").click(); return true; } }); WorkerJSPlus({ name: "小鹅通", match: location.pathname.includes("/evaluation_wechat/examination/detail/"), root: ".question-title,.title__text", elements: { question: "#detail_div", options: "label .image-text-box p", $options: "label,.simulation_inp" }, ignore_click: ($item, type) => { if (type === 0) { return $item.html().includes("single-exam-radio-active"); } else if (type === 1) { return $item.html().includes("check-i-active"); } }, wrap: obj => { const $item = obj.$item; obj.$options = $item.parent().next().find(".option-item,.checking-option__container,.fill_blank"); obj.type = getQuestionType($item.next().text()); if (obj.type === 2) { obj.$options = $item.parent().parent(); } if (obj.type === 3) { obj.options = [ "正确", "错误" ]; } else { obj.options = jQuery.map($item.parent().next().find(".option-item #detail_div"), function(val) { return formatString(filterImg(val)); }); } }, fill: (type, answer, $option) => { if (type === 2) { const vue = $option.get(0).__vue__; vue.content[0] = answer; vue.emitAnswer(); $option.find(".simulation_inp").text(answer); } } }); WorkerJSPlus({ name: "小饿通H5", match: location.host.includes("h5.xiaoeknow") || location.href.includes("/exam/h5_evaluation/"), root: ".practice-detail__body", elements: { question: ".question-wrap__title #detail_div", options: ".question-option #detail_div", $options: ".question-option #detail_div", type: ".question-wrap__title-tag" }, wrap: obj => { const $item = obj.$item; obj.$options = $item.parent().next().find(".option-item,.checking-option__container,.fill_blank"); obj.type = TYPE[$item.next().text().replace(/\s+/, "").replace("(", "").replace(")", "")]; if (obj.type === 2) { obj.$options = $item.parent().parent(); } if (obj.type === 3) { obj.options = [ "正确", "错误" ]; } else { obj.options = jQuery.map($item.parent().next().find(".option-item #detail_div"), function(val) { return formatString(filterImg(val)); }); } }, finished: () => { $(".practice-detail__bottom-item:last-child").click(); return $(".next").text() === "下一题"; } }); WorkerJSPlus({ name: "人卫慕课测验", match: location.pathname.includes("/memberFront/paper.zhtml"), intv: () => { return $("#question_").attr("style").length === 0; }, root: ".quesinfo", elements: { question: "dl dt", options: "dd label", $options: "dd input" }, wrap: obj => { if (obj.$options.length === 2) { obj.type = 3; obj.options = [ "正确", "错误" ]; } else { obj.type = 0; } } }); WorkerJSPlus({ name: "青书学堂考试", match: location.host.includes("qingshuxuetang") && (location.pathname.includes("/Student/MakeupExamPaper") || location.pathname.includes("Student/ExamPaper")), intv: () => { return $(".paper-container .question-detail-container").length; }, root: ".paper-container .question-detail-container", elements: { question: ".question-detail-description .detail-description-content", options: ".question-detail-options label .option-description", $options: ".question-detail-options label input", type: ".question-detail-type .question-detail-type-desc" }, ignore_click: $item => { return $item.prop("checked"); } }); WorkerJSPlus({ name: "青书学堂测验", match: location.host.includes("qingshuxuetang") && location.pathname.includes("/Student/ExercisePaper") || location.host === "quiz.qingshuxuetang.com" && location.pathname.includes("/Student/Quiz/Detail"), intv: () => { return $(".question-detail-container").length; }, root: ".question-detail-container", elements: { question: ".question-detail-description span", options: ".question-detail-options label .option-description", $options: ".question-detail-options div input,.question-detail-solution-textarea", type: ".question-detail-type" }, wrap: obj => { obj.options = obj.options.map(i => { return i.replace(/\([A-Za-z]\)/, "").trim(); }); }, ignore_click: ($item, type) => { if (type === 1) { return $item.prop("checked"); } }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { $option.parents().find(".question-controller-wrapper .next").click(); } } }); WorkerJSPlus({ name: "优学院测验", match: location.pathname === "/learnCourse/learnCourse.html", intv: () => { return $(".question-setting-panel").length; }, root: ".split-screen-wrapper", elements: { question: ".question-title-scroller .question-title-html", options: ".choice-list .content-wrapper .text", $options: ".choice-list .checkbox ,.question-body-wrapper .choice-btn", type: ".question-title-scroller .question-type-tag" }, wrap: obj => { obj.options = obj.options.map(i => { return formatString(i.replaceAll(/[a-zA-z]\)\s+/g, "").replaceAll(/^[a-z]\s+/g, "").replaceAll(/^[a-z]、\s+/g, "").trim()); }); }, ignore_click: $item => { return $item.hasClass("selected"); } }); WorkerJSPlus({ name: "优学院作业", match: location.pathname === "/quiz/pc.html", intv: () => { return $(".questions").length; }, root: ".question-item", elements: { question: ".question-title", options: "ul label .choice-title", $options: "ul label input", type: ".title" }, wrap: obj => { obj.options = obj.options.map(i => { return formatString(i.replaceAll(/[a-zA-z]\)\s+/g, "").replaceAll(/^[a-z]\s+/g, "").replaceAll(/^[a-z]、\s+/g, "").trim()); }); }, ignore_click: $item => { return $item.prop("checked"); } }); WorkerJSPlus({ name: "优学院考试", match: location.host === "utest.ulearning.cn" && location.pathname === "/", intv: () => { return $(".section-area").length; }, root: ".question-area .question-item", elements: { question: ".base-question .title .rich-text", options: ".choice-list label .rich-text", $options: ".choice-list label, .iconfont", type: ".base-question .title .tip" }, wrap: obj => { obj.options = obj.options.map(i => { return formatString(i.replaceAll(/[a-zA-z]\)\s+/g, "").replaceAll(/^[a-z]\s+/g, "").replaceAll(/^[a-z]、\s+/g, "").trim()); }); }, ignore_click: $item => { return $item.hasClass("is-checked"); }, finished: () => { if ($(".next-part:contains(下个部分)").length) { $(".next-part").click(); return true; } else { return false; } } }); WorkerJSPlus({ name: "优学院作业", match: location.pathname === "/umooc/learner/homework.do", intv: () => { return $(".multiple-choices").length; }, root: ".multiple-choices,.judge", elements: { question: "h5 .position-rltv span:last-child", options: "ul label span:last-child", $options: "ul label input,.radios .radio input", type: "h5 .typeName" }, wrap: obj => { obj.options = obj.options.map(i => { return formatString(i.replaceAll(/[a-zA-z]\)\s+/g, "").replaceAll(/^[a-z]\s+/g, "").replaceAll(/^[a-z]、\s+/g, "").trim()); }); }, ignore_click: $item => { return $item.prev().hasClass("checkbox-checked"); } }); WorkerJSPlus({ name: "万学", match: location.pathname.includes("/sls/N2014_StudyController/next"), root: ".question", elements: { question: "tr .nm2", options: ".grey td p", $options: ".option li label", type: "tr .nm2" }, wrap: obj => { obj.question = obj.question.parent().find("td p").text(); } }); WorkerJSPlus({ name: "wenJuanAutoFill", match: location.host.includes("wenjuan.com") && location.pathname === "/s/", root: "questionContent", elements: { question: ".title", options: ".icheckbox_div .option_label", $options: ".icheckbox_div label", type: ".question_num" }, ignore_click: $item => { return $item.attr("class").includes("checked"); } }); WorkerJSPlus({ name: "学起(考试)", match: location.pathname.includes("/oxer/page/ots/examIndex.html"), intv: () => { return $(".tika_topline").length; }, root: ".queItemClass", elements: { question: "dt .din:eq(1)", options: ".clearfix div", $options: ".clearfix .xuan,input" }, ignore_click: $item => { return $item.parent().hasClass("cur"); }, wrap: obj => { obj.plat = 66; obj.qid = obj.$item.attr("id"); obj.type = getQuestionType(obj.$item.parent().find("div .fb:eq(0)").text()); if (obj.type === 3) { obj.options = [ "正确", "错误" ]; } } }); WorkerJSPlus({ name: "学起(测试)", match: location.pathname.includes("/oxer/page/ots/UniversityStart.html"), intv: () => { return $(".uniQueList").length; }, root: ".uniQueItem", elements: { question: ".QueStem", options: "ul li span", $options: "ul li" }, ignore_click: $item => { return $item.parent().hasClass("lichecked"); }, wrap: obj => { obj.type = getQuestionType(obj.$item.parents(".uniQueList").find(".fir").text()); if (obj.type === 3) { obj.options = [ "正确", "错误" ]; } console.log(obj); } }); WorkerJSPlus({ name: "易班考试", match: location.host === "exam.yooc.me" && location.pathname.includes("/group"), intv: () => { return $(".jsx-3527395752").length; }, root: "main:last", elements: { question: "h3 div", options: ".mb ul li .flex-auto", $options: ".mb ul li", type: ".mb-s" }, ignore_click: $item => { return $item.hasClass("_c"); }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { $(".exam-input").val("answer"); } }, finished: need_jump => { if ($('.round:contains("下一题")').hasClass("ghost")) return false; $('.round:contains("下一题")').click(); return true; } }); WorkerJSPlus({ name: "英华学堂", match: () => { const pathMatch = location.pathname.includes("/user/work") || location.pathname.includes("/user/exam"); const matchHostArr = [ "mooc.kdcnu.com", "mooc.yncjxy.com", "mooc.cdcas.com", "mooc.cqcst.edu.cn", "mooc.kmcc.edu.cn", "mooc.wuhues.com" ]; return pathMatch && matchHostArr.includes(location.host); }, intv: () => { return $("#stateName").text().trim() === "进行中"; }, root: ".courseexamcon-main", elements: { question: ".name", options: ".list li .txt", $options: ".list li .exam-inp", type: ".type" }, ignore_click: $item => { return $item.prop("checked"); }, fill: (type, answer, $option) => {}, finished: auto_jump => { if ($(".next_exam").eq(3).prop("style")[0] == "display") return false; $(".next_exam").click(); } }); WorkerJSPlus({ name: "厦门在线教育测验", match: location.pathname.includes("/nec/student/exam/exam-paper!test"), root: "#paper_form > div:nth-child(4) > table:nth-child(1) > tbody:nth-child(2)>tr:even", elements: { question: "td:eq(1)", options: ".optionUl label .el-radio__label,.el-checkbox__label", $options: ".optionUl label" }, wrap: obj => { obj.options = obj.$item.next().find("tbody:first > tr tbody").map((i, y) => { return $(y).find("td:eq(1)").text(); }).toArray(); obj.$options = obj.$item.next().find("tbody:first > tr tbody").map((i, y) => { return $(y).find("input"); }); obj.type = 0; } }); WorkerJSPlus({ name: "金牌学堂", match: location.host === "www.goldgame.com.cn" && location.href.includes("/TestPage"), intv: () => { return $(".tab-btn-box li").length; }, root: ".test-type-box ul .white-bg", elements: { question: ".position-relative h3", options: ".test-option label p:last-child", $options: ".test-option label input" }, wrap: obj => { obj.question = obj.question.replace(/题目\d+\:/, "").trim().replace(/^\d+./, ""); obj.type = getQuestionType(obj.$item.parent().parent().find(".test-type-tips").text()); if (obj.$options.length > 2 && obj.$options.eq(0).hasClass("radiobox")) { obj.type = 0; } }, fillFinish: data => { $(".answer-sheet li").eq(GLOBAL.index).click(); } }); WorkerJSPlus({ name: "青岛开放大学", match: location.pathname.includes("/pages/exam/exam.html"), intv: () => { return $(".exam-content-block .exam-content-topic").length; }, root: ".exam-content-block .exam-content-topic", elements: { question: ".exam-topic-title", options: ".exam-topic-answer .layui-unselect span", $options: ".exam-topic-answer .layui-unselect" }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().find(".exam-content-title .exam-content-num").text()); } }); WorkerJSPlus({ name: "点墨考试", match: location.pathname.includes("/Exam/StartExam"), root: "#question div div:first", elements: { question: "div:first", options: "div:first ~ div", $options: "div:first ~ div input" }, wrap: obj => { obj.type = getQuestionType($(".alert #groupNameSpan").text()); }, finished: () => { $(".w-100 .btn-light:eq(1)").click(); return true; } }); WorkerJSPlus({ name: "点墨测验", match: location.pathname.includes("/Course/TestPaper"), root: ".question", elements: { question: " div div:first div:first", options: " div div:first div:first ~ div", $options: " div div:first div:first ~ div input" }, wrap: obj => { obj.type = getQuestionType($("h3").text()); obj.question = obj.question.replace(/^\d+\./, ""); } }); WorkerJSPlus({ name: "警官学院", match: location.pathname.includes("/bsmytest/startTi.do"), root: ".wrapper > div", elements: { question: ".dx", options: "p", $options: "p input" }, wrap: obj => { if ($(".wrapper .cl").length > 0) { obj.question = obj.$item.text().replace(/[0-9]、/, "").replace(/\(.*?\)/g, "").trim().split("$")[0].replace(/\(.*?\)/g, "").trim(); } else { obj.question = obj.question.replace(/[0-9]、/, "").replace(/\(.*?\)/g, "").trim(); } obj.type = getQuestionType(obj.$item.parent().find("h2").text()); obj.options = obj.options.map(item => { return item.replace(/[A-Za-z][\:]/, "").replace(/[A-Za-z][\:,\:]/, "").replace(/\;/, "").trim(); }); } }); WorkerJSPlus({ name: "exam2_euibe_com_exam", match: location.hostname === "exam2.euibe.com" && location.pathname === "/KaoShi/ShiTiYe.aspx", root: ".question", elements: { question: ".wenti", options: "li label span", $options: "li label" }, wrap: obj => { obj.type = getQuestionType($(".question_head").text()); }, finished: need_jump => { $(".paginationjs-next").click(); return true; } }); WorkerJSPlus({ name: "lzwyedu_jijiaool_com_exam", match: () => { const pathMatch = location.pathname.includes("/learnspace/course/test/") || location.pathname.includes("/Student/ExamManage/CourseOnlineExamination"); const matchHostArr = [ "lzwyedu.jijiaool.com", "cgjx.jsnu.edu.cn", "learn-cs.icve.com.cn", "nwnu.jijiaool.com", "lut.jijiaool.com", "learn.courshare.cn", "cj1027-kfkc.webtrn.cn" ]; return pathMatch && matchHostArr.includes(location.host); }, root: ".test_item", elements: { question: ".test_item_tit", options: ".test_item_theme label .zdh_op_con", $options: "label input" }, wrap: obj => { obj.question = obj.question.replace(/该题未做$/, "").replace(/^\d+\./, "").replace(/^\d+、/, "").replace(/[((](\d+\s?(\.\d+)?分)[))]$/, "").replace(/^((\d+.(\s+)?)?)[\[((【](.*?)[】))\]]/, "").trim(); obj.type = getQuestionType(obj.$item.prevAll(".test_item_type:first").text()); if (obj.type === 3) { obj.options = [ "对", "错" ]; } } }); WorkerJSPlus({ name: "zzx_ouchn_edu_cn_exam", match: location.hostname === "zzx.ouchn.edu.cn" && location.pathname.includes("/edu/public/student/"), root: ".subject", elements: { question: ".question span", options: ".answer>span>p:first-child", $options: ".answer>span>p:first-child" }, wrap: obj => { if (obj.$options.length > 1) { obj.type = 0; } } }); WorkerJSPlus({ name: "zzx_ouchn_edu_cn_exam", match: location.hostname === "zzx.ouchn.edu.cn" && location.pathname.includes("/edu/public/student/"), root: ".subject", elements: { question: ".question span", options: ".answer>span>p:first-child", $options: ".answer>span>p:first-child" }, wrap: obj => { if (obj.$options.length > 1) { obj.type = 0; } } }); WorkerJSPlus({ name: "havust_hnscen_cn_exam", match: location.hostname === "havust.hnscen.cn" && location.pathname.includes("/stuExam/examing/"), root: ".main .mt_2 > div", elements: { question: ".flex_row+div", options: ".flex_row+div+div .el-radio__label,.el-checkbox__label", $options: ".flex_row+div+div .el-radio__label,.el-checkbox__label", type: ".flex_row .mr_2" } }); WorkerJSPlus({ name: "www_zygbxxpt_com_exam", match: location.hostname === "www.zygbxxpt.com" && location.pathname.includes("/exam"), root: ".Body", elements: { question: ".QName", options: ".QuestinXuanXiang p:parent", $options: ".QuestinXuanXiang p:parent", type: ".QName span" }, wrap: obj => { obj.question = obj.question.replace(/\([^\)]*\)/g, "").replace(/\【.*?\】/g, ""); obj.options = obj.options.map(item => { return item.split(">").pop().trim(); }); } }); WorkerJSPlus({ name: "xuexi_jsou_cn_work", match: location.hostname === "xuexi.jsou.cn" && location.pathname.includes("/jxpt-web/student/newHomework/showHomeworkByStatus"), root: ".insert", elements: { question: ".window-title", options: ".questionId-option .option-title div[style^=display]", $options: ".questionId-option .option-title .numberCover" }, wrap: obj => { obj.type = { 1: 0, 2: 1, 7: 3 }[obj.$item.find(".question-type").val()]; if (obj.options.length == 2) { obj.type = 3; } } }); WorkerJSPlus({ name: "czvtc_cjEdu_com_exam", match: () => { const pathMatch = location.pathname.includes("/ExamInfo") || location.pathname.includes("/Examination"); const matchHostArr = [ "czvtc.cj-edu.com", "hbkjxy.cj-edu.com", "bhlgxy.cj-edu.com", "hbsi.cj-edu.com", "czys.cj-edu.com", "hbjd.cj-edu.com", "xttc.cj-edu.com", "bvtc.cj-edu.com", "caztc.cj-edu.com" ]; return pathMatch && matchHostArr.includes(location.host); }, intv: () => { return $(".el-container .all_subject>.el-row").length; }, root: ".el-container .all_subject>.el-row", elements: { question: ".stem div:last-child", options: ".el-radio-group .el-radio__label,.el-checkbox-group .el-checkbox__label", $options: ".el-radio-group .el-radio__original,.el-checkbox-group .el-checkbox__original" }, wrap: obj => { if (obj.$options.length < 3 && obj.$options.eq(0).attr("type") === "radio") { obj.type = 3; } else if (obj.$options.length > 2 && obj.$options.eq(0).attr("type") === "radio") { obj.type = 0; } else if (obj.$options.length > 2 && obj.$options.eq(0).attr("type") === "checkbox") { obj.type = 1; } } }); WorkerJSPlus({ name: "learning_mhtall_com_exam", match: location.host.includes("learning.mhtall.com") && location.pathname.includes("/rest/course/exercise/item"), root: "#div_item", elements: { question: ".item_title", options: ".opt div label", $options: ".opt div input:not(.button_short)", type: "h4" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { if (obj.type === 0 || obj.type === 3) { obj.answer = $(".div_answer").text().match(/[a-zA-Z]/).map(i => { return obj.options[i.charCodeAt(0) - 65]; }); } else if (obj.type === 2) { obj.answer = $(".div_answer").text().replace("参考答案:", "").split(","); } }, fill: (type, answer, $option) => { if (type === 2 || type === 4) { $option.val(answer); $(".DIV_TYPE_BLANK .button_short").click(); } }, fillFinish: () => { if ($(".opt+div+div input:eq(1)").val() === "下一题") { $(".opt+div+div input:eq(1)").click(); } else { $(".button_short:eq(2)").click(); } } }); WorkerJSPlus({ name: "168网校(测验)", match: location.host.includes("168wangxiao.com") && location.pathname.includes("/web/learningCenter/details/"), intv: () => { return $(".ret-answer").length === 0 && $(".info-container").length; }, root: ".question-item-container", elements: { question: ".title-content", options: ".options .opt-content", $options: ".options label", type: ".top .type" } }); WorkerJSPlus({ name: "168网校(考试)", match: location.host.includes("168wangxiao.com") && location.pathname.includes("/web/examination/answer"), intv: () => { return $(".Answer-area").length; }, root: ".Answer-area", elements: { question: ".listTit", options: ".el-radio__label span:last-child,.el-checkbox__label span:last-child", $options: ".el-radio__input,.el-checkbox__input input,.ql-editor p" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { if (obj.options.length === 0) { obj.type = 2; } console.log(obj); }, fill: (type, answer, $option) => { if (type === 2 || type === 4) { console.log(answer); document.querySelector(".ql-editor p").textContent = answer; } }, finished: () => { if ($(".ctrl .el-button:contains(下一题)").length != 0) { $(".ctrl .el-button:contains(下一题)").click(); return true; } else if ($(".ctrl .el-button:contains(上一题)").length && $(".ctrl button").length === 1) { return false; } } }); WorkerJSPlus({ name: "法宣在线", match: location.host.includes("faxuanyun.com") && location.pathname.includes("/bps/examination"), intv: () => { return $("#timucontent").length; }, root: "#timucontent", elements: { question: "h2", options: "ul li", $options: "ul input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { obj.question = obj.question.replace(/[\((].+?[)\)]/g, ""); if ($(".layui-layer-content").length) { iframeMsg("tip", { type: "stop", tip: "答题暂停,请自行通过验证" }); $("#lastButton").click(); GLOBAL.stop = true; return false; } }, finished: need_jump => { if ($("#nextButton").length) { $("#nextButton").click(); return true; } else { return false; } } }); WorkerJSPlus({ name: "山财培训网 (补考)", match: location.host.includes("training.sdufe.edu.cn") && location.pathname.includes("/Exam/OnlineExam/"), intv: () => { return $(".exam_r_m").length; }, root: ".exam_r_m", elements: { question: ".bt", options: ".btm", $options: ".btm input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { obj.question = obj.question.replace(/[\((].+?[)\)]/g, ""); obj.options = $("br").parent().text().split(/[A-Z]\./).slice(1).map(item => { return item.trim(); }); if (obj.type === 3) { obj.answer = $("#answerDiv").text().replace("正确答案:", "").split(); } else { obj.answer = $("#answerDiv").text().match(/[A-Z]/g).map(item => { return obj.options[item.charCodeAt(0) - 65]; }); } }, finished: () => { document.querySelector("#next").click(); if (document.querySelector("#noAskCount").textContent == "0") { return false; } return true; } }); WorkerJSPlus({ name: "和学在线", match: (location.host.includes("student.hexuezx") || location.host.includes("student.jxjyzx")) && location.hash.includes("homework-questions"), intv: () => { return $(".el-card__body").length; }, root: ".el-card__body", elements: { question: ".stem", options: ".el-radio__label,.el-checkbox__label span", $options: ".el-radio__input,.el-checkbox__input input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { obj.question = obj.question.replace(/[\((].+?[)\)]/g, ""); console.log(obj); } }); WorkerJSPlus({ name: "高教在线", match: location.host === "www.cqooc.com" && (location.href.includes("/learn/mooc/exam/do") || location.href.includes("/learn/mooc/testing/do")), intv: () => { return $("#test-form").length; }, root: "#test-form .cat", elements: { question: ".stem", options: ".option label", $options: ".option input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { obj.question = obj.question.replace(/\(\d+分\)\d+\.\d+/, ""); console.log(obj); } }); WorkerJSPlus({ name: "柠檬文才(考试)", match: () => { const pathMatch = location.pathname.includes("/separation/exam/"); const matchHostArr = [ "learning.wuxuejiaoyu.cn", "learning.wencaischool.net", "learning.zk211.com", "study.wencaischool.net", "www.wencaischool.net" ]; return pathMatch && matchHostArr.includes(location.host); }, intv: () => { return $("#paperExam").css("display") != "none"; }, root: ".paperWrapper .tmList", elements: { question: ".tmTitleTxt", options: ".ansbox .opCont", $options: ".ansbox input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { if (obj.options.length === 0) { obj.type = 2; } console.log(obj); }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { $option.val(answer); } } }); WorkerJSPlus({ name: "柠檬文才(作业)", match: () => { const matchHostArr = [ "learning.wuxuejiaoyu.cn", "learning.wencaischool.net", "learning.zk211.com", "study.wencaischool.net" ]; return (location.pathname.includes("/hblearning/exam/") || location.pathname.includes("/xbsflearning/exam/") || location.pathname.includes("/openlearning/exam/") || location.pathname.includes("/jxlearning/exam/") || location.pathname.includes("/shandonglearning/exam")) && matchHostArr.includes(location.host); }, intv: () => { return $("#paperExam").css("display") !== "none"; }, root: "#_block_content_exam #tblDataList>tbody>tr", elements: { question: "tbody:first>tr>td:last table", options: ".ansbox .opCont", $options: ".ansbox input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { obj.question = $("#_block_content_exam #tblDataList>tbody>tr>td").find(" tbody:first>tr>td:last table:first").eq(GLOBAL.index - 1).find("tr:first").text(); obj.options = []; $("#_block_content_exam #tblDataList>tbody>tr>td").find(" tbody:first>tr>td:last table:first").eq(GLOBAL.index - 1).find("tr:first").next().find("label").map((i, y) => { obj.options.push($(y).text()); }); obj.$options = $("#_block_content_exam #tblDataList>tbody>tr>td").find(" tbody:first>tr>td:last table:first").eq(GLOBAL.index - 1).find("tr:first").next().find("input").map((i, y) => { return y; }); obj.type = 0; if (obj.options.length == 2) { obj.type = 3; } else if (obj.$options.eq(0).attr("type") != "radio") { obj.type = 1; } console.log(obj); } }); WorkerJSPlus({ name: "福建师范", match: location.host === "neo.fjnu.cn" && location.pathname.includes("/resource/index"), intv: () => { return $(".content").length && !$(".answer-content").length; }, root: ".content", elements: { question: ".title", options: "label .el-radio__label,.el-checkbox__label", $options: "label input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { console.log(obj); } }); WorkerJSPlus({ name: "优课学堂", match: location.host.includes("youkexuetang.cn") && location.pathname.includes("/student/"), intv: () => { return $(".paperItemBox").length; }, root: ".paperItemBox", elements: { question: ".stem", options: ".el-radio__label,.el-checkbox__label", $options: ".el-radio__input,.el-checkbox__input input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { obj.question = obj.question.replace(/[\((].+?[)\)]/g, ""); console.log(obj); } }); WorkerJSPlus({ name: "亿学宝云", match: location.host.includes("yxbyun.com") && location.pathname.includes("/yxbstudent/"), intv: () => { return $(".time_header").length || $(".pager_wrap").length; }, hook: () => { JSONParseHook(o => { if (o.data && o.data.bigContent) { GLOBAL.json = parseYxbyunExam(o.data.bigContent).reduce((acc, cur) => { return acc.concat(cur); }, []); console.log(GLOBAL.json); } }); }, root: ".test", elements: { question: ".type", options: ".el-radio-group,.el-checkbox-group label", $options: ".el-radio__input,.el-checkbox__input input", type: ".el-tag" }, wrap: obj => { Object.assign(obj, GLOBAL.json[GLOBAL.index - 1]); }, ignore_click: $item => { return $item.prop("checked"); } }); WorkerJSPlus({ name: "考试星(单题)", match: Boolean(location.host === "exam.kaoshixing.com" && location.pathname.includes("/exam/exam_start")), intv: () => { return $("#nextQuestions").length; }, root: ".questions .questions-content", elements: { question: ".question-name", options: ".answers label .words", $options: ".answers label" }, ignore_click: $item => { return $item.parent().find("input").prop("checked"); }, wrap: obj => { obj.question = obj.question.replace(/[\((].+?[)\)]/g, ""); console.log(obj); }, finished: () => { if ($("#nextQuestions:contains(下一题)").length && $("#nextQuestions").css("display") !== "none") { $("#nextQuestions:contains(下一题)").click(); return true; } else { return false; } } }); WorkerJSPlus({ name: "易考云", match: location.host === "exam.beeouc.com" && location.pathname.includes("/client"), intv: () => { return $(".question-body").length; }, root: ".question-body", elements: { question: ".question-stem", options: ".question-option label", $options: ".question-option input", type: ".question-type" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { console.log(obj); }, finished: () => { if ($(".question-footer button:contains(下一题)").length) { $(".question-footer button:contains(下一题)").click(); return true; } else { return false; } } }); WorkerJSPlus({ name: "伊犁师范成人教育", match: location.host === "exam.weirenzheng.cn" && (location.pathname.includes("//GeneralTestPaper/Testing/") || location.pathname.includes("//GeneralTestPaper/SNTesting")), intv: () => { return $(".topic").length; }, root: ".topic", elements: { question: ".qsctt", options: ".xuan li", $options: ".choice input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { obj.options = obj.options.map(i => { return i.replace(/^[A-Z] \. /, ""); }); if (obj.$options.length == 2) { obj.options = [ "正确", "错误" ]; obj.type = 3; } } }); WorkerJSPlus({ name: "绎通云课堂 (作业)", match: location.host.includes("ytccr.com") && (location.hash.includes("#/learning-work") || location.hash.includes("#/learning-details")), intv: () => { return $(".left-question").length; }, root: ".border-item", elements: { question: ".qa-title", options: "label .opt-title-cnt", $options: "label input" }, ignore_click: $item => { return $item.prop("checked"); } }); WorkerJSPlus({ name: "重庆大学网络教育学院 (作业)", match: location.host === "exercise.5any.com" && location.pathname.includes("/Exercise/WebUI/Test/Answer"), intv: () => { return $(".examtime-content").length; }, root: ".subject .font-16", elements: { question: ".stem .richtextcontent", options: ".option .richtextcontent", $options: ".option label input" }, ignore_click: $item => { return $item.prop("checked"); } }); WorkerJSPlus({ name: "毕节幼儿师范", match: location.host === "px.gzbjyzjxjy.cn" || location.host === "px.ggcjxjy.cn" && location.pathname.includes("/exam/shiti/dopapers"), intv: () => { return $(".panel-body").length; }, root: ".panel-body>div", elements: { question: ".testpaper-question-stem", options: ".testpaper-question-choices li", $options: ".testpaper-question-footer input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { console.log(obj); } }); WorkerJSPlus({ name: "贵州继续教育", match: location.host === "www.gzjxjy.gzsrs.cn" && location.pathname.includes("/personback/"), intv: () => { return $(".question-title").length; }, root: ".question-title", elements: { question: ".show-text", options: "label", $options: "label input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { console.log(obj); } }); WorkerJSPlus({ name: "和学自考", match: location.host === "zkpt.qdu.edu.cn" && location.pathname.includes("/examStu/exam/examPaper"), intv: () => { return $(".ant-spin-container").length; }, root: ".ant-row", elements: { options: "label", $options: "label input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { obj.question = obj.$item.parent().parent().prev().text(); console.log(obj); } }); WorkerJSPlus({ name: "专技天下", match: location.host.includes("zgzjzj.com") && location.pathname.includes("/examination/perpar.html"), intv: () => { return $(".question_index").length; }, root: ".question_index", elements: { question: "p", options: ".options li p,li>span:last-child", $options: ".options li", type: "p span" }, ignore_click: $item => { return $item.hasClass("active"); } }); WorkerJSPlus({ name: "睿学补考", match: location.href.includes("exam-app-exam-paper") && location.host.includes("ks.hustsnde.com"), intv: () => { return $("#paper").length; }, root: "#paper .content-box", elements: { question: "ul li:eq(0) .desc", options: "ul li:eq(1)", $options: "ul label input", type: ".title" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { const options = obj.options[0].trim().split(/\[[A-Z]:?\]/).splice(1).map(i => { return i.trim(); }).filter(i => i); if (options.length === 0) { obj.options = obj.options[0].trim().split(/\(?[A-Z\.?]\)?/).splice(1).map(i => { return i.trim(); }).filter(i => i); } else { obj.options = options; } if (obj.type === 3) { obj.options = [ "正确", "错误" ]; } } }); WorkerJSPlus({ name: "云上河开", match: location.host === "jx.open.ha.cn" && location.pathname.includes("/jxpt-web/student/homework/showHomeworkByStatus"), intv: () => { return $("#shiti-content").length; }, root: ".insert", elements: { question: ".window-title", options: "ul li div:last-child", $options: "ul li .numberCover" }, ignore_click: $item => { return $item.parent().hasClass("answer-title"); }, wrap: obj => { obj.type = getQuestionType(obj.$item.parents(".layui-colla-item").find(".titleType").text()); } }); WorkerJSPlus({ name: "ycjy.lut.edu.cn", match: location.host === "ycjy.lut.edu.cn" && location.pathname.includes("/learnspace/course/test/coursewareTest_intoTestPage.action"), intv: () => { return $(".bank_cont").length; }, root: ".test_item", elements: { options: "label", $options: "label input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().find(".test_item_type").text()); obj.question = obj.$item.find(".test_item_tit").contents()[0].nodeValue.trim(); } }); WorkerJSPlus({ name: "exam.euibe.com", match: location.host === "exam.euibe.com" && location.pathname.includes("/KaoShi/ShiTiYe.aspx"), intv: () => { return $(".question_list").length; }, root: ".question", elements: { question: ".wenti .stem", options: "label span", $options: "label input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { obj.type = getQuestionType(obj.$item.parents(".question_list").find(".question_head").text()); }, finished: need_jump => { if ($(".paginationjs-next").hasClass("disabled")) { return false; } $(".paginationjs-next").click(); return true; } }); WorkerJSPlus({ name: "学晖教育", match: location.host === "xhjy.ldzxjy.com" && location.pathname.includes("tikuUserBatch/keepTopic"), intv: () => { return $(".radio").length; }, root: ".radio", elements: { question: ".issueTitle", options: "ul li span", $options: "ul li", type: ".issueTypes" }, ignore_click: $item => { return $item.prop("checked"); }, finished: need_jump => { if ($(".next").text().includes("交卷")) { return false; } $(".next").click(); return true; } }); WorkerJSPlus({ name: "东财在线", match: location.host === "classroom.edufe.com.cn" && (location.pathname.includes("/PracticePaper") || location.pathname.includes("/HomeWorkPaper")), intv: () => { return $(".TK-main").length; }, root: ".CBTPaperMain-trunk", elements: { question: ".CBTPaperMain-divInline", options: "ul li label", $options: "ul li label" }, ignore_click: $item => { return $item.hasClass("_CheckBox_checked"); } }); WorkerJSPlus({ name: "北华大学在线教育", match: () => { const pathnameArr = [ "cj1026-kfkc.webtrn.cn", "beihua.peishenjy.com" ]; return pathnameArr.includes(location.pathname) && location.pathname.includes("/Learning/CourseOnlineExamination") || location.pathname.includes("/learnspace/course/test"); }, intv: () => { return $(".s_mi").length; }, root: ".test_item", elements: { question: ".test_item_tit", options: " label", $options: "label input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { console.log(obj); } }); WorkerJSPlus({ name: "上海立达学院", match: location.host === "kkzxsx.lidapoly.edu.cn" && location.pathname.includes("/exam/"), intv: () => { return $(".exam-question").length; }, root: ".main .item", elements: { question: ".text", options: ".options label .el-radio__label,.el-checkbox__label", $options: ".options label" }, ignore_click: $item => { return $item.hasClass("is-checked"); }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().find(".text").text()); console.log(obj); } }); WorkerJSPlus({ name: "石家庄科技继续教育", match: location.host.includes("kc.jxjypt.cn") && location.pathname.includes("/paper/start"), intv: () => { return $(".sub-content").length; }, root: ".sub-content", elements: { question: ".sub-dotitle", options: ".sub-answer dd", $options: ".sub-answer dd,.mater-respond textarea", type: ".sub-dotitle i" }, ignore_click: $item => { return $item.hasClass("cho-this"); }, wrap: obj => { console.log(obj); }, fill: (type, answer, $option) => { if (type === 4) { $option.val(answer); } } }); WorkerJSPlus({ name: "石家庄理工职业学院", match: location.host.includes("edu.tianzerencai.com") && location.pathname.includes("/examinationDetail"), intv: () => { return $(".topic").length; }, root: ".topic", elements: { question: ".title", options: ".main", $options: ".main", type: ".title" }, ignore_click: $item => { return $item.hasClass("cho-this"); }, wrap: obj => { if (obj.type === 3) { obj.options = [ "正确", "错误" ]; obj.$options = obj.$item.find(".judge button"); } else if (obj.type === 1) { obj.options = obj.$item.find(".checkbox .option_text").map((i, y) => { return $(y).text(); }).toArray(); obj.$options = obj.$item.find(".checkbox button"); } else if (obj.type === 0) { obj.options = obj.$item.find(".radio .option_text").map((i, y) => { return $(y).text(); }).toArray(); obj.$options = obj.$item.find(".radio button"); } console.log(obj); } }); WorkerJSPlus({ name: "国开军盾", match: location.host.includes("s.jundunxueyuan.com") && location.hash.includes("#/exam/"), intv: () => { return $(".the-paper .section-item-question-item").length; }, root: ".section-item-question-item", elements: { plat: 43, question: ".question-tit", options: ".el-radio-group label,.el-checkbox-group label", $options: ".el-radio-group input,.el-checkbox-group input", type: ".sub-dotitle i" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { obj.type = getQuestionType(obj.$item.parents(".section-item").find(".section-item-tit").text()); console.log(obj); } }); WorkerJSPlus({ name: "博学bx", match: location.host.includes("bx.bossyun.com") && location.pathname.includes("/bx/study/examine"), intv: () => { return $(".question-list").length; }, root: ".question-list", elements: { question: ".title", options: ".ant-radio-group label,.ant-checkbox-group label", $options: ".ant-radio-group input,.ant-checkbox-group input", type: ".tag" }, ignore_click: $item => { return $item.prop("checked"); } }); WorkerJSPlus({ name: "博学bx", match: location.host.includes("bx.bossyun.com") && location.pathname.includes("/bx/study/examine"), intv: () => { return $(".question-list").length; }, root: ".question-list", elements: { question: ".title", options: ".ant-radio-group label,.ant-checkbox-group label", $options: ".ant-radio-group input,.ant-checkbox-group input", type: ".tag" }, ignore_click: $item => { return $item.prop("checked"); } }); WorkerJSPlus({ name: "电中在线", match: location.host.includes("old-zzx.ouchn.edu.cn") && location.pathname.includes("/edu/public/student/"), intv: () => { return $(".subject").length; }, root: ".subject", elements: { question: ".question", options: ".answer .option-name", $options: ".answer" }, wrap: obj => { obj.type = 0; console.log(obj); } }); WorkerJSPlus({ name: "爱学", match: () => { const pathMatch = location.pathname.includes("/Web/Test/doing"); const matchHostArr = [ "ai.ztbu.edu.cn", "www.51ixuejiao.com" ]; return pathMatch && matchHostArr.includes(location.host); }, intv: () => { return $("card-title").length; }, root: ".exam dd", elements: { question: "card-title", options: ".ans_area div", $options: ".ans_area div", type: "info" }, ignore_click: $item => { return $item.attr("selected") === "selected"; }, wrap: obj => { console.log(obj); }, fillFinish: data => { if (data.ans.includes("span") || data.type === 1) { $(".move_btn span:last").click(); } } }); WorkerJSPlus({ name: "人卫智网", match: location.host.includes("exam.ipmph.com") && location.pathname.includes("/front/myschool/index.html"), intv: () => { return $(".body").length; }, root: ".body", elements: { question: ".fch2 font", options: ".selet .el-radio__label", $options: ".selet input" }, wrap: obj => { obj.type = 0; console.log(obj); }, finished: () => { document.querySelector(".next-btn .text-right a:last-child").click(); } }); WorkerJSPlus({ name: "卫生人力资源系统", match: location.host.includes("vgos.zbwsrc.cn") && location.pathname.includes("/TESExamClient/"), intv: () => { return $(".testitem").length; }, root: ".testitem", elements: { question: ".stem", options: ".inputitem li", $options: ".inputitem input" }, wrap: obj => { obj.type = 0; console.log(obj); } }); WorkerJSPlus({ name: "继教在线(考试)", match: location.pathname.includes("/Student/ExamManage/CourseOnlineExamination"), intv: () => { return $(".test_item").length; }, root: ".test_item", elements: { question: ".test_item_tit", options: ".test_item_theme label", $options: ".test_item_theme input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { const $item = obj.$item; obj.type = getQuestionType($item.prevAll(".test_item_type").text()); if (obj.type === 3) { obj.options = [ "正确", "错误" ]; } } }); WorkerJSPlus({ name: "培训系统(考试)", match: location.pathname.includes("ShowItemView"), intv: () => { return $(".choice-interaction").length; }, root: ".choice-interaction", elements: { question: ".select-clickstyle span", options: ".text-simple-choice .text", $options: ".text-simple-choice input", type: ".item-content" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { const $item = obj.$item; obj.type = getQuestionType($item.parent().prevAll(".item-content").text()); console.log(obj); }, finished: () => { window.parent.document.querySelector(".nextBtn").click(); } }); WorkerJSPlus({ name: "国开", match: location.host === "lms.ouchn.cn" && location.pathname.includes("/exam/"), intv: () => { return $(".loading-gif").hasClass("ng-hide") && $(".hd .examinee .submit-label").eq(0).text() === ""; }, root: ".card ol .single_selection,.multiple_selection,.true_or_false,.short_answer", elements: { question: ".summary-title .subject-description", options: ".subject-options li .option-content", $options: ".subject-options label .left", type: ".summary-sub-title span:eq(0)" }, ignore_click: ($item, type) => { return type === 1 && $item.find("input").hasClass("ng-not-empty"); } }); WorkerJSPlus({ name: "广开", match: () => { const pathMatch = location.pathname.includes("/mod/quiz/attempt.php"); const matchHostArr = [ "moodle.syxy.ouchn.cn", "xczxzdbf.moodle.qwbx.ouchn.cn", "elearning.bjou.edu.cn", "whkpc.hnqtyq.cn:5678", "course.ougd.cn", "study.ouchn.cn" ]; return pathMatch && matchHostArr.includes(location.host); }, root: ".que", elements: { question: ".qtext", options: ".answer div label,.flex-fill", $options: ".answer div input:visible" }, wrap: data => { if (data.type === undefined) { try { data.type = 4; data.$item.find(".qtext .accesshide").remove(); data.question = formatString(data.$item.find(".qtext").html()); data.$options = data.$item.find("input[id$=_answer]"); } catch (e) {} } }, ignore_click: $item => { return Boolean($item.parent().find("input").eq(-1).prop("checked")); }, finished: () => { $(".submitbtns .btn-primary").click(); }, fill: (type, answer, $option) => { if (type === 4) { console.log(type, answer, $option); console.log($option.attr("id")); $option.val(answer); } } }); WorkerJSPlus({ name: "保定继续教育", match: location.pathname.includes("/exam/answer.html"), root: ".stem-container", elements: { question: ".stem span", options: ".option div .optStem", $options: ".option div input" }, intv: () => { return $("#question").length; }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().parent().find(".description").text()); } }); WorkerJSPlus({ name: "noNiExam.js", match: location.pathname === "/app-afstudy/self_test.html", root: ".lineClass .b-papp-root", elements: { question: ".b-exam-top .b-exam-tit", options: ".b-exam-box li label", $options: ".b-exam-box li input", type: ".b-exam-top .b-exam-type" }, ignore_click($item) { return $item.prop("checked"); }, wrap(obj) { obj.options = obj.options.map(i => { return i.replace(/[A-Za-z][\:]/, "").replace(/[A-Za-z][\:,\:]/, "").replace(/\;/, "").trim(); }); } }); WorkerJSPlus({ name: "www_pbaqks_com_text", match: location.host === "www.pbaqks.com" && location.pathname.includes("/P_ExamDetail/OnlineStuday"), root: ".main-container .single-box", elements: { question: ".single-main:first", options: ".choose-box label", $options: ".choose-box label", type: ".single-container .font-title", answer: "input:eq(1)" }, ignore_click: $i => { return $i.find("input").is(":checked"); }, wrap: obj => { obj.question = obj.question.replace("标准答案", "").replace(/^\d+\./, "").replace(/\[.+?\]/g, "").trim(); }, fillFinish: () => { if ($(".main-container .single-box").find("input:eq(1)").eq(GLOBAL.index - 1).attr("value").split("").length > 1) { jQuery(".main-container .confirm a:last-child").click(); } } }); WorkerJSPlus({ name: "安徽继续教育", match: location.pathname.includes("/study/html/content/studying/") || (location.pathname === "/study/html/content/tkOnline/" || location.pathname === "/study/html/content/sxsk/" || location.pathname === "/study/html/content/bkExam/"), intv: () => { return ($(".e-save-b").length || $(".e-b-g").length) && $(".totalscore").length === 0; }, root: ".e-q", elements: { question: ".e-q-q .ErichText", options: ".e-a-g li", $options: ".e-a-g li" }, ignore_click: $item => { return $item.attr("class").includes("checked"); }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().prev().find(".e-text").text()); obj.options = obj.options.map(i => { return formatString(i.replaceAll(/^[ab]\)\s+/g, "").replaceAll(/^[a-z]\s+/g, "").replaceAll(/^[a-z]、\s+/g, "").trim()); }); } }); WorkerJSPlus({ name: "大连/九江", match: location.href.includes("/onlineclass/exam/"), intv: () => { return $(".excer_list_view___2Ahg9") || $(".excer_list_view___YOSCa"); }, root: ".single_excer_item___lFMCm,.single_excer_item___2lGB8", elements: { plat: 40, question: ".title_content___1Qagx .title_content_text___27NIL, .title_content___24J6D .title_content_text___8ruL4", options: ".options_content___nXSwG label .option_text___udjiE, .options_content___2YgyG label .option_text___1mfcu", $options: ".options_content___nXSwG label input,.options_content___2YgyG label input", type: ".title_content___1Qagx span:eq(1),.title_content___24J6D span:eq(1)" }, ignore_click: $item => { return $($item).parent().hasClass("ant-checkbox-checked"); }, wrap: obj => { console.log(obj); }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { $option.val(answer); } } }); WorkerJSPlus({ name: "新疆继续教育", hook: () => { function parseXinJiangAgain(questions) { return questions.map(item => { const answer = []; const options = item.answers.map(opt => { if (opt.isAnswer === "0") answer.push(formatString(opt.name)); return formatString(opt.name); }); const type = item.types === "2" ? 3 : parseInt(item.types); return { question: item.name, options: options, answer: answer, type: type }; }); } JSONParseHook(o => { if (o.success && o.data.exam) { const arr = o.data.exam.assessList.map(i => { return i.questionList; }).flat(); GLOBAL.json = parseXinJiangAgain(arr); } }); }, match: location.host === "www.ttcdw.cn" && location.pathname.includes("/p/uExam/goExam/"), root: ".question-item", elements: { question: ".question-item-title span", options: ".question-item-option label .el-checkbox__label,.el-radio__label", $options: ".question-item-option label" }, wrap: obj => { Object.assign(obj, GLOBAL.json[GLOBAL.index - 1]); }, intv: () => { return !$("div").hasClass("entrying-wrap"); }, ignore_click: $item => { return $item.hasClass("is-checked"); }, fill: (type, answer, $option) => { if (type === 4 || type === 2) { $option.val(answer); } } }); WorkerJSPlus({ name: "华侨继续教育", match: location.pathname.includes("/exam/student/exam/resource/paper_card2"), intv: () => { return $(".ui-question-answer-right").length === 0; }, root: ".ui-question-group .ui-question", elements: { question: ".ui-question-title div", options: ".ui-question-options div", $options: ".ui-question-options .ui-question-options-order,.ke-container" }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().find("h2").text()); }, ignore_click: $item => { return $item.parent().hasClass("ui-option-selected"); }, fill: (type, answer) => { if (type === 4 || type === 2 || type === 6) { const x = GLOBAL.index - $(".ui-question-options ").length - 1; KindEditor.instances[x].html(answer); } } }); WorkerJSPlus({ name: "上海开放大学", match: location.pathname.includes("/study/assignment/preview.aspx") || location.pathname.includes("/study/assignment/continuation.aspx"), hook: () => { if (GLOBAL.finish || $("a:contains(已完成批阅)").length === 1) { iframeMsg("tip", { type: "hidden", tip: "本页面已做完,无需自动答题" }); return true; } }, root: ".e-q", elements: { question: ".e-q-q .ErichText", options: ".e-a-g li", $options: ".e-a-g li" }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().parent().parent().find(".e-text").eq(0).text()); obj.options = obj.options.map(i => { return formatString(i.replaceAll(/[a-zA-z]\)\s+/g, "").replaceAll(/^[a-z]\s+/g, "").replaceAll(/^[a-z]、\s+/g, "").trim()); }); }, ignore_click: $item => { return $item.attr("class").includes("checked"); } }); WorkerJSPlus({ name: "浙江考试", match: location.pathname === "/web-qz/moni/exam/exam_toExam.action", root: ".dt_tmcon", elements: { question: "div:eq(0) span:eq(1)", options: "div:eq(1) p", $options: "div:eq(1) p input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { obj.type = getQuestionType(obj.$item.parents().find(".dt_rtitle1").eq(0).text()); obj.options = obj.options.map(i => { return formatString(i.replaceAll(/[a-zA-z]\)\s+/g, "").replaceAll(/^[a-z]\s+/g, "").replaceAll(/^[a-z]、\s+/g, "").trim()); }); if (obj.type === 0) { obj.answer = [ JSON.parse($("#quesSSForm #userAnssStr_0").val()).rightAnswer ]; uploadAnswer([ obj ]); } }, finished: () => { return $(".page li input:eq(2)").attr("disabled") !== "disabled"; }, fillFinish: () => { $(".page li input:eq(2)").click(); } }); WorkerJSPlus({ name: "在浙学考试", match: location.host === "www.zjooc.cn" && (location.pathname.includes("/homework/") || location.pathname.includes("/test/") || location.pathname.includes("/exam/")), hook: () => { function parseZaiZheXue(problems) { return problems.map(item => { if (!item.rightAnswer) return undefined; const subjectType = item.subjectType; let type = -1; const question = formatString(item.subjectName); const answer = []; const options = []; if (subjectType === 1 || subjectType === 2) { type = subjectType - 1; for (let subjectOption of item.subjectOptions) { const opt = formatString(subjectOption.optionContent); options.push(opt); if (item.rightAnswer.includes(subjectOption.optionHead)) { answer.push(opt); } } } else if (subjectType === 3) { type = 3; answer.push(item.rightAnswer === "yes" ? "正确" : "错误"); } else { return undefined; } return { question: question, options: options, type: type, answer: answer }; }).filter(i => i && i.answer.length > 0); } if (!(location.pathname.includes("/homework/do") || location.pathname.includes("/test/do") || location.pathname.includes("/exam/do"))) { JSONParseHook(o => { if (o.data && o.data.paperName && o.data.clazzIds && o.data.paperSubjectList) { const data = parseZaiZheXue(o.data.paperSubjectList); console.log(data); } }); return true; } }, root: ".questiono-item", elements: { question: "h6 .processing_img", options: ".questiono-main label .el-radio__label,.el-checkbox__label", $options: ".questiono-main label" }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().prev().text()); obj.options = obj.options.map(i => { return formatString(i.replaceAll(/[a-zA-z]\)\s+/g, "").replaceAll(/^[a-z]\s+/g, "").replaceAll(/^[a-z]、\s+/g, "").trim()); }); }, ignore_click: $item => { return $item.hasClass("is-checked"); } }); WorkerJSPlus({ name: "在浙学(测验/考试)", match: location.host === "www.zjooc.cn" && location.pathname.includes("/singleQuestion/do/"), intv: () => { return $(".settingsel-dialog").css("display") === "none"; }, root: ".question_content:first", elements: { question: ".question_title", options: ".question_content .radio_content div", $options: ".question_content label" }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().find(".question_title p").eq(0).text()); obj.options = obj.options.map(i => { return formatString(i.replaceAll(/[a-zA-z]\)\s+/g, "").replaceAll(/^[a-z]\s+/g, "").replaceAll(/^[a-z]、\s+/g, "").replace(".", "").trim()); }); }, ignore_click: $item => { return $item.hasClass("is-checked"); }, finished: () => { if ($(".question_btn .el-button:contains(下一题)").hasClass("is-disabled")) return false; $(".el-button:contains(下一题)").click(); return true; } }); WorkerJSPlus({ name: "福建继续教育测验|作业", match: location.pathname === "/Web_Study/Student/Center/MyWorkOnView" || location.pathname === "/Web_Study/Student/Center/MyExamOnView", intv: () => { return $(".samllTopicNav").length; }, root: ".topic-cont", elements: { question: "p", options: ".options li span", $options: ".options li" }, wrap: obj => { obj.options = obj.options.map(i => { return i.replace(/选项[A-Za-z]/, "").trim(); }); obj.type = { 1: 0, 2: 1, 3: 3, 6: 4 }[obj.$item.attr("itemtype")]; if (obj.type === undefined) obj.type = 4; }, ignore_click: $item => { return $item.hasClass("correct"); }, fill: (type, answer, $option) => {} }); WorkerJSPlus({ name: "湖南继续教育", match: () => { const pathMatch = location.pathname.includes("/User/Student/myhomework.aspx") || location.pathname.includes("/examing.aspx"); const matchHostArr = [ "www.jwstudy.cn", "hdjt.wuxuekeji.com", "csjs.ynlhxy.com" ]; return pathMatch && (matchHostArr.includes(location.host) || location.host.includes("ls365.net") || location.host.includes("ls365.com")); }, root: ".exam_question", elements: { question: ".exam_question_title div", options: ".question_select .select_detail", $options: ".question_select li", type: ".exam_question_title div strong" }, ignore_click: $item => { return $item.hasClass("cur"); } }); WorkerJSPlus({ name: "德阳继续教育", match: location.href.includes("/dypx/OnlineExam/Exam.aspx"), root: "#divProblemArea", elements: { question: "#ulProblems li:first", options: "#ulProblems .answer", $options: "#ulProblems .answer input" }, ignore_click: $item => { return $item.prop("checked"); }, wrap: obj => { if ($("#ulProblems .answer input").length < 3 && $("#ulProblems .answer input").eq(0).attr("type") === "radio") { obj.type = 3; obj.options = [ "正确", "错误" ]; } else if ($("#ulProblems .answer input").length > 2 && $("#ulProblems .answer input").eq(0).attr("type") === "radio") { obj.type = 0; } else if ($("#ulProblems .answer input").length > 2 && $("#ulProblems .answer input").eq(0).attr("type") === "checkbox") { obj.type = 1; } }, finished: () => { if ($(".dlg").length) return false; $("#divBtns input:eq(1)").click(); return true; } }); WorkerJSPlus({ name: "淄博继续教育", match: location.pathname.includes("/practice/start"), root: ".header-left .trueorfalse .sub", elements: { question: ".mb10", options: ".options li", $options: ".options li" }, ignore_click: $item => { return $item.hasClass("active"); }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().prev().text()); obj.options = obj.options.map(i => { return formatString(i.replaceAll(/[a-zA-z]\)\s+/g, "").replaceAll(/^[a-z]\s+/g, "").replaceAll(/^[a-z]、\s+/g, "").trim()); }); } }); WorkerJSPlus({ name: "河北继续教育", match: location.pathname.includes("paperid"), intv: () => { return $(".examControl").length; }, root: ".examItem", elements: { question: ".examItemRight .question", options: ".examItemRight ul li span", $options: ".examItemRight ul li" }, ignore_click: $item => { return $item.hasClass("cur"); }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().find(".questTitle b").text()); } }); WorkerJSPlus({ name: "保定继续教育", match: () => { const pathnameArr = [ "/cuggw/rs/olex_exam", "/hebic/rs/olex_exam", "/sjzkjxy/rs/olex_exam", "/hbfsh/rs/olex_exam", "/jxycu/rs/olex_exam", "/jlufe/rs/olex_exam", "/hbun/rs/olex_exam" ]; return pathnameArr.includes(location.pathname); }, intv: () => { return $(".paper_body").length; }, root: ".item_li", elements: { question: ".item_title", options: "ul li label", $options: "ul li input" }, ignore_click($item) { return $item.prop("checked"); }, wrap: obj => { if (obj.$options.length === 2) { obj.type = 3; } else if (obj.$options.length > 2 && obj.$options.eq(0).attr("type") === "radio") { obj.type = 0; } else if (obj.$options.length > 2 && obj.$options.eq(0).attr("type") !== "radio") { obj.type = 1; } else { obj.type = 4; } } }); WorkerJSPlus({ name: "唐山继续教育", match: location.pathname.includes("/exam/student/exam/"), intv: () => { return $(".ui-question-group").length; }, root: ".ui-question-group .ui-question", elements: { question: ".ui-question-title .ui-question-content-wrapper", options: ".ui-question-options .ui-question-content-wrapper", $options: ".ui-question-options .ui-question-options-order" }, wrap: obj => { obj.type = getQuestionType(obj.$item.parent().find("h2").text()); } }); WorkerJSPlus({ name: "zzcjxy.hnzkw.org.cn", match: location.host.includes("hnzkw.org.cn"), intv: () => { return $(".answer").length; }, hook: () => { JSONParseHook(o => { if (o.data && o.data.bookdatas) { GLOBAL.json = parsehnzkwText(o.data.bookdatas); } }); }, root: ".examList", elements: { question: ".text", options: ".el-radio-group label,.el-checkbox-group label", $options: ".el-radio-group input,.el-checkbox-group input", type: ".status" }, wrap: obj => { Object.assign(obj, GLOBAL.json[GLOBAL.index - 1]); }, fill: (type, answer, $option) => {} }); WorkerJSPlus({ name: "问卷星考试", match: location.pathname.includes("/exam/ExamRd/Answer"), root: ".g-mn", elements: { question: ".m-question .tigan", options: ".question-block .xuanxiang", $options: ".question-block .xuanxiang", type: ".tixing" }, ignore_click: ($item, type) => { if (type === 1) { return $item.parent().find(".icheckbox_square-green").hasClass("checked"); } else { const isIgnore = $item.parent().find(".iradio_square-green").hasClass("checked"); return isIgnore; } }, wrap: obj => { if ($(".layui-layer-content").length) { iframeMsg("tip", { type: "stop", tip: "答题暂停,请自行通过验证" }); GLOBAL.stop = true; return true; } }, fillFinish: data => { if (data.style === "warning-row" || $(".g-mn").parent().find(".iradio_square-green").hasClass("checked") || data.type === 1) { $('.u-btn-next:contains("下一题")').click(); } }, finished: () => { return parseInt($(".num-dangqian:last").attr("qindex")) !== $(".num-item").length; } }); })();