kreuzberg 4.0.8 → 4.1.0

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 (308) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +2 -2
  3. data/README.md +1 -1
  4. data/ext/kreuzberg_rb/native/Cargo.lock +94 -98
  5. data/ext/kreuzberg_rb/native/Cargo.toml +4 -2
  6. data/ext/kreuzberg_rb/native/src/batch.rs +139 -0
  7. data/ext/kreuzberg_rb/native/src/config/mod.rs +10 -0
  8. data/ext/kreuzberg_rb/native/src/config/types.rs +1058 -0
  9. data/ext/kreuzberg_rb/native/src/error_handling.rs +125 -0
  10. data/ext/kreuzberg_rb/native/src/extraction.rs +79 -0
  11. data/ext/kreuzberg_rb/native/src/gc_guarded_value.rs +35 -0
  12. data/ext/kreuzberg_rb/native/src/helpers.rs +176 -0
  13. data/ext/kreuzberg_rb/native/src/lib.rs +342 -3622
  14. data/ext/kreuzberg_rb/native/src/metadata.rs +34 -0
  15. data/ext/kreuzberg_rb/native/src/plugins/mod.rs +92 -0
  16. data/ext/kreuzberg_rb/native/src/plugins/ocr_backend.rs +159 -0
  17. data/ext/kreuzberg_rb/native/src/plugins/post_processor.rs +126 -0
  18. data/ext/kreuzberg_rb/native/src/plugins/validator.rs +99 -0
  19. data/ext/kreuzberg_rb/native/src/result.rs +326 -0
  20. data/ext/kreuzberg_rb/native/src/validation.rs +4 -0
  21. data/lib/kreuzberg/config.rb +66 -0
  22. data/lib/kreuzberg/result.rb +107 -2
  23. data/lib/kreuzberg/types.rb +104 -0
  24. data/lib/kreuzberg/version.rb +1 -1
  25. data/lib/kreuzberg.rb +0 -4
  26. data/sig/kreuzberg.rbs +105 -1
  27. data/vendor/Cargo.toml +3 -3
  28. data/vendor/kreuzberg/Cargo.toml +4 -3
  29. data/vendor/kreuzberg/README.md +1 -1
  30. data/vendor/kreuzberg/src/api/config.rs +69 -0
  31. data/vendor/kreuzberg/src/api/handlers.rs +99 -2
  32. data/vendor/kreuzberg/src/api/mod.rs +14 -7
  33. data/vendor/kreuzberg/src/api/router.rs +214 -0
  34. data/vendor/kreuzberg/src/api/startup.rs +243 -0
  35. data/vendor/kreuzberg/src/api/types.rs +78 -0
  36. data/vendor/kreuzberg/src/cache/cleanup.rs +277 -0
  37. data/vendor/kreuzberg/src/cache/core.rs +428 -0
  38. data/vendor/kreuzberg/src/cache/mod.rs +21 -843
  39. data/vendor/kreuzberg/src/cache/utilities.rs +156 -0
  40. data/vendor/kreuzberg/src/chunking/boundaries.rs +301 -0
  41. data/vendor/kreuzberg/src/chunking/builder.rs +294 -0
  42. data/vendor/kreuzberg/src/chunking/config.rs +52 -0
  43. data/vendor/kreuzberg/src/chunking/core.rs +1017 -0
  44. data/vendor/kreuzberg/src/chunking/mod.rs +14 -2211
  45. data/vendor/kreuzberg/src/chunking/processor.rs +10 -0
  46. data/vendor/kreuzberg/src/chunking/validation.rs +686 -0
  47. data/vendor/kreuzberg/src/core/config/extraction/core.rs +169 -0
  48. data/vendor/kreuzberg/src/core/config/extraction/env.rs +179 -0
  49. data/vendor/kreuzberg/src/core/config/extraction/loaders.rs +204 -0
  50. data/vendor/kreuzberg/src/core/config/extraction/mod.rs +42 -0
  51. data/vendor/kreuzberg/src/core/config/extraction/types.rs +93 -0
  52. data/vendor/kreuzberg/src/core/config/formats.rs +135 -0
  53. data/vendor/kreuzberg/src/core/config/mod.rs +20 -0
  54. data/vendor/kreuzberg/src/core/config/ocr.rs +73 -0
  55. data/vendor/kreuzberg/src/core/config/page.rs +57 -0
  56. data/vendor/kreuzberg/src/core/config/pdf.rs +111 -0
  57. data/vendor/kreuzberg/src/core/config/processing.rs +312 -0
  58. data/vendor/kreuzberg/src/core/config_validation/dependencies.rs +187 -0
  59. data/vendor/kreuzberg/src/core/config_validation/mod.rs +386 -0
  60. data/vendor/kreuzberg/src/core/config_validation/sections.rs +401 -0
  61. data/vendor/kreuzberg/src/core/extractor/batch.rs +246 -0
  62. data/vendor/kreuzberg/src/core/extractor/bytes.rs +116 -0
  63. data/vendor/kreuzberg/src/core/extractor/file.rs +240 -0
  64. data/vendor/kreuzberg/src/core/extractor/helpers.rs +71 -0
  65. data/vendor/kreuzberg/src/core/extractor/legacy.rs +62 -0
  66. data/vendor/kreuzberg/src/core/extractor/mod.rs +490 -0
  67. data/vendor/kreuzberg/src/core/extractor/sync.rs +208 -0
  68. data/vendor/kreuzberg/src/core/mod.rs +4 -1
  69. data/vendor/kreuzberg/src/core/pipeline/cache.rs +60 -0
  70. data/vendor/kreuzberg/src/core/pipeline/execution.rs +89 -0
  71. data/vendor/kreuzberg/src/core/pipeline/features.rs +108 -0
  72. data/vendor/kreuzberg/src/core/pipeline/format.rs +392 -0
  73. data/vendor/kreuzberg/src/core/pipeline/initialization.rs +67 -0
  74. data/vendor/kreuzberg/src/core/pipeline/mod.rs +135 -0
  75. data/vendor/kreuzberg/src/core/pipeline/tests.rs +975 -0
  76. data/vendor/kreuzberg/src/core/server_config/env.rs +90 -0
  77. data/vendor/kreuzberg/src/core/server_config/loader.rs +202 -0
  78. data/vendor/kreuzberg/src/core/server_config/mod.rs +380 -0
  79. data/vendor/kreuzberg/src/core/server_config/tests/basic_tests.rs +124 -0
  80. data/vendor/kreuzberg/src/core/server_config/tests/env_tests.rs +216 -0
  81. data/vendor/kreuzberg/src/core/server_config/tests/file_loading_tests.rs +341 -0
  82. data/vendor/kreuzberg/src/core/server_config/tests/mod.rs +5 -0
  83. data/vendor/kreuzberg/src/core/server_config/validation.rs +17 -0
  84. data/vendor/kreuzberg/src/embeddings.rs +136 -13
  85. data/vendor/kreuzberg/src/extraction/{archive.rs → archive/mod.rs} +45 -239
  86. data/vendor/kreuzberg/src/extraction/archive/sevenz.rs +98 -0
  87. data/vendor/kreuzberg/src/extraction/archive/tar.rs +118 -0
  88. data/vendor/kreuzberg/src/extraction/archive/zip.rs +101 -0
  89. data/vendor/kreuzberg/src/extraction/html/converter.rs +592 -0
  90. data/vendor/kreuzberg/src/extraction/html/image_handling.rs +95 -0
  91. data/vendor/kreuzberg/src/extraction/html/mod.rs +53 -0
  92. data/vendor/kreuzberg/src/extraction/html/processor.rs +659 -0
  93. data/vendor/kreuzberg/src/extraction/html/stack_management.rs +103 -0
  94. data/vendor/kreuzberg/src/extraction/html/types.rs +28 -0
  95. data/vendor/kreuzberg/src/extraction/mod.rs +6 -2
  96. data/vendor/kreuzberg/src/extraction/pptx/container.rs +159 -0
  97. data/vendor/kreuzberg/src/extraction/pptx/content_builder.rs +168 -0
  98. data/vendor/kreuzberg/src/extraction/pptx/elements.rs +132 -0
  99. data/vendor/kreuzberg/src/extraction/pptx/image_handling.rs +57 -0
  100. data/vendor/kreuzberg/src/extraction/pptx/metadata.rs +160 -0
  101. data/vendor/kreuzberg/src/extraction/pptx/mod.rs +558 -0
  102. data/vendor/kreuzberg/src/extraction/pptx/parser.rs +379 -0
  103. data/vendor/kreuzberg/src/extraction/transform/content.rs +205 -0
  104. data/vendor/kreuzberg/src/extraction/transform/elements.rs +211 -0
  105. data/vendor/kreuzberg/src/extraction/transform/mod.rs +480 -0
  106. data/vendor/kreuzberg/src/extraction/transform/types.rs +27 -0
  107. data/vendor/kreuzberg/src/extractors/archive.rs +2 -0
  108. data/vendor/kreuzberg/src/extractors/bibtex.rs +2 -0
  109. data/vendor/kreuzberg/src/extractors/djot_format/attributes.rs +134 -0
  110. data/vendor/kreuzberg/src/extractors/djot_format/conversion.rs +223 -0
  111. data/vendor/kreuzberg/src/extractors/djot_format/extractor.rs +172 -0
  112. data/vendor/kreuzberg/src/extractors/djot_format/mod.rs +24 -0
  113. data/vendor/kreuzberg/src/extractors/djot_format/parsing/block_handlers.rs +271 -0
  114. data/vendor/kreuzberg/src/extractors/djot_format/parsing/content_extraction.rs +257 -0
  115. data/vendor/kreuzberg/src/extractors/djot_format/parsing/event_handlers.rs +101 -0
  116. data/vendor/kreuzberg/src/extractors/djot_format/parsing/inline_handlers.rs +201 -0
  117. data/vendor/kreuzberg/src/extractors/djot_format/parsing/mod.rs +16 -0
  118. data/vendor/kreuzberg/src/extractors/djot_format/parsing/state.rs +78 -0
  119. data/vendor/kreuzberg/src/extractors/djot_format/parsing/table_extraction.rs +68 -0
  120. data/vendor/kreuzberg/src/extractors/djot_format/parsing/text_extraction.rs +61 -0
  121. data/vendor/kreuzberg/src/extractors/djot_format/rendering.rs +452 -0
  122. data/vendor/kreuzberg/src/extractors/docbook.rs +2 -0
  123. data/vendor/kreuzberg/src/extractors/docx.rs +12 -1
  124. data/vendor/kreuzberg/src/extractors/email.rs +2 -0
  125. data/vendor/kreuzberg/src/extractors/epub/content.rs +333 -0
  126. data/vendor/kreuzberg/src/extractors/epub/metadata.rs +137 -0
  127. data/vendor/kreuzberg/src/extractors/epub/mod.rs +186 -0
  128. data/vendor/kreuzberg/src/extractors/epub/parsing.rs +86 -0
  129. data/vendor/kreuzberg/src/extractors/excel.rs +4 -0
  130. data/vendor/kreuzberg/src/extractors/fictionbook.rs +2 -0
  131. data/vendor/kreuzberg/src/extractors/frontmatter_utils.rs +466 -0
  132. data/vendor/kreuzberg/src/extractors/html.rs +80 -8
  133. data/vendor/kreuzberg/src/extractors/image.rs +8 -1
  134. data/vendor/kreuzberg/src/extractors/jats/elements.rs +350 -0
  135. data/vendor/kreuzberg/src/extractors/jats/metadata.rs +21 -0
  136. data/vendor/kreuzberg/src/extractors/{jats.rs → jats/mod.rs} +10 -412
  137. data/vendor/kreuzberg/src/extractors/jats/parser.rs +52 -0
  138. data/vendor/kreuzberg/src/extractors/jupyter.rs +2 -0
  139. data/vendor/kreuzberg/src/extractors/latex/commands.rs +93 -0
  140. data/vendor/kreuzberg/src/extractors/latex/environments.rs +157 -0
  141. data/vendor/kreuzberg/src/extractors/latex/metadata.rs +27 -0
  142. data/vendor/kreuzberg/src/extractors/latex/mod.rs +146 -0
  143. data/vendor/kreuzberg/src/extractors/latex/parser.rs +231 -0
  144. data/vendor/kreuzberg/src/extractors/latex/utilities.rs +126 -0
  145. data/vendor/kreuzberg/src/extractors/markdown.rs +39 -162
  146. data/vendor/kreuzberg/src/extractors/mod.rs +9 -1
  147. data/vendor/kreuzberg/src/extractors/odt.rs +2 -0
  148. data/vendor/kreuzberg/src/extractors/opml/core.rs +165 -0
  149. data/vendor/kreuzberg/src/extractors/opml/mod.rs +31 -0
  150. data/vendor/kreuzberg/src/extractors/opml/parser.rs +479 -0
  151. data/vendor/kreuzberg/src/extractors/orgmode.rs +2 -0
  152. data/vendor/kreuzberg/src/extractors/pdf/extraction.rs +106 -0
  153. data/vendor/kreuzberg/src/extractors/{pdf.rs → pdf/mod.rs} +25 -324
  154. data/vendor/kreuzberg/src/extractors/pdf/ocr.rs +214 -0
  155. data/vendor/kreuzberg/src/extractors/pdf/pages.rs +51 -0
  156. data/vendor/kreuzberg/src/extractors/pptx.rs +9 -2
  157. data/vendor/kreuzberg/src/extractors/rst.rs +2 -0
  158. data/vendor/kreuzberg/src/extractors/rtf/encoding.rs +116 -0
  159. data/vendor/kreuzberg/src/extractors/rtf/formatting.rs +24 -0
  160. data/vendor/kreuzberg/src/extractors/rtf/images.rs +72 -0
  161. data/vendor/kreuzberg/src/extractors/rtf/metadata.rs +216 -0
  162. data/vendor/kreuzberg/src/extractors/rtf/mod.rs +142 -0
  163. data/vendor/kreuzberg/src/extractors/rtf/parser.rs +259 -0
  164. data/vendor/kreuzberg/src/extractors/rtf/tables.rs +83 -0
  165. data/vendor/kreuzberg/src/extractors/structured.rs +2 -0
  166. data/vendor/kreuzberg/src/extractors/text.rs +4 -0
  167. data/vendor/kreuzberg/src/extractors/typst.rs +2 -0
  168. data/vendor/kreuzberg/src/extractors/xml.rs +2 -0
  169. data/vendor/kreuzberg/src/keywords/processor.rs +14 -0
  170. data/vendor/kreuzberg/src/language_detection/processor.rs +10 -0
  171. data/vendor/kreuzberg/src/lib.rs +2 -2
  172. data/vendor/kreuzberg/src/mcp/errors.rs +312 -0
  173. data/vendor/kreuzberg/src/mcp/format.rs +211 -0
  174. data/vendor/kreuzberg/src/mcp/mod.rs +9 -3
  175. data/vendor/kreuzberg/src/mcp/params.rs +196 -0
  176. data/vendor/kreuzberg/src/mcp/server.rs +39 -1438
  177. data/vendor/kreuzberg/src/mcp/tools/cache.rs +179 -0
  178. data/vendor/kreuzberg/src/mcp/tools/extraction.rs +403 -0
  179. data/vendor/kreuzberg/src/mcp/tools/mime.rs +150 -0
  180. data/vendor/kreuzberg/src/mcp/tools/mod.rs +11 -0
  181. data/vendor/kreuzberg/src/ocr/backends/easyocr.rs +96 -0
  182. data/vendor/kreuzberg/src/ocr/backends/mod.rs +7 -0
  183. data/vendor/kreuzberg/src/ocr/backends/paddleocr.rs +27 -0
  184. data/vendor/kreuzberg/src/ocr/backends/tesseract.rs +134 -0
  185. data/vendor/kreuzberg/src/ocr/hocr.rs +60 -16
  186. data/vendor/kreuzberg/src/ocr/language_registry.rs +11 -235
  187. data/vendor/kreuzberg/src/ocr/mod.rs +1 -0
  188. data/vendor/kreuzberg/src/ocr/processor/config.rs +203 -0
  189. data/vendor/kreuzberg/src/ocr/processor/execution.rs +494 -0
  190. data/vendor/kreuzberg/src/ocr/processor/mod.rs +265 -0
  191. data/vendor/kreuzberg/src/ocr/processor/validation.rs +145 -0
  192. data/vendor/kreuzberg/src/ocr/tesseract_backend.rs +41 -24
  193. data/vendor/kreuzberg/src/pdf/bindings.rs +21 -8
  194. data/vendor/kreuzberg/src/pdf/hierarchy/bounding_box.rs +289 -0
  195. data/vendor/kreuzberg/src/pdf/hierarchy/clustering.rs +199 -0
  196. data/vendor/kreuzberg/src/pdf/{hierarchy.rs → hierarchy/extraction.rs} +6 -346
  197. data/vendor/kreuzberg/src/pdf/hierarchy/mod.rs +18 -0
  198. data/vendor/kreuzberg/src/plugins/extractor/mod.rs +319 -0
  199. data/vendor/kreuzberg/src/plugins/extractor/registry.rs +434 -0
  200. data/vendor/kreuzberg/src/plugins/extractor/trait.rs +391 -0
  201. data/vendor/kreuzberg/src/plugins/mod.rs +13 -0
  202. data/vendor/kreuzberg/src/plugins/ocr.rs +11 -0
  203. data/vendor/kreuzberg/src/plugins/processor/mod.rs +365 -0
  204. data/vendor/kreuzberg/src/plugins/processor/registry.rs +37 -0
  205. data/vendor/kreuzberg/src/plugins/processor/trait.rs +284 -0
  206. data/vendor/kreuzberg/src/plugins/registry/extractor.rs +416 -0
  207. data/vendor/kreuzberg/src/plugins/registry/mod.rs +116 -0
  208. data/vendor/kreuzberg/src/plugins/registry/ocr.rs +293 -0
  209. data/vendor/kreuzberg/src/plugins/registry/processor.rs +304 -0
  210. data/vendor/kreuzberg/src/plugins/registry/validator.rs +238 -0
  211. data/vendor/kreuzberg/src/plugins/validator/mod.rs +424 -0
  212. data/vendor/kreuzberg/src/plugins/validator/registry.rs +355 -0
  213. data/vendor/kreuzberg/src/plugins/validator/trait.rs +276 -0
  214. data/vendor/kreuzberg/src/stopwords/languages/asian.rs +40 -0
  215. data/vendor/kreuzberg/src/stopwords/languages/germanic.rs +36 -0
  216. data/vendor/kreuzberg/src/stopwords/languages/mod.rs +10 -0
  217. data/vendor/kreuzberg/src/stopwords/languages/other.rs +44 -0
  218. data/vendor/kreuzberg/src/stopwords/languages/romance.rs +36 -0
  219. data/vendor/kreuzberg/src/stopwords/languages/slavic.rs +36 -0
  220. data/vendor/kreuzberg/src/stopwords/mod.rs +7 -33
  221. data/vendor/kreuzberg/src/text/quality.rs +1 -1
  222. data/vendor/kreuzberg/src/text/quality_processor.rs +10 -0
  223. data/vendor/kreuzberg/src/text/token_reduction/core/analysis.rs +238 -0
  224. data/vendor/kreuzberg/src/text/token_reduction/core/mod.rs +8 -0
  225. data/vendor/kreuzberg/src/text/token_reduction/core/punctuation.rs +54 -0
  226. data/vendor/kreuzberg/src/text/token_reduction/core/reducer.rs +384 -0
  227. data/vendor/kreuzberg/src/text/token_reduction/core/sentence_selection.rs +68 -0
  228. data/vendor/kreuzberg/src/text/token_reduction/core/word_filtering.rs +156 -0
  229. data/vendor/kreuzberg/src/text/token_reduction/filters/general.rs +377 -0
  230. data/vendor/kreuzberg/src/text/token_reduction/filters/html.rs +51 -0
  231. data/vendor/kreuzberg/src/text/token_reduction/filters/markdown.rs +285 -0
  232. data/vendor/kreuzberg/src/text/token_reduction/filters.rs +131 -246
  233. data/vendor/kreuzberg/src/types/djot.rs +209 -0
  234. data/vendor/kreuzberg/src/types/extraction.rs +301 -0
  235. data/vendor/kreuzberg/src/types/formats.rs +443 -0
  236. data/vendor/kreuzberg/src/types/metadata.rs +560 -0
  237. data/vendor/kreuzberg/src/types/mod.rs +281 -0
  238. data/vendor/kreuzberg/src/types/page.rs +182 -0
  239. data/vendor/kreuzberg/src/types/serde_helpers.rs +132 -0
  240. data/vendor/kreuzberg/src/types/tables.rs +39 -0
  241. data/vendor/kreuzberg/src/utils/quality/heuristics.rs +58 -0
  242. data/vendor/kreuzberg/src/utils/{quality.rs → quality/mod.rs} +168 -489
  243. data/vendor/kreuzberg/src/utils/quality/patterns.rs +117 -0
  244. data/vendor/kreuzberg/src/utils/quality/scoring.rs +178 -0
  245. data/vendor/kreuzberg/src/utils/string_pool/buffer_pool.rs +325 -0
  246. data/vendor/kreuzberg/src/utils/string_pool/interned.rs +102 -0
  247. data/vendor/kreuzberg/src/utils/string_pool/language_pool.rs +119 -0
  248. data/vendor/kreuzberg/src/utils/string_pool/mime_pool.rs +235 -0
  249. data/vendor/kreuzberg/src/utils/string_pool/mod.rs +41 -0
  250. data/vendor/kreuzberg/tests/api_chunk.rs +313 -0
  251. data/vendor/kreuzberg/tests/api_embed.rs +6 -9
  252. data/vendor/kreuzberg/tests/batch_orchestration.rs +1 -0
  253. data/vendor/kreuzberg/tests/concurrency_stress.rs +7 -0
  254. data/vendor/kreuzberg/tests/core_integration.rs +1 -0
  255. data/vendor/kreuzberg/tests/docx_metadata_extraction_test.rs +130 -0
  256. data/vendor/kreuzberg/tests/epub_native_extractor_tests.rs +5 -14
  257. data/vendor/kreuzberg/tests/format_integration.rs +2 -0
  258. data/vendor/kreuzberg/tests/helpers/mod.rs +1 -0
  259. data/vendor/kreuzberg/tests/html_table_test.rs +11 -11
  260. data/vendor/kreuzberg/tests/ocr_configuration.rs +16 -0
  261. data/vendor/kreuzberg/tests/ocr_errors.rs +18 -0
  262. data/vendor/kreuzberg/tests/ocr_quality.rs +9 -0
  263. data/vendor/kreuzberg/tests/ocr_stress.rs +1 -0
  264. data/vendor/kreuzberg/tests/pipeline_integration.rs +50 -0
  265. data/vendor/kreuzberg/tests/plugin_ocr_backend_test.rs +13 -0
  266. data/vendor/kreuzberg/tests/plugin_system.rs +12 -0
  267. data/vendor/kreuzberg/tests/registry_integration_tests.rs +2 -0
  268. data/vendor/kreuzberg-ffi/Cargo.toml +2 -1
  269. data/vendor/kreuzberg-ffi/benches/result_view_benchmark.rs +2 -0
  270. data/vendor/kreuzberg-ffi/kreuzberg.h +347 -178
  271. data/vendor/kreuzberg-ffi/src/config/html.rs +318 -0
  272. data/vendor/kreuzberg-ffi/src/config/loader.rs +154 -0
  273. data/vendor/kreuzberg-ffi/src/config/merge.rs +104 -0
  274. data/vendor/kreuzberg-ffi/src/config/mod.rs +385 -0
  275. data/vendor/kreuzberg-ffi/src/config/parse.rs +91 -0
  276. data/vendor/kreuzberg-ffi/src/config/serialize.rs +118 -0
  277. data/vendor/kreuzberg-ffi/src/config_builder.rs +598 -0
  278. data/vendor/kreuzberg-ffi/src/error.rs +46 -14
  279. data/vendor/kreuzberg-ffi/src/helpers.rs +10 -0
  280. data/vendor/kreuzberg-ffi/src/html_options.rs +421 -0
  281. data/vendor/kreuzberg-ffi/src/lib.rs +16 -0
  282. data/vendor/kreuzberg-ffi/src/panic_shield.rs +11 -0
  283. data/vendor/kreuzberg-ffi/src/plugins/ocr_backend.rs +2 -0
  284. data/vendor/kreuzberg-ffi/src/result.rs +148 -122
  285. data/vendor/kreuzberg-ffi/src/result_view.rs +4 -0
  286. data/vendor/kreuzberg-tesseract/Cargo.toml +2 -2
  287. metadata +200 -28
  288. data/vendor/kreuzberg/src/api/server.rs +0 -518
  289. data/vendor/kreuzberg/src/core/config.rs +0 -1914
  290. data/vendor/kreuzberg/src/core/config_validation.rs +0 -949
  291. data/vendor/kreuzberg/src/core/extractor.rs +0 -1200
  292. data/vendor/kreuzberg/src/core/pipeline.rs +0 -1223
  293. data/vendor/kreuzberg/src/core/server_config.rs +0 -1220
  294. data/vendor/kreuzberg/src/extraction/html.rs +0 -1830
  295. data/vendor/kreuzberg/src/extraction/pptx.rs +0 -3102
  296. data/vendor/kreuzberg/src/extractors/epub.rs +0 -696
  297. data/vendor/kreuzberg/src/extractors/latex.rs +0 -653
  298. data/vendor/kreuzberg/src/extractors/opml.rs +0 -635
  299. data/vendor/kreuzberg/src/extractors/rtf.rs +0 -809
  300. data/vendor/kreuzberg/src/ocr/processor.rs +0 -858
  301. data/vendor/kreuzberg/src/plugins/extractor.rs +0 -1042
  302. data/vendor/kreuzberg/src/plugins/processor.rs +0 -650
  303. data/vendor/kreuzberg/src/plugins/registry.rs +0 -1339
  304. data/vendor/kreuzberg/src/plugins/validator.rs +0 -967
  305. data/vendor/kreuzberg/src/text/token_reduction/core.rs +0 -832
  306. data/vendor/kreuzberg/src/types.rs +0 -1713
  307. data/vendor/kreuzberg/src/utils/string_pool.rs +0 -762
  308. data/vendor/kreuzberg-ffi/src/config.rs +0 -1341
