#!/usr/bin/env python """ ================================================================================ |,---. | | , .| | ||---', .|--- |---.,---.,---. |\ ||---.,---.,---.,---.. ,,---.,---.|--- || | || | || || | | \ || || | || | \ / |---'| | `` `---|`---'` '`---'` ' ` `'`---'`---'`---'` ' `' `---'` `---' `---' ================================================================================ Highly experimental for now """ #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- from __future__ import print_function import sys import io import os from converters.template import ConverterTemplate # From IPython # All the stuff needed for the configurable things from IPython.config.application import Application from IPython.config.loader import ConfigFileNotFound from IPython.utils.traitlets import Unicode, Bool from converters.transformers import (ExtractFigureTransformer) from converters.config import GlobalConfigurable class NbconvertApp(Application): """A basic application to convert ipynb files """ stdout = Bool(True, config=True, help=""" Wether to print the converted ipynb file to stdout use full do diff files without actually writing a new file """) write = Bool(False, config=True, help="""Shoudl the converted notebook file be written to disk along with potential extracted resources. """ ) fileext = Unicode('txt', config=True, help="""Extension of the file that should be written to disk""" ) aliases = { 'stdout':'NbconvertApp.stdout', 'write':'NbconvertApp.write', } flags = {} flags['no-stdout'] = ( {'NbconvertApp' : {'stdout' : False}}, """Do not print converted file to stdout, equivalent to --stdout=False """ ) def __init__(self, **kwargs): super(NbconvertApp, self).__init__(**kwargs) self.classes.insert(0, ConverterTemplate) # register class here to have help with help all self.classes.insert(0, ExtractFigureTransformer) self.classes.insert(0, GlobalConfigurable) def load_config_file(self, profile_name): """load a config file from the config file dir profile_name : {string} name of the profile file to load without file extension. """ try: Application.load_config_file( self, profile_name+'.nbcv', path=[os.path.join(os.getcwdu(), 'profile')] ) return True except ConfigFileNotFound: self.log.warn("Config file for profile '%s' not found, giving up ", profile_name) return False def initialize(self, argv=None): """parse command line and load config""" self.parse_command_line(argv) cl_config = self.config profile_file = argv[1] if not self.load_config_file(profile_file): exit(1) self.update_config(cl_config) def run(self): """Convert a notebook in one step""" ipynb_file = (self.extra_args or [None])[2] # If you are writting a custom transformer, append it to the dictionary # below. userpreprocessors = {} # Create the converter C = ConverterTemplate(config=self.config, preprocessors=userpreprocessors) output, resources = C.from_filename(ipynb_file) if self.stdout : print(output.encode('utf-8')) out_root = ipynb_file[:-6].replace('.', '_').replace(' ', '_') keys = resources.get('figures', {}).keys() if self.write : with io.open(os.path.join(out_root+'.'+self.fileext), 'w') as f: f.write(output) if keys : if self.write: files_dir = out_root+'_files' if not os.path.exists(out_root+'_files'): os.mkdir(files_dir) for key in keys: with io.open(os.path.join(files_dir, key), 'wb') as f: f.write(resources['figures'][key]) elif self.stdout: print('''====================== Keys in Resources ==================================''') print(resources['figures'].keys()) print(""" =========================================================================== you are responsible from writing those data do a file in the right place if they need to be. =========================================================================== """) def main(): """Convert a notebook to html in one step""" app = NbconvertApp.instance() app.description = __doc__ app.initialize(argv=sys.argv) app.start() app.run() #----------------------------------------------------------------------------- # Script main #----------------------------------------------------------------------------- if __name__ == '__main__': main()