下面给出对“dictionary.js”整份脚本的系统化、细粒度讲解

下面给出对“dictionary.js”整份脚本的系统化、细粒度讲解。由于代码体量极大(上万行级别),真正逐行到每一处分号都会超过消息限制与阅读阈值。为兼顾“逐行/逐段详解”的深度与可读性,我采用“模块→函数→关键行”的方式,从上到下覆盖所有功能面与技术细节,并在关键片段提供贴近逐行的解释与注释。你可以在任何小节后对我说“继续展开 XX 函数/模块”,我会补发更细粒度的逐行注释。

— 说明:本文默认运行环境为 JSBox(iOS),涉及 Objective‑C 桥接(objc)、系统UIobjc)、系统 UI(ui)、缓存(cache)、音频(cache)、音频(audio / AVSpeechSynthesizer)、网络(http)与小组件(http)与小组件(widget)等 JSBox 专用 API;并使用私有框架 DictionaryUI,这属于 iOS 私有 API,非 App Store 上架场景请谨慎。

目录(快速导航)

  • 一、总体概览与运行环境
  • 二、启动与基础配置
  • 三、常量、全局与工具集
  • 四、收藏夹/历史/标签/熟悉度数据层
  • 五、AI 历史/导入导出/合并去重
  • 六、词典查询与模糊匹配(系统词典 + UITextChecker)
  • 七、结果展示页与“更多”菜单(收藏/标签/复制/网页/AI)
  • 八、AI 模块(解释/故事/每日一句/文章学习/生成词表)
  • 九、Markdown 渲染到 HTML(自实现转换器)
  • 十、TTS 与有道发音回退策略
  • 十一、练习与学习(拼写→选择、闪卡、自动学习、随机练习)
  • 十二、收藏夹视图/筛选/排序/卡片模式
  • 十三、历史记录整合页(含 AI 与文章学习)
  • 十四、每日一词与小组件缓存策略
  • 十五、每日一句(远端 JSON 缓存)与 AI 解读
  • 十六、设置页(完整状态持久化)与主题切换
  • 十七、文章学习模式(翻译/分析/词汇 三页签)与 iCloud 导入
  • 十八、唐诗功能(XML 解析+缓存)与首页展示
  • 十九、关键技术亮点汇总
  • 二十、潜在风险与改进建议

一、总体概览与运行环境

  • 核心定位:这是一个“系统词典增强器 + 学习工具箱”,整合系统内置词典查询、收藏/分组/标签、AI 解释与故事、自动/随机学习、每日一词/每日一句、文章学习模式、TTS 发音和小组件展示等功能。
  • 运行环境:JSBox(iOS),大量使用 ui(界面)、ui(界面)、objc(桥接)、http(网络)、http(网络)、cache/clipboard/clipboard/audio 等 API。
  • 私有框架:通过 $objc 加载 DictionaryUI.framework,并使用 DUDictionaryManager 私有类直接调用系统词典底层能力(definitionValuesForTerm 等)。
  • UI 体系:完全用 $ui 描述式布局、list/matrix/web 组合,统一考虑深浅色主题。