@@ -0,0 +1,452 @@
1
+ //! Djot content rendering to djot markup.
2
+ //!
3
+ //! Converts DjotContent structures back to valid djot markup with full formatting preservation.
4
+
5
+ use super::attributes::render_attributes;
6
+ use crate::types::{BlockType, FormattedBlock, InlineElement, InlineType};
7
+
8
+ /// Render a single block to djot markup.
9
+ pub fn render_block_to_djot(output: &mut String, block: &FormattedBlock, indent_level: usize) {
10
+ let indent = " ".repeat(indent_level);
11
+
12
+ // Render attributes if present
13
+ let attrs_str = block.attributes.as_ref().map(render_attributes).unwrap_or_default();
14
+
15
+ match block.block_type {
16
+ BlockType::Heading => {
17
+ let level = block.level.unwrap_or(1);
18
+ let hashes = "#".repeat(level);
19
+ output.push_str(&indent);
20
+ output.push_str(&hashes);
21
+ output.push(' ');
22
+ render_inline_content(output, &block.inline_content);
23
+ if !attrs_str.is_empty() {
24
+ output.push(' ');
25
+ output.push_str(&attrs_str);
26
+ }
27
+ output.push('\n');
28
+ output.push('\n');
29
+ }
30
+ BlockType::Paragraph => {
31
+ output.push_str(&indent);
32
+ render_inline_content(output, &block.inline_content);
33
+ if !attrs_str.is_empty() {
34
+ output.push(' ');
35
+ output.push_str(&attrs_str);
36
+ }
37
+ output.push('\n');
38
+ output.push('\n');
39
+ }
40
+ BlockType::CodeBlock => {
41
+ if !attrs_str.is_empty() {
42
+ output.push_str(&indent);
43
+ output.push_str(&attrs_str);
44
+ output.push('\n');
45
+ }
46
+ output.push_str(&indent);
47
+ output.push_str("```");
48
+ if let Some(ref lang) = block.language {
49
+ output.push(' ');
50
+ output.push_str(lang);
51
+ }
52
+ output.push('\n');
53
+ if let Some(ref code) = block.code {
54
+ for line in code.lines() {
55
+ output.push_str(&indent);
56
+ output.push_str(line);
57
+ output.push('\n');
58
+ }
59
+ } else {
60
+ // Fall back to inline content if code field is empty
61
+ for elem in &block.inline_content {
62
+ output.push_str(&indent);
63
+ output.push_str(&elem.content);
64
+ output.push('\n');
65
+ }
66
+ }
67
+ output.push_str(&indent);
68
+ output.push_str("```\n\n");
69
+ }
70
+ BlockType::Blockquote => {
71
+ if !attrs_str.is_empty() {
72
+ output.push_str(&indent);
73
+ output.push_str(&attrs_str);
74
+ output.push('\n');
75
+ }
76
+ // Render inline content as quoted
77
+ output.push_str(&indent);
78
+ output.push_str("> ");
79
+ render_inline_content(output, &block.inline_content);
80
+ output.push('\n');
81
+ // Render children (nested content)
82
+ for child in &block.children {
83
+ let child_output = {
84
+ let mut s = String::new();
85
+ render_block_to_djot(&mut s, child, 0);
86
+ s
87
+ };
88
+ for line in child_output.lines() {
89
+ output.push_str(&indent);
90
+ output.push_str("> ");
91
+ output.push_str(line);
92
+ output.push('\n');
93
+ }
94
+ }
95
+ output.push('\n');
96
+ }
97
+ BlockType::BulletList => {
98
+ if !attrs_str.is_empty() {
99
+ output.push_str(&indent);
100
+ output.push_str(&attrs_str);
101
+ output.push('\n');
102
+ }
103
+ for child in &block.children {
104
+ render_list_item(output, child, &indent, "- ");
105
+ }
106
+ output.push('\n');
107
+ }
108
+ BlockType::OrderedList => {
109
+ if !attrs_str.is_empty() {
110
+ output.push_str(&indent);
111
+ output.push_str(&attrs_str);
112
+ output.push('\n');
113
+ }
114
+ for (i, child) in block.children.iter().enumerate() {
115
+ let marker = format!("{}. ", i + 1);
116
+ render_list_item(output, child, &indent, &marker);
117
+ }
118
+ output.push('\n');
119
+ }
120
+ BlockType::TaskList => {
121
+ if !attrs_str.is_empty() {
122
+ output.push_str(&indent);
123
+ output.push_str(&attrs_str);
124
+ output.push('\n');
125
+ }
126
+ for child in &block.children {
127
+ // Task list items use [ ] or [x] syntax
128
+ render_list_item(output, child, &indent, "- [ ] ");
129
+ }
130
+ output.push('\n');
131
+ }
132
+ BlockType::ListItem => {
133
+ // List items are typically rendered by their parent list
134
+ output.push_str(&indent);
135
+ render_inline_content(output, &block.inline_content);
136
+ output.push('\n');
137
+ for child in &block.children {
138
+ render_block_to_djot(output, child, indent_level + 1);
139
+ }
140
+ }
141
+ BlockType::DefinitionList => {
142
+ if !attrs_str.is_empty() {
143
+ output.push_str(&indent);
144
+ output.push_str(&attrs_str);
145
+ output.push('\n');
146
+ }
147
+ for child in &block.children {
148
+ render_block_to_djot(output, child, indent_level);
149
+ }
150
+ output.push('\n');
151
+ }
152
+ BlockType::DefinitionTerm => {
153
+ output.push_str(&indent);
154
+ render_inline_content(output, &block.inline_content);
155
+ output.push('\n');
156
+ }
157
+ BlockType::DefinitionDescription => {
158
+ output.push_str(&indent);
159
+ output.push_str(": ");
160
+ render_inline_content(output, &block.inline_content);
161
+ output.push('\n');
162
+ }
163
+ BlockType::Div => {
164
+ output.push_str(&indent);
165
+ output.push_str(":::");
166
+ if !attrs_str.is_empty() {
167
+ output.push(' ');
168
+ output.push_str(&attrs_str);
169
+ }
170
+ output.push('\n');
171
+ for child in &block.children {
172
+ render_block_to_djot(output, child, indent_level);
173
+ }
174
+ output.push_str(&indent);
175
+ output.push_str(":::\n\n");
176
+ }
177
+ BlockType::Section => {
178
+ // Sections don't have special syntax, just render children
179
+ if !attrs_str.is_empty() {
180
+ output.push_str(&indent);
181
+ output.push_str(&attrs_str);
182
+ output.push('\n');
183
+ }
184
+ for child in &block.children {
185
+ render_block_to_djot(output, child, indent_level);
186
+ }
187
+ }
188
+ BlockType::ThematicBreak => {
189
+ output.push_str(&indent);
190
+ output.push_str("---\n\n");
191
+ }
192
+ BlockType::RawBlock => {
193
+ // Raw blocks use ``` with format specifier
194
+ output.push_str(&indent);
195
+ output.push_str("```");
196
+ if let Some(ref lang) = block.language {
197
+ output.push('=');
198
+ output.push_str(lang);
199
+ }
200
+ output.push('\n');
201
+ for elem in &block.inline_content {
202
+ output.push_str(&indent);
203
+ output.push_str(&elem.content);
204
+ output.push('\n');
205
+ }
206
+ output.push_str(&indent);
207
+ output.push_str("```\n\n");
208
+ }
209
+ BlockType::MathDisplay => {
210
+ output.push_str(&indent);
211
+ output.push_str("$$\n");
212
+ for elem in &block.inline_content {
213
+ output.push_str(&indent);
214
+ output.push_str(&elem.content);
215
+ output.push('\n');
216
+ }
217
+ output.push_str(&indent);
218
+ output.push_str("$$\n\n");
219
+ }
220
+ }
221
+ }
222
+
223
+ /// Render a list item with the given marker.
224
+ pub fn render_list_item(output: &mut String, item: &FormattedBlock, indent: &str, marker: &str) {
225
+ output.push_str(indent);
226
+ output.push_str(marker);
227
+ render_inline_content(output, &item.inline_content);
228
+ output.push('\n');
229
+ for child in &item.children {
230
+ render_block_to_djot(output, child, 1);
231
+ }
232
+ }
233
+
234
+ /// Render inline content to djot markup.
235
+ pub fn render_inline_content(output: &mut String, elements: &[InlineElement]) {
236
+ for elem in elements {
237
+ let attrs_str = elem.attributes.as_ref().map(render_attributes).unwrap_or_default();
238
+
239
+ match elem.element_type {
240
+ InlineType::Text => {
241
+ output.push_str(&elem.content);
242
+ }
243
+ InlineType::Strong => {
244
+ output.push('*');
245
+ output.push_str(&elem.content);
246
+ output.push('*');
247
+ if !attrs_str.is_empty() {
248
+ output.push_str(&attrs_str);
249
+ }
250
+ }
251
+ InlineType::Emphasis => {
252
+ output.push('_');
253
+ output.push_str(&elem.content);
254
+ output.push('_');
255
+ if !attrs_str.is_empty() {
256
+ output.push_str(&attrs_str);
257
+ }
258
+ }
259
+ InlineType::Highlight => {
260
+ output.push_str("{=");
261
+ output.push_str(&elem.content);
262
+ output.push_str("=}");
263
+ if !attrs_str.is_empty() {
264
+ output.push_str(&attrs_str);
265
+ }
266
+ }
267
+ InlineType::Subscript => {
268
+ output.push('~');
269
+ output.push_str(&elem.content);
270
+ output.push('~');
271
+ if !attrs_str.is_empty() {
272
+ output.push_str(&attrs_str);
273
+ }
274
+ }
275
+ InlineType::Superscript => {
276
+ output.push('^');
277
+ output.push_str(&elem.content);
278
+ output.push('^');
279
+ if !attrs_str.is_empty() {
280
+ output.push_str(&attrs_str);
281
+ }
282
+ }
283
+ InlineType::Insert => {
284
+ output.push_str("{+");
285
+ output.push_str(&elem.content);
286
+ output.push_str("+}");
287
+ if !attrs_str.is_empty() {
288
+ output.push_str(&attrs_str);
289
+ }
290
+ }
291
+ InlineType::Delete => {
292
+ output.push_str("{-");
293
+ output.push_str(&elem.content);
294
+ output.push_str("-}");
295
+ if !attrs_str.is_empty() {
296
+ output.push_str(&attrs_str);
297
+ }
298
+ }
299
+ InlineType::Code => {
300
+ output.push('`');
301
+ output.push_str(&elem.content);
302
+ output.push('`');
303
+ if !attrs_str.is_empty() {
304
+ output.push_str(&attrs_str);
305
+ }
306
+ }
307
+ InlineType::Link => {
308
+ let href = elem
309
+ .metadata
310
+ .as_ref()
311
+ .and_then(|m| m.get("href"))
312
+ .map(|s| s.as_str())
313
+ .unwrap_or("");
314
+ output.push('[');
315
+ output.push_str(&elem.content);
316
+ output.push_str("](");
317
+ output.push_str(href);
318
+ output.push(')');
319
+ if !attrs_str.is_empty() {
320
+ output.push_str(&attrs_str);
321
+ }
322
+ }
323
+ InlineType::Image => {
324
+ let src = elem
325
+ .metadata
326
+ .as_ref()
327
+ .and_then(|m| m.get("src"))
328
+ .map(|s| s.as_str())
329
+ .unwrap_or("");
330
+ output.push_str("![");
331
+ output.push_str(&elem.content); // alt text
332
+ output.push_str("](");
333
+ output.push_str(src);
334
+ output.push(')');
335
+ if !attrs_str.is_empty() {
336
+ output.push_str(&attrs_str);
337
+ }
338
+ }
339
+ InlineType::Span => {
340
+ output.push('[');
341
+ output.push_str(&elem.content);
342
+ output.push(']');
343
+ if !attrs_str.is_empty() {
344
+ output.push_str(&attrs_str);
345
+ }
346
+ }
347
+ InlineType::Math => {
348
+ output.push('$');
349
+ output.push_str(&elem.content);
350
+ output.push('$');
351
+ }
352
+ InlineType::RawInline => {
353
+ // Raw inline uses `content`{=format}
354
+ let format = elem
355
+ .metadata
356
+ .as_ref()
357
+ .and_then(|m| m.get("format"))
358
+ .map(|s| s.as_str())
359
+ .unwrap_or("html");
360
+ output.push('`');
361
+ output.push_str(&elem.content);
362
+ output.push_str("`{=");
363
+ output.push_str(format);
364
+ output.push('}');
365
+ }
366
+ InlineType::FootnoteRef => {
367
+ output.push_str("[^");
368
+ output.push_str(&elem.content);
369
+ output.push(']');
370
+ }
371
+ InlineType::Symbol => {
372
+ output.push(':');
373
+ output.push_str(&elem.content);
374
+ output.push(':');
375
+ }
376
+ }
377
+ }
378
+ }
379
+
380
+ #[cfg(test)]
381
+ mod tests {
382
+ use super::*;
383
+ use crate::types::{DjotContent, Metadata};
384
+
385
+ #[test]
386
+ fn test_render_heading() {
387
+ let content = DjotContent {
388
+ plain_text: "Test Heading".to_string(),
389
+ blocks: vec![FormattedBlock {
390
+ block_type: BlockType::Heading,
391
+ level: Some(1),
392
+ inline_content: vec![InlineElement {
393
+ element_type: InlineType::Text,
394
+ content: "Test Heading".to_string(),
395
+ attributes: None,
396
+ metadata: None,
397
+ }],
398
+ attributes: None,
399
+ language: None,
400
+ code: None,
401
+ children: vec![],
402
+ }],
403
+ metadata: Metadata::default(),
404
+ tables: vec![],
405
+ images: vec![],
406
+ links: vec![],
407
+ footnotes: vec![],
408
+ attributes: Default::default(),
409
+ };
410
+
411
+ let mut output = String::new();
412
+ for block in &content.blocks {
413
+ render_block_to_djot(&mut output, block, 0);
414
+ }
415
+
416
+ assert!(output.contains("# Test Heading"));
417
+ }
418
+
419
+ #[test]
420
+ fn test_render_paragraph() {
421
+ let content = DjotContent {
422
+ plain_text: "Test paragraph".to_string(),
423
+ blocks: vec![FormattedBlock {
424
+ block_type: BlockType::Paragraph,
425
+ level: None,
426
+ inline_content: vec![InlineElement {
427
+ element_type: InlineType::Text,
428
+ content: "Test paragraph".to_string(),
429
+ attributes: None,
430
+ metadata: None,
431
+ }],
432
+ attributes: None,
433
+ language: None,
434
+ code: None,
435
+ children: vec![],
436
+ }],
437
+ metadata: Metadata::default(),
438
+ tables: vec![],
439
+ images: vec![],
440
+ links: vec![],
441
+ footnotes: vec![],
442
+ attributes: Default::default(),
443
+ };
444
+
445
+ let mut output = String::new();
446
+ for block in &content.blocks {
447
+ render_block_to_djot(&mut output, block, 0);
448
+ }
449
+
450
+ assert!(output.contains("Test paragraph"));
451
+ }
452
+ }
@@ -405,6 +405,8 @@ impl DocumentExtractor for DocbookExtractor {
405
405
  chunks: None,
406
406
  images: None,
407
407
  pages: None,
408
+ djot_content: None,
409
+ elements: None,
408
410
  })
