1"""A qt exporter."""
2
3import os
4import sys
5import tempfile
6
7from traitlets import default
8
9from .html import HTMLExporter
10
11
12class QtExporter(HTMLExporter):
13 """A qt exporter."""
14
15 paginate = None
16 format = ""
17
18 @default("file_extension")
19 def _file_extension_default(self):
20 return ".html"
21
22 def _check_launch_reqs(self):
23 if sys.platform.startswith("win") and self.format == "png":
24 msg = "Exporting to PNG using Qt is currently not supported on Windows."
25 raise RuntimeError(msg)
26 from .qt_screenshot import QT_INSTALLED
27
28 if not QT_INSTALLED:
29 msg = (
30 f"PyQtWebEngine is not installed to support Qt {self.format.upper()} conversion. "
31 f"Please install `nbconvert[qt{self.format}]` to enable."
32 )
33 raise RuntimeError(msg)
34 from .qt_screenshot import QtScreenshot
35
36 return QtScreenshot
37
38 def _run_pyqtwebengine(self, html):
39 ext = ".html"
40 temp_file = tempfile.NamedTemporaryFile(suffix=ext, delete=False)
41 filename = f"{temp_file.name[:-len(ext)]}.{self.format}"
42 with temp_file:
43 temp_file.write(html.encode("utf-8"))
44 try:
45 QtScreenshot = self._check_launch_reqs()
46 s = QtScreenshot()
47 s.capture(f"file://{temp_file.name}", filename, self.paginate)
48 finally:
49 # Ensure the file is deleted even if pyqtwebengine raises an exception
50 os.unlink(temp_file.name)
51 return s.data
52
53 def from_notebook_node(self, nb, resources=None, **kw):
54 """Convert from notebook node."""
55 self._check_launch_reqs()
56 html, resources = super().from_notebook_node(nb, resources=resources, **kw)
57
58 self.log.info("Building %s", self.format.upper())
59 data = self._run_pyqtwebengine(html)
60 self.log.info("%s successfully created", self.format.upper())
61
62 # convert output extension
63 # the writer above required it to be html
64 resources["output_extension"] = f".{self.format}"
65
66 return data, resources