资讯动态

MooTool Next 桌面版 DIFF-548 批次解读:翻译引擎离线可测化、历史恢复单测与 Electron CSS 对齐实践

发布时间:2026/10/16 2:44:23 来源:尧图企业网站定制
桌面应用开发工具【免费下载链接】MooToolHandy tool set for developers项目地址https://gitcode.com/gh_mirrors/mo/MooTool点击查看免费下载本文基于 MooTool 仓库中next-composeCompose Multiplatform 桌面版的开发切片文档 DIFF-548 展开。DIFF-548 是 MooTool Next 从 Electron 版本向 Compose 桌面版迁移过程中的一次“可测化 视觉对齐 离线门禁”批次它把 F20 翻译工具的“设置 → 引擎”接线抽成纯函数并配齐离线单测为 F02/F07/F16Diff/Crypto/Cron历史记录补上恢复restore测试用一组 Compose Modifier 复刻 Electron 的 HTTP/翻译/网络 CSS 组件同时扩展命令盘关键词并把 P7 打包烟雾检查约束到 offline gate。读完本文你将掌握该批次的实现骨架、关键常量与超时/降级机制、CSS 对齐思路以及如何在本机离线复跑其全部验证命令。批次背景parity-gap 迁移中的“切片式”收敛MooTool 的 Next 桌面版采用“DIFF 切片”方式逐批收窄与 Electron 版本parity及 Java 版本的差距。DIFF-548 明确声明不重复前一批 DIFF-547 已完成的HttpRequestPresentation/TranslationResponsePresentation呈现层与 HTTP 响应样式而是聚焦以下遗留 parity-gapF02/F07/F16 的历史 restore 单测缺失F20 “设置 → 引擎”接线尚不可测Electron.http-collection/.http-url-bar/.http-timeout/.http-entry-head/.translation-toolbar/.net-port-scan-row等样式未对齐JSON Vault / 网络命令盘关键词未补齐P7 脚本说明不完整。这种“一次切一条文档即验收单”的做法使得每个功能点都有对应的源码、测试与脚本注释可交叉验证。F20 翻译把“设置接线”抽成可单测的纯函数DIFF-548 对翻译工具的核心动作是让TranslationWiringPresentation.buildInput承担从设置面板原始值wire到引擎入参TranslationInput的转换从而把不可测的 UI 状态直接映射为可断言的领域对象。接线函数规范化、解析、clampTranslationWiringPresentation.buildInput的实现位于 TranslationWiringPresentation.ktfun buildInput( requestId: String, text: String, sourceLangWire: String, targetLangWire: String, providerWire: String, timeoutWire: Int, ): TranslationInput { val languages TranslationEngine.normalizeLanguagePair(sourceLangWire, targetLangWire) return TranslationInput( requestId requestId, text text, sourceLang languages.first, targetLang languages.second, preferredProvider TranslationEngine.parseProvider(providerWire), timeoutMs TranslationEngine.clampTimeout(timeoutWire), ) }对应引擎侧的三个纯函数TranslationEngine.kt值得单独说明normalizeLanguagePair(source, target)先把“自动检测”之外的原始值经别名表归一化如English/英语/英語→en、jp→ja、cht→zh-TW目标语言不允许auto默认回退zh-CN若源语言与目标语言相同则源语言改写为auto避免“同语言对”空翻译。TranslationWiringPresentationTest.languagePairFromSettingsNormalizesSameLang正好验证了en→en归一化为auto→en。parseProvider(value)bing忽略大小写之外的字符串一律视为Google因此设置面板只要落盘字符串google/bing即可驱动引擎。clampTimeout(value)value.coerceIn(1_000, 120_000)把用户输入的超时毫秒数钳制在 1 秒2 分钟。测试wiresGoogleProviderAndClampsTimeout传入999_999断言结果为120_000传入500断言结果为1_000。动作可用性与 UI 按钮一一对应的纯函数同一文件还提供了一批*ActionEnabled判定函数全部是无副作用纯函数供 Screen 层直接复用也保证了“立即翻译 / 复制译文 / 存单词 / 清历史 / 单词本重译”等按钮的可用性逻辑可测试函数规则对齐的 UIcanRunTranslate(text, translating)非空、length MAX_TEXT_UNITS、无在途请求立即翻译钮copyResultActionEnabled(target)target.isNotEmpty()复制译文saveWordFromSourceActionEnabled(source)source.isNotBlank()保存单词retranslateWordActionEnabled(hasSelectedWord, sourceText)已选中且原文非空单词本重译clearHistoryActionEnabled(historyCount)historyCount 0清空历史runSaveWord(block)用runCatching包装为Success/Failure存取单词异常包装文档中“Screen 发送/单词本重译改用 domain”正是这些函数的落地UI 不再内联判断而是调用TranslationWiringPresentation.*。本机 HttpServer mockBing 首选不触 GoogleGoogle 接线验证sl/tl/clientgtxDIFF-548 为翻译接线引入了完全离线、无外网依赖的单测 TranslationEngineTest.kt。它用 JDK 自带的com.sun.net.httpserver.HttpServer在127.0.0.1上模拟 Google/google、Bing/translator会话页与/ttranslatev3翻译接口再通过TranslationEndpoints覆盖引擎默认端点从而在 CI/离线环境安全断言网络行为。两个关键用例Bing 首选不触 GooglebingPreferredWiringUsesBingWithoutGoogleCall用buildInput(providerWire bing)构造入参Bing 端点正常返回B:wire后断言googleHits 0、bingTranslateHits 1证明“首选 Bing”不会先探测 Google。这与引擎的translationProviderOrder(preferred, skipPreferred)逻辑一致首选成功即返回不发起降级请求。Google 请求参数接线googleWiringSendsMappedSlTlAndClient对sourceLangWire jp、targetLangWire kor断言真实请求参数为slja、tlko、clientgtx——即旧语言码先经googleLanguage映射再拼入查询串client固定为gtx。同一测试还覆盖了长文本按GOOGLE_CHUNK_SIZE1800切块含 emoji 代理对边界不撕裂、并发 3、Google 失败后自动降级 Bing、供应商 10 分钟冷却providerCooldownMs测试中可注入时钟、MAX_TEXT_UNITS 1超长文本返回INVALID_REQUEST、超时返回TIMEOUT、cancel()返回ABORTED。引擎相关常量如下常量值作用MAX_TEXT_UNITS50_000单次翻译文本上限超限直接INVALID_REQUESTGOOGLE_CHUNK_SIZE1_800Google 长文本切块长度GOOGLE_CHUNK_CONCURRENCY3分块翻译并发线程数HISTORY_LIMIT500翻译历史条数上限clampTimeout1_000..120_000超时钳制范围providerCooldownMs10 分钟供应商失败后的冷却窗口配套的 TranslationWiringPresentationTest.kt 则专门验证接线函数本身语言对归一化、provider 解析、超时钳制、动作可用性与失败消息优先级与引擎测试形成“接线层 引擎层”两级覆盖。F02/F07/F16 历史restore 单测把“回放语义”钉死历史功能Electron 侧保存每次工具的 input/output 与 options在 Compose 版需要一个统一的“从HistoryRecord回放会话状态”的过程。DIFF-548 新增三个 restore 单测分别锁定三类工具的恢复语义。DiffF02左右内容 元数据回放DiffHistoryRestore.applyDiffHistoryRestore.kt从HistoryRecord恢复left/right并用DiffHistoryMetadata.decode恢复ignoreWhitespace与highlightMode。测试 DiffHistoryRestoreTest.kt 先给会话设置一个旧高亮模式再通过编码了ignoreWhitespacetrue, highlightModeline的 options 恢复最终断言三个字段全部按历史回放且元数据覆盖会话初值。CryptoF07Tab/算法/明文密文方向的恢复CryptoHistoryRestore.kt 是恢复逻辑最“有方向感”的一个它根据 options 中的tabsymmetric/asymmetric/digest/base/random切分五个分支再按operation决定 input/output 的赋值方向对称operation decrypt时symCipherinput、symPlainoutput否则反向非对称operation含Decrypt忽略大小写时asymCipherinput、asymPlainoutputBaseoperation decode时baseCipherinput、basePlainoutputRandom按uuid/digits/string/password分别落到对应字段算法名通过SymmetricAlgorithm/AsymmetricAlgorithm/DigestAlgorithm/BaseAlgorithm枚举查找恢复。CryptoHistoryRestoreTest用encode(symmetric, encrypt, AES)构造 options断言恢复后tabSymmetric、symAlgorithmAES、symPlain/ symCipher各归其位且error清空。CronF16表达式、运行行、时区与描述联动CronHistoryRestore.applyCronHistoryRestore.kt除恢复expression与按\n拆分 output 得到 runs 外还从 options 解析时区对齐 Electron 的extraData.timeZone并用CronEngine.describe(expression, language)重算中文/英文描述。CronHistoryRestoreTest用0 0 12 * * ?验证了表达式、Asia/Shanghai时区、2 条运行记录与描述同时恢复。CSS 组件批次用 Compose Modifier 复刻 Electron 类名视觉DIFF-548 的样式部分全部收敛在 Controls.kt 的一组Modifier扩展中每个扩展都注明其对齐的 Electron 选择器形成一份“CSS 选择器 → Compose 组件”映射表Compose Modifier对齐的 Electron 选择器实现要点mooHttpCollection.http-collection/.host-profilessurfaceSubtle背景 右侧 1dp 竖分隔线mooHttpCollectionHeader.http-collection header最小高 44dp 底部 1dp 分隔线mooHttpCollectionFooter.http-collection footer最小高 40dp 顶部 1dp 分隔线mooHttpUrlBar.http-url-bartoolbar背景、10dp 水平 / 8dp 垂直内边距、底部分隔线mooHttpTimeoutChip.http-timeout8dp 圆角胶囊、workspace背景、1dp 边框、最小高 34dpmooHttpEntryHead.http-entry-head/.http-cookie-head最小高 35dp、workspace背景、底部分隔线mooTranslationLangBar.translation-toolbar最小高 46dp、toolbar背景、底部分隔线mooNetPortScanRow.net-port-scan-row最小高 35dp 的密集命令行这些 Modifier 的使用点与源码一一对应HTTP 请求工具在 HttpScreen.kt 中以Modifier.mooHttpUrlBar()包方法/URL/超时行、mooHttpTimeoutChip()包超时输入胶囊、mooHttpCollection/Header/Footer包请求集合侧栏mooNetPortScanRow用于网络工具端口扫描输入行。由此可以推断这种“选择器级对齐”策略让两个桌面实现能在截图/人工走查层面逐区块对照。文档也明确把**六套 CSS 逐选择器皮肤明暗主题下的逐选择器样式**列为未做项说明本批次只完成结构/分隔线与行高对齐未覆盖完整主题化。A01 命令盘与 P7关键词扩展与离线门禁说明命令盘关键词命令盘command palette的搜索由commandSearchEntries合并两条通道CommandSearchResults.ktToolRegistry.search命中工具CommandSearchCatalog.search命中设置分类。DIFF-548 为network补充ping/port/scan/dns/traceroute为vault/editor补充jsonpath/search/schema等关键词使键盘用户能直接跳到对应工具或设置页。从源码与测试可以交叉确认这一接线CommandSearchCatalogTest.kt 断言ping、portscan命中network分类jsonpath命中vault或editorToolRegistry.kt 为ToolId.Net登记了network,ip,ping等关键词网络引擎侧NetEngine.kt的NetworkAction枚举包含Interfaces / Connections / Ping / PingRange / PortScan / FlushDns / Resolve / WhoisparsePortSpec支持逗号分隔与start-end范围、空输入默认扫commonPorts含 21/22/80/443/3306/6379/9092/27017 等常用端口表与命令盘关键词相呼应历史侧 NetHistoryMetadata.kt 用actionWireId把动作序列化为ping/port-scan/flush-dns等线格式与恢复逻辑一一对应。P7 打包烟雾检查的 offline gate 范围P7 阶段的本地验证脚本 prepare-p7-package-smoke.sh 在此批次被补充注释明确 DIFF-548 的验收边界属于 offline gateF02/F07/F16 历史 restore 单测、F20 接线单测不属于 offline gate三平台安装/公证必须由各平台手工验收。脚本本身以 JDK 21 为前提JAVA_HOME校验依次执行./gradlew :composeApp:printTooling --offline、:composeApp:verifyNativePackageMetadata --offline、:composeApp:desktopTest --offline仅当设置MOOTOOL_P7_BUILD_DIST1时才追加当前 OS 的packageDistributionForCurrentOS --offline公网 smokeMOOTOOL_HTTP_PUBLIC_SMOKE1明确不属于默认离线门禁。验证方式一行命令复跑全批次DIFF-548 的验证命令就是整个 offline gate 的核心./gradlew :composeApp:desktopTest --offline # 要求 JDK 21该命令在本机离线环境运行全部桌面测试覆盖以下测试类均位于next-compose/composeApp/src/desktopTest/kotlin/com/rememberber/mootool/next/compose/domain/TranslationWiringPresentationTest.kt接线函数与动作可用性domain/TranslationEngineTest.kt本地 HttpServer mock 下的 Google/Bing 行为、切块、降级、冷却、取消与超时domain/DiffHistoryRestoreTest.kt、domain/CryptoHistoryRestoreTest.kt、domain/CronHistoryRestoreTest.kt三类工具的历史回放app/CommandSearchCatalogTest.kt命令盘关键词到设置分类的映射并有一个“每个设置导航分类都必须有命令搜索覆盖”的完整性测试。更完整的打包前检查可运行scripts/prepare-p7-package-smoke.sh它会顺带校验工具链并给出 P7 状态提示。未做清单与批次边界DIFF-548 明确列出仍未完成的事项避免被误读为全量交付六套 CSS 的逐选择器明暗皮肤尚未完成本批次只做结构、行高与分隔线真实 Google/Bing/公网的大规模走查未做离线单测不替代线上验证产品主窗 Vault/IME PNG 证据未生成P7 三平台安装/公证未验收Win/Linux 安装包需在对应平台构建。这些边界既是对后续批次的输入也是本文所述实现范围的准确刻度DIFF-548 交付的是“离线可测的接线 可回放的历史 可对照的 CSS 组件”而把真实网络与三平台交付留给人工验证环节。赞分享桌面应用开发工具【免费下载链接】MooToolHandy tool set for developers项目地址https://gitcode.com/gh_mirrors/mo/MooTool点击查看免费下载相关推荐MooTool DIFF-300JSON 历史恢复与查找替换 copy 反馈对齐 Electron 的实践指南MooTool DIFF 300JSON 历史恢复与查找替换 copy 反馈对齐 Electron 的实践指南 导读 本文聚焦 MooTool Compose桌面应用开发工具MooTool NextCompose 桌面版AI MCP 用户篡改冲突检测对齐 Electron vitest 的回归测试实现解析MooTool NextCompose 桌面版AI MCP 用户篡改冲突检测对齐 Electron vitest 的回归测试实现解析 导读 本文聚焦 Mo桌面应用开发工具MooTool Next ComposeVault Git 面板 P5 布局与 flush 语义对齐实践DIFF-110MooTool Next ComposeVault Git 面板 P5 布局与 flush 语义对齐实践DIFF 110 本文基于 MooTool Nex桌面应用开发工具上一篇5分钟快速上手网易云QQ音乐歌词一键获取全攻略下一篇从DX11到DX12EveryRay渲染引擎的多API支持架构分析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