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.
Files changed (242) hide show
  1. ocr_foundry-0.2.0/.github/workflows/ci.yml +165 -0
  2. ocr_foundry-0.2.0/.github/workflows/publish-deprecated-khocr-gen.yml +31 -0
  3. ocr_foundry-0.2.0/.github/workflows/publish.yml +31 -0
  4. ocr_foundry-0.2.0/.gitignore +18 -0
  5. ocr_foundry-0.2.0/AGENTS.md +71 -0
  6. ocr_foundry-0.2.0/CHANGELOG.md +349 -0
  7. ocr_foundry-0.2.0/LICENSE +21 -0
  8. ocr_foundry-0.2.0/PKG-INFO +174 -0
  9. ocr_foundry-0.2.0/README.md +212 -0
  10. ocr_foundry-0.2.0/README.pypi.md +139 -0
  11. ocr_foundry-0.2.0/benchmark_rust_vs_python_aug.py +95 -0
  12. ocr_foundry-0.2.0/benchmarks/real_doc_v1/benchmark.lock.json +1336 -0
  13. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_000.png +1 -0
  14. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_001.png +1 -0
  15. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_002.png +1 -0
  16. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_003.png +1 -0
  17. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_004.png +1 -0
  18. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_005.png +1 -0
  19. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_006.png +1 -0
  20. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_007.png +1 -0
  21. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_008.png +1 -0
  22. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_009.png +1 -0
  23. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_010.png +1 -0
  24. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_011.png +1 -0
  25. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_00e18000_012.png +1 -0
  26. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_000.png +1 -0
  27. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_001.png +1 -0
  28. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_002.png +1 -0
  29. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_003.png +1 -0
  30. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_004.png +1 -0
  31. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_005.png +1 -0
  32. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_006.png +1 -0
  33. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_007.png +1 -0
  34. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_008.png +1 -0
  35. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_009.png +1 -0
  36. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_010.png +1 -0
  37. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/eng_scan_2990125f_011.png +1 -0
  38. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_000.png +1 -0
  39. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_001.png +1 -0
  40. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_002.png +1 -0
  41. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_003.png +1 -0
  42. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_004.png +1 -0
  43. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_005.png +1 -0
  44. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_006.png +1 -0
  45. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_007.png +1 -0
  46. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_008.png +1 -0
  47. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_009.png +1 -0
  48. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_010.png +1 -0
  49. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_011.png +1 -0
  50. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_012.png +1 -0
  51. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_013.png +1 -0
  52. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_014.png +1 -0
  53. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_015.png +1 -0
  54. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_016.png +1 -0
  55. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_017.png +1 -0
  56. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_018.png +1 -0
  57. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_digital_sv2a50e519_019.png +1 -0
  58. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_000.png +1 -0
  59. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_001.png +1 -0
  60. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_002.png +1 -0
  61. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_003.png +1 -0
  62. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_004.png +1 -0
  63. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_005.png +1 -0
  64. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_006.png +1 -0
  65. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_007.png +1 -0
  66. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_008.png +1 -0
  67. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_009.png +1 -0
  68. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_010.png +1 -0
  69. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_011.png +1 -0
  70. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_012.png +1 -0
  71. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_013.png +1 -0
  72. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_014.png +1 -0
  73. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_015.png +1 -0
  74. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_016.png +1 -0
  75. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_017.png +1 -0
  76. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_018.png +1 -0
  77. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_019.png +1 -0
  78. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_00303950_020.png +1 -0
  79. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_000.png +1 -0
  80. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_001.png +1 -0
  81. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_002.png +1 -0
  82. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_003.png +1 -0
  83. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_004.png +1 -0
  84. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_005.png +1 -0
  85. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_006.png +1 -0
  86. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_007.png +1 -0
  87. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_008.png +1 -0
  88. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_009.png +1 -0
  89. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_010.png +1 -0
  90. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_011.png +1 -0
  91. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_012.png +1 -0
  92. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_013.png +1 -0
  93. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_014.png +1 -0
  94. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_015.png +1 -0
  95. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_016.png +1 -0
  96. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_017.png +1 -0
  97. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_018.png +1 -0
  98. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_019.png +1 -0
  99. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_020.png +1 -0
  100. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/khm_scan_43564610_021.png +1 -0
  101. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_000.png +1 -0
  102. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_001.png +1 -0
  103. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_002.png +1 -0
  104. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_003.png +1 -0
  105. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_004.png +1 -0
  106. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_005.png +1 -0
  107. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_006.png +1 -0
  108. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_007.png +1 -0
  109. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_008.png +1 -0
  110. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_009.png +1 -0
  111. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_010.png +1 -0
  112. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_011.png +1 -0
  113. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_012.png +1 -0
  114. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_013.png +1 -0
  115. ocr_foundry-0.2.0/benchmarks/real_doc_v1/crops/multilingual_sv007180fa_014.png +1 -0
  116. ocr_foundry-0.2.0/benchmarks/real_doc_v1/manifest.json +69 -0
  117. ocr_foundry-0.2.0/benchmarks/real_doc_v1/predictions/tesseract_5.5.4.jsonl +103 -0
  118. ocr_foundry-0.2.0/benchmarks/real_doc_v1/references.jsonl +103 -0
  119. ocr_foundry-0.2.0/benchmarks/real_doc_v1/sources/eng_scan_00e18000.txt +1 -0
  120. ocr_foundry-0.2.0/benchmarks/real_doc_v1/sources/eng_scan_2990125f.txt +1 -0
  121. ocr_foundry-0.2.0/benchmarks/real_doc_v1/sources/khm_digital_sv2a50e519.txt +1 -0
  122. ocr_foundry-0.2.0/benchmarks/real_doc_v1/sources/khm_scan_00303950.txt +1 -0
  123. ocr_foundry-0.2.0/benchmarks/real_doc_v1/sources/khm_scan_43564610.txt +1 -0
  124. ocr_foundry-0.2.0/benchmarks/real_doc_v1/sources/multilingual_sv007180fa.txt +1 -0
  125. ocr_foundry-0.2.0/configs/combine.yml +6 -0
  126. ocr_foundry-0.2.0/configs/generate.yml +218 -0
  127. ocr_foundry-0.2.0/configs/layout.yml +22 -0
  128. ocr_foundry-0.2.0/configs/multilingual-realistic.yml +75 -0
  129. ocr_foundry-0.2.0/docs/AUGMENTATION.md +337 -0
  130. ocr_foundry-0.2.0/docs/BRANDING.md +79 -0
  131. ocr_foundry-0.2.0/docs/CLI_REFERENCE.md +508 -0
  132. ocr_foundry-0.2.0/docs/CONFIG.md +344 -0
  133. ocr_foundry-0.2.0/docs/EVALUATION.md +328 -0
  134. ocr_foundry-0.2.0/docs/MULTILINGUAL.md +187 -0
  135. ocr_foundry-0.2.0/docs/MULTILINGUAL_ROADMAP.md +163 -0
  136. ocr_foundry-0.2.0/docs/PAGE_LAYOUT.md +435 -0
  137. ocr_foundry-0.2.0/docs/README.md +23 -0
  138. ocr_foundry-0.2.0/docs/RELEASE_0.2.md +368 -0
  139. ocr_foundry-0.2.0/docs/RUST_ACCELERATION.md +104 -0
  140. ocr_foundry-0.2.0/docs/archive/README.md +7 -0
  141. ocr_foundry-0.2.0/docs/archive/VARIABLE_LENGTH_DESIGN.md +319 -0
  142. ocr_foundry-0.2.0/packaging/khocr-gen/README.md +28 -0
  143. ocr_foundry-0.2.0/packaging/khocr-gen/pyproject.toml +29 -0
  144. ocr_foundry-0.2.0/pi-warden.md +49 -0
  145. ocr_foundry-0.2.0/pyproject.toml +118 -0
  146. ocr_foundry-0.2.0/rust/Cargo.lock +552 -0
  147. ocr_foundry-0.2.0/rust/Cargo.toml +28 -0
  148. ocr_foundry-0.2.0/rust/pyproject.toml +13 -0
  149. ocr_foundry-0.2.0/rust/src/augmentation.rs +1326 -0
  150. ocr_foundry-0.2.0/rust/src/lib.rs +224 -0
  151. ocr_foundry-0.2.0/rust/src/utils.rs +155 -0
  152. ocr_foundry-0.2.0/scripts/publish_wiki.sh +58 -0
  153. ocr_foundry-0.2.0/src/khocr_gen/__init__.py +11 -0
  154. ocr_foundry-0.2.0/src/khocr_gen/_pil_compat.py +25 -0
  155. ocr_foundry-0.2.0/src/khocr_gen/_rust_accel.py +204 -0
  156. ocr_foundry-0.2.0/src/khocr_gen/augmentation.py +1193 -0
  157. ocr_foundry-0.2.0/src/khocr_gen/benchmark.py +888 -0
  158. ocr_foundry-0.2.0/src/khocr_gen/benchmark_cmd.py +103 -0
  159. ocr_foundry-0.2.0/src/khocr_gen/cli.py +246 -0
  160. ocr_foundry-0.2.0/src/khocr_gen/combine.py +214 -0
  161. ocr_foundry-0.2.0/src/khocr_gen/combine_cmd.py +125 -0
  162. ocr_foundry-0.2.0/src/khocr_gen/config.py +1474 -0
  163. ocr_foundry-0.2.0/src/khocr_gen/config_loader.py +157 -0
  164. ocr_foundry-0.2.0/src/khocr_gen/corpus.py +621 -0
  165. ocr_foundry-0.2.0/src/khocr_gen/data_generator.py +1160 -0
  166. ocr_foundry-0.2.0/src/khocr_gen/errors.py +33 -0
  167. ocr_foundry-0.2.0/src/khocr_gen/evaluate_cmd.py +50 -0
  168. ocr_foundry-0.2.0/src/khocr_gen/evaluation.py +259 -0
  169. ocr_foundry-0.2.0/src/khocr_gen/fonts.py +316 -0
  170. ocr_foundry-0.2.0/src/khocr_gen/generate.py +227 -0
  171. ocr_foundry-0.2.0/src/khocr_gen/layout.py +1028 -0
  172. ocr_foundry-0.2.0/src/khocr_gen/layout_cmd.py +371 -0
  173. ocr_foundry-0.2.0/src/khocr_gen/layout_degradation.py +128 -0
  174. ocr_foundry-0.2.0/src/khocr_gen/layout_mesh.py +200 -0
  175. ocr_foundry-0.2.0/src/khocr_gen/layout_shaping.py +264 -0
  176. ocr_foundry-0.2.0/src/khocr_gen/layout_transform.py +238 -0
  177. ocr_foundry-0.2.0/src/khocr_gen/layout_warp.py +473 -0
  178. ocr_foundry-0.2.0/src/khocr_gen/line_height.py +127 -0
  179. ocr_foundry-0.2.0/src/khocr_gen/lmdb_pack.py +132 -0
  180. ocr_foundry-0.2.0/src/khocr_gen/logging.py +25 -0
  181. ocr_foundry-0.2.0/src/khocr_gen/normalizer.py +221 -0
  182. ocr_foundry-0.2.0/src/khocr_gen/parallel.py +366 -0
  183. ocr_foundry-0.2.0/src/khocr_gen/provenance.py +328 -0
  184. ocr_foundry-0.2.0/src/khocr_gen/rendering.py +1607 -0
  185. ocr_foundry-0.2.0/src/khocr_gen/text_support.py +429 -0
  186. ocr_foundry-0.2.0/src/khocr_gen/verify.py +471 -0
  187. ocr_foundry-0.2.0/src/khocr_gen/viewer.py +172 -0
  188. ocr_foundry-0.2.0/tests/__init__.py +0 -0
  189. ocr_foundry-0.2.0/tests/test_augmentation.py +707 -0
  190. ocr_foundry-0.2.0/tests/test_augmentation_height_guard.py +335 -0
  191. ocr_foundry-0.2.0/tests/test_benchmark.py +925 -0
  192. ocr_foundry-0.2.0/tests/test_cli_branding.py +97 -0
  193. ocr_foundry-0.2.0/tests/test_combine.py +192 -0
  194. ocr_foundry-0.2.0/tests/test_config.py +627 -0
  195. ocr_foundry-0.2.0/tests/test_config_loader.py +167 -0
  196. ocr_foundry-0.2.0/tests/test_corpus.py +571 -0
  197. ocr_foundry-0.2.0/tests/test_data_generator.py +677 -0
  198. ocr_foundry-0.2.0/tests/test_errors.py +75 -0
  199. ocr_foundry-0.2.0/tests/test_evaluate_cli.py +56 -0
  200. ocr_foundry-0.2.0/tests/test_evaluation.py +315 -0
  201. ocr_foundry-0.2.0/tests/test_fonts.py +175 -0
  202. ocr_foundry-0.2.0/tests/test_generate.py +159 -0
  203. ocr_foundry-0.2.0/tests/test_layout.py +826 -0
  204. ocr_foundry-0.2.0/tests/test_layout_export.py +506 -0
  205. ocr_foundry-0.2.0/tests/test_layout_m5.py +299 -0
  206. ocr_foundry-0.2.0/tests/test_layout_transform.py +446 -0
  207. ocr_foundry-0.2.0/tests/test_layout_warp.py +601 -0
  208. ocr_foundry-0.2.0/tests/test_layout_warp_e2e.py +160 -0
  209. ocr_foundry-0.2.0/tests/test_line_height.py +177 -0
  210. ocr_foundry-0.2.0/tests/test_lmdb_pack.py +128 -0
  211. ocr_foundry-0.2.0/tests/test_multilingual.py +593 -0
  212. ocr_foundry-0.2.0/tests/test_normalizer.py +102 -0
  213. ocr_foundry-0.2.0/tests/test_online_aug.py +85 -0
  214. ocr_foundry-0.2.0/tests/test_parallel.py +320 -0
  215. ocr_foundry-0.2.0/tests/test_provenance.py +480 -0
  216. ocr_foundry-0.2.0/tests/test_rendering.py +247 -0
  217. ocr_foundry-0.2.0/tests/test_reproducibility.py +218 -0
  218. ocr_foundry-0.2.0/tests/test_run_manifest.py +193 -0
  219. ocr_foundry-0.2.0/tests/test_text_decoration.py +258 -0
  220. ocr_foundry-0.2.0/tests/test_text_effects.py +170 -0
  221. ocr_foundry-0.2.0/typings/_rust_accel.pyi +45 -0
  222. ocr_foundry-0.2.0/wiki/Architecture.md +163 -0
  223. ocr_foundry-0.2.0/wiki/Augmentation.md +352 -0
  224. ocr_foundry-0.2.0/wiki/CLI-Reference.md +491 -0
  225. ocr_foundry-0.2.0/wiki/Configuration.md +476 -0
  226. ocr_foundry-0.2.0/wiki/Corpus-and-Normalization.md +229 -0
  227. ocr_foundry-0.2.0/wiki/Development.md +153 -0
  228. ocr_foundry-0.2.0/wiki/Evaluation.md +64 -0
  229. ocr_foundry-0.2.0/wiki/FAQ.md +170 -0
  230. ocr_foundry-0.2.0/wiki/Fonts.md +130 -0
  231. ocr_foundry-0.2.0/wiki/Getting-Started.md +192 -0
  232. ocr_foundry-0.2.0/wiki/Home.md +128 -0
  233. ocr_foundry-0.2.0/wiki/Installation.md +114 -0
  234. ocr_foundry-0.2.0/wiki/Output-and-Storage.md +221 -0
  235. ocr_foundry-0.2.0/wiki/Page-Layout.md +242 -0
  236. ocr_foundry-0.2.0/wiki/README.md +66 -0
  237. ocr_foundry-0.2.0/wiki/Rust-Acceleration.md +142 -0
  238. ocr_foundry-0.2.0/wiki/Text-Decorations-and-Effects.md +141 -0
  239. ocr_foundry-0.2.0/wiki/Troubleshooting.md +298 -0
  240. ocr_foundry-0.2.0/wiki/Variable-Line-Height.md +157 -0
  241. ocr_foundry-0.2.0/wiki/_Footer.md +5 -0
  242. 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,18 @@
1
+ /.pytest_cache/
2
+ /.ruff_cache/
3
+ /.venv/
4
+ /.superpowers/
5
+ /.claude/
6
+
7
+ /rust/target/
8
+ /dist/
9
+ /corpus/
10
+ /fonts*/
11
+ /data/
12
+ /docs/superpowers/
13
+
14
+ __pycache__/
15
+ uv.lock
16
+ .coverage
17
+ .coverage.*
18
+ htmlcov/
@@ -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.