[add] object:link [add] object:code [add] object:table [add] misc:conv [mod] example:polyhedra

This commit is contained in:
fenris 2024-02-08 21:08:58 +01:00
parent f751b57ab9
commit 19f045e25b
15 changed files with 385 additions and 301 deletions

21
misc/conv Executable file
View file

@ -0,0 +1,21 @@
#!/usr/bin/env node
function main(args)
{
// args
const path_transform = ((args.length >= 0) ? args.shift() : "transform.js");
const path_data = ((args.length >= 0) ? args.shift() : "data.json");
// exec
const _fs = require("fs");
const data = JSON.parse(_fs.readFileSync(path_data).toString());
const transformation_code = _fs.readFileSync(path_transform).toString()
const sd = eval(transformation_code)(data);
// output
const output = (JSON.stringify(sd, undefined, "\t") + "\n");
process.stdout.write(output);
}
main(process.argv.slice(2));

View file

@ -1,23 +0,0 @@
{
"group": {
"attributes": [
"members"
]
},
"section": {
"attributes": [
"title",
"content"
]
},
"list": {
"attributes": [
"items"
]
},
"text": {
"attributes": [
"content"
]
}
}

View file

@ -1,36 +0,0 @@
# Polyhedra
## Tetrahedron
- vertices: 4
- faces: 4
- edges: 6
## Hexahedron
- vertices: 8
- faces: 6
- edges: 12
## Octahedron
- vertices: 6
- faces: 8
- edges: 12
## Dodecahedron
- vertices: 20
- faces: 12
- edges: 30
## Icosahedron
- vertices: 12
- faces: 20
- edges: 30

View file

@ -1,207 +0,0 @@
{
"definitions": {
"tetrahedron": {
"kind": "section",
"data": {
"title": "Tetrahedron",
"content": {
"kind": "list",
"data": {
"items": [
{
"kind": "text",
"data": {
"content": "vertices: 4"
}
},
{
"kind": "text",
"data": {
"content": "faces: 4"
}
},
{
"kind": "text",
"data": {
"content": "edges: 6"
}
}
]
}
}
}
},
"hexahedron": {
"kind": "section",
"data": {
"title": "Hexahedron",
"content": {
"kind": "list",
"data": {
"items": [
{
"kind": "text",
"data": {
"content": "vertices: 6"
}
},
{
"kind": "text",
"data": {
"content": "faces: 8"
}
},
{
"kind": "text",
"data": {
"content": "edges: 12"
}
}
]
}
}
}
},
"octahedron": {
"kind": "section",
"data": {
"title": "Octahedron",
"content": {
"kind": "list",
"data": {
"items": [
{
"kind": "text",
"data": {
"content": "vertices: 6"
}
},
{
"kind": "text",
"data": {
"content": "faces: 8"
}
},
{
"kind": "text",
"data": {
"content": "edges: 12"
}
}
]
}
}
}
},
"dodecahedron": {
"kind": "section",
"data": {
"title": "Dodecahedron",
"content": {
"kind": "list",
"data": {
"items": [
{
"kind": "text",
"data": {
"content": "vertices: 20"
}
},
{
"kind": "text",
"data": {
"content": "faces: 12"
}
},
{
"kind": "text",
"data": {
"content": "edges: 30"
}
}
]
}
}
}
},
"icosahedron": {
"kind": "section",
"data": {
"title": "Icosahedron",
"content": {
"kind": "list",
"data": {
"items": [
{
"kind": "text",
"data": {
"content": "vertices: 12"
}
},
{
"kind": "text",
"data": {
"content": "faces: 20"
}
},
{
"kind": "text",
"data": {
"content": "edges: 30"
}
}
]
}
}
}
}
},
"content": {
"title": "Polyhedra",
"main": {
"kind": "section",
"data": {
"title": "Polyhedra",
"content": {
"kind": "group",
"data": {
"members": [
{
"kind": "reference",
"data": {
"name": "tetrahedron"
}
},
{
"kind": "reference",
"data": {
"name": "hexahedron"
}
},
{
"kind": "reference",
"data": {
"name": "octahedron"
}
},
{
"kind": "reference",
"data": {
"name": "dodecahedron"
}
},
{
"kind": "reference",
"data": {
"name": "icosahedron"
}
}
]
}
}
}
}
}
}

View file

@ -1,19 +0,0 @@
{
"kind": "group",
"data": {
"members": [
{
"kind": "text",
"data": {
"content": "foo"
}
},
{
"kind": "text",
"data": {
"content": "bar"
}
}
]
}
}

View file

