You said:
> So ignore it and test whever the last symbols glues with ZWJ (it should,
> so there's no break in the reference implementation).

Which makes me think you misread the example I quoted. There is a break in the reference implementation, though I argue (like you just did) that there shouldn't be. So I think you agree with me and also think it's broken.

Otherwise, I'm not sure I fully understand what you are saying, but if what you are saying is correct, then following the same logic, other rules would fail, specifically:

÷ 0061 × 2060 × 0030 ÷ # ÷ [0.2] LATIN SMALL LETTER A (ALetter) × [4.0] WORD JOINER (Format_FE) × [9.0] DIGIT ZERO (Numeric) ÷ [0.3]

After the FE here there's no BREAK because:
ALetter Format Numeric -> ALetter Numeric
Which then following rule 9.0 is a no-break.

This is exactly the rule (4) as described in my previous email, just with a different follow-up rule (9 instead of 3c). I don't see how rule precedence would matter here, as there is no case for which two rules apply.

--
Tom.

On 23/11/16 02:49, Philippe Verdy wrote:
IMHO, the ZWJ should glue with the last symbol following your examples.
But the combining diaeresis following the ZWJ extends it (even if in my
opinion it is "defective" and would likely display on a dotted ciurcle
in renderers, but not defective for the string definition of combining
sequences).
So ignore it and test whever the last symbols glues with ZWJ (it should,
so there's no break in the reference implementation).

WB4: X (Extend | Format | ZWJ)*→X

Extend: [ExtendGrapheme_Extend=Yes]  This includes:
  General_Category = Nonspacing_Mark (this includes the combining diaeresis)
  General_Category = Enclosing_Mark
  U+200C ZERO WIDTH NON-JOINER
  plus a few General_Category = Spacing_Mark needed for canonical
equivalence.

So yes we have: ZWJ "COMBINING DIERESIS" (EBG|Glue_After_Zwj) → ZWJ
(EBG|Glue_After_Zwj) from rule WB4 eliminate the combining mark from the
input queue

But rule WB3c comes before and prohibits it:

WB3c: ZWJ × (Glue_After_Zwj | EBG)

This means that you have first:

ZWJ "COMBINING DIERESIS" GAZ →  ZWJ × "COMBINING DIERESIS" EBG

and this does not match the rule WB4 which is not matching for:

X × (Extend | Format | ZWJ)*→X

(it cannot remove the extenders if there's a no-break before them, it is
valid only when the break oppotunity is still unspecified. As soon as a
rule as produced a "break here" or "nobreak here" at a given position,
you must advance after this position (the rules are based on a small
finite state machine). So after :

ZWJ "COMBINING DIERESIS" GAZ →  ZWJ × "COMBINING DIERESIS" EBG

it just remains in your input queue:

"COMBINING DIERESIS" EBG  (because "ZWJ ×" is already processed, and so
ZWJ is elminated)

Now comes WB4: X (Extend | Format | ZWJ)* → X

There's no more any "X" to match before the combining diaeresis: your
input queue starts by the combining diareasis matching "X", the
following character (EBG) does not match within "(Extend | Format |
ZWJ)*" (which matches an empty string and does not contain the combining
diaresis already matched in "X"), rule WB4 has then no replacement
effect and preserves the initial "X" (i.e. the combining diaeresis)

.

        
        




2016-11-22 13:07 GMT+01:00 Tom Hacohen <[email protected]
<mailto:[email protected]>>:

    Dear,

    I recently updated libunibreak[1] according to unicode 9.0.0. I
    thought I implemented it correctly, however it fails against two of
    the tests in the reference test data:

    ÷ 200D × 0308 ÷ 2764 ÷ #  ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) × [4.0]
    COMBINING DIAERESIS (Extend_FE) ÷ [999.0] HEAVY BLACK HEART
    (Glue_After_Zwj) ÷ [0.3]

    and

    ÷ 200D × 0308 ÷ 1F466 ÷ #  ÷ [0.2] ZERO WIDTH JOINER (ZWJ_FE) ×
    [4.0] COMBINING DIAERESIS (Extend_FE) ÷ [999.0] BOY (EBG) ÷ [0.3]


    More specifically, it fails in both after the "combining diaeresis".
    My implementation marks it as a break, whereas the test data as not.
    The reference implementation, as expected, agrees with the test data.


    However, looking at the test case and the UAX[2], this does not look
    correct. More specifically, because of rule 4:
    ZWJ Extended GAZ -> ZWJ GAZ
    And then according to rule 3c, there should be no break opportunity
    between them. The reference implementation, however, uses rule 999
    here, which I believe is incorrect.


    Am I missing anything, or is this an issue with the reference test
    data and reference implementation?

    Thanks,
    Tom.

    [1]: https://github.com/adah1972/libunibreak
    <https://github.com/adah1972/libunibreak>
    [2]: http://www.unicode.org/reports/tr29/#WB1
    <http://www.unicode.org/reports/tr29/#WB1>



Reply via email to