def nb2html(nb): """ Cribbed from nbviewer """ config = Config() config.HTMLExporter.template_file = 'basic' config.NbconvertApp.fileext = "html" config.CSSHtmlHeaderTransformer.enabled = False C = HTMLExporter(config=config) return C.from_notebook_node(nb)[0]
def compile_html_string(self, source, is_two_file=True): """Export notebooks as HTML strings.""" if flag is None: req_missing(['ipython[notebook]>=2.0.0'], 'build this site (compile ipynb)') HTMLExporter.default_template = 'basic' c = Config(self.site.config['IPYNB_CONFIG']) exportHtml = HTMLExporter(config=c) with io.open(source, "r", encoding="utf8") as in_file: nb_json = nbformat.read(in_file, current_nbformat) (body, resources) = exportHtml.from_notebook_node(nb_json) return body
def compile_html(self, source, dest, is_two_file=True): if flag is None: req_missing(['ipython[notebook]>=2.0.0'], 'build this site (compile ipynb)') makedirs(os.path.dirname(dest)) HTMLExporter.default_template = 'basic' c = Config(self.site.config['IPYNB_CONFIG']) exportHtml = HTMLExporter(config=c) with io.open(dest, "w+", encoding="utf8") as out_file: with io.open(source, "r", encoding="utf8") as in_file: nb_json = nbformat.read(in_file, current_nbformat) (body, resources) = exportHtml.from_notebook_node(nb_json) out_file.write(body)
def compile_html(self, source, dest, is_two_file=True): if flag is None: req_missing(['ipython>=1.1.0'], 'build this site (compile ipynb)') makedirs(os.path.dirname(dest)) HTMLExporter.default_template = 'basic' c = Config(self.site.config['IPYNB_CONFIG']) exportHtml = HTMLExporter(config=c) with io.open(dest, "w+", encoding="utf8") as out_file: with io.open(source, "r", encoding="utf8") as in_file: nb_json = nbformat.read(in_file, current_nbformat) (body, resources) = exportHtml.from_notebook_node(nb_json) out_file.write(body)
def main(ipynb): print("running %s" % ipynb) with io.open(ipynb, encoding='utf8') as f: nb = read(f, NO_CONVERT) test_notebook(nb) base, ext = os.path.splitext(ipynb) exportHtml = HTMLExporter() (body, resources) = exportHtml.from_notebook_node(nb) outfile = ipynb + ".html" open(outfile, 'w').write(encode_utf8(body)) print("wrote %s" % outfile)
def compile_html(self, source, dest, is_two_file=True): if flag is None: raise Exception('To build this site, you need ' 'to install IPython 1.0.') makedirs(os.path.dirname(dest)) HTMLExporter.default_template = 'basic' exportHtml = HTMLExporter() with codecs.open(dest, "w+", "utf8") as out_file: with codecs.open(source, "r", "utf8") as in_file: nb = in_file.read() nb_json = nbformat.reads_json(nb) (body, resources) = exportHtml.from_notebook_node(nb_json) out_file.write(body)
def main(app): static_dir = os.path.join(app.builder.srcdir, '_static') target_dir = os.path.join(app.builder.srcdir, 'notebooks') source_dir = os.path.abspath( os.path.join(app.builder.srcdir, '..', 'notebooks')) rendered_dir = os.path.join(target_dir, 'rendered') if not os.path.exists(static_dir): os.makedirs(static_dir) if not os.path.exists(target_dir): os.makedirs(target_dir) if not os.path.exists(rendered_dir): os.makedirs(rendered_dir) nbroots = [] nbtitles = [] exporter = HTMLExporter(template_file='full') for nb_src in glob.glob(os.path.join(source_dir, '*.ipynb')): print("converting notebook {0}".format(nb_src)) basedir, nbname = os.path.split(nb_src) nb_dest = os.path.join(target_dir, nbname) shutil.copyfile(nb_src, nb_dest) with open(nb_dest, 'r') as f: nb_json = nbformat.reads_json(f.read()) (body, resources) = exporter.from_notebook_node(nb_json) root, ext = os.path.splitext(nbname) nb_html_dest = os.path.join(rendered_dir, root + '.html') with open(nb_html_dest, 'w') as f: f.write(body) nbroots.append(root) nbtitles.append(get_notebook_title(nb_json, root)) for nbroot, nbtitle in zip(nbroots, nbtitles): with open(os.path.join(target_dir, nbroot + '.rst'), 'w') as f: f.write(RST_TEMPLATE.render(title=nbtitle, nbroot=nbroot)) with open(os.path.join(target_dir, 'index.rst'), 'w') as f: f.write( INDEX_TEMPLATE.render(notebooks=nbroots, sphinx_tag='notebook-examples'))
def compile_html(self, source, dest, is_two_file=True): if flag is None: raise Exception('To build this site, you need ' 'to install IPython 1.0.') try: os.makedirs(os.path.dirname(dest)) except: pass HTMLExporter.default_template = 'basic' exportHtml = HTMLExporter() with codecs.open(dest, "w+", "utf8") as out_file: with codecs.open(source, "r", "utf8") as in_file: nb = in_file.read() nb_json = nbformat.reads_json(nb) (body, resources) = exportHtml.from_notebook_node(nb_json) out_file.write(body)
def main(app): static_dir = os.path.join(app.builder.srcdir, '_static') target_dir = os.path.join(app.builder.srcdir, 'notebooks') source_dir = os.path.abspath(os.path.join(app.builder.srcdir, '..', 'notebooks')) rendered_dir = os.path.join(target_dir, 'rendered') if not os.path.exists(static_dir): os.makedirs(static_dir) if not os.path.exists(target_dir): os.makedirs(target_dir) if not os.path.exists(rendered_dir): os.makedirs(rendered_dir) nbroots = [] nbtitles = [] exporter = HTMLExporter(template_file='full') for nb_src in glob.glob(os.path.join(source_dir, '*.ipynb')): print("converting notebook {0}".format(nb_src)) basedir, nbname = os.path.split(nb_src) nb_dest = os.path.join(target_dir, nbname) shutil.copyfile(nb_src, nb_dest) with open(nb_dest, 'r') as f: nb_json = nbformat.reads_json(f.read()) (body, resources) = exporter.from_notebook_node(nb_json) root, ext = os.path.splitext(nbname) nb_html_dest = os.path.join(rendered_dir, root + '.html') with open(nb_html_dest, 'w') as f: f.write(body) nbroots.append(root) nbtitles.append(get_notebook_title(nb_json, root)) for nbroot, nbtitle in zip(nbroots, nbtitles): with open(os.path.join(target_dir, nbroot + '.rst'), 'w') as f: f.write(RST_TEMPLATE.render(title=nbtitle, nbroot=nbroot)) with open(os.path.join(target_dir, 'index.rst'), 'w') as f: f.write(INDEX_TEMPLATE.render(notebooks=nbroots, sphinx_tag='notebook-examples'))
def render(self): try: with open(self.file_path, 'r') as file_pointer: notebook = nbformat.reads(file_pointer.read(), as_version=4) except ValueError: raise exceptions.InvalidFormat('Could not read ipython notebook file.') exporter = HTMLExporter(config=Config({ 'HTMLExporter': { 'template_file': 'basic', }, 'CSSHtmlHeaderTransformer': { 'enabled': False, }, })) (body, _) = exporter.from_notebook_node(notebook) return self.TEMPLATE.render(base=self.assets_url, body=body)
def render(self): try: with open(self.file_path, 'r') as file_pointer: notebook = nbformat.reads(file_pointer.read(), as_version=4) except ValueError: raise exceptions.InvalidFormat( 'Could not read ipython notebook file.') exporter = HTMLExporter(config=Config({ 'HTMLExporter': { 'template_file': 'basic', }, 'CSSHtmlHeaderTransformer': { 'enabled': False, }, })) (body, _) = exporter.from_notebook_node(notebook) return self.TEMPLATE.render(base=self.assets_url, body=body)
def nb_to_html(nb, template_file = 'basic'): """ Convert notebook `nb` to html, using template `template_file` Parameters ---------- nb : notebook object template_file : str, optional template to use for notebook conversion Returns ------- html : str html output resources : ResourcesDict Resources """ config = Config() config.HTMLExporter.template_file = template_file config.CSSHTMLHeaderTransformer.enabled = False exporter = HTMLExporter(config=config) return exporter.from_notebook_node(nb)
def guide_worksheet(path): require_login() from IPython.nbformat import current as nbformat from IPython.nbconvert.exporters import HTMLExporter from IPython.config import Config try: nb = nbformat.reads_json(file("notebooks/"+path).read()) except IOError: return "Файл %s не найден" % (path) config = Config() config.HTMLExporter.template_file = 'basic' config.NbconvertApp.fileext = 'html' config.CSSHTMLHeaderTransformer.enabled = False # don't strip the files prefix - we use it for redirects config.Exporter.filters = {'strip_files_prefix': lambda s: s} C = HTMLExporter(config=config) body=C.from_notebook_node(nb) return dict(content=body[0])
def main(): """ Render STDIN as a notebook. """ exporter = HTMLExporter() json_as_string = sys.stdin.read().decode("utf-8") try: notebook_node = reads_json(json_as_string) except Exception: logging.exception("Unable to parse JSON.") html, _ = exporter.from_notebook_node(notebook_node) sys.stderr.write("JSON was {:,} byte(s); html is {:,} byte(s).\n".format( len(json_as_string), len(html) )) sys.stdout.write(html.encode("utf-8")) sys.stderr.flush() sys.stdout.flush()
def get(self, user, filename): ## filename can have a path on it next = "/hub/%s/public/%s" % (user, filename) filesystem_path = "/home/%s/Public/%s" % (user, filename) if os.path.isfile(filesystem_path): # download, raw, or view notebook command = "view" if len(self.get_arguments("view")) > 0: command = "view" elif len(self.get_arguments("download")) > 0: command = "download" elif len(self.get_arguments("copy")) > 0: command = "copy" elif len(self.get_arguments("pdf")) > 0: command = "pdf" elif len(self.get_arguments("raw")) > 0: command = "raw" # else: view if filename.endswith(".ipynb"): if command in ["view", "pdf"]: # first, make a notebook html: #with open("/home/%s/Public/%s" % (user, filename)) as fp: # notebook_content = fp.read() if command == "view": exporter = HTMLExporter(template_file='full') else: exporter = PDFExporter(latex_count=1) nb_json = nbformat.read("/home/%s/Public/%s" % (user, filename), as_version=4) #if command == "pdf": # # If pdf, remove heading numbering: # for cell in nb_json["worksheets"][0]["cells"]: # if cell["cell_type"] == "heading": # cell["source"] = re.sub("^([0-9]+\.?)+\s", "", cell["source"]) # where to get css, images? if command == "pdf": self.set_header('Content-Type', "application/pdf") base_filename = os.path.basename(filename) self.set_header('Content-Disposition', 'attachment; filename="%s"' % base_filename) else: # render as HTML # add header/footer: path = "/hub/%s/public" % user parts = [(path, path)] for part in filename.split("/")[:-1]: path += "/" + part parts.append((path, part)) breadcrumbs = " / ".join(map(lambda pair: '<a href="%s" target="_blank">%s</a>' % pair, parts)) env = { "breadcrumbs": breadcrumbs, "url": path + "/" + filename + "?download" } cell = new_markdown_cell(source=""" <table width="100%" style="border: none;"> <tr style="border: none;"> <td style="border: none;" width="100px"> <img src="https://serendip.brynmawr.edu/oneworld/files/styles/thumbnail/public/pictures/SerendipStudioAvatar.png?itok=48Z_omRv"/> </td> <td style="border: none;" width="50%"> <h2><a href="https://serendip.brynmawr.edu/oneworld/tides/explore">TIDES: Teaching to Increase Diversity and Equity in STEM</a></h2> </td> <td style="border: none;"> <a href="http://jupyter.physics.brynmawr.edu/hub/dblank/public/Jupyter%20Help.ipynb" title="Help"> <span class='fa fa-info-circle fa-2x menu-icon'></span> <span class='menu-text'>Help</span> </a> </td> <td style="border: none;"> <a href="{url}" title="Download Notebook" download> <span class='fa fa-download fa-2x menu-icon'></span> <span class='menu-text'>Download Notebook</span> </a> </td> </tr> <tr style="border: none;"> <td colspan="4" style="border: none;"> <b>Public notebooks:</b> {breadcrumbs} </td> </tr> </table> <hr style="background-color: #534f9a; height: 5px; border: 0; "> """.format(**env)) nb_json["cells"].insert(0, cell) (body, resources) = exporter.from_notebook_node(nb_json) self.write(body) elif command == "download": # download notebook json self.download(user, filename, "text/plain") elif command == "copy": # copy notebook json, if logged in if self.get_current_user_name(): self.copy_file(user, filename, self.get_current_user_name()) else: self.write("Please <a href=\"/hub/login?next=%s\">login</a> to allow copy." % next) else: # raw, just get file contents with open("/home/%s/Public/%s" % (user, filename), "rb") as fp: self.write(fp.read()) else: # some other kind of file # FIXME: how to get all of custom stuff? if command == "copy": if self.get_current_user_name(): self.copy_file(user, filename, self.get_current_user_name()) else: self.write("Please <a href=\"/hub/login?next=%s\">login</a> to allow copy." % next) else: # whatever, just get or download it base_filename = os.path.basename(filename) base, ext = os.path.splitext(base_filename) app_log.info("extension is: %s" % ext) if base_filename == "custom.css": file_path = "/home/%s/.ipython/profile_default/static/custom/custom.css" % user self.set_header('Content-Type', "text/css") with open(file_path, "rb") as fp: self.write(fp.read()) elif ext in [".txt", ".html", ".js", ".css", ".pdf", ".gif", ".jpeg", ".jpg", ".png"]: # show in browser app_log.info("mime: %s" % str(mimetypes.guess_type(filename)[0])) self.set_header('Content-Type', mimetypes.guess_type(filename)[0]) with open("/home/%s/Public/%s" % (user, filename), "rb") as fp: self.write(fp.read()) else: self.download(user, filename) else: # not a file; directory listing # filename can have a full path, and might be empty url_path = "/hub/%s/public" % user # could be: images, images/, images/subdir, images/subdir/ if not filename.endswith("/") and filename.strip() != "": filename += "/" files = glob.glob("/home/%s/Public/%s*" % (user, filename)) self.write("<h1>Jupyter Project at Bryn Mawr College</h1>\n") self.write("[<a href=\"/hub/login\">Home</a>] ") if self.get_current_user_name(): self.write("[<a href=\"/user/%(current_user)s/tree\">%(current_user)s</a>] " % {"current_user": self.get_current_user_name()}) self.write("<p/>\n") self.write("<p>Public files for <b>/hub/%s/public/%s</b>:</p>\n" % (user, filename)) self.write("<ol>\n") for absolute_filename in sorted(files): if os.path.isdir(absolute_filename): dir_path = absolute_filename.split("/") dir_name = dir_path[-1] public_path = "/".join(dir_path[dir_path.index("Public") + 1:]) self.write("<li><a href=\"%(url_path)s/%(public_path)s\">%(dir_name)s</a></li>\n" % {"url_path": url_path, "dir_name": dir_name, "public_path": public_path}) else: file_path, filename = absolute_filename.rsplit("/", 1) dir_path = absolute_filename.split("/") public_path = "/".join(dir_path[dir_path.index("Public") + 1:]) variables = {"user": user, "filename": filename, "url_path": url_path, "next": next, "public_path": public_path} if filename.endswith(".ipynb"): if self.get_current_user_name(): self.write(("<li><a href=\"%(url_path)s/%(public_path)s\">%(filename)s</a> "+ "(<a href=\"%(url_path)s/%(public_path)s?raw\">raw</a>, " + "<a href=\"%(url_path)s/%(public_path)s?download\">download</a>, " + "<a href=\"%(url_path)s/%(public_path)s?copy\">copy</a>" + ((", <a href=\"/user/%s/notebooks/Public/%s\">edit</a>" % (user, filename)) if self.get_current_user_name() == user else ", edit") + ")</li>\n") % variables) else: self.write(("<li><a href=\"%(url_path)s/%(public_path)s\">%(filename)s</a> "+ "(<a href=\"%(url_path)s/%(public_path)s?raw\">raw</a>, " + "<a href=\"%(url_path)s/%(public_path)s?download\">download</a>, " + "copy, edit) " + "[<a href=\"/hub/login?next=%(next)s\">login</a> to copy]</li>\n") % variables) else: # some other kind of file (eg, .zip, .css): self.write("<li><a href=\"%(url_path)s/%(public_path)s\">%(filename)s</a></li>\n" % variables) self.write("</ol>\n") self.write("<hr>\n") self.write("<p><i>Please see <a href=\"/hub/dblank/public/Jupyter Help.ipynb\">Jupyter Help</a> for more information about this server.</i></p>\n")
def notebook(preprocessor, tag, markup): match = FORMAT.search(markup) if match: argdict = match.groupdict() src = argdict['src'] start = argdict['start'] end = argdict['end'] language = argdict['language'] else: raise ValueError("Error processing input, " "expected syntax: {0}".format(SYNTAX)) if start: start = int(start) else: start = 0 if end: end = int(end) else: end = None language_applied_highlighter = partial(custom_highlighter, language=language) nb_dir = preprocessor.configs.getConfig('NOTEBOOK_DIR') nb_path = os.path.join('content', nb_dir, src) if not os.path.exists(nb_path): raise ValueError("File {0} could not be found".format(nb_path)) # Create the custom notebook converter c = Config({ 'CSSHTMLHeaderTransformer': { 'enabled': True, 'highlight_class': '.highlight-ipynb' }, 'SubCell': { 'enabled': True, 'start': start, 'end': end } }) template_file = 'basic' if LooseVersion(IPython.__version__) >= '2.0': if os.path.exists('pelicanhtml_2.tpl'): template_file = 'pelicanhtml_2' else: if os.path.exists('pelicanhtml_1.tpl'): template_file = 'pelicanhtml_1' if LooseVersion(IPython.__version__) >= '2.0': subcell_kwarg = dict(preprocessors=[SubCell]) else: subcell_kwarg = dict(transformers=[SubCell]) exporter = HTMLExporter( config=c, template_file=template_file, filters={'highlight2html': language_applied_highlighter}, **subcell_kwarg) # read and parse the notebook with open(nb_path) as f: nb_text = f.read() nb_json = nbformat.reads_json(nb_text) (body, resources) = exporter.from_notebook_node(nb_json) # To make the higlighting work with Ipython 2.X resources['inlining']['css'][1] = resources['inlining']['css'][1].replace( 'highlight', 'highlight-ipynb') # if we haven't already saved the header, save it here. if not notebook.header_saved: print("\n ** Writing styles to _nb_header.html: " "this should be included in the theme. **\n") header = '\n'.join( CSS_WRAPPER.format(css_line) for css_line in resources['inlining']['css']) header += JS_INCLUDE with open('_nb_header.html', 'w') as f: f.write(header) notebook.header_saved = True # this will stash special characters so that they won't be transformed # by subsequent processes. body = preprocessor.configs.htmlStash.store(body, safe=True) return body
def notebook(preprocessor, tag, markup): match = FORMAT.search(markup) if match: argdict = match.groupdict() src = argdict['src'] start = argdict['start'] end = argdict['end'] else: raise ValueError("Error processing input, " "expected syntax: {0}".format(SYNTAX)) if start: start = int(start) else: start = 0 if end: end = int(end) else: end = None settings = preprocessor.configs.config['settings'] nb_dir = settings.get('NOTEBOOK_DIR', 'notebooks') nb_path = os.path.join('content', nb_dir, src) if not os.path.exists(nb_path): raise ValueError("File {0} could not be found".format(nb_path)) # Create the custom notebook converter c = Config({'CSSHTMLHeaderTransformer': {'enabled':True, 'highlight_class':'.highlight-ipynb'}, 'SubCell': {'enabled':True, 'start':start, 'end':end}}) template_file = 'basic' if LooseVersion(IPython.__version__) >= '2.0': if os.path.exists('pelicanhtml_2.tpl'): template_file = 'pelicanhtml_2' else: if os.path.exists('pelicanhtml_1.tpl'): template_file = 'pelicanhtml_1' if LooseVersion(IPython.__version__) >= '2.0': subcell_kwarg = dict(preprocessors=[SubCell]) else: subcell_kwarg = dict(transformers=[SubCell]) exporter = HTMLExporter(config=c, template_file=template_file, filters={'highlight2html': custom_highlighter}, **subcell_kwarg) # read and parse the notebook with open(nb_path) as f: nb_text = f.read() nb_json = nbformat.reads_json(nb_text) (body, resources) = exporter.from_notebook_node(nb_json) for h in '123456': body = body.replace('<h%s' % h, '<h%s class="ipynb"' % h) body = '<div class="ipynb">\n\n' + body + "\n\n</div>" # if we haven't already saved the header, save it here. if not notebook.header_saved: print ("\n ** Writing styles to _nb_header.html: " "this should be included in the theme. **\n") header = '\n'.join(CSS_WRAPPER.format(css_line) for css_line in resources['inlining']['css']) header += JS_INCLUDE # # replace the highlight tags header = header.replace('highlight', 'highlight-ipynb') header = header.replace('html, body', '\n'.join(('pre.ipynb {', ' color: black;', ' background: #f7f7f7;', ' border: 0;', ' box-shadow: none;', ' margin-bottom: 0;', ' padding: 0;' '}\n', 'html, body'))) # # create a special div for notebook header = header.replace('body {', 'div.ipynb {') header = header.replace('body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:20px;color:#000;background-color:#fff}', '') # # specialize headers header = header.replace('html, body,', '\n'.join((('h1.ipynb h2.ipynb h3.ipynb ' 'h4.ipynb h5.ipynb h6.ipynb {'), 'h1.ipynb h2.ipynb ... {', ' margin: 0;', ' padding: 0;', ' border: 0;', ' font-size: 100%;', ' font: inherit;', ' vertical-align: baseline;', '}\n', 'html, body,'))) # # # # comment out document-level formatting header = header.replace('html, body,', '/*html, body,*/') header = header.replace('body{background-color:#fff}', '/*body{background-color:#fff}*/') header = header.replace('body{background-color:#fff;position:absolute;left:0;right:0;top:0;bottom:0;overflow:visible}', '/*body{background-color:#fff;position:absolute;left:0;right:0;top:0;bottom:0;overflow:visible}*/') header = header.replace('h1, h2, h3, h4, h5, h6,', '/*h1, h2, h3, h4, h5, h6,*/') with open('_nb_header.html', 'w') as f: f.write(header) notebook.header_saved = True # this will stash special characters so that they won't be transformed # by subsequent processes. body = preprocessor.configs.htmlStash.store(body, safe=True) return body
def notebook(preprocessor, tag, markup): match = FORMAT.search(markup) if match: argdict = match.groupdict() src = argdict['src'] start = argdict['start'] end = argdict['end'] else: raise ValueError("Error processing input, " "expected syntax: {0}".format(SYNTAX)) if start: start = int(start) else: start = 0 if end: end = int(end) else: end = None settings = preprocessor.configs.config['settings'] nb_dir = settings.get('NOTEBOOK_DIR', 'notebooks') nb_path = os.path.join('content', nb_dir, src) if not os.path.exists(nb_path): raise ValueError("File {0} could not be found".format(nb_path)) # Create the custom notebook converter c = Config({'CSSHTMLHeaderTransformer': {'enabled':True, 'highlight_class':'.highlight-ipynb'}, 'SubCell': {'enabled':True, 'start':start, 'end':end}}) exporter = HTMLExporter(config=c, template_file='basic', filters={'highlight2html': custom_highlighter}, transformers=[SubCell], extra_loaders=[pelican_loader]) # read and parse the notebook with open(nb_path) as f: nb_text = f.read() nb_json = nbformat.reads_json(nb_text) (body, resources) = exporter.from_notebook_node(nb_json) # if we haven't already saved the header, save it here. if not notebook.header_saved: print ("\n ** Writing styles to _nb_header.html: " "this should be included in the theme. **\n") header = '\n'.join(CSS_WRAPPER.format(css_line) for css_line in resources['inlining']['css']) header += JS_INCLUDE with open('_nb_header.html', 'w') as f: f.write(header) notebook.header_saved = True # this will stash special characters so that they won't be transformed # by subsequent processes. body = preprocessor.configs.htmlStash.store(body, safe=True) return body
def read(self, filepath): metadata = {} # Files filedir = os.path.dirname(filepath) filename = os.path.basename(filepath) metadata_filename = filename.split('.')[0] + '.ipynb-meta' metadata_filepath = os.path.join(filedir, metadata_filename) # If filename starts with draft, set the status accordingly if filename.lower().startswith('draft'): metadata['status'] = 'draft' with open(filepath) as f: nb = nbformat.read(f, 'ipynb') # readin ipynb content first_cell = nb.worksheets[0].cells[0] # Read in metadata metadata = join_metadata(metadata, nb.metadata) if 'pelican' in first_cell.metadata: m = first_cell.metadata['pelican'] metadata = join_metadata(metadata, m) if os.path.exists(metadata_filepath): # Metadata is on a external file, process using Pelican MD Reader md_reader = MarkdownReader(self.settings) _content, m = md_reader.read(metadata_filepath) metadata = join_metadata(metadata, m) # Reformat metadata into pelican acceptable format for k, v in metadata.items(): del metadata[k] k = k.lower() metadata[k] = self.process_metadata(k, v) metadata['ipython'] = True # use first cell as the title if flag is set field = 'IPYNB_FIRST_CELL_HEADING_AS_TITLE' if self.settings.get(field, False) and first_cell.cell_type == 'heading': metadata['title'] = first_cell.source # Truncate the first cell from notebook nb.worksheets[0].cells = nb.worksheets[0].cells[1:] # Convert ipython notebook to html config = Config({'CSSHTMLHeaderPreprocessor': {'enabled': True, 'highlight_class': '.highlight-ipynb'}}) exporter = HTMLExporter(config=config, template_file='basic', filters={'highlight2html': custom_highlighter}) content, info = exporter.from_notebook_node(nb) if BeautifulSoup: soup = BeautifulSoup(content) for i in soup.findAll("div", {"class" : "input"}): if i.findChildren()[1].find(text='#ignore') is not None: i.extract() else: soup = content content = '<body>{0}</body>'.format(soup) # So Pelican HTMLReader works parser = MyHTMLParser(self.settings, filename) parser.feed(content) parser.close() body = parser.body summary = parser.summary field = 'IPYNB_FIRST_CONTENT_AS_SUMMARY' first_cell = nb.worksheets[0].cells[0] if self.settings.get(field, False) and first_cell.cell_type == 'markdown': raw = nb.worksheets[0].cells[0].source md = markdown.Markdown() metadata['summary'] = md.convert(raw) else: metadata['summary'] = summary # Remove some CSS styles, so it doesn't break the theme. def filter_tags(style_text): style_list = style_text.split('\n') exclude = ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'a', 'ul', 'ol', 'li', '.rendered_html', '@media', '.navbar', 'nav.navbar', '.navbar-text', 'code', 'pre', 'div.text_cell_render'] style_list = [i for i in style_list if len(list(filter(i.startswith, exclude))) == 0] ans = '\n'.join(style_list) return '<style type=\"text/css\">{0}</style>'.format(ans) css = '\n'.join(filter_tags(css) for css in info['inlining']['css']) css = css + CUSTOM_CSS body = css + body return body, metadata
def notebook(preprocessor, tag, markup): match = FORMAT.search(markup) if match: argdict = match.groupdict() src = argdict['src'] start = argdict['start'] end = argdict['end'] else: raise ValueError("Error processing input, " "expected syntax: {0}".format(SYNTAX)) if start: start = int(start) else: start = 0 if end: end = int(end) else: end = None settings = preprocessor.configs.config['settings'] nb_dir = settings.get('NOTEBOOK_DIR', 'notebooks') nb_path = os.path.join('content', nb_dir, src) if not os.path.exists(nb_path): raise ValueError("File {0} could not be found".format(nb_path)) # Create the custom notebook converter c = Config({ 'CSSHTMLHeaderTransformer': { 'enabled': True, 'highlight_class': '.highlight-ipynb' }, 'SubCell': { 'enabled': True, 'start': start, 'end': end } }) exporter = HTMLExporter(config=c, template_file='basic', filters={'highlight2html': custom_highlighter}, transformers=[SubCell], extra_loaders=[pelican_loader]) # read and parse the notebook with open(nb_path) as f: nb_text = f.read() nb_json = nbformat.reads_json(nb_text) (body, resources) = exporter.from_notebook_node(nb_json) # if we haven't already saved the header, save it here. if not notebook.header_saved: print("\n ** Writing styles to _nb_header.html: " "this should be included in the theme. **\n") header = '\n'.join( CSS_WRAPPER.format(css_line) for css_line in resources['inlining']['css']) header += JS_INCLUDE with open('_nb_header.html', 'w') as f: f.write(header) notebook.header_saved = True # this will stash special characters so that they won't be transformed # by subsequent processes. body = preprocessor.configs.htmlStash.store(body, safe=True) return body
def notebook(preprocessor, tag, markup): match = FORMAT.search(markup) if match: argdict = match.groupdict() src = argdict['src'] start = argdict['start'] end = argdict['end'] language = argdict['language'] else: raise ValueError("Error processing input, " "expected syntax: {0}".format(SYNTAX)) if start: start = int(start) else: start = 0 if end: end = int(end) else: end = None language_applied_highlighter = partial(custom_highlighter, language=language) nb_dir = preprocessor.configs.getConfig('NOTEBOOK_DIR') nb_path = os.path.join('content', nb_dir, src) if not os.path.exists(nb_path): raise ValueError("File {0} could not be found".format(nb_path)) # Create the custom notebook converter c = Config({'CSSHTMLHeaderTransformer': {'enabled':True, 'highlight_class':'.highlight-ipynb'}, 'SubCell': {'enabled':True, 'start':start, 'end':end}}) template_file = 'basic' if IPYTHON_VERSION >= 3: if os.path.exists('pelicanhtml_3.tpl'): template_file = 'pelicanhtml_3' elif IPYTHON_VERSION == 2: if os.path.exists('pelicanhtml_2.tpl'): template_file = 'pelicanhtml_2' else: if os.path.exists('pelicanhtml_1.tpl'): template_file = 'pelicanhtml_1' if IPYTHON_VERSION >= 2: subcell_kwarg = dict(preprocessors=[SubCell]) else: subcell_kwarg = dict(transformers=[SubCell]) exporter = HTMLExporter(config=c, template_file=template_file, filters={'highlight2html': language_applied_highlighter}, **subcell_kwarg) # read and parse the notebook with open(nb_path) as f: nb_text = f.read() if IPYTHON_VERSION < 3: nb_json = IPython.nbformat.current.reads_json(nb_text) else: nb_json = IPython.nbformat.reads(nb_text, as_version=4) (body, resources) = exporter.from_notebook_node(nb_json) # if we haven't already saved the header, save it here. if not notebook.header_saved: print ("\n ** Writing styles to _nb_header.html: " "this should be included in the theme. **\n") header = '\n'.join(CSS_WRAPPER.format(css_line) for css_line in resources['inlining']['css']) header += JS_INCLUDE with open('_nb_header.html', 'w') as f: f.write(header) notebook.header_saved = True # this will stash special characters so that they won't be transformed # by subsequent processes. body = preprocessor.configs.htmlStash.store(body, safe=True) return body