[ini]
This commit is contained in:
commit
eb8e992adf
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
/build/
|
||||
39
data/addition.json
Normal file
39
data/addition.json
Normal file
|
|
@ -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"]}
|
||||
]
|
||||
|
||||
48
data/multipliktion.json
Normal file
48
data/multipliktion.json
Normal file
|
|
@ -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"]}
|
||||
]
|
||||
|
||||
BIN
misc/uebersicht.ods
Normal file
BIN
misc/uebersicht.ods
Normal file
Binary file not shown.
659
source/main.py
Normal file
659
source/main.py
Normal file
|
|
@ -0,0 +1,659 @@
|
|||
import sys as _sys
|
||||
import os as _os
|
||||
import argparse as _argparse
|
||||
import json as _json
|
||||
import functools as _functools
|
||||
import math as _math
|
||||
|
||||
|
||||
def convey(
|
||||
x,
|
||||
fs
|
||||
):
|
||||
y = x
|
||||
for f in fs:
|
||||
y = f(y)
|
||||
return y
|
||||
|
||||
|
||||
def string_coin(
|
||||
template,
|
||||
arguments
|
||||
):
|
||||
result = template
|
||||
for (key, value, ) in arguments.items():
|
||||
result = result.replace("{{%s}}" % key, value)
|
||||
return result
|
||||
|
||||
|
||||
def string_count_begin(
|
||||
string,
|
||||
character
|
||||
):
|
||||
result = 0
|
||||
while (string[result] == character):
|
||||
result += 1
|
||||
return result
|
||||
|
||||
|
||||
def string_count_end(
|
||||
string,
|
||||
character
|
||||
):
|
||||
result = 0
|
||||
while (string[-1-result] == character):
|
||||
result += 1
|
||||
return result
|
||||
|
||||
|
||||
def file_text_read(
|
||||
path
|
||||
):
|
||||
handle = open(path, "r")
|
||||
content = handle.read()
|
||||
handle.close()
|
||||
return content
|
||||
|
||||
|
||||
def file_text_write(
|
||||
path,
|
||||
content
|
||||
):
|
||||
_os.makedirs(
|
||||
_os.path.dirname(path),
|
||||
exist_ok = True
|
||||
)
|
||||
handle = open(path, "w")
|
||||
handle.write(content)
|
||||
handle.close()
|
||||
|
||||
|
||||
def xml_node_regular(
|
||||
tag,
|
||||
attributes,
|
||||
content
|
||||
):
|
||||
return string_coin(
|
||||
(
|
||||
"<{{tag}}{{attributes}}/>\n"
|
||||
if
|
||||
(content is None)
|
||||
else
|
||||
"<{{tag}}{{attributes}}>\n{{content}}</{{tag}}>\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 = "<data-path>",
|
||||
)
|
||||
argument_parser.add_argument(
|
||||
"-W",
|
||||
"--page-width",
|
||||
type = int,
|
||||
metavar = "<page-width>",
|
||||
default = 210,
|
||||
help = "in mm",
|
||||
)
|
||||
argument_parser.add_argument(
|
||||
"-H",
|
||||
"--page-height",
|
||||
type = int,
|
||||
metavar = "<page-height>",
|
||||
default = 297,
|
||||
help = "in mm",
|
||||
)
|
||||
argument_parser.add_argument(
|
||||
"-u",
|
||||
"--tile-width",
|
||||
type = float,
|
||||
metavar = "<tile-width>",
|
||||
default = 52.5,
|
||||
help = "in mm",
|
||||
)
|
||||
argument_parser.add_argument(
|
||||
"-v",
|
||||
"--tile-height",
|
||||
type = float,
|
||||
metavar = "<tile-height>",
|
||||
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 = "<output-directory>",
|
||||
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()
|
||||
|
||||
16
tools/build
Executable file
16
tools/build
Executable file
|
|
@ -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
|
||||
|
||||
|
||||
Loading…
Reference in a new issue