python/laymesh/ipython.py 1"""IPython extension: %laymesh and %%laymesh."""2 3import argparse4import shlex5from pathlib import Path6 7from IPython.core.magic import Magics, line_cell_magic, magics_class8from IPython.display import SVG, display9 10from .bridge import render_file, render_source11 12 13def _options(line: str, *, cell: bool) -> argparse.Namespace:14 parser = argparse.ArgumentParser(prog="%%laymesh" if cell else "%laymesh")15 if not cell:16 parser.add_argument("file", type=Path)17 parser.add_argument("-o", "--output", type=Path)18 parser.add_argument("--dpi", type=float)19 parser.add_argument("--quality", type=float)20 parser.add_argument("--compression")21 parser.add_argument("--background")22 parser.add_argument("--webp-lossless", choices=("true", "false"))23 parser.add_argument("--webp-method", type=int)24 parser.add_argument("--webp-alpha-quality", type=int)25 parser.add_argument("--webp-near-lossless", type=int)26 parser.add_argument("--plot-dpi", type=float, default=300)27 parser.add_argument("--save-source", type=Path)28 parser.add_argument("--warnings", choices=("show", "hide"))29 return parser.parse_args(shlex.split(line))30 31 32@magics_class33class LayMeshMagics(Magics):34 @line_cell_magic35 def laymesh(self, line: str, cell: str | None = None) -> None:36 options = _options(line, cell=cell is not None)37 encoding = dict(quality=options.quality, compression=options.compression, background=options.background,38 webp_lossless=None if options.webp_lossless is None else options.webp_lossless == "true",39 webp_method=options.webp_method, webp_alpha_quality=options.webp_alpha_quality,40 webp_near_lossless=options.webp_near_lossless)41 if cell is None:42 result = render_file(43 options.file, namespace=self.shell.user_ns, output=options.output,44 dpi=options.dpi, plot_dpi=options.plot_dpi,45 save_source=options.save_source,46 show_warnings=None if options.warnings is None else options.warnings == "show",47 **encoding,48 )49 else:50 result = render_source(51 cell, namespace=self.shell.user_ns, output=options.output,52 dpi=options.dpi, plot_dpi=options.plot_dpi,53 save_source=options.save_source,54 show_warnings=None if options.warnings is None else options.warnings == "show",55 **encoding,56 )57 display(SVG(data=result.preview_svg))58 59 60def load_ipython_extension(ipython) -> None:61 ipython.register_magics(LayMeshMagics)