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,93 @@
|
|
1
|
+
"""
|
2
|
+
Handles request limits for rich texts (see https://developers.notion.com/reference/request-limits)
|
3
|
+
"""
|
4
|
+
|
5
|
+
from typing import Any, override
|
6
|
+
|
7
|
+
from notionary.blocks.rich_text.models import RichText, RichTextType
|
8
|
+
from notionary.blocks.schemas import BlockCreatePayload
|
9
|
+
from notionary.page.content.parser.post_processing.port import PostProcessor
|
10
|
+
from notionary.utils.mixins.logging import LoggingMixin
|
11
|
+
|
12
|
+
type _NestedBlockList = BlockCreatePayload | list["_NestedBlockList"]
|
13
|
+
|
14
|
+
|
15
|
+
class RichTextLengthTruncationPostProcessor(PostProcessor, LoggingMixin):
|
16
|
+
NOTION_MAX_LENGTH = 2000
|
17
|
+
|
18
|
+
def __init__(self, max_text_length: int = NOTION_MAX_LENGTH) -> None:
|
19
|
+
self.max_text_length = max_text_length
|
20
|
+
|
21
|
+
@override
|
22
|
+
def process(self, blocks: list[BlockCreatePayload]) -> list[BlockCreatePayload]:
|
23
|
+
if not blocks:
|
24
|
+
return blocks
|
25
|
+
|
26
|
+
flattened_blocks = self._flatten_blocks(blocks)
|
27
|
+
return [self._process_block(block) for block in flattened_blocks]
|
28
|
+
|
29
|
+
def _flatten_blocks(self, blocks: list[_NestedBlockList]) -> list[BlockCreatePayload]:
|
30
|
+
flattened: list[BlockCreatePayload] = []
|
31
|
+
|
32
|
+
for item in blocks:
|
33
|
+
if isinstance(item, list):
|
34
|
+
flattened.extend(self._flatten_blocks(item))
|
35
|
+
else:
|
36
|
+
flattened.append(item)
|
37
|
+
|
38
|
+
return flattened
|
39
|
+
|
40
|
+
def _process_block(self, block: BlockCreatePayload) -> BlockCreatePayload:
|
41
|
+
block_copy = block.model_copy(deep=True)
|
42
|
+
content = self._get_block_content(block_copy)
|
43
|
+
|
44
|
+
if content is not None:
|
45
|
+
self._truncate_content(content)
|
46
|
+
|
47
|
+
return block_copy
|
48
|
+
|
49
|
+
def _get_block_content(self, block: BlockCreatePayload) -> Any | None:
|
50
|
+
content = getattr(block, block.type.value, None)
|
51
|
+
|
52
|
+
if content is None:
|
53
|
+
return None
|
54
|
+
|
55
|
+
if hasattr(content, "rich_text") or hasattr(content, "children"):
|
56
|
+
return content
|
57
|
+
|
58
|
+
return None
|
59
|
+
|
60
|
+
def _truncate_content(self, content: object) -> None:
|
61
|
+
if hasattr(content, "rich_text"):
|
62
|
+
self._truncate_rich_text_list(content.rich_text)
|
63
|
+
|
64
|
+
if hasattr(content, "caption"):
|
65
|
+
self._truncate_rich_text_list(content.caption)
|
66
|
+
|
67
|
+
if hasattr(content, "children"):
|
68
|
+
for child in content.children:
|
69
|
+
child_content = self._get_block_content(child)
|
70
|
+
if child_content:
|
71
|
+
self._truncate_content(child_content)
|
72
|
+
|
73
|
+
def _truncate_rich_text_list(self, rich_text_list: list[RichText]) -> None:
|
74
|
+
for rich_text in rich_text_list:
|
75
|
+
if not self._is_text_type(rich_text):
|
76
|
+
continue
|
77
|
+
|
78
|
+
content = rich_text.text.content
|
79
|
+
if len(content) > self.max_text_length:
|
80
|
+
self.logger.warning(
|
81
|
+
"Truncating text content from %d to %d characters",
|
82
|
+
len(content),
|
83
|
+
self.max_text_length,
|
84
|
+
)
|
85
|
+
truncated_content = self._create_truncated_text_with_ellipsis(content)
|
86
|
+
rich_text.text.content = truncated_content
|
87
|
+
|
88
|
+
def _create_truncated_text_with_ellipsis(self, content: str) -> str:
|
89
|
+
cutoff = self.max_text_length - 3
|
90
|
+
return content[:cutoff] + "..."
|
91
|
+
|
92
|
+
def _is_text_type(self, rich_text: RichText) -> bool:
|
93
|
+
return rich_text.type == RichTextType.TEXT and rich_text.text and rich_text.text.content
|
@@ -0,0 +1,16 @@
|
|
1
|
+
from notionary.blocks.schemas import BlockCreatePayload
|
2
|
+
from notionary.page.content.parser.post_processing.port import PostProcessor
|
3
|
+
|
4
|
+
|
5
|
+
class BlockPostProcessor:
|
6
|
+
def __init__(self) -> None:
|
7
|
+
self._processors: list[PostProcessor] = []
|
8
|
+
|
9
|
+
def register(self, processor: PostProcessor) -> None:
|
10
|
+
self._processors.append(processor)
|
11
|
+
|
12
|
+
def process(self, created_blocks: list[BlockCreatePayload]) -> list[BlockCreatePayload]:
|
13
|
+
result = created_blocks
|
14
|
+
for processor in self._processors:
|
15
|
+
result = processor.process(created_blocks)
|
16
|
+
return result
|
@@ -0,0 +1,80 @@
|
|
1
|
+
import re
|
2
|
+
from typing import override
|
3
|
+
|
4
|
+
from notionary.exceptions.block_parsing import InsufficientColumnsError, InvalidColumnRatioSumError
|
5
|
+
from notionary.page.content.parser.pre_processsing.handlers.port import PreProcessor
|
6
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
7
|
+
|
8
|
+
RATIO_TOLERANCE = 0.0001
|
9
|
+
|
10
|
+
|
11
|
+
class ColumnSyntaxPreProcessor(PreProcessor):
|
12
|
+
def __init__(self, syntax_registry: SyntaxRegistry | None = None) -> None:
|
13
|
+
self._syntax_registry = syntax_registry or SyntaxRegistry()
|
14
|
+
self._column_list_syntax = self._syntax_registry.get_column_list_syntax()
|
15
|
+
self._column_syntax = self._syntax_registry.get_column_syntax()
|
16
|
+
|
17
|
+
@override
|
18
|
+
def process(self, markdown_text: str) -> str:
|
19
|
+
if not self._has_columns_blocks(markdown_text):
|
20
|
+
return markdown_text
|
21
|
+
|
22
|
+
columns_blocks = self._extract_columns_blocks(markdown_text)
|
23
|
+
|
24
|
+
for content in columns_blocks:
|
25
|
+
column_matches = self._find_column_blocks(content)
|
26
|
+
column_count = len(column_matches)
|
27
|
+
self._validate_minimum_columns(column_count)
|
28
|
+
ratios = self._extract_ratios(column_matches)
|
29
|
+
self._validate_ratios(ratios, column_count)
|
30
|
+
return markdown_text
|
31
|
+
|
32
|
+
def _has_columns_blocks(self, markdown_text: str) -> bool:
|
33
|
+
return self._column_list_syntax.start_delimiter in markdown_text
|
34
|
+
|
35
|
+
def _extract_columns_blocks(self, markdown_text: str) -> list[str]:
|
36
|
+
columns_blocks = []
|
37
|
+
lines = markdown_text.split("\n")
|
38
|
+
for index, line in enumerate(lines):
|
39
|
+
if line.strip() == self._column_list_syntax.start_delimiter:
|
40
|
+
content = self._extract_block_content(lines, index + 1)
|
41
|
+
if content is not None:
|
42
|
+
columns_blocks.append(content)
|
43
|
+
return columns_blocks
|
44
|
+
|
45
|
+
def _extract_block_content(self, lines: list[str], start_index: int) -> str | None:
|
46
|
+
depth = 1
|
47
|
+
end_index = start_index
|
48
|
+
block_start = self._column_list_syntax.start_delimiter.split()[0]
|
49
|
+
while end_index < len(lines) and depth > 0:
|
50
|
+
line = lines[end_index].strip()
|
51
|
+
if line.startswith(f"{block_start} "):
|
52
|
+
depth += 1
|
53
|
+
elif line == self._column_list_syntax.end_delimiter:
|
54
|
+
depth -= 1
|
55
|
+
end_index += 1
|
56
|
+
if depth == 0:
|
57
|
+
return "\n".join(lines[start_index : end_index - 1])
|
58
|
+
return None
|
59
|
+
|
60
|
+
def _find_column_blocks(self, content: str) -> list[re.Match]:
|
61
|
+
return list(self._column_syntax.regex_pattern.finditer(content))
|
62
|
+
|
63
|
+
def _validate_minimum_columns(self, column_count: int) -> None:
|
64
|
+
if column_count < 2:
|
65
|
+
raise InsufficientColumnsError(column_count)
|
66
|
+
|
67
|
+
def _extract_ratios(self, column_matches: list[re.Match]) -> list[float]:
|
68
|
+
ratios = []
|
69
|
+
for match in column_matches:
|
70
|
+
ratio_str = match.group(1)
|
71
|
+
if ratio_str and ratio_str != "1":
|
72
|
+
ratios.append(float(ratio_str))
|
73
|
+
return ratios
|
74
|
+
|
75
|
+
def _validate_ratios(self, ratios: list[float], column_count: int) -> None:
|
76
|
+
if not ratios or len(ratios) != column_count:
|
77
|
+
return
|
78
|
+
total = sum(ratios)
|
79
|
+
if abs(total - 1.0) > RATIO_TOLERANCE:
|
80
|
+
raise InvalidColumnRatioSumError(total, RATIO_TOLERANCE)
|
@@ -0,0 +1,68 @@
|
|
1
|
+
from typing import override
|
2
|
+
|
3
|
+
from notionary.page.content.parser.pre_processsing.handlers.port import PreProcessor
|
4
|
+
|
5
|
+
|
6
|
+
class WhitespacePreProcessor(PreProcessor):
|
7
|
+
@override
|
8
|
+
def process(self, markdown_text: str) -> str:
|
9
|
+
if not markdown_text:
|
10
|
+
return ""
|
11
|
+
|
12
|
+
lines = markdown_text.split("\n")
|
13
|
+
processed_lines = []
|
14
|
+
code_block_lines = []
|
15
|
+
in_code_block = False
|
16
|
+
|
17
|
+
for line in lines:
|
18
|
+
if self._is_code_fence(line):
|
19
|
+
if in_code_block:
|
20
|
+
processed_lines.extend(self._format_code_block(code_block_lines))
|
21
|
+
processed_lines.append("```")
|
22
|
+
code_block_lines = []
|
23
|
+
in_code_block = False
|
24
|
+
else:
|
25
|
+
language = self._extract_language(line)
|
26
|
+
processed_lines.append(f"```{language}")
|
27
|
+
in_code_block = True
|
28
|
+
elif in_code_block:
|
29
|
+
code_block_lines.append(line)
|
30
|
+
else:
|
31
|
+
processed_lines.append(line.lstrip())
|
32
|
+
|
33
|
+
return "\n".join(processed_lines)
|
34
|
+
|
35
|
+
def _is_code_fence(self, line: str) -> bool:
|
36
|
+
return line.lstrip().startswith("```")
|
37
|
+
|
38
|
+
def _extract_language(self, fence_line: str) -> str:
|
39
|
+
return fence_line.lstrip().removeprefix("```").strip()
|
40
|
+
|
41
|
+
def _format_code_block(self, lines: list[str]) -> list[str]:
|
42
|
+
"""
|
43
|
+
Format code block by removing common leading whitespace.
|
44
|
+
|
45
|
+
Preserves relative indentation between lines.
|
46
|
+
Empty lines are preserved as-is.
|
47
|
+
"""
|
48
|
+
if not lines:
|
49
|
+
return []
|
50
|
+
|
51
|
+
non_empty_lines = [line for line in lines if line.strip()]
|
52
|
+
if not non_empty_lines:
|
53
|
+
return ["" for _ in lines]
|
54
|
+
|
55
|
+
min_indent = min(self._count_leading_spaces(line) for line in non_empty_lines)
|
56
|
+
|
57
|
+
if min_indent == 0:
|
58
|
+
return lines
|
59
|
+
|
60
|
+
return [self._remove_indent(line, min_indent) for line in lines]
|
61
|
+
|
62
|
+
def _count_leading_spaces(self, line: str) -> int:
|
63
|
+
return len(line) - len(line.lstrip())
|
64
|
+
|
65
|
+
def _remove_indent(self, line: str, indent_size: int) -> str:
|
66
|
+
if not line.strip():
|
67
|
+
return ""
|
68
|
+
return line[indent_size:]
|
@@ -0,0 +1,15 @@
|
|
1
|
+
from notionary.page.content.parser.pre_processsing.handlers.port import PreProcessor
|
2
|
+
|
3
|
+
|
4
|
+
class MarkdownPreProcessor:
|
5
|
+
def __init__(self) -> None:
|
6
|
+
self._processors: list[PreProcessor] = []
|
7
|
+
|
8
|
+
def register(self, processor: PreProcessor) -> None:
|
9
|
+
self._processors.append(processor)
|
10
|
+
|
11
|
+
def process(self, markdown_text: str) -> str:
|
12
|
+
result = markdown_text
|
13
|
+
for processor in self._processors:
|
14
|
+
result = processor.process(result)
|
15
|
+
return result
|
@@ -0,0 +1,69 @@
|
|
1
|
+
from notionary.blocks.schemas import BlockCreatePayload
|
2
|
+
from notionary.page.content.parser.parsers import (
|
3
|
+
BlockParsingContext,
|
4
|
+
ParentBlockContext,
|
5
|
+
)
|
6
|
+
from notionary.page.content.parser.parsers.base import LineParser
|
7
|
+
from notionary.page.content.parser.post_processing.service import BlockPostProcessor
|
8
|
+
from notionary.page.content.parser.pre_processsing.service import MarkdownPreProcessor
|
9
|
+
from notionary.utils.mixins.logging import LoggingMixin
|
10
|
+
|
11
|
+
|
12
|
+
class MarkdownToNotionConverter(LoggingMixin):
|
13
|
+
def __init__(
|
14
|
+
self, line_parser: LineParser, pre_processor: MarkdownPreProcessor, post_processor: BlockPostProcessor
|
15
|
+
) -> None:
|
16
|
+
self._line_parser = line_parser
|
17
|
+
self._pre_processor = pre_processor
|
18
|
+
self._post_processor = post_processor
|
19
|
+
|
20
|
+
async def convert(self, markdown_text: str) -> list[BlockCreatePayload]:
|
21
|
+
if not markdown_text:
|
22
|
+
return []
|
23
|
+
|
24
|
+
markdown_text = self._pre_processor.process(markdown_text)
|
25
|
+
all_blocks = await self._process_lines(markdown_text)
|
26
|
+
all_blocks = self._post_processor.process(all_blocks)
|
27
|
+
|
28
|
+
return all_blocks
|
29
|
+
|
30
|
+
async def _process_lines(self, text: str) -> list[BlockCreatePayload]:
|
31
|
+
lines = text.split("\n")
|
32
|
+
result_blocks: list[BlockCreatePayload] = []
|
33
|
+
parent_stack: list[ParentBlockContext] = []
|
34
|
+
|
35
|
+
current_line_index = 0
|
36
|
+
while current_line_index < len(lines):
|
37
|
+
line = lines[current_line_index]
|
38
|
+
|
39
|
+
context = self._create_line_processing_context(
|
40
|
+
line=line,
|
41
|
+
lines=lines,
|
42
|
+
line_index=current_line_index,
|
43
|
+
result_blocks=result_blocks,
|
44
|
+
parent_stack=parent_stack,
|
45
|
+
)
|
46
|
+
|
47
|
+
await self._line_parser.handle(context)
|
48
|
+
|
49
|
+
current_line_index += 1 + context.lines_consumed
|
50
|
+
|
51
|
+
return result_blocks
|
52
|
+
|
53
|
+
def _create_line_processing_context(
|
54
|
+
self,
|
55
|
+
line: str,
|
56
|
+
lines: list[str],
|
57
|
+
line_index: int,
|
58
|
+
result_blocks: list[BlockCreatePayload],
|
59
|
+
parent_stack: list[ParentBlockContext],
|
60
|
+
) -> BlockParsingContext:
|
61
|
+
return BlockParsingContext(
|
62
|
+
line=line,
|
63
|
+
result_blocks=result_blocks,
|
64
|
+
parent_stack=parent_stack,
|
65
|
+
parse_children_callback=self._process_lines,
|
66
|
+
all_lines=lines,
|
67
|
+
current_line_index=line_index,
|
68
|
+
lines_consumed=0,
|
69
|
+
)
|
@@ -0,0 +1,48 @@
|
|
1
|
+
from collections.abc import Awaitable, Callable
|
2
|
+
|
3
|
+
from notionary.blocks.schemas import Block
|
4
|
+
|
5
|
+
ConvertChildrenCallback = Callable[[list[Block], int], Awaitable[str]]
|
6
|
+
|
7
|
+
|
8
|
+
class MarkdownRenderingContext:
|
9
|
+
def __init__(
|
10
|
+
self,
|
11
|
+
block: Block,
|
12
|
+
indent_level: int,
|
13
|
+
convert_children_callback: ConvertChildrenCallback | None = None,
|
14
|
+
) -> None:
|
15
|
+
self.block = block
|
16
|
+
self.indent_level = indent_level
|
17
|
+
self.convert_children_callback = convert_children_callback
|
18
|
+
|
19
|
+
self.markdown_result: str | None = None
|
20
|
+
self._markdown_indentation_multiplier = 4
|
21
|
+
|
22
|
+
async def render_children(self) -> str:
|
23
|
+
return await self._convert_children_to_markdown(self.indent_level)
|
24
|
+
|
25
|
+
async def render_children_with_additional_indent(self, additional_indent: int) -> str:
|
26
|
+
return await self._convert_children_to_markdown(self.indent_level + additional_indent)
|
27
|
+
|
28
|
+
async def _convert_children_to_markdown(self, indent_level: int) -> str:
|
29
|
+
if not self._has_children() or not self.convert_children_callback:
|
30
|
+
return ""
|
31
|
+
|
32
|
+
return await self.convert_children_callback(self._get_children_blocks(), indent_level)
|
33
|
+
|
34
|
+
def _get_children_blocks(self) -> list[Block]:
|
35
|
+
if self._has_children():
|
36
|
+
return self.block.children
|
37
|
+
return []
|
38
|
+
|
39
|
+
def _has_children(self) -> bool:
|
40
|
+
return self.block.has_children and self.block.children and len(self.block.children) > 0
|
41
|
+
|
42
|
+
def indent_text(self, text: str) -> str:
|
43
|
+
if not text:
|
44
|
+
return text
|
45
|
+
|
46
|
+
spaces = " " * self._markdown_indentation_multiplier * self.indent_level
|
47
|
+
lines = text.split("\n")
|
48
|
+
return "\n".join(f"{spaces}{line}" if line.strip() else line for line in lines)
|
@@ -0,0 +1,240 @@
|
|
1
|
+
from notionary.blocks.rich_text.rich_text_markdown_converter import (
|
2
|
+
RichTextToMarkdownConverter,
|
3
|
+
)
|
4
|
+
from notionary.page.content.renderer.renderers import (
|
5
|
+
AudioRenderer,
|
6
|
+
BlockRenderer,
|
7
|
+
BookmarkRenderer,
|
8
|
+
BreadcrumbRenderer,
|
9
|
+
BulletedListRenderer,
|
10
|
+
CalloutRenderer,
|
11
|
+
CodeRenderer,
|
12
|
+
ColumnListRenderer,
|
13
|
+
ColumnRenderer,
|
14
|
+
DividerRenderer,
|
15
|
+
EmbedRenderer,
|
16
|
+
EquationRenderer,
|
17
|
+
FallbackRenderer,
|
18
|
+
FileRenderer,
|
19
|
+
HeadingRenderer,
|
20
|
+
ImageRenderer,
|
21
|
+
NumberedListRenderer,
|
22
|
+
ParagraphRenderer,
|
23
|
+
PdfRenderer,
|
24
|
+
QuoteRenderer,
|
25
|
+
TableOfContentsRenderer,
|
26
|
+
TableRenderer,
|
27
|
+
TableRowHandler,
|
28
|
+
TodoRenderer,
|
29
|
+
ToggleableHeadingRenderer,
|
30
|
+
ToggleRenderer,
|
31
|
+
VideoRenderer,
|
32
|
+
)
|
33
|
+
from notionary.page.content.syntax.service import SyntaxRegistry
|
34
|
+
|
35
|
+
|
36
|
+
class RendererChainFactory:
|
37
|
+
def __init__(
|
38
|
+
self,
|
39
|
+
rich_text_markdown_converter: RichTextToMarkdownConverter | None = None,
|
40
|
+
syntax_registry: SyntaxRegistry | None = None,
|
41
|
+
) -> None:
|
42
|
+
self._rich_text_markdown_converter = rich_text_markdown_converter or RichTextToMarkdownConverter()
|
43
|
+
self._syntax_registry = syntax_registry or SyntaxRegistry()
|
44
|
+
|
45
|
+
def create(self) -> BlockRenderer:
|
46
|
+
# Strukturelle Blocks
|
47
|
+
toggle_handler = self._create_toggle_renderer()
|
48
|
+
toggleable_heading_handler = self._create_toggleable_heading_renderer()
|
49
|
+
heading_handler = self._create_heading_renderer()
|
50
|
+
|
51
|
+
# Content Blocks
|
52
|
+
callout_handler = self._create_callout_renderer()
|
53
|
+
code_handler = self._create_code_renderer()
|
54
|
+
quote_handler = self._create_quote_renderer()
|
55
|
+
todo_handler = self._create_todo_renderer()
|
56
|
+
bulleted_list_handler = self._create_bulleted_list_renderer()
|
57
|
+
|
58
|
+
# Layout Blocks
|
59
|
+
divider_handler = self._create_divider_renderer()
|
60
|
+
column_list_handler = self._create_column_list_renderer()
|
61
|
+
column_handler = self._create_column_renderer()
|
62
|
+
numbered_list_handler = self._create_numbered_list_renderer()
|
63
|
+
|
64
|
+
# Media Blocks
|
65
|
+
bookmark_handler = self._create_bookmark_renderer()
|
66
|
+
image_handler = self._create_image_renderer()
|
67
|
+
video_handler = self._create_video_renderer()
|
68
|
+
audio_handler = self._create_audio_renderer()
|
69
|
+
file_handler = self._create_file_renderer()
|
70
|
+
pdf_handler = self._create_pdf_renderer()
|
71
|
+
embed_handler = self._create_embed_renderer()
|
72
|
+
|
73
|
+
# Special Blocks
|
74
|
+
equation_handler = self._create_equation_renderer()
|
75
|
+
table_of_contents_handler = self._create_table_of_contents_renderer()
|
76
|
+
breadcrumb_handler = self._create_breadcrumb_renderer()
|
77
|
+
table_handler = self._create_table_renderer()
|
78
|
+
table_row_handler = self._create_table_row_handler()
|
79
|
+
|
80
|
+
# Standard & Fallback
|
81
|
+
paragraph_handler = self._create_paragraph_renderer()
|
82
|
+
fallback_handler = self._create_fallback_renderer()
|
83
|
+
|
84
|
+
# Chain verketten - most specific first, fallback last
|
85
|
+
(
|
86
|
+
toggle_handler.set_next(toggleable_heading_handler)
|
87
|
+
.set_next(heading_handler)
|
88
|
+
.set_next(callout_handler)
|
89
|
+
.set_next(code_handler)
|
90
|
+
.set_next(quote_handler)
|
91
|
+
.set_next(todo_handler)
|
92
|
+
.set_next(bulleted_list_handler)
|
93
|
+
.set_next(divider_handler)
|
94
|
+
.set_next(column_list_handler)
|
95
|
+
.set_next(column_handler)
|
96
|
+
.set_next(numbered_list_handler)
|
97
|
+
.set_next(bookmark_handler)
|
98
|
+
.set_next(image_handler)
|
99
|
+
.set_next(video_handler)
|
100
|
+
.set_next(audio_handler)
|
101
|
+
.set_next(file_handler)
|
102
|
+
.set_next(pdf_handler)
|
103
|
+
.set_next(embed_handler)
|
104
|
+
.set_next(equation_handler)
|
105
|
+
.set_next(table_of_contents_handler)
|
106
|
+
.set_next(breadcrumb_handler)
|
107
|
+
.set_next(table_handler)
|
108
|
+
.set_next(table_row_handler)
|
109
|
+
.set_next(paragraph_handler)
|
110
|
+
.set_next(fallback_handler)
|
111
|
+
)
|
112
|
+
|
113
|
+
return toggle_handler
|
114
|
+
|
115
|
+
# Renderer Creation Methods
|
116
|
+
def _create_toggle_renderer(self) -> ToggleRenderer:
|
117
|
+
return ToggleRenderer(
|
118
|
+
syntax_registry=self._syntax_registry,
|
119
|
+
rich_text_markdown_converter=self._rich_text_markdown_converter,
|
120
|
+
)
|
121
|
+
|
122
|
+
def _create_toggleable_heading_renderer(self) -> ToggleableHeadingRenderer:
|
123
|
+
return ToggleableHeadingRenderer(
|
124
|
+
syntax_registry=self._syntax_registry,
|
125
|
+
rich_text_markdown_converter=self._rich_text_markdown_converter,
|
126
|
+
)
|
127
|
+
|
128
|
+
def _create_heading_renderer(self) -> HeadingRenderer:
|
129
|
+
return HeadingRenderer(
|
130
|
+
syntax_registry=self._syntax_registry,
|
131
|
+
rich_text_markdown_converter=self._rich_text_markdown_converter,
|
132
|
+
)
|
133
|
+
|
134
|
+
def _create_callout_renderer(self) -> CalloutRenderer:
|
135
|
+
return CalloutRenderer(
|
136
|
+
syntax_registry=self._syntax_registry,
|
137
|
+
rich_text_markdown_converter=self._rich_text_markdown_converter,
|
138
|
+
)
|
139
|
+
|
140
|
+
def _create_code_renderer(self) -> CodeRenderer:
|
141
|
+
return CodeRenderer(
|
142
|
+
syntax_registry=self._syntax_registry,
|
143
|
+
rich_text_markdown_converter=self._rich_text_markdown_converter,
|
144
|
+
)
|
145
|
+
|
146
|
+
def _create_quote_renderer(self) -> QuoteRenderer:
|
147
|
+
return QuoteRenderer(
|
148
|
+
syntax_registry=self._syntax_registry,
|
149
|
+
rich_text_markdown_converter=self._rich_text_markdown_converter,
|
150
|
+
)
|
151
|
+
|
152
|
+
def _create_todo_renderer(self) -> TodoRenderer:
|
153
|
+
return TodoRenderer(
|
154
|
+
syntax_registry=self._syntax_registry,
|
155
|
+
rich_text_markdown_converter=self._rich_text_markdown_converter,
|
156
|
+
)
|
157
|
+
|
158
|
+
def _create_bulleted_list_renderer(self) -> BulletedListRenderer:
|
159
|
+
return BulletedListRenderer(
|
160
|
+
syntax_registry=self._syntax_registry,
|
161
|
+
rich_text_markdown_converter=self._rich_text_markdown_converter,
|
162
|
+
)
|
163
|
+
|
164
|
+
def _create_divider_renderer(self) -> DividerRenderer:
|
165
|
+
return DividerRenderer(syntax_registry=self._syntax_registry)
|
166
|
+
|
167
|
+
def _create_column_list_renderer(self) -> ColumnListRenderer:
|
168
|
+
return ColumnListRenderer(syntax_registry=self._syntax_registry)
|
169
|
+
|
170
|
+
def _create_column_renderer(self) -> ColumnRenderer:
|
171
|
+
return ColumnRenderer(syntax_registry=self._syntax_registry)
|
172
|
+
|
173
|
+
def _create_numbered_list_renderer(self) -> NumberedListRenderer:
|
174
|
+
return NumberedListRenderer(
|
175
|
+
syntax_registry=self._syntax_registry,
|
176
|
+
rich_text_markdown_converter=self._rich_text_markdown_converter,
|
177
|
+
)
|
178
|
+
|
179
|
+
def _create_bookmark_renderer(self) -> BookmarkRenderer:
|
180
|
+
return BookmarkRenderer(
|
181
|
+
syntax_registry=self._syntax_registry,
|
182
|
+
rich_text_markdown_converter=self._rich_text_markdown_converter,
|
183
|
+
)
|
184
|
+
|
185
|
+
def _create_image_renderer(self) -> ImageRenderer:
|
186
|
+
return ImageRenderer(
|
187
|
+
syntax_registry=self._syntax_registry,
|
188
|
+
rich_text_markdown_converter=self._rich_text_markdown_converter,
|
189
|
+
)
|
190
|
+
|
191
|
+
def _create_video_renderer(self) -> VideoRenderer:
|
192
|
+
return VideoRenderer(
|
193
|
+
syntax_registry=self._syntax_registry,
|
194
|
+
rich_text_markdown_converter=self._rich_text_markdown_converter,
|
195
|
+
)
|
196
|
+
|
197
|
+
def _create_audio_renderer(self) -> AudioRenderer:
|
198
|
+
return AudioRenderer(
|
199
|
+
syntax_registry=self._syntax_registry,
|
200
|
+
rich_text_markdown_converter=self._rich_text_markdown_converter,
|
201
|
+
)
|
202
|
+
|
203
|
+
def _create_file_renderer(self) -> FileRenderer:
|
204
|
+
return FileRenderer(
|
205
|
+
syntax_registry=self._syntax_registry,
|
206
|
+
rich_text_markdown_converter=self._rich_text_markdown_converter,
|
207
|
+
)
|
208
|
+
|
209
|
+
def _create_pdf_renderer(self) -> PdfRenderer:
|
210
|
+
return PdfRenderer(
|
211
|
+
syntax_registry=self._syntax_registry,
|
212
|
+
rich_text_markdown_converter=self._rich_text_markdown_converter,
|
213
|
+
)
|
214
|
+
|
215
|
+
def _create_embed_renderer(self) -> EmbedRenderer:
|
216
|
+
return EmbedRenderer(
|
217
|
+
syntax_registry=self._syntax_registry,
|
218
|
+
rich_text_markdown_converter=self._rich_text_markdown_converter,
|
219
|
+
)
|
220
|
+
|
221
|
+
def _create_equation_renderer(self) -> EquationRenderer:
|
222
|
+
return EquationRenderer(syntax_registry=self._syntax_registry)
|
223
|
+
|
224
|
+
def _create_table_of_contents_renderer(self) -> TableOfContentsRenderer:
|
225
|
+
return TableOfContentsRenderer(syntax_registry=self._syntax_registry)
|
226
|
+
|
227
|
+
def _create_breadcrumb_renderer(self) -> BreadcrumbRenderer:
|
228
|
+
return BreadcrumbRenderer(syntax_registry=self._syntax_registry)
|
229
|
+
|
230
|
+
def _create_table_renderer(self) -> TableRenderer:
|
231
|
+
return TableRenderer(rich_text_markdown_converter=self._rich_text_markdown_converter)
|
232
|
+
|
233
|
+
def _create_table_row_handler(self) -> TableRowHandler:
|
234
|
+
return TableRowHandler()
|
235
|
+
|
236
|
+
def _create_paragraph_renderer(self) -> ParagraphRenderer:
|
237
|
+
return ParagraphRenderer(rich_text_markdown_converter=self._rich_text_markdown_converter)
|
238
|
+
|
239
|
+
def _create_fallback_renderer(self) -> FallbackRenderer:
|
240
|
+
return FallbackRenderer()
|