fullbleed 2.2.4__tar.gz → 2.2.5__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 (184) hide show
  1. {fullbleed-2.2.4 → fullbleed-2.2.5}/Cargo.lock +1 -1
  2. {fullbleed-2.2.4 → fullbleed-2.2.5}/Cargo.toml +1 -1
  3. {fullbleed-2.2.4 → fullbleed-2.2.5}/PKG-INFO +19 -12
  4. {fullbleed-2.2.4 → fullbleed-2.2.5}/README.md +18 -11
  5. {fullbleed-2.2.4 → fullbleed-2.2.5}/pyproject.toml +1 -1
  6. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/_abi.py +37 -4
  7. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/cli.py +10 -2
  8. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/flate_native.rs +34 -11
  9. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/flowable.rs +12 -0
  10. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/lib.rs +177 -5
  11. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/pdf.rs +27 -4
  12. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/python/abi_exports.rs +34 -4
  13. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/python.rs +5 -0
  14. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/style.rs +19 -1
  15. {fullbleed-2.2.4 → fullbleed-2.2.5}/COPYRIGHT +0 -0
  16. {fullbleed-2.2.4 → fullbleed-2.2.5}/FONT_LICENSE_AUDIT.json +0 -0
  17. {fullbleed-2.2.4 → fullbleed-2.2.5}/FONT_LICENSE_AUDIT.md +0 -0
  18. {fullbleed-2.2.4 → fullbleed-2.2.5}/LICENSE +0 -0
  19. {fullbleed-2.2.4 → fullbleed-2.2.5}/LICENSING.md +0 -0
  20. {fullbleed-2.2.4 → fullbleed-2.2.5}/THIRD_PARTY_LICENSES.md +0 -0
  21. {fullbleed-2.2.4 → fullbleed-2.2.5}/build.rs +0 -0
  22. {fullbleed-2.2.4 → fullbleed-2.2.5}/build_backend/fullbleed_build_backend.py +0 -0
  23. {fullbleed-2.2.4 → fullbleed-2.2.5}/crates/fullbleed_audit_contract/Cargo.lock +0 -0
  24. {fullbleed-2.2.4 → fullbleed-2.2.5}/crates/fullbleed_audit_contract/Cargo.toml +0 -0
  25. {fullbleed-2.2.4 → fullbleed-2.2.5}/crates/fullbleed_audit_contract/LICENSE +0 -0
  26. {fullbleed-2.2.4 → fullbleed-2.2.5}/crates/fullbleed_audit_contract/README.md +0 -0
  27. {fullbleed-2.2.4 → fullbleed-2.2.5}/crates/fullbleed_audit_contract/specs/fullbleed.audit_registry.v1.yaml +0 -0
  28. {fullbleed-2.2.4 → fullbleed-2.2.5}/crates/fullbleed_audit_contract/specs/section508_html_registry.v1.yaml +0 -0
  29. {fullbleed-2.2.4 → fullbleed-2.2.5}/crates/fullbleed_audit_contract/specs/wcag20aa_registry.v1.yaml +0 -0
  30. {fullbleed-2.2.4 → fullbleed-2.2.5}/crates/fullbleed_audit_contract/src/json.rs +0 -0
  31. {fullbleed-2.2.4 → fullbleed-2.2.5}/crates/fullbleed_audit_contract/src/lib.rs +0 -0
  32. {fullbleed-2.2.4 → fullbleed-2.2.5}/crates/fullbleed_audit_contract/src/sha256.rs +0 -0
  33. {fullbleed-2.2.4 → fullbleed-2.2.5}/docs/specs/fullbleed.a11y.verify.v1.schema.json +0 -0
  34. {fullbleed-2.2.4 → fullbleed-2.2.5}/docs/specs/fullbleed.audit_registry.v1.yaml +0 -0
  35. {fullbleed-2.2.4 → fullbleed-2.2.5}/docs/specs/fullbleed.pmr.v1.schema.json +0 -0
  36. {fullbleed-2.2.4 → fullbleed-2.2.5}/docs/specs/section508_html_registry.v1.yaml +0 -0
  37. {fullbleed-2.2.4 → fullbleed-2.2.5}/docs/specs/wcag20aa_registry.v1.yaml +0 -0
  38. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/__init__.py +0 -0
  39. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/__main__.py +0 -0
  40. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/accessibility/__init__.py +0 -0
  41. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/accessibility/engine.py +0 -0
  42. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/accessibility/runtime.py +0 -0
  43. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/accessibility/types.py +0 -0
  44. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/audit_prototype.py +0 -0
  45. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/audit_section508.py +0 -0
  46. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/audit_wcag.py +0 -0
  47. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/ui/__init__.py +0 -0
  48. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/ui/accessibility.py +0 -0
  49. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/ui/cav/__init__.py +0 -0
  50. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/ui/cav/_core.py +0 -0
  51. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/ui/cav/agency_letter.py +0 -0
  52. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/ui/cav/court_motion_form.py +0 -0
  53. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/ui/cav/declaration_form.py +0 -0
  54. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/ui/cav/instruction_sheet.py +0 -0
  55. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/ui/cav/investment_portfolio_report.py +0 -0
  56. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/ui/cav/marriage_record.py +0 -0
  57. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/ui/cav/profiles.py +0 -0
  58. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/ui/cav/recorded_plat.py +0 -0
  59. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/ui/cav/redaction_request_form.py +0 -0
  60. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/ui/cav/warranty_deed.py +0 -0
  61. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/ui/core.py +0 -0
  62. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/ui/primitives.py +0 -0
  63. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed/ui/style.py +0 -0
  64. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_assets/__init__.py +0 -0
  65. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_assets/bootstrap.min.css +0 -0
  66. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_assets/fonts/Inter-Variable.ttf +0 -0
  67. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_assets/fonts/NotoSans-Regular.ttf +0 -0
  68. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_assets/fonts/NotoSansMath-Regular.ttf +0 -0
  69. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_assets/fonts/NotoSansSymbols-Regular.ttf +0 -0
  70. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_assets/fonts/NotoSansSymbols2-Regular.ttf +0 -0
  71. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_assets/icons/bootstrap-icons.svg +0 -0
  72. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/__init__.py +0 -0
  73. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/__main__.py +0 -0
  74. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/assets.py +0 -0
  75. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/cache.py +0 -0
  76. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/finalize.py +0 -0
  77. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold.py +0 -0
  78. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/__init__.py +0 -0
  79. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/init/.gitignore +0 -0
  80. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/init/COMPLIANCE.md +0 -0
  81. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/init/SCAFFOLDING.md +0 -0
  82. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/init/components/__init__.py +0 -0
  83. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/init/components/body.py +0 -0
  84. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/init/components/fb_ui.py +0 -0
  85. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/init/components/footer.py +0 -0
  86. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/init/components/header.py +0 -0
  87. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/init/components/primitives.py +0 -0
  88. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/init/components/styles/body.css +0 -0
  89. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/init/components/styles/footer.css +0 -0
  90. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/init/components/styles/header.css +0 -0
  91. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/init/components/styles/primitives.css +0 -0
  92. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/init/report.py +0 -0
  93. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/init/styles/report.css +0 -0
  94. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/init/styles/tokens.css +0 -0
  95. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/accessible/README.md +0 -0
  96. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/accessible/output/.gitignore +0 -0
  97. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/accessible/output/.gitkeep +0 -0
  98. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/accessible/report.py +0 -0
  99. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/accessible/styles/report.css +0 -0
  100. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/accessible/vendor/fonts/Inter-Variable.ttf +0 -0
  101. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/invoice/output/.gitignore +0 -0
  102. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/invoice/output/.gitkeep +0 -0
  103. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/invoice/report.py +0 -0
  104. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/invoice/templates/invoice.css +0 -0
  105. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/invoice/templates/invoice.html +0 -0
  106. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/COMPLIANCE.md +0 -0
  107. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/README.md +0 -0
  108. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/SCAFFOLDING.md +0 -0
  109. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/assets/brand-mark.svg +0 -0
  110. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/assets/reference-pattern.svg +0 -0
  111. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/components/__init__.py +0 -0
  112. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/components/appendix.py +0 -0
  113. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/components/architecture.py +0 -0
  114. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/components/cover.py +0 -0
  115. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/components/data_pages.py +0 -0
  116. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/components/fb_ui.py +0 -0
  117. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/components/primitives.py +0 -0
  118. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/components/styles/appendix.css +0 -0
  119. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/components/styles/architecture.css +0 -0
  120. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/components/styles/cover.css +0 -0
  121. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/components/styles/data.css +0 -0
  122. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/components/styles/primitives.css +0 -0
  123. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/components/styles/visuals.css +0 -0
  124. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/components/visuals.py +0 -0
  125. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/data/reference.json +0 -0
  126. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/output/.gitignore +0 -0
  127. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/report.py +0 -0
  128. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/styles/report.css +0 -0
  129. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/reference/styles/tokens.css +0 -0
  130. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/statement/output/.gitignore +0 -0
  131. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/statement/output/.gitkeep +0 -0
  132. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/statement/report.py +0 -0
  133. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/statement/templates/statement.css +0 -0
  134. {fullbleed-2.2.4 → fullbleed-2.2.5}/python/fullbleed_cli/scaffold_templates/new/statement/templates/statement.html +0 -0
  135. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/assets.rs +0 -0
  136. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/base64.rs +0 -0
  137. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/canvas.rs +0 -0
  138. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/css_native.rs +0 -0
  139. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/css_queries.rs +0 -0
  140. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/debug.rs +0 -0
  141. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/doc_context.rs +0 -0
  142. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/doc_template.rs +0 -0
  143. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/error.rs +0 -0
  144. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/finalize.rs +0 -0
  145. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/font.rs +0 -0
  146. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/font_subset.rs +0 -0
  147. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/frame.rs +0 -0
  148. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/glyph_report.rs +0 -0
  149. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/html.rs +0 -0
  150. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/html_dom.rs +0 -0
  151. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/html_entities.rs +0 -0
  152. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/html_entities_0.rs +0 -0
  153. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/html_entities_1.rs +0 -0
  154. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/html_entities_2.rs +0 -0
  155. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/html_entities_3.rs +0 -0
  156. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/html_entities_4.rs +0 -0
  157. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/html_entities_5.rs +0 -0
  158. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/image_native.rs +0 -0
  159. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/jit.rs +0 -0
  160. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/jpeg_native.rs +0 -0
  161. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/math.rs +0 -0
  162. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/metrics.rs +0 -0
  163. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/native_shape.rs +0 -0
  164. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/page_data.rs +0 -0
  165. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/page_template.rs +0 -0
  166. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/parallel.rs +0 -0
  167. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/pdf_encodings.rs +0 -0
  168. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/pdf_native.rs +0 -0
  169. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/pdf_raster.rs +0 -0
  170. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/pdfinspect.rs +0 -0
  171. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/perf.rs +0 -0
  172. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/plan.rs +0 -0
  173. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/python_abi.rs +0 -0
  174. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/raster.rs +0 -0
  175. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/raster_native.rs +0 -0
  176. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/sfnt.rs +0 -0
  177. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/sfnt_cff.rs +0 -0
  178. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/sfnt_outline.rs +0 -0
  179. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/spill.rs +0 -0
  180. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/svg.rs +0 -0
  181. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/text_shape.rs +0 -0
  182. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/types.rs +0 -0
  183. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/unicode_data.rs +0 -0
  184. {fullbleed-2.2.4 → fullbleed-2.2.5}/src/xml.rs +0 -0
