Commit Graph
4852 Commits
Author SHA1 Message Date
dotCooCoo e22a6362cc Compose: list every case that composes a story whole in gap 20
docs/gaps.md now lists the same cases as docs/architecture.md and
reuse::plain. A doc comment on rejoin says that a run style an edit uses
for the first time stops the reuse until the old composition reaches the
same style at the same index.
2026-11-12 06:53:12 -08:00
dotCooCoo ba81cb05e9 Compose: an edit composes only the paragraphs it can change
Every edit of a story composed it from its first paragraph, so a typed
character in a long threaded story cost as much as laying out the whole
story: 456 ms in a story threaded over 300 pages.

A composition that lays every paragraph once keeps its state before each
paragraph. After an edit, composing starts one paragraph above the first
changed one, in the kept state and with the lines above copied. It stops
at the first unchanged paragraph it reaches in the state kept for that
paragraph, and copies the lines from there on with their story offsets
moved by the length of the edit.

- The cache does this when only the story differs from its entry.
- Composed whole as before: stories with footnotes, endnotes, tables,
  anchored objects, named lists, tracked deletions, balanced columns,
  vertical justification other than Top, column rules, type on a path,
  spanning or split paragraphs, paragraph borders or shading, and a
  layout that goes back over a paragraph (keep options).
- An edit that moves lines into other frames is composed to the end of
  the story.

In a 240-paragraph story a typed character composes 3 paragraphs
(240 before).

Docs: docs/architecture.md, docs/gaps.md (gap 20), ROADMAP.

