Files
1e53adf9d6 Portuguese proofing: pt-BR spelling, suggestions, grammar and hyphenation (#100) (#797)
* M15: Polish interface, and Polish spelling, grammar and hyphenation

Interface
- Polish is the tenth interface language ("Polski", pl.tsv, 1,045 entries);
  pl, pl-PL and pl_PL.UTF-8 system locales select it automatically.
- Right-click menu labels now go through translation in every language.
- Review > Language is a menu (English US/UK, Polski, Do not check spelling
  or grammar); the status bar shows the language at the caret.
- With a Polish interface, new blank documents and opened .txt/.md files
  default to pl-PL.

Proofing
- Each run is checked in its own language (w:lang, resolved through
  styles): squiggles, F7, review.issues, suggestions and hyphenation.
  Text in languages without proofing tools is no longer flagged as English.
- Polish spelling from the SJP.PL Hunspell dictionary (Apache-2.0 option),
  read by a new Rust affix engine (crates/proof/src/affix.rs); 875 KB asset,
  ~4.5M word forms. Regenerate with the pl_dictionary example.
- Polish suggestions: case, missing diacritics, rz/ż, ó/u, ch/h confusions,
  missing spaces (napewno -> na pewno), edit distance.
- Conservative Polish grammar rules: repeated words, spacing, doubled
  punctuation, sentence capitals, missing comma before że/który/ponieważ/
  aby/żeby/jeśli…, we/ze forms.
- Polish hyphenation with the hyph-utf8 hyph-pl.tex patterns (MIT option);
  pattern keys widened to 20 letters, TeX exceptions parsed; the heuristic
  no longer treats ł, ż, ś… as vowels.

review.language validates and normalizes tags, can set noProof alone and
the document default; format.state reports lang and noProof.

Tests for every part, docs and ATTRIBUTION.md/NOTICE updated;
cargo xtask ci passes (fmt, clippy, test, assets, layers, wasm).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Layout: rustfmt the test module order left unformatted by #391

cargo fmt --check failed on main after #391 added mod tests_grid.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Review fixes for #346: read Polish spelling from the installed Hunspell dictionary

- Polish spelling uses the Hunspell pl_PL dictionary installed on the
  system (OS packages, Homebrew, LibreOffice, ~/.local/share/hunspell, or
  WORDCRAFT_DICTIONARIES) instead of a bundled 870 KB SJP.PL file;
  without one, Polish text gets no spelling marks, like Word without the
  language's proofing tools. .aff/.dic are size-capped and decoded from
  UTF-8 or ISO 8859-2 (crates/proof/src/hunspell.rs).
- The dictionary can be replaced at runtime (install_dictionary) or
  re-searched (reload_dictionary); an empty one accepts every word.
- Tests use small synthetic dictionaries written for them, so they don't
  depend on what the machine has installed.
- The bundled pl.dic, its ATTRIBUTION/NOTICE entries and the generator
  example are removed; docs describe the installed dictionary.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* #100: affix — accept FLAG UTF-8 and DEFAULT flag modes

Per-character flag modes are what the reader already parses; only the
multi-character encodings (long, num) stay errors. VERO pt_BR declares
FLAG UTF-8.

* #100: affix — widen flag masks to u128 (128 flag capacity)

VERO pt_BR needs 106 distinct flags; the u64 bitmask capped at 64.
Serialization is unaffected: WCAFF1 stores flag characters and
re-derives the masks on load.

* #100: affix — support FORBIDDENWORD

VERO pt_BR marks spellings it must reject with a forbidden flag (ý).
Stems carrying it are listed but never correct and never inflect.

* #100: affix — continuation classes in check

SFX A 0 able/B: the form derived by A carries flag B, licensing a
further suffix of class B (workable -> workables) while the bare stem
cannot take one. form_has_flag walks the chain depth-bounded
(MAX_CHAIN = 3); with no continuations declared it degenerates to the
stem lookup, so existing dictionaries are unaffected. VERO pt_BR uses
26 continuation rules.

* #100: affix — continuation classes in forms

Enumerate chained suffix forms (workable -> workables) under the same
MAX_CHAIN bound the checker walks, so every form the checker accepts
is listed and vice versa.

* #100: affix — round-trip continuations and FORBIDDENWORD through WCAFF1

The compact format keeps its WCAFF1 magic: continuation classes ride
on the rule's appended field (as in the .aff source) and the forbidden
flag becomes a FORBIDDENWORD line. Old files read as before.

* #100: affix — strip a UTF-8 BOM from .aff/.dic input

VERO's files open with a BOM; glued to the count line it parsed as a
stem (one garbage entry per load) and to SET it hid the directive.

* #782: affix — the module doc still rejected what the code now reads

Continuation classes and FORBIDDENWORD are supported; the header said
Rejected for both.

* #100: pt — Portuguese spelling, following the Polish module

ProofLang::Pt resolves pt/pt-BR/pt-PT/por tags; the pt module reads the
installed Hunspell pt_BR dictionary (VERO) through the affix engine —
FLAG UTF-8 flags, continuation classes and FORBIDDENWORD spellings all
exercised by the synthetic test dictionary. Hyphenated compounds are
checked part by part (guarda-roupa, ex-marido); without a dictionary
installed, Portuguese text gets no marks. Spelling message in
Portuguese; suggestions and grammar land next.

* #100: pt — Portuguese suggestions

Rounds of rising cost, driven by the dictionary's own tables: missing
accents from MAP (coraçao -> coração, saude -> saúde), the REP
confusions (seje -> seja, excessão -> exceção), a missing space after a
short function word (nãoé -> não é, dagua -> da água), one typo over
TRY, and an accent-folding stem scan — the Polish rounds, retuned for
Portuguese.

* #100: pt — Portuguese grammar flags

Conservative rules with Portuguese messages: repeated words (except
the emphatic doubles Portuguese allows), space before punctuation and
double spaces, sentence capitals knowing the Portuguese abbreviations
and dialogue dashes, and doubled punctuation. No comma rule: que opens
a clause only sometimes, so a wrong flag would cost more than a missed
one.

* #100: pt — Portuguese hyphenation

hyph-utf8's hyph-pt.tex bundled unmodified (BSD 3-clause, ATTRIBUTION
row with source and hash): 426 Liang patterns and 2 exception words;
falls back to the generic heuristic outside their reach.

