notionary 0.2.27__py3-none-any.whl → 0.3.0__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/__init__.py +4 -4
- notionary/blocks/client.py +90 -216
- notionary/blocks/enums.py +167 -0
- notionary/blocks/rich_text/markdown_rich_text_converter.py +280 -0
- notionary/blocks/rich_text/models.py +178 -0
- notionary/blocks/rich_text/name_id_resolver/__init__.py +13 -0
- notionary/blocks/rich_text/name_id_resolver/data_source.py +32 -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 +144 -0
- notionary/blocks/rich_text/rich_text_patterns.py +42 -0
- notionary/blocks/schemas.py +778 -0
- notionary/comments/__init__.py +1 -22
- notionary/comments/client.py +52 -187
- notionary/comments/factory.py +38 -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 +104 -0
- notionary/data_source/properties/schemas.py +402 -0
- notionary/data_source/query/builder.py +448 -0
- notionary/data_source/query/resolver.py +114 -0
- notionary/data_source/query/schema.py +302 -0
- notionary/data_source/query/validator.py +73 -0
- notionary/data_source/schema/registry.py +104 -0
- notionary/data_source/schema/service.py +136 -0
- notionary/data_source/schemas.py +27 -0
- notionary/data_source/service.py +377 -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 +168 -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 +57 -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 +204 -0
- notionary/http/models.py +50 -0
- notionary/page/blocks/client.py +1 -0
- notionary/page/content/factory.py +73 -0
- notionary/page/content/markdown/__init__.py +5 -0
- notionary/page/content/markdown/builder.py +226 -0
- notionary/page/content/markdown/nodes/__init__.py +52 -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 +41 -0
- notionary/page/content/markdown/nodes/callout.py +34 -0
- notionary/page/content/markdown/nodes/code.py +28 -0
- notionary/page/content/markdown/nodes/columns.py +69 -0
- notionary/page/content/markdown/nodes/container.py +64 -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 +36 -0
- notionary/page/content/markdown/nodes/image.py +23 -0
- notionary/page/content/markdown/nodes/mixins/__init__.py +5 -0
- notionary/page/content/markdown/nodes/mixins/caption.py +12 -0
- notionary/page/content/markdown/nodes/numbered_list.py +38 -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 +27 -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 +38 -0
- notionary/page/content/markdown/nodes/toggle.py +27 -0
- notionary/page/content/markdown/nodes/video.py +23 -0
- notionary/page/content/parser/context.py +126 -0
- notionary/page/content/parser/factory.py +210 -0
- notionary/page/content/parser/parsers/__init__.py +58 -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 +85 -0
- notionary/page/content/parser/parsers/callout.py +100 -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 +76 -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 +115 -0
- notionary/page/content/parser/parsers/image.py +42 -0
- notionary/page/content/parser/parsers/numbered_list.py +89 -0
- notionary/page/content/parser/parsers/paragraph.py +37 -0
- notionary/page/content/parser/parsers/pdf.py +42 -0
- notionary/page/content/parser/parsers/quote.py +125 -0
- notionary/page/content/parser/parsers/space.py +41 -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 +96 -0
- notionary/page/content/parser/parsers/toggle.py +70 -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 +95 -0
- notionary/page/content/parser/post_processing/handlers/rich_text_length_truncation.py +114 -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 +11 -0
- notionary/page/content/parser/pre_processsing/handlers/column_syntax.py +130 -0
- notionary/page/content/parser/pre_processsing/handlers/indentation.py +84 -0
- notionary/page/content/parser/pre_processsing/handlers/port.py +7 -0
- notionary/page/content/parser/pre_processsing/handlers/whitespace.py +73 -0
- notionary/page/content/parser/pre_processsing/service.py +15 -0
- notionary/page/content/parser/service.py +78 -0
- notionary/page/content/renderer/context.py +51 -0
- notionary/page/content/renderer/factory.py +231 -0
- notionary/page/content/renderer/post_processing/handlers/__init__.py +5 -0
- notionary/page/content/renderer/post_processing/handlers/numbered_list.py +156 -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 +55 -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 +50 -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 +53 -0
- notionary/page/content/renderer/renderers/column_list.py +44 -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 +95 -0
- notionary/page/content/renderer/renderers/image.py +31 -0
- notionary/page/content/renderer/renderers/numbered_list.py +42 -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 +52 -0
- notionary/page/content/renderer/renderers/video.py +31 -0
- notionary/page/content/renderer/service.py +50 -0
- notionary/page/content/service.py +68 -0
- notionary/page/content/syntax/__init__.py +4 -0
- notionary/page/content/syntax/grammar.py +10 -0
- notionary/page/content/syntax/models.py +66 -0
- notionary/page/content/syntax/registry.py +393 -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 +308 -0
- notionary/page/properties/service.py +261 -0
- notionary/page/schemas.py +13 -0
- notionary/page/service.py +225 -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/shared/typings.py +3 -0
- notionary/user/__init__.py +4 -8
- notionary/user/base.py +138 -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/date.py +51 -0
- notionary/utils/decorators.py +122 -0
- notionary/utils/fuzzy.py +68 -0
- notionary/utils/mixins/logging.py +58 -0
- notionary/utils/pagination.py +100 -0
- notionary/utils/uuid_utils.py +20 -0
- notionary/workspace/__init__.py +4 -0
- notionary/workspace/client.py +62 -0
- notionary/workspace/query/__init__.py +3 -0
- notionary/workspace/query/builder.py +60 -0
- notionary/workspace/query/models.py +61 -0
- notionary/workspace/query/service.py +100 -0
- notionary/workspace/schemas.py +21 -0
- notionary/workspace/service.py +116 -0
- notionary-0.3.0.dist-info/METADATA +201 -0
- notionary-0.3.0.dist-info/RECORD +209 -0
- {notionary-0.2.27.dist-info → notionary-0.3.0.dist-info}/WHEEL +1 -1
- {notionary-0.2.27.dist-info → notionary-0.3.0.dist-info/licenses}/LICENSE +9 -9
- notionary/base_notion_client.py +0 -219
- 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/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/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 -712
- 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/logging_mixin.py +0 -59
- 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.27.dist-info/METADATA +0 -270
- notionary-0.2.27.dist-info/RECORD +0 -202
- /notionary/{database → user}/factory.py +0 -0
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from abc import ABC
|
|
4
|
-
from typing import Optional
|
|
5
|
-
|
|
6
|
-
from notionary.blocks.syntax_prompt_builder import BlockElementMarkdownInformation
|
|
7
|
-
from notionary.blocks.models import Block, BlockCreateResult
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class BaseBlockElement(ABC):
|
|
11
|
-
"""Base class for elements that can be converted between Markdown and Notion."""
|
|
12
|
-
|
|
13
|
-
@classmethod
|
|
14
|
-
async def markdown_to_notion(cls, text: str) -> BlockCreateResult:
|
|
15
|
-
"""
|
|
16
|
-
Convert markdown to Notion block content.
|
|
17
|
-
|
|
18
|
-
Returns:
|
|
19
|
-
- BlockContent: Single block content (e.g., ToDoBlock, ParagraphBlock)
|
|
20
|
-
- list[BlockContent]: Multiple block contents
|
|
21
|
-
- None: Cannot convert this markdown
|
|
22
|
-
"""
|
|
23
|
-
|
|
24
|
-
@classmethod
|
|
25
|
-
async def notion_to_markdown(cls, block: Block) -> Optional[str]:
|
|
26
|
-
"""Convert Notion block to markdown."""
|
|
27
|
-
|
|
28
|
-
@classmethod
|
|
29
|
-
def match_notion(cls, block: Block) -> bool:
|
|
30
|
-
"""Check if this element can handle the given Notion block."""
|
|
31
|
-
# Default implementation - subclasses should override this method
|
|
32
|
-
# Cannot call async notion_to_markdown here
|
|
33
|
-
return False
|
|
34
|
-
|
|
35
|
-
@classmethod
|
|
36
|
-
def get_system_prompt_information(cls) -> Optional[BlockElementMarkdownInformation]:
|
|
37
|
-
"""Get system prompt information for this block element.
|
|
38
|
-
|
|
39
|
-
Subclasses should override this method to provide their specific information.
|
|
40
|
-
Return None if the element should not be included in documentation.
|
|
41
|
-
"""
|
|
42
|
-
return None
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
from notionary.blocks.bookmark.bookmark_element import BookmarkElement
|
|
2
|
-
from notionary.blocks.bookmark.bookmark_markdown_node import (
|
|
3
|
-
BookmarkMarkdownNode,
|
|
4
|
-
)
|
|
5
|
-
from notionary.blocks.bookmark.bookmark_models import BookmarkBlock, CreateBookmarkBlock
|
|
6
|
-
|
|
7
|
-
__all__ = [
|
|
8
|
-
"BookmarkElement",
|
|
9
|
-
"BookmarkBlock",
|
|
10
|
-
"CreateBookmarkBlock",
|
|
11
|
-
"BookmarkMarkdownNode",
|
|
12
|
-
]
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import re
|
|
4
|
-
from typing import Optional
|
|
5
|
-
|
|
6
|
-
from notionary.blocks.base_block_element import BaseBlockElement
|
|
7
|
-
from notionary.blocks.bookmark.bookmark_models import BookmarkBlock, CreateBookmarkBlock
|
|
8
|
-
from notionary.blocks.mixins.captions import CaptionMixin
|
|
9
|
-
from notionary.blocks.syntax_prompt_builder import BlockElementMarkdownInformation
|
|
10
|
-
from notionary.blocks.models import Block, BlockCreateResult, BlockType
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class BookmarkElement(BaseBlockElement, CaptionMixin):
|
|
14
|
-
"""
|
|
15
|
-
Handles conversion between Markdown bookmarks and Notion bookmark blocks.
|
|
16
|
-
|
|
17
|
-
Markdown bookmark syntax:
|
|
18
|
-
- [bookmark](https://example.com) - URL only
|
|
19
|
-
- [bookmark](https://example.com)(caption:This is a caption) - URL with caption
|
|
20
|
-
- (caption:This is a caption)[bookmark](https://example.com) - caption before URL
|
|
21
|
-
"""
|
|
22
|
-
|
|
23
|
-
# Flexible pattern that can handle caption in any position
|
|
24
|
-
BOOKMARK_PATTERN = re.compile(r"\[bookmark\]\((https?://[^\s\"]+)\)")
|
|
25
|
-
|
|
26
|
-
@classmethod
|
|
27
|
-
def match_notion(cls, block: Block) -> bool:
|
|
28
|
-
return block.type == BlockType.BOOKMARK and block.bookmark
|
|
29
|
-
|
|
30
|
-
@classmethod
|
|
31
|
-
async def markdown_to_notion(cls, text: str) -> BlockCreateResult:
|
|
32
|
-
"""
|
|
33
|
-
Convert a markdown bookmark into a Notion BookmarkBlock.
|
|
34
|
-
"""
|
|
35
|
-
# First remove captions to get clean text for URL extraction
|
|
36
|
-
clean_text = cls.remove_caption(text.strip())
|
|
37
|
-
|
|
38
|
-
# Use our own regex to find the bookmark URL
|
|
39
|
-
bookmark_match = cls.BOOKMARK_PATTERN.search(clean_text)
|
|
40
|
-
if not bookmark_match:
|
|
41
|
-
return None
|
|
42
|
-
|
|
43
|
-
url = bookmark_match.group(1)
|
|
44
|
-
|
|
45
|
-
caption_text = cls.extract_caption(text.strip())
|
|
46
|
-
caption_rich_text = cls.build_caption_rich_text(caption_text or "")
|
|
47
|
-
|
|
48
|
-
bookmark_data = BookmarkBlock(url=url, caption=caption_rich_text)
|
|
49
|
-
return CreateBookmarkBlock(bookmark=bookmark_data)
|
|
50
|
-
|
|
51
|
-
@classmethod
|
|
52
|
-
async def notion_to_markdown(cls, block: Block) -> Optional[str]:
|
|
53
|
-
if block.type != BlockType.BOOKMARK or block.bookmark is None:
|
|
54
|
-
return None
|
|
55
|
-
|
|
56
|
-
bm = block.bookmark
|
|
57
|
-
url = bm.url
|
|
58
|
-
if not url:
|
|
59
|
-
return None
|
|
60
|
-
|
|
61
|
-
result = f"[bookmark]({url})"
|
|
62
|
-
|
|
63
|
-
# Add caption if present
|
|
64
|
-
caption_markdown = await cls.format_caption_for_markdown(bm.caption or [])
|
|
65
|
-
if caption_markdown:
|
|
66
|
-
result += caption_markdown
|
|
67
|
-
|
|
68
|
-
return result
|
|
69
|
-
|
|
70
|
-
@classmethod
|
|
71
|
-
def get_system_prompt_information(cls) -> Optional[BlockElementMarkdownInformation]:
|
|
72
|
-
"""Get system prompt information for bookmark blocks."""
|
|
73
|
-
return BlockElementMarkdownInformation(
|
|
74
|
-
block_type=cls.__name__,
|
|
75
|
-
description="Bookmark blocks create previews of web pages with optional captions",
|
|
76
|
-
syntax_examples=[
|
|
77
|
-
"[bookmark](https://example.com)",
|
|
78
|
-
"[bookmark](https://example.com)(caption:This is a caption)",
|
|
79
|
-
"(caption:Check out this repository)[bookmark](https://github.com/user/repo)",
|
|
80
|
-
"[bookmark](https://github.com/user/repo)(caption:Check out this awesome repository)",
|
|
81
|
-
],
|
|
82
|
-
usage_guidelines="Use for linking to external websites with rich previews. URL is required. Caption supports rich text formatting and is optional.",
|
|
83
|
-
)
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
from typing import Optional
|
|
2
|
-
|
|
3
|
-
from notionary.blocks.markdown.markdown_node import MarkdownNode
|
|
4
|
-
from notionary.blocks.mixins.captions import CaptionMarkdownNodeMixin
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class BookmarkMarkdownNode(MarkdownNode, CaptionMarkdownNodeMixin):
|
|
8
|
-
"""
|
|
9
|
-
Enhanced Bookmark node with Pydantic integration.
|
|
10
|
-
Programmatic interface for creating Notion-style bookmark Markdown blocks.
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
url: str
|
|
14
|
-
title: Optional[str] = None
|
|
15
|
-
caption: Optional[str] = None
|
|
16
|
-
|
|
17
|
-
def to_markdown(self) -> str:
|
|
18
|
-
"""Return the Markdown representation.
|
|
19
|
-
|
|
20
|
-
Examples:
|
|
21
|
-
- [bookmark](https://example.com)
|
|
22
|
-
- [bookmark](https://example.com)(caption:Some caption)
|
|
23
|
-
"""
|
|
24
|
-
# Use simple bookmark syntax like BookmarkElement
|
|
25
|
-
base_markdown = f"[bookmark]({self.url})"
|
|
26
|
-
|
|
27
|
-
# Append caption using mixin helper
|
|
28
|
-
return self.append_caption_to_markdown(base_markdown, self.caption)
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
from typing import Literal
|
|
2
|
-
|
|
3
|
-
from pydantic import BaseModel, Field
|
|
4
|
-
|
|
5
|
-
from notionary.blocks.rich_text.rich_text_models import RichTextObject
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class BookmarkBlock(BaseModel):
|
|
9
|
-
caption: list[RichTextObject] = Field(default_factory=list)
|
|
10
|
-
url: str
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class CreateBookmarkBlock(BaseModel):
|
|
14
|
-
type: Literal["bookmark"] = "bookmark"
|
|
15
|
-
bookmark: BookmarkBlock
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
from notionary.blocks.breadcrumbs.breadcrumb_element import BreadcrumbElement
|
|
2
|
-
from notionary.blocks.breadcrumbs.breadcrumb_markdown_node import (
|
|
3
|
-
BreadcrumbMarkdownNode,
|
|
4
|
-
)
|
|
5
|
-
from notionary.blocks.breadcrumbs.breadcrumb_models import (
|
|
6
|
-
BreadcrumbBlock,
|
|
7
|
-
CreateBreadcrumbBlock,
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
__all__ = [
|
|
11
|
-
"BreadcrumbElement",
|
|
12
|
-
"BreadcrumbBlock",
|
|
13
|
-
"CreateBreadcrumbBlock",
|
|
14
|
-
"BreadcrumbMarkdownNode",
|
|
15
|
-
]
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import re
|
|
4
|
-
from typing import Optional
|
|
5
|
-
|
|
6
|
-
from notionary.blocks.base_block_element import BaseBlockElement
|
|
7
|
-
from notionary.blocks.breadcrumbs.breadcrumb_models import (
|
|
8
|
-
BreadcrumbBlock,
|
|
9
|
-
CreateBreadcrumbBlock,
|
|
10
|
-
)
|
|
11
|
-
from notionary.blocks.models import Block, BlockCreateResult, BlockType
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class BreadcrumbElement(BaseBlockElement):
|
|
15
|
-
"""
|
|
16
|
-
Handles conversion between Markdown breadcrumb marker and Notion breadcrumb blocks.
|
|
17
|
-
|
|
18
|
-
Markdown syntax:
|
|
19
|
-
[breadcrumb]
|
|
20
|
-
"""
|
|
21
|
-
|
|
22
|
-
BREADCRUMB_MARKER = "[breadcrumb]"
|
|
23
|
-
PATTERN = re.compile(r"^\[breadcrumb\]\s*$", re.IGNORECASE)
|
|
24
|
-
|
|
25
|
-
@classmethod
|
|
26
|
-
def match_notion(cls, block: Block) -> bool:
|
|
27
|
-
# Kein extra Payload – nur Typ prüfen
|
|
28
|
-
return block.type == BlockType.BREADCRUMB and block.breadcrumb
|
|
29
|
-
|
|
30
|
-
@classmethod
|
|
31
|
-
async def markdown_to_notion(cls, text: str) -> BlockCreateResult:
|
|
32
|
-
if not cls.PATTERN.match(text.strip()):
|
|
33
|
-
return None
|
|
34
|
-
return CreateBreadcrumbBlock(breadcrumb=BreadcrumbBlock())
|
|
35
|
-
|
|
36
|
-
@classmethod
|
|
37
|
-
async def notion_to_markdown(cls, block: Block) -> Optional[str]:
|
|
38
|
-
if block.type == BlockType.BREADCRUMB and block.breadcrumb:
|
|
39
|
-
return cls.BREADCRUMB_MARKER
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
from notionary.blocks.markdown.markdown_node import MarkdownNode
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class BreadcrumbMarkdownNode(MarkdownNode):
|
|
5
|
-
"""
|
|
6
|
-
Enhanced Breadcrumb node with Pydantic integration.
|
|
7
|
-
Programmatic interface for creating Markdown breadcrumb blocks.
|
|
8
|
-
Example:
|
|
9
|
-
[breadcrumb]
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
def to_markdown(self) -> str:
|
|
13
|
-
return "[breadcrumb]"
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
from notionary.blocks.bulleted_list.bulleted_list_element import BulletedListElement
|
|
2
|
-
from notionary.blocks.bulleted_list.bulleted_list_markdown_node import (
|
|
3
|
-
BulletedListMarkdownNode,
|
|
4
|
-
)
|
|
5
|
-
from notionary.blocks.bulleted_list.bulleted_list_models import (
|
|
6
|
-
BulletedListItemBlock,
|
|
7
|
-
CreateBulletedListItemBlock,
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
__all__ = [
|
|
11
|
-
"BulletedListElement",
|
|
12
|
-
"BulletedListItemBlock",
|
|
13
|
-
"CreateBulletedListItemBlock",
|
|
14
|
-
"BulletedListMarkdownNode",
|
|
15
|
-
]
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import re
|
|
4
|
-
from typing import Optional
|
|
5
|
-
|
|
6
|
-
from notionary.blocks.base_block_element import BaseBlockElement
|
|
7
|
-
from notionary.blocks.bulleted_list.bulleted_list_models import (
|
|
8
|
-
BulletedListItemBlock,
|
|
9
|
-
CreateBulletedListItemBlock,
|
|
10
|
-
)
|
|
11
|
-
from notionary.blocks.syntax_prompt_builder import BlockElementMarkdownInformation
|
|
12
|
-
from notionary.blocks.models import Block, BlockCreateResult, BlockType
|
|
13
|
-
from notionary.blocks.rich_text.text_inline_formatter import TextInlineFormatter
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class BulletedListElement(BaseBlockElement):
|
|
17
|
-
"""Class for converting between Markdown bullet lists and Notion bulleted list items."""
|
|
18
|
-
|
|
19
|
-
# Regex for markdown bullets (excluding todo items [ ] or [x])
|
|
20
|
-
PATTERN = re.compile(r"^(\s*)[*\-+]\s+(?!\[[ x]\])(.+)$")
|
|
21
|
-
|
|
22
|
-
@classmethod
|
|
23
|
-
def match_notion(cls, block: Block) -> bool:
|
|
24
|
-
"""Check if this element can handle the given Notion block."""
|
|
25
|
-
return block.type == BlockType.BULLETED_LIST_ITEM and block.bulleted_list_item
|
|
26
|
-
|
|
27
|
-
@classmethod
|
|
28
|
-
async def markdown_to_notion(cls, text: str) -> BlockCreateResult:
|
|
29
|
-
"""
|
|
30
|
-
Convert a markdown bulleted list item into a Notion BulletedListItemBlock.
|
|
31
|
-
"""
|
|
32
|
-
if not (match := cls.PATTERN.match(text.strip())):
|
|
33
|
-
return None
|
|
34
|
-
|
|
35
|
-
# Extract the content part (second capture group)
|
|
36
|
-
content = match.group(2)
|
|
37
|
-
|
|
38
|
-
# Parse inline markdown formatting into RichTextObject list
|
|
39
|
-
rich_text = await TextInlineFormatter.parse_inline_formatting(content)
|
|
40
|
-
|
|
41
|
-
# Return a properly typed Notion block
|
|
42
|
-
bulleted_list_content = BulletedListItemBlock(
|
|
43
|
-
rich_text=rich_text, color="default"
|
|
44
|
-
)
|
|
45
|
-
return CreateBulletedListItemBlock(bulleted_list_item=bulleted_list_content)
|
|
46
|
-
|
|
47
|
-
@classmethod
|
|
48
|
-
async def notion_to_markdown(cls, block: Block) -> Optional[str]:
|
|
49
|
-
"""Convert Notion bulleted_list_item block to Markdown."""
|
|
50
|
-
if block.type != BlockType.BULLETED_LIST_ITEM or not block.bulleted_list_item:
|
|
51
|
-
return None
|
|
52
|
-
|
|
53
|
-
rich_list = block.bulleted_list_item.rich_text
|
|
54
|
-
if not rich_list:
|
|
55
|
-
return "-"
|
|
56
|
-
|
|
57
|
-
text = await TextInlineFormatter.extract_text_with_formatting(rich_list)
|
|
58
|
-
return f"- {text}"
|
|
59
|
-
|
|
60
|
-
@classmethod
|
|
61
|
-
def get_system_prompt_information(cls) -> Optional[BlockElementMarkdownInformation]:
|
|
62
|
-
"""Get system prompt information for bulleted list blocks."""
|
|
63
|
-
return BlockElementMarkdownInformation(
|
|
64
|
-
block_type=cls.__name__,
|
|
65
|
-
description="Bulleted list items create unordered lists with bullet points",
|
|
66
|
-
syntax_examples=[
|
|
67
|
-
"- First item",
|
|
68
|
-
"* Second item",
|
|
69
|
-
"+ Third item",
|
|
70
|
-
"- Item with **bold text**",
|
|
71
|
-
"- Item with *italic text*",
|
|
72
|
-
],
|
|
73
|
-
usage_guidelines="Use -, *, or + to create bullet points. Supports inline formatting like bold, italic, and links. Do not use for todo items (use [ ] or [x] for those).",
|
|
74
|
-
)
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
from notionary.blocks.markdown.markdown_node import MarkdownNode
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class BulletedListMarkdownNode(MarkdownNode):
|
|
5
|
-
"""
|
|
6
|
-
Enhanced BulletedList node with Pydantic integration.
|
|
7
|
-
Programmatic interface for creating Markdown bulleted list items.
|
|
8
|
-
Example:
|
|
9
|
-
- First item
|
|
10
|
-
- Second item
|
|
11
|
-
- Third item
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
texts: list[str]
|
|
15
|
-
|
|
16
|
-
def to_markdown(self) -> str:
|
|
17
|
-
result = []
|
|
18
|
-
for text in self.texts:
|
|
19
|
-
result.append(f"- {text}")
|
|
20
|
-
return "\n".join(result)
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
from typing import Literal
|
|
2
|
-
|
|
3
|
-
from pydantic import BaseModel, Field
|
|
4
|
-
|
|
5
|
-
from notionary.blocks.models import Block
|
|
6
|
-
from notionary.blocks.rich_text import RichTextObject
|
|
7
|
-
from notionary.blocks.types import BlockColor
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class BulletedListItemBlock(BaseModel):
|
|
11
|
-
rich_text: list[RichTextObject]
|
|
12
|
-
color: BlockColor = BlockColor.DEFAULT
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class CreateBulletedListItemBlock(BaseModel):
|
|
16
|
-
type: Literal["bulleted_list_item"] = "bulleted_list_item"
|
|
17
|
-
bulleted_list_item: BulletedListItemBlock
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
from notionary.blocks.callout.callout_element import CalloutElement
|
|
2
|
-
from notionary.blocks.callout.callout_markdown_node import (
|
|
3
|
-
CalloutMarkdownNode,
|
|
4
|
-
)
|
|
5
|
-
from notionary.blocks.callout.callout_models import CalloutBlock, CreateCalloutBlock
|
|
6
|
-
|
|
7
|
-
__all__ = [
|
|
8
|
-
"CalloutElement",
|
|
9
|
-
"CalloutBlock",
|
|
10
|
-
"CreateCalloutBlock",
|
|
11
|
-
"CalloutMarkdownNode",
|
|
12
|
-
]
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import re
|
|
4
|
-
from typing import Optional
|
|
5
|
-
|
|
6
|
-
from notionary.blocks.base_block_element import BaseBlockElement
|
|
7
|
-
from notionary.blocks.callout.callout_models import (
|
|
8
|
-
CalloutBlock,
|
|
9
|
-
CreateCalloutBlock,
|
|
10
|
-
EmojiIcon,
|
|
11
|
-
IconObject,
|
|
12
|
-
)
|
|
13
|
-
from notionary.blocks.syntax_prompt_builder import BlockElementMarkdownInformation
|
|
14
|
-
from notionary.blocks.models import Block, BlockCreateResult, BlockType
|
|
15
|
-
from notionary.blocks.rich_text.text_inline_formatter import TextInlineFormatter
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class CalloutElement(BaseBlockElement):
|
|
19
|
-
"""
|
|
20
|
-
Handles conversion between Markdown callouts and Notion callout blocks.
|
|
21
|
-
|
|
22
|
-
Markdown callout syntax:
|
|
23
|
-
- [callout](Text) - Simple callout with default emoji
|
|
24
|
-
- [callout](Text "emoji") - Callout with custom emoji
|
|
25
|
-
|
|
26
|
-
Where:
|
|
27
|
-
- Text is the required callout content
|
|
28
|
-
- emoji is an optional emoji character (enclosed in quotes)
|
|
29
|
-
"""
|
|
30
|
-
|
|
31
|
-
PATTERN = re.compile(
|
|
32
|
-
r"^\[callout\]\(" # prefix
|
|
33
|
-
r"([^\"]+?)" # content
|
|
34
|
-
r"(?:\s+\"([^\"]+)\")?" # optional emoji
|
|
35
|
-
r"\)$"
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
DEFAULT_EMOJI = "💡"
|
|
39
|
-
DEFAULT_COLOR = "gray_background"
|
|
40
|
-
|
|
41
|
-
@classmethod
|
|
42
|
-
def match_notion(cls, block: Block) -> bool:
|
|
43
|
-
return block.type == BlockType.CALLOUT and block.callout
|
|
44
|
-
|
|
45
|
-
@classmethod
|
|
46
|
-
async def markdown_to_notion(cls, text: str) -> BlockCreateResult:
|
|
47
|
-
"""Convert a markdown callout into a Notion CalloutBlock."""
|
|
48
|
-
match = cls.PATTERN.match(text.strip())
|
|
49
|
-
if not match:
|
|
50
|
-
return None
|
|
51
|
-
|
|
52
|
-
content, emoji = match.group(1), match.group(2)
|
|
53
|
-
if not content:
|
|
54
|
-
return None
|
|
55
|
-
|
|
56
|
-
if not emoji:
|
|
57
|
-
emoji = cls.DEFAULT_EMOJI
|
|
58
|
-
|
|
59
|
-
rich_text = await TextInlineFormatter.parse_inline_formatting(content.strip())
|
|
60
|
-
|
|
61
|
-
callout_content = CalloutBlock(
|
|
62
|
-
rich_text=rich_text,
|
|
63
|
-
icon=EmojiIcon(emoji=emoji),
|
|
64
|
-
color=cls.DEFAULT_COLOR,
|
|
65
|
-
)
|
|
66
|
-
return CreateCalloutBlock(callout=callout_content)
|
|
67
|
-
|
|
68
|
-
@classmethod
|
|
69
|
-
async def notion_to_markdown(cls, block: Block) -> Optional[str]:
|
|
70
|
-
if block.type != BlockType.CALLOUT or not block.callout:
|
|
71
|
-
return None
|
|
72
|
-
|
|
73
|
-
data = block.callout
|
|
74
|
-
|
|
75
|
-
content = await TextInlineFormatter.extract_text_with_formatting(data.rich_text)
|
|
76
|
-
if not content:
|
|
77
|
-
return None
|
|
78
|
-
|
|
79
|
-
icon: Optional[IconObject] = block.callout.icon
|
|
80
|
-
emoji_char = icon.emoji if isinstance(icon, EmojiIcon) else cls.DEFAULT_EMOJI
|
|
81
|
-
|
|
82
|
-
if emoji_char and emoji_char != cls.DEFAULT_EMOJI:
|
|
83
|
-
return f'[callout]({content} "{emoji_char}")'
|
|
84
|
-
return f"[callout]({content})"
|
|
85
|
-
|
|
86
|
-
@classmethod
|
|
87
|
-
def get_system_prompt_information(cls) -> Optional[BlockElementMarkdownInformation]:
|
|
88
|
-
"""Get system prompt information for callout blocks."""
|
|
89
|
-
return BlockElementMarkdownInformation(
|
|
90
|
-
block_type=cls.__name__,
|
|
91
|
-
description="Callout blocks create highlighted text boxes with optional custom emojis for emphasis",
|
|
92
|
-
syntax_examples=[
|
|
93
|
-
"[callout](This is important information)",
|
|
94
|
-
'[callout](Warning message "⚠️")',
|
|
95
|
-
'[callout](Success message "✅")',
|
|
96
|
-
"[callout](Note with default emoji)",
|
|
97
|
-
],
|
|
98
|
-
usage_guidelines="Use for highlighting important information, warnings, tips, or notes. Default emoji is 💡. Custom emoji should be provided in quotes after the text content.",
|
|
99
|
-
)
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
from typing import Optional
|
|
2
|
-
from notionary.blocks.markdown.markdown_node import MarkdownNode
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class CalloutMarkdownNode(MarkdownNode):
|
|
6
|
-
"""
|
|
7
|
-
Enhanced Callout node with Pydantic integration.
|
|
8
|
-
Programmatic interface for creating Notion-style callout Markdown blocks.
|
|
9
|
-
Example: [callout](This is important "⚠️")
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
text: str
|
|
13
|
-
emoji: Optional[str] = None
|
|
14
|
-
|
|
15
|
-
def to_markdown(self) -> str:
|
|
16
|
-
if self.emoji and self.emoji != "💡":
|
|
17
|
-
return f'[callout]({self.text} "{self.emoji}")'
|
|
18
|
-
else:
|
|
19
|
-
return f"[callout]({self.text})"
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
from typing import Literal, Optional, Union
|
|
2
|
-
|
|
3
|
-
from pydantic import BaseModel, Field, model_serializer
|
|
4
|
-
|
|
5
|
-
from notionary.blocks.file.file_element_models import FileBlock
|
|
6
|
-
from notionary.blocks.models import Block
|
|
7
|
-
from notionary.blocks.rich_text.rich_text_models import RichTextObject
|
|
8
|
-
from notionary.blocks.types import BlockColor
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class EmojiIcon(BaseModel):
|
|
12
|
-
type: Literal["emoji"] = "emoji"
|
|
13
|
-
emoji: str
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class FileIcon(BaseModel):
|
|
17
|
-
type: Literal["file"] = "file"
|
|
18
|
-
file: FileBlock
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
IconObject = Union[EmojiIcon, FileIcon]
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class CalloutBlock(BaseModel):
|
|
25
|
-
rich_text: list[RichTextObject]
|
|
26
|
-
color: BlockColor = BlockColor.DEFAULT
|
|
27
|
-
icon: Optional[IconObject] = None
|
|
28
|
-
children: Optional[list[Block]] = None
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
class CreateCalloutBlock(BaseModel):
|
|
32
|
-
type: Literal["callout"] = "callout"
|
|
33
|
-
callout: CalloutBlock
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Child Database Block Module
|
|
3
|
-
|
|
4
|
-
This module provides functionality for handling Notion child database blocks.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from .child_database_element import ChildDatabaseElement
|
|
8
|
-
from .child_database_models import ChildDatabaseBlock, CreateChildDatabaseBlock
|
|
9
|
-
|
|
10
|
-
__all__ = [
|
|
11
|
-
"ChildDatabaseElement",
|
|
12
|
-
"ChildDatabaseBlock",
|
|
13
|
-
"CreateChildDatabaseBlock",
|
|
14
|
-
]
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import re
|
|
4
|
-
from typing import Optional
|
|
5
|
-
|
|
6
|
-
from notionary.blocks.base_block_element import BaseBlockElement
|
|
7
|
-
from notionary.blocks.syntax_prompt_builder import BlockElementMarkdownInformation
|
|
8
|
-
from notionary.blocks.models import Block, BlockType
|
|
9
|
-
from notionary.util import LoggingMixin
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class ChildDatabaseElement(BaseBlockElement, LoggingMixin):
|
|
13
|
-
"""
|
|
14
|
-
Handles conversion between Markdown database references and Notion child database blocks.
|
|
15
|
-
|
|
16
|
-
Creates new databases when converting from markdown.
|
|
17
|
-
"""
|
|
18
|
-
|
|
19
|
-
PATTERN_BRACKET = re.compile(r"^\[database:\s*(.+)\]$", re.IGNORECASE)
|
|
20
|
-
PATTERN_EMOJI = re.compile(r"^📊\s*(.+)$")
|
|
21
|
-
|
|
22
|
-
@classmethod
|
|
23
|
-
def match_notion(cls, block: Block) -> bool:
|
|
24
|
-
return block.type == BlockType.CHILD_DATABASE and block.child_database
|
|
25
|
-
|
|
26
|
-
@classmethod
|
|
27
|
-
async def markdown_to_notion(cls, text: str) -> Optional[str]:
|
|
28
|
-
"""
|
|
29
|
-
Convert markdown database syntax to actual Notion database.
|
|
30
|
-
Returns the database_id if successful, None otherwise.
|
|
31
|
-
"""
|
|
32
|
-
return None
|
|
33
|
-
|
|
34
|
-
@classmethod
|
|
35
|
-
async def notion_to_markdown(cls, block: Block) -> Optional[str]:
|
|
36
|
-
if block.type != BlockType.CHILD_DATABASE or not block.child_database:
|
|
37
|
-
return None
|
|
38
|
-
|
|
39
|
-
title = block.child_database.title
|
|
40
|
-
if not title or not title.strip():
|
|
41
|
-
return None
|
|
42
|
-
|
|
43
|
-
# Use bracket syntax for output
|
|
44
|
-
return f"[database: {title.strip()}]"
|
|
45
|
-
|
|
46
|
-
@classmethod
|
|
47
|
-
def get_system_prompt_information(cls) -> Optional[BlockElementMarkdownInformation]:
|
|
48
|
-
"""Get system prompt information for child database blocks."""
|
|
49
|
-
return BlockElementMarkdownInformation(
|
|
50
|
-
block_type=cls.__name__,
|
|
51
|
-
description="Creates new embedded databases within a Notion page",
|
|
52
|
-
syntax_examples=[
|
|
53
|
-
"[database: Project Tasks]",
|
|
54
|
-
"[database: Customer Information]",
|
|
55
|
-
"📊 Sales Pipeline",
|
|
56
|
-
"📊 Team Directory",
|
|
57
|
-
],
|
|
58
|
-
usage_guidelines="Use to create new databases that will be embedded in the page. The database will be created with a basic 'Name' property and can be customized later.",
|
|
59
|
-
)
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
from typing import Literal
|
|
2
|
-
|
|
3
|
-
from pydantic import BaseModel
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class ChildDatabaseBlock(BaseModel):
|
|
7
|
-
title: str
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class CreateChildDatabaseBlock(BaseModel):
|
|
11
|
-
type: Literal["child_database"] = "child_database"
|
|
12
|
-
child_database: ChildDatabaseBlock
|