二、启动与基础配置(文件开头)

  1. 框架加载
  • objc("NSBundle").objc("NSBundle").bundleWithPath("/System/Library/PrivateFrameworks/DictionaryUI.framework").$load();
    • 加载 iOS 私有框架 DictionaryUI,后续可使用 DUDictionaryManager 访问词典内容。
  • objc("NSBundle").objc("NSBundle").bundleWithPath("/System/Library/Frameworks/AVFoundation.framework").$load();
    • 加载 AVFoundation,用于系统 TTS(AVSpeechSynthesizer)发音。
  1. 多语言配置($app.strings)
  • 内置 en / zh-Hans 字符串键值,如 MAIN_TITLE、SEARCH、NO_RESULTS、MANAGEMENT 等。
  • $l10n 调用时按系统语言自动映射。
  1. 常量与全局(SCHEMA_VERSION、缓存键、历史上限)
  • SCHEMA_VERSION:数据结构版本(迁移时参考)。
  • FAVORITE_LISTS_KEY、HISTORY_WORDS_KEY、SETTINGS_KEY 等:所有本地缓存键统一管理,易维护。
  • COMMON_WORDS_EXCLUDE:常见功能词/停用词集合,用于“从句子里抽词”“剪贴板导入过滤”等,避免选中 a、the、is… 之类无学习意义的词。
  1. 关键 ObjC 与系统对象
  • manager = objc("DUDictionaryManager").objc("DUDictionaryManager").assetManager()
    • 词典查询入口。后续 getWordDefinition 中用 manager.$__definitionValuesForTerm(term)。
  • textChecker = objc("UITextChecker").objc("UITextChecker").new()
    • iOS 拼写检查/联想,用于模糊匹配 buildFuzzyTerms。
  • synthesizer = objc("AVSpeechSynthesizer").objc("AVSpeechSynthesizer").new()
    • 系统 TTS 朗读,用于 createAndSpeakUtterance/speak。
  1. 全局控制变量
  • definitions[]:当前搜索结果对应的原生 definition 对象数组(或特殊标记 "GOOGLE_TRANSLATE")。
  • timer:输入框 debounce。
  • currentSearchText:当前搜索关键字,用于 google 翻译分支。
  • currentFavoriteFilter:收藏夹筛选/排序状态持久化(settings.favoriteFilter)。
  • ROLEPROMPT:AI 解释角色提示,供 getWordExplanationAI 复用。
  1. 默认设置与持久化(defaultSettings / getSettings / saveSettings)
  • 统一收口设置项:语速/音量/音调、pronunciationType(英/美式)、自动学习参数、AI 历史数量、每日单词刷新间隔等。
  • getSettings 会“补齐缺省字段”,保证向后兼容(重要的“无痛升级”写法)。

三、工具集与通用函数(摘选关键)

  • detectDefaultVoice:按地区(GB/UK/IE 使用 en‑GB 否则 en‑US)。
  • trimOneLine:归一空白到单空格后再 trim,适配摘要显示。
  • formatTimestampToMinute:统一时间显示。
  • isDarkMode:代理 $device.isDarkMode。
  • toggleTheme/updateUIColors:主题轮换与控件重绘。
  • isSingleWord:严格正则 + 排除停用词,区分“文章”与“单词”入口。
  • isArticleContent:基于长度/句数/段落/URL/代码特征计分判断“像不像文章”。

四、收藏夹 / 历史 / 标签 / 熟悉度(数据层)

  1. 结构迁移与容错
  • migrateItemDefaults(item)
    • 统一清洗对象字段:word/definition/source/timestamp/mastered/tags/schemaVersion。
    • 防御“definition 变成 [object Object]”的历史错误,回退“暂无释义”。
  1. 收藏夹多列表(默认收藏夹 + 自定义)
  • getFavoriteLists / set / active_list / lists:支持多收藏夹、重命名、移动、导入/导出,兼容老版本 favorite_words_v2。
  • setActiveListName:切换当前活跃收藏夹,UI 顶部标题也联动。
  1. 字词项操作
  • isWordFavorited、saveFavoriteWord、removeFavoriteWord、updateWordMasteryStatus。
  • 标签:addTagToWord(word, tag) 用 Set 去重后回写。
  • 熟悉度:updateWordFamiliarity / getWordFamiliarity
    • 用标签实现 5 级熟悉度(不认识/认识/一般/熟悉/非常熟悉),方便与其他标签共存。
  1. 历史记录
  • addToHistory:当前词典详情页打开即记历史;限制最大长度(500)。

五、AI 历史 / 导入导出 / 合并去重

  1. 三类 AI 历史
  • AI_EXPLANATION_HISTORY_KEY、AI_STORY_HISTORY_KEY、AI_DAILY_SENTENCE_HISTORY_KEY。
  • getXXXHistory / saveXXXHistory / addXXXToHistory:统一“去重 + 头部插入 + 截断上限”。
  1. 清空/导入/导出
  • clearAIHistory(type):按类型或全部清除。
  • 三种导入 _importAIExplanationHistory/_importAIStoryHistory/_importAIDailySentenceHistory:
    • 支持两种文件结构:直接数组或 { data: [...] };验证必需字段,Map 去重合并。
  • 综合导入 _importComprehensiveHistory:
    • 处理 data.aiExplanation / aiStory / aiDailySentence / articleLearning。
  • 学习历史 _importLearningHistory:按 content+date 键去重。