@@ -4,7 +4,7 @@ version = 4
4
4
 
5
5
  [[package]]
6
6
  name = "fullbleed"
7
- version = "2.2.4"
7
+ version = "2.2.5"
8
8
  dependencies = [
9
9
  "fullbleed_audit_contract",
10
10
  "subsetter",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "fullbleed"
3
- version = "2.2.4"
3
+ version = "2.2.5"
4
4
  edition = "2024"
5
5
  rust-version = "1.85"
6
6
  license = "MIT"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fullbleed
3
- Version: 2.2.4
3
+ Version: 2.2.5
4
4
  Classifier: Development Status :: 5 - Production/Stable
5
5
  Classifier: License :: OSI Approved :: MIT License
6
6
  Classifier: Operating System :: MacOS
@@ -136,7 +136,7 @@ size-changing records render 200x faster. See
136
136
  [`docs/performance-architecture.md`](docs/performance-architecture.md) for the packed vector IR,
137
137
  typed-binding, virtual-linker, and shader roadmap.
138
138
 
139
- Fullbleed 2.2.4 adds a third compiler lane for
139
+ Fullbleed 2.2.5 hardens the third compiler lane introduced in 2.2.4 for
140
140
  size-changing records: `CompiledDocument.render_pdf_reflow_bindings(...)`. It parses and recovers
141
141
  the template DOM once and compiles encountered structural flow variants into guarded fixed-point
142
142
  display programs. Matching records bind directly into those programs; workers execute pre-shaped
@@ -144,15 +144,17 @@ text/TJ paint slots, cached static PDF page segments, page-local Deflate, and on
144
144
  Explicit trusted structural slots use `data-fb-bind-html="slot"`. A value that no compiled variant
145
145
  can safely place runs ordinary fixed-point layout once to add another variant.
146
146
 
147
- On the independent 1,000-distinct-record case study, the final ABI3 wheel's 29-sample hot
148
- direct-file run had a 168.839 ms median: **5,923 records/s and 10,365 pages/s**, with a 12,510
149
- pages/s best. It produced
147
+ On the independent 1,000-distinct-record case study, the 29-sample hot direct-file median was
148
+ 216.160 ms: **4,626 records/s and 8,096 pages/s**. The 168.995 ms best sample reached **5,917
149
+ records/s and 10,355 pages/s**. It produced
150
150
  the exact 1,750-page 500/300/150/50 reflow distribution and verified all 24,900 markers. The
151
151
  throughput-tuned 6,870,320-byte PDF was deterministic across all samples. With the compact
152
152
  compression setting, compiled output was also byte-for-byte identical to ordinary rendering:
153
153
  5,298,961 bytes and SHA-256 `bb3c441313a08fb00d3bd15f23a567981f3bbbd550908e3a9fe7a07ca5d7f138`.
154
- This is a hot compiled-variant result, not a claim for previously unseen structure; the first
155
- compile-on-demand batch measured 407.521 ms (4,294 pages/s).
154
+ This is a hot compiled-variant result, not a claim for previously unseen structure. The first
155
+ variant-discovery render measured 0.509 s (3,437 pages/s), and the fully cold job including setup,
156
+ bindings, compilation, discovery, and write measured 0.588 s (2,975 pages/s). The independently
157
+ observed hot-median speedup over the ordinary path was 43.8x.
156
158
 
157
159
  ## Install
158
160
 
@@ -165,7 +167,7 @@ python -m pip install fullbleed
165
167
  From a local wheel:
166
168
 
167
169
  ```bash
168
- python -m pip install C:\path\to\fullbleed-2.2.4-cp310-abi3-win_amd64.whl
170
+ python -m pip install C:\path\to\fullbleed-2.2.5-cp310-abi3-win_amd64.whl
169
171
  ```
170
172
 
171
173
  From a source checkout with Rust installed, no Python build package is needed:
@@ -618,7 +620,8 @@ Machine discovery:
618
620
  fullbleed capabilities --json
619
621
  ```
620
622
 
621
- Inspect the `svg` object in `fullbleed.capabilities.v1` for SVG support metadata.
623
+ Inspect the `svg` object in `fullbleed.capabilities.v1` for SVG support metadata. The `engine`
624
+ object also reports compiled-document/reflow availability and supported per-call compression modes.
622
625
  It reports the compiled `svg_raster` build feature plus a feature matrix for
623
626
  native-vector SVG, raster-fallback-required SVG, and unsupported/known-loss SVG
624
627
  features.
@@ -977,6 +980,7 @@ Module exports:
977
980
 
978
981
  - `PdfEngine`
979
982
  - `CompiledDocument`
983
+ - `CompiledFlowCompression`
980
984
  - `AssetBundle`
981
985
  - `Asset`
982
986
  - `AssetKind`
@@ -1025,8 +1029,8 @@ Module exports:
1025
1029
  | `render_pdf_batch(copies, deterministic_hash=None)` | `bytes` |
1026
1030
  | `render_pdf_bindings(bindings, deterministic_hash=None)` | `bytes` |
1027
1031
  | `render_pdf_bindings_to_file(bindings, path, deterministic_hash=None)` | `int` |
1028
- | `render_pdf_reflow_bindings(bindings, deterministic_hash=None)` | `bytes` |
1029
- | `render_pdf_reflow_bindings_to_file(bindings, path, deterministic_hash=None)` | `int` |
1032
+ | `render_pdf_reflow_bindings(bindings, deterministic_hash=None, *, compression="throughput")` | `bytes` |
1033
+ | `render_pdf_reflow_bindings_to_file(bindings, path, deterministic_hash=None, *, compression="throughput")` | `int` |
1030
1034
 
1031
1035
  The compiled lane runs parsing/layout once. `render_pdf_batch` virtualizes identical untagged page
1032
1036
  content. The fixed binding methods accept columnar `dict[str, list[str]]` data and emit distinct
@@ -1038,7 +1042,10 @@ The reflow binding methods use the same exact-column contract but execute the co
1038
1042
  program. `{{slot}}` values are literal text and may reshape, wrap, resize blocks, and change page
1039
1043
  counts. Empty elements can opt into trusted generated markup with
1040
1044
  `data-fb-bind-html="slot"`; those values replace the element's children. One DOM is reused per
1041
- native worker and record output is linked in input order through a bounded queue. See
1045
+ native worker and record output is linked in input order through a bounded queue. Structural slot
1046
+ values are parsed as trusted markup: sanitize untrusted input or use scalar `{{slot}}` bindings,
1047
+ which remain literal text. Choose `CompiledFlowCompression.Throughput` (default) or
1048
+ `CompiledFlowCompression.Compact` per render; modes can be mixed safely in one process. See
1042
1049
  [`docs/python-api.md`](docs/python-api.md) for the trust boundary and current limitations.
1043
1050
 
1044
1051
  When `deterministic_hash` is set, engine writes PDF SHA-256 to the provided file path.
@@ -99,7 +99,7 @@ size-changing records render 200x faster. See
99
99
  [`docs/performance-architecture.md`](docs/performance-architecture.md) for the packed vector IR,
100
100
  typed-binding, virtual-linker, and shader roadmap.
101
101
 
102
- Fullbleed 2.2.4 adds a third compiler lane for
102
+ Fullbleed 2.2.5 hardens the third compiler lane introduced in 2.2.4 for
103
103
  size-changing records: `CompiledDocument.render_pdf_reflow_bindings(...)`. It parses and recovers
104
104
  the template DOM once and compiles encountered structural flow variants into guarded fixed-point
105
105
  display programs. Matching records bind directly into those programs; workers execute pre-shaped
@@ -107,15 +107,17 @@ text/TJ paint slots, cached static PDF page segments, page-local Deflate, and on
107
107
  Explicit trusted structural slots use `data-fb-bind-html="slot"`. A value that no compiled variant
108
108
  can safely place runs ordinary fixed-point layout once to add another variant.
109
109
 
110
- On the independent 1,000-distinct-record case study, the final ABI3 wheel's 29-sample hot
111
- direct-file run had a 168.839 ms median: **5,923 records/s and 10,365 pages/s**, with a 12,510
112
- pages/s best. It produced
110
+ On the independent 1,000-distinct-record case study, the 29-sample hot direct-file median was
111
+ 216.160 ms: **4,626 records/s and 8,096 pages/s**. The 168.995 ms best sample reached **5,917
112
+ records/s and 10,355 pages/s**. It produced
113
113
  the exact 1,750-page 500/300/150/50 reflow distribution and verified all 24,900 markers. The
114
114
  throughput-tuned 6,870,320-byte PDF was deterministic across all samples. With the compact
115
115
  compression setting, compiled output was also byte-for-byte identical to ordinary rendering:
116
116
  5,298,961 bytes and SHA-256 `bb3c441313a08fb00d3bd15f23a567981f3bbbd550908e3a9fe7a07ca5d7f138`.
117
- This is a hot compiled-variant result, not a claim for previously unseen structure; the first
118
- compile-on-demand batch measured 407.521 ms (4,294 pages/s).
117
+ This is a hot compiled-variant result, not a claim for previously unseen structure. The first
118
+ variant-discovery render measured 0.509 s (3,437 pages/s), and the fully cold job including setup,
119
+ bindings, compilation, discovery, and write measured 0.588 s (2,975 pages/s). The independently
120
+ observed hot-median speedup over the ordinary path was 43.8x.
119
121
 
120
122
  ## Install
121
123
 
@@ -128,7 +130,7 @@ python -m pip install fullbleed
128
130
  From a local wheel:
129
131
 
130
132
  ```bash
131
- python -m pip install C:\path\to\fullbleed-2.2.4-cp310-abi3-win_amd64.whl
133
+ python -m pip install C:\path\to\fullbleed-2.2.5-cp310-abi3-win_amd64.whl
132
134
  ```
133
135
 
134
136
  From a source checkout with Rust installed, no Python build package is needed:
@@ -581,7 +583,8 @@ Machine discovery:
581
583
  fullbleed capabilities --json
582
584
  ```
583
585
 
584
- Inspect the `svg` object in `fullbleed.capabilities.v1` for SVG support metadata.
586
+ Inspect the `svg` object in `fullbleed.capabilities.v1` for SVG support metadata. The `engine`
587
+ object also reports compiled-document/reflow availability and supported per-call compression modes.
585
588
  It reports the compiled `svg_raster` build feature plus a feature matrix for
586
589
  native-vector SVG, raster-fallback-required SVG, and unsupported/known-loss SVG
587
590
  features.
@@ -940,6 +943,7 @@ Module exports:
940
943
 
941
944
  - `PdfEngine`
942
945
  - `CompiledDocument`
946
+ - `CompiledFlowCompression`
943
947
  - `AssetBundle`
944
948
  - `Asset`
945
949
  - `AssetKind`
@@ -988,8 +992,8 @@ Module exports:
988
992
  | `render_pdf_batch(copies, deterministic_hash=None)` | `bytes` |
989
993
  | `render_pdf_bindings(bindings, deterministic_hash=None)` | `bytes` |
990
994
  | `render_pdf_bindings_to_file(bindings, path, deterministic_hash=None)` | `int` |
991
- | `render_pdf_reflow_bindings(bindings, deterministic_hash=None)` | `bytes` |
992
- | `render_pdf_reflow_bindings_to_file(bindings, path, deterministic_hash=None)` | `int` |
995
+ | `render_pdf_reflow_bindings(bindings, deterministic_hash=None, *, compression="throughput")` | `bytes` |
996
+ | `render_pdf_reflow_bindings_to_file(bindings, path, deterministic_hash=None, *, compression="throughput")` | `int` |
993
997
 
994
998
  The compiled lane runs parsing/layout once. `render_pdf_batch` virtualizes identical untagged page
995
999
  content. The fixed binding methods accept columnar `dict[str, list[str]]` data and emit distinct
@@ -1001,7 +1005,10 @@ The reflow binding methods use the same exact-column contract but execute the co
1001
1005
  program. `{{slot}}` values are literal text and may reshape, wrap, resize blocks, and change page
1002
1006
  counts. Empty elements can opt into trusted generated markup with
1003
1007
  `data-fb-bind-html="slot"`; those values replace the element's children. One DOM is reused per
1004
- native worker and record output is linked in input order through a bounded queue. See
1008
+ native worker and record output is linked in input order through a bounded queue. Structural slot
1009
+ values are parsed as trusted markup: sanitize untrusted input or use scalar `{{slot}}` bindings,
1010
+ which remain literal text. Choose `CompiledFlowCompression.Throughput` (default) or
1011
+ `CompiledFlowCompression.Compact` per render; modes can be mixed safely in one process. See
1005
1012
  [`docs/python-api.md`](docs/python-api.md) for the trust boundary and current limitations.
1006
1013
 
1007
1014
  When `deterministic_hash` is set, engine writes PDF SHA-256 to the provided file path.
@@ -5,7 +5,7 @@ backend-path = ["build_backend"]
5
5
 
6
6
  [project]
7
7
  name = "fullbleed"
8
- version = "2.2.4"
8
+ version = "2.2.5"
9
9
  description = "Deterministic static HTML/CSS-to-PDF renderer built in Rust"
10
10
  readme = "README.md"
11
11
  requires-python = ">=3.10"
@@ -54,6 +54,16 @@ class AssetKind(metaclass=_NativeFacadeType):
54
54
  raise TypeError("No constructor defined for AssetKind")
55
55
 
56
56
 
57
+ class CompiledFlowCompression(metaclass=_NativeFacadeType):
58
+ """Per-call size/speed policy for compiled content-reflow PDF streams."""
59
+
60
+ Throughput = "throughput"
61
+ Compact = "compact"
62
+
63
+ def __new__(cls, /, *args, **kwargs):
64
+ raise TypeError("No constructor defined for CompiledFlowCompression")
65
+
66
+
57
67
  class Asset(metaclass=_NativeFacadeType):
58
68
  __slots__ = ("_handle",)
59
69
 
@@ -219,25 +229,42 @@ class CompiledDocument(metaclass=_NativeFacadeType):
219
229
  deterministic_hash,
220
230
  )
