diff --git a/data/collections.json b/data/collections.json
index c3af6b4..414c06e 100644
--- a/data/collections.json
+++ b/data/collections.json
@@ -1,78 +1,80 @@
[
- [
- "Tag:man_made=mast",
- {"man_made": "mast"},
- "tower:construction",
- ["freestanding", "lattice", "guyed_tube", "guyed_lattice"],
- "tower:type",
- ["", "communication", "lighting", "monitoring", "siren"]
- ],
- [
- "Tag:natural=volcano",
- {"natural": "volcano"},
- "volcano:type",
- ["stratovolcano", "shield", "scoria"],
- "volcano:status",
- [ "", "active", "dormant", "extinct"]
- ],
- [
- "Tag:tower:construction=guyed_tube",
- {"man_made": "mast", "tower:construction": "guyed_tube"},
- "tower:type",
- ["", "communication", "lighting", "monitoring", "siren"]
- ],
- [
- "Tag:tower:construction=guyed_lattice",
- {"man_made": "mast", "tower:construction": "guyed_lattice"},
- "tower:type",
- ["", "communication", "lighting", "monitoring", "siren"]
- ],
- [
- "Key:communication:mobile_phone",
- {"communication:mobile_phone": "yes"}
- ],
- [
- "Key:traffic_calming",
- {},
- "traffic_calming",
- [
+ {
+ "page": "Tag:man_made=mast",
+ "id": "mast",
+ "tags": {"man_made": "mast"},
+ "row_key": "tower:construction",
+ "row_values": ["freestanding", "lattice", "guyed_tube", "guyed_lattice"],
+ "column_key": "tower:type",
+ "column_values": ["", "communication", "lighting", "monitoring", "siren"]
+ },
+ {
+ "page": "Tag:natural=volcano",
+ "id": "volcano",
+ "tags": {"natural": "volcano"},
+ "row_key": "volcano:type",
+ "row_values": ["stratovolcano", "shield", "scoria"],
+ "column_key": "volcano:status",
+ "column_values": [ "", "active", "dormant", "extinct"]
+ },
+ {
+ "page": "Tag:tower:construction=guyed_tube",
+ "tags": {"man_made": "mast", "tower:construction": "guyed_tube"},
+ "row_key": "tower:type",
+ "row_values": ["", "communication", "lighting", "monitoring", "siren"]
+ },
+ {
+ "page": "Tag:tower:construction=guyed_lattice",
+ "tags": {"man_made": "mast", "tower:construction": "guyed_lattice"},
+ "row_key": "tower:type",
+ "row_values": ["", "communication", "lighting", "monitoring", "siren"]
+ },
+ {
+ "page": "Key:communication:mobile_phone",
+ "tags": {"communication:mobile_phone": "yes"}
+ },
+ {
+ "page": "Key:traffic_calming",
+ "tags": {},
+ "column_key": "traffic_calming",
+ "column_values": [
"bump", "mini_bumps", "hump", "table", "cushion", "rumble_strip",
"dip", "double_dip"
]
- ],
- [
- "Key:crane:type",
- {"man_made": "crane"},
- "crane:type",
- [
+ },
+ {
+ "page": "Key:crane:type",
+ "tags": {"man_made": "crane"},
+ "column_key": "crane:type",
+ "column_values": [
"gantry_crane", "floor-mounted_crane", "portal_crane",
"travel_lift", "tower_crane"
]
- ],
- [
- "Tag:tower:type=diving",
- {"man_made": "tower", "tower:type": "diving"}
- ],
- [
- "Key:design",
- {},
- "power",
- ["tower", "pole"],
- "design",
- [
+ },
+ {
+ "page": "Tag:tower:type=diving",
+ "tags": {"man_made": "tower", "tower:type": "diving"}
+ },
+ {
+ "page": "Key:design",
+ "tags": {},
+ "row_key": "power",
+ "row_values": ["tower", "pole"],
+ "column_key": "design",
+ "column_values": [
"one-level", "two-level", "three-level", "four-level", "asymmetric",
"triangle", "flag", "delta", "delta_two-level", "delta_three-level"
]
- ],
- [
- "Key:design_2",
- {},
- "power",
- ["tower"],
- "design",
- [
+ },
+ {
+ "page": "Key:design_2",
+ "tags": {},
+ "row_key": "power",
+ "row_values": ["tower"],
+ "column_key": "design",
+ "column_values": [
"donau", "donau_inverse", "barrel", "y-frame", "x-frame", "h-frame",
"guyed_h-frame", "portal", "portal_two-level", "portal_three-level"
]
- ]
+ }
]
diff --git a/map_machine/doc/collections.py b/map_machine/doc/collections.py
index d1ae2c0..b71c35b 100644
--- a/map_machine/doc/collections.py
+++ b/map_machine/doc/collections.py
@@ -4,7 +4,7 @@ Special icon collections for documentation.
import json
from dataclasses import dataclass, field
from pathlib import Path
-from typing import Optional
+from typing import Any, Optional
import numpy as np
import svgwrite
@@ -46,19 +46,22 @@ class Collection:
column_values: list[str] = field(default_factory=list)
@classmethod
- def deserialize(cls, structure):
+ def deserialize(cls, structure: dict[str, Any]):
"""Deserialize icon collection from structure."""
- row_key = structure[2] if len(structure) > 2 else None
- row_values = structure[3] if len(structure) > 3 else []
- column_key = structure[4] if len(structure) > 4 else None
- column_values = structure[5] if len(structure) > 5 else []
-
+ row_key: Optional[str] = (
+ structure["row_key"] if "row_key" in structure else None
+ )
+ row_values: list[str] = (
+ structure["row_values"] if "row_values" in structure else []
+ )
+ column_key: Optional[str] = (
+ structure["column_key"] if "column_key" in structure else None
+ )
+ column_values: list[str] = (
+ structure["column_values"] if "column_values" in structure else []
+ )
return cls(
- structure[1],
- row_key,
- row_values,
- column_key,
- column_values,
+ structure["tags"], row_key, row_values, column_key, column_values
)
@@ -98,12 +101,13 @@ class SVGTable:
max(map(len, self.collection.row_values)) * self.font_width,
len(self.collection.row_key) * self.font_width
+ (self.offset if self.collection.column_values else 0),
+ 170.0,
)
if self.collection.row_values
- else 25.0,
+ else 0.0,
max(map(len, self.collection.column_values)) * self.font_width
if self.collection.column_values
- else 25.0,
+ else 0.0,
]
self.start_point: np.ndarray = (
2 * self.border + np.array(self.size) + self.half_step
@@ -285,6 +289,7 @@ class SVGTable:
)
)
* self.step
+ - self.half_step
+ self.border
)
@@ -293,10 +298,14 @@ def draw_svg_tables(output_path: Path, html_file_path: Path) -> None:
"""Draw SVG tables of icon collections."""
with Path("data/collections.json").open() as input_file:
- collections: list[list] = json.load(input_file)
+ collections: list[dict[str, Any]] = json.load(input_file)
+
with html_file_path.open("w+") as html_file:
for structure in collections:
- path: Path = output_path / f"{structure[0]}.svg"
+ if "id" not in structure:
+ continue
+
+ path: Path = output_path / f"{structure['id']}.svg"
svg: Drawing = svgwrite.Drawing(path.name)
collection: Collection = Collection.deserialize(structure)
@@ -306,7 +315,9 @@ def draw_svg_tables(output_path: Path, html_file_path: Path) -> None:
with path.open("w+") as output_file:
svg.write(output_file)
- html_file.write(f'
\n')
+ html_file.write(
+ f'
\n'
+ )
if __name__ == "__main__":