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
@@ -1,149 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import re
4
- from typing import Optional
5
-
6
- from notionary.blocks.base_block_element import BaseBlockElement
7
- from notionary.blocks.code.code_models import CodeBlock, CodeLanguage, CreateCodeBlock
8
- from notionary.blocks.syntax_prompt_builder import BlockElementMarkdownInformation
9
- from notionary.blocks.models import Block, BlockCreateResult, BlockType
10
- from notionary.blocks.rich_text.rich_text_models import RichTextObject
11
-
12
-
13
- class CodeElement(BaseBlockElement):
14
- """
15
- Handles conversion between Markdown code blocks and Notion code blocks.
16
- Now integrated into the LineProcessor stack system.
17
-
18
- Markdown code block syntax:
19
- ```language
20
- [code content as child lines]
21
- ```
22
- """
23
-
24
- DEFAULT_LANGUAGE = "plain text"
25
- CODE_START_PATTERN = re.compile(r"^```(\w*)\s*$")
26
- CODE_START_WITH_CAPTION_PATTERN = re.compile(r"^```(\w*)\s*(?:\"([^\"]*)\")?\s*$")
27
-
28
- @classmethod
29
- def match_notion(cls, block: Block) -> bool:
30
- """Check if block is a Notion code block."""
31
- return block.type == BlockType.CODE and block.code
32
-
33
- @classmethod
34
- async def markdown_to_notion(cls, text: str) -> BlockCreateResult:
35
- """Convert opening ```language to Notion code block."""
36
- if not (match := cls.CODE_START_PATTERN.match(text.strip())):
37
- return None
38
-
39
- language = (match.group(1) or cls.DEFAULT_LANGUAGE).lower()
40
- language = cls._normalize_language(language)
41
-
42
- # Create empty CodeBlock - content will be added by stack processor
43
- code_block = CodeBlock(rich_text=[], language=language, caption=[])
44
- return CreateCodeBlock(code=code_block)
45
-
46
- @classmethod
47
- def create_from_markdown_block(
48
- cls, opening_line: str, code_lines: list[str]
49
- ) -> BlockCreateResult:
50
- """
51
- Create a complete code block from markdown components.
52
- """
53
- match = cls.CODE_START_WITH_CAPTION_PATTERN.match(opening_line.strip())
54
- if not match:
55
- return None
56
-
57
- language = (match.group(1) or cls.DEFAULT_LANGUAGE).lower()
58
- language = cls._normalize_language(language)
59
-
60
- caption = match.group(2) if match.group(2) else None
61
-
62
- # Create rich text content from code lines
63
- rich_text = []
64
- if code_lines:
65
- content = "\n".join(code_lines)
66
- rich_text = [RichTextObject.for_code_block(content)]
67
-
68
- caption_list = []
69
- if caption:
70
- caption_list = [RichTextObject.for_caption(caption)]
71
-
72
- code_block = CodeBlock(
73
- rich_text=rich_text, language=language, caption=caption_list
74
- )
75
-
76
- return CreateCodeBlock(code=code_block)
77
-
78
- @classmethod
79
- async def notion_to_markdown(cls, block: Block) -> Optional[str]:
80
- """Convert Notion code block to Markdown."""
81
- if block.type != BlockType.CODE:
82
- return None
83
-
84
- if not block.code:
85
- return None
86
-
87
- language_enum = block.code.language
88
- rich_text = block.code.rich_text or []
89
- caption = block.code.caption or []
90
-
91
- code_content = cls.extract_content(rich_text)
92
- caption_text = cls.extract_caption(caption)
93
-
94
- # Convert enum to string value
95
- language = language_enum.value if language_enum else ""
96
-
97
- # Handle language - convert "plain text" back to empty string for markdown
98
- if language == cls.DEFAULT_LANGUAGE:
99
- language = ""
100
-
101
- # Build markdown code block
102
- if language:
103
- result = f"```{language}\n{code_content}\n```"
104
- else:
105
- result = f"```\n{code_content}\n```"
106
-
107
- # Add caption if present
108
- if caption_text:
109
- result += f"\nCaption: {caption_text}"
110
-
111
- return result
112
-
113
- @classmethod
114
- def _normalize_language(cls, language: str) -> CodeLanguage:
115
- """
116
- Normalize the language string to a valid CodeLanguage enum or default.
117
- """
118
- # Try to find matching enum by value
119
- for lang_enum in CodeLanguage:
120
- if lang_enum.value.lower() == language.lower():
121
- return lang_enum
122
-
123
- # Return default if not found
124
- return CodeLanguage.PLAIN_TEXT
125
-
126
- @staticmethod
127
- def extract_content(rich_text_list: list[RichTextObject]) -> str:
128
- """Extract code content from rich_text array."""
129
- return "".join(rt.plain_text for rt in rich_text_list if rt.plain_text)
130
-
131
- @staticmethod
132
- def extract_caption(caption_list: list[RichTextObject]) -> str:
133
- """Extract caption text from caption array."""
134
- return "".join(rt.plain_text for rt in caption_list if rt.plain_text)
135
-
136
- @classmethod
137
- def get_system_prompt_information(cls) -> Optional[BlockElementMarkdownInformation]:
138
- """Get system prompt information for code blocks."""
139
- return BlockElementMarkdownInformation(
140
- block_type=cls.__name__,
141
- description="Code blocks display syntax-highlighted code with optional language specification and captions",
142
- syntax_examples=[
143
- "```\nprint('Hello World')\n```",
144
- "```python\nprint('Hello World')\n```",
145
- "```python \"Example code\"\nprint('Hello World')\n```",
146
- "```javascript\nconsole.log('Hello');\n```",
147
- ],
148
- usage_guidelines="Use for displaying code snippets. Language specification enables syntax highlighting. Caption in quotes on first line provides description. Supports many programming languages.",
149
- )
@@ -1,80 +0,0 @@
1
- from typing import Optional
2
-
3
- from notionary.blocks.markdown.markdown_node import MarkdownNode
4
-
5
-
6
- class CodeMarkdownNode(MarkdownNode):
7
- """
8
- Enhanced Code node with Pydantic integration.
9
- Programmatic interface for creating Notion-style Markdown code blocks.
10
- Automatically handles indentation normalization for multiline strings.
11
-
12
- Example:
13
- ```python "Basic usage"
14
- print("Hello, world!")
15
- ```
16
- """
17
-
18
- code: str
19
- language: Optional[str] = None
20
- caption: Optional[str] = None
21
-
22
- def to_markdown(self) -> str:
23
- lang = self.language or ""
24
-
25
- # Build the opening fence with optional caption
26
- opening_fence = f"```{lang}"
27
- if self.caption:
28
- opening_fence += f' "{self.caption}"'
29
-
30
- # Smart indentation normalization
31
- normalized_code = self._normalize_indentation(self.code)
32
-
33
- content = f"{opening_fence}\n{normalized_code}\n```"
34
- return content
35
-
36
- def _normalize_indentation(self, code: str) -> str:
37
- """Normalize indentation by removing common leading whitespace."""
38
- lines = code.strip().split("\n")
39
-
40
- if self._is_empty_or_single_line(lines):
41
- return self._handle_simple_cases(lines)
42
-
43
- min_indentation = self._find_minimum_indentation_excluding_first_line(lines)
44
- return self._remove_common_indentation(lines, min_indentation)
45
-
46
- def _is_empty_or_single_line(self, lines: list[str]) -> bool:
47
- return not lines or len(lines) == 1
48
-
49
- def _handle_simple_cases(self, lines: list[str]) -> str:
50
- if not lines:
51
- return ""
52
- return lines[0].strip()
53
-
54
- def _find_minimum_indentation_excluding_first_line(self, lines: list[str]) -> int:
55
- non_empty_lines_after_first = [line for line in lines[1:] if line.strip()]
56
-
57
- if not non_empty_lines_after_first:
58
- return 0
59
-
60
- return min(
61
- len(line) - len(line.lstrip()) for line in non_empty_lines_after_first
62
- )
63
-
64
- def _remove_common_indentation(self, lines: list[str], min_indentation: int) -> str:
65
- normalized_lines = [lines[0].strip()]
66
-
67
- for line in lines[1:]:
68
- normalized_line = self._normalize_single_line(line, min_indentation)
69
- normalized_lines.append(normalized_line)
70
-
71
- return "\n".join(normalized_lines)
72
-
73
- def _normalize_single_line(self, line: str, min_indentation: int) -> str:
74
- if not line.strip():
75
- return ""
76
-
77
- if len(line) > min_indentation:
78
- return line[min_indentation:]
79
-
80
- return line.strip()
@@ -1,94 +0,0 @@
1
- from enum import Enum
2
- from typing import Literal
3
-
4
- from pydantic import BaseModel, ConfigDict, Field
5
-
6
- from notionary.blocks.rich_text.rich_text_models import RichTextObject
7
-
8
-
9
- class CodeLanguage(str, Enum):
10
- ABAP = "abap"
11
- ARDUINO = "arduino"
12
- BASH = "bash"
13
- BASIC = "basic"
14
- C = "c"
15
- CLOJURE = "clojure"
16
- COFFEESCRIPT = "coffeescript"
17
- CPP = "c++"
18
- CSHARP = "c#"
19
- CSS = "css"
20
- DART = "dart"
21
- DIFF = "diff"
22
- DOCKER = "docker"
23
- ELIXIR = "elixir"
24
- ELM = "elm"
25
- ERLANG = "erlang"
26
- FLOW = "flow"
27
- FORTRAN = "fortran"
28
- FSHARP = "f#"
29
- GHERKIN = "gherkin"
30
- GLSL = "glsl"
31
- GO = "go"
32
- GRAPHQL = "graphql"
33
- GROOVY = "groovy"
34
- HASKELL = "haskell"
35
- HTML = "html"
36
- JAVA = "java"
37
- JAVASCRIPT = "javascript"
38
- JSON = "json"
39
- JULIA = "julia"
40
- KOTLIN = "kotlin"
41
- LATEX = "latex"
42
- LESS = "less"
43
- LISP = "lisp"
44
- LIVESCRIPT = "livescript"
45
- LUA = "lua"
46
- MAKEFILE = "makefile"
47
- MARKDOWN = "markdown"
48
- MARKUP = "markup"
49
- MATLAB = "matlab"
50
- MERMAID = "mermaid"
51
- NIX = "nix"
52
- OBJECTIVE_C = "objective-c"
53
- OCAML = "ocaml"
54
- PASCAL = "pascal"
55
- PERL = "perl"
56
- PHP = "php"
57
- PLAIN_TEXT = "plain text"
58
- POWERSHELL = "powershell"
59
- PROLOG = "prolog"
60
- PROTOBUF = "protobuf"
61
- PYTHON = "python"
62
- R = "r"
63
- REASON = "reason"
64
- RUBY = "ruby"
65
- RUST = "rust"
66
- SASS = "sass"
67
- SCALA = "scala"
68
- SCHEME = "scheme"
69
- SCSS = "scss"
70
- SHELL = "shell"
71
- SQL = "sql"
72
- SWIFT = "swift"
73
- TYPESCRIPT = "typescript"
74
- VB_NET = "vb.net"
75
- VERILOG = "verilog"
76
- VHDL = "vhdl"
77
- VISUAL_BASIC = "visual basic"
78
- WEBASSEMBLY = "webassembly"
79
- XML = "xml"
80
- YAML = "yaml"
81
- JAVA_C_CPP_CSHARP = "java/c/c++/c#"
82
-
83
-
84
- class CodeBlock(BaseModel):
85
- caption: list[RichTextObject] = Field(default_factory=list)
86
- rich_text: list[RichTextObject]
87
- language: CodeLanguage = CodeLanguage.PLAIN_TEXT
88
-
89
- model_config = ConfigDict(arbitrary_types_allowed=True)
90
-
91
-
92
- class CreateCodeBlock(BaseModel):
93
- type: Literal["code"] = "code"
94
- code: CodeBlock
@@ -1,25 +0,0 @@
1
- from notionary.blocks.column.column_element import ColumnElement
2
- from notionary.blocks.column.column_list_element import ColumnListElement
3
- from notionary.blocks.column.column_list_markdown_node import (
4
- ColumnListMarkdownNode,
5
- )
6
- from notionary.blocks.column.column_markdown_node import (
7
- ColumnMarkdownNode,
8
- )
9
- from notionary.blocks.column.column_models import (
10
- ColumnBlock,
11
- ColumnListBlock,
12
- CreateColumnBlock,
13
- CreateColumnListBlock,
14
- )
15
-
16
- __all__ = [
17
- "ColumnElement",
18
- "ColumnListElement",
19
- "ColumnBlock",
20
- "CreateColumnBlock",
21
- "ColumnListBlock",
22
- "CreateColumnListBlock",
23
- "ColumnMarkdownNode",
24
- "ColumnListMarkdownNode",
25
- ]
@@ -1,65 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import re
4
- from typing import Optional
5
-
6
- from notionary.blocks.base_block_element import BaseBlockElement
7
- from notionary.blocks.column.column_models import ColumnBlock, CreateColumnBlock
8
- from notionary.blocks.syntax_prompt_builder import BlockElementMarkdownInformation
9
- from notionary.blocks.models import Block, BlockCreateResult, BlockType
10
-
11
-
12
- class ColumnElement(BaseBlockElement):
13
- """
14
- Handles individual `::: column` blocks with optional width ratio.
15
- Content is automatically added by the stack processor.
16
-
17
- Supported syntax:
18
- - `::: column` (equal width)
19
- - `::: column 0.5` (50% width)
20
- - `::: column 0.25` (25% width)
21
- """
22
-
23
- COLUMN_START = re.compile(r"^:::\s*column(?:\s+(0?\.\d+|1\.0?))?\s*$")
24
-
25
- @classmethod
26
- def match_notion(cls, block: Block) -> bool:
27
- """Check if block is a Notion column."""
28
- return block.type == BlockType.COLUMN and block.column
29
-
30
- @classmethod
31
- async def markdown_to_notion(cls, text: str) -> BlockCreateResult:
32
- """Convert `::: column [ratio]` to Notion ColumnBlock."""
33
- if not (match := cls.COLUMN_START.match(text.strip())):
34
- return None
35
-
36
- ratio_str = match.group(1)
37
- width_ratio = None
38
-
39
- if ratio_str:
40
- try:
41
- width_ratio = float(ratio_str)
42
- # Validate ratio is between 0 and 1
43
- if not (0 < width_ratio <= 1.0):
44
- width_ratio = None # Invalid ratio, use default
45
- except ValueError:
46
- width_ratio = None # Invalid format, use default
47
-
48
- column_content = ColumnBlock(width_ratio=width_ratio)
49
- return CreateColumnBlock(column=column_content)
50
-
51
- @classmethod
52
- async def notion_to_markdown(cls, block: Block) -> str:
53
- """Convert Notion column to markdown."""
54
- if not cls.match_notion(block):
55
- return ""
56
-
57
- if not block.column.width_ratio:
58
- return "::: column"
59
-
60
- return f"::: column {block.column.width_ratio}"
61
-
62
- @classmethod
63
- def get_system_prompt_information(cls) -> Optional[BlockElementMarkdownInformation]:
64
- """Column elements are documented via ColumnListElement - return None to avoid duplication."""
65
- return None
@@ -1,52 +0,0 @@
1
- from typing import Optional
2
- import re
3
-
4
- from notionary.blocks.base_block_element import BaseBlockElement
5
- from notionary.blocks.column.column_models import ColumnListBlock, CreateColumnListBlock
6
- from notionary.blocks.syntax_prompt_builder import BlockElementMarkdownInformation
7
- from notionary.blocks.models import Block, BlockCreateResult
8
- from notionary.blocks.types import BlockType
9
-
10
-
11
- class ColumnListElement(BaseBlockElement):
12
- """
13
- Handles the `::: columns` container.
14
- Individual columns are handled by ColumnElement.
15
- """
16
-
17
- COLUMNS_START = re.compile(r"^:::\s*columns\s*$")
18
-
19
- @classmethod
20
- def match_markdown(cls, text: str) -> bool:
21
- """Check if text starts a columns container."""
22
- return bool(cls.COLUMNS_START.match(text.strip()))
23
-
24
- @classmethod
25
- def match_notion(cls, block: Block) -> bool:
26
- """Check if block is a Notion column_list."""
27
- return block.type == BlockType.COLUMN_LIST and block.column_list
28
-
29
- @classmethod
30
- async def markdown_to_notion(cls, text: str) -> BlockCreateResult:
31
- """Convert `::: columns` to Notion ColumnListBlock."""
32
- if not cls.COLUMNS_START.match(text.strip()):
33
- return None
34
-
35
- # Empty ColumnListBlock - children (columns) added by stack processor
36
- column_list_content = ColumnListBlock()
37
- return CreateColumnListBlock(column_list=column_list_content)
38
-
39
- @classmethod
40
- @classmethod
41
- def get_system_prompt_information(cls) -> Optional[BlockElementMarkdownInformation]:
42
- """Get system prompt information for column list blocks."""
43
- return BlockElementMarkdownInformation(
44
- block_type=cls.__name__,
45
- description="Column list containers organize multiple columns in side-by-side layouts",
46
- syntax_examples=[
47
- "::: columns\n::: column\nContent 1\n:::\n::: column\nContent 2\n:::\n:::",
48
- "::: columns\n::: column 0.6\nMain content\n:::\n::: column 0.4\nSidebar\n:::\n:::",
49
- "::: columns\n::: column 0.25\nLeft\n:::\n::: column 0.5\nCenter\n:::\n::: column 0.25\nRight\n:::\n:::",
50
- ],
51
- usage_guidelines="Use to create multi-column layouts with at least 2 columns. Column width ratios must add up to 1.0 when specified. Each column can contain any block content. Ends with :::.",
52
- )
@@ -1,34 +0,0 @@
1
- from notionary.blocks.column.column_markdown_node import ColumnMarkdownNode
2
- from notionary.blocks.markdown.markdown_node import MarkdownNode
3
-
4
-
5
- class ColumnListMarkdownNode(MarkdownNode):
6
- """
7
- Enhanced Column List node with Pydantic integration.
8
- Programmatic interface for creating a Markdown column list container.
9
- This represents the `::: columns` container that holds multiple columns.
10
-
11
- Example:
12
- ::: columns
13
- ::: column
14
- Left content
15
- with nested lines
16
- :::
17
-
18
- ::: column 0.3
19
- Right content (30% width)
20
- with nested lines
21
- :::
22
- :::
23
- """
24
-
25
- columns: list[ColumnMarkdownNode] = []
26
-
27
- def to_markdown(self) -> str:
28
- if not self.columns:
29
- return "::: columns\n:::"
30
-
31
- column_parts = [column.to_markdown() for column in self.columns]
32
- columns_content = "\n\n".join(column_parts)
33
-
34
- return f"::: columns\n{columns_content}\n:::"
@@ -1,42 +0,0 @@
1
- from typing import Optional
2
- from notionary.blocks.markdown.markdown_node import MarkdownNode
3
-
4
-
5
- class ColumnMarkdownNode(MarkdownNode):
6
- """
7
- Enhanced Column node with Pydantic integration.
8
- Programmatic interface for creating a single Markdown column block
9
- with nested content and optional width ratio.
10
-
11
- Example:
12
- ::: column
13
- # Column Title
14
-
15
- Some content here
16
- :::
17
-
18
- ::: column 0.7
19
- # Wide Column (70%)
20
-
21
- This column takes 70% width
22
- :::
23
- """
24
-
25
- children: list[MarkdownNode] = []
26
- width_ratio: Optional[float] = None
27
-
28
- def to_markdown(self) -> str:
29
- # Start tag with optional width ratio
30
- if self.width_ratio is not None:
31
- start_tag = f"::: column {self.width_ratio}"
32
- else:
33
- start_tag = "::: column"
34
-
35
- if not self.children:
36
- return f"{start_tag}\n:::"
37
-
38
- # Convert children to markdown
39
- content_parts = [child.to_markdown() for child in self.children]
40
- content_text = "\n\n".join(content_parts)
41
-
42
- return f"{start_tag}\n{content_text}\n:::"
@@ -1,26 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import Literal, Optional
4
-
5
- from pydantic import BaseModel, Field
6
-
7
- from notionary.blocks.models import BlockCreateRequest
8
-
9
-
10
- class ColumnBlock(BaseModel):
11
- width_ratio: Optional[float] = None
12
- children: list[BlockCreateRequest] = Field(default_factory=list)
13
-
14
-
15
- class CreateColumnBlock(BaseModel):
16
- type: Literal["column"] = "column"
17
- column: ColumnBlock
18
-
19
-
20
- class ColumnListBlock(BaseModel):
21
- children: list[CreateColumnBlock] = Field(default_factory=list)
22
-
23
-
24
- class CreateColumnListBlock(BaseModel):
25
- type: Literal["column_list"] = "column_list"
26
- column_list: ColumnListBlock
@@ -1,12 +0,0 @@
1
- from notionary.blocks.divider.divider_element import DividerElement
2
- from notionary.blocks.divider.divider_markdown_node import (
3
- DividerMarkdownNode,
4
- )
5
- from notionary.blocks.divider.divider_models import CreateDividerBlock, DividerBlock
6
-
7
- __all__ = [
8
- "DividerElement",
9
- "DividerBlock",
10
- "CreateDividerBlock",
11
- "DividerMarkdownNode",
12
- ]
@@ -1,41 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import re
4
- from typing import Optional
5
-
6
- from notionary.blocks.base_block_element import BaseBlockElement
7
- from notionary.blocks.divider.divider_models import CreateDividerBlock, DividerBlock
8
- from notionary.blocks.models import Block, BlockCreateResult
9
- from notionary.blocks.types import BlockType
10
-
11
-
12
- class DividerElement(BaseBlockElement):
13
- """
14
- Handles conversion between Markdown horizontal dividers and Notion divider blocks.
15
-
16
- Markdown divider syntax:
17
- - Three or more hyphens (---) on a line by themselves
18
- """
19
-
20
- PATTERN = re.compile(r"^\s*-{3,}\s*$")
21
-
22
- @classmethod
23
- def match_notion(cls, block: Block) -> bool:
24
- """Check if this element can handle the given Notion block."""
25
- return block.type == BlockType.DIVIDER and block.divider
26
-
27
- @classmethod
28
- async def markdown_to_notion(cls, text: str) -> BlockCreateResult:
29
- """Convert markdown horizontal rule to Notion divider, with preceding empty paragraph."""
30
- if not cls.PATTERN.match(text.strip()):
31
- return None
32
-
33
- divider = DividerBlock()
34
-
35
- return CreateDividerBlock(divider=divider)
36
-
37
- @classmethod
38
- async def notion_to_markdown(cls, block: Block) -> Optional[str]:
39
- if block.type != BlockType.DIVIDER or not block.divider:
40
- return None
41
- return "---"
@@ -1,11 +0,0 @@
1
- from notionary.blocks.markdown.markdown_node import MarkdownNode
2
-
3
-
4
- class DividerMarkdownNode(MarkdownNode):
5
- """
6
- Enhanced Divider node with Pydantic integration.
7
- Programmatic interface for creating Markdown divider lines (---).
8
- """
9
-
10
- def to_markdown(self) -> str:
11
- return "---"
@@ -1,12 +0,0 @@
1
- from typing import Literal
2
-
3
- from pydantic import BaseModel
4
-
5
-
6
- class DividerBlock(BaseModel):
7
- pass
8
-
9
-
10
- class CreateDividerBlock(BaseModel):
11
- type: Literal["divider"] = "divider"
12
- divider: DividerBlock
@@ -1,12 +0,0 @@
1
- from notionary.blocks.embed.embed_element import EmbedElement
2
- from notionary.blocks.embed.embed_markdown_node import (
3
- EmbedMarkdownNode,
4
- )
5
- from notionary.blocks.embed.embed_models import CreateEmbedBlock, EmbedBlock
6
-
7
- __all__ = [
8
- "EmbedElement",
9
- "EmbedBlock",
10
- "CreateEmbedBlock",
11
- "EmbedMarkdownNode",
12
- ]