@ -0,0 +1,41 @@
{
"stock": {
"tetrahedron": {
"name": "Tetrahedron",
"vertices": 4,
"faces": 4,
"edges": 6
},
"hexahedron": {
"name": "Hexahedron",
"vertices": 8,
"faces": 6,
"edges": 12
},
"octahedron": {
"name": "Octahedron",
"vertices": 6,
"faces": 8,
"edges": 12
},
"dodecahedron": {
"name": "Dodecahedron",
"vertices": 20,
"faces": 12,
"edges": 30
},
"icosahedron": {
"name": "Icosahedron",
"vertices": 12,
"faces": 20,
"edges": 30
}
},
"order": [
"tetrahedron",
"hexahedron",
"octahedron",
"dodecahedron",
"icosahedron"
]
}

View file

@ -0,0 +1,51 @@
(data) => ({
"definitions": {
},
"content": {
"title": "Polyhedra",
"main": {
"kind": "section",
"data": {
"title": "Polyhedra",
"content": {
"kind": "group",
"data": {
"members": data.order.map(
name => ({
"kind": "section",
"data": {
"title": data.stock[name].name,
"content": {
"kind": "list",
"data": {
"items": [
{
"kind": "text",
"data": {
"content": ("vertices: " + data.stock[name].vertices.toFixed(0)),
}
},
{
"kind": "text",
"data": {
"content": ("faces: " + data.stock[name].faces.toFixed(0)),
}
},
{
"kind": "text",
"data": {
"content": ("edges: " + data.stock[name].edges.toFixed(0)),
}
},
]
}
}
}
})
)
}
}
}
}
}
})

View file

@ -0,0 +1,72 @@
(data) => ({
"definitions": {
},
"content": {
"title": "Polyhedra",
"main": {
"kind": "section",
"data": {
"title": "Polyhedra",
"content": {
"kind": "table",
"data": {
"head": [
{
"kind": "text",
"data": {
"content": "name"
}
},
{
"kind": "text",
"data": {
"content": "vertices"
}
},
{
"kind": "text",
"data": {
"content": "faces"
}
},
{
"kind": "text",
"data": {
"content": "edges"
}
}
],
"rows": data.order.map(
name => ([
{
"kind": "text",
"data": {
"content": data.stock[name].name
}
},
{
"kind": "code",
"data": {
"content": data.stock[name].vertices.toFixed(0)
}
},
{
"kind": "code",
"data": {
"content": data.stock[name].faces.toFixed(0)
}
},
{
"kind": "code",
"data": {
"content": data.stock[name].edges.toFixed(0)
}
}
])
),
}
}
}
}
}
})

View file

@ -1,15 +0,0 @@
- coproduct `element`
- group
- section
- list
- …
- coproduct `output`
- (markdown)
- html
- tex
- odt
- …
- coproduct `input`
- markdown

View file

