下面给出对“dictionary.js”整份脚本的系统化、细粒度讲解。由于代码体量极大(上万行级别),真正逐行到每一处分号都会超过消息限制与阅读阈值。为兼顾“逐行/逐段详解”的深度与可读性,我采用“模块→函数→关键行”的方式,从上到下覆盖所有功能面与技术细节,并在关键片段提供贴近逐行的解释与注释。你可以在任何小节后对我说“继续展开 XX 函数/模块”,我会补发更细粒度的逐行注释。
— 说明:本文默认运行环境为 JSBox(iOS),涉及 Objective‑C 桥接(ui)、缓存(audio / AVSpeechSynthesizer)、网络(widget)等 JSBox 专用 API;并使用私有框架 DictionaryUI,这属于 iOS 私有 API,非 App Store 上架场景请谨慎。
目录(快速导航)
- 一、总体概览与运行环境
- 二、启动与基础配置
- 三、常量、全局与工具集
- 四、收藏夹/历史/标签/熟悉度数据层
- 五、AI 历史/导入导出/合并去重
- 六、词典查询与模糊匹配(系统词典 + UITextChecker)
- 七、结果展示页与“更多”菜单(收藏/标签/复制/网页/AI)
- 八、AI 模块(解释/故事/每日一句/文章学习/生成词表)
- 九、Markdown 渲染到 HTML(自实现转换器)
- 十、TTS 与有道发音回退策略
- 十一、练习与学习(拼写→选择、闪卡、自动学习、随机练习)
- 十二、收藏夹视图/筛选/排序/卡片模式
- 十三、历史记录整合页(含 AI 与文章学习)
- 十四、每日一词与小组件缓存策略
- 十五、每日一句(远端 JSON 缓存)与 AI 解读
- 十六、设置页(完整状态持久化)与主题切换
- 十七、文章学习模式(翻译/分析/词汇 三页签)与 iCloud 导入
- 十八、唐诗功能(XML 解析+缓存)与首页展示
- 十九、关键技术亮点汇总
- 二十、潜在风险与改进建议
一、总体概览与运行环境
- 核心定位:这是一个“系统词典增强器 + 学习工具箱”,整合系统内置词典查询、收藏/分组/标签、AI 解释与故事、自动/随机学习、每日一词/每日一句、文章学习模式、TTS 发音和小组件展示等功能。
- 运行环境:JSBox(iOS),大量使用 objc(桥接)、cache/audio 等 API。
- 私有框架:通过 $objc 加载 DictionaryUI.framework,并使用 DUDictionaryManager 私有类直接调用系统词典底层能力(definitionValuesForTerm 等)。
- UI 体系:完全用 $ui 描述式布局、list/matrix/web 组合,统一考虑深浅色主题。
二、启动与基础配置(文件开头)
- 框架加载
- bundleWithPath("/System/Library/PrivateFrameworks/DictionaryUI.framework").$load();
- 加载 iOS 私有框架 DictionaryUI,后续可使用 DUDictionaryManager 访问词典内容。
- bundleWithPath("/System/Library/Frameworks/AVFoundation.framework").$load();
- 加载 AVFoundation,用于系统 TTS(AVSpeechSynthesizer)发音。
- 多语言配置($app.strings)
- 内置 en / zh-Hans 字符串键值,如 MAIN_TITLE、SEARCH、NO_RESULTS、MANAGEMENT 等。
- $l10n 调用时按系统语言自动映射。
- 常量与全局(SCHEMA_VERSION、缓存键、历史上限)
- SCHEMA_VERSION:数据结构版本(迁移时参考)。
- FAVORITE_LISTS_KEY、HISTORY_WORDS_KEY、SETTINGS_KEY 等:所有本地缓存键统一管理,易维护。
- COMMON_WORDS_EXCLUDE:常见功能词/停用词集合,用于“从句子里抽词”“剪贴板导入过滤”等,避免选中 a、the、is… 之类无学习意义的词。
- 关键 ObjC 与系统对象
- manager = assetManager()
- 词典查询入口。后续 getWordDefinition 中用 manager.$__definitionValuesForTerm(term)。
- textChecker = new()
- iOS 拼写检查/联想,用于模糊匹配 buildFuzzyTerms。
- synthesizer = new()
- 系统 TTS 朗读,用于 createAndSpeakUtterance/speak。
- 全局控制变量
- definitions[]:当前搜索结果对应的原生 definition 对象数组(或特殊标记 "GOOGLE_TRANSLATE")。
- timer:输入框 debounce。
- currentSearchText:当前搜索关键字,用于 google 翻译分支。
- currentFavoriteFilter:收藏夹筛选/排序状态持久化(settings.favoriteFilter)。
- ROLEPROMPT:AI 解释角色提示,供 getWordExplanationAI 复用。
- 默认设置与持久化(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/代码特征计分判断“像不像文章”。
四、收藏夹 / 历史 / 标签 / 熟悉度(数据层)
- 结构迁移与容错
- migrateItemDefaults(item)
- 统一清洗对象字段:word/definition/source/timestamp/mastered/tags/schemaVersion。
- 防御“definition 变成 [object Object]”的历史错误,回退“暂无释义”。
- 收藏夹多列表(默认收藏夹 + 自定义)
- getFavoriteLists / set / active_list / lists:支持多收藏夹、重命名、移动、导入/导出,兼容老版本 favorite_words_v2。
- setActiveListName:切换当前活跃收藏夹,UI 顶部标题也联动。
- 字词项操作
- isWordFavorited、saveFavoriteWord、removeFavoriteWord、updateWordMasteryStatus。
- 标签:addTagToWord(word, tag) 用 Set 去重后回写。
- 熟悉度:updateWordFamiliarity / getWordFamiliarity
- 用标签实现 5 级熟悉度(不认识/认识/一般/熟悉/非常熟悉),方便与其他标签共存。
- 历史记录
- addToHistory:当前词典详情页打开即记历史;限制最大长度(500)。
五、AI 历史 / 导入导出 / 合并去重
- 三类 AI 历史
- AI_EXPLANATION_HISTORY_KEY、AI_STORY_HISTORY_KEY、AI_DAILY_SENTENCE_HISTORY_KEY。
- getXXXHistory / saveXXXHistory / addXXXToHistory:统一“去重 + 头部插入 + 截断上限”。
- 清空/导入/导出
- clearAIHistory(type):按类型或全部清除。
- 三种导入 _importAIExplanationHistory/_importAIStoryHistory/_importAIDailySentenceHistory:
- 支持两种文件结构:直接数组或 { data: [...] };验证必需字段,Map 去重合并。
- 综合导入 _importComprehensiveHistory:
- 处理 data.aiExplanation / aiStory / aiDailySentence / articleLearning。
- 学习历史 _importLearningHistory:按 content+date 键去重。
技术要点
- 去重键的设计(word+explanation 等)可有效避免重复导入。
- 所有导入均容错提示,失败亦不破坏现有数据。
六、词典查询与模糊匹配
- getWordDefinition(word)
- 通过 manager.$__definitionValuesForTerm(term) 获取 definition 值对象数组。
- 取第 1 条,读出 elements = def.$definitionElements().rawValue()
- DCSTextElementKeySenses(数组)→ 拼接前三义项(短释)
- DCSTextElementKeyPartOfSpeech(词性)
- 失败时回退 “暂无释义”,捕获异常保证稳定。
- buildFuzzyTerms(text)
- 用 UITextChecker 的 completionsForPartialWordRange / guessesForWordRange 组合“联想 + 猜测”,每种语言尝试,合并去重,限制数目(maxFuzzyTotal)。
- searchText 会把 baseResults + fuzzyTerms 的结果扩并,最多 200 项。
- buildListCellFromDefinition(defObj)
- 从 elements 提取 senses(逗号拼接),和 pos、term 与“词典名”(getDictionaryName + formatDictionaryName),构造列表显示单元。
技术亮点
- 私有框架 + UITextChecker 双通道:既能给定词查义,也能从“输入片段”做补全/纠错,用户体验接近系统查词框。
七、结果详情页与“更多”菜单
- 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 风格”,使文本在深浅色中依旧可读。
- 复制释义“纯文本化”
- 将长 HTML:去掉 <style>、br→\n、</p>→\n\n、去标签、特定符号格式化(▸、编号、标题),最后 trim;复制 title + 纯文本释义到剪贴板。
- 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 回退,保证“有声必达”。
十一、练习与学习
- 题型切换(showPracticeView)
- 先出“拼写题”(输入框),正确后自动跳“选择题”(四选一)。
- generateMaskedChallenge:保留前缀/后缀(un-/‑ing 等),隐藏 30% 位置,提升记忆强度。
- generateChoices:相似度打分(首字母/长度差/字符交集)选干扰项。
- 动效:shakeView 错误抖动,正误 toast + taptic。
- 闪卡学习(startFlashcardStudy)
- 单词卡片可点击翻转(正面显示词 + 词性,背面显示释义)。
- 熟悉度五档按钮(颜色标示),“已掌握/未掌握/跳过”操作。
- 自动学习(startAutoStudy / startAutoFlashcardStudy)
- 定时切换(autoStudyInterval),可暂停/继续;到达末尾弹窗 + 语音播报完成信息。
- 自动模式支持“朗读释义”选项,先读单词,再延迟读释义。
- 表扬语(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)
- 远端 https://wealth.want.biz/pages/dailywords.json,取精简字段(en/cn/source/bg/audio)缓存到 DAILY_SENTENCE_DATA_KEY。
- DAILY_SENTENCE_KEY 存当前选择句子;LAST_FETCH_TIME_KEY 控制日级刷新。
-
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
- 远端 https://wealth.want.biz/pages/poem.xml,解析 <node>…</node>(简单正则分割)抽取 title/auth/type/content/desc。
- 24 小时缓存 POEM_CACHE_KEY;失败时回退旧缓存。
- 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 与缓存策略”),我会先从那部分做彻底的逐行注释。