Skip to content

Commit 04406d5

Browse files
authored
Merge pull request #64 from dstengle/claude/markdown-to-graph-processor-011CUpuvxAn2hbzC5SaNFv8x
Process Markdown into Graph Structure
2 parents c05014e + 29c2805 commit 04406d5

File tree

70 files changed

+3904
-72
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+3904
-72
lines changed

scripts/regenerate_spec_outputs.py

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
#!/usr/bin/env python3
2+
"""
3+
Script to regenerate expected outputs for all specification tests.
4+
5+
This should be run when the processor output format changes to update
6+
all test expectations to match the current behavior.
7+
"""
8+
9+
import sys
10+
from pathlib import Path
11+
12+
# Add src to path
13+
sys.path.insert(0, str(Path(__file__).parent.parent / "src"))
14+
15+
from knowledgebase_processor.processor.processor import Processor
16+
from knowledgebase_processor.utils.document_registry import DocumentRegistry
17+
from knowledgebase_processor.utils.id_generator import EntityIdGenerator
18+
from knowledgebase_processor.extractor.markdown import MarkdownExtractor
19+
from knowledgebase_processor.extractor.frontmatter import FrontmatterExtractor
20+
from knowledgebase_processor.extractor.heading_section import HeadingSectionExtractor
21+
from knowledgebase_processor.extractor.link_reference import LinkReferenceExtractor
22+
from knowledgebase_processor.extractor.code_quote import CodeQuoteExtractor
23+
from knowledgebase_processor.extractor.todo_item import TodoItemExtractor
24+
from knowledgebase_processor.extractor.tags import TagExtractor
25+
from knowledgebase_processor.extractor.list_table import ListTableExtractor
26+
27+
28+
def setup_processor():
29+
"""Setup a processor with all necessary extractors."""
30+
document_registry = DocumentRegistry()
31+
id_generator = EntityIdGenerator(base_url="http://example.org/kb/")
32+
33+
processor = Processor(
34+
document_registry=document_registry,
35+
id_generator=id_generator,
36+
config=None,
37+
)
38+
39+
# Register all extractors
40+
processor.register_extractor(MarkdownExtractor())
41+
processor.register_extractor(FrontmatterExtractor())
42+
processor.register_extractor(HeadingSectionExtractor())
43+
processor.register_extractor(LinkReferenceExtractor())
44+
processor.register_extractor(CodeQuoteExtractor())
45+
processor.register_extractor(TodoItemExtractor())
46+
processor.register_extractor(TagExtractor())
47+
processor.register_extractor(ListTableExtractor())
48+
49+
return processor
50+
51+
52+
def regenerate_all_outputs():
53+
"""Regenerate expected outputs for all test cases."""
54+
specs_dir = Path(__file__).parent.parent / "specs" / "test_cases"
55+
56+
if not specs_dir.exists():
57+
print(f"Error: Test cases directory not found: {specs_dir}")
58+
return 1
59+
60+
test_case_dirs = sorted([d for d in specs_dir.iterdir() if d.is_dir()])
61+
62+
if not test_case_dirs:
63+
print(f"Error: No test case directories found in {specs_dir}")
64+
return 1
65+
66+
print(f"Found {len(test_case_dirs)} test cases to regenerate")
67+
print()
68+
69+
success_count = 0
70+
error_count = 0
71+
72+
for test_case_dir in test_case_dirs:
73+
input_file = test_case_dir / "input.md"
74+
output_file = test_case_dir / "expected_output.ttl"
75+
76+
if not input_file.exists():
77+
print(f"⚠️ Skipping {test_case_dir.name}: input.md not found")
78+
error_count += 1
79+
continue
80+
81+
try:
82+
# Setup fresh processor for each test
83+
processor = setup_processor()
84+
85+
# Read input
86+
content = input_file.read_text(encoding='utf-8')
87+
88+
# Process to graph
89+
document_id = f"test_cases/{test_case_dir.name}"
90+
graph = processor.process_content_to_graph(content, document_id=document_id)
91+
92+
# Write expected output
93+
output_file.write_text(graph.serialize(format='turtle'), encoding='utf-8')
94+
95+
print(f"✅ {test_case_dir.name}")
96+
success_count += 1
97+
98+
except Exception as e:
99+
print(f"❌ {test_case_dir.name}: {str(e)}")
100+
error_count += 1
101+
102+
print()
103+
print(f"Summary: {success_count} succeeded, {error_count} failed")
104+
105+
return 0 if error_count == 0 else 1
106+
107+
108+
if __name__ == "__main__":
109+
sys.exit(regenerate_all_outputs())

