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

1import json 

2import webbrowser 

3from dataclasses import dataclass 

4from pathlib import Path 

5 

6import yaml 

7from jinja2 import Environment, PackageLoader, select_autoescape 

8 

9from collectra.utils import change_dir 

10 

11__all__ = ["Editor"] 

12 

13 

14@dataclass 

15class Editor: 

16 

17 file: Path 

18 

19 def __post_init__(self): 

20 self.env = Environment( 

21 loader=PackageLoader("collectra.editor"), autoescape=select_autoescape() 

22 ) 

23 

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 } 

72 

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)}")