Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion ATTRIBUTION.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

Every asset PdfCraft includes, bundles or uses to build its published material, with its author, source and licence. The policy is in [AGENTS.md](AGENTS.md) §1. The machine-readable list, with SHA-256 hashes, is [ATTRIBUTION.toml](ATTRIBUTION.toml). Licence texts are kept beside the assets and summarised in [NOTICE](NOTICE).

## In this repository (272)
## In this repository (273)

| Asset | Title | Author | Licence | Source | Used for |
|---|---|---|---|---|---|
Expand Down Expand Up @@ -278,6 +278,7 @@ Every asset PdfCraft includes, bundles or uses to build its published material,
| `crates/sign/tests/data/x509-rsa-sha1.pdf` | One-page PDF with a legacy adbe.x509.rsa_sha1 signature by the RSA test key | PdfCraft contributors | MIT OR Apache-2.0 | Contributor-original: hand-written PDF objects; signature made with `openssl dgst -sha1 -sign` over its byte ranges (see crates/sign/tests/data/README.md) | Signature validation tests (crates/sign/tests/pdf.rs): the legacy adbe.x509.rsa_sha1 format |
| `assets/icons/monitor.svg` | Lucide icon "monitor" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/monitor.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs |
| `crates/ui-egui/src/i18n/vi.tsv` | Vietnamese interface translation catalog | PdfCraft contributors | MIT OR Apache-2.0 | Contributor-original: clean-room translations of PdfCraft's English UI labels; PhotoCraft and VectorCraft Vietnamese catalogs used only as translation memory when English source and semantic context matched; original catalog reviewed by a native Vietnamese-speaking contributor; 2026-10-15 coverage additions are AI-assisted and not separately native-reviewed | Vietnamese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs |
| `crates/ui-egui/src/i18n/dv.tsv` | Dhivehi interface translation catalog | PdfCraft contributors | MIT OR Apache-2.0 | Contributor-original: clean-room, AI-assisted translations of PdfCraft's English UI labels into Dhivehi (Thaana script), written from the meaning of the English text; not yet reviewed by a native Dhivehi speaker | Dhivehi UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs |
| `crates/ui-egui/src/i18n/sl.tsv` | Slovene interface translation catalog | PdfCraft contributors | MIT OR Apache-2.0 | Contributor-original: clean-room translations of PdfCraft's English UI labels, no proprietary localisation resources | Slovene UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs |
| `vendor/vello_common/assets/probe.png` | vello_common probe reference image (rendered from probe.rgba) | Linebender vello contributors | MIT OR Apache-2.0 | vello_common 0.0.8 (crates.io), vendored in vendor/vello_common; regenerated by its vello_sparse_tests regenerate_probe_reference binary | Reference picture of the vendored vello_common probe module, for people only; the build reads probe.rgba, not this file |

Expand Down
11 changes: 11 additions & 0 deletions ATTRIBUTION.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3354,6 +3354,17 @@ kind = "translation"
usage = "Vietnamese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "95b5fc6d10f7bc8371688772741870448de716fa2dd9af62fdfe4e009d269b45"

[[asset]]
path = "crates/ui-egui/src/i18n/dv.tsv"
title = "Dhivehi interface translation catalog"
author = "PdfCraft contributors"
source = "Contributor-original: clean-room, AI-assisted translations of PdfCraft's English UI labels into Dhivehi (Thaana script), written from the meaning of the English text; not yet reviewed by a native Dhivehi speaker"
licence = "MIT OR Apache-2.0"
licence_file = "LICENSE-MIT"
kind = "translation"
usage = "Dhivehi UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs"
sha256 = "b6b3ffea210119a9acf4bfa4c05c03bddfabdce7c1e6cfd5ce2ba818ded12929"

