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.
- notionary/__init__.py +5 -20
- notionary/blocks/client.py +87 -215
- notionary/blocks/enums.py +167 -0
- notionary/blocks/rich_text/markdown_rich_text_converter.py +266 -0
- notionary/blocks/rich_text/models.py +164 -0
- notionary/blocks/rich_text/name_id_resolver/__init__.py +11 -0
- notionary/blocks/rich_text/name_id_resolver/database.py +31 -0
- notionary/blocks/rich_text/name_id_resolver/page.py +34 -0
- notionary/blocks/rich_text/name_id_resolver/person.py +37 -0
- notionary/blocks/rich_text/name_id_resolver/port.py +11 -0
- notionary/blocks/rich_text/rich_text_markdown_converter.py +132 -0
- notionary/blocks/rich_text/rich_text_patterns.py +39 -0
- notionary/blocks/schemas.py +746 -0
- notionary/comments/client.py +52 -187
- notionary/comments/factory.py +40 -0
- notionary/comments/models.py +5 -127
- notionary/comments/schemas.py +240 -0
- notionary/comments/service.py +34 -0
- notionary/data_source/http/client.py +11 -0
- notionary/data_source/http/data_source_instance_client.py +94 -0
- notionary/data_source/properties/models.py +406 -0
- notionary/data_source/query/builder.py +429 -0
- notionary/data_source/query/resolver.py +114 -0
- notionary/data_source/query/schema.py +304 -0
- notionary/data_source/query/validator.py +73 -0
- notionary/data_source/schemas.py +27 -0
- notionary/data_source/service.py +353 -0
- notionary/database/client.py +30 -135
- notionary/database/database_metadata_update_client.py +19 -0
- notionary/database/schemas.py +29 -0
- notionary/database/service.py +169 -0
- notionary/exceptions/__init__.py +33 -0
- notionary/exceptions/api.py +41 -0
- notionary/exceptions/base.py +2 -0
- notionary/exceptions/block_parsing.py +16 -0
- notionary/exceptions/data_source/__init__.py +6 -0
- notionary/exceptions/data_source/builder.py +182 -0
- notionary/exceptions/data_source/properties.py +34 -0
- notionary/exceptions/properties.py +58 -0
- notionary/exceptions/search.py +33 -0
- notionary/file_upload/client.py +18 -30
- notionary/file_upload/models.py +7 -8
- notionary/file_upload/{notion_file_upload.py → service.py} +29 -64
- notionary/http/client.py +205 -0
- notionary/http/models.py +49 -0
- notionary/page/blocks/client.py +1 -0
- notionary/page/content/factory.py +68 -0
- notionary/page/content/markdown/__init__.py +5 -0
- notionary/page/content/markdown/builder.py +304 -0
- notionary/page/content/markdown/nodes/__init__.py +54 -0
- notionary/page/content/markdown/nodes/audio.py +23 -0
- notionary/page/content/markdown/nodes/base.py +12 -0
- notionary/page/content/markdown/nodes/bookmark.py +25 -0
- notionary/page/content/markdown/nodes/breadcrumb.py +14 -0
- notionary/page/content/markdown/nodes/bulleted_list.py +18 -0
- notionary/page/content/markdown/nodes/callout.py +32 -0
- notionary/page/content/markdown/nodes/code.py +30 -0
- notionary/page/content/markdown/nodes/columns.py +51 -0
- notionary/page/content/markdown/nodes/divider.py +14 -0
- notionary/page/content/markdown/nodes/embed.py +23 -0
- notionary/page/content/markdown/nodes/equation.py +19 -0
- notionary/page/content/markdown/nodes/file.py +23 -0
- notionary/page/content/markdown/nodes/heading.py +16 -0
- notionary/page/content/markdown/nodes/image.py +23 -0
- notionary/page/content/markdown/nodes/mixins/caption.py +12 -0
- notionary/page/content/markdown/nodes/numbered_list.py +15 -0
- notionary/page/content/markdown/nodes/paragraph.py +14 -0
- notionary/page/content/markdown/nodes/pdf.py +23 -0
- notionary/page/content/markdown/nodes/quote.py +15 -0
- notionary/page/content/markdown/nodes/space.py +14 -0
- notionary/page/content/markdown/nodes/table.py +45 -0
- notionary/page/content/markdown/nodes/table_of_contents.py +14 -0
- notionary/page/content/markdown/nodes/todo.py +22 -0
- notionary/page/content/markdown/nodes/toggle.py +28 -0
- notionary/page/content/markdown/nodes/toggleable_heading.py +35 -0
- notionary/page/content/markdown/nodes/video.py +23 -0
- notionary/page/content/parser/context.py +49 -0
- notionary/page/content/parser/factory.py +219 -0
- notionary/page/content/parser/parsers/__init__.py +60 -0
- notionary/page/content/parser/parsers/audio.py +40 -0
- notionary/page/content/parser/parsers/base.py +30 -0
- notionary/page/content/parser/parsers/bookmark.py +33 -0
- notionary/page/content/parser/parsers/breadcrumb.py +33 -0
- notionary/page/content/parser/parsers/bulleted_list.py +41 -0
- notionary/page/content/parser/parsers/callout.py +129 -0
- notionary/page/content/parser/parsers/caption.py +55 -0
- notionary/page/content/parser/parsers/code.py +81 -0
- notionary/page/content/parser/parsers/column.py +117 -0
- notionary/page/content/parser/parsers/column_list.py +81 -0
- notionary/page/content/parser/parsers/divider.py +33 -0
- notionary/page/content/parser/parsers/embed.py +33 -0
- notionary/page/content/parser/parsers/equation.py +65 -0
- notionary/page/content/parser/parsers/file.py +42 -0
- notionary/page/content/parser/parsers/heading.py +58 -0
- notionary/page/content/parser/parsers/image.py +42 -0
- notionary/page/content/parser/parsers/numbered_list.py +45 -0
- notionary/page/content/parser/parsers/paragraph.py +36 -0
- notionary/page/content/parser/parsers/pdf.py +42 -0
- notionary/page/content/parser/parsers/quote.py +65 -0
- notionary/page/content/parser/parsers/space.py +35 -0
- notionary/page/content/parser/parsers/table.py +144 -0
- notionary/page/content/parser/parsers/table_of_contents.py +32 -0
- notionary/page/content/parser/parsers/todo.py +58 -0
- notionary/page/content/parser/parsers/toggle.py +127 -0
- notionary/page/content/parser/parsers/toggleable_heading.py +150 -0
- notionary/page/content/parser/parsers/video.py +42 -0
- notionary/page/content/parser/post_processing/handlers/__init__.py +5 -0
- notionary/page/content/parser/post_processing/handlers/rich_text_length.py +93 -0
- notionary/page/content/parser/post_processing/handlers/rich_text_length_truncation.py +93 -0
- notionary/page/content/parser/post_processing/port.py +9 -0
- notionary/page/content/parser/post_processing/service.py +16 -0
- notionary/page/content/parser/pre_processsing/handlers/__init__.py +9 -0
- notionary/page/content/parser/pre_processsing/handlers/column_syntax.py +80 -0
- notionary/page/content/parser/pre_processsing/handlers/port.py +7 -0
- notionary/page/content/parser/pre_processsing/handlers/whitespace.py +68 -0
- notionary/page/content/parser/pre_processsing/service.py +15 -0
- notionary/page/content/parser/service.py +69 -0
- notionary/page/content/renderer/context.py +48 -0
- notionary/page/content/renderer/factory.py +240 -0
- notionary/page/content/renderer/post_processing/handlers/__init__.py +5 -0
- notionary/page/content/renderer/post_processing/handlers/numbered_list_placeholdere.py +62 -0
- notionary/page/content/renderer/post_processing/port.py +7 -0
- notionary/page/content/renderer/post_processing/service.py +15 -0
- notionary/page/content/renderer/renderers/__init__.py +57 -0
- notionary/page/content/renderer/renderers/audio.py +31 -0
- notionary/page/content/renderer/renderers/base.py +31 -0
- notionary/page/content/renderer/renderers/bookmark.py +25 -0
- notionary/page/content/renderer/renderers/breadcrumb.py +21 -0
- notionary/page/content/renderer/renderers/bulleted_list.py +48 -0
- notionary/page/content/renderer/renderers/callout.py +65 -0
- notionary/page/content/renderer/renderers/captioned_block.py +58 -0
- notionary/page/content/renderer/renderers/code.py +34 -0
- notionary/page/content/renderer/renderers/column.py +44 -0
- notionary/page/content/renderer/renderers/column_list.py +31 -0
- notionary/page/content/renderer/renderers/divider.py +22 -0
- notionary/page/content/renderer/renderers/embed.py +25 -0
- notionary/page/content/renderer/renderers/equation.py +37 -0
- notionary/page/content/renderer/renderers/fallback.py +24 -0
- notionary/page/content/renderer/renderers/file.py +40 -0
- notionary/page/content/renderer/renderers/heading.py +69 -0
- notionary/page/content/renderer/renderers/image.py +31 -0
- notionary/page/content/renderer/renderers/numbered_list.py +41 -0
- notionary/page/content/renderer/renderers/paragraph.py +40 -0
- notionary/page/content/renderer/renderers/pdf.py +31 -0
- notionary/page/content/renderer/renderers/quote.py +49 -0
- notionary/page/content/renderer/renderers/table.py +115 -0
- notionary/page/content/renderer/renderers/table_of_contents.py +26 -0
- notionary/page/content/renderer/renderers/table_row.py +17 -0
- notionary/page/content/renderer/renderers/todo.py +56 -0
- notionary/page/content/renderer/renderers/toggle.py +53 -0
- notionary/page/content/renderer/renderers/toggleable_heading.py +78 -0
- notionary/page/content/renderer/renderers/video.py +31 -0
- notionary/page/content/renderer/service.py +50 -0
- notionary/page/content/service.py +65 -0
- notionary/page/content/syntax/models.py +68 -0
- notionary/page/content/syntax/service.py +453 -0
- notionary/page/page_context.py +7 -16
- notionary/page/page_http_client.py +15 -0
- notionary/page/page_metadata_update_client.py +19 -0
- notionary/page/properties/client.py +144 -0
- notionary/page/properties/factory.py +26 -0
- notionary/page/properties/models.py +307 -0
- notionary/page/properties/service.py +257 -0
- notionary/page/schemas.py +13 -0
- notionary/page/service.py +222 -0
- notionary/shared/entity/client.py +29 -0
- notionary/shared/entity/dto_parsers.py +53 -0
- notionary/shared/entity/entity_metadata_update_client.py +41 -0
- notionary/shared/entity/schemas.py +45 -0
- notionary/shared/entity/service.py +171 -0
- notionary/shared/models/cover.py +20 -0
- notionary/shared/models/file.py +21 -0
- notionary/shared/models/icon.py +28 -0
- notionary/shared/models/parent.py +41 -0
- notionary/shared/properties/type.py +30 -0
- notionary/user/__init__.py +4 -8
- notionary/user/base.py +89 -0
- notionary/user/bot.py +70 -0
- notionary/user/client.py +22 -111
- notionary/user/person.py +41 -0
- notionary/user/schemas.py +67 -0
- notionary/user/service.py +65 -0
- notionary/utils/async_retry.py +39 -0
- notionary/utils/date.py +51 -0
- notionary/utils/fuzzy.py +56 -0
- notionary/{util/logging_mixin.py → utils/mixins/logging.py} +4 -16
- notionary/utils/pagination.py +50 -0
- notionary/utils/singleton.py +13 -0
- notionary/utils/uuid_utils.py +20 -0
- notionary/workspace/__init__.py +3 -0
- notionary/workspace/client.py +62 -0
- notionary/workspace/query/builder.py +60 -0
- notionary/workspace/query/models.py +60 -0
- notionary/workspace/query/service.py +93 -0
- notionary/workspace/schemas.py +21 -0
- notionary/workspace/service.py +116 -0
- {notionary-0.2.26.dist-info → notionary-0.2.28.dist-info}/METADATA +54 -49
- notionary-0.2.28.dist-info/RECORD +200 -0
- {notionary-0.2.26.dist-info → notionary-0.2.28.dist-info}/WHEEL +1 -1
- {notionary-0.2.26.dist-info → notionary-0.2.28.dist-info/licenses}/LICENSE +9 -9
- notionary/base_notion_client.py +0 -219
- notionary/blocks/__init__.py +0 -5
- notionary/blocks/_bootstrap.py +0 -271
- notionary/blocks/audio/__init__.py +0 -11
- notionary/blocks/audio/audio_element.py +0 -158
- notionary/blocks/audio/audio_markdown_node.py +0 -24
- notionary/blocks/audio/audio_models.py +0 -10
- notionary/blocks/base_block_element.py +0 -42
- notionary/blocks/bookmark/__init__.py +0 -12
- notionary/blocks/bookmark/bookmark_element.py +0 -83
- notionary/blocks/bookmark/bookmark_markdown_node.py +0 -28
- notionary/blocks/bookmark/bookmark_models.py +0 -15
- notionary/blocks/breadcrumbs/__init__.py +0 -15
- notionary/blocks/breadcrumbs/breadcrumb_element.py +0 -39
- notionary/blocks/breadcrumbs/breadcrumb_markdown_node.py +0 -13
- notionary/blocks/breadcrumbs/breadcrumb_models.py +0 -12
- notionary/blocks/bulleted_list/__init__.py +0 -15
- notionary/blocks/bulleted_list/bulleted_list_element.py +0 -74
- notionary/blocks/bulleted_list/bulleted_list_markdown_node.py +0 -20
- notionary/blocks/bulleted_list/bulleted_list_models.py +0 -17
- notionary/blocks/callout/__init__.py +0 -12
- notionary/blocks/callout/callout_element.py +0 -99
- notionary/blocks/callout/callout_markdown_node.py +0 -19
- notionary/blocks/callout/callout_models.py +0 -33
- notionary/blocks/child_database/__init__.py +0 -14
- notionary/blocks/child_database/child_database_element.py +0 -59
- notionary/blocks/child_database/child_database_models.py +0 -12
- notionary/blocks/child_page/__init__.py +0 -9
- notionary/blocks/child_page/child_page_element.py +0 -94
- notionary/blocks/child_page/child_page_models.py +0 -12
- notionary/blocks/code/__init__.py +0 -11
- notionary/blocks/code/code_element.py +0 -149
- notionary/blocks/code/code_markdown_node.py +0 -80
- notionary/blocks/code/code_models.py +0 -94
- notionary/blocks/column/__init__.py +0 -25
- notionary/blocks/column/column_element.py +0 -65
- notionary/blocks/column/column_list_element.py +0 -52
- notionary/blocks/column/column_list_markdown_node.py +0 -34
- notionary/blocks/column/column_markdown_node.py +0 -42
- notionary/blocks/column/column_models.py +0 -26
- notionary/blocks/divider/__init__.py +0 -12
- notionary/blocks/divider/divider_element.py +0 -41
- notionary/blocks/divider/divider_markdown_node.py +0 -11
- notionary/blocks/divider/divider_models.py +0 -12
- notionary/blocks/embed/__init__.py +0 -12
- notionary/blocks/embed/embed_element.py +0 -98
- notionary/blocks/embed/embed_markdown_node.py +0 -19
- notionary/blocks/embed/embed_models.py +0 -14
- notionary/blocks/equation/__init__.py +0 -13
- notionary/blocks/equation/equation_element.py +0 -133
- notionary/blocks/equation/equation_element_markdown_node.py +0 -23
- notionary/blocks/equation/equation_models.py +0 -11
- notionary/blocks/file/__init__.py +0 -23
- notionary/blocks/file/file_element.py +0 -133
- notionary/blocks/file/file_element_markdown_node.py +0 -24
- notionary/blocks/file/file_element_models.py +0 -39
- notionary/blocks/heading/__init__.py +0 -19
- notionary/blocks/heading/heading_element.py +0 -112
- notionary/blocks/heading/heading_markdown_node.py +0 -16
- notionary/blocks/heading/heading_models.py +0 -29
- notionary/blocks/image_block/__init__.py +0 -11
- notionary/blocks/image_block/image_element.py +0 -130
- notionary/blocks/image_block/image_markdown_node.py +0 -25
- notionary/blocks/image_block/image_models.py +0 -10
- notionary/blocks/markdown/markdown_builder.py +0 -525
- notionary/blocks/markdown/markdown_document_model.py +0 -0
- notionary/blocks/markdown/markdown_node.py +0 -25
- notionary/blocks/mixins/captions/__init__.py +0 -4
- notionary/blocks/mixins/captions/caption_markdown_node_mixin.py +0 -31
- notionary/blocks/mixins/captions/caption_mixin.py +0 -92
- notionary/blocks/mixins/file_upload/__init__.py +0 -3
- notionary/blocks/mixins/file_upload/file_upload_mixin.py +0 -320
- notionary/blocks/models.py +0 -174
- notionary/blocks/numbered_list/__init__.py +0 -16
- notionary/blocks/numbered_list/numbered_list_element.py +0 -65
- notionary/blocks/numbered_list/numbered_list_markdown_node.py +0 -17
- notionary/blocks/numbered_list/numbered_list_models.py +0 -17
- notionary/blocks/paragraph/__init__.py +0 -15
- notionary/blocks/paragraph/paragraph_element.py +0 -58
- notionary/blocks/paragraph/paragraph_markdown_node.py +0 -16
- notionary/blocks/paragraph/paragraph_models.py +0 -16
- notionary/blocks/pdf/__init__.py +0 -11
- notionary/blocks/pdf/pdf_element.py +0 -146
- notionary/blocks/pdf/pdf_markdown_node.py +0 -24
- notionary/blocks/pdf/pdf_models.py +0 -11
- notionary/blocks/quote/__init__.py +0 -14
- notionary/blocks/quote/quote_element.py +0 -75
- notionary/blocks/quote/quote_markdown_node.py +0 -16
- notionary/blocks/quote/quote_models.py +0 -18
- notionary/blocks/registry/__init__.py +0 -3
- notionary/blocks/registry/block_registry.py +0 -150
- notionary/blocks/rich_text/__init__.py +0 -33
- notionary/blocks/rich_text/rich_text_models.py +0 -221
- notionary/blocks/rich_text/text_inline_formatter.py +0 -456
- notionary/blocks/syntax_prompt_builder.py +0 -137
- notionary/blocks/table/__init__.py +0 -19
- notionary/blocks/table/table_element.py +0 -225
- notionary/blocks/table/table_markdown_node.py +0 -42
- notionary/blocks/table/table_models.py +0 -28
- notionary/blocks/table_of_contents/__init__.py +0 -17
- notionary/blocks/table_of_contents/table_of_contents_element.py +0 -80
- notionary/blocks/table_of_contents/table_of_contents_markdown_node.py +0 -21
- notionary/blocks/table_of_contents/table_of_contents_models.py +0 -18
- notionary/blocks/todo/__init__.py +0 -12
- notionary/blocks/todo/todo_element.py +0 -81
- notionary/blocks/todo/todo_markdown_node.py +0 -21
- notionary/blocks/todo/todo_models.py +0 -18
- notionary/blocks/toggle/__init__.py +0 -12
- notionary/blocks/toggle/toggle_element.py +0 -112
- notionary/blocks/toggle/toggle_markdown_node.py +0 -31
- notionary/blocks/toggle/toggle_models.py +0 -17
- notionary/blocks/toggleable_heading/__init__.py +0 -11
- notionary/blocks/toggleable_heading/toggleable_heading_element.py +0 -115
- notionary/blocks/toggleable_heading/toggleable_heading_markdown_node.py +0 -34
- notionary/blocks/types.py +0 -130
- notionary/blocks/video/__init__.py +0 -11
- notionary/blocks/video/video_element.py +0 -187
- notionary/blocks/video/video_element_models.py +0 -10
- notionary/blocks/video/video_markdown_node.py +0 -26
- notionary/comments/__init__.py +0 -26
- notionary/database/__init__.py +0 -4
- notionary/database/database.py +0 -480
- notionary/database/database_filter_builder.py +0 -173
- notionary/database/database_provider.py +0 -227
- notionary/database/exceptions.py +0 -13
- notionary/database/factory.py +0 -0
- notionary/database/models.py +0 -337
- notionary/database/notion_database.py +0 -487
- notionary/file_upload/__init__.py +0 -7
- notionary/page/client.py +0 -124
- notionary/page/markdown_whitespace_processor.py +0 -129
- notionary/page/models.py +0 -322
- notionary/page/notion_page.py +0 -674
- notionary/page/page_content_deleting_service.py +0 -117
- notionary/page/page_content_writer.py +0 -80
- notionary/page/property_formatter.py +0 -99
- notionary/page/reader/handler/__init__.py +0 -19
- notionary/page/reader/handler/base_block_renderer.py +0 -44
- notionary/page/reader/handler/block_processing_context.py +0 -35
- notionary/page/reader/handler/block_rendering_context.py +0 -48
- notionary/page/reader/handler/column_list_renderer.py +0 -51
- notionary/page/reader/handler/column_renderer.py +0 -60
- notionary/page/reader/handler/equation_renderer.py +0 -0
- notionary/page/reader/handler/line_renderer.py +0 -73
- notionary/page/reader/handler/numbered_list_renderer.py +0 -85
- notionary/page/reader/handler/toggle_renderer.py +0 -69
- notionary/page/reader/handler/toggleable_heading_renderer.py +0 -89
- notionary/page/reader/page_content_retriever.py +0 -81
- notionary/page/search_filter_builder.py +0 -132
- notionary/page/utils.py +0 -60
- notionary/page/writer/handler/__init__.py +0 -24
- notionary/page/writer/handler/code_handler.py +0 -72
- notionary/page/writer/handler/column_handler.py +0 -141
- notionary/page/writer/handler/column_list_handler.py +0 -139
- notionary/page/writer/handler/equation_handler.py +0 -74
- notionary/page/writer/handler/line_handler.py +0 -35
- notionary/page/writer/handler/line_processing_context.py +0 -54
- notionary/page/writer/handler/regular_line_handler.py +0 -86
- notionary/page/writer/handler/table_handler.py +0 -66
- notionary/page/writer/handler/toggle_handler.py +0 -159
- notionary/page/writer/handler/toggleable_heading_handler.py +0 -174
- notionary/page/writer/markdown_to_notion_converter.py +0 -139
- notionary/page/writer/markdown_to_notion_converter_context.py +0 -30
- notionary/page/writer/markdown_to_notion_text_length_post_processor.py +0 -0
- notionary/page/writer/notion_text_length_processor.py +0 -150
- notionary/schemas/__init__.py +0 -3
- notionary/schemas/base.py +0 -73
- notionary/shared/__init__.py +0 -3
- notionary/shared/name_to_id_resolver.py +0 -203
- notionary/telemetry/__init__.py +0 -19
- notionary/telemetry/service.py +0 -136
- notionary/telemetry/views.py +0 -73
- notionary/user/base_notion_user.py +0 -53
- notionary/user/models.py +0 -84
- notionary/user/notion_bot_user.py +0 -226
- notionary/user/notion_user.py +0 -255
- notionary/user/notion_user_manager.py +0 -101
- notionary/util/__init__.py +0 -15
- notionary/util/concurrency_limiter.py +0 -0
- notionary/util/factory_decorator.py +0 -0
- notionary/util/factory_only.py +0 -37
- notionary/util/fuzzy.py +0 -75
- notionary/util/page_id_utils.py +0 -27
- notionary/util/singleton.py +0 -18
- notionary/util/singleton_metaclass.py +0 -22
- notionary/workspace.py +0 -105
- notionary-0.2.26.dist-info/RECORD +0 -202
@@ -0,0 +1,23 @@
|
|
1
|
+
from typing import override
|
2
|
+
|
3
|
+
from notionary.page.content.markdown.nodes.base import MarkdownNode
|
4
|
+
from notionary.page.content.markdown.nodes.mixins.caption import CaptionMarkdownNodeMixin
|
5
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
6
|
+
|
7
|
+
|
8
|
+
class EmbedMarkdownNode(MarkdownNode, CaptionMarkdownNodeMixin):
|
9
|
+
def __init__(
|
10
|
+
self,
|
11
|
+
url: str,
|
12
|
+
caption: str | None = None,
|
13
|
+
syntax_registry: SyntaxRegistry | None = None,
|
14
|
+
) -> None:
|
15
|
+
super().__init__(syntax_registry=syntax_registry)
|
16
|
+
self.url = url
|
17
|
+
self.caption = caption
|
18
|
+
|
19
|
+
@override
|
20
|
+
def to_markdown(self) -> str:
|
21
|
+
embed_syntax = self._syntax_registry.get_embed_syntax()
|
22
|
+
base_markdown = f"{embed_syntax.start_delimiter}{self.url}{embed_syntax.end_delimiter}"
|
23
|
+
return self._append_caption_to_markdown(base_markdown, self.caption)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
from typing import override
|
2
|
+
|
3
|
+
from notionary.page.content.markdown.nodes.base import MarkdownNode
|
4
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
5
|
+
|
6
|
+
|
7
|
+
class EquationMarkdownNode(MarkdownNode):
|
8
|
+
def __init__(self, expression: str, syntax_registry: SyntaxRegistry | None = None) -> None:
|
9
|
+
super().__init__(syntax_registry=syntax_registry)
|
10
|
+
self.expression = expression
|
11
|
+
|
12
|
+
@override
|
13
|
+
def to_markdown(self) -> str:
|
14
|
+
expr = self.expression.strip()
|
15
|
+
equation_syntax = self._syntax_registry.get_equation_syntax()
|
16
|
+
if not expr:
|
17
|
+
return f"{equation_syntax.start_delimiter}{equation_syntax.end_delimiter}"
|
18
|
+
|
19
|
+
return f"{equation_syntax.start_delimiter}{expr}{equation_syntax.end_delimiter}"
|
@@ -0,0 +1,23 @@
|
|
1
|
+
from typing import override
|
2
|
+
|
3
|
+
from notionary.page.content.markdown.nodes.base import MarkdownNode
|
4
|
+
from notionary.page.content.markdown.nodes.mixins.caption import CaptionMarkdownNodeMixin
|
5
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
6
|
+
|
7
|
+
|
8
|
+
class FileMarkdownNode(MarkdownNode, CaptionMarkdownNodeMixin):
|
9
|
+
def __init__(
|
10
|
+
self,
|
11
|
+
url: str,
|
12
|
+
caption: str | None = None,
|
13
|
+
syntax_registry: SyntaxRegistry | None = None,
|
14
|
+
) -> None:
|
15
|
+
super().__init__(syntax_registry=syntax_registry)
|
16
|
+
self.url = url
|
17
|
+
self.caption = caption
|
18
|
+
|
19
|
+
@override
|
20
|
+
def to_markdown(self) -> str:
|
21
|
+
file_syntax = self._syntax_registry.get_file_syntax()
|
22
|
+
base_markdown = f"{file_syntax.start_delimiter}{self.url}{file_syntax.end_delimiter}"
|
23
|
+
return self._append_caption_to_markdown(base_markdown, self.caption)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
from typing import override
|
2
|
+
|
3
|
+
from notionary.page.content.markdown.nodes.base import MarkdownNode
|
4
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
5
|
+
|
6
|
+
|
7
|
+
class HeadingMarkdownNode(MarkdownNode):
|
8
|
+
def __init__(self, text: str, level: int = 1, syntax_registry: SyntaxRegistry | None = None) -> None:
|
9
|
+
super().__init__(syntax_registry=syntax_registry)
|
10
|
+
self.text = text
|
11
|
+
self.level = max(1, min(3, level))
|
12
|
+
|
13
|
+
@override
|
14
|
+
def to_markdown(self) -> str:
|
15
|
+
heading_syntax = self._syntax_registry.get_heading_syntax()
|
16
|
+
return f"{heading_syntax.start_delimiter * self.level} {self.text}"
|
@@ -0,0 +1,23 @@
|
|
1
|
+
from typing import override
|
2
|
+
|
3
|
+
from notionary.page.content.markdown.nodes.base import MarkdownNode
|
4
|
+
from notionary.page.content.markdown.nodes.mixins.caption import CaptionMarkdownNodeMixin
|
5
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
6
|
+
|
7
|
+
|
8
|
+
class ImageMarkdownNode(MarkdownNode, CaptionMarkdownNodeMixin):
|
9
|
+
def __init__(
|
10
|
+
self,
|
11
|
+
url: str,
|
12
|
+
caption: str | None = None,
|
13
|
+
syntax_registry: SyntaxRegistry | None = None,
|
14
|
+
) -> None:
|
15
|
+
super().__init__(syntax_registry=syntax_registry)
|
16
|
+
self.url = url
|
17
|
+
self.caption = caption
|
18
|
+
|
19
|
+
@override
|
20
|
+
def to_markdown(self) -> str:
|
21
|
+
image_syntax = self._syntax_registry.get_image_syntax()
|
22
|
+
base_markdown = f"{image_syntax.start_delimiter}{self.url}{image_syntax.end_delimiter}"
|
23
|
+
return self._append_caption_to_markdown(base_markdown, self.caption)
|
@@ -0,0 +1,12 @@
|
|
1
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
2
|
+
|
3
|
+
|
4
|
+
class CaptionMarkdownNodeMixin:
|
5
|
+
_syntax_registry: SyntaxRegistry
|
6
|
+
|
7
|
+
def _append_caption_to_markdown(self, base_markdown: str, caption: str | None) -> str:
|
8
|
+
if not caption:
|
9
|
+
return base_markdown
|
10
|
+
|
11
|
+
caption_syntax = self._syntax_registry.get_caption_syntax()
|
12
|
+
return f"{base_markdown}\n{caption_syntax.start_delimiter} {caption}"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
from typing import override
|
2
|
+
|
3
|
+
from notionary.page.content.markdown.nodes.base import MarkdownNode
|
4
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
5
|
+
|
6
|
+
|
7
|
+
class NumberedListMarkdownNode(MarkdownNode):
|
8
|
+
def __init__(self, texts: list[str], syntax_registry: SyntaxRegistry | None = None):
|
9
|
+
super().__init__(syntax_registry=syntax_registry)
|
10
|
+
self.texts = texts
|
11
|
+
|
12
|
+
@override
|
13
|
+
def to_markdown(self) -> str:
|
14
|
+
numbered_list_syntax = self._syntax_registry.get_numbered_list_syntax()
|
15
|
+
return "\n".join(f"{i + 1}{numbered_list_syntax.end_delimiter} {text}" for i, text in enumerate(self.texts))
|
@@ -0,0 +1,14 @@
|
|
1
|
+
from typing import override
|
2
|
+
|
3
|
+
from notionary.page.content.markdown.nodes.base import MarkdownNode
|
4
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
5
|
+
|
6
|
+
|
7
|
+
class ParagraphMarkdownNode(MarkdownNode):
|
8
|
+
def __init__(self, text: str, syntax_registry: SyntaxRegistry | None = None):
|
9
|
+
super().__init__(syntax_registry=syntax_registry)
|
10
|
+
self.text = text
|
11
|
+
|
12
|
+
@override
|
13
|
+
def to_markdown(self) -> str:
|
14
|
+
return self.text
|
@@ -0,0 +1,23 @@
|
|
1
|
+
from typing import override
|
2
|
+
|
3
|
+
from notionary.page.content.markdown.nodes.base import MarkdownNode
|
4
|
+
from notionary.page.content.markdown.nodes.mixins.caption import CaptionMarkdownNodeMixin
|
5
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
6
|
+
|
7
|
+
|
8
|
+
class PdfMarkdownNode(MarkdownNode, CaptionMarkdownNodeMixin):
|
9
|
+
def __init__(
|
10
|
+
self,
|
11
|
+
url: str,
|
12
|
+
caption: str | None = None,
|
13
|
+
syntax_registry: SyntaxRegistry | None = None,
|
14
|
+
) -> None:
|
15
|
+
super().__init__(syntax_registry=syntax_registry)
|
16
|
+
self.url = url
|
17
|
+
self.caption = caption
|
18
|
+
|
19
|
+
@override
|
20
|
+
def to_markdown(self) -> str:
|
21
|
+
pdf_syntax = self._syntax_registry.get_pdf_syntax()
|
22
|
+
base_markdown = f"{pdf_syntax.start_delimiter}{self.url}{pdf_syntax.end_delimiter}"
|
23
|
+
return self._append_caption_to_markdown(base_markdown, self.caption)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
from typing import override
|
2
|
+
|
3
|
+
from notionary.page.content.markdown.nodes.base import MarkdownNode
|
4
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
5
|
+
|
6
|
+
|
7
|
+
class QuoteMarkdownNode(MarkdownNode):
|
8
|
+
def __init__(self, text: str, syntax_registry: SyntaxRegistry | None = None) -> None:
|
9
|
+
super().__init__(syntax_registry=syntax_registry)
|
10
|
+
self.text = text
|
11
|
+
|
12
|
+
@override
|
13
|
+
def to_markdown(self) -> str:
|
14
|
+
quote_syntax = self._syntax_registry.get_quote_syntax()
|
15
|
+
return f"{quote_syntax.start_delimiter} {self.text}"
|
@@ -0,0 +1,14 @@
|
|
1
|
+
from typing import override
|
2
|
+
|
3
|
+
from notionary.page.content.markdown.nodes.base import MarkdownNode
|
4
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
5
|
+
|
6
|
+
|
7
|
+
class SpaceMarkdownNode(MarkdownNode):
|
8
|
+
def __init__(self, syntax_registry: SyntaxRegistry | None = None) -> None:
|
9
|
+
super().__init__(syntax_registry=syntax_registry)
|
10
|
+
|
11
|
+
@override
|
12
|
+
def to_markdown(self) -> str:
|
13
|
+
space_syntax = self._syntax_registry.get_space_syntax()
|
14
|
+
return space_syntax.start_delimiter
|
@@ -0,0 +1,45 @@
|
|
1
|
+
from typing import override
|
2
|
+
|
3
|
+
from notionary.page.content.markdown.nodes.base import MarkdownNode
|
4
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
5
|
+
|
6
|
+
|
7
|
+
class TableMarkdownNode(MarkdownNode):
|
8
|
+
def __init__(
|
9
|
+
self, headers: list[str], rows: list[list[str]], syntax_registry: SyntaxRegistry | None = None
|
10
|
+
) -> None:
|
11
|
+
super().__init__(syntax_registry=syntax_registry)
|
12
|
+
self._validate_input(headers, rows)
|
13
|
+
self.headers = headers
|
14
|
+
self.rows = rows
|
15
|
+
|
16
|
+
def _validate_input(self, headers: list[str], rows: list[list[str]]) -> None:
|
17
|
+
if not headers:
|
18
|
+
raise ValueError("headers must not be empty")
|
19
|
+
if not all(isinstance(row, list) for row in rows):
|
20
|
+
raise ValueError("rows must be a list of lists")
|
21
|
+
|
22
|
+
@override
|
23
|
+
def to_markdown(self) -> str:
|
24
|
+
header = self._build_header_row()
|
25
|
+
separator = self._build_separator_row()
|
26
|
+
data_rows = self._build_data_rows()
|
27
|
+
return "\n".join([header, separator, *data_rows])
|
28
|
+
|
29
|
+
def _build_header_row(self) -> str:
|
30
|
+
return self._format_row(self.headers)
|
31
|
+
|
32
|
+
def _format_row(self, cells: list[str]) -> str:
|
33
|
+
table_syntax = self._syntax_registry.get_table_syntax()
|
34
|
+
delimiter = table_syntax.start_delimiter
|
35
|
+
joined_cells = f" {delimiter} ".join(cells)
|
36
|
+
return f"{delimiter} {joined_cells} {delimiter}"
|
37
|
+
|
38
|
+
def _build_separator_row(self) -> str:
|
39
|
+
table_syntax = self._syntax_registry.get_table_syntax()
|
40
|
+
col_count = len(self.headers)
|
41
|
+
separators = [table_syntax.end_delimiter] * col_count
|
42
|
+
return self._format_row(separators)
|
43
|
+
|
44
|
+
def _build_data_rows(self) -> list[str]:
|
45
|
+
return [self._format_row(row) for row in self.rows]
|
@@ -0,0 +1,14 @@
|
|
1
|
+
from typing import override
|
2
|
+
|
3
|
+
from notionary.page.content.markdown.nodes.base import MarkdownNode
|
4
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
5
|
+
|
6
|
+
|
7
|
+
class TableOfContentsMarkdownNode(MarkdownNode):
|
8
|
+
def __init__(self, syntax_registry: SyntaxRegistry | None = None) -> None:
|
9
|
+
super().__init__(syntax_registry=syntax_registry)
|
10
|
+
|
11
|
+
@override
|
12
|
+
def to_markdown(self) -> str:
|
13
|
+
toc_syntax = self._syntax_registry.get_table_of_contents_syntax()
|
14
|
+
return toc_syntax.start_delimiter
|
@@ -0,0 +1,22 @@
|
|
1
|
+
from typing import override
|
2
|
+
|
3
|
+
from notionary.page.content.markdown.nodes.base import MarkdownNode
|
4
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
5
|
+
|
6
|
+
|
7
|
+
class TodoMarkdownNode(MarkdownNode):
|
8
|
+
def __init__(
|
9
|
+
self, text: str, checked: bool = False, marker: str = "-", syntax_registry: SyntaxRegistry | None = None
|
10
|
+
):
|
11
|
+
super().__init__(syntax_registry=syntax_registry)
|
12
|
+
self.text = text
|
13
|
+
self.checked = checked
|
14
|
+
self.marker = marker
|
15
|
+
|
16
|
+
@override
|
17
|
+
def to_markdown(self) -> str:
|
18
|
+
# Validate marker to ensure it's valid
|
19
|
+
valid_marker = self.marker if self.marker in {"-", "*", "+"} else "-"
|
20
|
+
todo_syntax = self._syntax_registry.get_todo_syntax()
|
21
|
+
checkbox_state = todo_syntax.end_delimiter if self.checked else todo_syntax.start_delimiter
|
22
|
+
return f"{valid_marker} {checkbox_state} {self.text}"
|
@@ -0,0 +1,28 @@
|
|
1
|
+
from typing import override
|
2
|
+
|
3
|
+
from notionary.page.content.markdown.nodes.base import MarkdownNode
|
4
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
5
|
+
|
6
|
+
|
7
|
+
class ToggleMarkdownNode(MarkdownNode):
|
8
|
+
def __init__(
|
9
|
+
self, title: str, children: list[MarkdownNode] | None = None, syntax_registry: SyntaxRegistry | None = None
|
10
|
+
):
|
11
|
+
super().__init__(syntax_registry=syntax_registry)
|
12
|
+
self.title = title
|
13
|
+
self.children = children or []
|
14
|
+
|
15
|
+
@override
|
16
|
+
def to_markdown(self) -> str:
|
17
|
+
toggle_syntax = self._syntax_registry.get_toggle_syntax()
|
18
|
+
result = f"{toggle_syntax.start_delimiter} {self.title}"
|
19
|
+
|
20
|
+
if not self.children:
|
21
|
+
result += f"\n{toggle_syntax.end_delimiter}"
|
22
|
+
return result
|
23
|
+
|
24
|
+
# Convert children to markdown
|
25
|
+
content_parts = [child.to_markdown() for child in self.children]
|
26
|
+
content_text = "\n\n".join(content_parts)
|
27
|
+
|
28
|
+
return result + "\n" + content_text + f"\n{toggle_syntax.end_delimiter}"
|
@@ -0,0 +1,35 @@
|
|
1
|
+
from typing import override
|
2
|
+
|
3
|
+
from notionary.page.content.markdown.nodes.base import MarkdownNode
|
4
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
5
|
+
|
6
|
+
|
7
|
+
class ToggleableHeadingMarkdownNode(MarkdownNode):
|
8
|
+
def __init__(
|
9
|
+
self,
|
10
|
+
text: str,
|
11
|
+
level: int,
|
12
|
+
children: list[MarkdownNode] | None = None,
|
13
|
+
syntax_registry: SyntaxRegistry | None = None,
|
14
|
+
):
|
15
|
+
super().__init__(syntax_registry=syntax_registry)
|
16
|
+
self.text = text
|
17
|
+
self.level = max(1, min(3, level))
|
18
|
+
self.children = children or []
|
19
|
+
|
20
|
+
@override
|
21
|
+
def to_markdown(self) -> str:
|
22
|
+
toggle_syntax = self._syntax_registry.get_toggle_syntax()
|
23
|
+
heading_syntax = self._syntax_registry.get_heading_syntax()
|
24
|
+
prefix = toggle_syntax.start_delimiter + (heading_syntax.start_delimiter * self.level)
|
25
|
+
result = f"{prefix} {self.text}"
|
26
|
+
|
27
|
+
if not self.children:
|
28
|
+
result += f"\n{toggle_syntax.end_delimiter}"
|
29
|
+
return result
|
30
|
+
|
31
|
+
# Convert children to markdown
|
32
|
+
content_parts = [child.to_markdown() for child in self.children]
|
33
|
+
content_text = "\n\n".join(content_parts)
|
34
|
+
|
35
|
+
return result + "\n" + content_text + f"\n{toggle_syntax.end_delimiter}"
|
@@ -0,0 +1,23 @@
|
|
1
|
+
from typing import override
|
2
|
+
|
3
|
+
from notionary.page.content.markdown.nodes.base import MarkdownNode
|
4
|
+
from notionary.page.content.markdown.nodes.mixins.caption import CaptionMarkdownNodeMixin
|
5
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
6
|
+
|
7
|
+
|
8
|
+
class VideoMarkdownNode(MarkdownNode, CaptionMarkdownNodeMixin):
|
9
|
+
def __init__(
|
10
|
+
self,
|
11
|
+
url: str,
|
12
|
+
caption: str | None = None,
|
13
|
+
syntax_registry: SyntaxRegistry | None = None,
|
14
|
+
) -> None:
|
15
|
+
super().__init__(syntax_registry=syntax_registry)
|
16
|
+
self.url = url
|
17
|
+
self.caption = caption
|
18
|
+
|
19
|
+
@override
|
20
|
+
def to_markdown(self) -> str:
|
21
|
+
video_syntax = self._syntax_registry.get_video_syntax()
|
22
|
+
base_markdown = f"{video_syntax.start_delimiter}{self.url}{video_syntax.end_delimiter}"
|
23
|
+
return self._append_caption_to_markdown(base_markdown, self.caption)
|
@@ -0,0 +1,49 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from collections.abc import Awaitable, Callable
|
4
|
+
from dataclasses import dataclass, field
|
5
|
+
|
6
|
+
from notionary.blocks.schemas import BlockCreatePayload
|
7
|
+
|
8
|
+
|
9
|
+
@dataclass
|
10
|
+
class ParentBlockContext:
|
11
|
+
block: BlockCreatePayload
|
12
|
+
child_lines: list[str]
|
13
|
+
child_blocks: list[BlockCreatePayload] = field(default_factory=list)
|
14
|
+
|
15
|
+
def add_child_line(self, content: str) -> None:
|
16
|
+
self.child_lines.append(content)
|
17
|
+
|
18
|
+
def add_child_block(self, block: BlockCreatePayload) -> None:
|
19
|
+
self.child_blocks.append(block)
|
20
|
+
|
21
|
+
|
22
|
+
ParseChildrenCallback = Callable[[list[str]], Awaitable[list[BlockCreatePayload]]]
|
23
|
+
|
24
|
+
|
25
|
+
@dataclass
|
26
|
+
class BlockParsingContext:
|
27
|
+
line: str
|
28
|
+
result_blocks: list[BlockCreatePayload]
|
29
|
+
parent_stack: list[ParentBlockContext]
|
30
|
+
|
31
|
+
parse_children_callback: ParseChildrenCallback | None = None
|
32
|
+
|
33
|
+
all_lines: list[str] | None = None
|
34
|
+
current_line_index: int | None = None
|
35
|
+
lines_consumed: int = 0
|
36
|
+
|
37
|
+
async def parse_nested_content(self, nested_lines: list[str]) -> list[BlockCreatePayload]:
|
38
|
+
if not self.parse_children_callback or not nested_lines:
|
39
|
+
return []
|
40
|
+
|
41
|
+
return await self.parse_children_callback(nested_lines)
|
42
|
+
|
43
|
+
def get_remaining_lines(self) -> list[str]:
|
44
|
+
if self.all_lines is None or self.current_line_index is None:
|
45
|
+
return []
|
46
|
+
return self.all_lines[self.current_line_index + 1 :]
|
47
|
+
|
48
|
+
def is_inside_parent_context(self) -> bool:
|
49
|
+
return len(self.parent_stack) > 0
|
@@ -0,0 +1,219 @@
|
|
1
|
+
from notionary.blocks.rich_text.markdown_rich_text_converter import (
|
2
|
+
MarkdownRichTextConverter,
|
3
|
+
)
|
4
|
+
from notionary.page.content.parser.parsers import (
|
5
|
+
AudioParser,
|
6
|
+
BookmarkParser,
|
7
|
+
BreadcrumbParser,
|
8
|
+
BulletedListParser,
|
9
|
+
CalloutParser,
|
10
|
+
CaptionParser,
|
11
|
+
CodeParser,
|
12
|
+
ColumnListParser,
|
13
|
+
ColumnParser,
|
14
|
+
DividerParser,
|
15
|
+
EmbedParser,
|
16
|
+
EquationParser,
|
17
|
+
FileParser,
|
18
|
+
HeadingParser,
|
19
|
+
ImageParser,
|
20
|
+
LineParser,
|
21
|
+
NumberedListParser,
|
22
|
+
ParagraphParser,
|
23
|
+
PdfParser,
|
24
|
+
QuoteParser,
|
25
|
+
SpaceParser,
|
26
|
+
TableOfContentsParser,
|
27
|
+
TableParser,
|
28
|
+
TodoParser,
|
29
|
+
ToggleableHeadingParser,
|
30
|
+
ToggleParser,
|
31
|
+
VideoParser,
|
32
|
+
)
|
33
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
34
|
+
|
35
|
+
|
36
|
+
class ConverterChainFactory:
|
37
|
+
def __init__(
|
38
|
+
self,
|
39
|
+
rich_text_converter: MarkdownRichTextConverter | None = None,
|
40
|
+
syntax_registry: SyntaxRegistry | None = None,
|
41
|
+
) -> None:
|
42
|
+
self._rich_text_converter = rich_text_converter or MarkdownRichTextConverter()
|
43
|
+
self._syntax_registry = syntax_registry or SyntaxRegistry()
|
44
|
+
|
45
|
+
def create(self) -> LineParser:
|
46
|
+
# multi-line (structural) blocks
|
47
|
+
code_parser = self._create_code_parser()
|
48
|
+
equation_parser = self._create_equation_parser()
|
49
|
+
table_parser = self._create_table_parser()
|
50
|
+
column_parser = self._create_column_parser()
|
51
|
+
column_list_parser = self._create_column_list_parser()
|
52
|
+
toggleable_heading_parser = self._create_toggleable_heading_parser()
|
53
|
+
toggle_parser = self._create_toggle_parser()
|
54
|
+
|
55
|
+
# Single-line blocks
|
56
|
+
divider_parser = self._create_divider_parser()
|
57
|
+
breadcrumb_parser = self._create_breadcrumb_parser()
|
58
|
+
table_of_contents_parser = self._create_table_of_contents_parser()
|
59
|
+
space_parser = self._create_space_parser()
|
60
|
+
heading_parser = self._create_heading_parser()
|
61
|
+
quote_parser = self._create_quote_parser()
|
62
|
+
callout_parser = self._create_callout_parser()
|
63
|
+
todo_parser = self._create_todo_parser()
|
64
|
+
bulleted_list_parser = self._create_bulleted_list_parser()
|
65
|
+
numbered_list_parser = self._create_numbered_list_parser()
|
66
|
+
|
67
|
+
# Media blocks
|
68
|
+
bookmark_parser = self._create_bookmark_parser()
|
69
|
+
embed_parser = self._create_embed_parser()
|
70
|
+
image_parser = self._create_image_parser()
|
71
|
+
video_parser = self._create_video_parser()
|
72
|
+
audio_parser = self._create_audio_parser()
|
73
|
+
file_parser = self._create_file_parser()
|
74
|
+
pdf_parser = self._create_pdf_parser()
|
75
|
+
|
76
|
+
# Caption and Fallback
|
77
|
+
caption_parser = self._create_caption_parser()
|
78
|
+
paragraph_parser = self._create_paragraph_parser()
|
79
|
+
|
80
|
+
(
|
81
|
+
code_parser.set_next(equation_parser)
|
82
|
+
.set_next(table_parser)
|
83
|
+
.set_next(column_parser)
|
84
|
+
.set_next(column_list_parser)
|
85
|
+
.set_next(toggleable_heading_parser)
|
86
|
+
.set_next(toggle_parser)
|
87
|
+
.set_next(divider_parser)
|
88
|
+
.set_next(breadcrumb_parser)
|
89
|
+
.set_next(table_of_contents_parser)
|
90
|
+
.set_next(space_parser)
|
91
|
+
.set_next(heading_parser)
|
92
|
+
.set_next(quote_parser)
|
93
|
+
.set_next(callout_parser)
|
94
|
+
.set_next(todo_parser)
|
95
|
+
.set_next(bulleted_list_parser)
|
96
|
+
.set_next(numbered_list_parser)
|
97
|
+
.set_next(bookmark_parser)
|
98
|
+
.set_next(embed_parser)
|
99
|
+
.set_next(image_parser)
|
100
|
+
.set_next(video_parser)
|
101
|
+
.set_next(audio_parser)
|
102
|
+
.set_next(file_parser)
|
103
|
+
.set_next(pdf_parser)
|
104
|
+
.set_next(caption_parser)
|
105
|
+
.set_next(paragraph_parser)
|
106
|
+
)
|
107
|
+
|
108
|
+
return code_parser
|
109
|
+
|
110
|
+
def _create_code_parser(self) -> CodeParser:
|
111
|
+
return CodeParser(
|
112
|
+
syntax_registry=self._syntax_registry,
|
113
|
+
rich_text_converter=self._rich_text_converter,
|
114
|
+
)
|
115
|
+
|
116
|
+
def _create_equation_parser(self) -> EquationParser:
|
117
|
+
return EquationParser(syntax_registry=self._syntax_registry)
|
118
|
+
|
119
|
+
def _create_table_parser(self) -> TableParser:
|
120
|
+
return TableParser(
|
121
|
+
syntax_registry=self._syntax_registry,
|
122
|
+
rich_text_converter=self._rich_text_converter,
|
123
|
+
)
|
124
|
+
|
125
|
+
def _create_column_parser(self) -> ColumnParser:
|
126
|
+
return ColumnParser(syntax_registry=self._syntax_registry)
|
127
|
+
|
128
|
+
def _create_column_list_parser(self) -> ColumnListParser:
|
129
|
+
return ColumnListParser(syntax_registry=self._syntax_registry)
|
130
|
+
|
131
|
+
def _create_toggleable_heading_parser(self) -> ToggleableHeadingParser:
|
132
|
+
return ToggleableHeadingParser(
|
133
|
+
syntax_registry=self._syntax_registry,
|
134
|
+
rich_text_converter=self._rich_text_converter,
|
135
|
+
)
|
136
|
+
|
137
|
+
def _create_toggle_parser(self) -> ToggleParser:
|
138
|
+
return ToggleParser(
|
139
|
+
syntax_registry=self._syntax_registry,
|
140
|
+
rich_text_converter=self._rich_text_converter,
|
141
|
+
)
|
142
|
+
|
143
|
+
def _create_divider_parser(self) -> DividerParser:
|
144
|
+
return DividerParser(syntax_registry=self._syntax_registry)
|
145
|
+
|
146
|
+
def _create_breadcrumb_parser(self) -> BreadcrumbParser:
|
147
|
+
return BreadcrumbParser(syntax_registry=self._syntax_registry)
|
148
|
+
|
149
|
+
def _create_table_of_contents_parser(self) -> TableOfContentsParser:
|
150
|
+
return TableOfContentsParser(syntax_registry=self._syntax_registry)
|
151
|
+
|
152
|
+
def _create_space_parser(self) -> SpaceParser:
|
153
|
+
return SpaceParser(syntax_registry=self._syntax_registry)
|
154
|
+
|
155
|
+
def _create_heading_parser(self) -> HeadingParser:
|
156
|
+
return HeadingParser(
|
157
|
+
syntax_registry=self._syntax_registry,
|
158
|
+
rich_text_converter=self._rich_text_converter,
|
159
|
+
)
|
160
|
+
|
161
|
+
def _create_quote_parser(self) -> QuoteParser:
|
162
|
+
return QuoteParser(
|
163
|
+
syntax_registry=self._syntax_registry,
|
164
|
+
rich_text_converter=self._rich_text_converter,
|
165
|
+
)
|
166
|
+
|
167
|
+
def _create_callout_parser(self) -> CalloutParser:
|
168
|
+
return CalloutParser(
|
169
|
+
syntax_registry=self._syntax_registry,
|
170
|
+
rich_text_converter=self._rich_text_converter,
|
171
|
+
)
|
172
|
+
|
173
|
+
def _create_todo_parser(self) -> TodoParser:
|
174
|
+
return TodoParser(
|
175
|
+
syntax_registry=self._syntax_registry,
|
176
|
+
rich_text_converter=self._rich_text_converter,
|
177
|
+
)
|
178
|
+
|
179
|
+
def _create_bulleted_list_parser(self) -> BulletedListParser:
|
180
|
+
return BulletedListParser(
|
181
|
+
syntax_registry=self._syntax_registry,
|
182
|
+
rich_text_converter=self._rich_text_converter,
|
183
|
+
)
|
184
|
+
|
185
|
+
def _create_numbered_list_parser(self) -> NumberedListParser:
|
186
|
+
return NumberedListParser(
|
187
|
+
syntax_registry=self._syntax_registry,
|
188
|
+
rich_text_converter=self._rich_text_converter,
|
189
|
+
)
|
190
|
+
|
191
|
+
def _create_bookmark_parser(self) -> BookmarkParser:
|
192
|
+
return BookmarkParser(syntax_registry=self._syntax_registry)
|
193
|
+
|
194
|
+
def _create_embed_parser(self) -> EmbedParser:
|
195
|
+
return EmbedParser(syntax_registry=self._syntax_registry)
|
196
|
+
|
197
|
+
def _create_image_parser(self) -> ImageParser:
|
198
|
+
return ImageParser(syntax_registry=self._syntax_registry)
|
199
|
+
|
200
|
+
def _create_video_parser(self) -> VideoParser:
|
201
|
+
return VideoParser(syntax_registry=self._syntax_registry)
|
202
|
+
|
203
|
+
def _create_audio_parser(self) -> AudioParser:
|
204
|
+
return AudioParser(syntax_registry=self._syntax_registry)
|
205
|
+
|
206
|
+
def _create_file_parser(self) -> FileParser:
|
207
|
+
return FileParser(syntax_registry=self._syntax_registry)
|
208
|
+
|
209
|
+
def _create_pdf_parser(self) -> PdfParser:
|
210
|
+
return PdfParser(syntax_registry=self._syntax_registry)
|
211
|
+
|
212
|
+
def _create_caption_parser(self) -> CaptionParser:
|
213
|
+
return CaptionParser(
|
214
|
+
syntax_registry=self._syntax_registry,
|
215
|
+
rich_text_converter=self._rich_text_converter,
|
216
|
+
)
|
217
|
+
|
218
|
+
def _create_paragraph_parser(self) -> ParagraphParser:
|
219
|
+
return ParagraphParser(rich_text_converter=self._rich_text_converter)
|