221
231
 
222
- def render_pdf_reflow_bindings(self, /, bindings, deterministic_hash=None):
232
+ def render_pdf_reflow_bindings(
233
+ self,
234
+ /,
235
+ bindings,
236
+ deterministic_hash=None,
237
+ *,
238
+ compression=CompiledFlowCompression.Throughput,
239
+ ):
223
240
  """Render columnar text bindings with content-driven layout and pagination."""
241
+ _require_string(compression, "compression")
224
242
  return _call(
225
243
  self._handle,
226
244
  "CompiledDocument.render_pdf_reflow_bindings",
227
245
  bindings,
228
246
  deterministic_hash,
247
+ compression,
229
248
  )
230
249
 
231
250
  def render_pdf_reflow_bindings_to_file(
232
- self, /, bindings, path, deterministic_hash=None
251
+ self,
252
+ /,
253
+ bindings,
254
+ path,
255
+ deterministic_hash=None,
256
+ *,
257
+ compression=CompiledFlowCompression.Throughput,
233
258
  ):
234
259
  """Stream a compiled content-reflow batch directly to ``path``."""
260
+ _require_string(compression, "compression")
235
261
  return _call(
236
262
  self._handle,
237
263
  "CompiledDocument.render_pdf_reflow_bindings_to_file",
238
264
  bindings,
239
265
  path,
240
266
  deterministic_hash,
267
+ compression,
241
268
  )
