-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmake_loaders.py
More file actions
62 lines (53 loc) · 1.99 KB
/
make_loaders.py
File metadata and controls
62 lines (53 loc) · 1.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# make_loaders.py
# turns every SVG in this folder (and below) into a matching _load.js
import os, re, itertools, xml.etree.ElementTree as ET
from pathlib import Path
SVG_NS = "http://www.w3.org/2000/svg"
XLINK_NS = "http://www.w3.org/1999/xlink"
# -------- helpers --------
def esc(txt: str) -> str:
return txt.replace("\\", "\\\\").replace("`", "\\`").replace("${", "\\${")
def add_attr(code, var, k, v):
if k.startswith("{%s}" % XLINK_NS):
code.append(f'{var}.setAttributeNS("{XLINK_NS}","xlink:href",`{esc(v)}`);')
else:
key = re.sub(r"^{.*}", "", k)
code.append(f'{var}.setAttribute("{key}",`{esc(v)}`);')
def handle_text(code, var, text):
if text and text.strip():
code.append(f'{var}.textContent = `{esc(text)}`;')
def el_to_js(el, parent, idx):
var = f"n{next(idx)}"
tag = re.sub(r"^{.*}", "", el.tag)
out = [f'const {var}=document.createElementNS("{SVG_NS}","{tag}");']
for k, v in el.attrib.items():
add_attr(out, var, k, v)
handle_text(out, var, el.text)
if parent:
out.append(f"{parent}.appendChild({var});")
for child in el:
out.extend(el_to_js(child, var, idx))
handle_text(out, var, child.tail)
return out
# -------- main routine --------
def make_loader(svg_path: Path, dest_folder: Path):
name = svg_path.stem
tree = ET.parse(svg_path)
root = tree.getroot()
idx = itertools.count()
body = "\n ".join(el_to_js(root, None, idx))
js = f"""// auto-generated from {svg_path.name}
document.addEventListener('DOMContentLoaded',()=>{{
const box=document.getElementById('{name}');
if(!box) return;
{body}
box.appendChild(n0);
}});"""
out_file = dest_folder / f"{name}_load.js"
out_file.write_text(js, encoding="utf-8")
print(f"wrote {out_file}")
def scan_folder(base="."):
for path in Path(base).rglob("*.svg"):
make_loader(path, path.parent)
if __name__ == "__main__":
scan_folder()