diff --git a/src/dict/cncn_Zdic.js b/src/dict/cncn_Zdic.js index 90248b47..73556849 100644 --- a/src/dict/cncn_Zdic.js +++ b/src/dict/cncn_Zdic.js @@ -13,49 +13,87 @@ class cncn_Zdic { return 'Zdic Chinese Dictionary'; } - setOptions(options) { this.options = options; - this.maxexample = options.maxexample; + this.maxexample = Number(options.maxexample); } async findTerm(word) { this.word = word; - //let deflection = api.deinflect(word); - let results = await this.findZdic(word); - return results; + return await this.findZdic(word); } - removeTags(elem, name) { - let tags = elem.querySelectorAll(name); - tags.forEach(x => { - x.outerHTML = ''; - }); + T(node) { + return node ? node.innerText.trim() : ''; } async findZdic(word) { - let notes = []; - if (!word) return notes; // return empty notes + if (!word) return []; - let doc = ''; + let doc; try { let url = `https://www.zdic.net/hans/${encodeURIComponent(word)}`; let data = await api.fetch(url); - let parser = new DOMParser(); - doc = parser.parseFromString(data, 'text/html'); + if (!data) return []; + doc = new DOMParser().parseFromString(data, 'text/html'); } catch (err) { return []; } - let jbjs = doc.querySelector('.jbjs') || ''; // basic explaination - //let xxjsContent = doc.querySelector('.res_c_center') || ''; - if (jbjs) { - this.removeTags(jbjs,'.zib-title'); - this.removeTags(jbjs,'.h2_entry'); - this.removeTags(jbjs,'.am-default.contentslot'); - return jbjs.innerHTML; - } else { - return []; + // 新版汉典不再有 .jbjs 容器,改为抓 .jbjs-reading(读音)和 .jbjs-item(义项) + let reading = this.T(doc.querySelector('.jbjs-reading__char')) || word; + let py = this.T(doc.querySelector('.jbjs-reading__py')); + let zy = this.T(doc.querySelector('.jbjs-reading__zy')); + reading = py ? `${reading} ${py}` : reading; + reading = zy ? `${reading} ${zy}` : reading; + + let definitions = []; + for (const item of doc.querySelectorAll('.jbjs-item')) { + let def = this.T(item.querySelector('.jbjs-item__def')); + if (!def) continue; + + let html = `${def}`; + + let egs = item.querySelectorAll('.jbjs-item__eg'); + if (egs.length && this.maxexample > 0) { + html += '