2023-05-21 21:07:40 +02:00
|
|
|
# Melpomene webcomic reader JSON/JS/HTML generator
|
|
|
|
# Version 1.0.0 - UNSTABLE
|
2023-05-19 18:15:34 +02:00
|
|
|
# CC-BY-NC-SA https://git.aribaud.net/caribaud/melpomene/
|
|
|
|
|
2023-04-15 13:12:49 +02:00
|
|
|
import sys
|
|
|
|
import re
|
|
|
|
import xml.etree.ElementTree as ET
|
|
|
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
|
|
|
|
def extract_zooms(src_folder, dest_file):
|
|
|
|
folder = Path(src_folder)
|
|
|
|
|
|
|
|
zooms = {}
|
|
|
|
|
|
|
|
for svg_path in folder.glob("*.svg"):
|
|
|
|
print(svg_path.name)
|
|
|
|
match = re.search("P(\d+)", svg_path.name)
|
|
|
|
if match:
|
|
|
|
|
|
|
|
page_idx = int(match.group(1))
|
|
|
|
|
|
|
|
zooms[page_idx] = []
|
|
|
|
|
|
|
|
tree = ET.parse(svg_path)
|
|
|
|
root = tree.getroot()
|
|
|
|
|
|
|
|
for area in root.findall('.//{*}rect'):
|
|
|
|
zooms[page_idx].append([
|
|
|
|
float(area.get("width")),
|
|
|
|
float(area.get("height")),
|
|
|
|
float(area.get("x")),
|
|
|
|
float(area.get("y")),
|
|
|
|
])
|
|
|
|
|
|
|
|
with open(dest_file, "w") as data_file:
|
|
|
|
data_file.write("zooms = [\n")
|
|
|
|
for page_idx in sorted(zooms.keys()):
|
|
|
|
for zoom in zooms[page_idx]:
|
|
|
|
|
|
|
|
if zoom[2] < 0 or zoom[3] < 0 :
|
|
|
|
print(f"WARNING: negative pos x / pos y in page {page_idx} for zoom {zoom} (is the rectangle flipped?)")
|
|
|
|
|
|
|
|
data_file.write(f" {[page_idx] + zoom},\n")
|
|
|
|
data_file.write("]\n")
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
extract_zooms(sys.argv[1], sys.argv[2])
|