技术要点

  • 去重键的设计(word+explanation 等)可有效避免重复导入。
  • 所有导入均容错提示,失败亦不破坏现有数据。

六、词典查询与模糊匹配

  1. getWordDefinition(word)
  • 通过 manager.$__definitionValuesForTerm(term) 获取 definition 值对象数组。
  • 取第 1 条,读出 elements = def.$definitionElements().rawValue()
    • DCSTextElementKeySenses(数组)→ 拼接前三义项(短释)
    • DCSTextElementKeyPartOfSpeech(词性)
  • 失败时回退 “暂无释义”,捕获异常保证稳定。
  1. buildFuzzyTerms(text)
  • 用 UITextChecker 的 completionsForPartialWordRange / guessesForWordRange 组合“联想 + 猜测”,每种语言尝试,合并去重,限制数目(maxFuzzyTotal)。
  • searchText 会把 baseResults + fuzzyTerms 的结果扩并,最多 200 项。
  1. buildListCellFromDefinition(defObj)
  • 从 elements 提取 senses(逗号拼接),和 pos、term 与“词典名”(getDictionaryName + formatDictionaryName),构造列表显示单元。

技术亮点

  • 私有框架 + UITextChecker 双通道:既能给定词查义,也能从“输入片段”做补全/纠错,用户体验接近系统查词框。

七、结果详情页与“更多”菜单

  1. showDefinition(definition)
  • 特殊分支:definition === "GOOGLE_TRANSLATE" → showGoogleTranslation(currentSearchText)。

  • 常规分支:

    • title = definition.$term().rawValue()
    • body = definition.$longDefinition().rawValue()(原生 HTML)
    • elements = definition.$definitionElements().rawValue(),senses 用于 history 与收藏默认释义。
    • 调用 addToHistory(title, senses, dictionaryName)。
  • 顶部按钮(navButtons)

    • 星标:跨收藏夹添加/移除(如已在任何列表会提示从所在列表移除;如不在任何列表,列出所有列表供选择)。
    • 扬声器:speak(title)(优先有道音频,回退系统 TTS)。
    • 省略号:菜单(添加到其他列表 / 添加标签 / 复制释义为纯文本 / 网页搜索 / AI 用法详解 / AI 故事会(难度可选 simple/intermediate/advanced))。
  • 网页区域(web.html)

    • 内嵌原生词典 HTML(body)前置“在线翻译/词典链接”导航区,叠加 CSS 重着色(兼容深色),并刻意高亮 Headword/Pronunciation/POS/Senses。
    • 这段 CSS 非常长,核心在于“尽量覆盖原生词典 HTML 风格”,使文本在深浅色中依旧可读。
  1. 复制释义“纯文本化”
  • 将长 HTML:去掉 <style>、br→\n、</p>→\n\n、去标签、特定符号格式化(▸、编号、标题),最后 trim;复制 title + 纯文本释义到剪贴板。
  1. showGoogleTranslation(text)
  • 如果 text 含中文:调用 callAI 返回 AI 解读,并通过 markdownToHtml 渲染;否则访问 google 翻译 API(translate.googleapis.com)直出译文,附在线链接(Google/DeepL/百度)备用。
  • 容错:超时/错误时给出打开网页版按钮。