specs/test_cases/code_01_empty_document/expected_output.ttl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,7 @@
1010
kb:originalPath "temp_document.md"^^xsd:string ;
1111
kb:pathWithoutExtension "temp_document"^^xsd:string ;
1212
kb:sourceDocument <http://example.org/kb/vocab#/test_cases/code_01_empty_document> ;
13-
rdfs:seeAlso <http://example.org/kb/vocab#/test_cases/code_01_empty_document> .
13+
rdfs:seeAlso <http://example.org/kb/vocab#/test_cases/code_01_empty_document> ;
14+
schema:dateCreated "2025-11-05T14:56:11.529068+00:00"^^xsd:dateTime ;
15+
schema:dateModified "2025-11-05T14:56:11.529074+00:00"^^xsd:dateTime .
1416

specs/test_cases/code_02_no_language/expected_output.ttl

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,42 @@
33
@prefix schema: <https://schema.org/> .
44
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
55

6+
<http://example.org/kb/documents/test_cases/code_02_no_language/code/unknown-pos-0-2> a kb:CodeBlock,
7+
kb:Entity,
8+
schema:SoftwareSourceCode ;
9+
rdfs:label "unknown code block"^^xsd:string ;
10+
kb:lineCount 1 ;
11+
kb:positionEnd 2 ;
12+
kb:positionStart 0 ;
13+
kb:sourceDocument <http://example.org/kb/vocab#/test_cases/code_02_no_language> ;
14+
rdfs:seeAlso <http://example.org/kb/documents/test_cases/code_02_no_language/code/unknown-pos-0-2> ;
15+
schema:dateCreated "2025-11-05T14:56:11.536445+00:00"^^xsd:dateTime ;
16+
schema:dateModified "2025-11-05T14:56:11.536445+00:00"^^xsd:dateTime ;
17+
schema:text "print('Hello, world!')"^^xsd:string .
18+
19+
<http://example.org/kb/documents/test_cases/code_02_no_language/code/unknown-pos-0-3> a kb:CodeBlock,
20+
kb:Entity,
21+
schema:SoftwareSourceCode ;
22+
rdfs:label "unknown code block"^^xsd:string ;
23+
kb:lineCount 1 ;
24+
kb:positionEnd 3 ;
25+
kb:positionStart 0 ;
26+
kb:sourceDocument <http://example.org/kb/vocab#/test_cases/code_02_no_language> ;
27+
rdfs:seeAlso <http://example.org/kb/documents/test_cases/code_02_no_language/code/unknown-pos-0-3> ;
28+
schema:dateCreated "2025-11-05T14:56:11.536400+00:00"^^xsd:dateTime ;
29+
schema:dateModified "2025-11-05T14:56:11.536402+00:00"^^xsd:dateTime ;
30+
schema:programmingLanguage ""^^xsd:string ;
31+
schema:text """print('Hello, world!')
32+
"""^^xsd:string .
33+
634
<http://example.org/kb/vocab#/test_cases/code_02_no_language> a kb:Document,
735
kb:Entity,
836
schema:CreativeWork ;
937
rdfs:label "Temporary Document"^^xsd:string ;
1038
kb:originalPath "temp_document.md"^^xsd:string ;
1139
kb:pathWithoutExtension "temp_document"^^xsd:string ;
1240
kb:sourceDocument <http://example.org/kb/vocab#/test_cases/code_02_no_language> ;
13-
rdfs:seeAlso <http://example.org/kb/vocab#/test_cases/code_02_no_language> .
41+
rdfs:seeAlso <http://example.org/kb/vocab#/test_cases/code_02_no_language> ;
42+
schema:dateCreated "2025-11-05T14:56:11.535768+00:00"^^xsd:dateTime ;
43+
schema:dateModified "2025-11-05T14:56:11.535770+00:00"^^xsd:dateTime .
1444

