skylar taylor-barrick 80d57189b8 archive: xml scan requires the <! prefix, skips DTD PIs, refuses UTF-16
Review findings, all reproduced before this fix:
- opens_doctype matched the keyword without requiring <! first, so the
  valid element <aDOCTYPE> was treated as a declaration: depth-capped
  documents passed under DeclarationOnly and ordinary elements were
  refused under Refuse.
- A processing instruction inside an internal subset was not skipped,
  so a ] inside it ended the subset measurement early and the rest of
  the subset escaped the byte cap.
- A UTF-16 document was silently admitted: the scan saw no ASCII
  markup at all, so a refused DTD passed. A UTF-16 BOM now returns
  UnsupportedEncoding; the caller decodes to UTF-8 first.

Each has a regression test; workspace tests, clippy -D warnings and
fmt pass.
2026-10-14 15:34:52 -06:00

Craft App Libraries

This repo contains libraries used by the various Craft Apps. It's a Rust monorepo workspace, and the libraries can be included by any Craft Apps that need them.

In the future this may grow to include non-Rust library code.

If any libraries grow beyond Craft App usage, eg. RAW format support, they may be promoted out and into their own libraries for the broader ecosystem to take advantage of.

Layout

A Cargo workspace (edition 2024, resolver 3). Each library is a crate under crates/<name>, named craft-<name>, with version, edition, license and repository inherited from the workspace (license.workspace = true, and so on) and [lints] workspace = true. Register each crate in [workspace.dependencies] in the root Cargo.toml.

Apps depend on a crate by git:

craft-<name> = { git = "https://github.com/storytold/craft-libs", rev = "<commit>" }

Libraries

  • craft-atomic: Crash-safe atomic file writing and replacement with same-directory staging, directory fsync, Apple F_FULLFSYNC fallback, transient lock backoff, and fault injection for the Craft suite.

  • craft-archive: parsing budgets for untrusted ZIP archives and XML: an allocation-free ZIP end-record/central-directory preflight, bounded entry reads with a shared byte Budget, and a one-pass XML nesting/DTD check that runs before recursive parsers.

  • craft-cms: pure-Rust ICC v2/v4 colour management: profile parsing and writing, transforms, rendering intents, black point compensation, soft proofing, gamut checks, 3D LUTs and built-in profiles (sRGB, Display P3, synthetic coated CMYK and others).

  • craft-print: PDF submission to CUPS and Windows, printer discovery, duplex/copies/colour and driver preferences. PDF generation stays in each app.

  • craft-quit: native macOS quit, egui close handling and an optional app menu. Unsaved-document decisions and save prompts stay in each app.

  • craft-settings: config.toml settings storage for every app: platform folders, portable mode and overrides, atomic saves while running, backup, damaged-file recovery and schema migrations. Policy in docs/settings-storage.md.

  • craft-ui: SVG catalogs, icon buttons, tabs, pane controls, transactional docking, print settings and theme helpers for egui frontends; assets, themes, localization and command handling stay in each app. Requires Rust 1.95 or later.

  • Shared UI component audit: source inventory, extraction priorities and compatibility boundaries across the Craft suite.

  • Theme infrastructure: eight-app comparison and the small shared widget-state styling boundary.

  • Panel docking: validated panel moves, floating groups, workspace adapters and an optional egui docking surface.

License and credits

craft-libs is dual-licensed under MIT or Apache-2.0, at your option. Copyright (c) 2026 ArtCraft Team and the craft-libs contributors. Required notices are in NOTICE.

Bundled fonts, icons, images and other assets keep their own open licenses; each one is listed with its author, source and license in ATTRIBUTION.md.

S
Description
No description provided
Readme
128 MiB
0 Stars 1 Watchers 0 Forks
Languages
Rust 97.9%
Max 1.8%
Python 0.2%