[[asset]]
path = "crates/ui-egui/src/i18n/sl.tsv"
title = "Slovene interface translation catalog"
Expand Down
1 change: 1 addition & 0 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ Ranked; detail and the full milestone table in [docs/roadmap.md](docs/roadmap.md
- **2026-10-18 (M3, #3149):** Page replacement cancels render demand collected for the previous geometry; all viewer raster upload paths reject empty or oversized textures before cache eviction. Synthetic regressions reproduce the reported 1880×2350 upload at a 2048 limit, retain cached images and unsaved edits, and resume bounded backdrops and tiles. Estimates unchanged.
- **2026-10-19 (M3, #3360):** Switching between Read and the docking workspace retains the current document’s scroll position at fixed zoom, including within-page position; separate tabs retain their own offsets. Estimates unchanged.
- **2026-10-18 (M8, #1350):** Integrated current main while preserving content-stream comment boundaries. Hidden-text cleanup retires unused named replacement descriptions on rewritten pages and forms, including inherited/shared resource holders, without removing descriptions still used by surviving content. Synthetic saved-byte and preservation regressions cover the cleanup. Estimates unchanged.
- **2026-10-19 (M14, Dhivehi localization):** Added Dhivehi (`dv`, ދިވެހި) as a right-to-left interface and date language: a 2,674-entry Thaana catalog covering every key of the other catalogs (`plural_none`, display order at load like Arabic), Gregorian month and weekday names, and the craft-fonts `Thaa` face (Noto Sans Thaana) in the interface font stack and the web build. AI-assisted; native-speaker review outstanding. Releases need the pinned craft-fonts revision bumped to one with the Thaana face.
- **2026-10-17 (M4, #2997):** Dragging page thumbnails in the Organize grid with Ctrl held (Option on macOS) drops copies at the gap instead of moving the pages: a "+" badge sits by the pointer, the copies land at the gap selected, and one undo step ("Duplicate pages") takes them out again. `page_duplicate` takes `at` (1-based, where the first copy goes; left out, after the last of them) so agents can drive the same thing, and the UI control channel's `ui.drag` modifiers now reach gestures that read the input state. Estimates unchanged.
- **2026-10-15 (M6, AcroForm XML text):** Plain AcroForm XML imports retain all direct text around comments and processing instructions, including CDATA and character references. Synthetic regressions verify exact values and unknown catalog data after incremental and full save/reopen. Nested-element and XFA interpretation are unchanged. Estimates unchanged.
- **2026-10-15 (M6, #1917 refresh):** Integrated upstream `99941daa` while retaining the XML/XFDF attribute whitespace correction and all upstream progress. Only independent documentation conflicts required resolution; focused production and test files are unchanged from the previously green CI head. Estimates unchanged.
Expand Down
11 changes: 10 additions & 1 deletion crates/engine/src/dates.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,12 @@ const ZH_DAYS: [&str; 7] = ["星期日", "星期一", "星期二", "星期三",
const AR_MONTHS: [&str; 12] = ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"];
const AR_DAYS: [&str; 7] = ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"];

const DV_MONTHS: [&str; 12] = ["ޖަނަވަރީ", "ފެބްރުއަރީ", "މާޗް", "އޭޕްރިލް", "މޭ", "ޖޫން", "ޖުލައި", "އޯގަސްޓް", "ސެޕްޓެމްބަރ", "އޮކްޓޫބަރ", "ނޮވެމްބަރ", "ޑިސެމްބަރ"];
const DV_DAYS: [&str; 7] = ["އާދިއްތަ", "ހޯމަ", "އަންގާރަ", "ބުދަ", "ބުރާސްފަތި", "ހުކުރު", "ހޮނިހިރު"];

/// The languages month and weekday names can be written in (Preferences ▸ Date format ▸ Language):
/// the interface languages, in the same order and with the same names.
pub static DATE_LANGUAGES: [DateLanguage; 23] = [
pub static DATE_LANGUAGES: [DateLanguage; 24] = [
DateLanguage {
code: "en",
name: "English",
Expand Down Expand Up @@ -398,6 +401,10 @@ pub static DATE_LANGUAGES: [DateLanguage; 23] = [
days: ["Chủ Nhật", "Thứ Hai", "Thứ Ba", "Thứ Tư", "Thứ Năm", "Thứ Sáu", "Thứ Bảy"],
days_short: ["CN", "T2", "T3", "T4", "T5", "T6", "T7"],
},
// Dhivehi: the Gregorian months by their Dhivehi names; like Arabic, no shorter written forms.
DateLanguage {
code: "dv", name: "ދިވެހި", months: DV_MONTHS, months_with_day: None, months_short: DV_MONTHS, days: DV_DAYS, days_short: DV_DAYS
},
];

/// The date language for `code` (any case), or `None` when there's none.
Expand Down Expand Up @@ -698,6 +705,8 @@ mod tests {
assert_eq!(in_lang("ddd d mmm", "it"), "sab 7 mar");
assert_eq!(in_lang("dddd, d mmmm", "te"), "శనివారం, 7 మార్చి");
assert_eq!(in_lang("dddd, d mmmm", "ar"), "السبت, 7 مارس");
assert_eq!(in_lang("dddd, d mmmm yyyy", "dv"), "ހޮނިހިރު, 7 މާޗް 2026");
assert_eq!(date_language("DV").map(|l| l.name), Some("ދިވެހި"));
assert_eq!(in_lang("yyyy\\年mmmmd\\日 dddd", "ja"), "2026年3月7日 土曜日");
assert_eq!(in_lang("yyyy\\年mmmmd\\日 dddd", "zh-hans"), "2026年三月7日 星期六");
assert_eq!(in_lang("ddd", "zh-hant"), "週六");
Expand Down
12 changes: 9 additions & 3 deletions crates/fonts/build.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
//! Embeds the fonts of the optional craft-fonts build input (`CRAFT_FONTS_DIR`) as `CRAFT_FONTS`.
//! The recipe is craft-fonts' `docs/integration.md`; unset, `CRAFT_FONTS` is empty. It only reads
//! the local checkout (no network). On wasm32 it embeds only the UI faces (BIZ UDPGothic Regular
//! and any `Arab`, `Telu`, `Hebr` or `Thai` face), to keep the web build within hosting limits (Cloudflare Pages:
//! and any `Arab`, `Telu`, `Hebr`, `Thai` or `Thaa` face), to keep the web build within hosting limits (Cloudflare Pages:
//! 25 MiB per file).

use std::fmt::Write as _;
Expand Down Expand Up @@ -55,8 +55,14 @@ fn craft_fonts(dir: &std::path::Path) -> Result<String, String> {
let telugu = scripts.split(',').any(|s| s.trim() == "Telu");
// And the Hebrew ones (small), for Hebrew text and Edit text on the web.
let hebrew = scripts.split(',').any(|s| s.trim() == "Hebr");
let web_face =
(*family == "BIZ UDPGothic" && *style == "Regular") || arabic || telugu || hebrew || scripts.split(',').any(|s| s.trim() == "Thai");
// And the Thaana ones (small), for the Dhivehi interface.
let thaana = scripts.split(',').any(|s| s.trim() == "Thaa");
let web_face = (*family == "BIZ UDPGothic" && *style == "Regular")
|| arabic
|| telugu
|| hebrew
|| thaana
|| scripts.split(',').any(|s| s.trim() == "Thai");
if wasm && !web_face {
continue;
}
Expand Down
7 changes: 7 additions & 0 deletions crates/fonts/src/craft.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,13 @@ pub fn ui_telugu_fonts() -> Vec<&'static CraftFont> {
CRAFT_FONTS.iter().filter(|f| f.covers("Telu")).collect()
}

/// The `Thaa` craft-fonts faces for Dhivehi (Thaana) interface text (the Dhivehi catalog, file
/// names, document titles), in manifest order. Empty when built without craft-fonts or when it has
/// no Thaana face.
pub fn ui_thaana_fonts() -> Vec<&'static CraftFont> {
CRAFT_FONTS.iter().filter(|f| f.covers("Thaa")).collect()
}

/// Thai faces shared by the interface and PDF text writer.
pub fn ui_thai_fonts() -> Vec<&'static CraftFont> {
CRAFT_FONTS.iter().filter(|f| f.covers("Thai")).collect()
Expand Down
2 changes: 1 addition & 1 deletion crates/fonts/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ mod std14_metrics;
pub use craft::{
CRAFT_FONTS, CraftFont, SHIPPORI_MINCHO, document_arabic_font, document_hebrew_font, document_japanese_font, document_japanese_font_for_style,
document_japanese_fonts_for_style, document_thai_font, ui_arabic_fonts, ui_chinese_fonts, ui_cjk_fonts, ui_hebrew_fonts, ui_japanese_fonts,
ui_telugu_fonts, ui_thai_fonts,
ui_telugu_fonts, ui_thaana_fonts, ui_thai_fonts,
};
pub use script::{
GlyphError, GlyphOutline, INTER_REGULAR, MAX_SIGNATURE_CHARS, ScriptOutline, japanese_glyph, japanese_glyph_from, script_missing, script_outline,
Expand Down
Loading