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