Text set in Spanish was not hyphenated at all. It now uses Javier
Bezos's Liang patterns, hyph-es.tex 5.0 from hyph-utf8 under MIT,
through the hypher crate 0.1.8 with only its alloc and spanish
features. The full feature, which embeds 48 languages under several
licences, stays off.
- hyphen::Lang names the hyphenator for a run: English, or a hypher
language. Lang::for_language maps a language name or locale code.
- word_breaks_in and hyphen_points_in take the language. word_breaks
and hyphen_points stay as the English entry points.
- Composition hyphenates a non-English run whose language has
patterns and skips the rest. The word cache key includes the
language.
- NOTICE carries the Bezos copyright line and the MIT text.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
Characters the primary font lacks try a fallback chain by language
before the language-blind search: Japanese (the craft-fonts Japanese
faces first, Mincho first), Simplified Chinese (also plain Chinese),
Traditional Chinese and Korean each list their macOS, Windows and Linux
system families. Hangul, kana and Bopomofo pick their language's chain
whatever the character language; ideographs and CJK punctuation follow
it, and keep today's fallback without a CJK language. Chain families
load from the system font catalog the first time they are needed.
designcraft_fonts::testing (feature `testing`) builds synthetic fonts
with a given family name and coverage for tests.
Port the CJK1 and AR1 changes from 3ecdb78 and de83cdc onto current main. Resolve translation and font-stack conflicts by retaining main localization and craft-fonts integration while preserving all typesetting code, tests, and documentation.
Validation: all six CI gates passed, including 616 tests and WASM checks.
- hyphen: bundled en-US dictionary from the public-domain Moby Hyphenator II
list (Grady Ward, Gutenberg #3204), front-coded + deflated (433 KB), with
case/apostrophe/punctuation/compound handling and inflection inheritance;
our own Liang patterns (19.5k, 129 KB) trained by a patgen-style trainer
(hyphen::patgen, examples/hyphgen.rs) for unknown words; heuristic last.
Discretionary hyphens replace automatic points.
- breaker: prioritised word/letter/glyph-scaling glue in Knuth-Plass and
layout; uncapped badness; hyphen limit as a hard constraint (hyphen-count
states); hyphenation zone for ragged text (both composers); ragged
hyphenation measured correctly; optical margin alignment; balance ragged
lines; Knuth's node pruning.
- compose: Keep Options (keep with next, keep all lines, keep first/last)
via paragraph snapshots; desired spacing applied to all alignments;
justified last lines shrink instead of overflowing; word shaping and
hyphenation caches (300k-char story: ~40 ms warm, ~60 ms cold).
- tests: golden corpus, perf (ignored), keeps, balance, optical, zone,
limit, letter/glyph scaling, discretionary hyphens.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>