diff --git a/nbconvert.py b/nbconvert.py
index ccc0aa2..7ed1a13 100755
--- a/nbconvert.py
+++ b/nbconvert.py
@@ -9,23 +9,82 @@ called nb_figure_NN.png. To avoid the two-step process, ipynb -> rst -> html,
use '--format quick-html' which will do ipynb -> html, but won't look as
pretty.
"""
-
+#-----------------------------------------------------------------------------
+# Imports
+#-----------------------------------------------------------------------------
+from __future__ import print_function
+
+# Stdlib
+import codecs
+import logging
import os
+import pprint
+import re
import subprocess
import sys
+
+inkscape = 'inkscape'
+if sys.platform == 'darwin':
+ inkscape = '/Applications/Inkscape.app/Contents/Resources/bin/inkscape'
+ if not os.path.exists(inkscape):
+ inkscape = None
+
+# From IPython
from IPython.external import argparse
from IPython.nbformat import current as nbformat
from IPython.utils.text import indent
from decorators import DocInherit
-# Cell converters
+#-----------------------------------------------------------------------------
+# Utility functions
+#-----------------------------------------------------------------------------
+
+def remove_fake_files_url(cell):
+ """Remove from the cell source the /files/ pseudo-path we use.
+ """
+ src = cell.source
+ cell.source = src.replace('/files/', '')
+
+
+def remove_ansi(src):
+ """Strip all ANSI color escape sequences from input string.
+
+ Parameters
+ ----------
+ src : string
-def unknown_cell(cell):
- """Default converter for cells of unknown type.
+ Returns
+ -------
+ string
"""
+ return re.sub(r'\033\[(0|\d;\d\d)m', '', src)
- return rst_directive('.. warning:: Unknown cell') + \
- [repr(cell)]
+
+# Pandoc-dependent code
+def markdown2latex(src):
+ """Convert a markdown string to LaTeX via pandoc.
+
+ This function will raise an error if pandoc is not installed.
+
+ Any error messages generated by pandoc are printed to stderr.
+
+ Parameters
+ ----------
+ src : string
+ Input string, assumed to be valid markdown.
+
+ Returns
+ -------
+ out : string
+ Output as returned by pandoc.
+ """
+ p = subprocess.Popen('pandoc -f markdown -t latex'.split(),
+ stdin=subprocess.PIPE, stdout=subprocess.PIPE)
+ out, err = p.communicate(src)
+ if err:
+ print(err, file=sys.stderr)
+ #print('*'*20+'\n', out, '\n'+'*'*20) # dbg
+ return out
def rst_directive(directive, text=''):
@@ -34,8 +93,9 @@ def rst_directive(directive, text=''):
out.extend([indent(text), ''])
return out
-# Converters for parts of a cell.
-
+#-----------------------------------------------------------------------------
+# Class declarations
+#-----------------------------------------------------------------------------
class ConversionException(Exception):
pass
@@ -43,29 +103,43 @@ class ConversionException(Exception):
class Converter(object):
default_encoding = 'utf-8'
-
+ extension = str()
+ figures_counter = 0
+ infile = str()
+ infile_dir = str()
+ infile_root = str()
+ files_dir = str()
+ with_preamble = True
+ user_preamble = None
+ output = str()
+ raw_as_verbatim = False
+
def __init__(self, infile):
self.infile = infile
- self.dirpath = os.path.dirname(infile)
-
- @property
- def extension(self):
- raise ConversionException("""extension must be defined in Converter
- subclass""")
+ self.infile_dir = os.path.dirname(infile)
+ infile_root = os.path.splitext(infile)[0]
+ files_dir = infile_root + '_files'
+ if not os.path.isdir(files_dir):
+ os.mkdir(files_dir)
+ self.infile_root = infile_root
+ self.files_dir = files_dir
def dispatch(self, cell_type):
"""return cell_type dependent render method, for example render_code
"""
- # XXX: unknown_cell here is RST specific - make it generic
- return getattr(self, 'render_' + cell_type, unknown_cell)
+ return getattr(self, 'render_' + cell_type, self.render_unknown)
def convert(self):
lines = []
lines.extend(self.optional_header())
- for cell in self.nb.worksheets[0].cells:
- conv_fn = self.dispatch(cell.cell_type)
- lines.extend(conv_fn(cell))
- lines.append('')
+ for worksheet in self.nb.worksheets:
+ for cell in worksheet.cells:
+ #print(cell.cell_type) # dbg
+ conv_fn = self.dispatch(cell.cell_type)
+ if cell.cell_type in ('markdown', 'raw'):
+ remove_fake_files_url(cell)
+ lines.extend(conv_fn(cell))
+ lines.append('')
lines.extend(self.optional_footer())
return '\n'.join(lines)
@@ -83,12 +157,13 @@ class Converter(object):
def save(self, infile=None, encoding=None):
"read and parse notebook into self.nb"
if infile is None:
- infile = os.path.splitext(self.infile)[0] + '.' + self.extension
+ outfile = os.path.basename(self.infile)
+ outfile = os.path.splitext(outfile)[0] + '.' + self.extension
if encoding is None:
encoding = self.default_encoding
- with open(infile, 'w') as f:
+ with open(outfile, 'w') as f:
f.write(self.output.encode(encoding))
- return infile
+ return os.path.abspath(outfile)
def optional_header(self):
return []
@@ -96,6 +171,28 @@ class Converter(object):
def optional_footer(self):
return []
+ def _new_figure(self, data, fmt):
+ """Create a new figure file in the given format.
+
+ Returns a path relative to the input file.
+ """
+ figname = '%s_fig_%02i.%s' % (self.infile_root,
+ self.figures_counter, fmt)
+ self.figures_counter += 1
+ fullname = os.path.join(self.files_dir, figname)
+
+ # Binary files are base64-encoded, SVG is already XML
+ if fmt in ('png', 'jpg', 'pdf'):
+ data = data.decode('base64')
+ fopen = lambda fname: open(fname, 'wb')
+ else:
+ fopen = lambda fname: codecs.open(fname, 'wb', self.default_encoding)
+
+ with fopen(fullname) as f:
+ f.write(data)
+
+ return fullname
+
def render_heading(self, cell):
"""convert a heading cell
@@ -114,18 +211,43 @@ class Converter(object):
Returns list."""
raise NotImplementedError
- def render_pyout(self, cell):
+ def render_pyout(self, output):
"""convert pyout part of a code cell
Returns list."""
raise NotImplementedError
- def render_display_data(self, cell):
+
+ def render_pyerr(self, output):
+ """convert pyerr part of a code cell
+
+ Returns list."""
+ raise NotImplementedError
+
+ def _img_lines(self, img_file):
+ """Return list of lines to include an image file."""
+ # Note: subclasses may choose to implement format-specific _FMT_lines
+ # methods if they so choose (FMT in {png, svg, jpg, pdf}).
+ raise NotImplementedError
+
+ def render_display_data(self, output):
"""convert display data from the output of a code cell
Returns list.
"""
- raise NotImplementedError
+ lines = []
+
+ for fmt in ['png', 'svg', 'jpg', 'pdf']:
+ if fmt in output:
+ img_file = self._new_figure(output[fmt], fmt)
+ # Subclasses can have format-specific render functions (e.g.,
+ # latex has to auto-convert all SVG to PDF first).
+ lines_fun = getattr(self, '_%s_lines' % fmt, None)
+ if not lines_fun:
+ lines_fun = self._img_lines
+ lines.extend(lines_fun(img_file))
+
+ return lines
def render_stream(self, cell):
"""convert stream part of a code cell
@@ -133,16 +255,33 @@ class Converter(object):
Returns list."""
raise NotImplementedError
- def render_plaintext(self, cell):
- """convert plain text
+ def render_raw(self, cell):
+ """convert a cell with raw text
Returns list."""
raise NotImplementedError
+ def render_unknown(self, cell):
+ """Render cells of unkown type
+
+ Returns list."""
+ data = pprint.pformat(cell)
+ logging.warning('Unknown cell:\n%s' % data)
+ return self._unknown_lines(data)
+
+ def _unknown_lines(self, data):
+ """Return list of lines for an unknown cell.
+
+ Parameters
+ ----------
+ data : str
+ The content of the unknown data as a single string.
+ """
+ raise NotImplementedError
+
class ConverterRST(Converter):
extension = 'rst'
- figures_counter = 0
heading_level = {1: '=', 2: '-', 3: '`', 4: '\'', 5: '.', 6: '~'}
@DocInherit
@@ -169,8 +308,11 @@ class ConverterRST(Converter):
return [cell.source]
@DocInherit
- def render_plaintext(self, cell):
- return [cell.source]
+ def render_raw(self, cell):
+ if self.raw_as_verbatim:
+ return ['::', '', indent(cell.source), '']
+ else:
+ return [cell.source]
@DocInherit
def render_pyout(self, output):
@@ -186,25 +328,15 @@ class ConverterRST(Converter):
return lines
@DocInherit
- def render_display_data(self, output):
- lines = []
-
- if 'png' in output:
- # XXX: make the figures notebooks specific (i.e. self.infile) so
- # that multiple notebook conversions don't clobber each other's
- # figures
- infile = 'nb_figure_%s.png' % self.figures_counter
- fullname = os.path.join(self.dirpath, infile)
- with open(fullname, 'w') as f:
- f.write(output.png.decode('base64'))
-
- self.figures_counter += 1
- lines.append('.. image:: %s' % infile)
- lines.append('')
-
- return lines
+ def render_pyerr(self, output):
+ # Note: a traceback is a *list* of frames.
+ return ['::', '', indent(remove_ansi('\n'.join(output.traceback))), '']
@DocInherit
+ def _img_lines(self, img_file):
+ return ['.. image:: %s' % img_file, '']
+
+ @DocInherit
def render_stream(self, output):
lines = []
@@ -213,9 +345,17 @@ class ConverterRST(Converter):
return lines
+ @DocInherit
+ def _unknown_lines(self, data):
+ return rst_directive('.. warning:: Unknown cell') + [data]
+
+
class ConverterQuickHTML(Converter):
extension = 'html'
- figures_counter = 0
+
+ def in_tag(self, tag, src):
+ """Return a list of elements bracketed by the given tag"""
+ return ['<%s>' % tag, src, '%s>' % tag]
def optional_header(self):
# XXX: inject the IPython standard CSS into here
@@ -259,54 +399,226 @@ class ConverterQuickHTML(Converter):
@DocInherit
def render_markdown(self, cell):
- return ["
"+cell.source+"
"]
+ return self.in_tag('pre', cell.source)
@DocInherit
- def render_plaintext(self, cell):
- return [""+cell.source+"
"]
+ def render_raw(self, cell):
+ if self.raw_as_verbatim:
+ return self.in_tag('pre', cell.source)
+ else:
+ return [cell.source]
@DocInherit
def render_pyout(self, output):
- lines = ['Out[%s]: |
' % output.prompt_number, '']
+ lines = [' | Out[%s]: |
' %
+ output.prompt_number, '']
# output is a dictionary like object with type as a key
- if 'latex' in output:
- lines.append("")
- lines.extend(indent(output.latex))
- lines.append(" ")
+ for out_type in ('text', 'latex'):
+ if out_type in output:
+ lines.extend(self.in_tag('pre', indent(output[out_type])))
+
+ return lines
+
+ @DocInherit
+ def render_pyerr(self, output):
+ # Note: a traceback is a *list* of frames.
+ return self.in_tag('pre', remove_ansi('\n'.join(output.traceback)))
+
+ @DocInherit
+ def _img_lines(self, img_file):
+ return ['' % img_file, '']
+
+ @DocInherit
+ def render_stream(self, output):
+ lines = []
if 'text' in output:
- lines.append("")
- lines.extend(indent(output.text))
- lines.append(" ")
+ lines.append(output.text)
return lines
@DocInherit
- def render_display_data(self, output):
- lines = []
+ def _unknown_lines(self, data):
+ return ['Warning:: Unknown cell'] + self.in_tag('pre', data)
+
- if 'png' in output:
- infile = 'nb_figure_%s.png' % self.figures_counter
- fullname = os.path.join(self.dirpath, infile)
- with open(fullname, 'w') as f:
- f.write(output.png.decode('base64'))
+class ConverterLaTeX(Converter):
+ """Converts a notebook to a .tex file suitable for pdflatex.
- self.figures_counter += 1
- lines.append('' % infile)
- lines.append('')
+ Note: this converter *needs*:
+
+ - `pandoc`: for all conversion of markdown cells. If your notebook only
+ has Raw cells, pandoc will not be needed.
+
+ - `inkscape`: if your notebook has SVG figures. These need to be
+ converted to PDF before inclusion in the TeX file, as LaTeX doesn't
+ understand SVG natively.
+
+ You will in general obtain much better final PDF results if you configure
+ the matplotlib backend to create SVG output with
+
+ %config InlineBackend.figure_format = 'svg'
+
+ (or set the equivalent flag at startup or in your configuration profile).
+ """
+ extension = 'tex'
+ documentclass = 'article'
+ documentclass_options = '11pt,english'
+ heading_map = {1: r'\section',
+ 2: r'\subsection',
+ 3: r'\subsubsection',
+ 4: r'\paragraph',
+ 5: r'\subparagraph',
+ 6: r'\subparagraph'}
+
+ def in_env(self, environment, lines):
+ """Return list of environment lines for input lines
+
+ Parameters
+ ----------
+ env : string
+ Name of the environment to bracket with begin/end.
+
+ lines: """
+ out = [r'\begin{%s}' % environment]
+ if isinstance(lines, basestring):
+ out.append(lines)
+ else: # list
+ out.extend(lines)
+ out.append(r'\end{%s}' % environment)
+ return out
+
+ def convert(self):
+ # The main body is done by the logic in the parent class, and that's
+ # all we need if preamble support has been turned off.
+ body = super(ConverterLaTeX, self).convert()
+ if not self.with_preamble:
+ return body
+ # But if preamble is on, then we need to construct a proper, standalone
+ # tex file.
+
+ # Tag the document at the top and set latex class
+ final = [ r'%% This file was auto-generated by IPython, do NOT edit',
+ r'%% Conversion from the original notebook file:',
+ r'%% {0}'.format(self.infile),
+ r'%%',
+ r'\documentclass[%s]{%s}' % (self.documentclass_options,
+ self.documentclass),
+ '',
+ ]
+ # Load our own preamble, which is stored next to the main file. We
+ # need to be careful in case the script entry point is a symlink
+ myfile = __file__ if not os.path.islink(__file__) else \
+ os.readlink(__file__)
+ with open(os.path.join(os.path.dirname(myfile), 'preamble.tex')) as f:
+ final.append(f.read())
+
+ # Load any additional user-supplied preamble
+ if self.user_preamble:
+ final.extend(['', '%% Adding user preamble from file:',
+ '%% {0}'.format(self.user_preamble), ''])
+ with open(self.user_preamble) as f:
+ final.append(f.read())
+
+ # Include document body
+ final.extend([ r'\begin{document}', '',
+ body,
+ r'\end{document}', ''])
+ # Retun value must be a string
+ return '\n'.join(final)
+
+ @DocInherit
+ def render_heading(self, cell):
+ marker = self.heading_map[cell.level]
+ return ['%s{%s}' % (marker, cell.source) ]
+
+ @DocInherit
+ def render_code(self, cell):
+ if not cell.input:
+ return []
+
+ # Cell codes first carry input code, we use lstlisting for that
+ lines = [r'\begin{codecell}']
+
+ lines.extend(self.in_env('codeinput',
+ self.in_env('lstlisting', cell.input)))
+
+ outlines = []
+ for output in cell.outputs:
+ conv_fn = self.dispatch(output.output_type)
+ outlines.extend(conv_fn(output))
+
+ # And then output of many possible types; use a frame for all of it.
+ if outlines:
+ lines.extend(self.in_env('codeoutput', outlines))
+
+ lines.append(r'\end{codecell}')
return lines
+
+ @DocInherit
+ def _img_lines(self, img_file):
+ return self.in_env('center',
+ [r'\includegraphics[width=3in]{%s}' % img_file, r'\par'])
+
+ def _svg_lines(self, img_file):
+ base_file = os.path.splitext(img_file)[0]
+ pdf_file = base_file + '.pdf'
+ subprocess.check_call([ inkscape, '--export-pdf=%s' % pdf_file,
+ img_file])
+ return self._img_lines(pdf_file)
+
@DocInherit
def render_stream(self, output):
lines = []
if 'text' in output:
- lines.append(output.text)
+ lines.extend(self.in_env('verbatim', output.text.strip()))
+
+ return lines
+
+ @DocInherit
+ def render_markdown(self, cell):
+ return [markdown2latex(cell.source)]
+
+ @DocInherit
+ def render_pyout(self, output):
+ lines = []
+
+ # output is a dictionary like object with type as a key
+ if 'latex' in output:
+ lines.extend(output.latex)
+
+ if 'text' in output:
+ lines.extend(self.in_env('verbatim', output.text))
return lines
+ @DocInherit
+ def render_pyerr(self, output):
+ # Note: a traceback is a *list* of frames.
+ return self.in_env('traceback',
+ self.in_env('verbatim',
+ remove_ansi('\n'.join(output.traceback))))
+
+ @DocInherit
+ def render_raw(self, cell):
+ if self.raw_as_verbatim:
+ return self.in_env('verbatim', cell.source)
+ else:
+ return [cell.source]
+
+ @DocInherit
+ def _unknown_lines(self, data):
+ return [r'{\vspace{5mm}\bf WARNING:: unknown cell:}'] + \
+ self.in_env('verbatim', data)
+
+#-----------------------------------------------------------------------------
+# Standalone conversion functions
+#-----------------------------------------------------------------------------
+
def rst2simplehtml(infile):
"""Convert a rst file to simplified html suitable for blogger.
@@ -355,7 +667,7 @@ def rst2simplehtml(infile):
return newfname
-known_formats = "rst (default), html, quick-html"
+known_formats = "rst (default), html, quick-html, latex"
def main(infile, format='rst'):
"""Convert a notebook to html in one step"""
@@ -373,11 +685,16 @@ def main(infile, format='rst'):
elif format == 'quick-html':
converter = ConverterQuickHTML(infile)
rstfname = converter.render()
+ elif format == 'latex':
+ converter = ConverterLaTeX(infile)
+ latexfname = converter.render()
else:
raise SystemExit("Unknown format '%s', " % format +
"known formats are: " + known_formats)
-
+#-----------------------------------------------------------------------------
+# Script main
+#-----------------------------------------------------------------------------
if __name__ == '__main__':
parser = argparse.ArgumentParser(description=__doc__,
diff --git a/preamble.tex b/preamble.tex
new file mode 100644
index 0000000..f35ca8d
--- /dev/null
+++ b/preamble.tex
@@ -0,0 +1,94 @@
+%% This is the automatic preamble used by IPython. Note that it does *not*
+%% include a documentclass declaration, that is added at runtime to the overall
+%% document.
+
+\usepackage{amsmath}
+\usepackage{amssymb}
+\usepackage{graphicx}
+
+% needed for markdown enumerations to work
+\usepackage{enumerate}
+
+% Slightly bigger margins than the latex defaults
+\usepackage{geometry}
+\geometry{verbose,tmargin=3cm,bmargin=3cm,lmargin=2.5cm,rmargin=2.5cm}
+
+% Define a few colors for use in code, links and cell shading
+\usepackage{color}
+\definecolor{orange}{cmyk}{0,0.4,0.8,0.2}
+\definecolor{darkorange}{rgb}{.71,0.21,0.01}
+\definecolor{darkgreen}{rgb}{.12,.54,.11}
+\definecolor{myteal}{rgb}{.26, .44, .56}
+\definecolor{gray}{gray}{0.45}
+\definecolor{lightgray}{gray}{.95}
+\definecolor{mediumgray}{gray}{.8}
+\definecolor{inputbackground}{rgb}{.95, .95, .85}
+\definecolor{outputbackground}{rgb}{.95, .95, .95}
+\definecolor{traceback}{rgb}{1, .95, .95}
+
+% Framed environments for code cells (inputs, outputs, errors, ...). The
+% various uses of \unskip (or not) at the end were fine-tuned by hand, so don't
+% randomly change them unless you're sure of the effect it will have.
+\usepackage{framed}
+
+% remove extraneous vertical space in boxes
+\setlength\fboxsep{0pt}
+
+% codecell is the whole input+output set of blocks that a Code cell can
+% generate.
+\newenvironment{codecell}{%
+ \def\FrameCommand{\color{mediumgray} \vrule width 1pt \hspace{5pt}}%
+ \MakeFramed{\vspace{-0.5em}\FrameRestore}}
+ {\unskip\endMakeFramed}
+
+ \newenvironment{codeinput}{%
+ \def\FrameCommand{\colorbox{inputbackground}}%
+ \MakeFramed{\advance\hsize-\width \FrameRestore}}
+ {\unskip\endMakeFramed}
+
+\newenvironment{codeoutput}{%
+ \def\FrameCommand{\colorbox{outputbackground}}%
+ \vspace{-1.4em}
+ \MakeFramed{\advance\hsize-\width \FrameRestore}}
+ {\unskip\medskip\endMakeFramed}
+
+\newenvironment{traceback}{%
+ \def\FrameCommand{\colorbox{traceback}}%
+ \MakeFramed{\advance\hsize-\width \FrameRestore}}
+ {\endMakeFramed}
+
+% Use and configure listings package for nicely formatted code
+\usepackage{listings}
+\lstset{
+ language=python,
+ aboveskip=\smallskipamount,
+ belowskip=\smallskipamount,
+ %xleftmargin=3mm,
+ breaklines=true,
+ basicstyle=\small \ttfamily,
+ showstringspaces=false,
+ keywordstyle=\color{blue}\bfseries,
+ commentstyle=\color{myteal},
+ stringstyle=\color{darkgreen},
+ identifierstyle=\color{darkorange},
+}
+
+% The hyperref package gives us a pdf with properly built
+% internal navigation ('pdf bookmarks' for the table of contents,
+% internal cross-reference links, web links for URLs, etc.)
+\usepackage{hyperref}
+\hypersetup{
+ breaklinks=true, % so long urls are correctly broken across lines
+ colorlinks=true,
+ urlcolor=blue,
+ linkcolor=darkorange,
+ citecolor=darkgreen,
+ }
+
+% hardcode size of all verbatim environments to be a bit smaller
+\makeatletter
+\g@addto@macro\@verbatim\small\topsep=0.5em\partopsep=0pt
+\makeatother
+
+% Prevent overflowing lines due to urls and other hard-to-break entities.
+\sloppy
diff --git a/tests/test.ipynb b/tests/test.ipynb
index a82ecf7..2ec7f73 100644
--- a/tests/test.ipynb
+++ b/tests/test.ipynb
@@ -51,15 +51,12 @@
{
"cell_type": "markdown",
"source": [
- "A section heading",
- "=================",
- "",
"A bit of text, with *important things*:",
"",
"* and",
- "* more",
+ "* more that **are boldface**, as well as `verbatim`.",
"",
- "Using reST links to `ipython `_."
+ "Using markdown hyperlinks for [ipython](http://ipython.org)."
]
},
{
@@ -67,21 +64,21 @@
"collapsed": false,
"input": [
"f = figure()",
- "plot([1])",
+ "plot([1,2,3])",
"display(f)"
],
"language": "python",
"outputs": [
{
"output_type": "display_data",
- "png": "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\n",
+ "png": "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\n",
"text": [
- ""
+ ""
]
},
{
"output_type": "display_data",
- "png": "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\n"
+ "png": "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\n"
}
],
"prompt_number": 1
@@ -128,7 +125,8 @@
"output_type": "stream",
"stream": "stdout",
"text": [
- "hello world"
+ "hello world",
+ ""
]
}
],
@@ -141,17 +139,70 @@
]
},
{
- "cell_type": "plaintext",
+ "cell_type": "raw",
"source": [
"plain text"
]
},
{
"cell_type": "code",
- "collapsed": true,
- "input": [],
+ "collapsed": false,
+ "input": [
+ "import sys",
+ "m = 'A message'",
+ "print m, 'to stdout'",
+ "print >> sys.stderr, m, 'to stderr'",
+ "m"
+ ],
"language": "python",
- "outputs": []
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "A message to stdout",
+ ""
+ ]
+ },
+ {
+ "output_type": "stream",
+ "stream": "stderr",
+ "text": [
+ "A message to stderr",
+ ""
+ ]
+ },
+ {
+ "output_type": "pyout",
+ "prompt_number": 5,
+ "text": [
+ "'A message'"
+ ]
+ }
+ ],
+ "prompt_number": 5
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "# a traceback",
+ "1/0"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "ename": "ZeroDivisionError",
+ "evalue": "integer division or modulo by zero",
+ "output_type": "pyerr",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mZeroDivisionError\u001b[0m Traceback (most recent call last)",
+ "\u001b[1;32m/home/fperez/ipython/nbconvert/tests/\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# a traceback\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[1;36m1\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[1;31mZeroDivisionError\u001b[0m: integer division or modulo by zero"
+ ]
+ }
+ ],
+ "prompt_number": 6
}
]
}
|