notionary 0.2.19__py3-none-any.whl → 0.2.22__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 (220) hide show
  1. notionary/__init__.py +8 -4
  2. notionary/base_notion_client.py +3 -1
  3. notionary/blocks/__init__.py +2 -91
  4. notionary/blocks/_bootstrap.py +271 -0
  5. notionary/blocks/audio/__init__.py +8 -2
  6. notionary/blocks/audio/audio_element.py +69 -106
  7. notionary/blocks/audio/audio_markdown_node.py +13 -5
  8. notionary/blocks/audio/audio_models.py +6 -55
  9. notionary/blocks/base_block_element.py +42 -0
  10. notionary/blocks/bookmark/__init__.py +9 -2
  11. notionary/blocks/bookmark/bookmark_element.py +49 -139
  12. notionary/blocks/bookmark/bookmark_markdown_node.py +19 -18
  13. notionary/blocks/bookmark/bookmark_models.py +15 -0
  14. notionary/blocks/breadcrumbs/__init__.py +17 -0
  15. notionary/blocks/breadcrumbs/breadcrumb_element.py +39 -0
  16. notionary/blocks/breadcrumbs/breadcrumb_markdown_node.py +32 -0
  17. notionary/blocks/breadcrumbs/breadcrumb_models.py +12 -0
  18. notionary/blocks/bulleted_list/__init__.py +12 -2
  19. notionary/blocks/bulleted_list/bulleted_list_element.py +55 -53
  20. notionary/blocks/bulleted_list/bulleted_list_markdown_node.py +2 -1
  21. notionary/blocks/bulleted_list/bulleted_list_models.py +18 -0
  22. notionary/blocks/callout/__init__.py +9 -2
  23. notionary/blocks/callout/callout_element.py +53 -86
  24. notionary/blocks/callout/callout_markdown_node.py +3 -1
  25. notionary/blocks/callout/callout_models.py +33 -0
  26. notionary/blocks/child_database/__init__.py +14 -0
  27. notionary/blocks/child_database/child_database_element.py +61 -0
  28. notionary/blocks/child_database/child_database_models.py +12 -0
  29. notionary/blocks/child_page/__init__.py +9 -0
  30. notionary/blocks/child_page/child_page_element.py +94 -0
  31. notionary/blocks/child_page/child_page_models.py +12 -0
  32. notionary/blocks/{shared/block_client.py → client.py} +54 -54
  33. notionary/blocks/code/__init__.py +6 -2
  34. notionary/blocks/code/code_element.py +96 -181
  35. notionary/blocks/code/code_markdown_node.py +64 -13
  36. notionary/blocks/code/code_models.py +94 -0
  37. notionary/blocks/column/__init__.py +25 -1
  38. notionary/blocks/column/column_element.py +44 -312
  39. notionary/blocks/column/column_list_element.py +52 -0
  40. notionary/blocks/column/column_list_markdown_node.py +50 -0
  41. notionary/blocks/column/column_markdown_node.py +59 -0
  42. notionary/blocks/column/column_models.py +26 -0
  43. notionary/blocks/divider/__init__.py +9 -2
  44. notionary/blocks/divider/divider_element.py +18 -49
  45. notionary/blocks/divider/divider_markdown_node.py +2 -1
  46. notionary/blocks/divider/divider_models.py +12 -0
  47. notionary/blocks/embed/__init__.py +9 -2
  48. notionary/blocks/embed/embed_element.py +65 -111
  49. notionary/blocks/embed/embed_markdown_node.py +3 -1
  50. notionary/blocks/embed/embed_models.py +14 -0
  51. notionary/blocks/equation/__init__.py +14 -0
  52. notionary/blocks/equation/equation_element.py +133 -0
  53. notionary/blocks/equation/equation_element_markdown_node.py +35 -0
  54. notionary/blocks/equation/equation_models.py +11 -0
  55. notionary/blocks/file/__init__.py +25 -0
  56. notionary/blocks/file/file_element.py +112 -0
  57. notionary/blocks/file/file_element_markdown_node.py +37 -0
  58. notionary/blocks/file/file_element_models.py +39 -0
  59. notionary/blocks/guards.py +22 -0
  60. notionary/blocks/heading/__init__.py +16 -2
  61. notionary/blocks/heading/heading_element.py +83 -69
  62. notionary/blocks/heading/heading_markdown_node.py +2 -1
  63. notionary/blocks/heading/heading_models.py +29 -0
  64. notionary/blocks/image_block/__init__.py +13 -0
  65. notionary/blocks/image_block/image_element.py +89 -0
  66. notionary/blocks/{image → image_block}/image_markdown_node.py +13 -6
  67. notionary/blocks/image_block/image_models.py +10 -0
  68. notionary/blocks/mixins/captions/__init__.py +4 -0
  69. notionary/blocks/mixins/captions/caption_markdown_node_mixin.py +31 -0
  70. notionary/blocks/mixins/captions/caption_mixin.py +92 -0
  71. notionary/blocks/models.py +174 -0
  72. notionary/blocks/numbered_list/__init__.py +12 -2
  73. notionary/blocks/numbered_list/numbered_list_element.py +48 -56
  74. notionary/blocks/numbered_list/numbered_list_markdown_node.py +3 -1
  75. notionary/blocks/numbered_list/numbered_list_models.py +17 -0
  76. notionary/blocks/paragraph/__init__.py +12 -2
  77. notionary/blocks/paragraph/paragraph_element.py +40 -66
  78. notionary/blocks/paragraph/paragraph_markdown_node.py +2 -1
  79. notionary/blocks/paragraph/paragraph_models.py +16 -0
  80. notionary/blocks/pdf/__init__.py +13 -0
  81. notionary/blocks/pdf/pdf_element.py +97 -0
  82. notionary/blocks/pdf/pdf_markdown_node.py +37 -0
  83. notionary/blocks/pdf/pdf_models.py +11 -0
  84. notionary/blocks/quote/__init__.py +11 -2
  85. notionary/blocks/quote/quote_element.py +45 -62
  86. notionary/blocks/quote/quote_markdown_node.py +6 -3
  87. notionary/blocks/quote/quote_models.py +18 -0
  88. notionary/blocks/registry/__init__.py +4 -0
  89. notionary/blocks/registry/block_registry.py +60 -121
  90. notionary/blocks/registry/block_registry_builder.py +115 -59
  91. notionary/blocks/rich_text/__init__.py +33 -0
  92. notionary/blocks/rich_text/name_to_id_resolver.py +205 -0
  93. notionary/blocks/rich_text/rich_text_models.py +221 -0
  94. notionary/blocks/rich_text/text_inline_formatter.py +456 -0
  95. notionary/blocks/syntax_prompt_builder.py +137 -0
  96. notionary/blocks/table/__init__.py +16 -2
  97. notionary/blocks/table/table_element.py +136 -228
  98. notionary/blocks/table/table_markdown_node.py +2 -1
  99. notionary/blocks/table/table_models.py +28 -0
  100. notionary/blocks/table_of_contents/__init__.py +19 -0
  101. notionary/blocks/table_of_contents/table_of_contents_element.py +68 -0
  102. notionary/blocks/table_of_contents/table_of_contents_markdown_node.py +35 -0
  103. notionary/blocks/table_of_contents/table_of_contents_models.py +18 -0
  104. notionary/blocks/todo/__init__.py +9 -2
  105. notionary/blocks/todo/todo_element.py +52 -92
  106. notionary/blocks/todo/todo_markdown_node.py +2 -1
  107. notionary/blocks/todo/todo_models.py +19 -0
  108. notionary/blocks/toggle/__init__.py +13 -3
  109. notionary/blocks/toggle/toggle_element.py +69 -260
  110. notionary/blocks/toggle/toggle_markdown_node.py +25 -15
  111. notionary/blocks/toggle/toggle_models.py +17 -0
  112. notionary/blocks/toggleable_heading/__init__.py +6 -2
  113. notionary/blocks/toggleable_heading/toggleable_heading_element.py +86 -241
  114. notionary/blocks/toggleable_heading/toggleable_heading_markdown_node.py +26 -18
  115. notionary/blocks/types.py +130 -0
  116. notionary/blocks/video/__init__.py +8 -2
  117. notionary/blocks/video/video_element.py +70 -141
  118. notionary/blocks/video/video_element_models.py +10 -0
  119. notionary/blocks/video/video_markdown_node.py +13 -6
  120. notionary/database/client.py +26 -8
  121. notionary/database/database.py +13 -14
  122. notionary/database/database_filter_builder.py +2 -2
  123. notionary/database/database_provider.py +5 -4
  124. notionary/database/models.py +337 -0
  125. notionary/database/notion_database.py +6 -7
  126. notionary/file_upload/client.py +5 -7
  127. notionary/file_upload/models.py +3 -2
  128. notionary/file_upload/notion_file_upload.py +2 -3
  129. notionary/markdown/markdown_builder.py +729 -0
  130. notionary/markdown/markdown_document_model.py +228 -0
  131. notionary/{blocks → markdown}/markdown_node.py +1 -0
  132. notionary/models/notion_database_response.py +0 -338
  133. notionary/page/client.py +34 -15
  134. notionary/page/models.py +327 -0
  135. notionary/page/notion_page.py +136 -58
  136. notionary/page/{content/page_content_writer.py → page_content_deleting_service.py} +25 -59
  137. notionary/page/page_content_writer.py +177 -0
  138. notionary/page/page_context.py +65 -0
  139. notionary/page/reader/handler/__init__.py +19 -0
  140. notionary/page/reader/handler/base_block_renderer.py +44 -0
  141. notionary/page/reader/handler/block_processing_context.py +35 -0
  142. notionary/page/reader/handler/block_rendering_context.py +48 -0
  143. notionary/page/reader/handler/column_list_renderer.py +51 -0
  144. notionary/page/reader/handler/column_renderer.py +60 -0
  145. notionary/page/reader/handler/line_renderer.py +73 -0
  146. notionary/page/reader/handler/numbered_list_renderer.py +85 -0
  147. notionary/page/reader/handler/toggle_renderer.py +69 -0
  148. notionary/page/reader/handler/toggleable_heading_renderer.py +89 -0
  149. notionary/page/reader/page_content_retriever.py +81 -0
  150. notionary/page/search_filter_builder.py +2 -1
  151. notionary/page/writer/handler/__init__.py +24 -0
  152. notionary/page/writer/handler/code_handler.py +72 -0
  153. notionary/page/writer/handler/column_handler.py +141 -0
  154. notionary/page/writer/handler/column_list_handler.py +139 -0
  155. notionary/page/writer/handler/equation_handler.py +74 -0
  156. notionary/page/writer/handler/line_handler.py +35 -0
  157. notionary/page/writer/handler/line_processing_context.py +54 -0
  158. notionary/page/writer/handler/regular_line_handler.py +86 -0
  159. notionary/page/writer/handler/table_handler.py +66 -0
  160. notionary/page/writer/handler/toggle_handler.py +155 -0
  161. notionary/page/writer/handler/toggleable_heading_handler.py +173 -0
  162. notionary/page/writer/markdown_to_notion_converter.py +95 -0
  163. notionary/page/writer/markdown_to_notion_converter_context.py +30 -0
  164. notionary/page/writer/markdown_to_notion_formatting_post_processor.py +73 -0
  165. notionary/page/writer/notion_text_length_processor.py +150 -0
  166. notionary/telemetry/__init__.py +2 -2
  167. notionary/telemetry/service.py +3 -3
  168. notionary/user/__init__.py +2 -2
  169. notionary/user/base_notion_user.py +2 -1
  170. notionary/user/client.py +2 -3
  171. notionary/user/models.py +1 -0
  172. notionary/user/notion_bot_user.py +4 -5
  173. notionary/user/notion_user.py +3 -4
  174. notionary/user/notion_user_manager.py +23 -95
  175. notionary/util/__init__.py +3 -2
  176. notionary/util/fuzzy.py +2 -1
  177. notionary/util/logging_mixin.py +2 -2
  178. notionary/util/singleton_metaclass.py +1 -1
  179. notionary/workspace.py +6 -5
  180. notionary-0.2.22.dist-info/METADATA +237 -0
  181. notionary-0.2.22.dist-info/RECORD +200 -0
  182. notionary/blocks/document/__init__.py +0 -7
  183. notionary/blocks/document/document_element.py +0 -102
  184. notionary/blocks/document/document_markdown_node.py +0 -31
  185. notionary/blocks/image/__init__.py +0 -7
  186. notionary/blocks/image/image_element.py +0 -151
  187. notionary/blocks/markdown_builder.py +0 -356
  188. notionary/blocks/mention/__init__.py +0 -7
  189. notionary/blocks/mention/mention_element.py +0 -229
  190. notionary/blocks/mention/mention_markdown_node.py +0 -38
  191. notionary/blocks/prompts/element_prompt_builder.py +0 -83
  192. notionary/blocks/prompts/element_prompt_content.py +0 -41
  193. notionary/blocks/shared/models.py +0 -713
  194. notionary/blocks/shared/notion_block_element.py +0 -37
  195. notionary/blocks/shared/text_inline_formatter.py +0 -262
  196. notionary/blocks/shared/text_inline_formatter_new.py +0 -139
  197. notionary/database/models/page_result.py +0 -10
  198. notionary/models/notion_block_response.py +0 -264
  199. notionary/models/notion_page_response.py +0 -78
  200. notionary/models/search_response.py +0 -0
  201. notionary/page/__init__.py +0 -0
  202. notionary/page/content/markdown_whitespace_processor.py +0 -80
  203. notionary/page/content/notion_text_length_utils.py +0 -87
  204. notionary/page/content/page_content_retriever.py +0 -60
  205. notionary/page/formatting/line_processor.py +0 -153
  206. notionary/page/formatting/markdown_to_notion_converter.py +0 -153
  207. notionary/page/markdown_syntax_prompt_generator.py +0 -114
  208. notionary/page/notion_to_markdown_converter.py +0 -179
  209. notionary/page/properites/property_value_extractor.py +0 -0
  210. notionary/user/notion_user_provider.py +0 -1
  211. notionary-0.2.19.dist-info/METADATA +0 -225
  212. notionary-0.2.19.dist-info/RECORD +0 -150
  213. /notionary/{blocks/document/document_models.py → markdown/___init__.py} +0 -0
  214. /notionary/{blocks/image/image_models.py → markdown/makdown_document_model.py} +0 -0
  215. /notionary/{blocks/mention/mention_models.py → page/reader/handler/equation_renderer.py} +0 -0
  216. /notionary/{blocks/shared/__init__.py → page/writer/markdown_to_notion_post_processor.py} +0 -0
  217. /notionary/{blocks/toggleable_heading/toggleable_heading_models.py → page/writer/markdown_to_notion_text_length_post_processor.py} +0 -0
  218. /notionary/{elements/__init__.py → util/concurrency_limiter.py} +0 -0
  219. {notionary-0.2.19.dist-info → notionary-0.2.22.dist-info}/LICENSE +0 -0
  220. {notionary-0.2.19.dist-info → notionary-0.2.22.dist-info}/WHEEL +0 -0