八、AI 模块(解释/故事/每日一句/文章学习/生成词表)
A. callAI(text, prompt, model, endpoint, timeout)

  • 所有 AI 接口的底座:POST JSON 到 apiEndpoint(默认 https://chats.want.biz/ai/explain)。
  • 两种请求体:如果传 prompt 则 { text: prompt, model };否则 { text, model }。
  • 统一检查 HTTP 状态/错误/返回的 explanation 字段;空则抛错。

B. 单词解释 getWordExplanationAI(word)

  • 高质量系统提示:要求用中文 + Markdown,结构化“基础信息/详细用法/例句/辨析/易错点/词形变化”。
  • showAIExplanation(word, explanation)
    • 保存历史、渲染 HTML、顶部按钮:复制、TTS 朗读整段(playYoudaoTTS),查看历史。
    • markdownToHtml 自渲染,附常用在线词典链接(剑桥/韦氏/牛津/柯林斯/朗文等)。

C. 单词故事 getWordStoryAI(word, { level })

  • 根据 simple/intermediate/advanced 生成不同长度/词汇/难度的英文故事,并在故事后要求“中文摘要 + 重点单词详解”段落。
  • showAIStory:不仅显示,还抽取“故事部分纯英文”(优先 split 到“故事大意”之前),仅朗读正文(speakWithTTSOnly),避免朗读中文/标题。

D. 生成词表 generateWordListAI(theme, { count, difficulty })

  • 让 AI 返回“严格单行逗号分隔”的词表;解析为数组;在“AI 主题选择 + 缓存”中被 generateWordListAIWithCache 调用。
  • generateWordListAIWithCache
    • 基于 rich themes 集与 lastUsedMap + recentQueue 做“时间衰减 + 近用惩罚”的加权随机 pickThemeWithDecayWeight。
    • AI/网络失败时:落回缓存;若缓存也无则打标“近期失败”,30 分钟内重试前偏向使用旧缓存。
    • 成功产生 100 词,持久化 DAILY_WORD_LIST_CACHE_KEY,同时更新“主题最近使用记录”。

E. 每日一句 AI 解读

  • updateDailySentenceView 里“脑图按钮(brain)”→ callAI 解释中英句子含义、词汇点,保存到 AI_DAILY_SENTENCE_HISTORY。

F. 文章学习模式(startLearningMode)

  • 并发 Promise.all 调三项:
    • getTranslation:逐句中英对照;
    • getArticleAnalysis:大意/写作手法/结构;
    • getVocabularyAnalysis:5–10 重点词汇详解。
  • showLearningAnalysis:三页签(翻译/分析/词汇),可“中文-only/双语”切换;顶部“历史/复制”;翻译区对原文分段美化;分析/词汇用 markdownToHtml 渲染。

技术亮点

  • 统一 AI 底座 + 多业务拼装,所有错误/超时/空返回路径明确。
  • 主题选择采用“半衰期 + 近用惩罚”的概率模型,避免主题单一。

九、Markdown 渲染(markdownToHtml)

  • 自写轻量解析器,支持:
    • 代码块/行内代码(先占位,后还原,避免后续正则污染)
    • 表格(thead/tbody 结构 + 主题色)
    • 标题/粗体/斜体、链接、图片
    • 有序/无序列表、引用块、分隔线
    • 段落拆分 + <br> 处理
  • 结合 isDarkMode 动态配色。
  • 能够很好渲染 AI 返回的 Markdown 内容。

十、TTS 与发音策略

  • speak(text)
    • 先停止当前朗读(synthesizer.$stopSpeakingAtBoundary(0)),稍延迟后首选“有道发音”(playYoudaoPronunciation);若失败 2 秒回退系统 TTS(createAndSpeakUtterance)。
  • createAndSpeakUtterance
    • 按文本语言选择 zh‑CN 或 en‑US / en‑GB;中文语速略降;读 rate/volume/pitch 设置项。
  • playYoudaoPronunciation / playYoudaoTTS
    • 调用有道 dictvoice 接口(type=1/2),使用 $audio.play;设置 2 秒超时 fallback。
  • speakWithTTSOnly:纯系统 TTS 朗读(用于故事只读正文)。

技术亮点

  • 双通道发音:在线(有道)优先 + 本地 TTS 回退,保证“有声必达”。

十一、练习与学习

  1. 题型切换(showPracticeView)
  • 先出“拼写题”(输入框),正确后自动跳“选择题”(四选一)。
  • generateMaskedChallenge:保留前缀/后缀(un-/‑ing 等),隐藏 30% 位置,提升记忆强度。
  • generateChoices:相似度打分(首字母/长度差/字符交集)选干扰项。
  • 动效:shakeView 错误抖动,正误 toast + taptic。
  1. 闪卡学习(startFlashcardStudy)
  • 单词卡片可点击翻转(正面显示词 + 词性,背面显示释义)。
  • 熟悉度五档按钮(颜色标示),“已掌握/未掌握/跳过”操作。
  1. 自动学习(startAutoStudy / startAutoFlashcardStudy)
  • 定时切换(autoStudyInterval),可暂停/继续;到达末尾弹窗 + 语音播报完成信息。
  • 自动模式支持“朗读释义”选项,先读单词,再延迟读释义。
  1. 表扬语(globalPraise)
  • 随机十句鼓励,小朋友友好;createAndSpeakUtterance 播放。

十二、收藏夹视图 / 筛选 / 排序 / 卡片模式

  • showFavoriteWords

    • 顶部工具:显示释义开关、卡片模式、筛选器、更多菜单(剪贴板导入/搜索/排序/导入/AI 智能导入/导出/清空)、学习入口(自动/手动/随机/自动随机练习)、列表切换(多收藏夹管理)。
    • 列表项:word(已掌握 ✓ 上色)、时间、#标签(最多 3 个)、释义(可按设置显示/隐藏)。
    • 列表 actions:掌握/未掌握切换、标签(勾选/新增)、删除。
    • refreshFavoriteList:按 mastered/tag/q 过滤,sortWordsByCriteria 排序(新→旧/旧→新/字母 A→Z/Z→A)。
  • showCardModeView

    • matrix 两列卡片,点击“翻转”切正反面,临时变色再回归。
    • 数据来源完全遵循当前筛选/排序状态,和列表保持一致。

技术亮点

  • 所有筛选/排序状态持久化(settings.favoriteFilter),跨会话记忆用户习惯。
  • “AI 智能导入”:主题+难度 → 生成词表 → 自动查本地释义 → 一键合并入收藏夹。

十三、历史记录整合页

  • showHistoryWords
    • 顶部导入/导出/清空(一次性清空:词典历史 + 三类 AI + 文章学习)。
    • 主列表:最近查词历史(word/时间/source/短释)。
    • 底部“AI 功能”四按钮:AI 解释历史 / AI 故事历史 / 每日一句历史 / 文章学习历史(均可单独导入/导出/清空)。

十四、每日一词与小组件(Widget)

  • fetchDailyWordWithCache

    • Widget 环境优先“网络获取”→失败用缓存→再失败返回“网络错误”占位。
    • 主 App 环境:按用户设置的刷新间隔(小时)做缓存失效;若无数据回退本地词库循环词。
    • getRandomWordApiList → generateWordListAIWithCache(AI 生成)→ 不足再用本地词库补全 → 额外保底词列表。
    • getWordDefinitionWithSource:从系统词典取第一义;失败显示“无法获取定义,点此进入词典”。
  • 小组件 UI

    • 蓝色单词、绿色词性、黄色释义,来源(AI Generated / Cache / Offline 等)+ 日期,点击可 deeplink 回 JSBox 打开该词。

技术亮点

  • Widget 特殊分支,显式网络优先 + 强健的多级回退,避免小组件“空白/崩溃”。

十五、每日一句(远端 JSON 缓存)与 AI 解读

  • fetchDailySentence(true/false)

  • updateDailySentenceView

    • 背景图铺底 + 半透明遮罩 → 英文/中文/出处 → 英文音频按钮($audio)+ 中文朗读按钮(系统 TTS)+ AI 解读按钮(callAI)+ 刷新按钮(随机换句或强更远端)。
    • 刷新成功后,会自动从句子中抽一个“合适的英文词”填入输入框并触发查询(getRandomWordFromSentence + 排除停用词/长度阈值),引导学习。

十六、设置页与主题切换

  • showSettings

    • 开关:自动学习、显示熟悉度、自动学习时朗读释义、列表显示释义。
    • 数值:自动学习间隔(秒)、发音类型英/美、rate/volume/pitch、debounceMs、AI 历史最大条数、每日单词刷新间隔。
    • 工具:每日一词缓存查看(含批量“查释义预览”)、清除 AI 生成缓存与故障标记。
    • 每项变更立即 saveSettings 并 refresh list 展示 detail。
  • toggleTheme

    • 循环“auto→light→dark”,提示当前模式并 updateUIColors(如魔法棒图标色)。

十七、文章学习模式与 iCloud 导入

  • showArticleInput

    • 大输入框 + “开始分析”按钮 + 四个示例(新闻/文学/AI 生成/从 iCloud 导入 txt/html)。
    • importArticleFromiCloud 支持读文本/HTML(stripHtmlTags 清洗标签),兼容常见网页拷贝。
  • showLearningAnalysis

    • Tab 三页:翻译(原文+译文)、分析、词汇。
    • “中文-only / 双语”一键切换(仅处理译文显示形式),并不重复存历史(isFromModeSwitch 避免重复存)。

十八、唐诗功能(首页顶部诗词)

  • fetchAndCachePoemData
  • updatePoemDisplay
    • 随机一首(getRandomPoem),显示“【标题】作者·体裁\n\n正文(<br />→换行)”。

十九、关键技术亮点汇总

  • 私有框架直连系统词典:DUDictionaryManager + definitionElements,呈现级别接近 Apple 自带词典体验。
  • UITextChecker 模糊补全:带语言偏好(preferredLanguages),实现“动态联想+纠错”。
  • 强健的多级回退与容错:
    • 发音:有道 → 系统 TTS;
    • AI:网络 → 缓存 → 标记失败,30 分钟内偏缓存;
    • 每日数据:网络 → 缓存 → 本地词库保底;
    • 翻译:Google API → 打开网页版。
  • Markdown 渲染器:自实现解析,适配深浅色,支持表格/代码块/列表等,服务于 AI 内容的可读性。
  • 复杂状态持久化:设置项/收藏夹过滤排序/多历史类型/主题权重记录,跨会话记忆。
  • 学习体验设计:
    • 从“拼写”过渡到“选择”,强化回忆;
    • 翻卡学习 + 熟悉度可视化;
    • 自动学习/自动随机练习;
    • 从每日一句“一键抽词”引导学习。
  • 大量 UI/交互细节:
    • 复制纯释义文本的清洗流程;
    • 详情页 CSS 强制覆盖原生字典 HTML;
    • 收藏夹管理(新建/重命名/移动/导出导入/多列表合并去重);
    • 文章学习“中文 only/双语”随时切换且不重复入历史。

二十、潜在风险与改进建议

  • 风险
    • 私有框架 DictionaryUI:仅限个人/企业内测与 JSBox 环境使用,系统升级可能变更内部结构键名(如 DCSTextElementKeySenses)。
    • 第三方 API 可用性:有道 dictvoice、Google 翻译、AI 后端(chats.want.biz),需关注超时与限流。
    • 大量内嵌 HTML/CSS:iOS 版本差异可能导致部分样式不生效,需要兼容性测试。
  • 性能
    • 长列表查义时可考虑缓存 term→shortDef 映射,减少重复 manager 调用。
    • markdownToHtml 的正则链较长,超大文本时可分段处理或采用更高效解析器。
    • 图片/音频等远端资源可加短期缓存($cache)与失败回退。
  • 安全/隐私
    • 剪贴板自动读取:已适时清空 clipboard,仍建议给显式权限提示。
    • 导入/导出:建议校验 JSON 结构并提示敏感信息。
  • 代码结构
    • 当前为“大单文件”,可拆分模块:dataStore(收藏/历史),aiService,ttsService,dictionaryService,views(definition/favorites/settings/history/learning),utils 等。
    • 用 TypeScript/注释 JSDoc 补全类型,减少“definition 变对象”的历史问题复发。
  • 新功能建议
    • 收藏词“发音缓存”(本地化),离线也能播音;
    • 统计学习曲线(完成数/掌握数/复习间隔)+ 间隔重复(SM‑2 简化版);
    • 词根词缀/同义网络联动;
    • iCloud Drive 自动备份与恢复(收藏夹 + 历史)。

关键片段“准逐行”示例(再展开)
你可以告诉我“继续逐行展开某段”,我会针对那一段细化到每条语句:

  • 例 1:getWordDefinition、buildFuzzyTerms 的 objc 调用栈与 elements 结构键含义。
  • 例 2:showDefinition 内 CSS 规则逐条解释(深色适配、Headword/POS/Sense 着色方案)。
  • 例 3:generateWordListAIWithCache 的加权选择算法(半衰期公式与近用惩罚)。
  • 例 4:markdownToHtml 每个正则的匹配对象、顺序为何重要、如何避免交叉污染。
  • 例 5:startAutoStudy 与 startAutoFlashcardStudy 的计时/暂停/按钮状态切换时序。

如果你希望,我可以按你的偏好“逐行从文件第一行往后解释”,将内容分多次消息发完(预计 10,000 字以上)。请告诉我你更关注的部分(如“词典查询链路”或“AI 与缓存策略”),我会先从那部分做彻底的逐行注释。