notionary 0.2.27__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.27.dist-info → notionary-0.2.28.dist-info}/METADATA +54 -49
- notionary-0.2.28.dist-info/RECORD +200 -0
- {notionary-0.2.27.dist-info → notionary-0.2.28.dist-info}/WHEEL +1 -1
- {notionary-0.2.27.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 -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/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/RECORD +0 -202
@@ -1,129 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Markdown whitespace processing utilities.
|
3
|
-
|
4
|
-
Handles normalization of markdown text while preserving code blocks and their indentation.
|
5
|
-
"""
|
6
|
-
|
7
|
-
from typing import Tuple
|
8
|
-
|
9
|
-
|
10
|
-
class MarkdownWhitespaceProcessor:
|
11
|
-
"""
|
12
|
-
Processes markdown text to normalize whitespace while preserving code block formatting.
|
13
|
-
|
14
|
-
This processor handles:
|
15
|
-
- Removing leading whitespace from regular lines
|
16
|
-
- Preserving code block structure and indentation
|
17
|
-
- Normalizing code block markers
|
18
|
-
"""
|
19
|
-
|
20
|
-
@staticmethod
|
21
|
-
def process_markdown_whitespace(markdown_text: str) -> str:
|
22
|
-
"""Process markdown text to normalize whitespace while preserving code blocks."""
|
23
|
-
lines = markdown_text.split("\n")
|
24
|
-
if not lines:
|
25
|
-
return ""
|
26
|
-
|
27
|
-
return MarkdownWhitespaceProcessor._process_whitespace_lines(lines)
|
28
|
-
|
29
|
-
@staticmethod
|
30
|
-
def _process_whitespace_lines(lines: list[str]) -> str:
|
31
|
-
"""Process all lines and return the processed markdown."""
|
32
|
-
processed_lines = []
|
33
|
-
in_code_block = False
|
34
|
-
current_code_block = []
|
35
|
-
|
36
|
-
for line in lines:
|
37
|
-
processed_lines, in_code_block, current_code_block = (
|
38
|
-
MarkdownWhitespaceProcessor._process_single_line(
|
39
|
-
line, processed_lines, in_code_block, current_code_block
|
40
|
-
)
|
41
|
-
)
|
42
|
-
|
43
|
-
return "\n".join(processed_lines)
|
44
|
-
|
45
|
-
@staticmethod
|
46
|
-
def _process_single_line(
|
47
|
-
line: str,
|
48
|
-
processed_lines: list[str],
|
49
|
-
in_code_block: bool,
|
50
|
-
current_code_block: list[str],
|
51
|
-
) -> Tuple[list[str], bool, list[str]]:
|
52
|
-
"""Process a single line and return updated state."""
|
53
|
-
if MarkdownWhitespaceProcessor._is_code_block_marker(line):
|
54
|
-
return MarkdownWhitespaceProcessor._handle_code_block_marker(
|
55
|
-
line, processed_lines, in_code_block, current_code_block
|
56
|
-
)
|
57
|
-
if in_code_block:
|
58
|
-
current_code_block.append(line)
|
59
|
-
return processed_lines, in_code_block, current_code_block
|
60
|
-
else:
|
61
|
-
processed_lines.append(line.lstrip())
|
62
|
-
return processed_lines, in_code_block, current_code_block
|
63
|
-
|
64
|
-
@staticmethod
|
65
|
-
def _handle_code_block_marker(
|
66
|
-
line: str,
|
67
|
-
processed_lines: list[str],
|
68
|
-
in_code_block: bool,
|
69
|
-
current_code_block: list[str],
|
70
|
-
) -> Tuple[list[str], bool, list[str]]:
|
71
|
-
"""Handle code block start/end markers."""
|
72
|
-
if not in_code_block:
|
73
|
-
return MarkdownWhitespaceProcessor._start_code_block(line, processed_lines)
|
74
|
-
else:
|
75
|
-
return MarkdownWhitespaceProcessor._end_code_block(
|
76
|
-
processed_lines, current_code_block
|
77
|
-
)
|
78
|
-
|
79
|
-
@staticmethod
|
80
|
-
def _start_code_block(
|
81
|
-
line: str, processed_lines: list[str]
|
82
|
-
) -> Tuple[list[str], bool, list[str]]:
|
83
|
-
"""Start a new code block."""
|
84
|
-
processed_lines.append(
|
85
|
-
MarkdownWhitespaceProcessor._normalize_code_block_start(line)
|
86
|
-
)
|
87
|
-
return processed_lines, True, []
|
88
|
-
|
89
|
-
@staticmethod
|
90
|
-
def _end_code_block(
|
91
|
-
processed_lines: list[str], current_code_block: list[str]
|
92
|
-
) -> Tuple[list[str], bool, list[str]]:
|
93
|
-
"""End the current code block."""
|
94
|
-
processed_lines.extend(
|
95
|
-
MarkdownWhitespaceProcessor._normalize_code_block_content(
|
96
|
-
current_code_block
|
97
|
-
)
|
98
|
-
)
|
99
|
-
processed_lines.append("```")
|
100
|
-
return processed_lines, False, []
|
101
|
-
|
102
|
-
@staticmethod
|
103
|
-
def _is_code_block_marker(line: str) -> bool:
|
104
|
-
"""Check if line is a code block marker."""
|
105
|
-
return line.lstrip().startswith("```")
|
106
|
-
|
107
|
-
@staticmethod
|
108
|
-
def _normalize_code_block_start(line: str) -> str:
|
109
|
-
"""Normalize code block opening marker."""
|
110
|
-
language = line.lstrip().replace("```", "", 1).strip()
|
111
|
-
return "```" + language
|
112
|
-
|
113
|
-
@staticmethod
|
114
|
-
def _normalize_code_block_content(code_lines: list[str]) -> list[str]:
|
115
|
-
"""Normalize code block indentation."""
|
116
|
-
if not code_lines:
|
117
|
-
return []
|
118
|
-
|
119
|
-
# Find minimum indentation from non-empty lines
|
120
|
-
non_empty_lines = [line for line in code_lines if line.strip()]
|
121
|
-
if not non_empty_lines:
|
122
|
-
return [""] * len(code_lines)
|
123
|
-
|
124
|
-
min_indent = min(len(line) - len(line.lstrip()) for line in non_empty_lines)
|
125
|
-
if min_indent == 0:
|
126
|
-
return code_lines
|
127
|
-
|
128
|
-
# Remove common indentation
|
129
|
-
return ["" if not line.strip() else line[min_indent:] for line in code_lines]
|
notionary/page/models.py
DELETED
@@ -1,322 +0,0 @@
|
|
1
|
-
from typing import Any, Literal, Optional, Union
|
2
|
-
|
3
|
-
from pydantic import BaseModel, ConfigDict
|
4
|
-
|
5
|
-
from notionary.blocks.models import ParentObject
|
6
|
-
|
7
|
-
|
8
|
-
class TextContent(BaseModel):
|
9
|
-
content: str
|
10
|
-
link: Optional[str] = None
|
11
|
-
|
12
|
-
|
13
|
-
class RichText(BaseModel):
|
14
|
-
type: str
|
15
|
-
text: TextContent
|
16
|
-
plain_text: str
|
17
|
-
href: Optional[str] = None
|
18
|
-
|
19
|
-
|
20
|
-
class User(BaseModel):
|
21
|
-
object: str
|
22
|
-
id: str
|
23
|
-
|
24
|
-
|
25
|
-
class Parent(BaseModel):
|
26
|
-
type: Literal["page_id", "workspace", "block_id", "database_id"]
|
27
|
-
page_id: Optional[str] = None
|
28
|
-
block_id: Optional[str] = None
|
29
|
-
database_id: Optional[str] = None
|
30
|
-
|
31
|
-
|
32
|
-
# Rich text types for Pydantic models
|
33
|
-
class TextContentPydantic(BaseModel):
|
34
|
-
content: str
|
35
|
-
link: Optional[dict[str, str]] = None
|
36
|
-
|
37
|
-
|
38
|
-
class Annotations(BaseModel):
|
39
|
-
bold: bool
|
40
|
-
italic: bool
|
41
|
-
strikethrough: bool
|
42
|
-
underline: bool
|
43
|
-
code: bool
|
44
|
-
color: str
|
45
|
-
|
46
|
-
|
47
|
-
class RichTextItemPydantic(BaseModel):
|
48
|
-
type: str # 'text', 'mention', 'equation'
|
49
|
-
text: Optional[TextContentPydantic] = None
|
50
|
-
annotations: Annotations
|
51
|
-
plain_text: str
|
52
|
-
href: Optional[str] = None
|
53
|
-
|
54
|
-
|
55
|
-
# Cover and Icon types
|
56
|
-
class ExternalFile(BaseModel):
|
57
|
-
"""Represents an external file, e.g., for cover images."""
|
58
|
-
|
59
|
-
url: str
|
60
|
-
|
61
|
-
|
62
|
-
class Cover(BaseModel):
|
63
|
-
"""Cover image for a Notion page."""
|
64
|
-
|
65
|
-
type: str
|
66
|
-
external: ExternalFile
|
67
|
-
|
68
|
-
|
69
|
-
class EmojiIcon(BaseModel):
|
70
|
-
type: Literal["emoji"]
|
71
|
-
emoji: str
|
72
|
-
|
73
|
-
|
74
|
-
class ExternalIcon(BaseModel):
|
75
|
-
type: Literal["external"]
|
76
|
-
external: ExternalFile
|
77
|
-
|
78
|
-
|
79
|
-
Icon = Union[EmojiIcon, ExternalIcon]
|
80
|
-
|
81
|
-
|
82
|
-
# Database property schema types (these are schema definitions, not values)
|
83
|
-
class StatusOption(BaseModel):
|
84
|
-
id: str
|
85
|
-
name: str
|
86
|
-
color: str
|
87
|
-
description: Optional[str] = None
|
88
|
-
|
89
|
-
|
90
|
-
class StatusGroup(BaseModel):
|
91
|
-
id: str
|
92
|
-
name: str
|
93
|
-
color: str
|
94
|
-
option_ids: list[str]
|
95
|
-
|
96
|
-
|
97
|
-
class StatusPropertySchema(BaseModel):
|
98
|
-
options: list[StatusOption]
|
99
|
-
groups: list[StatusGroup]
|
100
|
-
|
101
|
-
|
102
|
-
class DatabaseStatusProperty(BaseModel):
|
103
|
-
id: str
|
104
|
-
name: str
|
105
|
-
type: Literal["status"]
|
106
|
-
status: StatusPropertySchema
|
107
|
-
|
108
|
-
|
109
|
-
class RelationPropertySchema(BaseModel):
|
110
|
-
database_id: str
|
111
|
-
type: str # "single_property"
|
112
|
-
single_property: dict[str, Any]
|
113
|
-
|
114
|
-
|
115
|
-
class DatabaseRelationProperty(BaseModel):
|
116
|
-
id: str
|
117
|
-
name: str
|
118
|
-
type: Literal["relation"]
|
119
|
-
relation: RelationPropertySchema
|
120
|
-
|
121
|
-
|
122
|
-
class DatabaseUrlProperty(BaseModel):
|
123
|
-
id: str
|
124
|
-
name: str
|
125
|
-
type: Literal["url"]
|
126
|
-
url: dict[str, Any] # Usually empty dict
|
127
|
-
|
128
|
-
|
129
|
-
class DatabaseRichTextProperty(BaseModel):
|
130
|
-
id: str
|
131
|
-
name: str
|
132
|
-
type: Literal["rich_text"]
|
133
|
-
rich_text: dict[str, Any] # Usually empty dict
|
134
|
-
|
135
|
-
|
136
|
-
class MultiSelectOption(BaseModel):
|
137
|
-
id: str
|
138
|
-
name: str
|
139
|
-
color: str
|
140
|
-
description: Optional[str] = None
|
141
|
-
|
142
|
-
|
143
|
-
class MultiSelectPropertySchema(BaseModel):
|
144
|
-
options: list[MultiSelectOption]
|
145
|
-
|
146
|
-
|
147
|
-
class DatabaseMultiSelectProperty(BaseModel):
|
148
|
-
id: str
|
149
|
-
name: str
|
150
|
-
type: Literal["multi_select"]
|
151
|
-
multi_select: MultiSelectPropertySchema
|
152
|
-
|
153
|
-
|
154
|
-
class DatabaseTitleProperty(BaseModel):
|
155
|
-
id: str
|
156
|
-
name: str
|
157
|
-
type: Literal["title"]
|
158
|
-
title: dict[str, Any] # Usually empty dict
|
159
|
-
|
160
|
-
|
161
|
-
# Generic database property for unknown types
|
162
|
-
class GenericDatabaseProperty(BaseModel):
|
163
|
-
id: str
|
164
|
-
name: str
|
165
|
-
type: str
|
166
|
-
|
167
|
-
model_config = ConfigDict(extra="allow")
|
168
|
-
|
169
|
-
|
170
|
-
# Union of all database property types
|
171
|
-
DatabaseProperty = Union[
|
172
|
-
DatabaseStatusProperty,
|
173
|
-
DatabaseRelationProperty,
|
174
|
-
DatabaseUrlProperty,
|
175
|
-
DatabaseRichTextProperty,
|
176
|
-
DatabaseMultiSelectProperty,
|
177
|
-
DatabaseTitleProperty,
|
178
|
-
GenericDatabaseProperty,
|
179
|
-
]
|
180
|
-
|
181
|
-
|
182
|
-
# Page property value types (these are actual values, not schemas)
|
183
|
-
class StatusValue(BaseModel):
|
184
|
-
id: str
|
185
|
-
name: str
|
186
|
-
color: str
|
187
|
-
|
188
|
-
|
189
|
-
class StatusProperty(BaseModel):
|
190
|
-
id: str
|
191
|
-
type: str # 'status'
|
192
|
-
status: Optional[StatusValue] = None
|
193
|
-
|
194
|
-
|
195
|
-
class RelationItem(BaseModel):
|
196
|
-
id: str
|
197
|
-
|
198
|
-
|
199
|
-
class RelationProperty(BaseModel):
|
200
|
-
id: str
|
201
|
-
type: str # 'relation'
|
202
|
-
relation: list[RelationItem]
|
203
|
-
has_more: bool
|
204
|
-
|
205
|
-
|
206
|
-
class UrlProperty(BaseModel):
|
207
|
-
id: str
|
208
|
-
type: str # 'url'
|
209
|
-
url: Optional[str] = None
|
210
|
-
|
211
|
-
|
212
|
-
class RichTextProperty(BaseModel):
|
213
|
-
id: str
|
214
|
-
type: str # 'rich_text'
|
215
|
-
rich_text: list[RichTextItemPydantic]
|
216
|
-
|
217
|
-
|
218
|
-
class MultiSelectItem(BaseModel):
|
219
|
-
id: str
|
220
|
-
name: str
|
221
|
-
color: str
|
222
|
-
|
223
|
-
|
224
|
-
class MultiSelectProperty(BaseModel):
|
225
|
-
id: str
|
226
|
-
type: str # 'multi_select'
|
227
|
-
multi_select: list[MultiSelectItem]
|
228
|
-
|
229
|
-
|
230
|
-
class TitleProperty(BaseModel):
|
231
|
-
id: str
|
232
|
-
type: str # 'title'
|
233
|
-
title: list[RichTextItemPydantic]
|
234
|
-
|
235
|
-
|
236
|
-
# Cover types
|
237
|
-
class ExternalCover(BaseModel):
|
238
|
-
url: str
|
239
|
-
|
240
|
-
|
241
|
-
class NotionCover(BaseModel):
|
242
|
-
type: str # 'external', 'file'
|
243
|
-
external: Optional[ExternalCover] = None
|
244
|
-
|
245
|
-
|
246
|
-
# User type for Pydantic
|
247
|
-
class NotionUser(BaseModel):
|
248
|
-
object: str # 'user'
|
249
|
-
id: str
|
250
|
-
|
251
|
-
|
252
|
-
# Database object
|
253
|
-
class NotionDatabaseResponse(BaseModel):
|
254
|
-
"""
|
255
|
-
Represents the response from the Notion API when retrieving a database.
|
256
|
-
"""
|
257
|
-
|
258
|
-
object: Literal["database"]
|
259
|
-
id: str
|
260
|
-
cover: Optional[Cover] = None
|
261
|
-
icon: Optional[Icon] = None
|
262
|
-
created_time: str
|
263
|
-
last_edited_time: str
|
264
|
-
created_by: NotionUser
|
265
|
-
last_edited_by: NotionUser
|
266
|
-
title: list[RichTextItemPydantic]
|
267
|
-
description: list[Any]
|
268
|
-
is_inline: bool
|
269
|
-
properties: dict[
|
270
|
-
str, Any
|
271
|
-
] # Using Any for flexibility with different property schemas
|
272
|
-
parent: ParentObject
|
273
|
-
url: str
|
274
|
-
public_url: Optional[str] = None
|
275
|
-
archived: bool
|
276
|
-
in_trash: bool
|
277
|
-
|
278
|
-
|
279
|
-
class NotionPageResponse(BaseModel):
|
280
|
-
object: Literal["page"]
|
281
|
-
id: str
|
282
|
-
created_time: str
|
283
|
-
last_edited_time: str
|
284
|
-
created_by: NotionUser
|
285
|
-
last_edited_by: NotionUser
|
286
|
-
cover: Optional[NotionCover] = None
|
287
|
-
icon: Optional[Icon] = None
|
288
|
-
parent: ParentObject
|
289
|
-
archived: bool
|
290
|
-
in_trash: bool
|
291
|
-
properties: dict[str, Any]
|
292
|
-
url: str
|
293
|
-
public_url: Optional[str] = None
|
294
|
-
|
295
|
-
|
296
|
-
# Specific response type for database queries (pages only)
|
297
|
-
class NotionQueryDatabaseResponse(BaseModel):
|
298
|
-
"""
|
299
|
-
Notion database query response model for querying pages within a database.
|
300
|
-
"""
|
301
|
-
|
302
|
-
object: Literal["list"]
|
303
|
-
results: list[NotionPageResponse]
|
304
|
-
next_cursor: Optional[str] = None
|
305
|
-
has_more: bool
|
306
|
-
type: Literal["page_or_database"]
|
307
|
-
page_or_database: dict[str, Any]
|
308
|
-
request_id: str
|
309
|
-
|
310
|
-
|
311
|
-
class NotionDatabaseSearchResponse(BaseModel):
|
312
|
-
"""
|
313
|
-
Notion search response model for database-only searches.
|
314
|
-
"""
|
315
|
-
|
316
|
-
object: Literal["list"]
|
317
|
-
results: list[NotionDatabaseResponse]
|
318
|
-
next_cursor: Optional[str] = None
|
319
|
-
has_more: bool
|
320
|
-
type: Literal["page_or_database"]
|
321
|
-
page_or_database: dict[str, Any]
|
322
|
-
request_id: str
|