This commit is contained in:
fenris 2026-02-23 20:16:38 +01:00
parent a605e5713d
commit c51f6d12b0
7 changed files with 379 additions and 13 deletions

View file

@ -1,7 +1,233 @@
{
"definitions": {
"doc_object": {
"anyOf": [
{
"type": "
"type": "object",
"reqired": [
"kind",
"data"
],
"properties": {
"kind": {
"type": "string",
"enum": ["code"]
},
"data": {
"type": "object",
"reqired": [
"content"
],
"properties": {
"content": {
"type": "string"
}
}
}
}
},
{
"type": "object",
"reqired": [
"kind",
"data"
],
"properties": {
"kind": {
"type": "string",
"enum": ["text"]
},
"data": {
"type": "object",
"reqired": [
"content"
],
"properties": {
"content": {
"type": "string"
}
}
}
}
},
{
"type": "object",
"reqired": [
"kind",
"data"
],
"properties": {
"kind": {
"type": "string",
"enum": ["link"]
},
"data": {
"type": "object",
"reqired": [
"target",
"label"
],
"properties": {
"target": {
"type": "string"
},
"label": {
"nullable": true,
"type": "string"
}
}
}
}
},
{
"type": "object",
"reqired": [
"kind",
"data"
],
"properties": {
"kind": {
"type": "string",
"enum": ["section"]
},
"data": {
"type": "object",
"required": [
"title",
"content"
],
"properties": {
"title": {
"type": "string"
},
"content": {
"$ref": "#/definitions/doc_object"
}
}
}
}
},
{
"type": "object",
"reqired": [
"kind",
"data"
],
"properties": {
"kind": {
"type": "string",
"enum": ["group"]
},
"data": {
"type": "object",
"required": [
"members"
],
"properties": {
"members": {
"type": "array",
"items": {
"$ref": "#/definitions/doc_object"
}
}
}
}
}
},
{
"type": "object",
"reqired": [
"kind",
"data"
],
"properties": {
"kind": {
"type": "string",
"enum": ["list"]
},
"data": {
"type": "object",
"required": [
"items"
],
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/definitions/doc_object"
}
}
}
}
}
},
{
"type": "object",
"reqired": [
"kind",
"data"
],
"properties": {
"kind": {
"type": "string",
"enum": ["table"]
},
"data": {
"type": "object",
"required": [
"head",
"rows"
],
"properties": {
"head": {
"nullable": true,
"type": "array",
"items": {
"$ref": "#/definitions/doc_object"
}
},
"rows": {
"type": "array",
"items": {
"type": "array",
"items": {
"$ref": "#/definitions/doc_object"
}
}
}
}
}
}
}
]
}
},
"type": "object",
"required": [
"definitions",
"content"
],
"properties": {
"definitions": {
"type": "object",
"additionalProperties": {
"$ref": "#/definitions/doc_object"
}
},
"content": {
"type": "object",
"required": [
"title",
"main"
],
"properties": {
"title": {
"type": "string"
},
"main": {
"$ref": "#/definitions/doc_object"
}
}
}
}
}

28
readme.md Normal file
View file

@ -0,0 +1,28 @@
# docdef
zum Erzeugen von Dokumenten anhand von JSON-Daten
## Nutzung
Am beigefügten Beispiel `polyhedra`:
```sh
misc/conv misc/examples/polyhedra/transform-default.js misc/examples/polyhedra/data.json | build/sd -o markdown > /tmp/polyhedra-default.md
```
Der erste Teil (vor der Pipe) transformiert die rohen Daten in ein ein JSON-Dokument im `sd`-Dialekt. `build/sd -o markdown` liest dieses Dokument von der Standard-Eingabe und erzeugt die Ausgabe im Markdown-Format.
Folgende Abwandlungen sind möglich:
```sh
# Markdown-Tabelle
misc/conv misc/examples/polyhedra/transform-table.js misc/examples/polyhedra/data.json | build/sd -o markdown > /tmp/polyhedra-table.md
# HTML-Liste
misc/conv misc/examples/polyhedra/transform-default.js misc/examples/polyhedra/data.json | build/sd -o html > /tmp/polyhedra-default.html
# HTML-Tabelle
misc/conv misc/examples/polyhedra/transform-table.js misc/examples/polyhedra/data.json | build/sd -o html > /tmp/polyhedra-table.html
```

