Skip to content

Commit b9478d0

Browse files
add ol and ul
1 parent 4f2ac2e commit b9478d0

File tree

15 files changed

+591
-303
lines changed

15 files changed

+591
-303
lines changed

CLAUDE.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,4 +123,8 @@ The TypeScript implementation is in progress, following similar architecture to
123123
3. The core functionality is focused on:
124124
- Loading JSON-DOC files into typed objects
125125
- Validating JSON-DOC files against schemas
126-
- Converting between JSON-DOC and other formats
126+
- Converting between JSON-DOC and other formats
127+
128+
129+
# Code generation guidelines
130+
- don's assume things, if some things are clear, ask for clarification

python/jsondoc/convert/html.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
create_h3_block,
2626
create_image_block,
2727
create_numbered_list_item_block,
28+
create_unordered_list_block,
29+
create_ordered_list_block,
2830
create_page,
2931
create_paragraph_block,
3032
create_quote_block,
@@ -756,15 +758,29 @@ def convert_img(self, el, convert_as_inline):
756758
)
757759
)
758760

759-
def convert_list(self, el, convert_as_inline):
761+
def convert_ul(self, el, convert_as_inline):
760762
"""
761-
This is applied to <ul> and <ol> tags. We simply return None, because
762-
there is no need for a container block for list items in JSON-DOC.
763+
This is applied to <ul> tags. Create an unordered_list container block.
764+
Children will be processed and added to this container.
763765
"""
764-
return None
766+
if convert_as_inline:
767+
return ConvertOutput(main_object=create_rich_text())
765768

766-
convert_ul = convert_list
767-
convert_ol = convert_list
769+
return ConvertOutput(
770+
main_object=create_unordered_list_block(typeid=self.options.typeid)
771+
)
772+
773+
def convert_ol(self, el, convert_as_inline):
774+
"""
775+
This is applied to <ol> tags. Create an ordered_list container block.
776+
Children will be processed and added to this container.
777+
"""
778+
if convert_as_inline:
779+
return ConvertOutput(main_object=create_rich_text())
780+
781+
return ConvertOutput(
782+
main_object=create_ordered_list_block(typeid=self.options.typeid)
783+
)
768784

769785
def convert_li(self, el, convert_as_inline):
770786
parent = el.parent

python/jsondoc/convert/utils.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@
3131
NumberedListItem,
3232
NumberedListItemBlock,
3333
)
34+
from jsondoc.models.block.types.unordered_list import (
35+
UnorderedList,
36+
UnorderedListBlock,
37+
)
38+
from jsondoc.models.block.types.ordered_list import (
39+
OrderedList,
40+
OrderedListBlock,
41+
)
3442
from jsondoc.models.block.types.paragraph import Paragraph, ParagraphBlock
3543
from jsondoc.models.block.types.quote import Quote, QuoteBlock
3644
from jsondoc.models.block.types.rich_text.base import RichTextBase
@@ -205,6 +213,46 @@ def create_numbered_list_item_block(
205213
)
206214

207215