specs/test_cases/code_03_with_language/expected_output.ttl

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,43 @@
33
@prefix schema: <https://schema.org/> .
44
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
55

6+
<http://example.org/kb/documents/test_cases/code_03_with_language/code/python-pos-0-2> a kb:CodeBlock,
7+
kb:Entity,
8+
schema:SoftwareSourceCode ;
9+
rdfs:label "python code block"^^xsd:string ;
10+
kb:lineCount 1 ;
11+
kb:positionEnd 2 ;
12+
kb:positionStart 0 ;
13+
kb:sourceDocument <http://example.org/kb/vocab#/test_cases/code_03_with_language> ;
14+
rdfs:seeAlso <http://example.org/kb/documents/test_cases/code_03_with_language/code/python-pos-0-2> ;
15+
schema:dateCreated "2025-11-05T14:56:11.540675+00:00"^^xsd:dateTime ;
16+
schema:dateModified "2025-11-05T14:56:11.540676+00:00"^^xsd:dateTime ;
17+
schema:programmingLanguage "python"^^xsd:string ;
18+
schema:text "print('Hello, world!')"^^xsd:string .
19+
20+
<http://example.org/kb/documents/test_cases/code_03_with_language/code/python-pos-0-3> a kb:CodeBlock,
21+
kb:Entity,
22+
schema:SoftwareSourceCode ;
23+
rdfs:label "python code block"^^xsd:string ;
24+
kb:lineCount 1 ;
25+
kb:positionEnd 3 ;
26+
kb:positionStart 0 ;
27+
kb:sourceDocument <http://example.org/kb/vocab#/test_cases/code_03_with_language> ;
28+
rdfs:seeAlso <http://example.org/kb/documents/test_cases/code_03_with_language/code/python-pos-0-3> ;
29+
schema:dateCreated "2025-11-05T14:56:11.540647+00:00"^^xsd:dateTime ;
30+
schema:dateModified "2025-11-05T14:56:11.540648+00:00"^^xsd:dateTime ;
31+
schema:programmingLanguage "python"^^xsd:string ;
32+
schema:text """print('Hello, world!')
33+
"""^^xsd:string .
34+
635
<http://example.org/kb/vocab#/test_cases/code_03_with_language> a kb:Document,
736
kb:Entity,
837
schema:CreativeWork ;
938
rdfs:label "Temporary Document"^^xsd:string ;
1039
kb:originalPath "temp_document.md"^^xsd:string ;
1140
kb:pathWithoutExtension "temp_document"^^xsd:string ;
1241
kb:sourceDocument <http://example.org/kb/vocab#/test_cases/code_03_with_language> ;
13-
rdfs:seeAlso <http://example.org/kb/vocab#/test_cases/code_03_with_language> .
42+
rdfs:seeAlso <http://example.org/kb/vocab#/test_cases/code_03_with_language> ;
43+
schema:dateCreated "2025-11-05T14:56:11.540293+00:00"^^xsd:dateTime ;
44+
schema:dateModified "2025-11-05T14:56:11.540294+00:00"^^xsd:dateTime .
1445

specs/test_cases/code_04_multiple_blocks/expected_output.ttl

Lines changed: 106 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,117 @@
33
@prefix schema: <https://schema.org/> .
44
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
55

