Source code for ipypublish.frontend.shared

import sys
import os
import argparse
import fnmatch

from ipypublish import __version__
from ipypublish.convert.config_manager import iter_all_export_infos


[docs]class CustomFormatter( argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter ): pass
[docs]class CustomParser(argparse.ArgumentParser):
[docs] def error(self, message): sys.stderr.write("error: %s\n" % message) self.print_help() sys.exit(2)
[docs]def get_parser(**kwargs): return CustomParser(formatter_class=CustomFormatter, **kwargs)
[docs]def get_plugin_str(plugin_folder_paths, regex, verbose): """return string listing all available export configurations """ outstrs = [] # outstrs.append('Available Export Configurations') # outstrs.append('-------------------------------') configs = [ e for e in iter_all_export_infos(plugin_folder_paths, get_mime=verbose) if fnmatch.fnmatch(e["key"], "*{}*".format(regex)) ] for item in sorted(configs, key=lambda i: (i["class"], i["key"])): outstrs.append("- Key: {}".format(item["key"])) outstrs.append(" Class: {}".format(item["class"])) path = item["path"].split(os.path.sep) if verbose: outstrs.append(" Type: {}".format(item["mime_type"])) path = os.path.join(*path) else: path = os.path.join("...", *path[-3:]) if len(path) < 4: outstrs.append(" Path: {}".format(item["path"])) else: outstrs.append(" Path: {}".format(path)) outstrs.append(" About: {}".format(item["description"][0].strip())) if verbose: for descript in item["description"][1:]: outstrs.append(" {}".format(descript.strip())) # note could wrap description (less than x characters) outstrs.append(" ") return "\n".join(outstrs)
[docs]def parse_options(sys_args, program): if program not in ["nbpublish", "nbpresent"]: raise ValueError("program should be nbpublish or nbpresent") if program == "nbpresent": parser = get_parser( description=( "load reveal.js slides as a web server,\n" "converting from ipynb first " "if path extension is `ipynb`" ) ) file_help = "path to html or ipynb file" default_key = "slides_ipypublish_main" else: parser = get_parser( description=( "convert one or more Jupyter notebooks " "to a publishable format" ) ) file_help = "notebook file or directory" default_key = "latex_ipypublish_main" parser.add_argument("--version", action="version", version=__version__) parser.add_argument( "filepath", type=str, nargs="?", help=file_help, metavar="filepath" ) parser.add_argument( "-f", "--outformat", type=str, metavar="key|filepath", help=( "export format configuration to use, " "can be a key name or path to the file" ), default=default_key, ) export_group = parser.add_argument_group("export configurations") export_group.add_argument( "-ep", "--export-paths", action="append", metavar="path", type=str, help=("add additional folder paths, " "containing export configurations"), default=[], ) export_group.add_argument( "-le", "--list-exporters", type=str, metavar="filter", nargs="?", const="*", help=("list export configurations, " "optionally filtered e.g. -le html*"), ) export_group.add_argument( "-lv", "--list-verbose", action="store_true", help=("when listing export configurations, " "give a verbose description"), ) nbmerge_group = parser.add_argument_group("nb merge") nbmerge_group.add_argument( "-i", "--ignore-prefix", type=str, metavar="str", default="_", help="ignore ipynb files with this prefix", ) output_group = parser.add_argument_group("output") output_group.add_argument( "-o", "--outpath", type=str, metavar="str", help="path to output converted files", default=os.path.join(os.getcwd(), "converted"), ) # output_group.add_argument("-d","--dump-files", action="store_true", # help='dump external files, ' # 'linked to in the document, into the outpath') output_group.add_argument( "-c", "--clear-files", action="store_true", help=("clear any external files " "that already exist in the outpath"), ) if program == "nbpublish": pdf_group = parser.add_argument_group("pdf export") pdf_group.add_argument( "-pdf", "--create-pdf", action="store_true", help="convert to pdf (only if latex exporter)", ) pdf_group.add_argument( "-ptemp", "--pdf-in-temp", action="store_true", help=( "run pdf conversion in a temporary folder" " and only copy back the .pdf file" ), ) pdf_group.add_argument( "-pbug", "--pdf-debug", action="store_true", help="run latexmk in interactive mode", ) view_group = parser.add_argument_group("view output") view_group.add_argument( "-lb", "--launch-browser", action="store_true", help="open the output in an available web-browser", ) debug_group = parser.add_argument_group("debugging") debug_group.add_argument( "-log", "--log-level", type=str, default="info", choices=["debug", "info", "warning", "error"], help="the logging level to output to screen/file", ) debug_group.add_argument( "-pt", "--print-traceback", action="store_true", help=("print the full exception traceback"), ) debug_group.add_argument( "-dr", "--dry-run", action="store_true", help=("perform a 'dry run', " "which will not output any files"), ) args = parser.parse_args(sys_args) options = vars(args) filepath = options.pop("filepath") list_plugins = options.pop("list_exporters") list_verbose = options.pop("list_verbose") if filepath is None and list_plugins: parser.exit( message=get_plugin_str(options["export_paths"], list_plugins, list_verbose) ) elif filepath is None: parser.error("no filepath specified") return filepath, options