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