From eb8e992adf0a78d204cb15a10704969b526c3946 Mon Sep 17 00:00:00 2001 From: Fenris Wolf Date: Wed, 17 Dec 2025 06:31:57 +0100 Subject: [PATCH] [ini] --- .gitignore | 1 + data/addition.json | 39 +++ data/multipliktion.json | 48 +++ misc/uebersicht.ods | Bin 0 -> 18912 bytes source/main.py | 659 ++++++++++++++++++++++++++++++++++++++++ tools/build | 16 + 6 files changed, 763 insertions(+) create mode 100644 .gitignore create mode 100644 data/addition.json create mode 100644 data/multipliktion.json create mode 100644 misc/uebersicht.ods create mode 100644 source/main.py create mode 100755 tools/build diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..84c048a --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/build/ diff --git a/data/addition.json b/data/addition.json new file mode 100644 index 0000000..e7278c4 --- /dev/null +++ b/data/addition.json @@ -0,0 +1,39 @@ +[ + {"links": [" 2", "+", "2 "], "rechts": ["4"]}, + {"links": [" 2", "+", "3 "], "rechts": ["5"]}, + {"links": [" 2", "+", "4 "], "rechts": ["6"]}, + {"links": [" 2", "+", "5 "], "rechts": ["7"]}, + {"links": [" 2", "+", "6 "], "rechts": ["8"]}, + {"links": [" 2", "+", "7 "], "rechts": ["9"]}, + {"links": [" 2", "+", "8 "], "rechts": ["10"]}, + {"links": [" 2", "+", "9 "], "rechts": ["11"]}, + {"links": [" 3", "+", "3 "], "rechts": ["6"]}, + {"links": [" 3", "+", "4 "], "rechts": ["7"]}, + {"links": [" 3", "+", "5 "], "rechts": ["8"]}, + {"links": [" 3", "+", "6 "], "rechts": ["9"]}, + {"links": [" 3", "+", "7 "], "rechts": ["10"]}, + {"links": [" 3", "+", "8 "], "rechts": ["11"]}, + {"links": [" 3", "+", "9 "], "rechts": ["12"]}, + {"links": [" 4", "+", "4 "], "rechts": ["8"]}, + {"links": [" 4", "+", "5 "], "rechts": ["9"]}, + {"links": [" 4", "+", "6 "], "rechts": ["10"]}, + {"links": [" 4", "+", "7 "], "rechts": ["11"]}, + {"links": [" 4", "+", "8 "], "rechts": ["12"]}, + {"links": [" 4", "+", "9 "], "rechts": ["13"]}, + {"links": [" 5", "+", "5 "], "rechts": ["10"]}, + {"links": [" 5", "+", "6 "], "rechts": ["11"]}, + {"links": [" 5", "+", "7 "], "rechts": ["12"]}, + {"links": [" 5", "+", "8 "], "rechts": ["13"]}, + {"links": [" 5", "+", "9 "], "rechts": ["14"]}, + {"links": [" 6", "+", "6 "], "rechts": ["12"]}, + {"links": [" 6", "+", "7 "], "rechts": ["13"]}, + {"links": [" 6", "+", "8 "], "rechts": ["14"]}, + {"links": [" 6", "+", "9 "], "rechts": ["15"]}, + {"links": [" 7", "+", "7 "], "rechts": ["14"]}, + {"links": [" 7", "+", "8 "], "rechts": ["15"]}, + {"links": [" 7", "+", "9 "], "rechts": ["16"]}, + {"links": [" 8", "+", "8 "], "rechts": ["16"]}, + {"links": [" 8", "+", "9 "], "rechts": ["17"]}, + {"links": [" 9", "+", "9 "], "rechts": ["18"]} +] + diff --git a/data/multipliktion.json b/data/multipliktion.json new file mode 100644 index 0000000..5a3a5c7 --- /dev/null +++ b/data/multipliktion.json @@ -0,0 +1,48 @@ +[ + {"links": [" 2", "·", "2 "], "rechts": ["4"]}, + {"links": [" 2", "·", "3 "], "rechts": ["6"]}, + {"links": [" 2", "·", "4 "], "rechts": ["8"]}, + {"links": [" 2", "·", "5 "], "rechts": ["10"]}, + {"links": [" 2", "·", "6 "], "rechts": ["12"]}, + {"links": [" 2", "·", "7 "], "rechts": ["14"]}, + {"links": [" 2", "·", "8 "], "rechts": ["16"]}, + {"links": [" 2", "·", "9 "], "rechts": ["18"]}, + {"links": [" 2", "·", "10 "], "rechts": ["20"]}, + {"links": [" 3", "·", "3 "], "rechts": ["9"]}, + {"links": [" 3", "·", "4 "], "rechts": ["12"]}, + {"links": [" 3", "·", "5 "], "rechts": ["15"]}, + {"links": [" 3", "·", "6 "], "rechts": ["18"]}, + {"links": [" 3", "·", "7 "], "rechts": ["21"]}, + {"links": [" 3", "·", "8 "], "rechts": ["24"]}, + {"links": [" 3", "·", "9 "], "rechts": ["27"]}, + {"links": [" 3", "·", "10 "], "rechts": ["30"]}, + {"links": [" 4", "·", "4 "], "rechts": ["16"]}, + {"links": [" 4", "·", "5 "], "rechts": ["20"]}, + {"links": [" 4", "·", "6 "], "rechts": ["24"]}, + {"links": [" 4", "·", "7 "], "rechts": ["28"]}, + {"links": [" 4", "·", "8 "], "rechts": ["32"]}, + {"links": [" 4", "·", "9 "], "rechts": ["36"]}, + {"links": [" 4", "·", "10 "], "rechts": ["40"]}, + {"links": [" 5", "·", "5 "], "rechts": ["25"]}, + {"links": [" 5", "·", "6 "], "rechts": ["30"]}, + {"links": [" 5", "·", "7 "], "rechts": ["35"]}, + {"links": [" 5", "·", "8 "], "rechts": ["40"]}, + {"links": [" 5", "·", "9 "], "rechts": ["45"]}, + {"links": [" 5", "·", "10 "], "rechts": ["50"]}, + {"links": [" 6", "·", "6 "], "rechts": ["36"]}, + {"links": [" 6", "·", "7 "], "rechts": ["42"]}, + {"links": [" 6", "·", "8 "], "rechts": ["48"]}, + {"links": [" 6", "·", "9 "], "rechts": ["54"]}, + {"links": [" 6", "·", "10 "], "rechts": ["60"]}, + {"links": [" 7", "·", "7 "], "rechts": ["49"]}, + {"links": [" 7", "·", "8 "], "rechts": ["56"]}, + {"links": [" 7", "·", "9 "], "rechts": ["63"]}, + {"links": [" 7", "·", "10 "], "rechts": ["70"]}, + {"links": [" 8", "·", "8 "], "rechts": ["64"]}, + {"links": [" 8", "·", "9 "], "rechts": ["72"]}, + {"links": [" 8", "·", "10 "], "rechts": ["80"]}, + {"links": [" 9", "·", "9 "], "rechts": ["81"]}, + {"links": [" 9", "·", "10 "], "rechts": ["90"]}, + {"links": [" 10", "·", "10 "], "rechts": ["100"]} +] + diff --git a/misc/uebersicht.ods b/misc/uebersicht.ods new file mode 100644 index 0000000000000000000000000000000000000000..e8053d1acddee94a698ad7226f4d2321e44f9821 GIT binary patch literal 18912 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\n" + if + (content is None) + else + "<{{tag}}{{attributes}}>\n{{content}}\n" + ), + { + "tag": tag, + "attributes": convey( + (attributes or {}).items(), + [ + lambda x: filter( + lambda pair: ( + not (pair[1] is None) + ), + x + ), + lambda x: map( + lambda pair: string_coin( + " {{key}}=\"{{value}}\"", + { + "key": pair[0], + "value": pair[1], + } + ), + x + ), + "".join, + ] + ), + "content": (content or ""), + } + ) + + +def css_color_hsl( + hue, + options = None +): + options = ( + { + "hue": 0.5, + "lightness": 0.5, + } + | + (options or {}) + ) + return string_coin( + "hsl({{hue}}, {{saturation}}%, {{lightness}}%)", + { + "hue": ("%.4f" % (hue * 360)), + "saturation": ("%.4f" % (options["saturation"] * 100)), + "lightness": ("%.4f" % (options["lightness"] * 100)), + } + ) + + +def css_commands( + actions +): + return " ".join( + map( + lambda pair: string_coin( + "{{key}}: {{value}};", + { + "key": pair[0], + "value": pair[1], + } + ), + actions.items() + ) + ) + + +def svg_measurement( + unit, + value +): + return string_coin( + "{{value}}{{unit}}", + { + "value": ("%.4f" % value), + "unit": (unit or ""), + } + ) + + +def svg_group( + children, + options = None +): + options = ( + { + "transform": None, + "style": None, + } + | + (options or {}) + ) + return xml_node_regular( + "g", + { + "transform": options["transform"], + "style": options["style"], + }, + "".join(children) + ) + + +def svg_rect( + from_x, + from_y, + to_x, + to_y, + options = None +): + options = ( + { + "style": None, + "unit": None, + } + | + (options or {}) + ) + return xml_node_regular( + "rect", + { + "x": svg_measurement(options["unit"], from_x), + "y": svg_measurement(options["unit"], from_y), + "width": svg_measurement(options["unit"], to_x - from_x), + "height": svg_measurement(options["unit"], to_y - from_y), + "style": options["style"], + }, + None + ) + + +def svg_text( + children, + options = None +): + options = ( + { + "unit": None, + "style": None, + "transform": None, + } + | + (options or {}) + ) + return xml_node_regular( + "text", + { + "x": svg_measurement(options["unit"], 0), + "y": svg_measurement(options["unit"], 0), + "style": options["style"], + "transform": options["transform"], + }, + "".join(children) + ) + + +def svg_tspan( + content, + options = None +): + options = ( + { + "unit": None, + "x": 0, + "y": 0, + "style": None, + } + | + (options or {}) + ) + return xml_node_regular( + "tspan", + { + "x": svg_measurement(options["unit"], options["x"]), + "y": svg_measurement(options["unit"], options["y"]), + "style": options["style"], + }, + content + ) + + +def svg_root( + content, + options = None +): + options = ( + { + "width": 210, + "height": 297, + "window": { + "from": {"x": 0, "y": 0}, + "to": {"x": 297, "y": 210}, + }, + } + | + (options or {}) + ) + return xml_node_regular( + "svg", + { + "xmlns": "http://www.w3.org/2000/svg", + "xmlns:svg": "http://www.w3.org/2000/svg", + "version": "1.1", + "width": svg_measurement("mm", options["width"]), + "height": svg_measurement("mm", options["height"]), + "viewBox": string_coin( + "{{anchor_x}} {{anchor_y}} {{size_x}} {{size_y}}", + { + "anchor_x": ("%u" % options["window"]["from"]["x"]), + "anchor_y": ("%u" % options["window"]["from"]["y"]), + "size_x": ("%u" % (options["window"]["to"]["x"] - options["window"]["from"]["x"])), + "size_y": ("%u" % (options["window"]["to"]["y"] - options["window"]["from"]["y"])), + } + ), + }, + content + ) + + +def main( +): + ## args + argument_parser = _argparse.ArgumentParser( + ) + argument_parser.add_argument( + "data_path", + type = str, + metavar = "", + ) + argument_parser.add_argument( + "-W", + "--page-width", + type = int, + metavar = "", + default = 210, + help = "in mm", + ) + argument_parser.add_argument( + "-H", + "--page-height", + type = int, + metavar = "", + default = 297, + help = "in mm", + ) + argument_parser.add_argument( + "-u", + "--tile-width", + type = float, + metavar = "", + default = 52.5, + help = "in mm", + ) + argument_parser.add_argument( + "-v", + "--tile-height", + type = float, + metavar = "", + default = 74.25, + help = "in mm", + ) + argument_parser.add_argument( + "-f", + "--fill-tiles", + action = "store_true", + ) + argument_parser.add_argument( + "-o", + "--output-directory", + type = str, + metavar = "", + default = "/tmp/memory", + ) + args = argument_parser.parse_args() + + ## consts + phi = ((_math.sqrt(5) - 1) / 2) + unit = None + conf = { + "colors": { + "background": { + "saturation": 0.0, + "lightness": 1.0, + }, + "foreground": { + "saturation": 0.0, + "lightness": 0.0, + }, + }, + "stroke": 1.0, + } + + ## input + content_in = file_text_read(args.data_path) + data = _json.loads(content_in) + + ## execution + tiles = convey( + data, + [ + len, + range, + lambda indices: list(map( + lambda index: [ + { + "id": index, + "content": list(map( + lambda text: { + "text": text.strip(), + "offset_left": string_count_begin(text, " "), + "offset_right": string_count_end(text, " "), + }, + data[index]["links"] + )), + "invert": False, + }, + { + "id": index, + "content": list(map( + lambda text: { + "text": text.strip(), + "offset_left": string_count_begin(text, " "), + "offset_right": string_count_end(text, " "), + }, + data[index]["rechts"] + )), + "invert": True, + }, + ], + indices + )), + lambda x: _functools.reduce(lambda a, b: (a + b), x, []), + ] + ) + tiles_per_line = int(args.page_width // args.tile_width) + lines_per_page = int(args.page_height // args.tile_height) + tiles_per_page = int(tiles_per_line * lines_per_page) + pages = int(_math.ceil(len(tiles) / tiles_per_page)) + if False: + _sys.stderr.write( + _json.dumps( + { + "page_width": args.page_width, + "page_height": args.page_height, + "tile_width": args.tile_width, + "tile_height": args.tile_height, + "tiles_per_line": tiles_per_line, + "lines_per_page": lines_per_page, + "tiles_per_page": tiles_per_page, + "tiles": len(tiles), + "pages": pages, + }, + indent = "\t" + ) + + + "\n" + ) + + ## output + for page in range(pages): + _sys.stderr.write("-- page %u/%u …\n" % ((page + 1), pages, )) + content_out = svg_root( + svg_group( + convey( + range( + ((page + 0) * tiles_per_page), + min( + ((page + 1) * tiles_per_page), + len(tiles) + ) + ), + [ + lambda indices: map( + lambda index: svg_group( + [ + svg_rect( + 0, + 0, + args.tile_width, + args.tile_height, + { + "unit": unit, + "style": css_commands( + { + "stroke": css_color_hsl( + ((tiles[index]["id"] * phi) % 1), + { + "saturation": ( + conf["colors"]["foreground"]["saturation"] + if (not tiles[index]["invert"]) else + conf["colors"]["background"]["saturation"] + ), + "lightness": ( + conf["colors"]["foreground"]["lightness"] + if (not tiles[index]["invert"]) else + conf["colors"]["background"]["lightness"] + ), + } + ), + "stroke-width": svg_measurement(unit, 0.5), + "fill": ( + "none" + if (not args.fill_tiles) else + css_color_hsl( + ((tiles[index]["id"] * phi) % 1), + { + "saturation": ( + conf["colors"]["background"]["saturation"] + if (not tiles[index]["invert"]) else + conf["colors"]["foreground"]["saturation"] + ), + "lightness": ( + conf["colors"]["background"]["lightness"] + if (not tiles[index]["invert"]) else + conf["colors"]["foreground"]["lightness"] + ), + } + ) + ), + } + ), + } + ), + svg_text( + list( + map( + lambda number: svg_tspan( + ( + tiles[index]["content"][number]["text"] + .replace(" ", "\xA0") + ), + { + "unit": unit, + "x": ( + ( + (-len(tiles[index]["content"][number]["text"])) + + + tiles[index]["content"][number]["offset_left"] + - + tiles[index]["content"][number]["offset_right"] + ) + * + 3.6 + ), + "y": ( + ( + (-((len(tiles[index]["content"]) - 1) / 2)) + + + number + ) + * + 16.0 + ), + "style": css_commands( + { + "stroke": css_color_hsl( + ((tiles[index]["id"] * phi) % 1), + { + "saturation": ( + conf["colors"]["foreground"]["saturation"] + if (not tiles[index]["invert"]) else + conf["colors"]["background"]["saturation"] + ), + "lightness": ( + conf["colors"]["foreground"]["lightness"] + if (not tiles[index]["invert"]) else + conf["colors"]["background"]["lightness"] + ), + } + ), + "stroke-width": svg_measurement(unit, conf["stroke"]), + "fill": css_color_hsl( + ((tiles[index]["id"] * phi) % 1), + { + "saturation": ( + conf["colors"]["foreground"]["saturation"] + if (not tiles[index]["invert"]) else + conf["colors"]["background"]["saturation"] + ), + "lightness": ( + conf["colors"]["foreground"]["lightness"] + if (not tiles[index]["invert"]) else + conf["colors"]["background"]["lightness"] + ), + } + ), + } + ), + } + ), + range(len(tiles[index]["content"])) + ) + ), + { + "unit": unit, + "style": css_commands( + { + "font-family": "Noto Mono", + "font-width": "bolder", + "font-size": "16", + } + ), + "transform": string_coin( + "translate({{x}} {{y}})", + { + "x": svg_measurement( + unit, + (args.tile_width * 0.5) + ), + "y": svg_measurement( + unit, + (args.tile_height * 0.6) + ), + } + ), + } + ), + ], + { + "transform": string_coin( + "translate({{x}} {{y}})", + { + "x": svg_measurement( + unit, + convey( + index, + [ + lambda x: (x % tiles_per_page), + lambda x: (x % tiles_per_line), + lambda x: (x * args.tile_width), + ] + ) + ), + "y": svg_measurement( + unit, + convey( + index, + [ + lambda x: (x % tiles_per_page), + lambda x: (x // tiles_per_line), + lambda x: (x * args.tile_height), + ] + ) + ), + } + ), + } + ), + indices + ), + list, + ] + ) + ), + { + "width": args.page_width, + "height": args.page_height, + "window": { + "from": {"x": 0, "y": 0}, + "to": {"x": args.page_width, "y": args.page_height}, + }, + } + ) + file_text_write( + _os.path.join( + args.output_directory, + "%u.svg" % (page + 1) + ), + content_out + ) + + _sys.stderr.write("-- output written to %s\n" % (args.output_directory, )) + + +main() + diff --git a/tools/build b/tools/build new file mode 100755 index 0000000..09a1544 --- /dev/null +++ b/tools/build @@ -0,0 +1,16 @@ +#!/usr/bin/env sh + +## const + +dir_source="source" +dir_build="build" + + +## exec + +mkdir -p ${dir_build} +echo "#!/usr/bin/env python3\n" > ${dir_build}/memory +cat ${dir_source}/main.py >> ${dir_build}/memory +chmod +x ${dir_build}/memory + +