The generic assigns swap sans-serif, serif and monospace for fonts with no CJK glyphs, so tagged Chinese text ends up on whatever Noto CJK variant the charset scan finds first, usually the Japanese one. Fold the many Chinese tags down to one per variant and prepend the matching family ahead of the assigns.
419 lines
11 KiB
XML
419 lines
11 KiB
XML
<?xml version="1.0"?>
|
|
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
|
|
<fontconfig>
|
|
<!-- CJK: fold the language tag onto one tag per Noto CJK variant -->
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="eq">
|
|
<string>zh</string>
|
|
</test>
|
|
<edit name="lang" mode="assign">
|
|
<string>zh-cn</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="eq">
|
|
<string>zh-hant</string>
|
|
</test>
|
|
<edit name="lang" mode="assign">
|
|
<string>zh-tw</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<string>zh-hant-hk</string>
|
|
</test>
|
|
<edit name="lang" mode="assign">
|
|
<string>zh-hk</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<string>zh-hant-mo</string>
|
|
</test>
|
|
<edit name="lang" mode="assign">
|
|
<string>zh-hk</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<string>zh-hant</string>
|
|
</test>
|
|
<edit name="lang" mode="assign">
|
|
<string>zh-tw</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<string>zh-hans</string>
|
|
</test>
|
|
<edit name="lang" mode="assign">
|
|
<string>zh-cn</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<string>zh-sg</string>
|
|
</test>
|
|
<edit name="lang" mode="assign">
|
|
<string>zh-cn</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<string>zh-mo</string>
|
|
</test>
|
|
<edit name="lang" mode="assign">
|
|
<string>zh-hk</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="eq">
|
|
<string>yue</string>
|
|
</test>
|
|
<edit name="lang" mode="assign">
|
|
<string>zh-hk</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<string>yue-hans</string>
|
|
</test>
|
|
<edit name="lang" mode="assign">
|
|
<string>zh-cn</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<string>yue-cn</string>
|
|
</test>
|
|
<edit name="lang" mode="assign">
|
|
<string>zh-cn</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<string>yue</string>
|
|
</test>
|
|
<edit name="lang" mode="assign">
|
|
<string>zh-hk</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<!-- Then append that variant after the generic family it falls back from -->
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<string>zh-cn</string>
|
|
</test>
|
|
<test name="family">
|
|
<string>sans-serif</string>
|
|
</test>
|
|
<edit name="family" mode="append" binding="strong">
|
|
<string>Noto Sans CJK SC</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<string>zh-cn</string>
|
|
</test>
|
|
<test name="family">
|
|
<string>serif</string>
|
|
</test>
|
|
<edit name="family" mode="append" binding="strong">
|
|
<string>Noto Serif CJK SC</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<string>zh-cn</string>
|
|
</test>
|
|
<test name="family">
|
|
<string>monospace</string>
|
|
</test>
|
|
<edit name="family" mode="append" binding="strong">
|
|
<string>Noto Sans Mono CJK SC</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<string>zh-hk</string>
|
|
</test>
|
|
<test name="family">
|
|
<string>sans-serif</string>
|
|
</test>
|
|
<edit name="family" mode="append" binding="strong">
|
|
<string>Noto Sans CJK HK</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<string>zh-hk</string>
|
|
</test>
|
|
<test name="family">
|
|
<string>serif</string>
|
|
</test>
|
|
<edit name="family" mode="append" binding="strong">
|
|
<string>Noto Serif CJK HK</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<string>zh-hk</string>
|
|
</test>
|
|
<test name="family">
|
|
<string>monospace</string>
|
|
</test>
|
|
<edit name="family" mode="append" binding="strong">
|
|
<string>Noto Sans Mono CJK HK</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<string>zh-tw</string>
|
|
</test>
|
|
<test name="family">
|
|
<string>sans-serif</string>
|
|
</test>
|
|
<edit name="family" mode="append" binding="strong">
|
|
<string>Noto Sans CJK TC</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<string>zh-tw</string>
|
|
</test>
|
|
<test name="family">
|
|
<string>serif</string>
|
|
</test>
|
|
<edit name="family" mode="append" binding="strong">
|
|
<string>Noto Serif CJK TC</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<string>zh-tw</string>
|
|
</test>
|
|
<test name="family">
|
|
<string>monospace</string>
|
|
</test>
|
|
<edit name="family" mode="append" binding="strong">
|
|
<string>Noto Sans Mono CJK TC</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<langset><string>ja</string></langset>
|
|
</test>
|
|
<test name="family">
|
|
<string>sans-serif</string>
|
|
</test>
|
|
<edit name="family" mode="append" binding="strong">
|
|
<string>Noto Sans CJK JP</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<langset><string>ja</string></langset>
|
|
</test>
|
|
<test name="family">
|
|
<string>serif</string>
|
|
</test>
|
|
<edit name="family" mode="append" binding="strong">
|
|
<string>Noto Serif CJK JP</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<langset><string>ja</string></langset>
|
|
</test>
|
|
<test name="family">
|
|
<string>monospace</string>
|
|
</test>
|
|
<edit name="family" mode="append" binding="strong">
|
|
<string>Noto Sans Mono CJK JP</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<langset><string>ko</string></langset>
|
|
</test>
|
|
<test name="family">
|
|
<string>sans-serif</string>
|
|
</test>
|
|
<edit name="family" mode="append" binding="strong">
|
|
<string>Noto Sans CJK KR</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<langset><string>ko</string></langset>
|
|
</test>
|
|
<test name="family">
|
|
<string>serif</string>
|
|
</test>
|
|
<edit name="family" mode="append" binding="strong">
|
|
<string>Noto Serif CJK KR</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="lang" qual="first" compare="contains">
|
|
<langset><string>ko</string></langset>
|
|
</test>
|
|
<test name="family">
|
|
<string>monospace</string>
|
|
</test>
|
|
<edit name="family" mode="append" binding="strong">
|
|
<string>Noto Sans Mono CJK KR</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="family" qual="any">
|
|
<string>sans-serif</string>
|
|
</test>
|
|
<edit name="family" mode="assign" binding="strong">
|
|
<string>Liberation Sans</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="family" qual="any">
|
|
<string>serif</string>
|
|
</test>
|
|
<edit name="family" mode="assign" binding="strong">
|
|
<string>Liberation Serif</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<match target="pattern">
|
|
<test name="family" qual="any">
|
|
<string>monospace</string>
|
|
</test>
|
|
<edit name="family" mode="assign" binding="strong">
|
|
<string>JetBrainsMono Nerd Font</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<!-- Arabic: prefer Naskh (standard Arabic) over Nastaliq (Urdu style) -->
|
|
<match target="pattern">
|
|
<test name="lang" compare="contains">
|
|
<string>ar</string>
|
|
</test>
|
|
<edit name="family" mode="prepend" binding="strong">
|
|
<string>Noto Naskh Arabic</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<!-- Urdu is conventionally set in Nastaliq, so keep it there. Without this
|
|
the untargeted Naskh rule below would capture Urdu too. Appended rather
|
|
than prepended so it only wins the last-resort race against that rule
|
|
and never displaces the family the app actually asked for. -->
|
|
<match target="pattern">
|
|
<test name="lang" compare="contains">
|
|
<string>ur</string>
|
|
</test>
|
|
<edit name="family" mode="append" binding="strong">
|
|
<string>Noto Nastaliq Urdu</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<!-- Chromium and Electron resolve missing glyphs one character at a time
|
|
without lang on the pattern, so the rules above never fire for them and
|
|
fontconfig falls through to a raw charset scan that lands on Nastaliq
|
|
(or on Kufi, once the latin alias chains have widened the pattern).
|
|
Naming Naskh as a last-resort family covers that path. Appending keeps
|
|
it behind every family the app actually asked for, and charset matching
|
|
outranks family matching, so a font that does not cover the codepoint
|
|
can never be pulled in: Latin, monospace, emoji, Nerd Font glyphs and
|
|
CJK all resolve exactly as before. -->
|
|
<match target="pattern">
|
|
<edit name="family" mode="append" binding="strong">
|
|
<string>Noto Naskh Arabic</string>
|
|
</edit>
|
|
</match>
|
|
|
|
<alias>
|
|
<family>system-ui</family>
|
|
<prefer>
|
|
<family>Liberation Sans</family>
|
|
</prefer>
|
|
</alias>
|
|
|
|
<alias>
|
|
<family>ui-monospace</family>
|
|
<default>
|
|
<family>monospace</family>
|
|
</default>
|
|
</alias>
|
|
|
|
<alias>
|
|
<family>-apple-system</family>
|
|
<prefer>
|
|
<family>Liberation Sans</family>
|
|
</prefer>
|
|
</alias>
|
|
|
|
<alias>
|
|
<family>BlinkMacSystemFont</family>
|
|
<prefer>
|
|
<family>Liberation Sans</family>
|
|
</prefer>
|
|
</alias>
|
|
|
|
<alias>
|
|
<family>Liberation Sans</family>
|
|
<accept>
|
|
<family>JetBrainsMono Nerd Font</family>
|
|
<family>Noto Color Emoji</family>
|
|
</accept>
|
|
</alias>
|
|
|
|
<alias>
|
|
<family>sans-serif</family>
|
|
<accept>
|
|
<family>JetBrainsMono Nerd Font</family>
|
|
<family>Noto Color Emoji</family>
|
|
</accept>
|
|
</alias>
|
|
|
|
<alias>
|
|
<family>serif</family>
|
|
<accept>
|
|
<family>Noto Color Emoji</family>
|
|
</accept>
|
|
</alias>
|
|
|
|
<alias>
|
|
<family>monospace</family>
|
|
<accept>
|
|
<family>Noto Color Emoji</family>
|
|
</accept>
|
|
</alias>
|
|
</fontconfig>
|