409
411
  }
410
412
 
@@ -182,6 +182,7 @@ impl DocumentExtractor for DocxExtractor {
182
182
  };
183
183
 
184
184
  let mut metadata_map = std::collections::HashMap::new();
185
+ let mut parsed_keywords: Option<Vec<String>> = None;
185
186
 
186
187
  if let Ok(core) = office_metadata::extract_core_properties(&mut archive) {
187
188
  if let Some(title) = core.title {
@@ -198,7 +199,14 @@ impl DocumentExtractor for DocxExtractor {
198
199
  metadata_map.insert("subject".to_string(), serde_json::Value::String(subject));
199
200
  }
200
201
  if let Some(keywords) = core.keywords {
201
- metadata_map.insert("keywords".to_string(), serde_json::Value::String(keywords));
202
+ // Parse comma-separated keywords into Vec<String>
203
+ parsed_keywords = Some(
204
+ keywords
205
+ .split(',')
206
+ .map(|s| s.trim().to_string())
207
+ .filter(|s| !s.is_empty())
208
+ .collect(),
209
+ );
202
210
  }
203
211
  if let Some(description) = core.description {
204
212
  metadata_map.insert("description".to_string(), serde_json::Value::String(description));
@@ -296,6 +304,7 @@ impl DocumentExtractor for DocxExtractor {
296
304
  mime_type: mime_type.to_string(),
297
305
  metadata: Metadata {
298
306
  pages: page_structure,
307
+ keywords: parsed_keywords,
299
308
  additional: metadata_map,
300
309
  ..Default::default()
301
310
  },
@@ -304,6 +313,8 @@ impl DocumentExtractor for DocxExtractor {
304
313
  detected_languages: None,
305
314
  chunks: None,
306
315
  images: Some(vec![]),
316
+ djot_content: None,
317
+ elements: None,
307
318
  })
308
319
  }
309
320
 
@@ -86,6 +86,8 @@ impl SyncExtractor for EmailExtractor {
86
86
  chunks: None,
87
87
  images: None,
88
88
  pages: None,
89
+ djot_content: None,
90
+ elements: None,
89
91
  })
90
92
  }
91
93
  }