1"""Rendering format parameter handling."""
2
3from collections.abc import Set
4from typing import Final
5
6from . import base
7
8__all__ = ['FORMATS', 'verify_format', 'Format']
9
10FORMATS: Final[Set[str]] = {'bmp', # https://graphviz.org/docs/outputs/
11 'canon', 'dot', 'gv', 'xdot', 'xdot1.2', 'xdot1.4',
12 'cgimage',
13 'cmap',
14 'eps',
15 'exr',
16 'fig',
17 'gd', 'gd2',
18 'gif',
19 'gtk',
20 'ico',
21 'imap', 'cmapx',
22 'imap_np', 'cmapx_np',
23 'ismap',
24 'jp2',
25 'jpg', 'jpeg', 'jpe',
26 'json', 'json0', 'dot_json', 'xdot_json', # Graphviz 2.40
27 'pct', 'pict',
28 'pdf',
29 'pic',
30 'plain', 'plain-ext',
31 'png',
32 'pov',
33 'ps',
34 'ps2',
35 'psd',
36 'sgi',
37 'svg', 'svg_inline', 'svgz', # svg_linline: Graphviz 10.0.1
38 'tga',
39 'tif', 'tiff',
40 'tk',
41 'vml', 'vmlz',
42 'vrml',
43 'wbmp',
44 'webp',
45 'xlib', 'x11'}
46
47DEFAULT_FORMAT: Final = 'pdf'
48
49REQUIRED: Final = True
50
51
52def verify_format(format: str, *, required: bool = REQUIRED) -> None:
53 if format is None:
54 if required:
55 raise ValueError('missing format')
56 elif format.lower() not in FORMATS:
57 raise ValueError(f'unknown format: {format!r}'
58 f' (must be one of {sorted(FORMATS)})')
59
60
61class Format(base.ParameterBase):
62 """Rendering format parameter with ``'pdf'`` default."""
63
64 _format = DEFAULT_FORMAT
65
66 _verify_format = staticmethod(verify_format)
67
68 def __init__(self, *, format: str | None = None, **kwargs) -> None:
69 super().__init__(**kwargs)
70
71 if format is not None:
72 self.format = format
73
74 def _copy_kwargs(self, **kwargs):
75 """Return the kwargs to create a copy of the instance."""
76 format = self._getattr_from_dict('_format')
77 if format is not None:
78 kwargs['format'] = format
79 return super()._copy_kwargs(**kwargs)
80
81 @property
82 def format(self) -> str:
83 """The output format used for rendering
84 (``'pdf'``, ``'png'``, ...)."""
85 return self._format
86
87 @format.setter
88 def format(self, format: str) -> None:
89 format = format.lower()
90 self._verify_format(format)
91 self._format = format