chore: sync upstream (533 Commits) #6
No reviewers
Labels
No labels
herkunft/alpha-feedback
status
blockiert
status
zu-testen
typ
bug
typ
docs
typ
enhancement
typ
feature
typ
idea
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
iris/wordcraft!6
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "chore/sync-upstream-20261022"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Upstream-Sync von
upstream/main(533 Commits). Fast-Forward.8e986366Header and footer: a click in the other band edits it there (#3557)653a2311IME: the caret follows the composition text (#3556)169581d7Merge 178 open PRs (backlog round 1) (#3555)b07e045dIntegration: #3335 header Esc test allows the half-pixel return scroll that #3201 brings6e811389Integration: #2722 English text for four labels the Dutch and Danish catalogs lack54003ebcIntegration: #2041 English text in the Polish catalog for the keys Italian gainedf2b06167Integration: #2244 VML on/off values read case-insensitively by the shape fill reader079a743eIntegration: #1832 drop a useless .into() in the end-of-document citation testeb12fc6eIntegration: cargo fmtc04d6701Integration: cargo xtask parity3f46d9c6Integration: status lines list each change once2060f86eMerge PR #3139: Fix #3137: Cannot insert a tab inside table cells (missing Ctrl+Tab shortcut)64f98d82Merge PR #2280: fix(formats): support xs:time, string-value, and case-insensitive cell types in spreadsheetsef39b78aMerge PR #2886: Recovery: keep explicit New/Open visible after startup discovery55c31bdbIntegration: #1076 English text for the keys the Slovenian catalog lacksCentimetres, millimetres and picas took their suffix from Unit::suffix() and never went through the catalog, so a Russian interface showed "2,54 cm". The suffix now comes from the catalog like "pt" already did, and a length field accepts the translated unit when typed ("3 см").Fallback put Segoe UI Symbol before Segoe UI Emoji, and Symbol has monochrome glyphs for some emoji (✅), so they drew in black and white and tests_color_glyphs failed on Windows. Characters with default emoji presentation now rank the colour emoji fonts first, both when loading a system fallback and when choosing among loaded faces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>A 2,463-entry Slovenian catalog: every key of every other catalog in the repository (built-in style names, equation gallery, paper sizes, citation styles included). Written from the meaning of the English labels in ordinary Slovenian computing vocabulary; no other product's localisation was used. Counts use count-neutral wording ("Besede: 21"), since the catalog has no dual/plural forms. - sl, sl-SI, sl_SI.UTF-8 select it automatically; "Slovenščina" in Options and ui.language with {"value":"sl"}. - The interface audit checks Slovenian coverage the way it checks Russian. - Tests: locales and saved preference, catalog coverage and key terms, count wording, and bundled fonts covering č, š, ž. - docs/localization-sl.md with conventions and terminology; parity table, README, ROADMAP and ATTRIBUTION updated.Dragging an In Line with Text picture, shape or text box now moves it within the text, as in Word: a dashed insertion cursor follows the pointer through the text, and the drop puts the object there, still inline and selected, in one undo step (Ctrl+drag drops a copy there). Before, the drop floated it with Square wrapping where it was let go, and nothing showed where it would land. arrange.bounds and arrange.copyTo take {"to": Pos} for inline objects; x/y keep their old meaning for scripts. Floating objects drag as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>Each underline style in the drop-down is now a sample of its own line, drawn in code in the theme's text colour (Single, Double, Thick, Dotted, Dashed, Dot-dash, the missing Dot-dot-dash, Wave), named for tooltips and assistive technology. Words only uses format.wordUnderline (its own Ctrl+Shift+W); None removes the underline and shows no shortcut; More Underlines… opens the Font dialog; Underline Color › offers Automatic and the theme/standard colours with More Colors…. - engine: format.underlineColor {"color": "RRGGBB" | "auto"} sets or clears CharProps::underline_color and leaves the style alone; format.state reports underlineColor; catalog row Home|Font|Underline Color (parity checklist regenerated: 490/505). - i18n: Dot-dot-dash, More Underlines… and Underline Color in all 22 catalogs (Underline Color reuses each catalog's "Underline color"). - Tests: underline_color_sets_and_clears_the_underlines_own_colour (engine, DOCX round trip, undo, junk params), underline_menu_entries_apply_their_style (UI: every sample is a named entry that applies its style; Words only, None, Underline Color › Automatic). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>Review follow-ups: the German patterns' MIT notice goes into NOTICE with the other pattern sets; the pattern reader skips other commands' arguments, so hyph-de-1996.tex's \message{} line no longer adds junk patterns and exception words; a load test for the German set; the status bar names a bare "de" tag; the docs list the languages with their own hyphenation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>`file.rename` appended the document's extension unconditionally, so `{"name": "renamed.docx"}` produced `renamed.docx.docx`. The Rename field in the ribbon edits the stem, which is why it was written that way, but a script or an agent passes a whole file name. A name that already ends in the document's extension is now taken as the whole file name, whatever its case. Anything else still gets the extension: a name that merely holds a dot (`Report.2026` -> `Report.2026.docm`), and the extension on its own (`.docm` -> `.docm.docm`), which is a stem rather than a file name. Fix: #2983The extension check counted bytes back from the end of the name and sliced there, which panics when that offset falls inside a character: (file.rename {"name": "abecde"} with a combining accent, .docm) byte index 3 is not a char boundary; it is inside 'e' (bytes 2..4) Splitting at the name's own last dot asks the same question without an arithmetic offset, and reads the same for every name. Covered for a name with no extension and one with the document's, both multi-byte.Character scale (`w:w`, Format > Font > Advanced > Scale) widens or narrows the letters themselves. WordCraft multiplied the advances but drew each glyph at its natural width, so text at 200 % looked letter- spaced (pdftotext even split it into words) and text at 50 % overlapped. - layout: `Draw::Glyphs` carries `x_scale` (1 = 100 %), the run's scale for its text and its line-end hyphen (whose advance is scaled too); list labels, tab leaders, ruby, equations and shape text keep 1. - pdf: a scaled run is drawn under a horizontal scale from its first pen position, the positions brought back so each glyph lands where the layout put it; the text and its extraction are unchanged. - render: each glyph's outline is stretched across from its pen position. Checked against Word for Microsoft 365, "HIHIH" in Arial 20 pt (Liberation Sans here), right end of the word (pdftotext) and ink: 200 % Word 179.78, ink 73.92..176.52; before: split in three words, ink to 163.68; after 179.74, ink 74.04..176.52 150 % Word 152.19; after 152.52 50 % Word 97.76; after 98.07 100 % unchanged Test: in the PDF, letters at 200 % are drawn twice as wide and as high, at pen positions twice as far apart; at 100 % unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>Word's text watermark is a VML WordArt shape (`PowerPlusWaterMarkObject`) whose `v:textpath fitshape` stretches the text over the shape's box (its `style` width and height), centred on the margins and, when diagonal, turned by `rotation:315`. WordCraft ignored the box: it drew the text 70 % of the page diagonal wide (half of it on screen), centred on the page and along the page diagonal (55° on A4, not 45°). A "BROUILLON" watermark in a 515 x 104 pt box came out about 1.4 times as large as in Word. - doc: `Watermark::size`, the shape's box (`None`: Word's default, half the page diagonal across, as high as the text's length makes it); `Watermark::frame` gives the box for a page, shared by the writer and the renderers. - docx: the box is read from the shape's style and written back; a box equal to the default for the document's page reads as `None`, so a watermark made by Design > Watermark keeps following the page. - pdf, render: the text's advance spans the box's width, its em the box's height, the em's foot (the font's win descent below the baseline) on the box's bottom; the box centred on the margins, turned 45° counterclockwise when diagonal. Checked against Word for Microsoft 365 (ink bounds, pt, left top right bottom; fonts here: Liberation Sans for Arial and Calibri, Liberation Serif for Times New Roman): BROUILLON, Calibri, 515.4 x 104.1, 315°: Word 93.6 222.7 489.1 619.2; before 60.5 110.4 535.7 732.5; after 90.7 214.1 495.8 618.7 SPECIMEN, Arial, 400 x 100, 315°: Word 136.3 261.6 455.0 580.3; before 66.7 108.5 539.0 727.7; after 137.8 255.4 454.6 573.1 HXH, Arial, 300 x 100, flat: Word 158.9 378.2 436.3 449.8; before 105.1 353.8 490.1 489.6; after 158.9 380.2 435.8 449.3 HXH, Times New Roman, 300 x 100, flat: Word 149.8 383.0 445.0 449.3; after 151.2 383.5 443.5 449.3 COPIE, Calibri, 300 x 80, flat: Word 153.1 387.8 441.1 440.2; before 96.0 373.9 500.2 469.0; after 152.2 387.4 443.5 444.5 Tests: a watermark with a box of its own is written and read back with it, Word's default box reads back as none; in the PDF, the text of a 300 x 80 pt watermark is 80 pt high, stretched across, starting at the box's left edge on the margins' centre line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>w:tblPrChange/w:trPrChange/w:tcPrChange/w:sectPrChange) 12bb1039d1installed_dictionaries() never included Russian or Czech at all, because neither crates/proof/src/ru nor crates/proof/src/cs had an installed_path() function for it to call (every other proofed Hunspell language — Polish, Portuguese, Italian, Croatian, Turkish, Indonesian — already did). File > Options > Proofing's dictionaries list iterates installed_dictionaries() directly, so Russian and Czech never showed up there at all, installed or not, matching the report. Added installed_path() to both modules, mirroring the existing pattern (crate::hunspell::find(NAMES).map(|(_, dic)| dic)), and added both to installed_dictionaries(). The actual spell-checking dispatch (is_correct_in_with) already routed Russian and Czech correctly — confirmed by installing the real system ru_RU Hunspell dictionary and checking it directly (ru::is_correct("молоко") true, ru::is_correct("малоко") false), so that part of the pipeline isn't what's broken. The reporter's other symptom (Russian text in the document not being checked at all) did not reproduce with the real dictionary installed; I could not pin that part down further without more specific repro details from their setup. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>The engine.execute row listed the UI commands with unescaped "|" inside code spans ("system"|"on"|"off", true|false, ...). GitHub-flavoured Markdown splits table cells on every unescaped pipe, code spans included, so the row came out as 32 cells in a 3-column table and was cut off. A second, older engine.execute row duplicated it with a shorter command list. The two rows are now one: the current row, with ui.contextMenu (only in the older row) added. Every "|" inside its code spans is escaped as "\|", which GitHub shows as "|". Every row of the file's tables now has its header's number of cells. Nothing else changes.Taking the definitions out before the blocks are parsed read each line without the structure around it, and two kinds of line were deleted that the author wrote as text. A link reference definition has to start a block (CommonMark 4.7: one cannot interrupt a paragraph), so Status update [Warning]: unstable more text came through as "Status update more text". The line is taken only after a blank line, at the start of the document, after a heading or thematic break, or after another definition. Anywhere else it stays and reads as text, which is what it did before definitions were understood at all: a missed definition shows the link's own text, while deleting a line that was part of a paragraph loses it with nothing to show. Fences opened and closed by their own rules, which were not the block parser's, so a line that is code there was a definition here: ``` ```rust [foo]: /bar ``` An info string means ```rust does not close a fence, but this pass thought it did and deleted the next line from the code block. Four spaces of indentation is code rather than a fence, on both sides, so an indented ``` no longer swallows the definitions that follow it. Both halves have a control in the test: without the block rule the paragraph comes back as "Status update more text", and without the fence rules the code block comes back as "```rust\nSee foo.".`now_ms` in layout, `now_unix` in engine, formats and pdf gated `js_sys::Date::now()` on `target_arch = "wasm32"`, which also matches wasm32-wasip1 and wasm32-wasip1-threads. There js-sys has no host to call, so it panics ("cannot call wasm-bindgen imported functions on non-wasm targets"), and since `layout()` times itself with `now_ms`, every document laid out on WASI aborts. `std::time` works on WASI, so these now use the browser clock only on wasm32-unknown-unknown, the gate wordcraft-docx already uses.A list label is shaped with `Dir::Guess`, so a label of digits and brackets has no run the shaper sees as right to left; the clusters were then reordered for the right-to-left paragraph and the brackets drawn unmirrored, so "(%1)" came out ")1(", as #2916 reports. The label is shaped with the bidi levels of its own text now, as the paragraph body and the atomic objects already are, so UAX #9 L4 mirrors the brackets of the runs the levels report as right to left; the visual reorder the paragraph direction asks for stays. A "1." label is unchanged.The font name box and the font size box announced themselves as bare "edit" controls, and the dropdown arrows beside them as bare "button" controls: a screen reader had nothing to say about them. The combo helper names its field with the hint it already shows, and its arrow with the same "{name} options" the split buttons' arrow uses; the split button's arrow now says whose options it opens. No new strings: every name is one the widget already shows. Measured the way #3172 measured it — every keyboard-focusable element of the Home tab and its name: 43 of the 111 had no name before, 31 after.Word's date-time instructions accept either case for day and year. Uppercase codes now format instead of being copied literally. 🤖 Generated with Codebuff Co-Authored-By: Codebuff <noreply@codebuff.com>Word's lowercase hh instruction shows a leading zero, just like HH. Single-digit 12-hour values now format as 05 rather than 5. 🤖 Generated with Codebuff Co-Authored-By: Codebuff <noreply@codebuff.com>crates/ui-egui/src/i18n/{de,et,ja,pt-br,sr,sr-latn,uk,zh-hans,zh-hant}.tsv: union by key, no duplicates. docs/localization-parity.md: main's status line with this change added; both progress-log rows.