From 2b2e83bdbe1214abf1808451e22e1e7a28852461 Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Sun, 13 Sep 2026 19:23:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E4=BC=98=E5=8C=96=E6=80=A7=E8=83=BD):=20?= =?UTF-8?q?=E5=87=8F=E5=B0=91=E6=90=9C=E7=B4=A2=E7=95=8C=E9=9D=A2=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E5=88=B7=E6=96=B0=EF=BC=8C=E6=8F=90=E5=8D=87=E5=AD=97?= =?UTF-8?q?=E4=BD=93=E5=8C=B9=E9=85=8D=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/webui/ofdgo.js | 7 +++++-- ofdgo_font_match.go | 47 +++++++++++++++++++++++++++++-------------- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/assets/webui/ofdgo.js b/assets/webui/ofdgo.js index 3321fc7..d5a229f 100644 --- a/assets/webui/ofdgo.js +++ b/assets/webui/ofdgo.js @@ -2074,10 +2074,13 @@ async function searchDocument() { if (seq !== state.searchSeq || openSeq !== state.openSeq) { return; } - for (const match of matches || []) { + el.searchStatus.textContent = `正在搜索 ${page + 1} / ${pageCount} 页`; + if (!matches?.length) { + continue; + } + for (const match of matches) { state.searchMatches.push({ ...match, page }); } - el.searchStatus.textContent = `正在搜索 ${page + 1} / ${pageCount} 页`; renderSearchResults(); } el.searchStatus.textContent = state.searchMatches.length ? "搜索完成" : "暂无结果"; diff --git a/ofdgo_font_match.go b/ofdgo_font_match.go index a97d6b3..85f7c49 100644 --- a/ofdgo_font_match.go +++ b/ofdgo_font_match.go @@ -192,10 +192,11 @@ func fontExactCandidateNames(names ...string) []string { // 返回: []string 保留后缀的候选名称 func fontQualifiedNames(name string) []string { name = fontNormalizeName(name) + key := fontNormalizeName(name) var names []string seen := make(map[string]bool) for _, rule := range fontMatchRules { - if fontRuleMatchLevel(rule, name) != fontMatchPartial { + if fontRuleMatchLevel(rule, key) != fontMatchPartial { continue } prefix := "" @@ -227,10 +228,11 @@ func fontCandidateNamesByLevel(maxLevel int, names ...string) []string { result = appendFontName(result, seen, name) bases = append(bases, name) } + levels := fontMatchLevels(bases) for level := fontMatchExact; level <= maxLevel; level++ { - for _, name := range bases { - for _, rule := range fontMatchRules { - if fontRuleMatchLevel(rule, name) == level { + for i := range bases { + for j, rule := range fontMatchRules { + if levels[i*len(fontMatchRules)+j] == level { result = appendFontName(result, seen, rule.System) for _, item := range rule.Names { result = appendFontName(result, seen, item) @@ -262,13 +264,14 @@ func fontPatternStem(pattern string) string { func fontFilePatterns(names ...string) []string { var result []string seen := make(map[string]bool) + levels := fontMatchLevels(names) for level := fontMatchExact; level <= fontMatchFuzzy; level++ { - for _, name := range fontCandidateNamesAtLevel(level, names...) { + for _, name := range fontCandidateNamesAtLevel(level, names, levels) { result = appendFontPattern(result, seen, name+"*") } - for _, name := range names { - for _, rule := range fontMatchRules { - if fontRuleMatchLevel(rule, name) == level { + for i := range names { + for j, rule := range fontMatchRules { + if levels[i*len(fontMatchRules)+j] == level { for _, item := range rule.Files { result = appendFontPattern(result, seen, item) } @@ -294,12 +297,12 @@ func fontSystemNames(names ...string) []string { } // fontCandidateNamesAtLevel 获取指定等级的字体候选名称 -// 入参: level 匹配等级, names 字体名称列表 +// 入参: level 匹配等级, names 字体名称列表, levels 名称与规则的匹配等级 // 返回: []string 字体候选名称 -func fontCandidateNamesAtLevel(level int, names ...string) []string { +func fontCandidateNamesAtLevel(level int, names []string, levels []int) []string { var result []string seen := make(map[string]bool) - for _, name := range names { + for i, name := range names { name = strings.TrimSpace(name) if name == "" { continue @@ -307,8 +310,8 @@ func fontCandidateNamesAtLevel(level int, names ...string) []string { if level == fontMatchExact { result = appendFontName(result, seen, name) } - for _, rule := range fontMatchRules { - if fontRuleMatchLevel(rule, name) == level { + for j, rule := range fontMatchRules { + if levels[i*len(fontMatchRules)+j] == level { result = appendFontName(result, seen, rule.System) for _, item := range rule.Names { result = appendFontName(result, seen, item) @@ -333,6 +336,7 @@ func fontDefaultSystemNames() []string { // 返回: bool 是否禁用合成粗体 func fontNoSyntheticBold(names ...string) bool { for _, name := range names { + name = fontNormalizeName(name) for _, rule := range fontMatchRules { if !rule.NoSyntheticBold { continue @@ -358,11 +362,24 @@ func isFontFileName(name string) bool { } } +// fontMatchLevels 按名称和规则顺序计算匹配等级 +// 入参: names 字体名称列表 +// 返回: []int 名称与规则的匹配等级 +func fontMatchLevels(names []string) []int { + levels := make([]int, len(names)*len(fontMatchRules)) + for i, name := range names { + name = fontNormalizeName(name) + for j, rule := range fontMatchRules { + levels[i*len(fontMatchRules)+j] = fontRuleMatchLevel(rule, name) + } + } + return levels +} + // fontRuleMatchLevel 获取字体规则匹配等级 -// 入参: rule 字体匹配规则, name 字体名称 +// 入参: rule 字体匹配规则, name 规范化后的字体名称 // 返回: int 匹配等级 func fontRuleMatchLevel(rule fontMatchRule, name string) int { - name = fontNormalizeName(name) if name == "" { return fontMatchNone }