ocr-foundry 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ocr_foundry-0.2.0/.github/workflows/ci.yml +165 -0
- ocr_foundry-0.2.0/.github/workflows/publish-deprecated-khocr-gen.yml +31 -0
- ocr_foundry-0.2.0/.github/workflows/publish.yml +31 -0
- ocr_foundry-0.2.0/.gitignore +18 -0
- ocr_foundry-0.2.0/AGENTS.md +71 -0
- ocr_foundry-0.2.0/CHANGELOG.md +349 -0
- ocr_foundry-0.2.0/LICENSE +21 -0
- ocr_foundry-0.2.0/PKG-INFO +174 -0
- ocr_foundry-0.2.0/README.md +212 -0
- ocr_foundry-0.2.0/README.pypi.md +139 -0
- ocr_foundry-0.2.0/benchmark_rust_vs_python_aug.py +95 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/benchmark.lock.json +1336 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_000.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_001.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_002.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_003.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_004.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_005.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_006.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_007.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_008.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_009.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_010.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_011.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_012.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_000.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_001.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_002.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_003.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_004.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_005.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_006.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_007.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_008.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_009.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_010.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_011.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_000.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_001.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_002.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_003.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_004.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_005.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_006.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_007.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_008.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_009.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_010.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_011.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_012.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_013.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_014.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_015.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_016.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_017.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_018.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_019.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_000.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_001.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_002.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_003.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_004.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_005.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_006.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_007.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_008.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_009.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_010.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_011.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_012.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_013.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_014.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_015.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_016.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_017.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_018.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_019.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_020.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_000.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_001.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_002.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_003.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_004.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_005.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_006.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_007.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_008.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_009.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_010.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_011.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_012.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_013.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_014.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_015.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_016.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_017.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_018.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_019.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_020.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_021.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_000.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_001.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_002.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_003.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_004.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_005.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_006.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_007.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_008.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_009.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_010.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_011.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_012.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_013.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_014.png +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/manifest.json +69 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/predictions/tesseract_5.5.4.jsonl +103 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/references.jsonl +103 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/sources/eng_scan_00e18000.txt +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/sources/eng_scan_2990125f.txt +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/sources/khm_digital_sv2a50e519.txt +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/sources/khm_scan_00303950.txt +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/sources/khm_scan_43564610.txt +1 -0
- ocr_foundry-0.2.0/benchmarks/real_doc_v1/sources/multilingual_sv007180fa.txt +1 -0
- ocr_foundry-0.2.0/configs/combine.yml +6 -0
- ocr_foundry-0.2.0/configs/generate.yml +218 -0
- ocr_foundry-0.2.0/configs/layout.yml +22 -0
- ocr_foundry-0.2.0/configs/multilingual-realistic.yml +75 -0
- ocr_foundry-0.2.0/docs/AUGMENTATION.md +337 -0
- ocr_foundry-0.2.0/docs/BRANDING.md +79 -0
- ocr_foundry-0.2.0/docs/CLI_REFERENCE.md +508 -0
- ocr_foundry-0.2.0/docs/CONFIG.md +344 -0
- ocr_foundry-0.2.0/docs/EVALUATION.md +328 -0
- ocr_foundry-0.2.0/docs/MULTILINGUAL.md +187 -0
- ocr_foundry-0.2.0/docs/MULTILINGUAL_ROADMAP.md +163 -0
- ocr_foundry-0.2.0/docs/PAGE_LAYOUT.md +435 -0
- ocr_foundry-0.2.0/docs/README.md +23 -0
- ocr_foundry-0.2.0/docs/RELEASE_0.2.md +368 -0
- ocr_foundry-0.2.0/docs/RUST_ACCELERATION.md +104 -0
- ocr_foundry-0.2.0/docs/archive/README.md +7 -0
- ocr_foundry-0.2.0/docs/archive/VARIABLE_LENGTH_DESIGN.md +319 -0
- ocr_foundry-0.2.0/packaging/khocr-gen/README.md +28 -0
- ocr_foundry-0.2.0/packaging/khocr-gen/pyproject.toml +29 -0
- ocr_foundry-0.2.0/pi-warden.md +49 -0
- ocr_foundry-0.2.0/pyproject.toml +118 -0
- ocr_foundry-0.2.0/rust/Cargo.lock +552 -0
- ocr_foundry-0.2.0/rust/Cargo.toml +28 -0
- ocr_foundry-0.2.0/rust/pyproject.toml +13 -0
- ocr_foundry-0.2.0/rust/src/augmentation.rs +1326 -0
- ocr_foundry-0.2.0/rust/src/lib.rs +224 -0
- ocr_foundry-0.2.0/rust/src/utils.rs +155 -0
- ocr_foundry-0.2.0/scripts/publish_wiki.sh +58 -0
- ocr_foundry-0.2.0/src/khocr_gen/__init__.py +11 -0
- ocr_foundry-0.2.0/src/khocr_gen/_pil_compat.py +25 -0
- ocr_foundry-0.2.0/src/khocr_gen/_rust_accel.py +204 -0
- ocr_foundry-0.2.0/src/khocr_gen/augmentation.py +1193 -0
- ocr_foundry-0.2.0/src/khocr_gen/benchmark.py +888 -0
- ocr_foundry-0.2.0/src/khocr_gen/benchmark_cmd.py +103 -0
- ocr_foundry-0.2.0/src/khocr_gen/cli.py +246 -0
- ocr_foundry-0.2.0/src/khocr_gen/combine.py +214 -0
- ocr_foundry-0.2.0/src/khocr_gen/combine_cmd.py +125 -0
- ocr_foundry-0.2.0/src/khocr_gen/config.py +1474 -0
- ocr_foundry-0.2.0/src/khocr_gen/config_loader.py +157 -0
- ocr_foundry-0.2.0/src/khocr_gen/corpus.py +621 -0
- ocr_foundry-0.2.0/src/khocr_gen/data_generator.py +1160 -0
- ocr_foundry-0.2.0/src/khocr_gen/errors.py +33 -0
- ocr_foundry-0.2.0/src/khocr_gen/evaluate_cmd.py +50 -0
- ocr_foundry-0.2.0/src/khocr_gen/evaluation.py +259 -0
- ocr_foundry-0.2.0/src/khocr_gen/fonts.py +316 -0
- ocr_foundry-0.2.0/src/khocr_gen/generate.py +227 -0
- ocr_foundry-0.2.0/src/khocr_gen/layout.py +1028 -0
- ocr_foundry-0.2.0/src/khocr_gen/layout_cmd.py +371 -0
- ocr_foundry-0.2.0/src/khocr_gen/layout_degradation.py +128 -0
- ocr_foundry-0.2.0/src/khocr_gen/layout_mesh.py +200 -0
- ocr_foundry-0.2.0/src/khocr_gen/layout_shaping.py +264 -0
- ocr_foundry-0.2.0/src/khocr_gen/layout_transform.py +238 -0
- ocr_foundry-0.2.0/src/khocr_gen/layout_warp.py +473 -0
- ocr_foundry-0.2.0/src/khocr_gen/line_height.py +127 -0
- ocr_foundry-0.2.0/src/khocr_gen/lmdb_pack.py +132 -0
- ocr_foundry-0.2.0/src/khocr_gen/logging.py +25 -0
- ocr_foundry-0.2.0/src/khocr_gen/normalizer.py +221 -0
- ocr_foundry-0.2.0/src/khocr_gen/parallel.py +366 -0
- ocr_foundry-0.2.0/src/khocr_gen/provenance.py +328 -0
- ocr_foundry-0.2.0/src/khocr_gen/rendering.py +1607 -0
- ocr_foundry-0.2.0/src/khocr_gen/text_support.py +429 -0
- ocr_foundry-0.2.0/src/khocr_gen/verify.py +471 -0
- ocr_foundry-0.2.0/src/khocr_gen/viewer.py +172 -0
- ocr_foundry-0.2.0/tests/__init__.py +0 -0
- ocr_foundry-0.2.0/tests/test_augmentation.py +707 -0
- ocr_foundry-0.2.0/tests/test_augmentation_height_guard.py +335 -0
- ocr_foundry-0.2.0/tests/test_benchmark.py +925 -0
- ocr_foundry-0.2.0/tests/test_cli_branding.py +97 -0
- ocr_foundry-0.2.0/tests/test_combine.py +192 -0
- ocr_foundry-0.2.0/tests/test_config.py +627 -0
- ocr_foundry-0.2.0/tests/test_config_loader.py +167 -0
- ocr_foundry-0.2.0/tests/test_corpus.py +571 -0
- ocr_foundry-0.2.0/tests/test_data_generator.py +677 -0
- ocr_foundry-0.2.0/tests/test_errors.py +75 -0
- ocr_foundry-0.2.0/tests/test_evaluate_cli.py +56 -0
- ocr_foundry-0.2.0/tests/test_evaluation.py +315 -0
- ocr_foundry-0.2.0/tests/test_fonts.py +175 -0
- ocr_foundry-0.2.0/tests/test_generate.py +159 -0
- ocr_foundry-0.2.0/tests/test_layout.py +826 -0
- ocr_foundry-0.2.0/tests/test_layout_export.py +506 -0
- ocr_foundry-0.2.0/tests/test_layout_m5.py +299 -0
- ocr_foundry-0.2.0/tests/test_layout_transform.py +446 -0
- ocr_foundry-0.2.0/tests/test_layout_warp.py +601 -0
- ocr_foundry-0.2.0/tests/test_layout_warp_e2e.py +160 -0
- ocr_foundry-0.2.0/tests/test_line_height.py +177 -0
- ocr_foundry-0.2.0/tests/test_lmdb_pack.py +128 -0
- ocr_foundry-0.2.0/tests/test_multilingual.py +593 -0
- ocr_foundry-0.2.0/tests/test_normalizer.py +102 -0
- ocr_foundry-0.2.0/tests/test_online_aug.py +85 -0
- ocr_foundry-0.2.0/tests/test_parallel.py +320 -0
- ocr_foundry-0.2.0/tests/test_provenance.py +480 -0
- ocr_foundry-0.2.0/tests/test_rendering.py +247 -0
- ocr_foundry-0.2.0/tests/test_reproducibility.py +218 -0
- ocr_foundry-0.2.0/tests/test_run_manifest.py +193 -0
- ocr_foundry-0.2.0/tests/test_text_decoration.py +258 -0
- ocr_foundry-0.2.0/tests/test_text_effects.py +170 -0
- ocr_foundry-0.2.0/typings/_rust_accel.pyi +45 -0
- ocr_foundry-0.2.0/wiki/Architecture.md +163 -0
- ocr_foundry-0.2.0/wiki/Augmentation.md +352 -0
- ocr_foundry-0.2.0/wiki/CLI-Reference.md +491 -0
- ocr_foundry-0.2.0/wiki/Configuration.md +476 -0
- ocr_foundry-0.2.0/wiki/Corpus-and-Normalization.md +229 -0
- ocr_foundry-0.2.0/wiki/Development.md +153 -0
- ocr_foundry-0.2.0/wiki/Evaluation.md +64 -0
- ocr_foundry-0.2.0/wiki/FAQ.md +170 -0
- ocr_foundry-0.2.0/wiki/Fonts.md +130 -0
- ocr_foundry-0.2.0/wiki/Getting-Started.md +192 -0
- ocr_foundry-0.2.0/wiki/Home.md +128 -0
- ocr_foundry-0.2.0/wiki/Installation.md +114 -0
- ocr_foundry-0.2.0/wiki/Output-and-Storage.md +221 -0
- ocr_foundry-0.2.0/wiki/Page-Layout.md +242 -0
- ocr_foundry-0.2.0/wiki/README.md +66 -0
- ocr_foundry-0.2.0/wiki/Rust-Acceleration.md +142 -0
- ocr_foundry-0.2.0/wiki/Text-Decorations-and-Effects.md +141 -0
- ocr_foundry-0.2.0/wiki/Troubleshooting.md +298 -0
- ocr_foundry-0.2.0/wiki/Variable-Line-Height.md +157 -0
- ocr_foundry-0.2.0/wiki/_Footer.md +5 -0
- ocr_foundry-0.2.0/wiki/_Sidebar.md +26 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
python:
|
|
11
|
+
name: "python ${{ matrix.python-version }} (rust: ${{ matrix.rust-accel }})"
|
|
12
|
+
runs-on: ubuntu-24.04
|
|
13
|
+
strategy:
|
|
14
|
+
fail-fast: false
|
|
15
|
+
matrix:
|
|
16
|
+
python-version: ["3.12", "3.13", "3.14"]
|
|
17
|
+
rust-accel: [true, false]
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v4
|
|
20
|
+
|
|
21
|
+
- name: Install system dependencies (fonts, RAQM, FriBidi, FreeType)
|
|
22
|
+
run: |
|
|
23
|
+
sudo apt-get update
|
|
24
|
+
sudo apt-get install -y libraqm0 libraqm-dev libfribidi0 libfribidi-dev libfreetype6-dev fonts-noto-core fonts-noto-cjk fonts-dejavu-core fonts-khmeros fonts-khmeros-core || sudo apt-get install -y libraqm0 libraqm-dev libfribidi0 libfribidi-dev libfreetype6-dev fonts-noto-core fonts-noto-cjk fonts-dejavu-core fonts-khmeros
|
|
25
|
+
|
|
26
|
+
- name: Set up font directories and compatibility symlinks
|
|
27
|
+
run: |
|
|
28
|
+
sudo ln -s /usr/share/fonts/truetype/noto /usr/share/fonts/noto || true
|
|
29
|
+
sudo ln -s /usr/share/fonts/opentype/noto /usr/share/fonts/noto-cjk || true
|
|
30
|
+
mkdir -p fonts/english fonts/khmer
|
|
31
|
+
ln -sf /usr/share/fonts/truetype/noto/NotoSans-Regular.ttf fonts/english/times.ttf
|
|
32
|
+
if [ -f /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf ]; then
|
|
33
|
+
ln -sf /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf fonts/english/ARIAL.TTF
|
|
34
|
+
else
|
|
35
|
+
ln -sf /usr/share/fonts/truetype/noto/NotoSans-Regular.ttf fonts/english/ARIAL.TTF
|
|
36
|
+
fi
|
|
37
|
+
ln -sf /usr/share/fonts/truetype/noto/NotoSans-Bold.ttf fonts/english/ARIALBD.TTF
|
|
38
|
+
ln -sf /usr/share/fonts/truetype/noto/NotoSans-Italic.ttf fonts/english/ARIALI.TTF
|
|
39
|
+
ln -sf /usr/share/fonts/truetype/noto/NotoSans-BoldItalic.ttf fonts/english/ARIALBI.TTF
|
|
40
|
+
ln -sf /usr/share/fonts/truetype/noto/NotoSansKhmer-Regular.ttf fonts/khmer/NotoSansKhmer-Regular.ttf
|
|
41
|
+
ln -sf /usr/share/fonts/truetype/noto/NotoSansKhmer-Bold.ttf fonts/khmer/NotoSansKhmer-Bold.ttf
|
|
42
|
+
if [ -f /usr/share/fonts/truetype/ttf-khmeros-core/KhmerOS.ttf ]; then
|
|
43
|
+
ln -sf /usr/share/fonts/truetype/ttf-khmeros-core/KhmerOS.ttf fonts/khmer/KhmerOS.ttf
|
|
44
|
+
elif [ -f /usr/share/fonts/truetype/khmeros/KhmerOS.ttf ]; then
|
|
45
|
+
ln -sf /usr/share/fonts/truetype/khmeros/KhmerOS.ttf fonts/khmer/KhmerOS.ttf
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
- name: Install Rust toolchain
|
|
49
|
+
if: matrix.rust-accel
|
|
50
|
+
uses: dtolnay/rust-toolchain@master
|
|
51
|
+
with:
|
|
52
|
+
toolchain: "1.99.0"
|
|
53
|
+
|
|
54
|
+
- name: Install uv
|
|
55
|
+
uses: astral-sh/setup-uv@v4
|
|
56
|
+
with:
|
|
57
|
+
version: "0.13.7"
|
|
58
|
+
enable-cache: true
|
|
59
|
+
cache-dependency-glob: pyproject.toml
|
|
60
|
+
|
|
61
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
62
|
+
run: uv python install ${{ matrix.python-version }}
|
|
63
|
+
|
|
64
|
+
- name: Sync dependencies with native Rust extension
|
|
65
|
+
if: matrix.rust-accel
|
|
66
|
+
run: uv sync --extra dev --extra rust --python ${{ matrix.python-version }}
|
|
67
|
+
|
|
68
|
+
- name: Sync dependencies pure-Python (no Rust extension)
|
|
69
|
+
if: ${{ !matrix.rust-accel }}
|
|
70
|
+
run: uv sync --extra dev --python ${{ matrix.python-version }}
|
|
71
|
+
|
|
72
|
+
- name: Assert native Rust acceleration is active
|
|
73
|
+
if: matrix.rust-accel
|
|
74
|
+
run: |
|
|
75
|
+
uv run python -c "from khocr_gen._rust_accel import HAS_RUST_ACCEL, _native; assert HAS_RUST_ACCEL and _native is not None, 'Native acceleration must be active'"
|
|
76
|
+
|
|
77
|
+
- name: Assert native extension is absent and pure-Python fallback is active
|
|
78
|
+
if: ${{ !matrix.rust-accel }}
|
|
79
|
+
run: |
|
|
80
|
+
uv run python -c "from khocr_gen._rust_accel import HAS_RUST_ACCEL, _native; assert not HAS_RUST_ACCEL and _native is None, 'Pure-Python fallback must be active without native extension'"
|
|
81
|
+
|
|
82
|
+
- name: Lint (ruff)
|
|
83
|
+
run: uv run ruff check .
|
|
84
|
+
|
|
85
|
+
- name: Type check (ty)
|
|
86
|
+
run: uv run ty check
|
|
87
|
+
|
|
88
|
+
- name: Test (pytest with coverage)
|
|
89
|
+
run: uv run pytest --cov=khocr_gen --cov-report=term-missing
|
|
90
|
+
|
|
91
|
+
- name: CLI rendering smoke test (words, tables, transforms, vertical, fallback)
|
|
92
|
+
run: |
|
|
93
|
+
mkdir -p /tmp/smoke_fonts /tmp/smoke_in /tmp/smoke_out
|
|
94
|
+
ln -sf /usr/share/fonts/truetype/noto/NotoSans-Regular.ttf /tmp/smoke_fonts/NotoSans-Regular.ttf || ln -sf /usr/share/fonts/noto/NotoSans-Regular.ttf /tmp/smoke_fonts/NotoSans-Regular.ttf
|
|
95
|
+
ln -sf /usr/share/fonts/truetype/noto/NotoSansKhmer-Regular.ttf /tmp/smoke_fonts/NotoSansKhmer-Regular.ttf || ln -sf /usr/share/fonts/noto/NotoSansKhmer-Regular.ttf /tmp/smoke_fonts/NotoSansKhmer-Regular.ttf
|
|
96
|
+
ln -sf /usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc /tmp/smoke_fonts/NotoSerifCJK-Regular.ttc || ln -sf /usr/share/fonts/noto-cjk/NotoSerifCJK-Regular.ttc /tmp/smoke_fonts/NotoSerifCJK-Regular.ttc
|
|
97
|
+
|
|
98
|
+
cat << 'EOF' > /tmp/smoke_in/corpus_horizontal.txt
|
|
99
|
+
Hello world 123
|
|
100
|
+
សួស្តី Hello 123
|
|
101
|
+
Testing line layout and table cells
|
|
102
|
+
EOF
|
|
103
|
+
|
|
104
|
+
uv run ocr-foundry layout \
|
|
105
|
+
--corpus /tmp/smoke_in/corpus_horizontal.txt \
|
|
106
|
+
--output /tmp/smoke_out/horizontal \
|
|
107
|
+
--fonts /tmp/smoke_fonts \
|
|
108
|
+
--multilingual \
|
|
109
|
+
--cluster-font-fallback \
|
|
110
|
+
--include-words \
|
|
111
|
+
--enable-tables --table-rows 2 --table-cols 2 \
|
|
112
|
+
--writing-mode horizontal-tb \
|
|
113
|
+
--page-width 500 --page-height 400 --margin 20 \
|
|
114
|
+
--page-scale 1.1 --page-rotation 5 --page-flip both \
|
|
115
|
+
--page-elastic-amplitude 2 --page-perspective 0 2 -2 0 0 -2 2 0
|
|
116
|
+
|
|
117
|
+
test -f /tmp/smoke_out/horizontal/annotations.jsonl
|
|
118
|
+
test -d /tmp/smoke_out/horizontal/pages
|
|
119
|
+
|
|
120
|
+
cat << 'EOF' > /tmp/smoke_in/corpus_vertical.txt
|
|
121
|
+
日本 語文
|
|
122
|
+
縦書 文字
|
|
123
|
+
EOF
|
|
124
|
+
|
|
125
|
+
uv run ocr-foundry layout \
|
|
126
|
+
--corpus /tmp/smoke_in/corpus_vertical.txt \
|
|
127
|
+
--output /tmp/smoke_out/vertical \
|
|
128
|
+
--fonts /tmp/smoke_fonts \
|
|
129
|
+
--multilingual \
|
|
130
|
+
--include-words \
|
|
131
|
+
--enable-tables --table-rows 1 --table-cols 2 \
|
|
132
|
+
--writing-mode vertical-rl \
|
|
133
|
+
--page-width 500 --page-height 400 --margin 20
|
|
134
|
+
|
|
135
|
+
test -f /tmp/smoke_out/vertical/annotations.jsonl
|
|
136
|
+
test -d /tmp/smoke_out/vertical/pages
|
|
137
|
+
|
|
138
|
+
rust:
|
|
139
|
+
name: rust (fmt, clippy, build)
|
|
140
|
+
runs-on: ubuntu-24.04
|
|
141
|
+
defaults:
|
|
142
|
+
run:
|
|
143
|
+
working-directory: rust
|
|
144
|
+
steps:
|
|
145
|
+
- uses: actions/checkout@v4
|
|
146
|
+
|
|
147
|
+
- name: Install Rust toolchain
|
|
148
|
+
uses: dtolnay/rust-toolchain@master
|
|
149
|
+
with:
|
|
150
|
+
toolchain: "1.99.0"
|
|
151
|
+
components: rustfmt, clippy
|
|
152
|
+
|
|
153
|
+
- name: Cache cargo
|
|
154
|
+
uses: Swatinem/rust-cache@v2
|
|
155
|
+
with:
|
|
156
|
+
workspaces: rust
|
|
157
|
+
|
|
158
|
+
- name: Format check
|
|
159
|
+
run: cargo fmt --check
|
|
160
|
+
|
|
161
|
+
- name: Clippy
|
|
162
|
+
run: cargo clippy --all-targets -- -D warnings
|
|
163
|
+
|
|
164
|
+
- name: Build (release)
|
|
165
|
+
run: cargo build --release
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
name: Publish deprecated khocr-gen
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
|
|
6
|
+
permissions:
|
|
7
|
+
id-token: write
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
publish:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
|
|
15
|
+
- name: Install uv
|
|
16
|
+
uses: astral-sh/setup-uv@v4
|
|
17
|
+
|
|
18
|
+
- name: Build sdist and wheel
|
|
19
|
+
working-directory: packaging/khocr-gen
|
|
20
|
+
run: uv build
|
|
21
|
+
|
|
22
|
+
- name: Publish to PyPI
|
|
23
|
+
working-directory: packaging/khocr-gen
|
|
24
|
+
env:
|
|
25
|
+
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
|
|
26
|
+
run: |
|
|
27
|
+
if [ -z "${PYPI_TOKEN}" ]; then
|
|
28
|
+
echo "PYPI_TOKEN is empty; refusing to publish." >&2
|
|
29
|
+
exit 1
|
|
30
|
+
fi
|
|
31
|
+
uv publish --token "$PYPI_TOKEN"
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["*"]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
id-token: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
publish:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
|
|
17
|
+
- name: Install uv
|
|
18
|
+
uses: astral-sh/setup-uv@v4
|
|
19
|
+
|
|
20
|
+
- name: Build sdist and wheel
|
|
21
|
+
run: uv build
|
|
22
|
+
|
|
23
|
+
- name: Publish to PyPI
|
|
24
|
+
env:
|
|
25
|
+
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
|
|
26
|
+
run: |
|
|
27
|
+
if [ -z "${PYPI_TOKEN}" ]; then
|
|
28
|
+
echo "PYPI_TOKEN is empty; refusing to publish." >&2
|
|
29
|
+
exit 1
|
|
30
|
+
fi
|
|
31
|
+
uv publish --token "$PYPI_TOKEN"
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
`khocr-gen` generates synthetic OCR training data for mixed Khmer/English text.
|
|
4
|
+
|
|
5
|
+
Python 3.12+ owns the pipeline. `rust/` provides optional PyO3 acceleration. Keep the Python path working when the Rust extension is unavailable.
|
|
6
|
+
|
|
7
|
+
## Read first
|
|
8
|
+
|
|
9
|
+
- `src/khocr_gen/config.py` for the generation option surface.
|
|
10
|
+
- `docs/` for reference behavior.
|
|
11
|
+
- `wiki/` for user-facing documentation.
|
|
12
|
+
|
|
13
|
+
Code and tests are the source of truth when documentation disagrees.
|
|
14
|
+
|
|
15
|
+
## Layout
|
|
16
|
+
|
|
17
|
+
- `src/khocr_gen/` — CLI, rendering, normalization, augmentation, generation, storage.
|
|
18
|
+
- `rust/` — optional `khocr-gen-core` acceleration.
|
|
19
|
+
- `configs/` — example generation and combine configs.
|
|
20
|
+
- `tests/` — pytest suite.
|
|
21
|
+
- `docs/` — detailed reference docs.
|
|
22
|
+
- `wiki/` — source for the GitHub wiki.
|
|
23
|
+
|
|
24
|
+
## Invariants
|
|
25
|
+
|
|
26
|
+
- OCR labels must match the text represented by the rendered image.
|
|
27
|
+
- Augmentations may degrade appearance, not silently change label semantics.
|
|
28
|
+
- Keep Khmer normalization behavior explicit and tested.
|
|
29
|
+
- CLI flags override YAML values; YAML overrides built-in defaults.
|
|
30
|
+
- Seeded generation should stay reproducible where the pipeline promises determinism.
|
|
31
|
+
- Dataset splits must remain disjoint according to their documented semantics.
|
|
32
|
+
- Variable-height rendering must not clip glyphs.
|
|
33
|
+
- Rust acceleration is optional. Preserve a compatible Python fallback.
|
|
34
|
+
|
|
35
|
+
## Working rules
|
|
36
|
+
|
|
37
|
+
Inspect the relevant implementation and tests before editing.
|
|
38
|
+
|
|
39
|
+
Keep changes scoped. Don't mix unrelated cleanup into behavioral work.
|
|
40
|
+
|
|
41
|
+
When adding or changing an option, update its parser/config path, tests, example config where useful, and affected docs.
|
|
42
|
+
|
|
43
|
+
When touching Rust acceleration, check the Python fallback and boundary in `src/khocr_gen/_rust_accel.py`.
|
|
44
|
+
|
|
45
|
+
Don't add generated datasets, fonts, build output, or local environments to the repository.
|
|
46
|
+
|
|
47
|
+
## Validation
|
|
48
|
+
|
|
49
|
+
For Python changes:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
uv sync --extra dev
|
|
53
|
+
uv run ruff check .
|
|
54
|
+
uv run pytest --cov=khocr_gen --cov-report=term-missing
|
|
55
|
+
uv run ty check
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
`ty` is currently informational in CI.
|
|
59
|
+
|
|
60
|
+
For Rust changes:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
cd rust
|
|
64
|
+
cargo fmt --check
|
|
65
|
+
cargo clippy --all-targets -- -D warnings
|
|
66
|
+
cargo build --release
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Existing Rust format or clippy debt may be non-blocking in CI. Don't introduce new failures.
|
|
70
|
+
|
|
71
|
+
Run focused tests while iterating, then the relevant full checks before claiming completion.
|