python.py
125 lines
| 4.1 KiB
| text/x-python
|
PythonLexer
/ converters / python.py
David Warde-Farley
|
r8789 | """Notebook export to .py source code files. | ||
Since Python export is provided in the notebook itself (provided by classes | ||||
in `IPython.nbformat`), this class serves mainly as a base class for other | ||||
converters that may wish to implement cell-type-specific behaviors. | ||||
""" | ||||
#----------------------------------------------------------------------------- | ||||
# 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 | ||||
#----------------------------------------------------------------------------- | ||||
# IPython imports | ||||
Matthias BUSSONNIER
|
r8620 | from IPython.utils.text import indent | ||
David Warde-Farley
|
r8789 | |||
# Our own imports | ||||
from converters.base import Converter | ||||
Matthias BUSSONNIER
|
r8620 | from converters.utils import remove_ansi | ||
Matthias BUSSONNIER
|
r8618 | |||
David Warde-Farley
|
r8749 | |||
David Warde-Farley
|
r8789 | #----------------------------------------------------------------------------- | ||
# Classes and functions | ||||
#----------------------------------------------------------------------------- | ||||
Matthias BUSSONNIER
|
r8618 | class ConverterPy(Converter): | ||
""" | ||||
A converter that takes a notebook and converts it to a .py file. | ||||
What distinguishes this from PyWriter and PyReader in IPython.nbformat is | ||||
that subclasses can specify what to do with each type of cell. | ||||
Additionally, unlike PyWriter, this does not preserve the '# <markdown>' | ||||
opening and closing comments style comments in favor of a cleaner looking | ||||
python program. | ||||
Note: | ||||
Even though this produces a .py file, it is not guaranteed to be valid | ||||
python file, since the notebook may be using magics and even cell | ||||
magics. | ||||
""" | ||||
extension = 'py' | ||||
def __init__(self, infile, show_prompts=True, show_output=True): | ||||
super(ConverterPy, self).__init__(infile) | ||||
self.show_prompts = show_prompts | ||||
self.show_output = show_output | ||||
@staticmethod | ||||
def comment(input): | ||||
"returns every line in input as commented out" | ||||
David Warde-Farley
|
r8749 | return "# " + input.replace("\n", "\n# ") | ||
Matthias BUSSONNIER
|
r8618 | |||
def render_heading(self, cell): | ||||
David Warde-Farley
|
r8749 | return ['#{0} {1}'.format('#' * cell.level, cell.source), ''] | ||
Matthias BUSSONNIER
|
r8618 | |||
def render_code(self, cell): | ||||
Maximilian Albert
|
r8746 | n = self._get_prompt_number(cell) | ||
Matthias BUSSONNIER
|
r8618 | if not cell.input: | ||
return [] | ||||
lines = [] | ||||
if self.show_prompts: | ||||
Maximilian Albert
|
r8746 | lines.extend(['# In[%s]:' % n]) | ||
Matthias BUSSONNIER
|
r8618 | src = cell.input | ||
lines.extend([src, '']) | ||||
if self.show_output: | ||||
David Warde-Farley
|
r8749 | if cell.outputs: | ||
Maximilian Albert
|
r8746 | lines.extend(['# Out[%s]:' % n]) | ||
Matthias BUSSONNIER
|
r8618 | for output in cell.outputs: | ||
conv_fn = self.dispatch(output.output_type) | ||||
lines.extend(conv_fn(output)) | ||||
return lines | ||||
def render_markdown(self, cell): | ||||
return [self.comment(cell.source), ''] | ||||
def render_raw(self, cell): | ||||
if self.raw_as_verbatim: | ||||
return [self.comment(indent(cell.source)), ''] | ||||
else: | ||||
return [self.comment(cell.source), ''] | ||||
def render_pyout(self, output): | ||||
lines = [] | ||||
## if 'text' in output: | ||||
Maximilian Albert
|
r8746 | ## lines.extend(['*Out[%s]:*' % self._get_prompt_number(cell), '']) | ||
Matthias BUSSONNIER
|
r8618 | |||
# output is a dictionary like object with type as a key | ||||
if 'latex' in output: | ||||
pass | ||||
if 'text' in output: | ||||
lines.extend([self.comment(indent(output.text)), '']) | ||||
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))), ''] | ||||
def _img_lines(self, img_file): | ||||
David Warde-Farley
|
r8749 | return [self.comment('image file: %s' % img_file), ''] | ||
Matthias BUSSONNIER
|
r8618 | |||
def render_display_format_text(self, output): | ||||
return [self.comment(indent(output.text))] | ||||
def _unknown_lines(self, data): | ||||
David Warde-Farley
|
r8749 | return [self.comment('Warning: Unknown cell' + str(data))] | ||
Matthias BUSSONNIER
|
r8618 | |||
def render_display_format_html(self, output): | ||||
return [self.comment(output.html)] | ||||
def render_display_format_latex(self, output): | ||||
return [] | ||||
def render_display_format_json(self, output): | ||||
return [] | ||||
def render_display_format_javascript(self, output): | ||||
return [] | ||||