You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
initials() drops the accent from a decomposed (NFD) name: émile zola gives e. z. #585
HumanName(...).initials() does the same. The parse itself is right: roles and tags for the NFD spelling equal the NFC ones.
Cause.nameparser/_render.py's initials() takes t.text[0], a token's first code point. In NFD that is the base letter e, and the combining accent (U+0301) that follows it is dropped.
Reach. Unlike capitalized(), initials() is a compared surface: the differential gate checks it under _initials (#484). The rules corpus has held two NFD names since #584, but both start with an unaccented letter (josé garcía), so the gate doesn't trip.
Options.
Take the first letter plus the combining marks after it (the _past_marks helper Fix case repair splitting a decomposed (NFD) word at its accent #584 added to _render.py). The output keeps the input's form, matching how case repair now handles decomposed text (rules.md#R4, decisions.md#R4 2026-10-02).
Compose the initial to NFC. Simpler, but the output's form would then differ from the input's. R3 states no "nothing but X" rule here, so this is a choice rather than a violation.
Either way, a rules.md#R3 example line in NFD should pin it. Found while fixing #542; recorded as out of scope in decisions.md#R4's #542 bullet.
Activity
docs(#542): link the initials() follow-up, #585
fix(derek73#585): initial a decomposed word by its whole first letter
docs(derek73#585): state R3's first letter over encodings and classif…
fix(derek73#585): initial a letter whose non-composing mark sits insi…
fix(derek73#585): keep a whole first code point as written