feat: 发布4×4候选与Android手表应用内键盘组件

这个提交包含在:
sydxky 于 2026-11-14 13:55:53 +08:00 提交
1 父节点 82aeeba816
当前提交 87aa966a51
86 个文件已更改
+2697 -2975

没有与搜索条件相匹配的文件

@@ -2,7 +2,7 @@ import fs from 'node:fs'
import path from 'node:path'
import assert from 'node:assert/strict'
import {fileURLToPath} from 'node:url'
import {createDictionary,digitsOf,code14Of,KEY14_GROUPS,display14,edit,erase,preview,learn,sanitizePreferences,chars} from '../src/common/ime-engine.js'
import {createDictionary,digitsOf,code14Of,KEY14_GROUPS,display14,candidatePages,edit,erase,preview,learn,sanitizePreferences,chars} from '../src/common/ime-engine.js'
const root=path.resolve(path.dirname(fileURLToPath(import.meta.url)),'../src')
let count=0
function check(ok,label){assert.ok(ok,label);count++}
@@ -34,6 +34,13 @@ check((await dictionary.lookup(pairInput,'14',{[pairInput]:[{word:pairLast.word,
check((await dictionary.lookup('hello!','14',{})).length===0,'14-key rejects invalid token stream')
check(display14('c3754')==='BN UI GH AS OP'&&display14('c3754'.repeat(6)).length<24,'14-key preview displays bounded paired-letter groups')
const many=await dictionary.lookup('shi',false,{})
const grid=candidatePages(many),flatten=pages=>pages.flatMap(rows=>rows.flatMap(row=>row.items.map(entry=>entry.item)))
check(grid[0].length===4&&flatten([grid[0]]).length===16,'single characters form a four by four page')
check(flatten(grid).every((item,index)=>item===many[index]),'grid retains all candidates in their exact original order')
const phrases=[{word:'你好'},{word:'完整词组'},{word:'很长的词组必须能够完整显示而不能被截断'},{word:'😀'}]
const phraseGrid=candidatePages(phrases)
check(flatten(phraseGrid).length===phrases.length&&phraseGrid[0][0].items.length===2,'phrases use wider cells without dropping results')
check(phraseGrid.every(rows=>rows.reduce((sum,row)=>sum+row.units,0)<=4),'long phrases use row units within the page budget')
const original=JSON.parse(fs.readFileSync(root+'/assets/ime-dict/s'+digitsOf('shi')+'.json','utf8')).entries.shi
check(original.every(word=>many.some(x=>x.word===word&&x.consume===3)),'every original shi candidate remains accessible')
check(dictionary.cacheSize<=4,'bounded shard cache')