* #100: pt — Review › Language offers Português (Brasil), and a pt-br interface writes pt-BR

The menu's fourth entry sets the run language; the status bar names
Portuguese; editing_lang is now allowed for pt-br (wordcraft-proof
proofs it), so new documents under a Portuguese interface are
Portuguese by default.

* #100: pt — engine test: Portuguese proofing through the review commands

review.language pt-BR normalizes the tag, review.issues reports
Portuguese spelling and grammar with the lang field, F7 and Change
apply a suggestion, Add to Dictionary works for Portuguese.

* #100: pt — Portuguese in the mixed-language proofing tests and docs

check_text proofs a Portuguese span with the Portuguese message; the
never-panic loops and the module docs cover the third language.

* #100: docs — Portuguese proofing in the gap, parity and roadmap docs

Gap 8 narrowed (English, Polish and Portuguese), localization parity
gains a Portuguese row and a revision entry, target-app-parity's
Proofing row moves 40% -> 42%, and the ROADMAP progress log records
what landed.

* #100: hunspell — LibreOffice extension folders follow the language

The search paths hardcoded LibreOffice's dict-pl; a pt_BR user whose
only dictionary is LibreOffice's dict-pt-BR extension — on Windows the
only realistic on-disk source — got silently no spelling. Both the
primary-language folder and the dashed full name are now tried, so
Polish keeps dict-pl and Portuguese finds dict-pt-BR.

* #100: pt — review fixes

Suggestion ties break toward the change nearest the word's start
(saúde before saudê, proven against a fixture that has both); the
Language menu's label is the English source "Portuguese (Brazil)" with
translations in all twelve catalogs (as Polish is); the attribution
counts pt.pat's 2 exception words; the pt fixture drops a duplicate
stem; docs/roadmap.md catches up with the landing; the throwaway spike
is gone.

* Review fixes for #782: two-suffix chain limit, module doc

- MAX_CHAIN = 2 counts suffixes in a row, matching Hunspell's two-suffix limit
  (the old bound of 3 allowed up to four); test pins that a third is rejected.
