[Fontconfig] matching multiple families in <alias> and <test> (was: Lucida Sans/Grande/Unicode matching confusion)
Raimund Steger
rs at mytum.de
Wed May 2 17:48:57 PDT 2012
Akira TAGOH wrote:
> On Wed, May 2, 2012 at 12:52 AM, Raimund Steger<rs at mytum.de> wrote:
>> [...]
>> I think that most users, when they use multiple families in the upper part
>> of<alias>, think of something like:
>>
>> "Now if I use<accept>, then append after the last occuring
>> value out of the ones I just specified"
>>
>> and
>>
>> "If I use<prefer>, then prepend before the first occuring
>> value out of the ones I specified"
>
> Hmm, if people really expects to do so, having separate rules behaves
> differently then.
That's true, it would be a different behavior. Hm, now I'm not so sure
anymore. (Many users probably don't really realize that they deal with a
list of families they compare with, not just one.)
>> I. e. maybe something like having FcConfigMatchValueList() return first
>> _and_ last match in the actual value list and use the latter for append
>> edits.
>
> What if there are<family> lines more than two?
It would, given this example config:
<alias>
<family>Family1</family>
<family>Family2</family>
<family>Family3</family>
<family>Family4</family>
<family>Family5</family>
<accept><family>AppendedFamily1</family>
<family>AppendedFamily2</family></accept>
<prefer><family>PrependedFamily1</family>
<family>PrependedFamily2</family></prefer>
</alias>
and this query:
FC_DEBUG=1 fc-match Family0,Family1,Family6,Family4,Family3,Family7
result in this after substitution:
[...]
family: "Family0"(s) "PrependedFamily1"(w) "PrependedFamily2"(w)
"Family1"(s) "Family6"(s) "Family4"(s) "Family3"(s) "AppendedFamily1"(w)
"AppendedFamily2"(w) "Family7"(s) "Bitstream Vera Sans"(w) "DejaVu
Sans"(w) "Verdana"(w) "Arial"(w) "Albany AMT"(w) "Luxi Sans"(w) "Nimbus
Sans L"(w)
[...]
i. e. prepend/append occurs around the leftmost/rightmost actually
matching family of the list that was specified in the original pattern.
I just started changing fccfg.c to test it, when I noticed that if some
rather standard/fallback family occurs in a test, append edits would
always be applied after its last occurence which will be pretty close to
the end of the whole list, possibly also not what users expect. So maybe
the idea with using the binding isn't so bad :-)
> Anyway, I think we may have some options so far:
>
> 1. Drop FcOpComma and warns it's not supported syntax.
>
> 2. add an attribute to<edit> and<alias> to let fontconfig know where
> to edit. e.g. pos="first|last|binding|all"
>
> 3. keep current behavior
>
> there may be more though. but I don't think taking option 3 is a good
What I can also think of (at least for <alias>), is to not use
FcOpComma, but create as many FcTest objects (and add all of them with
FcConfigAddEdit) in FcParseAlias as there are families in the upper part
of <alias>, thus simulating what a user would do creating separate rules
for all of them.
Raimund
More information about the Fontconfig
mailing list