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,16 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
from notionary.blocks.markdown.markdown_node import MarkdownNode
|
4
|
-
|
5
|
-
|
6
|
-
class ParagraphMarkdownNode(MarkdownNode):
|
7
|
-
"""
|
8
|
-
Enhanced Paragraph node with Pydantic integration.
|
9
|
-
Programmatic interface for creating Markdown paragraphs.
|
10
|
-
Paragraphs are standard text without special block formatting.
|
11
|
-
"""
|
12
|
-
|
13
|
-
text: str
|
14
|
-
|
15
|
-
def to_markdown(self) -> str:
|
16
|
-
return self.text
|
@@ -1,16 +0,0 @@
|
|
1
|
-
from typing import Literal
|
2
|
-
|
3
|
-
from pydantic import BaseModel
|
4
|
-
|
5
|
-
from notionary.blocks.rich_text.rich_text_models import RichTextObject
|
6
|
-
from notionary.blocks.types import BlockColor
|
7
|
-
|
8
|
-
|
9
|
-
class ParagraphBlock(BaseModel):
|
10
|
-
rich_text: list[RichTextObject]
|
11
|
-
color: BlockColor = BlockColor.DEFAULT.value
|
12
|
-
|
13
|
-
|
14
|
-
class CreateParagraphBlock(BaseModel):
|
15
|
-
type: Literal["paragraph"] = "paragraph"
|
16
|
-
paragraph: ParagraphBlock
|
notionary/blocks/pdf/__init__.py
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
from notionary.blocks.pdf.pdf_element import PdfElement
|
2
|
-
from notionary.blocks.pdf.pdf_markdown_node import (
|
3
|
-
PdfMarkdownNode,
|
4
|
-
)
|
5
|
-
from notionary.blocks.pdf.pdf_models import CreatePdfBlock
|
6
|
-
|
7
|
-
__all__ = [
|
8
|
-
"PdfElement",
|
9
|
-
"CreatePdfBlock",
|
10
|
-
"PdfMarkdownNode",
|
11
|
-
]
|
@@ -1,146 +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.file.file_element_models import (
|
8
|
-
ExternalFile,
|
9
|
-
FileBlock,
|
10
|
-
FileType,
|
11
|
-
FileUploadFile,
|
12
|
-
)
|
13
|
-
from notionary.blocks.mixins.captions import CaptionMixin
|
14
|
-
from notionary.blocks.mixins.file_upload.file_upload_mixin import FileUploadMixin
|
15
|
-
from notionary.blocks.syntax_prompt_builder import BlockElementMarkdownInformation
|
16
|
-
from notionary.blocks.models import Block, BlockCreateResult, BlockType
|
17
|
-
from notionary.blocks.pdf.pdf_models import CreatePdfBlock
|
18
|
-
|
19
|
-
|
20
|
-
class PdfElement(BaseBlockElement, CaptionMixin, FileUploadMixin):
|
21
|
-
r"""
|
22
|
-
Handles conversion between Markdown PDF embeds and Notion PDF blocks.
|
23
|
-
|
24
|
-
Supports both external URLs and local PDF file uploads.
|
25
|
-
|
26
|
-
Markdown PDF syntax:
|
27
|
-
- [pdf](https://example.com/document.pdf) - External URL
|
28
|
-
- [pdf](./local/document.pdf) - Local PDF file (will be uploaded)
|
29
|
-
- [pdf](C:\Documents\report.pdf) - Absolute local path (will be uploaded)
|
30
|
-
- [pdf](https://example.com/document.pdf)(caption:Annual Report 2024) - With caption
|
31
|
-
- [pdf](notion://file_id_here)(caption:Notion hosted file) - Notion hosted file
|
32
|
-
- [pdf](upload://upload_id_here)(caption:File upload) - File upload
|
33
|
-
"""
|
34
|
-
|
35
|
-
PDF_PATTERN = re.compile(r"\[pdf\]\(([^)]+)\)")
|
36
|
-
|
37
|
-
@classmethod
|
38
|
-
def match_notion(cls, block: Block) -> bool:
|
39
|
-
"""Match Notion PDF blocks."""
|
40
|
-
return block.type == BlockType.PDF and block.pdf
|
41
|
-
|
42
|
-
@classmethod
|
43
|
-
async def markdown_to_notion(cls, text: str) -> Optional[BlockCreateResult]:
|
44
|
-
"""Convert markdown PDF link to Notion PDF block."""
|
45
|
-
pdf_path = cls._extract_pdf_path(text.strip())
|
46
|
-
|
47
|
-
if not pdf_path:
|
48
|
-
return None
|
49
|
-
|
50
|
-
cls.logger.info(f"Processing PDF: {pdf_path}")
|
51
|
-
|
52
|
-
# Extract caption
|
53
|
-
caption_text = cls.extract_caption(text.strip())
|
54
|
-
caption_rich_text = cls.build_caption_rich_text(caption_text or "")
|
55
|
-
|
56
|
-
# Handle different types of PDF sources
|
57
|
-
if pdf_path.startswith(("notion://", "upload://")):
|
58
|
-
# Handle special Notion schemes (existing functionality)
|
59
|
-
cls.logger.info(f"Using special scheme: {pdf_path}")
|
60
|
-
pdf_block = FileBlock(
|
61
|
-
type=FileType.EXTERNAL,
|
62
|
-
external=ExternalFile(url=pdf_path),
|
63
|
-
caption=caption_rich_text,
|
64
|
-
)
|
65
|
-
|
66
|
-
elif cls._is_local_file_path(pdf_path):
|
67
|
-
# Handle local PDF file upload using mixin
|
68
|
-
cls.logger.debug(f"Detected local PDF file: {pdf_path}")
|
69
|
-
|
70
|
-
# Upload the local PDF file with PDF category validation
|
71
|
-
file_upload_id = await cls._upload_local_file(pdf_path, "pdf")
|
72
|
-
if not file_upload_id:
|
73
|
-
cls.logger.error(f"Failed to upload PDF: {pdf_path}")
|
74
|
-
return None
|
75
|
-
|
76
|
-
# Create FILE_UPLOAD block
|
77
|
-
pdf_block = FileBlock(
|
78
|
-
type=FileType.FILE_UPLOAD,
|
79
|
-
file_upload=FileUploadFile(id=file_upload_id),
|
80
|
-
caption=caption_rich_text,
|
81
|
-
)
|
82
|
-
|
83
|
-
else:
|
84
|
-
# Handle external URL
|
85
|
-
cls.logger.debug(f"Using external PDF URL: {pdf_path}")
|
86
|
-
|
87
|
-
pdf_block = FileBlock(
|
88
|
-
type=FileType.EXTERNAL,
|
89
|
-
external=ExternalFile(url=pdf_path),
|
90
|
-
caption=caption_rich_text,
|
91
|
-
)
|
92
|
-
|
93
|
-
return CreatePdfBlock(pdf=pdf_block)
|
94
|
-
|
95
|
-
@classmethod
|
96
|
-
async def notion_to_markdown(cls, block: Block) -> Optional[str]:
|
97
|
-
"""Convert Notion PDF block to markdown."""
|
98
|
-
if block.type != BlockType.PDF or not block.pdf:
|
99
|
-
return None
|
100
|
-
|
101
|
-
pb: FileBlock = block.pdf
|
102
|
-
|
103
|
-
# Determine the source for markdown
|
104
|
-
if pb.type == FileType.EXTERNAL and pb.external:
|
105
|
-
source = pb.external.url
|
106
|
-
elif pb.type == FileType.FILE and pb.file:
|
107
|
-
source = pb.file.url
|
108
|
-
else:
|
109
|
-
return None
|
110
|
-
|
111
|
-
result = f"[pdf]({source})"
|
112
|
-
|
113
|
-
# Add caption if present
|
114
|
-
caption_markdown = await cls.format_caption_for_markdown(pb.caption or [])
|
115
|
-
if caption_markdown:
|
116
|
-
result += caption_markdown
|
117
|
-
|
118
|
-
return result
|
119
|
-
|
120
|
-
@classmethod
|
121
|
-
def get_system_prompt_information(cls) -> Optional[BlockElementMarkdownInformation]:
|
122
|
-
"""Get system prompt information for PDF blocks."""
|
123
|
-
return BlockElementMarkdownInformation(
|
124
|
-
block_type=cls.__name__,
|
125
|
-
description="PDF blocks embed and display PDF documents from external URLs or upload local PDF files with optional captions",
|
126
|
-
syntax_examples=[
|
127
|
-
"[pdf](https://example.com/document.pdf)",
|
128
|
-
"[pdf](./local/report.pdf)",
|
129
|
-
"[pdf](C:\\Documents\\manual.pdf)",
|
130
|
-
"[pdf](https://example.com/report.pdf)(caption:Annual Report 2024)",
|
131
|
-
"(caption:User Manual)[pdf](./manual.pdf)",
|
132
|
-
"[pdf](./guide.pdf)(caption:**Important** documentation)",
|
133
|
-
],
|
134
|
-
usage_guidelines="Use for embedding PDF documents that can be viewed inline. Supports both external URLs and local PDF file uploads. Local PDF files will be automatically uploaded to Notion. Caption supports rich text formatting and should describe the PDF content.",
|
135
|
-
)
|
136
|
-
|
137
|
-
@classmethod
|
138
|
-
def _extract_pdf_path(cls, text: str) -> Optional[str]:
|
139
|
-
"""Extract PDF path/URL from text, handling caption patterns."""
|
140
|
-
clean_text = cls.remove_caption(text)
|
141
|
-
|
142
|
-
match = cls.PDF_PATTERN.search(clean_text)
|
143
|
-
if match:
|
144
|
-
return match.group(1).strip()
|
145
|
-
|
146
|
-
return None
|
@@ -1,24 +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 PdfMarkdownNode(MarkdownNode, CaptionMarkdownNodeMixin):
|
8
|
-
"""
|
9
|
-
Enhanced PDF node with Pydantic integration.
|
10
|
-
Programmatic interface for creating Notion-style PDF blocks.
|
11
|
-
"""
|
12
|
-
|
13
|
-
url: str
|
14
|
-
caption: Optional[str] = None
|
15
|
-
|
16
|
-
def to_markdown(self) -> str:
|
17
|
-
"""Return the Markdown representation.
|
18
|
-
|
19
|
-
Examples:
|
20
|
-
- [pdf](https://example.com/document.pdf)
|
21
|
-
- [pdf](https://example.com/document.pdf)(caption:Critical safety information)
|
22
|
-
"""
|
23
|
-
base_markdown = f"[pdf]({self.url})"
|
24
|
-
return self.append_caption_to_markdown(base_markdown, self.caption)
|
@@ -1,11 +0,0 @@
|
|
1
|
-
from typing import Literal
|
2
|
-
|
3
|
-
from pydantic import BaseModel
|
4
|
-
|
5
|
-
from notionary.blocks.file.file_element_models import FileBlock
|
6
|
-
from notionary.blocks.rich_text.rich_text_models import RichTextObject
|
7
|
-
|
8
|
-
|
9
|
-
class CreatePdfBlock(BaseModel):
|
10
|
-
type: Literal["pdf"] = "pdf"
|
11
|
-
pdf: FileBlock
|
@@ -1,14 +0,0 @@
|
|
1
|
-
"""Quote block handling for Notionary."""
|
2
|
-
|
3
|
-
from notionary.blocks.quote.quote_element import QuoteElement
|
4
|
-
from notionary.blocks.quote.quote_markdown_node import (
|
5
|
-
QuoteMarkdownNode,
|
6
|
-
)
|
7
|
-
from notionary.blocks.quote.quote_models import CreateQuoteBlock, QuoteBlock
|
8
|
-
|
9
|
-
__all__ = [
|
10
|
-
"QuoteElement",
|
11
|
-
"QuoteBlock",
|
12
|
-
"CreateQuoteBlock",
|
13
|
-
"QuoteMarkdownNode",
|
14
|
-
]
|
@@ -1,75 +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, BlockCreateResult, BlockType
|
9
|
-
from notionary.blocks.quote.quote_models import CreateQuoteBlock, QuoteBlock
|
10
|
-
from notionary.blocks.rich_text.text_inline_formatter import TextInlineFormatter
|
11
|
-
from notionary.blocks.types import BlockColor
|
12
|
-
|
13
|
-
|
14
|
-
class QuoteElement(BaseBlockElement):
|
15
|
-
"""
|
16
|
-
Handles conversion between Markdown quotes and Notion quote blocks.
|
17
|
-
|
18
|
-
Markdown quote syntax:
|
19
|
-
- > Simple quote text
|
20
|
-
|
21
|
-
Only single-line quotes without author metadata.
|
22
|
-
"""
|
23
|
-
|
24
|
-
PATTERN = re.compile(r"^>\s*(.+)$")
|
25
|
-
|
26
|
-
@classmethod
|
27
|
-
def match_notion(cls, block: Block) -> bool:
|
28
|
-
return block.type == BlockType.QUOTE and block.quote
|
29
|
-
|
30
|
-
@classmethod
|
31
|
-
async def markdown_to_notion(cls, text: str) -> BlockCreateResult:
|
32
|
-
"""Convert markdown quote to Notion QuoteBlock."""
|
33
|
-
match = cls.PATTERN.match(text.strip())
|
34
|
-
if not match:
|
35
|
-
return None
|
36
|
-
|
37
|
-
content = match.group(1).strip()
|
38
|
-
if not content:
|
39
|
-
return None
|
40
|
-
|
41
|
-
# Reject multiline quotes
|
42
|
-
if "\n" in content or "\r" in content:
|
43
|
-
return None
|
44
|
-
|
45
|
-
rich_text = await TextInlineFormatter.parse_inline_formatting(content)
|
46
|
-
|
47
|
-
quote_content = QuoteBlock(rich_text=rich_text, color=BlockColor.DEFAULT)
|
48
|
-
return CreateQuoteBlock(quote=quote_content)
|
49
|
-
|
50
|
-
@classmethod
|
51
|
-
async def notion_to_markdown(cls, block: Block) -> Optional[str]:
|
52
|
-
if block.type != BlockType.QUOTE or not block.quote:
|
53
|
-
return None
|
54
|
-
|
55
|
-
rich = block.quote.rich_text
|
56
|
-
text = await TextInlineFormatter.extract_text_with_formatting(rich)
|
57
|
-
|
58
|
-
if not text.strip():
|
59
|
-
return None
|
60
|
-
|
61
|
-
return f"> {text.strip()}"
|
62
|
-
|
63
|
-
@classmethod
|
64
|
-
def get_system_prompt_information(cls) -> Optional[BlockElementMarkdownInformation]:
|
65
|
-
"""Get system prompt information for quote blocks."""
|
66
|
-
return BlockElementMarkdownInformation(
|
67
|
-
block_type=cls.__name__,
|
68
|
-
description="Quote blocks display highlighted quotations or emphasized text",
|
69
|
-
syntax_examples=[
|
70
|
-
"> This is an important quote",
|
71
|
-
"> The only way to do great work is to love what you do",
|
72
|
-
"> Innovation distinguishes between a leader and a follower",
|
73
|
-
],
|
74
|
-
usage_guidelines="Use for quotations, important statements, or text that should be visually emphasized. Content should be meaningful and stand out from regular paragraphs.",
|
75
|
-
)
|
@@ -1,16 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
from notionary.blocks.markdown.markdown_node import MarkdownNode
|
4
|
-
|
5
|
-
|
6
|
-
class QuoteMarkdownNode(MarkdownNode):
|
7
|
-
"""
|
8
|
-
Enhanced Quote node with Pydantic integration.
|
9
|
-
Programmatic interface for creating Notion-style quote blocks.
|
10
|
-
Example: > This is a quote
|
11
|
-
"""
|
12
|
-
|
13
|
-
text: str
|
14
|
-
|
15
|
-
def to_markdown(self) -> str:
|
16
|
-
return f"> {self.text}"
|
@@ -1,18 +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.rich_text_models import RichTextObject
|
7
|
-
from notionary.blocks.types import BlockColor
|
8
|
-
|
9
|
-
|
10
|
-
class QuoteBlock(BaseModel):
|
11
|
-
rich_text: list[RichTextObject]
|
12
|
-
color: BlockColor = BlockColor.DEFAULT
|
13
|
-
children: list[Block] = Field(default_factory=list)
|
14
|
-
|
15
|
-
|
16
|
-
class CreateQuoteBlock(BaseModel):
|
17
|
-
type: Literal["quote"] = "quote"
|
18
|
-
quote: QuoteBlock
|
@@ -1,150 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
from collections import OrderedDict
|
4
|
-
from typing import Type, Set
|
5
|
-
|
6
|
-
from notionary.blocks.base_block_element import BaseBlockElement
|
7
|
-
from notionary.telemetry import ProductTelemetry
|
8
|
-
|
9
|
-
from notionary.blocks.audio import AudioElement
|
10
|
-
from notionary.blocks.bookmark import BookmarkElement
|
11
|
-
from notionary.blocks.breadcrumbs import BreadcrumbElement
|
12
|
-
from notionary.blocks.bulleted_list import BulletedListElement
|
13
|
-
from notionary.blocks.callout import CalloutElement
|
14
|
-
from notionary.blocks.child_database import ChildDatabaseElement
|
15
|
-
from notionary.blocks.code import CodeElement
|
16
|
-
from notionary.blocks.column import ColumnElement, ColumnListElement
|
17
|
-
from notionary.blocks.divider import DividerElement
|
18
|
-
from notionary.blocks.embed import EmbedElement
|
19
|
-
from notionary.blocks.equation import EquationElement
|
20
|
-
from notionary.blocks.file import FileElement
|
21
|
-
from notionary.blocks.heading import HeadingElement
|
22
|
-
from notionary.blocks.image_block import ImageElement
|
23
|
-
from notionary.blocks.numbered_list import NumberedListElement
|
24
|
-
from notionary.blocks.paragraph import ParagraphElement
|
25
|
-
from notionary.blocks.pdf import PdfElement
|
26
|
-
from notionary.blocks.quote import QuoteElement
|
27
|
-
from notionary.blocks.table import TableElement
|
28
|
-
from notionary.blocks.table_of_contents import TableOfContentsElement
|
29
|
-
from notionary.blocks.todo import TodoElement
|
30
|
-
from notionary.blocks.toggle import ToggleElement
|
31
|
-
from notionary.blocks.toggleable_heading import ToggleableHeadingElement
|
32
|
-
from notionary.blocks.video import VideoElement
|
33
|
-
|
34
|
-
|
35
|
-
class BlockRegistry:
|
36
|
-
"""Registry of elements that can convert between Markdown and Notion."""
|
37
|
-
|
38
|
-
_DEFAULT_ELEMENTS = [
|
39
|
-
HeadingElement,
|
40
|
-
CalloutElement,
|
41
|
-
CodeElement,
|
42
|
-
DividerElement,
|
43
|
-
TableElement,
|
44
|
-
BulletedListElement,
|
45
|
-
NumberedListElement,
|
46
|
-
ToggleElement,
|
47
|
-
ToggleableHeadingElement,
|
48
|
-
QuoteElement,
|
49
|
-
TodoElement,
|
50
|
-
BookmarkElement,
|
51
|
-
ImageElement,
|
52
|
-
VideoElement,
|
53
|
-
EmbedElement,
|
54
|
-
AudioElement,
|
55
|
-
ColumnListElement,
|
56
|
-
ColumnElement,
|
57
|
-
EquationElement,
|
58
|
-
TableOfContentsElement,
|
59
|
-
BreadcrumbElement,
|
60
|
-
ChildDatabaseElement,
|
61
|
-
FileElement,
|
62
|
-
PdfElement,
|
63
|
-
ParagraphElement, # Must be last as fallback!
|
64
|
-
]
|
65
|
-
|
66
|
-
def __init__(self, excluded_elements: Set[Type[BaseBlockElement]] = None):
|
67
|
-
"""
|
68
|
-
Initialize a new registry instance.
|
69
|
-
|
70
|
-
Args:
|
71
|
-
excluded_elements: Set of element classes to exclude from the registry
|
72
|
-
"""
|
73
|
-
self._elements = OrderedDict()
|
74
|
-
self._excluded_elements = excluded_elements or set()
|
75
|
-
self.telemetry = ProductTelemetry()
|
76
|
-
|
77
|
-
# Initialize with default elements minus excluded ones
|
78
|
-
self._initialize_default_elements()
|
79
|
-
|
80
|
-
@classmethod
|
81
|
-
def create_registry(
|
82
|
-
cls, excluded_elements: Set[Type[BaseBlockElement]] = None
|
83
|
-
) -> "BlockRegistry":
|
84
|
-
"""
|
85
|
-
Create a registry with all standard elements in recommended order.
|
86
|
-
|
87
|
-
Args:
|
88
|
-
excluded_elements: Set of element classes to exclude from the registry
|
89
|
-
"""
|
90
|
-
return cls(excluded_elements=excluded_elements)
|
91
|
-
|
92
|
-
def _initialize_default_elements(self) -> None:
|
93
|
-
"""Initialize registry with default elements minus excluded ones."""
|
94
|
-
for element_class in self._DEFAULT_ELEMENTS:
|
95
|
-
if element_class not in self._excluded_elements:
|
96
|
-
self._elements[element_class.__name__] = element_class
|
97
|
-
|
98
|
-
def exclude_elements(
|
99
|
-
self, *element_classes: Type[BaseBlockElement]
|
100
|
-
) -> BlockRegistry:
|
101
|
-
"""
|
102
|
-
Create a new registry with additional excluded elements.
|
103
|
-
|
104
|
-
Args:
|
105
|
-
element_classes: Element classes to exclude
|
106
|
-
|
107
|
-
Returns:
|
108
|
-
New BlockRegistry instance with excluded elements
|
109
|
-
"""
|
110
|
-
new_excluded = self._excluded_elements.copy()
|
111
|
-
new_excluded.update(element_classes)
|
112
|
-
return BlockRegistry(excluded_elements=new_excluded)
|
113
|
-
|
114
|
-
def register(self, element_class: Type[BaseBlockElement]) -> bool:
|
115
|
-
"""
|
116
|
-
Register an element class.
|
117
|
-
|
118
|
-
Args:
|
119
|
-
element_class: The element class to register
|
120
|
-
|
121
|
-
Returns:
|
122
|
-
True if element was added, False if it already existed
|
123
|
-
"""
|
124
|
-
if element_class.__name__ in self._elements:
|
125
|
-
return False
|
126
|
-
|
127
|
-
self._elements[element_class.__name__] = element_class
|
128
|
-
return True
|
129
|
-
|
130
|
-
def remove(self, element_class: Type[BaseBlockElement]) -> bool:
|
131
|
-
"""
|
132
|
-
Remove an element class.
|
133
|
-
"""
|
134
|
-
return self._elements.pop(element_class.__name__, None) is not None
|
135
|
-
|
136
|
-
def contains(self, element_class: Type[BaseBlockElement]) -> bool:
|
137
|
-
"""
|
138
|
-
Checks if a specific element is contained in the registry.
|
139
|
-
"""
|
140
|
-
return element_class.__name__ in self._elements
|
141
|
-
|
142
|
-
def get_elements(self) -> list[Type[BaseBlockElement]]:
|
143
|
-
"""Get all registered elements in order."""
|
144
|
-
return list(self._elements.values())
|
145
|
-
|
146
|
-
def is_excluded(self, element_class: Type[BaseBlockElement]) -> bool:
|
147
|
-
"""
|
148
|
-
Check if an element class is excluded.
|
149
|
-
"""
|
150
|
-
return element_class in self._excluded_elements
|
@@ -1,33 +0,0 @@
|
|
1
|
-
"""Rich text handling for Notionary."""
|
2
|
-
|
3
|
-
from notionary.blocks.rich_text.rich_text_models import (
|
4
|
-
EquationObject,
|
5
|
-
LinkObject,
|
6
|
-
MentionDatabaseRef,
|
7
|
-
MentionDate,
|
8
|
-
MentionLinkPreview,
|
9
|
-
MentionObject,
|
10
|
-
MentionPageRef,
|
11
|
-
MentionTemplateMention,
|
12
|
-
MentionUserRef,
|
13
|
-
RichTextObject,
|
14
|
-
TextAnnotations,
|
15
|
-
TextContent,
|
16
|
-
)
|
17
|
-
from notionary.blocks.rich_text.text_inline_formatter import TextInlineFormatter
|
18
|
-
|
19
|
-
__all__ = [
|
20
|
-
"RichTextObject",
|
21
|
-
"TextAnnotations",
|
22
|
-
"LinkObject",
|
23
|
-
"TextContent",
|
24
|
-
"EquationObject",
|
25
|
-
"MentionUserRef",
|
26
|
-
"MentionPageRef",
|
27
|
-
"MentionDatabaseRef",
|
28
|
-
"MentionLinkPreview",
|
29
|
-
"MentionDate",
|
30
|
-
"MentionTemplateMention",
|
31
|
-
"MentionObject",
|
32
|
-
"TextInlineFormatter",
|
33
|
-
]
|