6+
<http://example.org/kb/documents/test_cases/code_04_multiple_blocks/code/javascript-pos-11-15> a kb:CodeBlock,
7+
kb:Entity,
8+
schema:SoftwareSourceCode ;
9+
rdfs:label "javascript code block"^^xsd:string ;
10+
kb:lineCount 3 ;
11+
kb:positionEnd 15 ;
12+
kb:positionStart 11 ;
13+
kb:sourceDocument <http://example.org/kb/vocab#/test_cases/code_04_multiple_blocks> ;
14+
rdfs:seeAlso <http://example.org/kb/documents/test_cases/code_04_multiple_blocks/code/javascript-pos-11-15> ;
15+
schema:dateCreated "2025-11-05T14:56:11.545508+00:00"^^xsd:dateTime ;
16+
schema:dateModified "2025-11-05T14:56:11.545508+00:00"^^xsd:dateTime ;
17+
schema:programmingLanguage "javascript"^^xsd:string ;
18+
schema:text """function hello() {
19+
console.log('Hello, world!');
20+
}"""^^xsd:string .
21+
22+
<http://example.org/kb/documents/test_cases/code_04_multiple_blocks/code/javascript-pos-11-16> a kb:CodeBlock,
23+
kb:Entity,
24+
schema:SoftwareSourceCode ;
25+
rdfs:label "javascript code block"^^xsd:string ;
26+
kb:lineCount 3 ;
27+
kb:positionEnd 16 ;
28+
kb:positionStart 11 ;
29+
kb:sourceDocument <http://example.org/kb/vocab#/test_cases/code_04_multiple_blocks> ;
30+
rdfs:seeAlso <http://example.org/kb/documents/test_cases/code_04_multiple_blocks/code/javascript-pos-11-16> ;
31+
schema:dateCreated "2025-11-05T14:56:11.545423+00:00"^^xsd:dateTime ;
32+
schema:dateModified "2025-11-05T14:56:11.545423+00:00"^^xsd:dateTime ;
33+
schema:programmingLanguage "javascript"^^xsd:string ;
34+
schema:text """function hello() {
35+
console.log('Hello, world!');
36+
}
37+
"""^^xsd:string .
38+
39+
<http://example.org/kb/documents/test_cases/code_04_multiple_blocks/code/python-pos-4-7> a kb:CodeBlock,
40+
kb:Entity,
41+
schema:SoftwareSourceCode ;
42+
rdfs:label "python code block"^^xsd:string ;
43+
kb:lineCount 2 ;
44+
kb:positionEnd 7 ;
45+
kb:positionStart 4 ;
46+
kb:sourceDocument <http://example.org/kb/vocab#/test_cases/code_04_multiple_blocks> ;
47+
rdfs:seeAlso <http://example.org/kb/documents/test_cases/code_04_multiple_blocks/code/python-pos-4-7> ;
48+
schema:dateCreated "2025-11-05T14:56:11.545482+00:00"^^xsd:dateTime ;
49+
schema:dateModified "2025-11-05T14:56:11.545483+00:00"^^xsd:dateTime ;
50+
schema:programmingLanguage "python"^^xsd:string ;
51+
schema:text """def hello():
52+
print('Hello, world!')"""^^xsd:string .
53+
54+
<http://example.org/kb/documents/test_cases/code_04_multiple_blocks/code/python-pos-4-8> a kb:CodeBlock,
55+
kb:Entity,
56+
schema:SoftwareSourceCode ;
57+
rdfs:label "python code block"^^xsd:string ;
58+
kb:lineCount 2 ;
59+
kb:positionEnd 8 ;
60+
kb:positionStart 4 ;
61+
kb:sourceDocument <http://example.org/kb/vocab#/test_cases/code_04_multiple_blocks> ;
62+
rdfs:seeAlso <http://example.org/kb/documents/test_cases/code_04_multiple_blocks/code/python-pos-4-8> ;
63+
schema:dateCreated "2025-11-05T14:56:11.545399+00:00"^^xsd:dateTime ;
64+
schema:dateModified "2025-11-05T14:56:11.545400+00:00"^^xsd:dateTime ;
65+
schema:programmingLanguage "python"^^xsd:string ;
66+
schema:text """def hello():
67+
print('Hello, world!')
68+
"""^^xsd:string .
69+
70+
<http://example.org/kb/documents/test_cases/code_04_multiple_blocks/section/pos-0-16> a kb:Entity,
71+
kb:Section,
72+
schema:Article ;
73+
rdfs:label "Section 0-16"^^xsd:string ;
74+
kb:hasHeading <http://example.org/kb/documents/test_cases/code_04_multiple_blocks/heading/h1-code-examples> ;
75+
kb:positionEnd 16 ;
76+
kb:positionStart 0 ;
77+
kb:sourceDocument <http://example.org/kb/vocab#/test_cases/code_04_multiple_blocks> ;
78+
rdfs:seeAlso <http://example.org/kb/documents/test_cases/code_04_multiple_blocks/section/pos-0-16> ;
79+
schema:dateCreated "2025-11-05T14:56:11.545371+00:00"^^xsd:dateTime ;
80+
schema:dateModified "2025-11-05T14:56:11.545372+00:00"^^xsd:dateTime .
81+
82+
<http://example.org/kb/documents/test_cases/code_04_multiple_blocks/section/pos-1-15> a kb:Entity,
83+
kb:Section,
84+
schema:Article ;
85+
rdfs:label "Section 1-15"^^xsd:string ;
86+
kb:hasHeading <http://example.org/kb/documents/test_cases/code_04_multiple_blocks/heading/h1-code-examples> ;
87+
kb:positionEnd 15 ;
88+
kb:positionStart 1 ;
89+
kb:sourceDocument <http://example.org/kb/vocab#/test_cases/code_04_multiple_blocks> ;
90+
rdfs:seeAlso <http://example.org/kb/documents/test_cases/code_04_multiple_blocks/section/pos-1-15> ;
91+
schema:dateCreated "2025-11-05T14:56:11.545461+00:00"^^xsd:dateTime ;
92+
schema:dateModified "2025-11-05T14:56:11.545462+00:00"^^xsd:dateTime .
93+
94+
<http://example.org/kb/documents/test_cases/code_04_multiple_blocks/heading/h1-code-examples> a kb:Entity,
95+
kb:Heading,
96+
schema:Article ;
97+
rdfs:label "Code Examples"^^xsd:string ;
98+
kb:headingLevel 1 ;
99+
kb:positionEnd 0 ;
100+
kb:positionStart 0 ;
101+
kb:sourceDocument <http://example.org/kb/vocab#/test_cases/code_04_multiple_blocks> ;
102+
rdfs:seeAlso <http://example.org/kb/documents/test_cases/code_04_multiple_blocks/heading/h1-code-examples> ;
103+
schema:dateCreated "2025-11-05T14:56:11.545336+00:00"^^xsd:dateTime,
104+
"2025-11-05T14:56:11.545441+00:00"^^xsd:dateTime ;
105+
schema:dateModified "2025-11-05T14:56:11.545337+00:00"^^xsd:dateTime,
106+
"2025-11-05T14:56:11.545441+00:00"^^xsd:dateTime ;
107+
schema:headline "Code Examples"^^xsd:string .
108+
6109
<http://example.org/kb/vocab#/test_cases/code_04_multiple_blocks> a kb:Document,
7110
kb:Entity,
8111
schema:CreativeWork ;
9112
rdfs:label "Temporary Document"^^xsd:string ;
10113
kb:originalPath "temp_document.md"^^xsd:string ;
11114
kb:pathWithoutExtension "temp_document"^^xsd:string ;
12115
kb:sourceDocument <http://example.org/kb/vocab#/test_cases/code_04_multiple_blocks> ;
13-
rdfs:seeAlso <http://example.org/kb/vocab#/test_cases/code_04_multiple_blocks> .
116+
rdfs:seeAlso <http://example.org/kb/vocab#/test_cases/code_04_multiple_blocks> ;
117+
schema:dateCreated "2025-11-05T14:56:11.544454+00:00"^^xsd:dateTime ;
118+
schema:dateModified "2025-11-05T14:56:11.544455+00:00"^^xsd:dateTime .
14119