242
269
 
243
270
 
@@ -579,7 +606,9 @@ class PdfEngine(metaclass=_NativeFacadeType):
579
606
  )
580
607
 
581
608
  def render_pdf(self, /, html, css, deterministic_hash=None):
582
- return _call(self._handle, "PdfEngine.render_pdf", html, css, deterministic_hash)
609
+ return _call(
610
+ self._handle, "PdfEngine.render_pdf", html, css, deterministic_hash
611
+ )
583
612
 
584
613
  def compile_pdf(self, /, html, css):
585
614
  handle = _call(self._handle, "PdfEngine.compile_pdf", html, css)
@@ -747,7 +776,9 @@ class PdfEngine(metaclass=_NativeFacadeType):
747
776
  deterministic_hash,
748
777
  )
749
778
 
750
- def render_pdf_batch_to_file(self, /, html_list, css, path, deterministic_hash=None):
779
+ def render_pdf_batch_to_file(
780
+ self, /, html_list, css, path, deterministic_hash=None
781
+ ):
751
782
  return _call(
752
783
  self._handle,
753
784
  "PdfEngine.render_pdf_batch_to_file",
@@ -897,6 +928,7 @@ def audit_sparse_page_visual_pair(source_png_path, render_png_path):
897
928
  __all__ = [
898
929
  "PdfEngine",
899
930
  "CompiledDocument",
931
+ "CompiledFlowCompression",
900
932
  "AssetKind",
901
933
  "Asset",
902
934
  "AssetBundle",
@@ -925,6 +957,7 @@ __all__ = [
925
957
  _CLASS_NAMES = {
926
958
  "PdfEngine",
927
959
  "CompiledDocument",
960
+ "CompiledFlowCompression",
928
961
  "AssetKind",
929
962
  "Asset",
930
963
  "AssetBundle",
@@ -2793,6 +2793,8 @@ def cmd_capabilities(args):
2793
2793
  build_features = {}
2794
2794
  svg_raster_available = bool(build_features.get("svg_raster", False))
2795
2795
  pdf_engine = getattr(fullbleed, "PdfEngine", None)
2796
+ compiled_document = getattr(fullbleed, "CompiledDocument", None)
2797
+ compression_modes = list(build_features.get("compiled_flow_compression_modes", []))
2796
2798
 
2797
2799
  commands = [
2798
2800
  "render",
@@ -2828,6 +2830,14 @@ def cmd_capabilities(args):
2828
2830
  "--repro-check",
2829
2831
  ],
2830
2832
  "engine": {
2833
+ "compiled_document": bool(pdf_engine and hasattr(pdf_engine, "compile_pdf")),
2834
+ "compiled_reflow_bindings": bool(
2835
+ build_features.get("compiled_reflow", False)
2836
+ and pdf_engine
2837
+ and compiled_document
2838
+ and hasattr(compiled_document, "render_pdf_reflow_bindings")
2839
+ ),
2840
+ "compiled_flow_compression_modes": compression_modes,
2831
2841
  "batch_render": bool(pdf_engine and hasattr(pdf_engine, "render_pdf_batch")),
2832
2842
  "batch_render_parallel": bool(
2833
2843
  pdf_engine and hasattr(pdf_engine, "render_pdf_batch_parallel")
@@ -3677,5 +3687,3 @@ if __name__ == "__main__":
3677
3687
  raise SystemExit(main())
3678
3688
 
3679
3689
 
3680
-
3681
-
@@ -1,6 +1,4 @@
1
1
  use std::cell::RefCell;
2
- use std::sync::OnceLock;
3
-
4
2
  const ADLER_BASE: u32 = 65_521;
5
3
  const DEFAULT_ADLER_CHUNK: usize = 1 << 20;
6
4
  const ADLER_NMAX: usize = 5_552;
@@ -425,15 +423,14 @@ pub(crate) fn zlib_deflate_parallel(data: &[u8]) -> Vec<u8> {
425
423
  zlib_deflate_with_chain(data, MAX_CHAIN_STEPS)
426
424
  }
427
425
 
428
- pub(crate) fn zlib_deflate_compiled_flow(data: &[u8]) -> Vec<u8> {
429
- static COMPILED_FLOW_CHAIN_STEPS: OnceLock<usize> = OnceLock::new();
430
- let steps = *COMPILED_FLOW_CHAIN_STEPS.get_or_init(|| {
431
- std::env::var("FULLBLEED_COMPILED_FLOW_DEFLATE_CHAIN")
432
- .ok()
433
- .and_then(|value| value.parse::<usize>().ok())
434
- .unwrap_or(DEFAULT_COMPILED_FLOW_CHAIN_STEPS)
435
- .clamp(1, MAX_CHAIN_STEPS)
436
- });
426
+ pub(crate) fn zlib_deflate_compiled_flow(
427
+ data: &[u8],
428
+ compression: crate::pdf::CompiledFlowCompression,
429
+ ) -> Vec<u8> {
430
+ let steps = match compression {
431
+ crate::pdf::CompiledFlowCompression::Throughput => DEFAULT_COMPILED_FLOW_CHAIN_STEPS,
432
+ crate::pdf::CompiledFlowCompression::Compact => MAX_CHAIN_STEPS,
433
+ };
437
434
  let steps = if data.len() < COMPILED_FLOW_THROUGHPUT_MIN_BYTES {
438
435
  MAX_CHAIN_STEPS
439
436
  } else {
@@ -923,6 +920,32 @@ mod tests {
923
920
  }
924
921
  }
925
922
 
923
+ #[test]
924
+ fn compiled_flow_compression_modes_are_per_call_and_deterministic() {
925
+ use crate::pdf::CompiledFlowCompression::{Compact, Throughput};
926
+
927
+ let src = (0..8_000)
928
+ .map(|index| format!("BT /F1 10 Tf 72 720 Td [(RECORD-{index:05})] TJ ET\n"))
929
+ .collect::<String>()
930
+ .into_bytes();
931
+ let throughput = zlib_deflate_compiled_flow(&src, Throughput);
932
+ let compact = zlib_deflate_compiled_flow(&src, Compact);
933
+ assert_eq!(throughput, zlib_deflate_compiled_flow(&src, Throughput));
934
+ assert_eq!(compact, zlib_deflate_compiled_flow(&src, Compact));
935
+ assert_eq!(
936
+ zlib_inflate(&throughput, src.len()).expect("throughput roundtrip"),
937
+ src
938
+ );
939
+ assert_eq!(
940
+ zlib_inflate(&compact, src.len()).expect("compact roundtrip"),
941
+ src
942
+ );
943
+ assert!(
944
+ compact.len() <= throughput.len(),
945
+ "compact search should not produce a larger representative stream"
946
+ );
947
+ }
948
+
926
949
  #[test]
927
950
  fn zlib_lz77_roundtrip_empty() {
928
951
  let src: Vec<u8> = Vec::new();
@@ -33108,8 +33108,20 @@ impl Flowable for ContainerFlowable {
33108
33108
  && sibling_boundary_context
33109
33109
  && combined_occupied_height - remaining_height <= Pt::from_milli_i64(1_500)
33110
33110
  && child.has_paint_only_fixed_height_tail(content_width, child_available_height);
33111
+ // Relax `break-inside: avoid` before deferring an oversized box.
33112
+ // The UA stylesheet gives tables this value too, so suppressing a
33113
+ // split merely because earlier siblings were placed orphaned a
33114
+ // kept heading and moved a long, splittable table to the next
33115
+ // page. The same behavior wasted the remainder before an
33116
+ // oversized authored keep-together block. Avoidance is only
33117
+ // actionable when the complete box can fit a fresh fragmentainer.
33118
+ let fresh_size =
33119
+ avoids_page_break.then(|| child.wrap(content_width, available_content_height));
33120
+ let fits_fresh_fragmentainer =
33121
+ fresh_size.is_some_and(|fresh| fresh.height <= available_content_height);
33111
33122
  let child_split = if paint_only_edge_overhang
33112
33123
  || (avoids_page_break
33124
+ && fits_fresh_fragmentainer
33113
33125
  && ((!placed.is_empty() && !follows_only_table_captions)
33114
33126
  || size.height <= available_content_height))
33115
33127
  {