notionary 0.2.26__py3-none-any.whl → 0.2.28__py3-none-any.whl

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 (387) hide show
  1. notionary/__init__.py +5 -20
  2. notionary/blocks/client.py +87 -215
  3. notionary/blocks/enums.py +167 -0
  4. notionary/blocks/rich_text/markdown_rich_text_converter.py +266 -0
  5. notionary/blocks/rich_text/models.py +164 -0
  6. notionary/blocks/rich_text/name_id_resolver/__init__.py +11 -0
  7. notionary/blocks/rich_text/name_id_resolver/database.py +31 -0
  8. notionary/blocks/rich_text/name_id_resolver/page.py +34 -0
  9. notionary/blocks/rich_text/name_id_resolver/person.py +37 -0
  10. notionary/blocks/rich_text/name_id_resolver/port.py +11 -0
  11. notionary/blocks/rich_text/rich_text_markdown_converter.py +132 -0
  12. notionary/blocks/rich_text/rich_text_patterns.py +39 -0
  13. notionary/blocks/schemas.py +746 -0
  14. notionary/comments/client.py +52 -187
  15. notionary/comments/factory.py +40 -0
  16. notionary/comments/models.py +5 -127
  17. notionary/comments/schemas.py +240 -0
  18. notionary/comments/service.py +34 -0
  19. notionary/data_source/http/client.py +11 -0
  20. notionary/data_source/http/data_source_instance_client.py +94 -0
  21. notionary/data_source/properties/models.py +406 -0
  22. notionary/data_source/query/builder.py +429 -0
  23. notionary/data_source/query/resolver.py +114 -0
  24. notionary/data_source/query/schema.py +304 -0
  25. notionary/data_source/query/validator.py +73 -0
  26. notionary/data_source/schemas.py +27 -0
  27. notionary/data_source/service.py +353 -0
  28. notionary/database/client.py +30 -135
  29. notionary/database/database_metadata_update_client.py +19 -0
  30. notionary/database/schemas.py +29 -0
  31. notionary/database/service.py +169 -0
  32. notionary/exceptions/__init__.py +33 -0
  33. notionary/exceptions/api.py +41 -0
  34. notionary/exceptions/base.py +2 -0
  35. notionary/exceptions/block_parsing.py +16 -0
  36. notionary/exceptions/data_source/__init__.py +6 -0
  37. notionary/exceptions/data_source/builder.py +182 -0
  38. notionary/exceptions/data_source/properties.py +34 -0
  39. notionary/exceptions/properties.py +58 -0
  40. notionary/exceptions/search.py +33 -0
  41. notionary/file_upload/client.py +18 -30
  42. notionary/file_upload/models.py +7 -8
  43. notionary/file_upload/{notion_file_upload.py → service.py} +29 -64
  44. notionary/http/client.py +205 -0
  45. notionary/http/models.py +49 -0
  46. notionary/page/blocks/client.py +1 -0
  47. notionary/page/content/factory.py +68 -0
  48. notionary/page/content/markdown/__init__.py +5 -0
  49. notionary/page/content/markdown/builder.py +304 -0
  50. notionary/page/content/markdown/nodes/__init__.py +54 -0
  51. notionary/page/content/markdown/nodes/audio.py +23 -0
  52. notionary/page/content/markdown/nodes/base.py +12 -0
  53. notionary/page/content/markdown/nodes/bookmark.py +25 -0
  54. notionary/page/content/markdown/nodes/breadcrumb.py +14 -0
  55. notionary/page/content/markdown/nodes/bulleted_list.py +18 -0
  56. notionary/page/content/markdown/nodes/callout.py +32 -0
  57. notionary/page/content/markdown/nodes/code.py +30 -0
  58. notionary/page/content/markdown/nodes/columns.py +51 -0
  59. notionary/page/content/markdown/nodes/divider.py +14 -0
  60. notionary/page/content/markdown/nodes/embed.py +23 -0
  61. notionary/page/content/markdown/nodes/equation.py +19 -0
  62. notionary/page/content/markdown/nodes/file.py +23 -0
  63. notionary/page/content/markdown/nodes/heading.py +16 -0
  64. notionary/page/content/markdown/nodes/image.py +23 -0
  65. notionary/page/content/markdown/nodes/mixins/caption.py +12 -0
  66. notionary/page/content/markdown/nodes/numbered_list.py +15 -0
  67. notionary/page/content/markdown/nodes/paragraph.py +14 -0
  68. notionary/page/content/markdown/nodes/pdf.py +23 -0
  69. notionary/page/content/markdown/nodes/quote.py +15 -0
  70. notionary/page/content/markdown/nodes/space.py +14 -0
  71. notionary/page/content/markdown/nodes/table.py +45 -0
  72. notionary/page/content/markdown/nodes/table_of_contents.py +14 -0
  73. notionary/page/content/markdown/nodes/todo.py +22 -0
  74. notionary/page/content/markdown/nodes/toggle.py +28 -0
  75. notionary/page/content/markdown/nodes/toggleable_heading.py +35 -0
  76. notionary/page/content/markdown/nodes/video.py +23 -0
  77. notionary/page/content/parser/context.py +49 -0
  78. notionary/page/content/parser/factory.py +219 -0
  79. notionary/page/content/parser/parsers/__init__.py +60 -0
  80. notionary/page/content/parser/parsers/audio.py +40 -0
  81. notionary/page/content/parser/parsers/base.py +30 -0
  82. notionary/page/content/parser/parsers/bookmark.py +33 -0
  83. notionary/page/content/parser/parsers/breadcrumb.py +33 -0
  84. notionary/page/content/parser/parsers/bulleted_list.py +41 -0
  85. notionary/page/content/parser/parsers/callout.py +129 -0
  86. notionary/page/content/parser/parsers/caption.py +55 -0
  87. notionary/page/content/parser/parsers/code.py +81 -0
  88. notionary/page/content/parser/parsers/column.py +117 -0
  89. notionary/page/content/parser/parsers/column_list.py +81 -0
  90. notionary/page/content/parser/parsers/divider.py +33 -0
  91. notionary/page/content/parser/parsers/embed.py +33 -0
  92. notionary/page/content/parser/parsers/equation.py +65 -0
  93. notionary/page/content/parser/parsers/file.py +42 -0
  94. notionary/page/content/parser/parsers/heading.py +58 -0
  95. notionary/page/content/parser/parsers/image.py +42 -0
  96. notionary/page/content/parser/parsers/numbered_list.py +45 -0
  97. notionary/page/content/parser/parsers/paragraph.py +36 -0
  98. notionary/page/content/parser/parsers/pdf.py +42 -0
  99. notionary/page/content/parser/parsers/quote.py +65 -0
  100. notionary/page/content/parser/parsers/space.py +35 -0
  101. notionary/page/content/parser/parsers/table.py +144 -0
  102. notionary/page/content/parser/parsers/table_of_contents.py +32 -0
  103. notionary/page/content/parser/parsers/todo.py +58 -0
  104. notionary/page/content/parser/parsers/toggle.py +127 -0
  105. notionary/page/content/parser/parsers/toggleable_heading.py +150 -0
  106. notionary/page/content/parser/parsers/video.py +42 -0
  107. notionary/page/content/parser/post_processing/handlers/__init__.py +5 -0
  108. notionary/page/content/parser/post_processing/handlers/rich_text_length.py +93 -0
  109. notionary/page/content/parser/post_processing/handlers/rich_text_length_truncation.py +93 -0
  110. notionary/page/content/parser/post_processing/port.py +9 -0
  111. notionary/page/content/parser/post_processing/service.py +16 -0
  112. notionary/page/content/parser/pre_processsing/handlers/__init__.py +9 -0
  113. notionary/page/content/parser/pre_processsing/handlers/column_syntax.py +80 -0
  114. notionary/page/content/parser/pre_processsing/handlers/port.py +7 -0
  115. notionary/page/content/parser/pre_processsing/handlers/whitespace.py +68 -0
  116. notionary/page/content/parser/pre_processsing/service.py +15 -0
  117. notionary/page/content/parser/service.py +69 -0
  118. notionary/page/content/renderer/context.py +48 -0
  119. notionary/page/content/renderer/factory.py +240 -0
  120. notionary/page/content/renderer/post_processing/handlers/__init__.py +5 -0
  121. notionary/page/content/renderer/post_processing/handlers/numbered_list_placeholdere.py +62 -0
  122. notionary/page/content/renderer/post_processing/port.py +7 -0
  123. notionary/page/content/renderer/post_processing/service.py +15 -0
  124. notionary/page/content/renderer/renderers/__init__.py +57 -0
  125. notionary/page/content/renderer/renderers/audio.py +31 -0
  126. notionary/page/content/renderer/renderers/base.py +31 -0
  127. notionary/page/content/renderer/renderers/bookmark.py +25 -0
  128. notionary/page/content/renderer/renderers/breadcrumb.py +21 -0
  129. notionary/page/content/renderer/renderers/bulleted_list.py +48 -0
  130. notionary/page/content/renderer/renderers/callout.py +65 -0
  131. notionary/page/content/renderer/renderers/captioned_block.py +58 -0
  132. notionary/page/content/renderer/renderers/code.py +34 -0
  133. notionary/page/content/renderer/renderers/column.py +44 -0
  134. notionary/page/content/renderer/renderers/column_list.py +31 -0
  135. notionary/page/content/renderer/renderers/divider.py +22 -0
  136. notionary/page/content/renderer/renderers/embed.py +25 -0
  137. notionary/page/content/renderer/renderers/equation.py +37 -0
  138. notionary/page/content/renderer/renderers/fallback.py +24 -0
  139. notionary/page/content/renderer/renderers/file.py +40 -0
  140. notionary/page/content/renderer/renderers/heading.py +69 -0
  141. notionary/page/content/renderer/renderers/image.py +31 -0
  142. notionary/page/content/renderer/renderers/numbered_list.py +41 -0
  143. notionary/page/content/renderer/renderers/paragraph.py +40 -0
  144. notionary/page/content/renderer/renderers/pdf.py +31 -0
  145. notionary/page/content/renderer/renderers/quote.py +49 -0
  146. notionary/page/content/renderer/renderers/table.py +115 -0
  147. notionary/page/content/renderer/renderers/table_of_contents.py +26 -0
  148. notionary/page/content/renderer/renderers/table_row.py +17 -0
  149. notionary/page/content/renderer/renderers/todo.py +56 -0
  150. notionary/page/content/renderer/renderers/toggle.py +53 -0
  151. notionary/page/content/renderer/renderers/toggleable_heading.py +78 -0
  152. notionary/page/content/renderer/renderers/video.py +31 -0
  153. notionary/page/content/renderer/service.py +50 -0
  154. notionary/page/content/service.py +65 -0
  155. notionary/page/content/syntax/models.py +68 -0
  156. notionary/page/content/syntax/service.py +453 -0
  157. notionary/page/page_context.py +7 -16
  158. notionary/page/page_http_client.py +15 -0
  159. notionary/page/page_metadata_update_client.py +19 -0
  160. notionary/page/properties/client.py +144 -0
  161. notionary/page/properties/factory.py +26 -0
  162. notionary/page/properties/models.py +307 -0
  163. notionary/page/properties/service.py +257 -0
  164. notionary/page/schemas.py +13 -0
  165. notionary/page/service.py +222 -0
  166. notionary/shared/entity/client.py +29 -0
  167. notionary/shared/entity/dto_parsers.py +53 -0
  168. notionary/shared/entity/entity_metadata_update_client.py +41 -0
  169. notionary/shared/entity/schemas.py +45 -0
  170. notionary/shared/entity/service.py +171 -0
  171. notionary/shared/models/cover.py +20 -0
  172. notionary/shared/models/file.py +21 -0
  173. notionary/shared/models/icon.py +28 -0
  174. notionary/shared/models/parent.py +41 -0
  175. notionary/shared/properties/type.py +30 -0
  176. notionary/user/__init__.py +4 -8
  177. notionary/user/base.py +89 -0
  178. notionary/user/bot.py +70 -0
  179. notionary/user/client.py +22 -111
  180. notionary/user/person.py +41 -0
  181. notionary/user/schemas.py +67 -0
  182. notionary/user/service.py +65 -0
  183. notionary/utils/async_retry.py +39 -0
  184. notionary/utils/date.py +51 -0
  185. notionary/utils/fuzzy.py +56 -0
  186. notionary/{util/logging_mixin.py → utils/mixins/logging.py} +4 -16
  187. notionary/utils/pagination.py +50 -0
  188. notionary/utils/singleton.py +13 -0
  189. notionary/utils/uuid_utils.py +20 -0
  190. notionary/workspace/__init__.py +3 -0
  191. notionary/workspace/client.py +62 -0
  192. notionary/workspace/query/builder.py +60 -0
  193. notionary/workspace/query/models.py +60 -0
  194. notionary/workspace/query/service.py +93 -0
  195. notionary/workspace/schemas.py +21 -0
  196. notionary/workspace/service.py +116 -0
  197. {notionary-0.2.26.dist-info → notionary-0.2.28.dist-info}/METADATA +54 -49
  198. notionary-0.2.28.dist-info/RECORD +200 -0
  199. {notionary-0.2.26.dist-info → notionary-0.2.28.dist-info}/WHEEL +1 -1
  200. {notionary-0.2.26.dist-info → notionary-0.2.28.dist-info/licenses}/LICENSE +9 -9
  201. notionary/base_notion_client.py +0 -219
  202. notionary/blocks/__init__.py +0 -5
  203. notionary/blocks/_bootstrap.py +0 -271
  204. notionary/blocks/audio/__init__.py +0 -11
  205. notionary/blocks/audio/audio_element.py +0 -158
  206. notionary/blocks/audio/audio_markdown_node.py +0 -24
  207. notionary/blocks/audio/audio_models.py +0 -10
  208. notionary/blocks/base_block_element.py +0 -42
  209. notionary/blocks/bookmark/__init__.py +0 -12
  210. notionary/blocks/bookmark/bookmark_element.py +0 -83
  211. notionary/blocks/bookmark/bookmark_markdown_node.py +0 -28
  212. notionary/blocks/bookmark/bookmark_models.py +0 -15
  213. notionary/blocks/breadcrumbs/__init__.py +0 -15
  214. notionary/blocks/breadcrumbs/breadcrumb_element.py +0 -39
  215. notionary/blocks/breadcrumbs/breadcrumb_markdown_node.py +0 -13
  216. notionary/blocks/breadcrumbs/breadcrumb_models.py +0 -12
  217. notionary/blocks/bulleted_list/__init__.py +0 -15
  218. notionary/blocks/bulleted_list/bulleted_list_element.py +0 -74
  219. notionary/blocks/bulleted_list/bulleted_list_markdown_node.py +0 -20
  220. notionary/blocks/bulleted_list/bulleted_list_models.py +0 -17
  221. notionary/blocks/callout/__init__.py +0 -12
  222. notionary/blocks/callout/callout_element.py +0 -99
  223. notionary/blocks/callout/callout_markdown_node.py +0 -19
  224. notionary/blocks/callout/callout_models.py +0 -33
  225. notionary/blocks/child_database/__init__.py +0 -14
  226. notionary/blocks/child_database/child_database_element.py +0 -59
  227. notionary/blocks/child_database/child_database_models.py +0 -12
  228. notionary/blocks/child_page/__init__.py +0 -9
  229. notionary/blocks/child_page/child_page_element.py +0 -94
  230. notionary/blocks/child_page/child_page_models.py +0 -12
  231. notionary/blocks/code/__init__.py +0 -11
  232. notionary/blocks/code/code_element.py +0 -149
  233. notionary/blocks/code/code_markdown_node.py +0 -80
  234. notionary/blocks/code/code_models.py +0 -94
  235. notionary/blocks/column/__init__.py +0 -25
  236. notionary/blocks/column/column_element.py +0 -65
  237. notionary/blocks/column/column_list_element.py +0 -52
  238. notionary/blocks/column/column_list_markdown_node.py +0 -34
  239. notionary/blocks/column/column_markdown_node.py +0 -42
  240. notionary/blocks/column/column_models.py +0 -26
  241. notionary/blocks/divider/__init__.py +0 -12
  242. notionary/blocks/divider/divider_element.py +0 -41
  243. notionary/blocks/divider/divider_markdown_node.py +0 -11
  244. notionary/blocks/divider/divider_models.py +0 -12
  245. notionary/blocks/embed/__init__.py +0 -12
  246. notionary/blocks/embed/embed_element.py +0 -98
  247. notionary/blocks/embed/embed_markdown_node.py +0 -19
  248. notionary/blocks/embed/embed_models.py +0 -14
  249. notionary/blocks/equation/__init__.py +0 -13
  250. notionary/blocks/equation/equation_element.py +0 -133
  251. notionary/blocks/equation/equation_element_markdown_node.py +0 -23
  252. notionary/blocks/equation/equation_models.py +0 -11
  253. notionary/blocks/file/__init__.py +0 -23
  254. notionary/blocks/file/file_element.py +0 -133
  255. notionary/blocks/file/file_element_markdown_node.py +0 -24
  256. notionary/blocks/file/file_element_models.py +0 -39
  257. notionary/blocks/heading/__init__.py +0 -19
  258. notionary/blocks/heading/heading_element.py +0 -112
  259. notionary/blocks/heading/heading_markdown_node.py +0 -16
  260. notionary/blocks/heading/heading_models.py +0 -29
  261. notionary/blocks/image_block/__init__.py +0 -11
  262. notionary/blocks/image_block/image_element.py +0 -130
  263. notionary/blocks/image_block/image_markdown_node.py +0 -25
  264. notionary/blocks/image_block/image_models.py +0 -10
  265. notionary/blocks/markdown/markdown_builder.py +0 -525
  266. notionary/blocks/markdown/markdown_document_model.py +0 -0
  267. notionary/blocks/markdown/markdown_node.py +0 -25
  268. notionary/blocks/mixins/captions/__init__.py +0 -4
  269. notionary/blocks/mixins/captions/caption_markdown_node_mixin.py +0 -31
  270. notionary/blocks/mixins/captions/caption_mixin.py +0 -92
  271. notionary/blocks/mixins/file_upload/__init__.py +0 -3
  272. notionary/blocks/mixins/file_upload/file_upload_mixin.py +0 -320
  273. notionary/blocks/models.py +0 -174
  274. notionary/blocks/numbered_list/__init__.py +0 -16
  275. notionary/blocks/numbered_list/numbered_list_element.py +0 -65
  276. notionary/blocks/numbered_list/numbered_list_markdown_node.py +0 -17
  277. notionary/blocks/numbered_list/numbered_list_models.py +0 -17
  278. notionary/blocks/paragraph/__init__.py +0 -15
  279. notionary/blocks/paragraph/paragraph_element.py +0 -58
  280. notionary/blocks/paragraph/paragraph_markdown_node.py +0 -16
  281. notionary/blocks/paragraph/paragraph_models.py +0 -16
  282. notionary/blocks/pdf/__init__.py +0 -11
  283. notionary/blocks/pdf/pdf_element.py +0 -146
  284. notionary/blocks/pdf/pdf_markdown_node.py +0 -24
  285. notionary/blocks/pdf/pdf_models.py +0 -11
  286. notionary/blocks/quote/__init__.py +0 -14
  287. notionary/blocks/quote/quote_element.py +0 -75
  288. notionary/blocks/quote/quote_markdown_node.py +0 -16
  289. notionary/blocks/quote/quote_models.py +0 -18
  290. notionary/blocks/registry/__init__.py +0 -3
  291. notionary/blocks/registry/block_registry.py +0 -150
  292. notionary/blocks/rich_text/__init__.py +0 -33
  293. notionary/blocks/rich_text/rich_text_models.py +0 -221
  294. notionary/blocks/rich_text/text_inline_formatter.py +0 -456
  295. notionary/blocks/syntax_prompt_builder.py +0 -137
  296. notionary/blocks/table/__init__.py +0 -19
  297. notionary/blocks/table/table_element.py +0 -225
  298. notionary/blocks/table/table_markdown_node.py +0 -42
  299. notionary/blocks/table/table_models.py +0 -28
  300. notionary/blocks/table_of_contents/__init__.py +0 -17
  301. notionary/blocks/table_of_contents/table_of_contents_element.py +0 -80
  302. notionary/blocks/table_of_contents/table_of_contents_markdown_node.py +0 -21
  303. notionary/blocks/table_of_contents/table_of_contents_models.py +0 -18
  304. notionary/blocks/todo/__init__.py +0 -12
  305. notionary/blocks/todo/todo_element.py +0 -81
  306. notionary/blocks/todo/todo_markdown_node.py +0 -21
  307. notionary/blocks/todo/todo_models.py +0 -18
  308. notionary/blocks/toggle/__init__.py +0 -12
  309. notionary/blocks/toggle/toggle_element.py +0 -112
  310. notionary/blocks/toggle/toggle_markdown_node.py +0 -31
  311. notionary/blocks/toggle/toggle_models.py +0 -17
  312. notionary/blocks/toggleable_heading/__init__.py +0 -11
  313. notionary/blocks/toggleable_heading/toggleable_heading_element.py +0 -115
  314. notionary/blocks/toggleable_heading/toggleable_heading_markdown_node.py +0 -34
  315. notionary/blocks/types.py +0 -130
  316. notionary/blocks/video/__init__.py +0 -11
  317. notionary/blocks/video/video_element.py +0 -187
  318. notionary/blocks/video/video_element_models.py +0 -10
  319. notionary/blocks/video/video_markdown_node.py +0 -26
  320. notionary/comments/__init__.py +0 -26
  321. notionary/database/__init__.py +0 -4
  322. notionary/database/database.py +0 -480
  323. notionary/database/database_filter_builder.py +0 -173
  324. notionary/database/database_provider.py +0 -227
  325. notionary/database/exceptions.py +0 -13
  326. notionary/database/factory.py +0 -0
  327. notionary/database/models.py +0 -337
  328. notionary/database/notion_database.py +0 -487
  329. notionary/file_upload/__init__.py +0 -7
  330. notionary/page/client.py +0 -124
  331. notionary/page/markdown_whitespace_processor.py +0 -129
  332. notionary/page/models.py +0 -322
  333. notionary/page/notion_page.py +0 -674
  334. notionary/page/page_content_deleting_service.py +0 -117
  335. notionary/page/page_content_writer.py +0 -80
  336. notionary/page/property_formatter.py +0 -99
  337. notionary/page/reader/handler/__init__.py +0 -19
  338. notionary/page/reader/handler/base_block_renderer.py +0 -44
  339. notionary/page/reader/handler/block_processing_context.py +0 -35
  340. notionary/page/reader/handler/block_rendering_context.py +0 -48
  341. notionary/page/reader/handler/column_list_renderer.py +0 -51
  342. notionary/page/reader/handler/column_renderer.py +0 -60
  343. notionary/page/reader/handler/equation_renderer.py +0 -0
  344. notionary/page/reader/handler/line_renderer.py +0 -73
  345. notionary/page/reader/handler/numbered_list_renderer.py +0 -85
  346. notionary/page/reader/handler/toggle_renderer.py +0 -69
  347. notionary/page/reader/handler/toggleable_heading_renderer.py +0 -89
  348. notionary/page/reader/page_content_retriever.py +0 -81
  349. notionary/page/search_filter_builder.py +0 -132
  350. notionary/page/utils.py +0 -60
  351. notionary/page/writer/handler/__init__.py +0 -24
  352. notionary/page/writer/handler/code_handler.py +0 -72
  353. notionary/page/writer/handler/column_handler.py +0 -141
  354. notionary/page/writer/handler/column_list_handler.py +0 -139
  355. notionary/page/writer/handler/equation_handler.py +0 -74
  356. notionary/page/writer/handler/line_handler.py +0 -35
  357. notionary/page/writer/handler/line_processing_context.py +0 -54
  358. notionary/page/writer/handler/regular_line_handler.py +0 -86
  359. notionary/page/writer/handler/table_handler.py +0 -66
  360. notionary/page/writer/handler/toggle_handler.py +0 -159
  361. notionary/page/writer/handler/toggleable_heading_handler.py +0 -174
  362. notionary/page/writer/markdown_to_notion_converter.py +0 -139
  363. notionary/page/writer/markdown_to_notion_converter_context.py +0 -30
  364. notionary/page/writer/markdown_to_notion_text_length_post_processor.py +0 -0
  365. notionary/page/writer/notion_text_length_processor.py +0 -150
  366. notionary/schemas/__init__.py +0 -3
  367. notionary/schemas/base.py +0 -73
  368. notionary/shared/__init__.py +0 -3
  369. notionary/shared/name_to_id_resolver.py +0 -203
  370. notionary/telemetry/__init__.py +0 -19
  371. notionary/telemetry/service.py +0 -136
  372. notionary/telemetry/views.py +0 -73
  373. notionary/user/base_notion_user.py +0 -53
  374. notionary/user/models.py +0 -84
  375. notionary/user/notion_bot_user.py +0 -226
  376. notionary/user/notion_user.py +0 -255
  377. notionary/user/notion_user_manager.py +0 -101
  378. notionary/util/__init__.py +0 -15
  379. notionary/util/concurrency_limiter.py +0 -0
  380. notionary/util/factory_decorator.py +0 -0
  381. notionary/util/factory_only.py +0 -37
  382. notionary/util/fuzzy.py +0 -75
  383. notionary/util/page_id_utils.py +0 -27
  384. notionary/util/singleton.py +0 -18
  385. notionary/util/singleton_metaclass.py +0 -22
  386. notionary/workspace.py +0 -105
  387. notionary-0.2.26.dist-info/RECORD +0 -202