- Module doc: say probes allocate small scratch strings instead of claiming none.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Review fixes for #797: NOTICE for pt.pat, no indexing in the LibreOffice folder helper

- NOTICE reproduces hyph-pt.tex's BSD 3-Clause copyright notice, conditions and
  disclaimer, which the licence requires for binary redistributions.
- hunspell::lo_ext_dirs builds its list without indexing (never-crash rule).
- Catalogs: main already translates "Portuguese (Brazil)" in every language, so the
  duplicate rows the branch added are dropped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: witkowski01 <konradwitkowski01@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-12 07:43:24 -04:00

8.2 KiB
Raw Permalink Blame History

WordCraft roadmap: milestones and what's next

Last reviewed: 2026-10-10 · Last updated: 2026-10-12 · Change: minor (Portuguese proofing; previously minor: Polish interface and Polish proofing; previously trivial: M7: formatting revisions landed, #41; previously trivial: M5: Draw Table and Eraser landed, #303; previously minor: beta distance restated: ~15 points, ~150–230 h; previously: alpha gate checked: six core workflows pass; previously major: milestones moved here from ROADMAP.md; Current focus set from the re-measured gaps) · Target: Microsoft Word (Microsoft 365) for Mac 16.113.4

Forward-looking plan. The summary is ROADMAP.md; the ranked work list is gaps.md; the numbers are in target-app-parity.md. Hours are Opus 5.5 agent wall-clock.

Current focus (toward beta, ~150–230 h)

  1. Merge or close the ~45 open PRs before starting overlapping work: many close catalog gaps (Clipboard pane #264, Manage Styles #270, Group #267), fix field bugs (Hebrew RTL #20, IME fixes #155–#164) or add languages (nb, nn, he). Owner review needed.
  2. DOCX real-world corpus (gap #1, 30–50 h): collect openly licensed real-world .docx files, open/render/round-trip them, compare with Word locally, fix what breaks. Omitted/empty paragraph defaults now have synthetic save/reopen coverage; the corpus gate remains open.
  3. Preserve what we can't render (gap #2, 10–15 h): remaining native ink forms and unsupported graphics survive a round trip. Drawing-level native ink now keeps its InkML and optional picture fallback alongside chart, SmartArt, OLE and drawing-canvas support.
  4. Stability sweep (gap #3, 20–30 h): the open crash, hang and write-failure issues, plus an autosave/recovery soak test.
  5. Pagination fidelity (gap #4, 30–50 h): column balancing, footnote continuation, compat options, a local page-by-page comparison harness; an owner decision on an Aptos-metric font.
  6. Formatting revisions and content controls (gap #5, 12–18 h), native printing (gap #6, 6–10 h), dialog depth (gap #7, 20–30 h).

Alpha gate (core workflows)

The core-workflow gate from the craftrules progress-docs standard: what a typical Word user does every day, checked end to end on the main platform (macOS desktop), including save and reopen. "Partial" here means rough but not blocking: the workflow completes.

Core workflow Works end to end? Evidence Hours to pass
Write and format a document: type, fonts, paragraph formatting, styles, lists, undo, find/replace; save as .docx and reopen yes 422 commands, typing parity pinned by tests_typing.rs, DOCX round-trip tests (crates/docx/tests/roundtrip.rs) 0
Open a .docx someone sent, edit it, send back a .docx Word opens partial (not blocking) Word opens our files; typical text/table/picture documents work; never tested on a real-world corpus; charts, SmartArt and OLE dropped silently, move tracking lost (gaps #1, #2, #5) 0 (beta work: 50–80)
Build a structured document: tables, pictures, headers/footers, page numbers, sections, columns yes Tables with row splitting and floating tables (#137), floating pictures (#136), first/odd/even headers; columns don't balance (gap #4) 0
Review with others: comments, track changes, accept/reject, compare yes Margin balloons, tracked insert/delete incl. paragraph marks (#125, #244), formatting revisions (#41), compare 0
References for reports and papers: TOC, footnotes, citations and bibliography, captions yes Updatable TOC field (#52), notes, APA/MLA/Chicago/IEEE, Zotero (#189); long footnotes don't continue (gap #4) 0
Share or print: export PDF, print partial (not blocking) PDF export solid (krilla); desktop printing goes through a PDF, no native print dialog (gap #6) 0 (beta work: 6–10)

Result: passes. Every core workflow completes on macOS and the work saves and reopens; the partial rows are fidelity gaps (beta work), not broken workflows. WordCraft stays alpha.

Milestones

# Milestone State Remaining
M0 Skeleton and vertical slice (model, layout, render, engine, Word-style UI, CLI, MCP, web) done —
M1 DOCX I/O done (first version); real-world corpus not started; charts/SmartArt/OLE dropped 45–75 h
M2 Home tab done except Paste Special, Clipboard pane, Style Inspector, Manage Styles, Asian typography (PRs open for four) 5–10 h
M3 Insert tab mostly done; equations done (#191), icons done (#309); charts, SmartArt, 3D, screenshot, online media missing 50–80 h
M4 Layout and Design tabs done except column balancing, group 6–10 h
M5 Tables done (row splitting, floating tables, style formatting); custom table styles (#256); Draw Table and Eraser (#303) 6–10 h
M6 References first version done (TOC fields, cross-references, Zotero); footnote continuation missing; all 12 bibliography styles (#383) 15–25 h
M7 Review done (balloons, paragraph-mark revisions, formatting revisions #41); move tracking, multilingual proofing missing 35–60 h
M8 View mostly done; window commands missing 3–5 h
M9 Mailings done (first version); Excel/Outlook data sources and email merge missing 6–10 h
M10 File/Backstage mostly done; native printing, Options depth missing 12–20 h
M11 Draw and objects text wrap, text boxes, canvas handles, rotation (#332), ink pens and eraser (#307), contour wrap (#354), lasso, Add Pen, Ink to Shape and Ink Replay (#395) done; Ink to Math, grouping missing 35–55 h
M12 Formats breadth (PDF, ODT, RTF, HTML, MD, TXT, LaTeX, .doc import) done (first versions); .doc write, encryption, minor formats missing 60–100 h
M13 Performance budgets on track (1.4 ms relayout); large real-world documents unmeasured 10–20 h
M14 1.0 polish, packaging, signing releases v0.1.0–v0.4.0 published (signed macOS, Windows MSI x64/x86/arm64, Linux, FreeBSD, web) —
M15 Localization (12 key languages, RTL interface, proofing languages) 15 UI languages; English, Polish and Portuguese proofing, a proofing language per run 70–115 h
M16 Right-to-left and East Asian typography RTL paragraphs done (#207) 30–45 h

Next after beta

Charts and SmartArt editing, the Draw tab, .doc writing, PDF Reflow, the remaining interface languages, screen-reader access, ecosystem decisions (VBA, add-ins, cloud), an in-app assistant.

Revision history

Date Change Summary
2026-10-12 minor M15: Portuguese proofing (pt-BR spelling from the installed VERO dictionary, suggestions, grammar, hyphenation; Review › Language gains Português (Brasil))
2026-10-11 trivial M15: Polish interface and Polish proofing landed
2026-10-11 trivial M3: icons landed (#309)
2026-10-11 trivial M11: contour (Tight/Through) wrap done (#354)
2026-10-11 minor Native drawing-level ink and its picture fallback survive DOCX edits and repeated saves; rendering and editing InkML remain missing
2026-10-11 trivial M6: the eight missing bibliography styles landed (#383)
2026-10-11 trivial M7: formatting revisions landed (#41)
2026-10-11 trivial Omitted w:pPrDefault stays omitted across saves; explicit empty/default properties and later spacing edits remain writable. Synthetic preservation checks only; readiness estimates unchanged
2026-10-10 trivial M5: Draw Table and Eraser landed (#303)
2026-10-10 trivial Merged main: PRs that landed removed from the Current focus list
2026-10-10 minor Current focus heading back to ~150–230 h to beta: full number restored to the additive weighted sum (~60%), method aligned with the standard, no new evidence
2026-10-10 minor Alpha gate table added (core-workflow gate from the progress-docs standard): all six workflows pass, stage stays alpha
2026-10-10 major Created: milestones moved from ROADMAP.md with remaining hours; Current focus from gaps.md; M15–M16 added
2026-10-10 trivial M11: ink pens and eraser landed (#307)
2026-10-11 trivial M11: lasso, Add Pen, Ink to Shape and Ink Replay landed (#395)