View file

@ -2,7 +2,9 @@
/**
*/
type type_object_group_data = {
members : type_object;
members : Array<
type_object
>;
};

View file

@ -2,7 +2,9 @@
/**
*/
type type_object_list_data = {
items : Array<type_object>;
items : Array<
type_object
>;
};

View file

@ -2,8 +2,18 @@
/**
*/
type type_object_table_data = {
head : (null | Array<type_object>);
rows : Array<Array<type_object>>;
head : (
null
|
Array<
type_object
>
);
rows : Array<
Array<
type_object
>
>;
};

View file

@ -57,6 +57,30 @@ class type_output_html implements type_output<string>
: [new lib_plankton.xml.class_node_text(label)]
)
),
"image": ({"url": url, "label": label}) => new lib_plankton.xml.class_node_complex(
"img",
{
"class": "sd-image",
"alt": label,
"src": url,
},
[]
),
"paragraph": ({"content": content}) => new lib_plankton.xml.class_node_complex(
"p",
{
"class": "sd-paragraph",
},
[
this.render_object_internal(
content,
{
"level": options.level,
"depth": (options.depth + 1),
}
),
]
),
"section": ({"title": title, "content": content}) => new lib_plankton.xml.class_node_complex(
"section",
{

View file

@ -48,13 +48,33 @@ class type_output_markdown implements type_output<string>
"label": label,
}
),
"image": ({"url": url, "label": label}) => lib_plankton.string.coin(
"![{{label}}]({{url}})",
{
"url": url,
"label": label,
}
),
"paragraph": ({"content": content}) => lib_plankton.string.coin(
"{{content}}\n\n",
{
"content": this.render_object_internal(
content,
{
"depth": (options.depth + 1),
"headline_level": options.headline_level,
"list_level": options.list_level,
}
),
}
),
"section": ({"title": title, "content": content}) => lib_plankton.string.coin(
"{{head}}\n\n{{body}}\n\n\n",
{
"head": lib_plankton.string.coin(
"{{prefix}} {{value}}",
{
"prefix": "#".repeat(options.level + 1),
"prefix": "#".repeat(options.headline_level + 1),
"value": title,
}
),
@ -62,7 +82,7 @@ class type_output_markdown implements type_output<string>
content,
{
"depth": (options.depth + 1),
"headline_level": (options.level + 1),
"headline_level": (options.headline_level + 1),
"list_level": options.list_level,
}
),
@ -78,7 +98,7 @@ class type_output_markdown implements type_output<string>
x,
{
"depth": options.depth,
"headline_level": options.level,
"headline_level": options.headline_level,
"list_level": options.list_level
}
)
@ -103,7 +123,7 @@ class type_output_markdown implements type_output<string>
item,
{
"depth": (options.depth + 1),
"headline_level": options.level,
"headline_level": options.headline_level,
"list_level": (options.list_level + 1),
}
),
@ -117,8 +137,62 @@ class type_output_markdown implements type_output<string>
}
),
"table": ({"head": head, "rows": rows}) => lib_plankton.string.coin(
"(unhandled)",
"{{head}}\n{{separation}}\n{{body}}\n\n",
{
"head": lib_plankton.string.coin(
"| {{entries}} |",
{
"entries": (
head
.map(
(object) => this.render_object_internal(
object,
{
"depth": (options.depth + 1),
"headline_level": options.headline_level,
"list_level": options.list_level,
}
),
)
.join(" | ")
),
}
),
"separation": lib_plankton.string.coin(
"| {{entries}} |",
{
"entries": (
head
.map((object) => "-- ")
.join(" | ")
),
}
),
"body": (
rows
.map(
row => lib_plankton.string.coin(
"| {{entries}} |",
{
"entries": (
row
.map(
(object) => this.render_object_internal(
object,
{
"depth": (options.depth + 1),
"headline_level": options.headline_level,
"list_level": options.list_level,
}
),
)
.join(" | ")
),
}
)
)
.join("\n")
),
}
),
},