`;
top.document.getElementsByTagName("body")[0].appendChild(zhihuishuSaveTip);
}
};
function showPanel() {
let html = `
跳过本题
{{!opt.stop ? '暂停答题': '继续答题'}}
更多设置
题库无答案
`;
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);
}
adNode.setAttribute("src", "data:image/jpeg;base64,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");
adNode.setAttribute("draggable", "false");
adNode.setAttribute("style", "display: block;width:321px");
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)));
if (select.elements.type && select.elements.type.includes("input[name^=type]:eq")) {
select.elements.type = "input[name^=type]:eq(" + GLOBAL.i + ")";
}
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) {
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: location.host + "发生异常" + e + "请反馈至官网" + OFFICIAL_WEBSITE
});
}
}
};
};
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);
}
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(/
/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.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(/
/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.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"),
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;
}
});
})();