@@ -0,0 +1,200 @@
1
+ notionary/__init__.py,sha256=u6I31uJ8E_lqg17QIzylzz-mnvnLc4hmVuBGvnDwFgI,607
2
+ notionary/base_notion_client.py,sha256=EKExy91oeVHdknK-XU2IkKB6SJgN96ZfbblRK05wnV4,7071
3
+ notionary/blocks/__init__.py,sha256=CGaDCEmUepqnjkcm7X1OKdxAhtbcIZAu3fxJeySyu6o,76
4
+ notionary/blocks/_bootstrap.py,sha256=8xs6EDSPdGNr7NsrxmH2pg1dvVjfbghX5N74tRALKog,9450
5
+ notionary/blocks/audio/__init__.py,sha256=3158rsK4MIO_vBQV0kfZWIOKd5Cout72bdJljP-f7KM,368
6
+ notionary/blocks/audio/audio_element.py,sha256=owVZmgsEulL7NBexp0smMBONXj8uVVesup7970vLfOg,4615
7
+ notionary/blocks/audio/audio_markdown_node.py,sha256=xYaKYJq7OZ3ky5BxActwFYESNoPBtw3VjCjmEeD9ep0,1140
8
+ notionary/blocks/audio/audio_models.py,sha256=ts281Wgjh0FQBK4a6IKKNGPcG0U18T1euCgo83-JSg4,229
9
+ notionary/blocks/base_block_element.py,sha256=r9W3EHIwQ2A824x2MlFGTfQpZjMvfB-fUVTI2x3peyc,1546
10
+ notionary/blocks/bookmark/__init__.py,sha256=ofLnuXlG-y0C3ex-noLA92iXUFjiej5CyrxVXG_1db4,447
11
+ notionary/blocks/bookmark/bookmark_element.py,sha256=y6wkdRor3cn9n5gE1pFnH6bc5B43YYqrwWHTXrC0GPs,3399
12
+ notionary/blocks/bookmark/bookmark_markdown_node.py,sha256=5DCTQ8AlGLiJUUl4Z0WGEGF4IrJ127f3KNGFm2ZD-ug,1383
13
+ notionary/blocks/bookmark/bookmark_models.py,sha256=kJTitF93xd0YITvP_FuwpjnBUNLeDMr7fDAXV8MAJrk,375
14
+ notionary/blocks/breadcrumbs/__init__.py,sha256=vw7--1u5TAcX4l3J0eu98HbxG6wxsnPrkt7YouT_ESA,498
15
+ notionary/blocks/breadcrumbs/breadcrumb_element.py,sha256=cVZHiMqaYL4EGphnX1OCh3Inf93TFwFosB-1PGCS2do,1268
16
+ notionary/blocks/breadcrumbs/breadcrumb_markdown_node.py,sha256=tbcQOzMHx-dQGa5UAE2jowzPM_wItsb76bCGU4YIKw4,745
17
+ notionary/blocks/breadcrumbs/breadcrumb_models.py,sha256=-XGIIMYiQuGe5iXmW-1Y9Y9Yca0w6u3HbiD1SBue8sI,237
18
+ notionary/blocks/bulleted_list/__init__.py,sha256=2EvFm2h-X6KUHGQhQiOYBqh-DvZbL0qT453eokd8eyw,549
19
+ notionary/blocks/bulleted_list/bulleted_list_element.py,sha256=YY2kOCgFinD7Mk6Ns9KLxm4KlNtlZoT87zcrEpq97HM,3095
20
+ notionary/blocks/bulleted_list/bulleted_list_markdown_node.py,sha256=1MmGbQAbkeV3vwPlqC4ItcR-Abw8JymYWyGLEV2-HfI,827
21
+ notionary/blocks/bulleted_list/bulleted_list_models.py,sha256=2rOHv8KIfTcx0z4JtK968BnLc4lkCrF8So-e5QL_FEY,561
22
+ notionary/blocks/callout/__init__.py,sha256=iDLuJ4szAOY4tCL0NK_bqCzlTC109o51c1cGgDoruZg,431
23
+ notionary/blocks/callout/callout_element.py,sha256=6Ss1jv1cqAM4GuNGvuy7dCFjpp-dLavf-wXevn3IEmw,3575
24
+ notionary/blocks/callout/callout_markdown_node.py,sha256=TMd2wQ0BfoQ0mgHSy5MrqCvpJvovSw7zsLrXnRrJoQs,948
25
+ notionary/blocks/callout/callout_models.py,sha256=KabWhRCkW1KmTGqt23QTc5iCeVczIzRHIVevEagcKE0,860
26
+ notionary/blocks/child_database/__init__.py,sha256=FzjjHOS9Je2oXuxLK9S9Oq56-EDEZRTJBfDzkacFpY0,368
27
+ notionary/blocks/child_database/child_database_element.py,sha256=9Sho1ZuA6GA4xZHpj_iaK18WYd9mXLGr0yvkFIKLqGU,2450
28
+ notionary/blocks/child_database/child_database_models.py,sha256=SP6S9tKTetKNdCkYY3QCxeXd2lq1DyfdNvDhKlhD22Q,264
29
+ notionary/blocks/child_page/__init__.py,sha256=qaHvJqF8Bfzj0NVE1Q5uN_4o3Jl4RuNYspMZ6E7bUuk,182
30
+ notionary/blocks/child_page/child_page_element.py,sha256=iZIJ91CQ9ZztivtSNKKA8-OD6YIGZvGsxeuD8vZ1PLg,3389
31
+ notionary/blocks/child_page/child_page_models.py,sha256=LZhziu2nf-8FopcaQi6dJKOJ3lgY6Pc2S-ace6jPeqQ,240
32
+ notionary/blocks/client.py,sha256=9rhfWM3LNxYrB0bez2RKLGE2gVnBaJbrQa1qu6FSKVE,8692
33
+ notionary/blocks/code/__init__.py,sha256=8mTDHndNb4kzDByETe2gG7-YHMrt18cf_gmV60JXHOc,345
34
+ notionary/blocks/code/code_element.py,sha256=-8b63RxD7qJzOkMMF_eLo-z9TdsI33r0JUJc5cyFAzs,5661
35
+ notionary/blocks/code/code_markdown_node.py,sha256=r25-n8FkV2alrAionnaZIPVGYLnmEw0zeJ_5HpBTWh8,3050
36
+ notionary/blocks/code/code_models.py,sha256=hK-Ka9whQO-xWASr0sbhRcz-FUc5VY5Pjqa8LPW041o,2178
37
+ notionary/blocks/column/__init__.py,sha256=KFza6GKRjVa59ktp0euAVSq1oblK_KXSqAfrOIiT9ps,838
38
+ notionary/blocks/column/column_element.py,sha256=1BtZ5EWq1QpUEAh-OEpvZOTZfeFFDyDKCZCSo8nskJw,2338
39
+ notionary/blocks/column/column_list_element.py,sha256=gyAZ_Q79g5sEp24IbHHXZvyX8BRmN1jo6ahoVxXxR4E,2398
40
+ notionary/blocks/column/column_list_markdown_node.py,sha256=RXwPz-d-vfAb39HZapaXiomuY8eKkUuBBEm7rPyLHl0,1396
41
+ notionary/blocks/column/column_markdown_node.py,sha256=Nc7QReXOWZ0CIuUpgE9dhME4bINo18P1luC6bL0bpPA,1632
42
+ notionary/blocks/column/column_models.py,sha256=Dv1jBWmuFjjSqyOajkh05jmxEwxF9b-LuDA4Sgw8RJI,664
43
+ notionary/blocks/divider/__init__.py,sha256=GX3D_Oksg65Dam4lRGdrOGWuZec35ghuYuvF9HDt_y8,431
44
+ notionary/blocks/divider/divider_element.py,sha256=MHPctdc5-EwxTrcoA4EjEgiFzWnDZqHziKBoz6xZMrQ,1395
45
+ notionary/blocks/divider/divider_markdown_node.py,sha256=XMa4txNnzeJPheNKke4poD5t36DE0Fqj963-QZ3gh8M,583
46
+ notionary/blocks/divider/divider_models.py,sha256=A7jUBYZnE_yRLTZi-sr9sbDCrWNhAdriFNzCpDEBwGU,219
47
+ notionary/blocks/embed/__init__.py,sha256=EgWphqJaJdt3CMjILKEjVexDSTz1KU0NE2rMDNZaCQ0,399
48
+ notionary/blocks/embed/embed_element.py,sha256=xzDBA4OS2O4OASXRoy2oFO5WEm3hF4dVEryokGm8bwk,3594
49
+ notionary/blocks/embed/embed_markdown_node.py,sha256=8pcLAT4Il1e50wIdCSL11Leq6fnGLOlwNAuKTFY-i98,908
50
+ notionary/blocks/embed/embed_models.py,sha256=utXtHlIIK5QA24ZJW7l0XfDtrt12DureH1DugOi9mNw,366
51
+ notionary/blocks/equation/__init__.py,sha256=XP4BgCG-CFXoNI9oUBofg7j2ygZasqdJWhVbJG98kyc,455
52
+ notionary/blocks/equation/equation_element.py,sha256=EME_KVHjdO9e7xnuFxlmkbzRcL1b8LrEikYzXXZGNMM,4750
53
+ notionary/blocks/equation/equation_element_markdown_node.py,sha256=9Hj6S5uNMWbbHWdKRskLZyCvl8Q8B2HpDS__aZsXDmc,911
54
+ notionary/blocks/equation/equation_models.py,sha256=WIpnqHmwh2rpNTVvt6eFNzkhHejW8XMWDQbwtLIcxKw,245
55
+ notionary/blocks/file/__init__.py,sha256=kYPp8iJ-EDWi1BX5E-OkgV_QacQ8ysKn__whyXXEWIw,577
56
+ notionary/blocks/file/file_element.py,sha256=ShjPjsUolIrBJyTHm_QORq_aNanQwJQ0ZFNj-0wfuaA,4394
57
+ notionary/blocks/file/file_element_markdown_node.py,sha256=YJoMkmlbcz7FsysnDMTc7EGubJKdRr8u1zyUnaUtgsU,1148
58
+ notionary/blocks/file/file_element_models.py,sha256=1eia1-OamnF52AUYtC3Ru-xi6HHsnjw9hcuslkHKXuI,850
59
+ notionary/blocks/guards.py,sha256=WaZLfPWUcoPwLzhBUQ5vvVM07dZpCXnw2ObtF1mM62c,586
60
+ notionary/blocks/heading/__init__.py,sha256=dg2hCVsqWv84hvtb6HAb4m1i8b0jyLXokPIYwe5NwZ8,557
61
+ notionary/blocks/heading/heading_element.py,sha256=Hdnlzj94AoYCMYZuVOl91tREn1S6hwolA4vWwMtAFWk,3894
62
+ notionary/blocks/heading/heading_markdown_node.py,sha256=I8_9fg_CsZ-iTMA6PV6V8DBxwa5BDcMfF6NS70iKCbo,881
63
+ notionary/blocks/heading/heading_models.py,sha256=nOEnb66tYt_653PIt-AqjGaOgefFOK6hKG09epCKSSc,794
64
+ notionary/blocks/image_block/__init__.py,sha256=ACOCt1hVFzGm_l9Vb0GVATN7PZNBg7jFp1FymrAi8lw,386
65
+ notionary/blocks/image_block/image_element.py,sha256=02Xkvg4IYZhx5Bb8RBQQAfg7I1fwkrFPGwTW-aMAcus,3610
66
+ notionary/blocks/image_block/image_markdown_node.py,sha256=KpE2FFetUZh96ppuXkpOfauchgT5eWxqZQmfRotK-qY,1280
67
+ notionary/blocks/image_block/image_models.py,sha256=vmuGwgq3uP9ojb-6IOdjsEqIKI-9uTa5_0BCMkzJV_A,229
68
+ notionary/blocks/mixins/captions/__init__.py,sha256=hGq6UOBiSgnaWB9UXgvtuG2sLPNgs5GAaz-8vrBmh2Q,166
69
+ notionary/blocks/mixins/captions/caption_markdown_node_mixin.py,sha256=uaT_k7cfJgDhvdAavPmRJJHeEcwVECe21dcawcffHVE,1021
70
+ notionary/blocks/mixins/captions/caption_mixin.py,sha256=6H69_bkUWSy2vNdW01kEJuOyIopZYoL3fMQ3T7xe6XI,3342
71
+ notionary/blocks/models.py,sha256=cwUgc3wjrKA6MiEnZzCpHS35Y54jPHlIrKRPUNjZm0s,5835
72
+ notionary/blocks/numbered_list/__init__.py,sha256=NcHMDTveGoYccNo6SYBgPdrIX_ZEAh37jOVpvWFKa4s,549
73
+ notionary/blocks/numbered_list/numbered_list_element.py,sha256=ZPoLYCj0xJXeWdjeJImuTeVWd1fqeByLzMj29V4Yf1Y,2755
74
+ notionary/blocks/numbered_list/numbered_list_markdown_node.py,sha256=Lf2QyBQql1JGPKrI-55ywpMcNGvoQDgKQelK5XNrSZU,785
75
+ notionary/blocks/numbered_list/numbered_list_models.py,sha256=dx2abI0GawwfjGnOKKUCtM5kzMs_fSFiHOZM3vOM3d4,587
76
+ notionary/blocks/paragraph/__init__.py,sha256=GjDP9az7qoYeDAaYR0utq6f0F8cFaDb-JhobLhf7ZRY,479
77
+ notionary/blocks/paragraph/paragraph_element.py,sha256=cp90cL0hi9gvIoefmxd-U_xM4z5YiTYt3yO7NQ-Hyvg,2478
78
+ notionary/blocks/paragraph/paragraph_markdown_node.py,sha256=PCu_KLDk5iIJ2jqB0QYziYDridrrE-Mg_ajfALh8p2s,669
79
+ notionary/blocks/paragraph/paragraph_models.py,sha256=Hm4IXYNrKqNqMy6QUt6SnIiVNZU_4a-27BH7fNBjc0o,429
80
+ notionary/blocks/pdf/__init__.py,sha256=NHoP43hIioaAG5GFIkNu5e962oc57xdzax5VdeEklBo,338
81
+ notionary/blocks/pdf/pdf_element.py,sha256=AIUe2FFlYnxV_WpcMD9MNI4bFDajYJ9z5hikBE1_p-k,4056
82
+ notionary/blocks/pdf/pdf_markdown_node.py,sha256=V1J9egeGlvvo4zBTb1Eyv1vQ1oGuWxdm0rJ1naIMjg0,1156
83
+ notionary/blocks/pdf/pdf_models.py,sha256=k3GB01LNDWnvcxj-gtHSMYAwElrDqFdXkw6DFjlpZNY,293
84
+ notionary/blocks/quote/__init__.py,sha256=xb5JY4k6naDYkqSQopWvTj2L9YTNMmFOaFingjUbOkU,444
85
+ notionary/blocks/quote/quote_element.py,sha256=X7YZrhg94rgvWuRi96hbetbMx_FJbYGsmto1P_Am34I,2795
86
+ notionary/blocks/quote/quote_markdown_node.py,sha256=G0539a5xeMMViAzTz5PvN8KYwSZgwrs8itUfXkZ2qlQ,630
87
+ notionary/blocks/quote/quote_models.py,sha256=XT1hDfYw8SZUEg-rPfHiC4_0LNVWK-Vs7J6h9PIGgNE,506
88
+ notionary/blocks/registry/__init__.py,sha256=Het-sHkwxg8c0A1GlPvpm6Ca-GwfN-II55YIpLb-__A,156
89
+ notionary/blocks/registry/block_registry.py,sha256=B01_6jwrIExvMpgxFHDD8P3mXtrkK0SDriNhV7o7NWY,3195
90
+ notionary/blocks/registry/block_registry_builder.py,sha256=a-oID7OpW4b1bEhhsQOOnwK8evlJem-MralvdhaMYno,8866
91
+ notionary/blocks/rich_text/__init__.py,sha256=UuOn0MmGKNqK3fLBnEcH2surwbDkZ4GF8Gpn4TLNwLc,773
92
+ notionary/blocks/rich_text/name_to_id_resolver.py,sha256=crAiY1mzE8RZVvWfkGcEPdGGvRmXa51WTDxca10oWA0,6373
93
+ notionary/blocks/rich_text/rich_text_models.py,sha256=QPCHA-vo8DoH7sLAVzOXervoeeV39JRuJkR-IGVA63Y,6278
94
+ notionary/blocks/rich_text/text_inline_formatter.py,sha256=ICvQFiXDBX56EDrrTha8OvE9eao_9QDxybHP6Bex9ls,18409
95
+ notionary/blocks/syntax_prompt_builder.py,sha256=VwvpR8JyyKR13_ni0jUt--F7w6DoD_nzJB2LbwiJXJc,4626
96
+ notionary/blocks/table/__init__.py,sha256=Vrs6w_P63cFptV-gVuDpFbU5Rg-bDf3Tf_jUk0n-s-I,511
97
+ notionary/blocks/table/table_element.py,sha256=eeqFHlyQ1dG1ZxB3zdrdvF5qXPsLqSEVyNQJ70W9Rwg,8002
98
+ notionary/blocks/table/table_markdown_node.py,sha256=9TJj0C380U-1iykAFouMGtlEM00Ig5-u9lmaWa-nPR8,1402
99
+ notionary/blocks/table/table_models.py,sha256=P0VUkX8FOE6aFWAyhOVVMVAYGtj_LO0sqSYtlbyCpQA,643
100
+ notionary/blocks/table_of_contents/__init__.py,sha256=m79PbE4vhG6UlJ8UFNQDU14_JUHxluLlPGWzgpcGkUo,598
101
+ notionary/blocks/table_of_contents/table_of_contents_element.py,sha256=p4bYHB3jvkptdaB_fjKdqw_LTZmxckuXOKVUiikyc5I,2622
102
+ notionary/blocks/table_of_contents/table_of_contents_markdown_node.py,sha256=en8NdehkYl6mntphjnIwCZPGXnN2o2XTQm3Q5X-hZ_o,897
103
+ notionary/blocks/table_of_contents/table_of_contents_models.py,sha256=ECC5m-q-nDX34XWAqlt5sONxlbQSB0LhLJZpsjpV5xk,531
104
+ notionary/blocks/todo/__init__.py,sha256=HBjy9vRu1yEUk_P4-el1aZMw9SRwpJXGcFFtUEp4Xb8,383
105
+ notionary/blocks/todo/todo_element.py,sha256=8rH84wHH1FEFnVd76AZrT-c-BpkwaN9hLQK7CWMCbBY,3092
106
+ notionary/blocks/todo/todo_markdown_node.py,sha256=MBRHtUQBNvJdX0plxY02r-XW7vkzBc_PFZxtW03UrHo,996
107
+ notionary/blocks/todo/todo_models.py,sha256=ADM2YEFPn6zXan5paS6-eYKqa9-HQ52FQjfUVInJoBI,530
108
+ notionary/blocks/toggle/__init__.py,sha256=kMNpgbKBFoFaOXcfYsNOzHEpBjTZBmYEzXapysbtjNs,415
109
+ notionary/blocks/toggle/toggle_element.py,sha256=O_gv3Xz0vxtJ3-1Hi07xBbrpgLDo9FKZ_OESOhbvpAQ,4618
110
+ notionary/blocks/toggle/toggle_markdown_node.py,sha256=EFGSFVsnl7bM6wm-geQ7tUplHyyZrCzZnwVzb-NbcO8,1270
111
+ notionary/blocks/toggle/toggle_models.py,sha256=Tkqmz7bzKX7v-T9xWZLy9Eiw_ksGg4UZaacE30uZmwI,521
112
+ notionary/blocks/toggleable_heading/__init__.py,sha256=hk43FCDhkSg_QbHEucXSBd96-Gj1tIMwiRxQY-vPREA,412
113
+ notionary/blocks/toggleable_heading/toggleable_heading_element.py,sha256=y3tBDWmi3IeyhFyJEmsFndhlrQls5XhJVUGUVORnXUY,4428
114
+ notionary/blocks/toggleable_heading/toggleable_heading_markdown_node.py,sha256=kSo7rnYjX_9PT6kfmCbMCvndwNbtHNnLYdtznXhWXe4,1626
115
+ notionary/blocks/types.py,sha256=qAmcxIGQcekrLsbNZVjOcI3HYmvHz5bzFFj8Asuh8JI,3567
116
+ notionary/blocks/video/__init__.py,sha256=z_lz1agYtSRv9A9bFRwPlpzmpfgf49w9uJMVkHTTsR0,376
117
+ notionary/blocks/video/video_element.py,sha256=nDYcr1HwCZYVBSLPEo1qHuqU9AQ8yzS9OHQTIe3rVyA,4417
118
+ notionary/blocks/video/video_element_models.py,sha256=CYK2tq0qhrOxjO_ctOgRvEHM9hLjQCBXrP7wcTNlUPw,229
119
+ notionary/blocks/video/video_markdown_node.py,sha256=u5OaoxLzg10PAdvo70OYgi1d-eFtTK_kUdYLAKQWdtM,1151
120
+ notionary/database/__init__.py,sha256=4tdML0fBzkOCpiWT6q-L--5NELFLbTPD0IUA_E8yZno,155
121
+ notionary/database/client.py,sha256=mN_8XHvIQkRxiWbgBfvncgw4IRiCFX3bVLMLBvtk1Ig,5398
122
+ notionary/database/database.py,sha256=sdo830KVInR4enaEaeMHaPadNfYnPLy5R3OW2f74w28,16558
123
+ notionary/database/database_filter_builder.py,sha256=YIkdghD5VbdwLJISMRiJ0WIJTm8jcDIL22yrvZau4sA,5950
124
+ notionary/database/database_provider.py,sha256=HB-hZ9pMjronLJS8w_b1GiQ-Ecz1uJbrWpnePL67BCA,8956
125
+ notionary/database/exceptions.py,sha256=jwFdxoIQHLO3mO3p5t890--1FjbTX60fNyqBAe-sszo,452
126
+ notionary/database/factory.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
127
+ notionary/database/models.py,sha256=4LjnsltPLK4xddz_d_L7I-TnmixyCuqmKV5Mapa2i1I,7603
128
+ notionary/database/notion_database.py,sha256=DNsb_YuMg9Fix8OmKMBBN0FSlCGNWbDbG7GIsrSOgK0,16744
129
+ notionary/file_upload/__init__.py,sha256=7TNyiIgLMD_IGRXTwRiAmStokF3rLoG4zXPwNb9KQqk,168
130
+ notionary/file_upload/client.py,sha256=X3LInvHWuJgiL_phytLRzW6rrocXegm30TmTL0sCcfY,8531
131
+ notionary/file_upload/models.py,sha256=bbACznMXdg7WAlAZ6uJ6qVAj7r3GP9LlEv2T5hxcIrI,1621
132
+ notionary/file_upload/notion_file_upload.py,sha256=Ul3CMicJpUodUa3SU3ihrkWU_Wa5z36mKOqSVXNc_DM,13173
133
+ notionary/markdown/___init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
134
+ notionary/markdown/makdown_document_model.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
135
+ notionary/markdown/markdown_builder.py,sha256=q9J7FduIxrf8hSPu_5P4ZwYaGVZdvpe-qa0dyaRsBJ0,26379
136
+ notionary/markdown/markdown_document_model.py,sha256=i9zMINcTlTwlqpHV9zeQfMVlni2VAl6BMjAdKSdoUeg,6409
137
+ notionary/markdown/markdown_node.py,sha256=u8ApehnTCo1KnTFbtYzGuTAyUQrYPc3RSMJaUMyg0LI,717
138
+ notionary/models/notion_database_response.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
139
+ notionary/page/client.py,sha256=qSXWWeSpi0EnNpUOjqmvgdAMDCyKYvK9AxoMWZpIJzM,4594
140
+ notionary/page/models.py,sha256=pD8FlK8KtnUrIITTd2jg_yJICakgPE4ysZiS9KiMpr0,7088
141
+ notionary/page/notion_page.py,sha256=qgu4Oxfx2asyiXi2a0BmeRE3AOgsfmfVNcXv9kMC_3c,22438
142
+ notionary/page/page_content_deleting_service.py,sha256=ZxGUMmT7k85IPLALfZkIJ5oQA3tMHWVW4acjdp5cB0k,4540
143
+ notionary/page/page_content_writer.py,sha256=6WMDTbgjYRgJhmCrMnK4XokgVDhRWSRm55_1xceo0CA,6856
144
+ notionary/page/page_context.py,sha256=qpy9J5zDdE_v7kHEE4SA14NQJP9Dj8j5gfkqccz23dU,1982
145
+ notionary/page/property_formatter.py,sha256=_978ViH83gfcr-XtDscWTfyBI2srGW2hzC-gzgp5NR8,3788
146
+ notionary/page/reader/handler/__init__.py,sha256=ROMH1KvGGdQ0ANLhmIP_4LtMks9jsTTwnZKP8W0uwls,644
147
+ notionary/page/reader/handler/base_block_renderer.py,sha256=HZwv727bvu6suT1-uzK4y-4ci54VCdi0FF_yOJYBB1g,1513
148
+ notionary/page/reader/handler/block_processing_context.py,sha256=eSNpjQ3tpOc7sJgEm-2UAwd1UvCf-B4CtHJLS5B0lZA,1001
149
+ notionary/page/reader/handler/block_rendering_context.py,sha256=o3ASovI71jtffDeKVtx7hZqg7P6-qXvkWBft7ZqOa_s,1583
150
+ notionary/page/reader/handler/column_list_renderer.py,sha256=rYh4lOmr74j-KE8VqddVbqVyXcZ4ZRg2ig_XNJAKmX8,2011
151
+ notionary/page/reader/handler/column_renderer.py,sha256=XahgbvWCNqpdKpf0fs9E2yU9_sq7F4_ByUXE8Pi_Q_4,2312
152
+ notionary/page/reader/handler/equation_renderer.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
153
+ notionary/page/reader/handler/line_renderer.py,sha256=TvgLZo1URsRQ4UEcaQtbAU4tGIuAX4uh3Kmemp9aRrA,2905
154
+ notionary/page/reader/handler/numbered_list_renderer.py,sha256=tFDfMYxFme1PuNBNi2kbIb13MGNLP5n2-NpLoEklR1E,3480
155
+ notionary/page/reader/handler/toggle_renderer.py,sha256=D-kDJc1JbqM9BSGdgJxBsu1Fb8gpKU9ziNFqkS4_Tu8,2593
156
+ notionary/page/reader/handler/toggleable_heading_renderer.py,sha256=vw336TY9K0v-JFu_x5xHlovCKylSITtMh2RM0YDt4lk,3374
157
+ notionary/page/reader/page_content_retriever.py,sha256=ruzRISReupp5TbVwmVjURBk8wE35YYatNpDFpSpnEEQ,2854
158
+ notionary/page/search_filter_builder.py,sha256=m8NbFUoxxCEBpcWZIxClyix8NNzeohsOw7D-Fddi-qA,4599
159
+ notionary/page/utils.py,sha256=2nfBrWeczBdPH13R3q8dKP4OY4MwEdfKbcs2UJ9kg1o,2041
160
+ notionary/page/writer/handler/__init__.py,sha256=8rAzBvmeaPYoYIB5Fd3XHCKFMmbSdlDZ-C8xN-Qxx0s,794
161
+ notionary/page/writer/handler/code_handler.py,sha256=Xn5SitI2fnJkS38_RGtMEY0EOqwy8m-wnqaNetRx7hY,2671
162
+ notionary/page/writer/handler/column_handler.py,sha256=JIwvWMPiNsMKAG6UEMpkiglD0kKsXQFu1dP1V6L5Keg,5415
163
+ notionary/page/writer/handler/column_list_handler.py,sha256=k_exJ87d8i9MGV_uKxAB_mdpmcf5nfOZQ1bqHUoJHiA,5309
164
+ notionary/page/writer/handler/equation_handler.py,sha256=vflcoaSNNnLxbI_8oE_o33etmF3CxvWYnVQCJ7gbbd8,2844
165
+ notionary/page/writer/handler/line_handler.py,sha256=miuU7MXJj1Ae_B_r4a84s9tJaJ8xWNo-LAeD6RqJ-aM,1163
166
+ notionary/page/writer/handler/line_processing_context.py,sha256=F2GxDXIOgvZHxiDP-VDe8JUHGcsszMexPG0W9E9y39E,1739
167
+ notionary/page/writer/handler/regular_line_handler.py,sha256=2T8xOi4ybcugMJL-sPyVvU0KRVQzFSPpvLibrixIJLA,3223
168
+ notionary/page/writer/handler/table_handler.py,sha256=5r-Uh5Unc0iTbl3PXEDvE6qVCrp6YSprpOP9FRnaLY8,2581
169
+ notionary/page/writer/handler/toggle_handler.py,sha256=3ZmaAxGh4PDqk9U0Gq4FhSWdmdU4-qgQRNvv_8vQf_Q,5823
170
+ notionary/page/writer/handler/toggleable_heading_handler.py,sha256=ae0Cuzzdd5c-xKBFMYjzqRkj47wErgyFoBOZ9ytd0b4,6858
171
+ notionary/page/writer/markdown_to_notion_converter.py,sha256=ENeP7I2ui532rx9hOULrJC6DHwcYELSkItY5epzBWi4,3272
172
+ notionary/page/writer/markdown_to_notion_converter_context.py,sha256=Tys52QEGOzE_zDICI8W6pawCKSFGAjEqOyWTscUUysU,1033
173
+ notionary/page/writer/markdown_to_notion_formatting_post_processor.py,sha256=E41t_TQYLbFTmOzREDrGOUy4gGiSu9pAP8No5Qpsi28,2368
174
+ notionary/page/writer/markdown_to_notion_post_processor.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
175
+ notionary/page/writer/markdown_to_notion_text_length_post_processor.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
176
+ notionary/page/writer/notion_text_length_processor.py,sha256=WfXGouHs2KUFH1ASqloRkV6y7q2jS4vqbiEEMrmd7Qw,5744
177
+ notionary/telemetry/__init__.py,sha256=uzPrvkPIpbzPSHCu-tObCTmZA18l3VWqk42L8WLT-XM,511
178
+ notionary/telemetry/service.py,sha256=FujT1ZuSHzTO0Rxa6oKlycE_Y-Qpe5lc59EGzzDf-jc,4725
179
+ notionary/telemetry/views.py,sha256=FgFZGYaxP7pRYx-9wg18skMh_MJAwf4W3rCfe9JOZe4,1796
180
+ notionary/user/__init__.py,sha256=qcAWjWQVn_3WxAJZpToTj2WuCHhKLdtv3bblmx7SG2U,281
181
+ notionary/user/base_notion_user.py,sha256=qeCUmVvi62HZDQMLaT4bEuu6Dkeit8L0hBMtJaNndJI,1502
182
+ notionary/user/client.py,sha256=8gHEjiE6aNrKGlo3PMoLhIeO8R5gBgF6W7TDOsM1A4E,4515
183
+ notionary/user/models.py,sha256=G6Emj8TqAFTGCmyfKk8hq0bZC_tL7uNdI6USNWTVfP4,2065
184
+ notionary/user/notion_bot_user.py,sha256=AbkyBXM2__yNfGd8czxVqDEKvtFuzgQguyL5da5lvcs,7772
185
+ notionary/user/notion_user.py,sha256=GyWAGYS3OjMz6jYwETqOSmAS3qsGkwhTR9SDw-qvqTg,8503
186
+ notionary/user/notion_user_manager.py,sha256=WVgKRgodwOZU30f6NrPTyOjKwoqUjgj4_sySG_l0AoY,3897
187
+ notionary/util/__init__.py,sha256=umFas1H4zUoxibNn-Ff6dTCWt3mkhmAG4Lu2viZ-XAU,386
188
+ notionary/util/concurrency_limiter.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
189
+ notionary/util/factory_decorator.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
190
+ notionary/util/factory_only.py,sha256=q-ZXUEvQ8lsuD1JQwx-ai6e9Lhie65waRE1BcRhCR_4,1235
191
+ notionary/util/fuzzy.py,sha256=y7EroToodFSIQLD0FAfFrPEDXOUlZaDGN9ko3XjfHMw,2063
192
+ notionary/util/logging_mixin.py,sha256=WLziC-IVovKIe3n3R-ns3YYE2aP5bZVu0r_y5joxhxY,1690
193
+ notionary/util/page_id_utils.py,sha256=AA00kRO-g3Cc50tf_XW_tb5RBuPKLuBxRa0D8LYhLXg,736
194
+ notionary/util/singleton.py,sha256=CKAvykndwPRZsA3n3MAY_XdCR59MBjjKP0vtm2BcvF0,428
195
+ notionary/util/singleton_metaclass.py,sha256=DMvrh0IbAV8nIG1oX-2Yz57Uk1YHB647DNxoI3pAT3s,809
196
+ notionary/workspace.py,sha256=QP4WcOIdQnlVr4M7hpGaFT-Fori_QRhsV-SBC2lnwTU,3809
197
+ notionary-0.2.22.dist-info/LICENSE,sha256=zOm3cRT1qD49eg7vgw95MI79rpUAZa1kRBFwL2FkAr8,1120
198
+ notionary-0.2.22.dist-info/METADATA,sha256=fCrsj7caTmiKxc9Vo-hLyF1yCfxPdX_puiJIzT7DNjU,9116
199
+ notionary-0.2.22.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
200
+ notionary-0.2.22.dist-info/RECORD,,
@@ -1,7 +0,0 @@
1
- from .document_element import DocumentElement
2
- from .document_markdown_node import DocumentMarkdownNode
3
-
4
- __all__ = [
5
- "DocumentElement",
6
- "DocumentMarkdownNode",
7
- ]
@@ -1,102 +0,0 @@
1
- import re
2
- from typing import Dict, Any, Optional, List
3
-
4
- from notionary.blocks import NotionBlockElement, NotionBlockResult
5
- from notionary.blocks import ElementPromptContent, ElementPromptBuilder
6
-
7
- class DocumentElement(NotionBlockElement):
8
- """
9
- Handles conversion between Markdown document embeds and Notion file blocks.
10
-
11
- Markdown document syntax:
12
- - [document](https://example.com/document.pdf "Caption")
13
- - [document](https://example.com/document.pdf)
14
- """
15
- # Nur noch die neue Syntax!
16
- PATTERN = re.compile(
17
- r'^\[document\]\('
18
- r'(https?://[^\s")]+)' # URL
19
- r'(?:\s+"([^"]*)")?' # Optional caption
20
- r'\)$'
21
- )
22
-
23
- @classmethod
24
- def match_markdown(cls, text: str) -> bool:
25
- text = text.strip()
26
- return text.startswith("[document]") and bool(cls.PATTERN.match(text))
27
-
28
- @classmethod
29
- def match_notion(cls, block: Dict[str, Any]) -> bool:
30
- return block.get("type") == "file"
31
-
32
- @classmethod
33
- def markdown_to_notion(cls, text: str) -> Optional[List[Dict[str, Any]]]:
34
- match = cls.PATTERN.match(text.strip())
35
- if not match:
36
- return None
37
- url = match.group(1)
38
- caption = match.group(2) or ""
39
- file_block = {
40
- "type": "file",
41
- "file": {
42
- "type": "external",
43
- "external": {"url": url},
44
- "caption": [{"type": "text", "text": {"content": caption}}] if caption else [],
45
- }
46
- }
47
- # Für Konsistenz mit anderen Blöcken geben wir ein Array zurück
48
- empty_paragraph = {"type": "paragraph", "paragraph": {"rich_text": []}}
49
- return [file_block, empty_paragraph]
50
-
51
- @classmethod
52
- def notion_to_markdown(cls, block: Dict[str, Any]) -> Optional[str]:
53
- if block.get("type") != "file":
54
- return None
55
- file_data = block.get("file", {})
56
- url = ""
57
- if file_data.get("type") == "external":
58
- url = file_data.get("external", {}).get("url", "")
59
- elif file_data.get("type") == "file":
60
- url = file_data.get("file", {}).get("url", "")
61
- if not url:
62
- return None
63
- caption_list = file_data.get("caption", [])
64
- caption = cls._extract_text_content(caption_list)
65
- if caption:
66
- return f'[document]({url} "{caption}")'
67
- return f'[document]({url})'
68
-
69
- @classmethod
70
- def _extract_text_content(cls, rich_text: List[Dict[str, Any]]) -> str:
71
- return "".join(
72
- t.get("text", {}).get("content", "")
73
- for t in rich_text
74
- if t.get("type") == "text"
75
- ) or "".join(t.get("plain_text", "") for t in rich_text if "plain_text" in t)
76
-
77
- @classmethod
78
- def is_multiline(cls) -> bool:
79
- return False
80
-
81
- @classmethod
82
- def get_llm_prompt_content(cls) -> ElementPromptContent:
83
- return (
84
- ElementPromptBuilder()
85
- .with_description(
86
- "Embeds document files from external sources like PDFs, Word docs, Excel files, or cloud storage services."
87
- )
88
- .with_usage_guidelines(
89
- "Use document embeds for sharing contracts, reports, manuals, or any important files."
90
- )
91
- .with_syntax('[document](https://example.com/document.pdf "Caption")')
92
- .with_examples(
93
- [
94
- '[document](https://drive.google.com/file/d/1a2b3c4d5e/view "Project Proposal")',
95
- '[document](https://company.sharepoint.com/reports/q4-2024.xlsx "Q4 Financial Report")',
96
- '[document](https://cdn.company.com/docs/manual-v2.1.pdf "User Manual")',
97
- '[document](https://docs.google.com/document/d/1x2y3z4/edit "Meeting Minutes")',
98
- '[document](https://example.com/contract.pdf)',
99
- ]
100
- )
101
- .build()
102
- )
@@ -1,31 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import Optional
4
- from pydantic import BaseModel
5
- from notionary.blocks.markdown_node import MarkdownNode
6
-
7
- class DocumentMarkdownNodeParams(BaseModel):
8
- url: str
9
- caption: Optional[str] = None
10
-
11
- class DocumentMarkdownNode(MarkdownNode):
12
- """
13
- Programmatic interface for creating Notion-style Markdown document/file embeds.
14
- Example: [document](https://example.com/file.pdf "My Caption")
15
- """
16
-
17
- def __init__(self, url: str, caption: Optional[str] = None):
18
- self.url = url
19
- self.caption = caption or ""
20
-
21
- @classmethod
22
- def from_params(cls, params: DocumentMarkdownNodeParams) -> DocumentMarkdownNode:
23
- return cls(url=params.url, caption=params.caption)
24
-
25
- def to_markdown(self) -> str:
26
- """
27
- Convert to markdown as [document](url "caption") or [document](url) if caption is empty.
28
- """
29
- if self.caption:
30
- return f'[document]({self.url} "{self.caption}")'
31
- return f'[document]({self.url})'
@@ -1,7 +0,0 @@
1
- from .image_element import ImageElement
2
- from .image_markdown_node import ImageMarkdownNode
3
-
4
- __all__ = [
5
- "ImageElement",
6
- "ImageMarkdownNode",
7
- ]
@@ -1,151 +0,0 @@
1
- import re
2
- from typing import Dict, Any, Optional, List
3
-
4
- from notionary.blocks import NotionBlockElement
5
- from notionary.blocks import (
6
- ElementPromptContent,
7
- ElementPromptBuilder,
8
- NotionBlockResult,
9
- )
10
-
11
-
12
- class ImageElement(NotionBlockElement):
13
- """
14
- Handles conversion between Markdown images and Notion image blocks.
15
-
16
- Markdown image syntax:
17
- - [image](https://example.com/image.jpg) - Simple image with URL only
18
- - [image](https://example.com/image.jpg "Caption") - Image with URL and caption
19
-
20
- Where:
21
- - URL is the required image URL
22
- - Caption is an optional descriptive text (enclosed in quotes)
23
- """
24
-
25
- # Regex pattern for image syntax with optional caption
26
- PATTERN = re.compile(
27
- r"^\[image\]\(" # [image]( prefix
28
- + r'(https?://[^\s"]+)' # URL (required)
29
- + r'(?:\s+"([^"]+)")?' # Optional caption in quotes
30
- + r"\)$" # closing parenthesis
31
- )
32
-
33
- @classmethod
34
- def match_markdown(cls, text: str) -> bool:
35
- """Check if text is a markdown image."""
36
- return text.strip().startswith("[image]") and bool(
37
- ImageElement.PATTERN.match(text.strip())
38
- )
39
-
40
- @classmethod
41
- def match_notion(cls, block: Dict[str, Any]) -> bool:
42
- """Check if block is a Notion image."""
43
- return block.get("type") == "image"
44
-
45
- @classmethod
46
- def markdown_to_notion(cls, text: str) -> NotionBlockResult:
47
- """Convert markdown image to Notion image block."""
48
- image_match = ImageElement.PATTERN.match(text.strip())
49
- if not image_match:
50
- return None
51
-
52
- url = image_match.group(1)
53
- caption = image_match.group(2)
54
-
55
- if not url:
56
- return None
57
-
58
- image_data = {"type": "external", "external": {"url": url}}
59
-
60
- # Add caption if provided
61
- if caption:
62
- image_data["caption"] = [{"type": "text", "text": {"content": caption}}]
63
- else:
64
- image_data["caption"] = []
65
-
66
- # Prepare the image block
67
- image_block = {"type": "image", "image": image_data}
68
-
69
- # Add empty paragraph after image
70
- empty_paragraph = {"type": "paragraph", "paragraph": {"rich_text": []}}
71
-
72
- return [image_block, empty_paragraph]
73
-
74
- @classmethod
75
- def notion_to_markdown(cls, block: Dict[str, Any]) -> Optional[str]:
76
- """Convert Notion image block to markdown image."""
77
- if block.get("type") != "image":
78
- return None
79
-
80
- image_data = block.get("image", {})
81
-
82
- # Handle both external and file (uploaded) images
83
- url = ImageElement._extract_image_url(image_data)
84
- if not url:
85
- return None
86
-
87
- caption_rich_text = image_data.get("caption", [])
88
-
89
- if not caption_rich_text:
90
- # Simple image with URL only
91
- return f"[image]({url})"
92
-
93
- # Extract caption text
94
- caption = ImageElement._extract_text_content(caption_rich_text)
95
-
96
- if caption:
97
- return f'[image]({url} "{caption}")'
98
-
99
- return f"[image]({url})"
100
-
101
- @classmethod
102
- def is_multiline(cls) -> bool:
103
- """Images are single-line elements."""
104
- return False
105
-
106
- @classmethod
107
- def _extract_image_url(cls, image_data: Dict[str, Any]) -> str:
108
- """Extract URL from image data, handling both external and uploaded images."""
109
- if image_data.get("type") == "external":
110
- return image_data.get("external", {}).get("url", "")
111
- elif image_data.get("type") == "file":
112
- return image_data.get("file", {}).get("url", "")
113
- return ""
114
-
115
- @classmethod
116
- def _extract_text_content(cls, rich_text: List[Dict[str, Any]]) -> str:
117
- """Extract plain text content from Notion rich_text elements."""
118
- result = ""
119
- for text_obj in rich_text:
120
- if text_obj.get("type") == "text":
121
- result += text_obj.get("text", {}).get("content", "")
122
- elif "plain_text" in text_obj:
123
- result += text_obj.get("plain_text", "")
124
- return result
125
-
126
- @classmethod
127
- def get_llm_prompt_content(cls) -> ElementPromptContent:
128
- """
129
- Returns structured LLM prompt metadata for the image element.
130
- """
131
- return (
132
- ElementPromptBuilder()
133
- .with_description(
134
- "Embeds an image from an external URL into your document."
135
- )
136
- .with_usage_guidelines(
137
- "Use images to include visual content such as diagrams, screenshots, charts, photos, or illustrations "
138
- "that enhance your document. Images can make complex information easier to understand, create visual interest, "
139
- "or provide evidence for your points."
140
- )
141
- .with_syntax('[image](https://example.com/image.jpg "Optional caption")')
142
- .with_examples(
143
- [
144
- "[image](https://example.com/chart.png)",
145
- '[image](https://example.com/screenshot.jpg "Data visualization showing monthly trends")',
146
- '[image](https://company.com/logo.png "Company Inc. logo")',
147
- '[image](https://example.com/diagram.jpg "System architecture overview")',
148
- ]
149
- )
150
- .build()
151
- )