嗯,先来记录一下。这个 thread 大概说了为毛有这个 warning:
http://lists.freedesktop.org/archives/f … 04308.html
英语不好,看得不太明白。个人理解是:如果 edit 中要修改 test 条件的位置,就会出现bug。开发者太懒,就弄了个warning不管了。
其实我的 config 里的用法都是不会触发 bug 的,但是开发者实·在·是·太·懒·了。
------ 分割线 ------
除了修改源码,有没有别的办法干掉这个warning 呢?
我的针对 Firefox 写的简繁日区分字体的 fontconfig,抽出来其中一段,如下:
<match target="pattern">
<test name="family">
<string>dHei</string>
</test>
<test qual="any" name="lang">
<string>zh-tw</string>
<string>zh-hk</string>
<string>zh-hant</string>
</test>
<edit name="family" mode="prepend" binding="strong">
<string>Microsoft JhengHei UI</string>
<string>WenQuanYi Zen Hei</string>
</edit>
</match>
大概意思是,如果字体 family 是 dHei(这是之前的conf添加的虚字体名,代表黑体),且字体的语言属性设置为“zh-tw”、“zh-hk”、“zh-hant”之一,就在字体族前添加上繁体字体(Microsoft JhengHei UI,文泉驿是备份字体)。
匹配效果是这样的(好黑好黑体会被其他规则视为 dHei):
cuihao-tp430-arch $ fc-match 好黑好黑体-9:lang=zh-tw 2> /dev/null
msjh.ttc: "Microsoft JhengHei UI" "Normal"
导致 Warning 的是第二个对 lang 属性的 test:“Having multiple values in <test> isn't supported and may not work as expected”。
当然,想要消除这个 waning,我可以这么写:
<match target="pattern">
<test name="family">
<string>dHei</string>
</test>
<test qual="any" name="lang">
<string>zh-tw</string>
</test>
<edit name="family" mode="prepend" binding="strong">
<string>Microsoft JhengHei UI</string>
<string>WenQuanYi Zen Hei</string>
</edit>
</match>
<match target="pattern">
<test name="family">
<string>dHei</string>
</test>
<test qual="any" name="lang">
<string>zh-hk</string>
</test>
<edit name="family" mode="prepend" binding="strong">
<string>Microsoft JhengHei UI</string>
<string>WenQuanYi Zen Hei</string>
</edit>
</match>
<match target="pattern">
<test name="family">
<string>dHei</string>
</test>
<test qual="any" name="lang">
<string>zh-hant</string>
</test>
<edit name="family" mode="prepend" binding="strong">
<string>Microsoft JhengHei UI</string>
<string>WenQuanYi Zen Hei</string>
</edit>
</match>
每种语言都来一遍,这很蛋疼不·是·吗?我的字体分类部分有一个 test 中十几条的那种,全拆开岂不折腾死。
网上有人说改成这样就行了:
<match target="pattern">
<test qual="any" name="lang">
<string>zh-tw</string>
</test>
<test qual="any" name="lang">
<string>zh-hk</string>
</test>
<test qual="any" name="lang">
<string>zh-hant</string>
</test>
<test name="family" compare="eq">
<string>dHei</string>
</test>
<edit name="family" mode="prepend" binding="strong">
<string>Microsoft JhengHei UI</string>
<string>WenQuanYi Zen Hei</string>
</edit>
</match>
但事实证明根本不行啊:
cuihao-tp430-arch $ fc-match 好黑好黑体-9:lang=zh-tw 2> /dev/null
wqy-microhei.ttc: "文泉驿微米黑" "Regular"
呼,太长了,2L继续写。
Site: CVHC.CC Twitter: @cuihaoleo Org: LUG@USTC
AD: ~欢迎参与志愿计算~
离线
开 fontconfig 的 debug 信息(FC_DEBUG=4 是输出匹配和 edit 信息),看一看匹配的过程:
FC_DEBUG=4 fc-match 好黑好黑体-9:lang=zh-tw
==== 正确的是这个样子 =====
添加规则:
Add Subst match
[test]
pattern any family Equal "dHei"
pattern any lang Equal "zh-tw" Comma "zh-hk" Comma "zh-mo" Comma "zh-hant"
[edit]
Edit family Prepend "Microsoft JhengHei UI" Comma "WenQuanYi Zen Hei";
应用规则:
FcConfigSubstitute test pattern any family Equal "dHei"
FcConfigSubstitute test pattern any lang Equal "zh-tw" Comma "zh-hk" Comma "zh-hant"
Substitute Edit family Prepend "Microsoft JhengHei UI" Comma "WenQuanYi Zen Hei"
Prepend list before "好黑好黑体"(s) [marker] "dHei"(s) "sans"(s) "Ubuntu"(s) "dHei"(s) "WenQuanYi Zen Hei"(s)
Prepend list after "好黑好黑体"(s) "Microsoft JhengHei UI"(s) "WenQuanYi Zen Hei"(s) "dHei"(s) "sans"(s) "Ubuntu"(s) "dHei"(s) "WenQuanYi Zen Hei"(s)
嗯,"Microsoft JhengHei UI"、"WenQuanYi Zen Hei" 被 prepend 上了。
==== 错误的是这个样子 =====
Add Subst match
[test]
pattern any family Equal "dHei"
pattern any lang Contains "zh-hk"
pattern any lang Contains "zh-hant"
pattern any lang Contains "zh-tw"
[edit]
Edit family Prepend "Microsoft JhengHei UI" Comma "WenQuanYi Zen Hei";
FcConfigSubstitute test pattern any family Equal "dHei"
FcConfigSubstitute test pattern any lang Equal "zh-tw"
FcConfigSubstitute test pattern any lang Equal "zh-hk"
No match
虽然好像hant莫名被吃了,不过反正啥都没匹配上。
==== 分析 ====
正确的匹配规则是 “pattern any lang Equal "zh-tw" Comma "zh-hk" Comma "zh-mo" Comma "zh-hant"”。
怎么用不会导致 warning 的font conf 搞出这个呢?我天真地尝试了把 Comma 换成逗号填进配置文件,不过失败了。
Site: CVHC.CC Twitter: @cuihaoleo Org: LUG@USTC
AD: ~欢迎参与志愿计算~
离线
后来我发现啊,文泉驿安装了这么个配置文件:
<match target="pattern">
<test qual="any" compare="eq" name="lang">
<string>en</string>
</test>
<test qual="any" compare="eq" name="lang">
<string>en-us</string>
</test>
<test qual="any" compare="eq" name="lang">
<string>zh-cn</string>
</test>
<test qual="any" compare="eq" name="lang">
<string>zh-tw</string>
</test>
<test qual="any" compare="eq" name="lang">
<string>zh-hk</string>
</test>
<test qual="any" compare="eq" name="lang">
<string>zh-sg</string>
</test>
<test compare="more_eq" name="size">
<double>8</double>
</test>
<test compare="less_eq" name="size">
<double>12</double>
</test>
<test compare="not_eq" name="family">
<string>monospace</string>
</test>
<edit name="family" mode="prepend_first">
<string>WenQuanYi Bitmap Song</string>
</edit>
</match>
嗯,官方写的应该是正确的吧。一看就知道它想干啥:
如果lang是en、en-us、zh-xx... 且字体大小大于等于8小于等于12,且字体 family 不是 monospace,就在字体family最前加上 WenQuanYi Bitmap Song。
试一试:
fc-match 呵呵-10:lang=en -s 2> /dev/nul
列表太长不贴,”WenQuanYi Bitmap Song“在倒数第五,看似根本没有用。
还是用 FCDEBUG 看看:
[test]
pattern any lang Equal "en"
pattern any lang Equal "en-us"
pattern any lang Equal "zh-cn"
pattern any lang Equal "zh-tw"
pattern any lang Equal "zh-hk"
pattern any lang Equal "zh-sg"
pattern any size MoreEqual 8
pattern any size LessEqual 12
pattern any family NotEqual "monospace"
[edit]
Edit family PrependFirst "WenQuanYi Bitmap Song";
规则看来是添加进来了。
但是…… 没有下文了。下面的匹配中根·本·没·有这条规则任何事。
字体原始属性:
FcConfigSubstitute Pattern has 4 elts (size 16)
family: "呵呵"(s)
size: 10(f)(s)
lang: en(s) "zh-CN"(w)
prgname: "fc-match"(s)
应该确实是符合规则的条件吧……
完全搞不懂 fontconfig 的逻辑。
Site: CVHC.CC Twitter: @cuihaoleo Org: LUG@USTC
AD: ~欢迎参与志愿计算~
离线