diff --git a/rucn_Qianyi.js b/rucn_Qianyi.js new file mode 100644 index 00000000..d2b17ace --- /dev/null +++ b/rucn_Qianyi.js @@ -0,0 +1,320 @@ +/* global api */ +class rucn_Qianyi { + constructor(options) { + this.options = options; + this.maxexample = 2; + this.word = ''; + } + + async displayName() { + let locale = await api.locale(); + if (locale.indexOf('CN') != -1) return '千亿词霸俄汉词典'; + if (locale.indexOf('TW') != -1) return '千亿词霸俄汉词典'; + return 'Qianyi RU->CN Dictionary'; + } + + setOptions(options) { + this.options = options; + this.maxexample = options.maxexample; + } + + async findTerm(word) { + this.word = word; + return await this.findQianyi(word); + } + + async findQianyi(word) { + let notes = []; + if (!word) return notes; + + function T(node) { + if (!node) return ''; + return node.innerText ? node.innerText.trim() : ''; + } + + let base = 'https://w.qianyix.com/index.php?q='; + let url = base + encodeURIComponent(word); + let doc = ''; + try { + let data = await api.fetch(url); + let parser = new DOMParser(); + doc = parser.parseFromString(data, 'text/html'); + } catch (err) { + return []; + } + + // ===== 原型词提示(只显示一次)===== + let rootHintHtml = ''; + let hintEl = doc.querySelector('.result-tip'); + if (hintEl) { + rootHintHtml = '
' + hintEl.innerHTML + '
'; + } + + let entries = doc.querySelectorAll('.baseword .view') || []; + for (const entry of entries) { + let definition = ''; + let expression = ''; + let audios = []; + + let keywordEl = entry.querySelector('.keyword'); + if (!keywordEl || !keywordEl.dataset.guid) continue; + + expression = T(keywordEl); + + // 音频 + let audio = entry.querySelector('.speaker'); + if (audio && audio.dataset.url) { + audios[0] = audio.dataset.url; + } + + // 从父面板 ID 取序号(base0 → 0, base1 → 1 ...) + let parentId = entry.parentNode.id || ''; + let seq = parentId.replace('base', ''); + + // ---- 1. 原型词提示 ---- + if (rootHintHtml) { + definition += rootHintHtml; + rootHintHtml = ''; // 只显示一次 + } + + // ---- 2. 基本释义 ---- + let expEl = entry.querySelector('.exp'); + if (expEl) { + definition += '
📖 基本释义
'; + definition += ''; + } + + // ---- 3. 行业释义(包含词性信息如 [阴][中][阳])---- + if (seq !== '') { + let detailPanel = doc.querySelector('#detail' + seq); + if (detailPanel) { + let industryItems = detailPanel.querySelectorAll( + '.subExpContainer .exp-item-sub'); + if (industryItems.length > 0) { + definition += '
🏭 行业释义
'; + definition += ''; + } + } + } + + // ---- 4. 变位变格(名词6格 / 动词变位)★ 核心新增 ★ ---- + if (seq !== '') { + let grmPanel = doc.querySelector('#grm' + seq); + if (grmPanel) { + let grmDiv = grmPanel.querySelector('.grammardiv'); + if (grmDiv) { + // 取出原始 HTML,去掉可能混入的