216+
def create_unordered_list_block(
217+
children: List[BlockBase] | None = None,
218+
id: str | None = None,
219+
created_time=None,
220+
typeid: bool = False,
221+
) -> UnorderedListBlock:
222+
if id is None:
223+
id = generate_block_id(typeid=typeid)
224+
if created_time is None:
225+
created_time = get_current_time()
226+
227+
return UnorderedListBlock(
228+
id=id,
229+
created_time=created_time,
230+
unordered_list=UnorderedList(),
231+
has_children=children is not None and len(children) > 0,
232+
children=children or [],
233+
)
234+
235+
236+
def create_ordered_list_block(
237+
children: List[BlockBase] | None = None,
238+
id: str | None = None,
239+
created_time=None,
240+
typeid: bool = False,
241+
) -> OrderedListBlock:
242+
if id is None:
243+
id = generate_block_id(typeid=typeid)
244+
if created_time is None:
245+
created_time = get_current_time()
246+
247+
return OrderedListBlock(
248+
id=id,
249+
created_time=created_time,
250+
ordered_list=OrderedList(),
251+
has_children=children is not None and len(children) > 0,
252+
children=children or [],
253+
)
254+
255+
208256
def create_code_block(
209257
code: str | None = None,
210258
language: str | None = None,
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# generated by datamodel-codegen:
2+
# filename: ordered_list_schema.json
3+
# timestamp: 2024-12-19T10:00:00+00:00
4+
5+
from __future__ import annotations
6+
7+
from typing import List, Optional
8+
9+
from pydantic import BaseModel, ConfigDict
10+
from typing_extensions import Literal
11+
12+
from jsondoc.models.block.base import BlockBase
13+
14+
15+
class OrderedList(BaseModel):
16+
model_config = ConfigDict(
17+
extra="forbid",
18+
arbitrary_types_allowed=True,
19+
)
20+
21+
22+
class OrderedListBlock(BlockBase):
23+
model_config = ConfigDict(
24+
arbitrary_types_allowed=True,
25+
)
26+
type: Literal["ordered_list"] = "ordered_list"
27+
ordered_list: OrderedList
28+
children: Optional[List[BlockBase]] = None
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# generated by datamodel-codegen:
2+
# filename: unordered_list_schema.json
3+
# timestamp: 2024-12-19T10:00:00+00:00
4+
5+
from __future__ import annotations
6+
7+
from typing import List, Optional
8+
9+
from pydantic import BaseModel, ConfigDict
10+
from typing_extensions import Literal
11+
12+
from jsondoc.models.block.base import BlockBase
13+
14+
15+
class UnorderedList(BaseModel):
16+
model_config = ConfigDict(
17+
extra="forbid",
18+
arbitrary_types_allowed=True,
19+
)
20+
21+
22+
class UnorderedListBlock(BlockBase):
23+
model_config = ConfigDict(
24+
arbitrary_types_allowed=True,
25+
)
26+
type: Literal["unordered_list"] = "unordered_list"
27+
unordered_list: UnorderedList
28+
children: Optional[List[BlockBase]] = None

python/jsondoc/rules.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
from jsondoc.models.block.types.heading_3 import Heading3Block
1212
from jsondoc.models.block.types.image import ImageBlock
1313
from jsondoc.models.block.types.numbered_list_item import NumberedListItemBlock
14+
from jsondoc.models.block.types.unordered_list import UnorderedListBlock
15+
from jsondoc.models.block.types.ordered_list import OrderedListBlock
1416
from jsondoc.models.block.types.paragraph import ParagraphBlock
1517
from jsondoc.models.block.types.quote import QuoteBlock
1618
from jsondoc.models.block.types.table import TableBlock
@@ -33,6 +35,8 @@
3335
Heading3Block,
3436
ImageBlock,
3537
NumberedListItemBlock,
38+
UnorderedListBlock,
39+
OrderedListBlock,
3640
ParagraphBlock,
3741
QuoteBlock,
3842
TableBlock,
@@ -53,6 +57,8 @@
5357
Heading3Block: [],
5458
ImageBlock: [],
5559
NumberedListItemBlock: ALL_BLOCK_TYPES,
60+
UnorderedListBlock: [BulletedListItemBlock],
61+
OrderedListBlock: [NumberedListItemBlock],
5662
ParagraphBlock: ALL_BLOCK_TYPES,
5763
QuoteBlock: ALL_BLOCK_TYPES,
5864
TableBlock: [TableRowBlock],

schema/block/block_schema.json

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
"to_do",
1313
"bulleted_list_item",
1414
"numbered_list_item",
15+
"unordered_list",
16+
"ordered_list",
1517
"code",
1618
"column",
1719
"column_list",
@@ -87,6 +89,38 @@
8789
"unevaluatedProperties": false
8890
}
8991
},
92+
{
93+
"if": {
94+
"properties": { "type": { "const": "unordered_list" } }
95+
},
96+
"then": {
97+
"properties": {
98+
"type": { "const": "unordered_list" }
99+
},
100+
"allOf": [
101+
{
102+
"$ref": "/block/types/unordered_list/unordered_list_schema.json"
103+
}
104+
],
105+
"unevaluatedProperties": false
106+
}
107+
},
108+
{
109+
"if": {
110+
"properties": { "type": { "const": "ordered_list" } }
111+
},
112+
"then": {
113+
"properties": {
114+
"type": { "const": "ordered_list" }
115+
},
116+
"allOf": [
117+
{
118+
"$ref": "/block/types/ordered_list/ordered_list_schema.json"
119+
}
120+
],
121+
"unevaluatedProperties": false
122+
}
123+
},
90124
{
91125
"if": {
92126
"properties": { "type": { "const": "code" } }
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Ordered list container block
2+
{
3+
"$schema": "https://json-schema.org/draft/2020-12/schema",
4+
"title": "OrderedListBlock",
5+
"customBasePath": "jsondoc.models.block.base.BlockBase",
6+
"type": "object",
7+
"allOf": [{ "$ref": "/block/base/base_schema.json" }],
8+
"properties": {
9+
"type": {
10+
"type": "string",
11+
"const": "ordered_list",
12+
"default": "ordered_list"
13+
},
14+
"ordered_list": {
15+
"type": "object",
16+
"properties": {},
17+
"additionalProperties": false
18+
},
19+
"children": {
20+
"type": "array",
21+
"items": {
22+
"$ref": "/block/block_schema.json"
23+
}
24+
}
25+
},
26+
"required": ["type", "ordered_list"],
27+
"unevaluatedProperties": false
28+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Unordered list container block
2+
{
3+
"$schema": "https://json-schema.org/draft/2020-12/schema",
4+
"title": "UnorderedListBlock",
5+
"customBasePath": "jsondoc.models.block.base.BlockBase",
6+
"type": "object",
7+
"allOf": [{ "$ref": "/block/base/base_schema.json" }],
8+
"properties": {
9+
"type": {
10+
"type": "string",
11+
"const": "unordered_list",
12+
"default": "unordered_list"
13+
},
14+
"unordered_list": {
15+
"type": "object",
16+
"properties": {},
17+
"additionalProperties": false
18+
},
19+
"children": {
20+
"type": "array",
21+
"items": {
22+
"$ref": "/block/block_schema.json"
23+
}
24+
}
25+
},
26+
"required": ["type", "unordered_list"],
27+
"unevaluatedProperties": false
28+
}

0 commit comments

Comments
 (0)