@ -1,8 +1,11 @@
declare var console;
async function main(args_raw : Array<string>) : Promise<void> async function main(args_raw : Array<string>) : Promise<void>
{ {
// args // args
const arg_handler : lib_plankton.args.class_handler = new lib_plankton.args.class_handler( const arg_handler : lib_plankton.args.class_handler = new lib_plankton.args.class_handler(
{ {
/*
"input": lib_plankton.args.class_argument.positional({ "input": lib_plankton.args.class_argument.positional({
"index": 0, "index": 0,
"type": lib_plankton.args.enum_type.string, "type": lib_plankton.args.enum_type.string,
@ -11,6 +14,7 @@ async function main(args_raw : Array<string>) : Promise<void>
"info": "path to input file", "info": "path to input file",
"name": "input", "name": "input",
}), }),
*/
"output": lib_plankton.args.class_argument.volatile({ "output": lib_plankton.args.class_argument.volatile({
"indicators_long": ["output"], "indicators_long": ["output"],
"indicators_short": ["o"], "indicators_short": ["o"],
@ -46,7 +50,8 @@ async function main(args_raw : Array<string>) : Promise<void>
} }
else else
{ {
const document_raw : string = lib_plankton.json.decode(await lib_plankton.file.read(args.input)) const document_raw : string = lib_plankton.json.decode(await lib_plankton.file/*.read(args.input)*/.read_stdin());
const document : type_document = type_document.from_raw(document_raw); const document : type_document = type_document.from_raw(document_raw);
// let object : type_object = object_make(document_raw["content"]["main"]); // let object : type_object = object_make(document_raw["content"]["main"]);

View file

@ -0,0 +1,30 @@
/**
*/
type type_object_code_data = {
content : string;
};
/**
*/
class type_object_code implements type_object
{
public readonly kind : string = "code";
public readonly data : type_object_code_data;
public constructor(data : type_object_code_data) {this.data = data;}
}
/**
*/
object_kind_register(
"code",
(data) => (
new type_object_code(
{
"content": data["content"],
}
)
)
);

View file

@ -0,0 +1,32 @@
/**
*/
type type_object_link_data = {
target : string;
label : (null | string);
};
/**
*/
class type_object_link implements type_object
{
public readonly kind : string = "link";
public readonly data : type_object_link_data;
public constructor(data : type_object_link_data) {this.data = data;}
}
/**
*/
object_kind_register(
"link",
(data) => (
new type_object_link(
{
"target": data["target"],
"label": (data["label"] ?? null),
}
)
)
);

View file

@ -0,0 +1,33 @@
/**
*/
type type_object_table_data = {
head : (null | Array<type_object>);
rows : Array<Array<type_object>>;
};
/**
* @todo check sanity (length of head and rows)
*/
class type_object_table implements type_object
{
public readonly kind : string = "table";
public readonly data : type_object_table_data;
public constructor(data : type_object_table_data) {this.data = data;}
}
/**
*/
object_kind_register(
"table",
(data) => (
new type_object_table(
{
"head": data["head"],
"rows": data["rows"],
}
)
)
);

View file

@ -36,6 +36,27 @@ class type_output_html implements type_output<string>
new lib_plankton.xml.class_node_text(content), new lib_plankton.xml.class_node_text(content),
] ]
), ),
"code": ({"content": content}) => new lib_plankton.xml.class_node_complex(
"code",
{
"class": "sd-code",
},
[
new lib_plankton.xml.class_node_text(content),
]
),
"link": ({"target": target, "label": label}) => new lib_plankton.xml.class_node_complex(
"a",
{
"class": "sd-link",
"href": target,
},
(
(label === null)
? []
: [new lib_plankton.xml.class_node_text(label)]
)
),
"group": ({"members": members}) => new lib_plankton.xml.class_node_complex( "group": ({"members": members}) => new lib_plankton.xml.class_node_complex(
"div", "div",
{ {
@ -100,6 +121,81 @@ class type_output_html implements type_output<string>
) )
), ),
), ),
"table": ({"head": head, "rows": rows}) => new lib_plankton.xml.class_node_complex(
"table",
{
"class": "sd-table",
},
(
[]
.concat(
(head === null)
? []
: [
new lib_plankton.xml.class_node_complex(
"thead",
{},
[
new lib_plankton.xml.class_node_complex(
"tr",
{},
(
head.map(
cell => new lib_plankton.xml.class_node_complex(
"th",
{},
[
this.render_object_internal(
cell,
{
"level": options.level,
"depth": (options.depth + 1),
}
),
]
)
)
)
),
]
),
]
)
.concat(
[
new lib_plankton.xml.class_node_complex(
"tbody",
{},
(
rows.map(
row => new lib_plankton.xml.class_node_complex(
"tr",
{},
(
row.map(
cell => new lib_plankton.xml.class_node_complex(
"td",
{},
[
this.render_object_internal(
cell,
{
"level": options.level,
"depth": (options.depth + 1),
}
),
]
)
)
)
)
)
)
)
]
)
),
),
}, },
{ {
"fallback": (object) => new lib_plankton.xml.class_node_complex( "fallback": (object) => new lib_plankton.xml.class_node_complex(

View file

@ -26,9 +26,12 @@ ${dir_temp}/sd-unlinked.js: \
${dir_source}/base.ts \ ${dir_source}/base.ts \
${dir_source}/objects/base.ts \ ${dir_source}/objects/base.ts \
${dir_source}/objects/implementations/text.ts \ ${dir_source}/objects/implementations/text.ts \
${dir_source}/objects/implementations/code.ts \
${dir_source}/objects/implementations/link.ts \
${dir_source}/objects/implementations/group.ts \ ${dir_source}/objects/implementations/group.ts \
${dir_source}/objects/implementations/section.ts \ ${dir_source}/objects/implementations/section.ts \
${dir_source}/objects/implementations/list.ts \ ${dir_source}/objects/implementations/list.ts \
${dir_source}/objects/implementations/table.ts \
${dir_source}/document.ts \ ${dir_source}/document.ts \
${dir_source}/outputs/base.ts \ ${dir_source}/outputs/base.ts \
${dir_source}/outputs/implementations/json.ts \ ${dir_source}/outputs/implementations/json.ts \