From ea781d30edd5ecae536c1e0209fe5025575728f9 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Thu, 18 Sep 2025 22:02:13 +0800 Subject: [PATCH 1/2] :art: Improve font loading https://github.com/siyuan-note/siyuan/issues/15879 Signed-off-by: Daniel <845765@qq.com> --- kernel/util/font.go | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/kernel/util/font.go b/kernel/util/font.go index 643beee7d..2047afdda 100644 --- a/kernel/util/font.go +++ b/kernel/util/font.go @@ -103,6 +103,10 @@ func existFont(family string, fonts []*Font) bool { func parseTTCFontFamily(fontPath string) (ret []string) { defer logging.Recover() + if strings.Contains(fontPath, "Alibaba") { + logging.LogInfo(fontPath) + } + data, err := os.ReadFile(fontPath) if err != nil { //logging.LogErrorf("read font file [%s] failed: %s", fontPath, err) @@ -121,15 +125,23 @@ func parseTTCFontFamily(fontPath string) (ret []string) { continue } - family, _ := font.Name(nil, ttc.NameIDFamily) - if "" == family { - family, _ = font.Name(nil, ttc.NameIDTypographicFamily) - } + family, _ := font.Name(nil, ttc.NameIDFull) family = strings.TrimSpace(family) - if "" == family || strings.HasPrefix(family, ".") { - continue + if "" != family && !strings.HasPrefix(family, ".") { + ret = append(ret, family) + } + + family, _ := font.Name(nil, ttc.NameIDFamily) + family = strings.TrimSpace(family) + if "" != family && !strings.HasPrefix(family, ".") { + ret = append(ret, family) + } + + family, _ = font.Name(nil, ttc.NameIDTypographicFamily) + family = strings.TrimSpace(family) + if "" != family && !strings.HasPrefix(family, ".") { + ret = append(ret, family) } - ret = append(ret, family) } ret = gulu.Str.RemoveDuplicatedElem(ret) return From d372e871f4a020bbff8a9b7ec421e466abcbdb86 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Thu, 18 Sep 2025 23:10:06 +0800 Subject: [PATCH 2/2] :art: Improve font loading https://github.com/siyuan-note/siyuan/issues/15879 Signed-off-by: Daniel <845765@qq.com> --- kernel/util/font.go | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/kernel/util/font.go b/kernel/util/font.go index 2047afdda..3b9b6df71 100644 --- a/kernel/util/font.go +++ b/kernel/util/font.go @@ -103,10 +103,6 @@ func existFont(family string, fonts []*Font) bool { func parseTTCFontFamily(fontPath string) (ret []string) { defer logging.Recover() - if strings.Contains(fontPath, "Alibaba") { - logging.LogInfo(fontPath) - } - data, err := os.ReadFile(fontPath) if err != nil { //logging.LogErrorf("read font file [%s] failed: %s", fontPath, err) @@ -131,7 +127,7 @@ func parseTTCFontFamily(fontPath string) (ret []string) { ret = append(ret, family) } - family, _ := font.Name(nil, ttc.NameIDFamily) + family, _ = font.Name(nil, ttc.NameIDFamily) family = strings.TrimSpace(family) if "" != family && !strings.HasPrefix(family, ".") { ret = append(ret, family) @@ -162,35 +158,38 @@ func parseTTFFontFamily(fontPath string) (ret string) { return } + if strings.Contains(fontPath, "04") { + logging.LogInfo(fontPath) + } + t, err := font.NameTable() if err != nil { logging.LogErrorf("get font [%s] name table failed: %s", fontPath, err) return } + var family, subfamily string for _, e := range t.List() { - if sfnt.NameFontFamily != e.NameID && sfnt.NamePreferredFamily != e.NameID { - continue - } - - if sfnt.PlatformLanguageID(1033) == e.LanguageID || sfnt.PlatformLanguageID(2052) == e.LanguageID { + if sfnt.NameFontFamily == e.NameID && (sfnt.PlatformLanguageID(1033) == e.LanguageID || sfnt.PlatformLanguageID(2052) == e.LanguageID) { v, _, err := transform.Bytes(textUnicode.UTF16(textUnicode.BigEndian, textUnicode.IgnoreBOM).NewDecoder(), e.Value) - if err != nil { - return "" + if err == nil { + family = strings.TrimSpace(string(v)) } - val := string(v) - if sfnt.NameFontFamily == e.NameID && "" != val { - ret = val - } - if sfnt.NamePreferredFamily == e.NameID && "" != val { - ret = val + } + if sfnt.NameFontSubfamily == e.NameID && (sfnt.PlatformLanguageID(1033) == e.LanguageID || sfnt.PlatformLanguageID(2052) == e.LanguageID) { + v, _, err := transform.Bytes(textUnicode.UTF16(textUnicode.BigEndian, textUnicode.IgnoreBOM).NewDecoder(), e.Value) + if err == nil { + subfamily = strings.TrimSpace(string(v)) } } } - ret = strings.TrimSpace(ret) - if strings.HasPrefix(ret, ".") { - return "" + if family != "" && !strings.HasPrefix(family, ".") { + if subfamily != "" && !strings.Contains(subfamily, "<") && !strings.EqualFold(subfamily, "Regular") { + ret = family + " " + subfamily // 例如 "PingFang SC Bold" + } else { + ret = family + } } return }