specs/test_cases/code_05_simple_blockquote/expected_output.ttl

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,29 @@
33
@prefix schema: <https://schema.org/> .
44
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
55

6+
<http://example.org/kb/documents/test_cases/code_05_simple_blockquote/blockquote/this-is-a-blockquote> a kb:Blockquote,
7+
kb:Entity,
8+
schema:Quotation ;
9+
rdfs:label "This is a blockquote."^^xsd:string ;
10+
kb:nestingLevel 1 ;
11+
kb:positionEnd 0 ;
12+
kb:positionStart 0 ;
13+
kb:sourceDocument <http://example.org/kb/vocab#/test_cases/code_05_simple_blockquote> ;
14+
rdfs:seeAlso <http://example.org/kb/documents/test_cases/code_05_simple_blockquote/blockquote/this-is-a-blockquote> ;
15+
schema:dateCreated "2025-11-05T14:56:11.557517+00:00"^^xsd:dateTime,
16+
"2025-11-05T14:56:11.557547+00:00"^^xsd:dateTime ;
17+
schema:dateModified "2025-11-05T14:56:11.557518+00:00"^^xsd:dateTime,
18+
"2025-11-05T14:56:11.557547+00:00"^^xsd:dateTime ;
19+
schema:text "This is a blockquote."^^xsd:string .
20+
621
<http://example.org/kb/vocab#/test_cases/code_05_simple_blockquote> a kb:Document,
722
kb:Entity,
823
schema:CreativeWork ;
924
rdfs:label "Temporary Document"^^xsd:string ;
1025
kb:originalPath "temp_document.md"^^xsd:string ;
1126
kb:pathWithoutExtension "temp_document"^^xsd:string ;
1227
kb:sourceDocument <http://example.org/kb/vocab#/test_cases/code_05_simple_blockquote> ;
13-
rdfs:seeAlso <http://example.org/kb/vocab#/test_cases/code_05_simple_blockquote> .
28+
rdfs:seeAlso <http://example.org/kb/vocab#/test_cases/code_05_simple_blockquote> ;
29+
schema:dateCreated "2025-11-05T14:56:11.557057+00:00"^^xsd:dateTime ;
30+
schema:dateModified "2025-11-05T14:56:11.557058+00:00"^^xsd:dateTime .
1431