Refs #2298
2026-11-12 06:21:26 -08:00
autocraft-bot[bot] a17fb5d3d8 Merge pull request #2341 from Hamza0101/fix/datamerge-fields-in-tables
Data Merge: a field in a table cell goes into the cell and is filled (#2315)
2026-11-12 12:00:52 +00:00
autocraft-bot[bot] 424d08d935 Merge main into fix/datamerge-fields-in-tables 2026-11-12 11:38:19 +00:00
Dylan M. Taylor 027bbae9cb Engine: index style, tag, swatch and run lookups; bound polygon sides, Change All and spelling candidates
* fix(engine): index lookups that were quadratic in a document's styles, tags, swatches and runs

* address review: first swatch per name in book sync; bound spelling input before collecting

* address review: keep the last source style per name in book sync; bound GREP replacement bytes while generating them

* address review: write GREP replacements into a byte-bounded buffer; gate keep_last test off wasm

* merge main into fix/sec-engine-linear-lookups

* address review: make the suggestion length-cap test deterministic
2026-11-12 06:28:15 -05:00
Dylan M. Taylorandautocraft-bot[bot] ff0463e299 Exports: leave out text the page doesn't show (inherited conditions, deletions, hidden layers)
* fix(export): leave out text hidden by inherited conditions or deletion in every exporter

* address review: skip hidden frames in page text and hidden article items; first visible paragraph as nav label; read table anchor's own format

* address review: skip nonprinting frames and non-printable layers in fixed-layout page text

* Apply review fixes

- crates/epub/src/html.rs
- crates/engine/src/cmd/export/formats.rs

* Apply review fixes

- crates/epub/src/html.rs
- crates/engine/src/cmd/export/formats.rs

* address review: fixed-layout page text skips frames in inactive object states

* address review: place a threaded story at its first shown frame; skip it only when every frame is hidden

---------

Co-authored-by: autocraft-bot[bot] <354215646+autocraft-bot[bot]@users.noreply.github.com>
2026-11-12 06:28:07 -05:00
Dylan M. Taylorandautocraft-bot[bot] b7174dc92d Engine: bounded DTD validation, compound-path hole orientation
* dtd: bounded matching steps, element depth and problem count

* address review: stop DTD matching when a step charge fails; refuse hole orientation past its budget

* Apply review fixes

- crates/engine/src/dtd.rs

---------

Co-authored-by: autocraft-bot[bot] <354215646+autocraft-bot[bot]@users.noreply.github.com>
2026-11-12 06:27:59 -05:00
Dylan M. Taylorandaiongg 568f25fa9f Fonts: cap decoded names, bound outline flattening, cache fallback coverage
* fonts: cap decoded names, outline flatten tolerance by size, coverage cache for system fallback

* Apply review fixes

- crates/fonts/src/fontdb/system.rs
- crates/fonts/src/fontdb/names.rs

* Apply review fixes

- crates/fonts/src/fontdb/system.rs

* address review: cap flattened edges in has_serifs

* address review: check alias blankness before capping

---------

Co-authored-by: aiongg <67543387+aiongg@users.noreply.github.com>
2026-11-12 06:27:53 -05:00
Dylan M. Taylor 665fe2a8e4 Format: a failed entry read counts against the archive budget
* format: bytes a failed entry read inflated count against the archive budget

* address review: mutate the payload bytes explicitly in the checksum test

* address review: charge a failed read to the budget it belongs to (stored vs deflated)
2026-11-12 06:27:47 -05:00
Dylan M. Taylor 26d5c8941c IDML: story export and object-style overlay in linear time, embedded image budget
* idml: story runs and marker offsets found once, object-style overlay by position, embedded image budget

* address review: saturating embedded-bytes counter

* address review: IDML export past the embed limit succeeds and warns for each image written as a link

* address review: an unlinked image is always embedded, only linked ones fall back to their link
2026-11-12 06:27:41 -05:00
Dylan M. Taylor a41fc046f3 Data merge: a record range stops expanding once the limit is met
* Data merge: a record range stops expanding once the limit or the record count is met
2026-11-12 06:27:35 -05:00
Dylan M. Taylor eb0ea78d9a Images: a WebP with an ICC chunk longer than the file is read without its profile
* Images: a WebP whose ICC chunk declares more than the file holds is read without it
2026-11-12 06:27:29 -05:00
Dylan M. Taylorandautocraft-bot[bot] 23465223bc xtask: refuse an oversized corpus archive before extracting it
* xtask: refuse a corpus archive that expands past the cap before extracting it

* address review: a within-cap answer needs tar to exit successfully

* Apply review fixes

- xtask/src/main.rs

---------

Co-authored-by: autocraft-bot[bot] <354215646+autocraft-bot[bot]@users.noreply.github.com>
2026-11-12 06:27:24 -05:00
Dylan M. Taylor f87c24a1cd PPTX export: bound the retained glyph-to-character maps
* PPTX export: keep only the last four faces' glyph-to-character maps
2026-11-12 06:27:18 -05:00
.CooCoo 6fff5328eb Tests: type.align refusal cases name the check that refuses each (#2662)
Follows #2645. Its test said a misspelled key used to apply Align Left.
Only empty params and a bare string did; the parameter check already
refused a misspelled key, and the value parser refused an unknown
value. Each case now asserts the refusal message it gets.
2026-11-12 04:52:41 +00:00
.CooCoo b284052acc Type: type.align without a value is an error (#2645)
type.align with no `align` key applied Align Left, so a call that
misspelled the key, or passed a bare string, changed the paragraphs to
left alignment instead of failing. The command now returns an error,
leaves the text unchanged and records no undo step. A named value still
applies, and `align: null` still removes the override.
2026-11-12 01:30:21 +00:00
Dylan M. Taylor 27d8eabb10 Render: clamp the blur size before the filter planner squares it (#2640)
* Render: a blur size is clamped to 1,000,000 pt before the filter planner squares it

* address review: bound effect extents and sigma before spread, padding and reach arithmetic
2026-11-12 00:33:50 +00:00
FredApps 4bdc036769 CI: nightly release dry run (#2633)
release.yml also runs nightly on main with craft-common-actions' dry-run: every release build
except macOS, with nothing signed, pushed or drafted. Breakage that only the release build hits
(riscv64, Flatpak, FreeBSD, packaging) then shows up the next morning instead of on release
day, as it did on 11 Nov 2026.
2026-11-11 23:03:58 +01:00
Dylan M. Taylorandaiongg d6a09639bf Repagination, IDML swatch import and style folders: linear work, bounded depth (#2237)
* Repagination, swatch import and style folders: linear page numbers, resumed duplicate suffixes, bounded folder depth

* fix Section initializer after merging main

---------

Co-authored-by: aiongg <67543387+aiongg@users.noreply.github.com>
2026-11-11 16:21:23 -05:00
Dylan M. Taylorandaiongg dc9eea2695 Small bounds: outline simplification, table row insertion, note ids, xtask stats (#2232)
* fix: iterative outline simplification, bulk row insertion, linear note ids, no symlink walking in xtask stats

* Apply review fixes

- crates/doc/src/tests.rs
- crates/geom/src/trace.rs

* Apply review fixes

- crates/geom/src/trace.rs

* address review: cover a maximal note id in tests, format trace test

---------

Co-authored-by: aiongg <67543387+aiongg@users.noreply.github.com>
2026-11-11 16:20:58 -05:00
eba00a0dec Opening documents: index lookups in Document::check and the format-1 style upgrade (#2218)
* fix(doc): index items, threads and styles when opening a document

* Apply review fixes

- crates/doc/src/tests.rs

* address review: borrow style names in pin_para_default

---------

Co-authored-by: aiongg <67543387+aiongg@users.noreply.github.com>
Co-authored-by: autocraft-bot[bot] <354215646+autocraft-bot[bot]@users.noreply.github.com>
2026-11-11 16:20:34 -05:00
Dylan M. Taylorandaiongg 15bea9fa7a Tagged Text, RTF, EPUB classes and PDF layers: lookups by set or map instead of list searches (#2212)
* fix: index style, font, class and layer name lookups in exporters and importers

* Apply review fixes

- crates/epub/src/css.rs

---------

Co-authored-by: aiongg <67543387+aiongg@users.noreply.github.com>
2026-11-11 16:20:09 -05:00
Dylan M. Taylorandaiongg 5a3507510e File reads: refuse devices and pipes, cap whole-file reads (#2227)
* fix(engine): whole-file reads take regular files only, up to the format limit

* Apply review fixes

- crates/engine/src/io.rs

* Apply review fixes

- crates/engine/src/io.rs

* Fix failing CI check

- crates/engine/src/io.rs

* address review: refuse to save an encoded document longer than the open limit

* address review: open files for reading without blocking (FIFOs, stream-backed pseudo-files)

---------

Co-authored-by: aiongg <67543387+aiongg@users.noreply.github.com>
2026-11-11 16:19:45 -05:00
Dylan M. Taylorandaiongg 8d59590449 Package: copy each font as it was loaded, check read roots, number duplicate names in one pass (#2208)
* fix(engine): package fonts from their loaded bytes under the read roots

* address review: a font's own file is neither overwritten nor packaged when it changed since loading

* Apply review fixes

- crates/engine/src/cmd/package.rs

* address review: compare packaged font file in fixed-size chunks

---------

Co-authored-by: aiongg <67543387+aiongg@users.noreply.github.com>
2026-11-11 16:19:20 -05:00
Dylan M. Taylorandaiongg cfd99ba9b5 Automation roots: compare paths exactly; recovery reads only regular entry files (#2205)
* fix(engine): exact root containment and regular-file recovery entries

* Apply review fixes

- crates/engine/src/recovery.rs

---------

Co-authored-by: aiongg <67543387+aiongg@users.noreply.github.com>
2026-11-11 16:18:55 -05:00
Dylan M. Taylorandaiongg 34f24a4d2a Gradients: expand midpoint stops in linear time (#2214)
* fix(color): sample gradients by binary search when expanding midpoints

* Apply review fixes

- crates/color/src/gradient.rs

* Apply review fixes

- crates/color/src/gradient.rs

* Fix failing CI check

- crates/color/src/gradient.rs

---------

Co-authored-by: aiongg <67543387+aiongg@users.noreply.github.com>
2026-11-11 16:18:31 -05:00
Dylan M. Taylor eba5b9f845 datamerge: all further pages in one insertion, page lookups by start index (#2279) 2026-11-11 16:18:07 -05:00
Dylan M. Taylorandautocraft-bot[bot] c684db5428 Tools: selection bounds in one walk, bounded smart spacing and parent snapping (#2260)
* tools: selection bounds in one walk, caps on smart-spacing boxes and parent occurrences

* Apply review fixes

- crates/tools/src/lib.rs

* address review: iterative selection walk; stop collecting spacing boxes at the cap

---------

Co-authored-by: autocraft-bot[bot] <354215646+autocraft-bot[bot]@users.noreply.github.com>
2026-11-11 16:17:42 -05:00
Dylan M. Taylorandautocraft-bot[bot] 79d7a912f1 Strokes: cap the points a wavy or hashed stroke places along a path (#2188)
* Strokes: cap the points a wavy or hashed stroke places along a path

* address review: zero-length quadratic contributes no length in stroke samples

* Fix failing CI check

- crates/geom/src/stroke_style.rs

* Fix failing CI check

- crates/geom/src/stroke_style.rs

---------

Co-authored-by: autocraft-bot[bot] <354215646+autocraft-bot[bot]@users.noreply.github.com>
2026-11-11 16:17:18 -05:00
Dylan M. Taylorandautocraft-bot[bot] 589f5ff8a3 Engine: Erase and Smooth search each distinct drag sample once (#2272)
* engine: Erase/Smooth look at each distinct drag sample once, thinned past 4096

* Apply review fixes

- crates/engine/src/cmd/anchors.rs

* address review: decide whether a drag touched the path on every distinct sample, then thin

---------

Co-authored-by: autocraft-bot[bot] <354215646+autocraft-bot[bot]@users.noreply.github.com>
2026-11-11 16:16:54 -05:00
Dylan M. Taylorandaiongg bcbc3ed424 Story: appending text no longer scans every run and the whole prefix (#2245)
* doc: appending to a story extends the last run, no scans

* Apply review fixes

- crates/doc/src/story.rs

---------

Co-authored-by: aiongg <67543387+aiongg@users.noreply.github.com>
2026-11-11 16:16:29 -05:00
Dylan M. Taylor ed3f45a57a render: cap the blend-area growth rounds, one name per optional-content layer (#2257) 2026-11-11 16:16:04 -05:00
Dylan M. Taylor 94c6798577 swatches panel: group membership and row lookups by name map (#2262) 2026-11-11 16:15:39 -05:00
.CooCoo 513f77b88e Tables: commands given a table id run with nothing in a table selected (#2607)
* Tables: commands given a table id run with nothing in a table selected

Table commands whose params list `story?` and `table?` (table.insertRow,
table.deleteColumn, table.options, the Convert Rows commands and the
others) were refused with "place the insertion point in a table" when the
call named the table but the selection was not in one. A call that passes
`table` now acts on that table whatever is selected. A table that is not
in the document, or not in the given `story`, is refused, and a `story`
that is not a non-negative integer is an error.

The menus are unchanged: with nothing in a table selected, the table
items stay disabled, and calls that name no table are still refused.

* Tables: a bad story is refused whether or not a table is selected

A call that names a table with a story that is not a non-negative integer (a string, a negative number, a fraction or null) was refused only when nothing in a table was selected. With a table selected, the command ignored the story and acted on the named table. Both paths now read story with one helper and refuse it the same way.

* Tables: an edit to a named table keeps a caret in footnote text

With the caret in footnote text, a table command that names a table
runs, and the edit cleared the caret's footnote address, so the next
typing went into the story. clamp_selection now leaves footnote
addresses alone, as in_cell does.
2026-11-11 19:56:37 +00:00
Dylan M. Taylor 00d3b31ccf chore: bump version to 0.20.1 for the Flatpak update fix (#2629) 2026-11-11 14:55:49 -05:00
Dylan M. Taylor 19815eba4a Fix Flatpak permissions for update checks and self-updates (#2626)
* fix(flatpak): allow release checks and self-update helpers

* test: keep Flatpak permission parsing within strict Clippy rules
2026-11-11 14:24:07 -05:00
Dylan M. Taylor da740d44cf Merge pull request #2622 from storytold/chore/craft-update-6e03f65
Updates: take craft-update from craft-libs main at 6e03f65bf
2026-11-11 12:44:02 -05:00
Dylan M. Taylor 5df1707f0e Updates: take craft-update from craft-libs main at 6e03f65bf 2026-11-11 12:43:55 -05:00
Dylan M. Taylor 4698331d15 ci: run Harden-Runner on every job (#2621)
Adds step-security/harden-runner (audit, pinned to v2.22.4 like
craft-common-actions) as the first step of each job that did not have it,
so every workflow in the org's public repos reports its egress to
StepSecurity. Audit, not block: block-mode allow lists come from each
job's observed traffic.
2026-11-11 12:10:37 -05:00
FredApps 65bac1f1fa Release: DesignCraft v0.20.0 (#2603) 2026-11-11 16:40:22 +01:00
FredApps c64378ded9 Merge pull request #1936 from ashokram-si/feat/spread-spine-line-1838
Canvas: a spine line where the pages of a spread meet (#1838)
2026-11-11 07:57:58 +01:00
autocraft-bot[bot] 276716cada Merge pull request #2233 from storytold/fix/sec-engine-runaway-loops
Engine: variable deletion and merge-marker scans that end, a depth and step budget for nested scripts
2026-11-11 05:35:09 +00:00
Dylan M. Taylor edd2f24bb0 address review: cap whole-reference strings and the resolved parameters of a step; range adjustment uses the inserted length 2026-11-11 05:11:14 +00:00
Dylan M. Taylor c85f7425a4 address review: build unvar value only when an instance exists; check interpolation length before copying; bound the limit-error preview 2026-11-10 21:48:57 -05:00
aiongg ef82d650db Fix failing CI check
- crates/engine/src/script.rs
2026-11-10 21:47:43 -05:00
aiongg 95acc4d47e Apply review fixes
- crates/engine/src/cmd/variables.rs
2026-11-10 21:47:43 -05:00
aiongg d0683224ca Apply review fixes
- crates/engine/src/cmd/variables.rs
- crates/engine/src/cmd/variables/tests.rs
- crates/engine/src/script.rs
2026-11-10 21:47:43 -05:00
Dylan M. Taylor e8f162ea9f fix(engine): end runaway loops in variable deletion, data-merge markers and nested scripts 2026-11-10 21:45:28 -05:00
skylar taylor-barrick 576e35b508 Merge pull request #1030 from midasmatterhorn/fix/r4-eps-tiff-preview-offsets
images: test WMF-only DOS EPS preview handling
2026-11-10 20:49:04 +01:00
skylar taylor-barrick c2211e0f41 Merge pull request #1161 from y-az/feat/anchored-text-frames
Anchored text frames: own stories and ids through copy, paste, duplicate, release and delete
2026-11-10 20:48:08 +01:00