From 84bb052fa26a461f065ac7da2fdd05ebef8959e5 Mon Sep 17 00:00:00 2001 From: Shay Palachy Date: Sun, 31 May 2026 09:25:41 +0300 Subject: [PATCH] Improve README presentation --- README.md | 168 +++++++++++------- docs/README.md | 8 +- .../hletterscriptgen-output-contract.png | Bin 0 -> 38807 bytes 3 files changed, 114 insertions(+), 62 deletions(-) create mode 100644 docs/assets/hletterscriptgen-output-contract.png diff --git a/README.md b/README.md index 6f76298..66ddedb 100644 --- a/README.md +++ b/README.md @@ -1,52 +1,73 @@ # hletterscriptgen -Generator framework for **per-writer Hebrew letter-glyph image sets**, built -on rights-clean upstream scans of handwritten Hebrew documents. - -`hletterscriptgen` is part of the [HeOCR](https://github.com/HeOCR) project. -It consumes scan-level records from -[`HeOCR/hash`](https://github.com/HeOCR/hash) (HASH — Hebrew Archive of Scanned Handwriting) -and produces letter-set datasets that land in -[`HeOCR/hletterscript`](https://github.com/HeOCR/hletterscript). Downstream, -[`HeOCR/hocrsyngen`](https://github.com/HeOCR/hocrsyngen) composes those -glyphs into synthetic Hebrew handwritten pages, which -[`HeOCR/hocrgen`](https://github.com/HeOCR/hocrgen) folds into -[`HeOCR/HeOCR`](https://github.com/HeOCR/HeOCR) and -[`HeOCR/HeOCRsynth`](https://github.com/HeOCR/HeOCRsynth). - -## Repository scope - -This repository contains the **code, schemas, and contracts** that produce -letter sets. It does **not** host the letter-set image data; that lives in -`HeOCR/hletterscript`. +[![CI](https://github.com/HeOCR/hletterscriptgen/actions/workflows/ci.yml/badge.svg)](https://github.com/HeOCR/hletterscriptgen/actions/workflows/ci.yml) +![License](https://img.shields.io/badge/license-MIT-green) +![Python](https://img.shields.io/badge/python-3.11%2B-blue) +![Schema](https://img.shields.io/badge/schema-letter__set.v1-blue) -What lives here: +Created by [Shay Palachy Affek](http://www.shaypalachy.com/). + +Generator framework for per-writer Hebrew handwritten letter-glyph image +sets. It turns rights-clean HASH scan records plus human-reviewed glyph +annotations into deterministic `letter_set.v1` outputs for +[`HeOCR/hletterscript`](https://github.com/HeOCR/hletterscript). -- A Python package and CLI (`hletterscriptgen`). -- The `letter_set.v1` JSON Schema and a fixture example - (`examples/letter_set/writer_example.json`). -- Validation tooling (`hletterscriptgen validate`). -- CI that enforces schema and tooling invariants. -- Licensing policy and rights-carryover rules - ([`LICENSE-POLICY.md`](LICENSE-POLICY.md)). +![hletterscriptgen output contract diagram](docs/assets/hletterscriptgen-output-contract.png) -What does **not** live here: +## At a Glance -- Actual extracted glyph images (→ `HeOCR/hletterscript`). -- Page-scan ingestion or rights curation (→ - `HeOCR/hash`). -- Document composition (→ `HeOCR/hocrsyngen`). -- Dataset orchestration, governance, release assembly, or publication (→ - `HeOCR/hocrgen` / `HeOCR/HeOCR` / `HeOCR/HeOCRsynth`). +| Field | Value | +| --- | --- | +| Role | Generate and validate per-writer Hebrew letter-set outputs | +| Input | HASH scan metadata, scan image files, and generation profiles | +| Output | `letter_set.v1` JSON plus cropped glyph PNG assets | +| Public contract | [`docs/letter_set_v1.md`](docs/letter_set_v1.md) | +| Example fixture | [`examples/letter_set/writer_example.json`](examples/letter_set/writer_example.json) | +| Main CLI | `hletterscriptgen` | +| Code license | MIT | +| Generated glyph rights | Per-variant rights inherited from upstream scans | -## Position in the HeOCR system +## What This Repository Owns -`hletterscriptgen` reads rights-clean scans from -HASH (`HeOCR/hash`), produces per-writer letter -sets that land in `hletterscript`, and ultimately feeds `hocrsyngen` / -`hocrgen` / `HeOCR` / `HeOCRsynth`. See -[`docs/repository_scope.md`](docs/repository_scope.md) for the full -diagram and per-repo responsibilities. +This repository contains the Python package, CLI, schema, and validation +contracts for creating writer-level Hebrew letter sets. It does not host +the published glyph dataset itself; generated and curated data belongs in +[`HeOCR/hletterscript`](https://github.com/HeOCR/hletterscript). + +What lives here: + +- `hletterscriptgen`, the Python package and command-line interface. +- The `letter_set.v1` JSON Schema and fixture example. +- Generation-profile parsing, upstream eligibility checks, glyph + extraction helpers, checksum calculation, and output validation. +- CI, release workflow, and rights-carryover policy. + +What lives elsewhere: + +- Page-scan ingestion and rights curation: + [`HeOCR/hash`](https://github.com/HeOCR/hash). +- Published letter-glyph image sets: + [`HeOCR/hletterscript`](https://github.com/HeOCR/hletterscript). +- Synthetic document composition: + [`HeOCR/hocrsyngen`](https://github.com/HeOCR/hocrsyngen). +- Dataset orchestration and release assembly: + [`HeOCR/hocrgen`](https://github.com/HeOCR/hocrgen), + [`HeOCR/HeOCR`](https://github.com/HeOCR/HeOCR), and + [`HeOCR/HeOCRsynth`](https://github.com/HeOCR/HeOCRsynth). + +## Pipeline Position + +```mermaid +flowchart LR + HASH["HeOCR/hash
rights-clean scans"] --> PROFILE["generation profile
writer + glyph bboxes"] + PROFILE --> GEN["hletterscriptgen
crop, hash, dedupe, validate"] + GEN --> DATA["HeOCR/hletterscript
letter_set.v1 + glyph PNGs"] + DATA --> SYN["HeOCR/hocrsyngen
synthetic pages"] + SYN --> OCR["HeOCR / HeOCRsynth
OCR and HTR datasets"] +``` + +See [`docs/repository_scope.md`](docs/repository_scope.md) for the full +ecosystem boundary map and per-repository responsibilities. ## Install @@ -54,7 +75,13 @@ diagram and per-repo responsibilities. python -m pip install -e ".[test]" ``` -Requires Python 3.11+. +For development: + +```bash +python -m pip install -e ".[dev]" +``` + +Requires Python 3.11 or newer. ## CLI @@ -62,34 +89,53 @@ Requires Python 3.11+. hletterscriptgen version hletterscriptgen schema --format json hletterscriptgen validate examples/letter_set/writer_example.json -hletterscriptgen validate examples/letter_set/writer_example.json --format json +hletterscriptgen check-eligible path/to/hash/data/index/entries.jsonl +hletterscriptgen scan-blobs path/to/scan.png --format json +hletterscriptgen generate --profile generate_profile.json --output ./out ``` -The `generate` subcommand is reserved for the upcoming extraction pipeline -and is not yet implemented; see [`docs/roadmap.md`](docs/roadmap.md). +The `generate` command expects a human-curated generation profile that +names writer IDs, upstream scan entries, and glyph bounding boxes. The +output is one directory per writer, each containing `letter_set.json` and +the surviving cropped glyph assets. + +## The `letter_set.v1` Contract -## The `letter_set.v1` contract +The bundled schema describes one writer's letter-glyph collection: -The bundled JSON Schema describes a per-writer letter set: +- `writer_id` identifies the writer set. +- `writer_provenance` records how the writer attribution was established. +- `upstream` pins the exact HASH revision used by the generation run. +- `letters` maps Hebrew letters and final forms to one or more glyph + variants. +- Each variant carries an asset path, checksum, image metadata, source + scan ID, bounding box, license, and rights evidence. +- `license_summary` summarizes the distinct variant-level licenses but + does not replace per-variant rights metadata. -- One document per **writer**. -- `letters` maps each Hebrew letter (base or final form, `U+05D0`–`U+05EA`) - to one or more **variants** extracted from upstream scans by that writer. -- Each variant carries an `asset_path`, a SHA-256 checksum, image metadata, - and **per-variant source rights**, so license evidence flows through from - upstream into any downstream composition. +Read the full contract in [`docs/letter_set_v1.md`](docs/letter_set_v1.md). -See [`docs/letter_set_v1.md`](docs/letter_set_v1.md) for the full -explanation and field-by-field notes. +## Validate Locally + +```bash +python -m ruff check . +python -m mypy +python -m pytest +hletterscriptgen validate examples/letter_set/writer_example.json +``` ## Licensing -- Code in this repository: MIT (see [`LICENSE`](LICENSE)). -- Generated letter sets: carry per-variant upstream rights — see - [`LICENSE-POLICY.md`](LICENSE-POLICY.md). The generator does not - relicense glyphs. +- Code in this repository is MIT licensed. See [`LICENSE`](LICENSE). +- Generated letter sets carry per-variant upstream rights. See + [`LICENSE-POLICY.md`](LICENSE-POLICY.md); the generator records rights + evidence but does not relicense glyphs. ## Contributing -See [`CONTRIBUTING.md`](CONTRIBUTING.md). For agent collaborators, see -[`AGENTS.md`](AGENTS.md). +See [`CONTRIBUTING.md`](CONTRIBUTING.md). Agent collaborators should also +read [`AGENTS.md`](AGENTS.md). + +## Credits + +Created by [Shay Palachy Affek ](http://www.shaypalachy.com/) [[GitHub](https://github.com/shaypal5)] diff --git a/docs/README.md b/docs/README.md index 69e3ae8..fe663ce 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,5 +1,7 @@ # Documentation index +Created by [Shay Palachy Affek](http://www.shaypalachy.com/). + - [Repository scope](repository_scope.md) — what this repo owns and what it does not, plus the canonical ecosystem diagram. - [Architecture](architecture.md) — code layout and the validation pipeline. - [`letter_set.v1` contract](letter_set_v1.md) — output schema, field-by-field. @@ -11,4 +13,8 @@ ## Design drafts -- [Letter extraction pipeline (draft)](design/letter_extraction.md) — sketch of the future `generate` pipeline; nothing implemented yet. +- [Letter extraction pipeline](design/letter_extraction.md) — design notes for the `generate` pipeline and extraction workflow. + +## Credits + +Created by [Shay Palachy Affek ](http://www.shaypalachy.com/) [[GitHub](https://github.com/shaypal5)] diff --git a/docs/assets/hletterscriptgen-output-contract.png b/docs/assets/hletterscriptgen-output-contract.png new file mode 100644 index 0000000000000000000000000000000000000000..4c526121c1db66a2cb6eb4d8dd62082face204e9 GIT binary patch literal 38807 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 ZQtlx?sXI^iy(Ip_$zzH~Q>D*d|39;5c?tjk literal 0 HcmV?d00001