##// END OF EJS Templates
Start to think on api...
Start to think on api converter now return a tuple: the converted file and potential other resources in a dict

File last commit:

r9182:ff78122f
r9182:ff78122f
Show More
template.py
162 lines | 5.2 KiB | text/x-python | PythonLexer
Matthias BUSSONNIER
starting templates
r8994 """Base classes for the notebook conversion pipeline.
This module defines Converter, from which all objects designed to implement
a conversion of IPython notebooks to some other format should inherit.
"""
#-----------------------------------------------------------------------------
# Copyright (c) 2012, the IPython Development Team.
#
# Distributed under the terms of the Modified BSD License.
#
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
from __future__ import print_function, absolute_import
# Stdlib imports
import jinja2
import codecs
import io
import logging
import os
Matthias BUSSONNIER
read css from ipython dir
r9040 from IPython.utils import path
Matthias BUSSONNIER
starting templates
r8994 import pprint
import re
from types import FunctionType
from jinja2 import Environment, PackageLoader, FileSystemLoader
Matthias BUSSONNIER
try to play with data display priority
r9049 env = Environment(
loader=FileSystemLoader('./templates/'),
extensions=['jinja2.ext.loopcontrols']
)
Matthias BUSSONNIER
starting templates
r8994
# IPython imports
from IPython.nbformat import current as nbformat
from IPython.config.configurable import Configurable, SingletonConfigurable
from IPython.utils.traitlets import (List, Unicode, Type, Bool, Dict, CaselessStrEnum,
Any)
# Our own imports
from IPython.utils.text import indent
from .utils import remove_ansi
Matthias BUSSONNIER
null template
r8997 from markdown import markdown
Matthias BUSSONNIER
svgoutput
r9039 from .utils import highlight,ansi2html
Matthias BUSSONNIER
starting templates
r8994 #-----------------------------------------------------------------------------
# Class declarations
#-----------------------------------------------------------------------------
def rm_fake(strng):
return strng.replace('/files/', '')
class ConversionException(Exception):
pass
def python_comment(string):
return '# '+'\n# '.join(string.split('\n'))
Matthias BUSSONNIER
read css from ipython dir
r9040
def header_body():
"""Return the body of the header as a list of strings."""
from pygments.formatters import HtmlFormatter
header = []
static = os.path.join(path.get_ipython_package_dir(),
'frontend', 'html', 'notebook', 'static',
)
here = os.path.split(os.path.realpath(__file__))[0]
css = os.path.join(static, 'css')
for sheet in [
# do we need jquery and prettify?
# os.path.join(static, 'jquery', 'css', 'themes', 'base',
# 'jquery-ui.min.css'),
# os.path.join(static, 'prettify', 'prettify.css'),
os.path.join(css, 'boilerplate.css'),
os.path.join(css, 'fbm.css'),
os.path.join(css, 'notebook.css'),
os.path.join(css, 'renderedhtml.css'),
# our overrides:
Matthias BUSSONNIER
inline css from external files
r9046 os.path.join(here, '..', 'css', 'static_html.css'),
Matthias BUSSONNIER
read css from ipython dir
r9040 ]:
with io.open(sheet, encoding='utf-8') as f:
s = f.read()
Matthias BUSSONNIER
modularize inlining
r9048 header.append(s)
Matthias BUSSONNIER
inline css from external files
r9046
pygments_css = HtmlFormatter().get_style_defs('.highlight')
Matthias BUSSONNIER
modularize inlining
r9048 header.append(pygments_css)
Matthias BUSSONNIER
read css from ipython dir
r9040 return header
Matthias BUSSONNIER
modularize inlining
r9048 inlining= {}
inlining['css'] = header_body()
Matthias BUSSONNIER
read css from ipython dir
r9040
Matthias BUSSONNIER
try to play with data display priority
r9049
def filter_data_type(output):
for fmt in ['html', 'pdf', 'svg', 'latex','png', 'jpg','jpeg' , 'text']:
if fmt in output:
return [fmt]
env.filters['filter_data_type'] = filter_data_type
Matthias BUSSONNIER
starting templates
r8994 env.filters['pycomment'] = python_comment
env.filters['indent'] = indent
env.filters['rm_fake'] = rm_fake
env.filters['rm_ansi'] = remove_ansi
Matthias BUSSONNIER
null template
r8997 env.filters['markdown'] = markdown
env.filters['highlight'] = highlight
Matthias BUSSONNIER
svgoutput
r9039 env.filters['ansi2html'] = ansi2html
Matthias BUSSONNIER
starting templates
r8994
class ConverterTemplate(Configurable):
display_data_priority = ['pdf', 'svg', 'png', 'jpg', 'text']
#-------------------------------------------------------------------------
# Instance-level attributes that are set in the constructor for this
# class.
#-------------------------------------------------------------------------
infile = Any()
Matthias BUSSONNIER
deal with worksheets
r9010
Matthias BUSSONNIER
starting templates
r8994 infile_dir = Unicode()
Matthias BUSSONNIER
null template
r8997 def __init__(self, tplfile='fullhtml', config=None, **kw):
self.template = env.get_template(tplfile+'.tpl')
Matthias BUSSONNIER
starting templates
r8994 super(ConverterTemplate,self).__init__(config=config)
def _get_prompt_number(self, cell):
return cell.prompt_number if hasattr(cell, 'prompt_number') \
else self.blank_symbol
def process(self):
converted_cells = []
for worksheet in self.nb.worksheets:
for cell in worksheet.cells:
cell.type = cell.cell_type
Matthias BUSSONNIER
svgoutput
r9039 cell.haspyout = False
for out in cell.get('outputs',[]):
if out.output_type == 'pyout':
cell.haspyout = True
break
Matthias BUSSONNIER
deal with worksheets
r9010 converted_cells.append(worksheet)
Matthias BUSSONNIER
starting templates
r8994
return converted_cells
def convert(self, cell_separator='\n'):
Matthias BUSSONNIER
Start to think on api...
r9182 """ convert the ipynb file
return both the converted ipynb file and a dict containing potential
other resources
"""
return self.template.render(worksheets=self.process(), inlining=inlining),{}
Matthias BUSSONNIER
starting templates
r8994
def read(self, filename):
"read and parse notebook into NotebookNode called self.nb"
Matthias BUSSONNIER
fix utf8
r9014 with io.open(filename) as f:
Matthias BUSSONNIER
starting templates
r8994 self.nb = nbformat.read(f, 'json')