Commit Graph
1092 Commits
Author SHA1 Message Date
Dylan M. Taylor 9be9a63782 Merge pull request #426 from mockydevs/fix/path-as-rect-open-polyline
pdf reader: a five-point open polyline is not a rectangle
2026-11-02 21:53:06 -05:00
Dylan M. Taylor 69e3708e5c Merge pull request #451 from MarekSpodBiedry/issue-328
hayro-interpret: pad a missing low byte in 16-bit image data instead of panicking (#328)
2026-11-02 21:53:03 -05:00
Dylan M. Taylor 89e3bba144 Merge pull request #180 from bobbyjnichols/fix/atomic-smb-permissions
atomic: skip redundant chmod for matching replacement modes
2026-11-02 21:41:05 -05:00
Dylan M. Taylor c64d9b28f4 Merge pull request #145 from midasmatterhorn/fix/r4-settings-blank-file
settings: a blanked config.toml is no longer adopted over the loaded document
2026-11-02 21:41:02 -05:00
Dylan M. Taylor 0c332d87de Merge pull request #460 from marshiyar/fix/update-package-manager-copies
update: a package manager's copy and another app's bundle do not self-update on macOS and Windows
2026-11-02 21:39:55 -05:00
Dylan M. Taylor 0035af1539 Merge pull request #392 from Tomcatt/fix/standalone-update-whole-tree
fix(update): a standalone self-update replaces the whole tarball install
2026-11-02 21:39:39 -05:00
Dylan M. Taylor e21dfdba5d Merge pull request #481 from VoiceLessQ/fix/flatpak-bundle-reinstall
fix(update): handle a bundle Flatpak before 1.16.2 won't reinstall
2026-11-02 21:34:54 -05:00
Dylan M. Taylor 40751df9ac Merge pull request #465 from Jeremy8776/fix/msi-context-native
craft-update: read an MSI's install context without starting PowerShell
2026-11-02 21:34:50 -05:00
Dylan M. Taylor b49ce8590f Merge pull request #452 from ZIDAN44/fix/391-safe-release-link
update: the prompt opens only a safe release link; document token logging (#391)
2026-11-02 21:33:30 -05:00
Dylan M. Taylor e4108a3172 Merge pull request #513 from ljkx/update/sums-duplicate-names
update: one asset per name in SHA256SUMS.txt (#478)
2026-11-02 21:30:55 -05:00
Dylan M. Taylor 92a8f0df9f Merge pull request #514 from ljkx/update/https-only-agents
update: keep the remote HTTP agents and their redirects on HTTPS (#477)
2026-11-02 21:30:51 -05:00
Dylan M. Taylor 47c9f62530 Merge pull request #497 from benandez/p7-compound
craft-proof: flag-based compound words (COMPOUNDFLAG/BEGIN/PERMITFLAG…)
2026-11-02 20:38:11 -05:00
Martin BallandClaude Opus 5.5 22144c823a proof: licence warnings report the actual error; machine-independent English test; SuggestSteps drop note
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 00:47:39 +00:00
Martin BallandClaude Opus 5.5 3012d73c82 proof: AffixDict::build reads the stems' flags in its own function
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 00:47:28 +00:00
Martin BallandClaude Opus 5.5 f87f08a87a Merge origin/main into fix/497-coderabbit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 00:46:59 +00:00
Dylan M. Taylor b047c2f7a6 Merge pull request #496 from benandez/fu-proof-p3
craft-proof: review follow-ups (P3s from the proofing move)
2026-11-02 19:32:53 -05:00
ljkx e6189423a0 update: test Http::new's HTTPS-only setting, and keep refused links out of messages
An integration test builds the library without cfg(test), so it checks the release configuration: the remote agents refuse plain HTTP (an upper-case scheme too) without connecting, loopback links still work, and with local-mirror the remote agents take plain HTTP.

A refused hop's message names only the host. ureq's message holds the whole link, and a redirect to the file host carries a signed query. host() also drops a query and any user:password@.
2026-11-03 01:13:37 +01:00
Martin BallandClaude Opus 5.5 14cf444fcf craft-proof scowl — load_error(en-AU) also reports a failed en-GB list, which en-AU reads too (#496 review)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 23:56:09 +00:00
Martin BallandClaude Opus 5.5 3aca2642c5 craft-proof tr — the double-space rule uses space_runs; the all-languages test adds Tr, EnAu, EnCa and pt-PT (#496 review)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 23:56:09 +00:00
Martin BallandClaude Opus 5.5 aa3730352f craft-proof — en-AU comment and docs: it also takes en-GB's words (enquiry is only in the en-GB list), suggestions from en-AU (#496 review)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 23:56:09 +00:00
Martin BallandClaude Opus 5.5 3e37fbcd7e craft-proof it, pt — an object placeholder between the mark and a real closing quote keeps the narration exemption («Vai?\u{1}» disse lui.) (#496 review)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 23:56:09 +00:00
Martin BallandClaude Opus 5.5 4c8cb404ab craft-proof it — a space after the dialogue dash no longer hides the capital mark (Finì. — domani partiamo.) (#496 review)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 23:48:04 +00:00
Martin BallandClaude Opus 5.5 f3d411638d craft-proof it — the dialogue-dash exception applies after ? and ! only, so Finì. —domani partiamo. gets its capital mark again (#496 review)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 23:47:08 +00:00
Martin BallandClaude Opus 5.5 a8b3bb74c8 craft-proof it, pt — the object placeholder is not a closing quote, so Chi era?\u{1} era Marco. still gets its capital mark (#496 review)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 23:23:15 +00:00
Martin BallandClaude Opus 5.5 cb82e91428 craft-proof — a run of spaces is one double-space issue over the whole run in every language, through one shared space_runs helper (#496 review)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 23:23:15 +00:00
Martin BallandClaude Opus 5.5 7b64b78cb0 craft-proof english — Australian English also takes a word in SCOWL's en-GB list, and without SCOWL every en_AU source is read before any en_GB one (#496 review)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 23:23:09 +00:00
ljkx 240a005494 update: look SHA256SUMS.txt names up in a map, not by scanning
A 4 MiB list holds some 60,000 names, and searching the earlier entries
for each one made parsing quadratic: about 8 s for a full-size list in
a release build. A map from name to position and a set of conflicting
names make it linear again, with the same entries in the same order.
2026-11-02 23:56:02 +01:00
Martin BallandClaude Opus 5.5 5eb1710914 proof: a pack's exception word satisfies the ru/bg/tr letter check
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:59:48 +00:00
Martin BallandClaude Opus 5.5 54ac5fbc4c craft-proof — README: embedded_locales() and the SCOWL byte count match build.rs with en-AU; ru: drop an unused binding (#496 review)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:56:44 +00:00
Martin BallandClaude Opus 5.5 466919a8a5 craft-proof english — with SCOWL embedded, a dictionaries-folder en_GB no longer outranks the embedded en-AU (#496 review)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:56:44 +00:00
Martin BallandClaude Opus 5.5 d2563a77d4 craft-proof tr — te and ta are the locative suffix, not a detached particle, so kitapte is not offered as kitap te (#496 review)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:56:44 +00:00
Martin BallandClaude Opus 5.5 bd3db196a5 craft-proof es — a run of spaces is one Espacio doble issue over the whole run (#496 review)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:56:44 +00:00
Martin BallandClaude Opus 5.5 15d3c0d370 craft-proof it, pt — narration after a quoted or dashed question or exclamation is not a new sentence («Vai?» disse lui) (#496 review)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:56:44 +00:00
Martin BallandClaude Opus 5.5 61030150dc craft-proof cs, hr, it — a hyphenated word is looked up whole before its parts, and an elision (l'ex-amico) is read in each part (#496 review)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:56:44 +00:00
Martin BallandClaude Opus 5.5 6e0351f554 proof: ru is not an embedded locale by default (only ru-extra.txt is)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:46:08 +00:00
Martin BallandClaude Opus 5.5 61105d293a proof: no comma mark after ister or gerek (verb and noun uses)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:46:00 +00:00
Martin BallandClaude Opus 5.5 e91b2dbb97 proof: drop the unused binding in the pronoun-prefix arm
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:46:00 +00:00
Martin BallandClaude Opus 5.5 d279c8a99c proof: a pack's ru/bg/tr patterns need every letter of the word, else the built-in rules
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:46:00 +00:00
Martin BallandClaude Opus 5.5 83a4d73c69 proof: affix_check generators give up on a dictionary with no usable stems
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:46:00 +00:00
Martin BallandClaude Opus 5.5 7c3f45dd5e proof: skip a licence file that isn't UTF-8 instead of failing the build
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:46:00 +00:00
Martin BallandClaude Opus 5.5 9ef9185131 FU.8: craft-proof cs — regression test from wordcraft#4683: a letter that lowercases to two chars (İ) still gets its one-letter edits
The shared suggestion code already edits across the whole lowercased word, so no code change is needed; the test keeps it that way.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:43:25 +00:00
.CooCoo fa1a657476 Add craft-doc: read PhotoCraft, VectorCraft and EffectCraft documents without the apps (#404)
* Add craft-doc: read PhotoCraft, VectorCraft and EffectCraft documents without the apps

A new crate, craft-doc, reads the native files of three apps from bytes:
PhotoCraft .pcraft (a ZIP bundle), VectorCraft .vectorcraft (JSON, plain
or gzip, with the version 4 data after the JSON) and EffectCraft .ecproj
(JSON).

- sniff tells which app wrote a file from its first bytes.
- info gives the format version, the writer the file names, and whether
  the version is one the crate reads.
- renditions returns VectorCraft's preview and PDF and PhotoCraft's
  thumbnail and composite, when the file has them.
- outline returns PhotoCraft's canvas and layer tree, VectorCraft's
  artboards and top-level layers, and EffectCraft's compositions with
  their layers.

A file whose version is newer than the crate reads is refused with
Error::TooNew. Limits bound the JSON, each entry, the total bytes
decompressed and the JSON nesting, and each is checked before the bytes
it covers are allocated. ZIP entries are read by a small STORE and
DEFLATE reader in the crate. The crate depends on serde, serde_json,
thiserror and flate2 and builds for wasm32-unknown-unknown.

The tests build every document they read: JSON written by hand, PNG,
ZIP and gzip bytes assembled in the test. doc.yml runs fmt, clippy, the
tests and a wasm32 check.

* ci: do not keep the checkout token in the doc workflow

The checkout step sets persist-credentials: false, as jpeg.yml and media.yml do. No later step in the job uses the token.

* craft-doc: read each format's envelope through its format crate

craft-doc no longer keeps its own copies of the envelope types and
constants. It reads them with craft-pcraft-format (`MANIFEST`,
`FORMAT_VERSION`, `THUMB`, `COMPOSITE`, `check_manifest`),
craft-vectorcraft-format (`Head`, `Image`, `sniff`, `check`, `VERSION`,
`BLOB_MAGIC`, base64) and craft-ecproj-format (`Head::read`,
`SCHEMA_VERSION`). Its own base64 module is removed. A `.pcraft`
manifest is still read in one pass without building a
`serde_json::Value`, with the checks `read_manifest` applies. The
outlines are still read with craft-doc's read-only views of each
document, and the public API (`sniff`, `info`, `renditions`, `outline`,
`Limits`) does not change.

These inputs are now read as the format crates read them:

- A `.pcraft` manifest without `generator`, or with a `thumbnail` other
  than `thumb.png` or a `composite` other than `composite/preview.png`,
  is malformed for `renditions` and `outline`; `info` still reports its
  version. A manifest with more than 4,194,304 JSON items is refused
  with `LimitExceeded`.
- A `.vectorcraft` preview or PDF member without `mime` gives no
  rendition.
- `sniff` takes `format` only from a top-level member, so
  `{"meta":{"format":"vectorcraft"}}` is not a VectorCraft file.

tests/envelopes.rs writes a file of each format with the crates' types
and reads it through every call, and checks the inputs above.
doc.yml also runs when one of the three crates changes.

* craft-doc: sniff reads only top-level members of an EffectCraft project

`sniff` took any JSON object whose first member is `savedBy` for an
EffectCraft project when `"schema"` appeared anywhere in its first
bytes, so `{"savedBy":"1.0","metadata":{"schema":1}}` was claimed. It
now checks the top-level member names only, one at a time, without
keeping them.

* craft-doc: bound list elements with max_items; no rendition without a MIME type

Limits gains max_items (default 1,048,576): EffectCraft project items and
composition layers, VectorCraft artboards and layers, and PhotoCraft layers
at every level are counted before each one is read, and a file that lists
more gives Error::LimitExceeded. A list of empty objects within max_json no
longer expands into gigabytes of layers.

A VectorCraft preview or pdf member with an empty mime gives no rendition, as
one without a mime does; a preview may be PNG or JPEG. An EffectCraft
composition without a duration or a frame rate gets no timing instead of a
duration of 0.
2026-11-02 16:29:51 -05:00
Dylan M. Taylor 431b34ad13 Merge pull request #486 from benandez/feat/font-store-language-packs
font-store: item kind language-pack (CP4.1)
2026-11-02 15:50:29 -05:00
Dylan M. Taylor e654924da4 Merge pull request #495 from benandez/p6-coderabbit
craft-proof: fixes from CodeRabbit on the ported code
2026-11-02 15:50:14 -05:00
Dylan M. Taylor 7cd6010068 Merge pull request #485 from benandez/feat/craft-proof-packs
craft-proof: installed Language packs (CP4.2) and the CRAFT_PROOF_EMBED switch (CP4.4 prep)
2026-11-02 15:49:59 -05:00
Dylan M. Taylor 9fe3ac302f Merge pull request #484 from benandez/p6-encodings
craft-proof: decode ISO 8859-7 and ISO 8859-15 dictionaries (Greek, Estonian)
2026-11-02 15:49:45 -05:00
Dylan M. Taylor a8522229f7 Merge pull request #490 from benandez/p6-sharps
craft-proof: CHECKSHARPS (German SS for ß in capitals)
2026-11-02 15:49:30 -05:00
Dylan M. Taylor 99a8686261 Merge pull request #489 from benandez/p6-oconv
craft-proof: OCONV, and capped, indexed ICONV/OCONV tables
2026-11-02 15:49:15 -05:00
Dylan M. Taylor ba26551de2 Merge pull request #488 from benandez/p6-affix
craft-proof: NEEDAFFIX, CIRCUMFIX and FULLSTRIP (port of wordcraft#5012's engine part)
2026-11-02 15:48:59 -05:00
Dylan M. Taylor 424461499b Merge pull request #487 from benandez/p6-flags
craft-proof: FLAG num and FLAG long affix dictionaries (port of wordcraft#5142)
2026-11-02 15:48:43 -05:00