Coverage for collectra/editor/base.py: 0.00%
49 statements
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-16 09:56 +0000
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-16 09:56 +0000
1import json
2import webbrowser
3from dataclasses import dataclass
4from pathlib import Path
6import yaml
7from jinja2 import Environment, PackageLoader, select_autoescape
9from collectra.utils import change_dir
11__all__ = ["Editor"]
14@dataclass
15class Editor:
17 file: Path
19 def __post_init__(self):
20 self.env = Environment(
21 loader=PackageLoader("collectra.editor"), autoescape=select_autoescape()
22 )
24 def view(self):
25 template = self.env.get_template("imagebb.html")
26 with change_dir(self.file):
27 results = Path("results.yaml")
28 if not results.exists():
29 raise Exception(f"{self.file} is an invalid file. Exiting...")
30 with open(results, "r") as f:
31 data = yaml.safe_load(f)
32 header = data.pop("collectra_results_metadata", "")
33 src_img = ""
34 bounding_boxes: list = list()
35 text_items: list = list()
36 for k, v in data.items():
37 if not isinstance(v, list):
38 v = [v]
39 for item in v:
40 type_ = item.get("type", "")
41 if type_ in [
42 "collectra.Image",
43 "collectra.ImageCrop",
44 "collectra.types.images.Image",
45 "collectra.types.images.ImageCrop",
46 ]:
47 src_img = item.get("data", src_img)
48 src_img = item.get("path", src_img)
49 keys = list(item.keys())
50 bb_params = set(
51 [
52 "x_center",
53 "y_center",
54 "width_relative",
55 "height_relative",
56 ]
57 )
58 if not bb_params.issubset(keys):
59 continue
60 bb = {bb_param: item[bb_param] for bb_param in bb_params}
61 bb["label"] = k
62 bounding_boxes.append(bb)
63 elif type_ in ["collectra.Text", "collectra.types.texts.Text"]:
64 text = item.get("data", "")
65 text_items.append({"name": k, "text": text})
66 # --- Prepare Context for Jinja2 Template ---
67 context = {
68 "src_img": src_img,
69 "bounding_boxes": json.dumps(bounding_boxes),
70 "text_items": text_items,
71 }
73 # --- Render Template ---
74 rendered_html = template.render(context)
75 viewer_file = Path.cwd() / "viewer.html"
76 with open(viewer_file, "w", encoding="utf-8") as f:
77 f.write(rendered_html)
78 webbrowser.open_new_tab(f"file:///{str(viewer_file)}")