Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/nbconvert/exporters/qt_exporter.py: 33%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

42 statements  

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 # noqa: PLC0415 

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 # noqa: PLC0415 

35 

36 return QtScreenshot 

37 

38 def _run_pyqtwebengine(self, html): 

39 ext = ".html" 

40 temp_file = tempfile.NamedTemporaryFile( # noqa: SIM115 

41 suffix=ext, delete=False 

42 ) 

43 filename = f"{temp_file.name[: -len(ext)]}.{self.format}" 

44 with temp_file: 

45 temp_file.write(html.encode("utf-8")) 

46 try: 

47 QtScreenshot = self._check_launch_reqs() 

48 s = QtScreenshot() 

49 s.capture(f"file://{temp_file.name}", filename, self.paginate) 

50 finally: 

51 # Ensure the file is deleted even if pyqtwebengine raises an exception 

52 os.unlink(temp_file.name) 

53 return s.data 

54 

55 def from_notebook_node(self, nb, resources=None, **kw): 

56 """Convert from notebook node.""" 

57 self._check_launch_reqs() 

58 html, resources = super().from_notebook_node(nb, resources=resources, **kw) 

59 

60 self.log.info("Building %s", self.format.upper()) 

61 data = self._run_pyqtwebengine(html) 

62 self.log.info("%s successfully created", self.format.upper()) 

63 

64 # convert output extension 

65 # the writer above required it to be html 

66 resources["output_extension"] = f".{self.format}" 

67 

68 return data, resources