2929from ultimate_notion import Emoji
3030from ultimate_notion .blocks import PDF as UnoPDF # noqa: N811
3131from ultimate_notion .blocks import Audio as UnoAudio
32- from ultimate_notion .blocks import Block , ChildrenMixin
32+ from ultimate_notion .blocks import Block , ParentBlock
3333from ultimate_notion .blocks import BulletedItem as UnoBulletedItem
3434from ultimate_notion .blocks import Callout as UnoCallout
3535from ultimate_notion .blocks import Code as UnoCode
6767 from _typeshed import Incomplete
6868
6969
70- class PdfNode (nodes .Element ):
70+ @beartype
71+ def _serialize_block_with_children (
72+ * ,
73+ block : Block ,
74+ ) -> dict [str , Any ]:
75+ """
76+ Convert the block tree to a JSON-serializable format, ignoring IDs from
77+ tuples.
78+ """
79+ serialized_obj = block .obj_ref .serialize_for_api ()
80+ if isinstance (block , ParentBlock ) and block .children :
81+ serialized_obj [block .obj_ref .type ]["children" ] = [
82+ _serialize_block_with_children (
83+ block = child ,
84+ )
85+ for child in block .children
86+ ]
87+ return serialized_obj
88+
89+
90+ @beartype
91+ class _PdfNode (nodes .Element ):
7192 """
7293 Custom PDF node for Notion PDF blocks.
7394 """
7495
7596
76- class NotionPdfIncludeDirective (Directive ):
97+ @beartype
98+ class _NotionPdfIncludeDirective (Directive ):
7799 """
78100 PDF include directive that creates Notion PDF blocks.
79101 """
@@ -89,12 +111,12 @@ class NotionPdfIncludeDirective(Directive):
89111 "toolbar" : directives .nonnegative_int ,
90112 }
91113
92- def run (self ) -> list [PdfNode ]:
114+ def run (self ) -> list [_PdfNode ]:
93115 """
94116 Create a Notion PDF block.
95117 """
96118 (pdf_file ,) = self .arguments
97- node = PdfNode ()
119+ node = _PdfNode ()
98120 node .attributes ["uri" ] = pdf_file
99121 return [node ]
100122
@@ -423,6 +445,7 @@ def _process_node_to_blocks(
423445 raise NotImplementedError (node )
424446
425447
448+ @beartype
426449@_process_node_to_blocks .register
427450def _ (
428451 node : nodes .table ,
@@ -493,6 +516,7 @@ def _(
493516 return [table ]
494517
495518
519+ @beartype
496520@_process_node_to_blocks .register
497521def _ (
498522 node : nodes .paragraph ,
@@ -507,6 +531,7 @@ def _(
507531 return [UnoParagraph (text = rich_text )]
508532
509533
534+ @beartype
510535@_process_node_to_blocks .register
511536def _ (
512537 node : nodes .block_quote ,
@@ -521,6 +546,7 @@ def _(
521546 return [UnoQuote (text = rich_text )]
522547
523548
549+ @beartype
524550@_process_node_to_blocks .register
525551def _ (
526552 node : nodes .literal_block ,
@@ -539,6 +565,7 @@ def _(
539565 return [UnoCode (text = code_text , language = language )]
540566
541567
568+ @beartype
542569@_process_node_to_blocks .register
543570def _ (
544571 node : nodes .bullet_list ,
@@ -560,6 +587,7 @@ def _(
560587 return result
561588
562589
590+ @beartype
563591@_process_node_to_blocks .register
564592def _ (
565593 node : nodes .enumerated_list ,
@@ -586,6 +614,7 @@ def _(
586614 return result
587615
588616
617+ @beartype
589618@_process_node_to_blocks .register
590619def _ (
591620 node : nodes .topic ,
@@ -602,6 +631,7 @@ def _(
602631 return [UnoTableOfContents ()]
603632
604633
634+ @beartype
605635@_process_node_to_blocks .register
606636def _ (
607637 node : nodes .compound ,
@@ -619,6 +649,7 @@ def _(
619649 return []
620650
621651
652+ @beartype
622653@_process_node_to_blocks .register
623654def _ (
624655 node : nodes .title ,
@@ -688,6 +719,7 @@ def _create_admonition_callout(
688719 return [block ]
689720
690721
722+ @beartype
691723@_process_node_to_blocks .register
692724def _ (
693725 node : nodes .note ,
@@ -705,6 +737,7 @@ def _(
705737 )
706738
707739
740+ @beartype
708741@_process_node_to_blocks .register
709742def _ (
710743 node : nodes .warning ,
@@ -722,6 +755,7 @@ def _(
722755 )
723756
724757
758+ @beartype
725759@_process_node_to_blocks .register
726760def _ (
727761 node : nodes .tip ,
@@ -739,6 +773,7 @@ def _(
739773 )
740774
741775
776+ @beartype
742777@_process_node_to_blocks .register
743778def _ (
744779 node : nodes .attention ,
@@ -756,6 +791,7 @@ def _(
756791 )
757792
758793
794+ @beartype
759795@_process_node_to_blocks .register
760796def _ (
761797 node : nodes .caution ,
@@ -773,6 +809,7 @@ def _(
773809 )
774810
775811
812+ @beartype
776813@_process_node_to_blocks .register
777814def _ (
778815 node : nodes .danger ,
@@ -790,6 +827,7 @@ def _(
790827 )
791828
792829
830+ @beartype
793831@_process_node_to_blocks .register
794832def _ (
795833 node : nodes .error ,
@@ -807,6 +845,7 @@ def _(
807845 )
808846
809847
848+ @beartype
810849@_process_node_to_blocks .register
811850def _ (
812851 node : nodes .hint ,
@@ -824,6 +863,7 @@ def _(
824863 )
825864
826865
866+ @beartype
827867@_process_node_to_blocks .register
828868def _ (
829869 node : nodes .important ,
@@ -841,6 +881,7 @@ def _(
841881 )
842882
843883
884+ @beartype
844885@_process_node_to_blocks .register
845886def _ (
846887 node : CollapseNode ,
@@ -866,6 +907,7 @@ def _(
866907 return [toggle_block ]
867908
868909
910+ @beartype
869911@_process_node_to_blocks .register
870912def _ (
871913 node : nodes .image ,
@@ -888,6 +930,7 @@ def _(
888930 return [UnoImage (file = ExternalFile (url = image_url ), caption = None )]
889931
890932
933+ @beartype
891934@_process_node_to_blocks .register
892935def _ (
893936 node : video_node ,
@@ -922,6 +965,7 @@ def _(
922965 ]
923966
924967
968+ @beartype
925969@_process_node_to_blocks .register
926970def _ (
927971 node : audio_node ,
@@ -944,9 +988,10 @@ def _(
944988 return [UnoAudio (file = ExternalFile (url = audio_url ))]
945989
946990
991+ @beartype
947992@_process_node_to_blocks .register
948993def _ (
949- node : PdfNode ,
994+ node : _PdfNode ,
950995 * ,
951996 section_level : int ,
952997) -> list [Block ]:
@@ -966,6 +1011,7 @@ def _(
9661011 return [UnoPDF (file = ExternalFile (url = pdf_url ))]
9671012
9681013
1014+ @beartype
9691015@_process_node_to_blocks .register
9701016def _ (
9711017 node : nodes .container ,
@@ -1001,6 +1047,7 @@ def _(
10011047 ]
10021048
10031049
1050+ @beartype
10041051@_process_node_to_blocks .register
10051052def _ (
10061053 node : nodes .comment ,
@@ -1016,6 +1063,7 @@ def _(
10161063 return []
10171064
10181065
1066+ @beartype
10191067@_process_node_to_blocks .register
10201068def _ (
10211069 node : nodes .document ,
@@ -1069,36 +1117,17 @@ def depart_section(self, node: nodes.Element) -> None:
10691117 del node
10701118 self ._section_level -= 1
10711119
1072- @beartype
1073- def _serialize_blocks (
1074- self ,
1075- * ,
1076- blocks : list [Block ],
1077- ) -> list [dict [str , Any ]]:
1078- """
1079- Convert the block tree to a JSON-serializable format, ignoring IDs from
1080- tuples.
1081- """
1082- result : list [dict [str , Any ]] = []
1083- for block in blocks :
1084- serialized_obj = block .obj_ref .serialize_for_api ()
1085- if isinstance (block , ChildrenMixin ) and block .children :
1086- serialized_obj [block .obj_ref .type ]["children" ] = (
1087- self ._serialize_blocks (
1088- blocks = list (block .children ),
1089- )
1090- )
1091- result .append (serialized_obj )
1092- return result
1093-
10941120 def depart_document (self , node : nodes .Element ) -> None :
10951121 """
10961122 Output collected block tree as JSON at document end.
10971123 """
10981124 del node
10991125
11001126 json_output = json .dumps (
1101- obj = self ._serialize_blocks (blocks = self ._blocks ),
1127+ obj = [
1128+ _serialize_block_with_children (block = block )
1129+ for block in self ._blocks
1130+ ],
11021131 indent = 2 ,
11031132 ensure_ascii = False ,
11041133 )
@@ -1125,7 +1154,7 @@ def _notion_register_pdf_include_directive(
11251154 if isinstance (app .builder , NotionBuilder ):
11261155 sphinx_docutils .register_directive (
11271156 name = "pdf-include" ,
1128- directive = NotionPdfIncludeDirective ,
1157+ directive = _NotionPdfIncludeDirective ,
11291158 )
11301159 # We ignore coverage here but we do have a ``pre-commit`` hook that checks
11311160 # for the HTML builder at least passing.
0 commit comments