@@ -0,0 +1,93 @@
1
+ """
2
+ Handles request limits for rich texts (see https://developers.notion.com/reference/request-limits)
3
+ """
4
+
5
+ from typing import Any, override
6
+
7
+ from notionary.blocks.rich_text.models import RichText, RichTextType
8
+ from notionary.blocks.schemas import BlockCreatePayload
9
+ from notionary.page.content.parser.post_processing.port import PostProcessor
10
+ from notionary.utils.mixins.logging import LoggingMixin
11
+
12
+ type _NestedBlockList = BlockCreatePayload | list["_NestedBlockList"]
13
+
14
+
15
+ class RichTextLengthTruncationPostProcessor(PostProcessor, LoggingMixin):
16
+ NOTION_MAX_LENGTH = 2000
17
+
18
+ def __init__(self, max_text_length: int = NOTION_MAX_LENGTH) -> None:
19
+ self.max_text_length = max_text_length
20
+
21
+ @override
22
+ def process(self, blocks: list[BlockCreatePayload]) -> list[BlockCreatePayload]:
23
+ if not blocks:
24
+ return blocks
25
+
26
+ flattened_blocks = self._flatten_blocks(blocks)
27
+ return [self._process_block(block) for block in flattened_blocks]
28
+
29
+ def _flatten_blocks(self, blocks: list[_NestedBlockList]) -> list[BlockCreatePayload]:
30
+ flattened: list[BlockCreatePayload] = []
31
+
32
+ for item in blocks:
33
+ if isinstance(item, list):
34
+ flattened.extend(self._flatten_blocks(item))
35
+ else:
36
+ flattened.append(item)
37
+
38
+ return flattened
39
+
40
+ def _process_block(self, block: BlockCreatePayload) -> BlockCreatePayload:
41
+ block_copy = block.model_copy(deep=True)
42
+ content = self._get_block_content(block_copy)
43
+
44
+ if content is not None:
45
+ self._truncate_content(content)
46
+
47
+ return block_copy
48
+
49
+ def _get_block_content(self, block: BlockCreatePayload) -> Any | None:
50
+ content = getattr(block, block.type.value, None)
51
+
52
+ if content is None:
53
+ return None
54
+
55
+ if hasattr(content, "rich_text") or hasattr(content, "children"):
56
+ return content
57
+
58
+ return None
59
+
60
+ def _truncate_content(self, content: object) -> None:
61
+ if hasattr(content, "rich_text"):
62
+ self._truncate_rich_text_list(content.rich_text)
63
+
64
+ if hasattr(content, "caption"):
65
+ self._truncate_rich_text_list(content.caption)
66
+
67
+ if hasattr(content, "children"):
68
+ for child in content.children:
69
+ child_content = self._get_block_content(child)
70
+ if child_content:
71
+ self._truncate_content(child_content)
72
+
73
+ def _truncate_rich_text_list(self, rich_text_list: list[RichText]) -> None:
74
+ for rich_text in rich_text_list:
75
+ if not self._is_text_type(rich_text):
76
+ continue
77
+
78
+ content = rich_text.text.content
79
+ if len(content) > self.max_text_length:
80
+ self.logger.warning(
81
+ "Truncating text content from %d to %d characters",
82
+ len(content),
83
+ self.max_text_length,
84
+ )
85
+ truncated_content = self._create_truncated_text_with_ellipsis(content)
86
+ rich_text.text.content = truncated_content
87
+
88
+ def _create_truncated_text_with_ellipsis(self, content: str) -> str:
89
+ cutoff = self.max_text_length - 3
90
+ return content[:cutoff] + "..."
91
+
92
+ def _is_text_type(self, rich_text: RichText) -> bool:
93
+ return rich_text.type == RichTextType.TEXT and rich_text.text and rich_text.text.content
@@ -0,0 +1,9 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+ from notionary.blocks.schemas import BlockCreatePayload
4
+
5
+
6
+ class PostProcessor(ABC):
7
+ @abstractmethod
8
+ def process(self, blocks: list[BlockCreatePayload]) -> list[BlockCreatePayload]:
9
+ pass
@@ -0,0 +1,16 @@
1
+ from notionary.blocks.schemas import BlockCreatePayload
2
+ from notionary.page.content.parser.post_processing.port import PostProcessor
3
+
4
+
5
+ class BlockPostProcessor:
6
+ def __init__(self) -> None:
7
+ self._processors: list[PostProcessor] = []
8
+
9
+ def register(self, processor: PostProcessor) -> None:
10
+ self._processors.append(processor)
11
+
12
+ def process(self, created_blocks: list[BlockCreatePayload]) -> list[BlockCreatePayload]:
13
+ result = created_blocks
14
+ for processor in self._processors:
15
+ result = processor.process(created_blocks)
16
+ return result
@@ -0,0 +1,9 @@
1
+ from .column_syntax import ColumnSyntaxPreProcessor
2
+ from .port import PreProcessor
3
+ from .whitespace import WhitespacePreProcessor
4
+
5
+ __all__ = [
6
+ "ColumnSyntaxPreProcessor",
7
+ "PreProcessor",
8
+ "WhitespacePreProcessor",
9
+ ]
@@ -0,0 +1,80 @@
1
+ import re
2
+ from typing import override
3
+
4
+ from notionary.exceptions.block_parsing import InsufficientColumnsError, InvalidColumnRatioSumError
5
+ from notionary.page.content.parser.pre_processsing.handlers.port import PreProcessor
6
+ from notionary.page.content.syntax.service import SyntaxRegistry
7
+
8
+ RATIO_TOLERANCE = 0.0001
9
+
10
+
11
+ class ColumnSyntaxPreProcessor(PreProcessor):
12
+ def __init__(self, syntax_registry: SyntaxRegistry | None = None) -> None:
13
+ self._syntax_registry = syntax_registry or SyntaxRegistry()
14
+ self._column_list_syntax = self._syntax_registry.get_column_list_syntax()
15
+ self._column_syntax = self._syntax_registry.get_column_syntax()
16
+
17
+ @override
18
+ def process(self, markdown_text: str) -> str:
19
+ if not self._has_columns_blocks(markdown_text):
20
+ return markdown_text
21
+
22
+ columns_blocks = self._extract_columns_blocks(markdown_text)
23
+
24
+ for content in columns_blocks:
25
+ column_matches = self._find_column_blocks(content)
26
+ column_count = len(column_matches)
27
+ self._validate_minimum_columns(column_count)
28
+ ratios = self._extract_ratios(column_matches)
29
+ self._validate_ratios(ratios, column_count)
30
+ return markdown_text
31
+
32
+ def _has_columns_blocks(self, markdown_text: str) -> bool:
33
+ return self._column_list_syntax.start_delimiter in markdown_text
34
+
35
+ def _extract_columns_blocks(self, markdown_text: str) -> list[str]:
36
+ columns_blocks = []
37
+ lines = markdown_text.split("\n")
38
+ for index, line in enumerate(lines):
39
+ if line.strip() == self._column_list_syntax.start_delimiter:
40
+ content = self._extract_block_content(lines, index + 1)
41
+ if content is not None:
42
+ columns_blocks.append(content)
43
+ return columns_blocks
44
+
45
+ def _extract_block_content(self, lines: list[str], start_index: int) -> str | None:
46
+ depth = 1
47
+ end_index = start_index
48
+ block_start = self._column_list_syntax.start_delimiter.split()[0]
49
+ while end_index < len(lines) and depth > 0:
50
+ line = lines[end_index].strip()
51
+ if line.startswith(f"{block_start} "):
52
+ depth += 1
53
+ elif line == self._column_list_syntax.end_delimiter:
54
+ depth -= 1
55
+ end_index += 1
56
+ if depth == 0:
57
+ return "\n".join(lines[start_index : end_index - 1])
58
+ return None
59
+
60
+ def _find_column_blocks(self, content: str) -> list[re.Match]:
61
+ return list(self._column_syntax.regex_pattern.finditer(content))
62
+
63
+ def _validate_minimum_columns(self, column_count: int) -> None:
64
+ if column_count < 2:
65
+ raise InsufficientColumnsError(column_count)
66
+
67
+ def _extract_ratios(self, column_matches: list[re.Match]) -> list[float]:
68
+ ratios = []
69
+ for match in column_matches:
70
+ ratio_str = match.group(1)
71
+ if ratio_str and ratio_str != "1":
72
+ ratios.append(float(ratio_str))
73
+ return ratios
74
+
75
+ def _validate_ratios(self, ratios: list[float], column_count: int) -> None:
76
+ if not ratios or len(ratios) != column_count:
77
+ return
78
+ total = sum(ratios)
79
+ if abs(total - 1.0) > RATIO_TOLERANCE:
80
+ raise InvalidColumnRatioSumError(total, RATIO_TOLERANCE)
@@ -0,0 +1,7 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+
4
+ class PreProcessor(ABC):
5
+ @abstractmethod
6
+ def process(self, markdown_text: str) -> str:
7
+ pass
@@ -0,0 +1,68 @@
1
+ from typing import override
2
+
3
+ from notionary.page.content.parser.pre_processsing.handlers.port import PreProcessor
4
+
5
+
6
+ class WhitespacePreProcessor(PreProcessor):
7
+ @override
8
+ def process(self, markdown_text: str) -> str:
9
+ if not markdown_text:
10
+ return ""
11
+
12
+ lines = markdown_text.split("\n")
13
+ processed_lines = []
14
+ code_block_lines = []
15
+ in_code_block = False
16
+
17
+ for line in lines:
18
+ if self._is_code_fence(line):
19
+ if in_code_block:
20
+ processed_lines.extend(self._format_code_block(code_block_lines))
21
+ processed_lines.append("```")
22
+ code_block_lines = []
23
+ in_code_block = False
24
+ else:
25
+ language = self._extract_language(line)
26
+ processed_lines.append(f"```{language}")
27
+ in_code_block = True
28
+ elif in_code_block:
29
+ code_block_lines.append(line)
30
+ else:
31
+ processed_lines.append(line.lstrip())
32
+
33
+ return "\n".join(processed_lines)
34
+
35
+ def _is_code_fence(self, line: str) -> bool:
36
+ return line.lstrip().startswith("```")
37
+
38
+ def _extract_language(self, fence_line: str) -> str:
39
+ return fence_line.lstrip().removeprefix("```").strip()
40
+
41
+ def _format_code_block(self, lines: list[str]) -> list[str]:
42
+ """
43
+ Format code block by removing common leading whitespace.
44
+
45
+ Preserves relative indentation between lines.
46
+ Empty lines are preserved as-is.
47
+ """
48
+ if not lines:
49
+ return []
50
+
51
+ non_empty_lines = [line for line in lines if line.strip()]
52
+ if not non_empty_lines:
53
+ return ["" for _ in lines]
54
+
55
+ min_indent = min(self._count_leading_spaces(line) for line in non_empty_lines)
56
+
57
+ if min_indent == 0:
58
+ return lines
59
+
60
+ return [self._remove_indent(line, min_indent) for line in lines]
61
+
62
+ def _count_leading_spaces(self, line: str) -> int:
63
+ return len(line) - len(line.lstrip())
64
+
65
+ def _remove_indent(self, line: str, indent_size: int) -> str:
66
+ if not line.strip():
67
+ return ""
68
+ return line[indent_size:]
@@ -0,0 +1,15 @@
1
+ from notionary.page.content.parser.pre_processsing.handlers.port import PreProcessor
2
+
3
+
4
+ class MarkdownPreProcessor:
5
+ def __init__(self) -> None:
6
+ self._processors: list[PreProcessor] = []
7
+
8
+ def register(self, processor: PreProcessor) -> None:
9
+ self._processors.append(processor)
10
+
11
+ def process(self, markdown_text: str) -> str:
12
+ result = markdown_text
13
+ for processor in self._processors:
14
+ result = processor.process(result)
15
+ return result
@@ -0,0 +1,69 @@
1
+ from notionary.blocks.schemas import BlockCreatePayload
2
+ from notionary.page.content.parser.parsers import (
3
+ BlockParsingContext,
4
+ ParentBlockContext,
5
+ )
6
+ from notionary.page.content.parser.parsers.base import LineParser
7
+ from notionary.page.content.parser.post_processing.service import BlockPostProcessor
8
+ from notionary.page.content.parser.pre_processsing.service import MarkdownPreProcessor
9
+ from notionary.utils.mixins.logging import LoggingMixin
10
+
11
+
12
+ class MarkdownToNotionConverter(LoggingMixin):
13
+ def __init__(
14
+ self, line_parser: LineParser, pre_processor: MarkdownPreProcessor, post_processor: BlockPostProcessor
15
+ ) -> None:
16
+ self._line_parser = line_parser
17
+ self._pre_processor = pre_processor
18
+ self._post_processor = post_processor
19
+
20
+ async def convert(self, markdown_text: str) -> list[BlockCreatePayload]:
21
+ if not markdown_text:
22
+ return []
23
+
24
+ markdown_text = self._pre_processor.process(markdown_text)
25
+ all_blocks = await self._process_lines(markdown_text)
26
+ all_blocks = self._post_processor.process(all_blocks)
27
+
28
+ return all_blocks
29
+
30
+ async def _process_lines(self, text: str) -> list[BlockCreatePayload]:
31
+ lines = text.split("\n")
32
+ result_blocks: list[BlockCreatePayload] = []
33
+ parent_stack: list[ParentBlockContext] = []
34
+
35
+ current_line_index = 0
36
+ while current_line_index < len(lines):
37
+ line = lines[current_line_index]
38
+
39
+ context = self._create_line_processing_context(
40
+ line=line,
41
+ lines=lines,
42
+ line_index=current_line_index,
43
+ result_blocks=result_blocks,
44
+ parent_stack=parent_stack,
45
+ )
46
+
47
+ await self._line_parser.handle(context)
48
+
49
+ current_line_index += 1 + context.lines_consumed
50
+
51
+ return result_blocks
52
+
53
+ def _create_line_processing_context(
54
+ self,
55
+ line: str,
56
+ lines: list[str],
57
+ line_index: int,
58
+ result_blocks: list[BlockCreatePayload],
59
+ parent_stack: list[ParentBlockContext],
60
+ ) -> BlockParsingContext:
61
+ return BlockParsingContext(
62
+ line=line,
63
+ result_blocks=result_blocks,
64
+ parent_stack=parent_stack,
65
+ parse_children_callback=self._process_lines,
66
+ all_lines=lines,
67
+ current_line_index=line_index,
68
+ lines_consumed=0,
69
+ )
@@ -0,0 +1,48 @@
1
+ from collections.abc import Awaitable, Callable
2
+
3
+ from notionary.blocks.schemas import Block
4
+
5
+ ConvertChildrenCallback = Callable[[list[Block], int], Awaitable[str]]
6
+
7
+
8
+ class MarkdownRenderingContext:
9
+ def __init__(
10
+ self,
11
+ block: Block,
12
+ indent_level: int,
13
+ convert_children_callback: ConvertChildrenCallback | None = None,
14
+ ) -> None:
15
+ self.block = block
16
+ self.indent_level = indent_level
17
+ self.convert_children_callback = convert_children_callback
18
+
19
+ self.markdown_result: str | None = None
20
+ self._markdown_indentation_multiplier = 4
21
+
22
+ async def render_children(self) -> str:
23
+ return await self._convert_children_to_markdown(self.indent_level)
24
+
25
+ async def render_children_with_additional_indent(self, additional_indent: int) -> str:
26
+ return await self._convert_children_to_markdown(self.indent_level + additional_indent)
27
+
28
+ async def _convert_children_to_markdown(self, indent_level: int) -> str:
29
+ if not self._has_children() or not self.convert_children_callback:
30
+ return ""
31
+
32
+ return await self.convert_children_callback(self._get_children_blocks(), indent_level)
33
+
34
+ def _get_children_blocks(self) -> list[Block]:
35
+ if self._has_children():
36
+ return self.block.children
37
+ return []
38
+
39
+ def _has_children(self) -> bool:
40
+ return self.block.has_children and self.block.children and len(self.block.children) > 0
41
+
42
+ def indent_text(self, text: str) -> str:
43
+ if not text:
44
+ return text
45
+
46
+ spaces = " " * self._markdown_indentation_multiplier * self.indent_level
47
+ lines = text.split("\n")
48
+ return "\n".join(f"{spaces}{line}" if line.strip() else line for line in lines)
@@ -0,0 +1,240 @@
1
+ from notionary.blocks.rich_text.rich_text_markdown_converter import (
2
+ RichTextToMarkdownConverter,
3
+ )
4
+ from notionary.page.content.renderer.renderers import (
5
+ AudioRenderer,
6
+ BlockRenderer,
7
+ BookmarkRenderer,
8
+ BreadcrumbRenderer,
9
+ BulletedListRenderer,
10
+ CalloutRenderer,
11
+ CodeRenderer,
12
+ ColumnListRenderer,
13
+ ColumnRenderer,
14
+ DividerRenderer,
15
+ EmbedRenderer,
16
+ EquationRenderer,
17
+ FallbackRenderer,
18
+ FileRenderer,
19
+ HeadingRenderer,
20
+ ImageRenderer,
21
+ NumberedListRenderer,
22
+ ParagraphRenderer,
23
+ PdfRenderer,
24
+ QuoteRenderer,
25
+ TableOfContentsRenderer,
26
+ TableRenderer,
27
+ TableRowHandler,
28
+ TodoRenderer,
29
+ ToggleableHeadingRenderer,
30
+ ToggleRenderer,
31
+ VideoRenderer,
32
+ )
33
+ from notionary.page.content.syntax.service import SyntaxRegistry
34
+
35
+
36
+ class RendererChainFactory:
37
+ def __init__(
38
+ self,
39
+ rich_text_markdown_converter: RichTextToMarkdownConverter | None = None,
40
+ syntax_registry: SyntaxRegistry | None = None,
41
+ ) -> None:
42
+ self._rich_text_markdown_converter = rich_text_markdown_converter or RichTextToMarkdownConverter()
43
+ self._syntax_registry = syntax_registry or SyntaxRegistry()
44
+
45
+ def create(self) -> BlockRenderer:
46
+ # Strukturelle Blocks
47
+ toggle_handler = self._create_toggle_renderer()
48
+ toggleable_heading_handler = self._create_toggleable_heading_renderer()
49
+ heading_handler = self._create_heading_renderer()
50
+
51
+ # Content Blocks
52
+ callout_handler = self._create_callout_renderer()
53
+ code_handler = self._create_code_renderer()
54
+ quote_handler = self._create_quote_renderer()
55
+ todo_handler = self._create_todo_renderer()
56
+ bulleted_list_handler = self._create_bulleted_list_renderer()
57
+
58
+ # Layout Blocks
59
+ divider_handler = self._create_divider_renderer()
60
+ column_list_handler = self._create_column_list_renderer()
61
+ column_handler = self._create_column_renderer()
62
+ numbered_list_handler = self._create_numbered_list_renderer()
63
+
64
+ # Media Blocks
65
+ bookmark_handler = self._create_bookmark_renderer()
66
+ image_handler = self._create_image_renderer()
67
+ video_handler = self._create_video_renderer()
68
+ audio_handler = self._create_audio_renderer()
69
+ file_handler = self._create_file_renderer()
70
+ pdf_handler = self._create_pdf_renderer()
71
+ embed_handler = self._create_embed_renderer()
72
+
73
+ # Special Blocks
74
+ equation_handler = self._create_equation_renderer()
75
+ table_of_contents_handler = self._create_table_of_contents_renderer()
76
+ breadcrumb_handler = self._create_breadcrumb_renderer()
77
+ table_handler = self._create_table_renderer()
78
+ table_row_handler = self._create_table_row_handler()
79
+
80
+ # Standard & Fallback
81
+ paragraph_handler = self._create_paragraph_renderer()
82
+ fallback_handler = self._create_fallback_renderer()
83
+
84
+ # Chain verketten - most specific first, fallback last
85
+ (
86
+ toggle_handler.set_next(toggleable_heading_handler)
87
+ .set_next(heading_handler)
88
+ .set_next(callout_handler)
89
+ .set_next(code_handler)
90
+ .set_next(quote_handler)
91
+ .set_next(todo_handler)
92
+ .set_next(bulleted_list_handler)
93
+ .set_next(divider_handler)
94
+ .set_next(column_list_handler)
95
+ .set_next(column_handler)
96
+ .set_next(numbered_list_handler)
97
+ .set_next(bookmark_handler)
98
+ .set_next(image_handler)
99
+ .set_next(video_handler)
100
+ .set_next(audio_handler)
101
+ .set_next(file_handler)
102
+ .set_next(pdf_handler)
103
+ .set_next(embed_handler)
104
+ .set_next(equation_handler)
105
+ .set_next(table_of_contents_handler)
106
+ .set_next(breadcrumb_handler)
107
+ .set_next(table_handler)
108
+ .set_next(table_row_handler)
109
+ .set_next(paragraph_handler)
110
+ .set_next(fallback_handler)
111
+ )
112
+
113
+ return toggle_handler
114
+
115
+ # Renderer Creation Methods
116
+ def _create_toggle_renderer(self) -> ToggleRenderer:
117
+ return ToggleRenderer(
118
+ syntax_registry=self._syntax_registry,
119
+ rich_text_markdown_converter=self._rich_text_markdown_converter,
120
+ )
121
+
122
+ def _create_toggleable_heading_renderer(self) -> ToggleableHeadingRenderer:
123
+ return ToggleableHeadingRenderer(
124
+ syntax_registry=self._syntax_registry,
125
+ rich_text_markdown_converter=self._rich_text_markdown_converter,
126
+ )
127
+
128
+ def _create_heading_renderer(self) -> HeadingRenderer:
129
+ return HeadingRenderer(
130
+ syntax_registry=self._syntax_registry,
131
+ rich_text_markdown_converter=self._rich_text_markdown_converter,
132
+ )
133
+
134
+ def _create_callout_renderer(self) -> CalloutRenderer:
135
+ return CalloutRenderer(
136
+ syntax_registry=self._syntax_registry,
137
+ rich_text_markdown_converter=self._rich_text_markdown_converter,
138
+ )
139
+
140
+ def _create_code_renderer(self) -> CodeRenderer:
141
+ return CodeRenderer(
142
+ syntax_registry=self._syntax_registry,
143
+ rich_text_markdown_converter=self._rich_text_markdown_converter,
144
+ )
145
+
146
+ def _create_quote_renderer(self) -> QuoteRenderer:
147
+ return QuoteRenderer(
148
+ syntax_registry=self._syntax_registry,
149
+ rich_text_markdown_converter=self._rich_text_markdown_converter,
150
+ )
151
+
152
+ def _create_todo_renderer(self) -> TodoRenderer:
153
+ return TodoRenderer(
154
+ syntax_registry=self._syntax_registry,
155
+ rich_text_markdown_converter=self._rich_text_markdown_converter,
156
+ )
157
+
158
+ def _create_bulleted_list_renderer(self) -> BulletedListRenderer:
159
+ return BulletedListRenderer(
160
+ syntax_registry=self._syntax_registry,
161
+ rich_text_markdown_converter=self._rich_text_markdown_converter,
162
+ )
163
+
164
+ def _create_divider_renderer(self) -> DividerRenderer:
165
+ return DividerRenderer(syntax_registry=self._syntax_registry)
166
+
167
+ def _create_column_list_renderer(self) -> ColumnListRenderer:
168
+ return ColumnListRenderer(syntax_registry=self._syntax_registry)
169
+
170
+ def _create_column_renderer(self) -> ColumnRenderer:
171
+ return ColumnRenderer(syntax_registry=self._syntax_registry)
172
+
173
+ def _create_numbered_list_renderer(self) -> NumberedListRenderer:
174
+ return NumberedListRenderer(
175
+ syntax_registry=self._syntax_registry,
176
+ rich_text_markdown_converter=self._rich_text_markdown_converter,
177
+ )
178
+
179
+ def _create_bookmark_renderer(self) -> BookmarkRenderer:
180
+ return BookmarkRenderer(
181
+ syntax_registry=self._syntax_registry,
182
+ rich_text_markdown_converter=self._rich_text_markdown_converter,
183
+ )
184
+
185
+ def _create_image_renderer(self) -> ImageRenderer:
186
+ return ImageRenderer(
187
+ syntax_registry=self._syntax_registry,
188
+ rich_text_markdown_converter=self._rich_text_markdown_converter,
189
+ )
190
+
191
+ def _create_video_renderer(self) -> VideoRenderer:
192
+ return VideoRenderer(
193
+ syntax_registry=self._syntax_registry,
194
+ rich_text_markdown_converter=self._rich_text_markdown_converter,
195
+ )
196
+
197
+ def _create_audio_renderer(self) -> AudioRenderer:
198
+ return AudioRenderer(
199
+ syntax_registry=self._syntax_registry,
200
+ rich_text_markdown_converter=self._rich_text_markdown_converter,
201
+ )
202
+
203
+ def _create_file_renderer(self) -> FileRenderer:
204
+ return FileRenderer(
205
+ syntax_registry=self._syntax_registry,
206
+ rich_text_markdown_converter=self._rich_text_markdown_converter,
207
+ )
208
+
209
+ def _create_pdf_renderer(self) -> PdfRenderer:
210
+ return PdfRenderer(
211
+ syntax_registry=self._syntax_registry,
212
+ rich_text_markdown_converter=self._rich_text_markdown_converter,
213
+ )
214
+
215
+ def _create_embed_renderer(self) -> EmbedRenderer:
216
+ return EmbedRenderer(
217
+ syntax_registry=self._syntax_registry,
218
+ rich_text_markdown_converter=self._rich_text_markdown_converter,
219
+ )
220
+
221
+ def _create_equation_renderer(self) -> EquationRenderer:
222
+ return EquationRenderer(syntax_registry=self._syntax_registry)
223
+
224
+ def _create_table_of_contents_renderer(self) -> TableOfContentsRenderer:
225
+ return TableOfContentsRenderer(syntax_registry=self._syntax_registry)
226
+
227
+ def _create_breadcrumb_renderer(self) -> BreadcrumbRenderer:
228
+ return BreadcrumbRenderer(syntax_registry=self._syntax_registry)
229
+
230
+ def _create_table_renderer(self) -> TableRenderer:
231
+ return TableRenderer(rich_text_markdown_converter=self._rich_text_markdown_converter)
232
+
233
+ def _create_table_row_handler(self) -> TableRowHandler:
234
+ return TableRowHandler()
235
+
236
+ def _create_paragraph_renderer(self) -> ParagraphRenderer:
237
+ return ParagraphRenderer(rich_text_markdown_converter=self._rich_text_markdown_converter)
238
+
239
+ def _create_fallback_renderer(self) -> FallbackRenderer:
240
+ return FallbackRenderer()
@@ -0,0 +1,5 @@
1
+ from .numbered_list_placeholdere import NumberedListPlaceholderReplaceerPostProcessor
2
+
3
+ __all__ = [
4
+ "NumberedListPlaceholderReplaceerPostProcessor",
5
+ ]