specs/test_cases/code_06_multiline_blockquote/expected_output.ttl

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,34 @@
33
@prefix schema: <https://schema.org/> .
44
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
55

6+
<http://example.org/kb/documents/test_cases/code_06_multiline_blockquote/blockquote/this-is-a-blockquote-with-multiple-lines-spanning> a kb:Blockquote,
7+
kb:Entity,
8+
schema:Quotation ;
9+
rdfs:label """This is a blockquote
10+
with multiple lines
11+
spanning """^^xsd:string ;
12+
kb:nestingLevel 1 ;
13+
kb:positionEnd 0,
14+
2 ;
15+
kb:positionStart 0 ;
16+
kb:sourceDocument <http://example.org/kb/vocab#/test_cases/code_06_multiline_blockquote> ;
17+
rdfs:seeAlso <http://example.org/kb/documents/test_cases/code_06_multiline_blockquote/blockquote/this-is-a-blockquote-with-multiple-lines-spanning> ;
18+
schema:dateCreated "2025-11-05T14:56:11.561652+00:00"^^xsd:dateTime,
19+
"2025-11-05T14:56:11.561678+00:00"^^xsd:dateTime ;
20+
schema:dateModified "2025-11-05T14:56:11.561653+00:00"^^xsd:dateTime,
21+
"2025-11-05T14:56:11.561678+00:00"^^xsd:dateTime ;
22+
schema:text """This is a blockquote
23+
with multiple lines
24+
spanning three lines."""^^xsd:string .
25+
626
<http://example.org/kb/vocab#/test_cases/code_06_multiline_blockquote> a kb:Document,
727
kb:Entity,
828
schema:CreativeWork ;
929
rdfs:label "Temporary Document"^^xsd:string ;
1030
kb:originalPath "temp_document.md"^^xsd:string ;
1131
kb:pathWithoutExtension "temp_document"^^xsd:string ;
1232
kb:sourceDocument <http://example.org/kb/vocab#/test_cases/code_06_multiline_blockquote> ;
13-
rdfs:seeAlso <http://example.org/kb/vocab#/test_cases/code_06_multiline_blockquote> .
33+
rdfs:seeAlso <http://example.org/kb/vocab#/test_cases/code_06_multiline_blockquote> ;
34+
schema:dateCreated "2025-11-05T14:56:11.561148+00:00"^^xsd:dateTime ;
35+
schema:dateModified "2025-11-05T14:56:11.561149+00:00"^^xsd:dateTime .
1436

0 commit comments

Comments
 (0)