coalescestreams.py
83 lines
| 2.7 KiB
| text/x-python
|
PythonLexer
Jonathan Frederic
|
r10674 | """Module that allows latex output notebooks to be conditioned before | ||
they are converted. Exposes a decorator (@cell_preprocessor) in | ||||
addition to the coalesce_streams pre-proccessor. | ||||
""" | ||||
#----------------------------------------------------------------------------- | ||||
# Copyright (c) 2013, 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. | ||||
#----------------------------------------------------------------------------- | ||||
Jonathan Frederic
|
r10485 | |||
Jonathan Frederic
|
r10674 | #----------------------------------------------------------------------------- | ||
Jonathan Frederic
|
r15869 | # Imports | ||
Jonathan Frederic
|
r10674 | #----------------------------------------------------------------------------- | ||
Jonathan Frederic
|
r15869 | import re | ||
Jonathan Frederic
|
r10485 | |||
Jonathan Frederic
|
r15869 | #----------------------------------------------------------------------------- | ||
# Functions | ||||
#----------------------------------------------------------------------------- | ||||
Jonathan Frederic
|
r10674 | def cell_preprocessor(function): | ||
""" | ||||
Wrap a function to be executed on all cells of a notebook | ||||
Thomas Kluyver
|
r13587 | The wrapped function should have these parameters: | ||
Thomas Kluyver
|
r12553 | |||
Jonathan Frederic
|
r10674 | cell : NotebookNode cell | ||
Notebook cell being processed | ||||
resources : dictionary | ||||
Additional resources used in the conversion process. Allows | ||||
Paul Ivanov
|
r12219 | preprocessors to pass variables into the Jinja engine. | ||
Jonathan Frederic
|
r10674 | index : int | ||
Index of the cell being processed | ||||
""" | ||||
def wrappedfunc(nb, resources): | ||||
Jonathan Frederic
|
r10485 | for worksheet in nb.worksheets : | ||
for index, cell in enumerate(worksheet.cells): | ||||
Jonathan Frederic
|
r10674 | worksheet.cells[index], resources = function(cell, resources, index) | ||
return nb, resources | ||||
Jonathan Frederic
|
r10485 | return wrappedfunc | ||
@cell_preprocessor | ||||
Jonathan Frederic
|
r10674 | def coalesce_streams(cell, resources, index): | ||
""" | ||||
Merge consecutive sequences of stream output into single stream | ||||
to prevent extra newlines inserted at flush calls | ||||
Parameters | ||||
---------- | ||||
cell : NotebookNode cell | ||||
Notebook cell being processed | ||||
resources : dictionary | ||||
Additional resources used in the conversion process. Allows | ||||
transformers to pass variables into the Jinja engine. | ||||
index : int | ||||
Index of the cell being processed | ||||
""" | ||||
Jonathan Frederic
|
r10485 | outputs = cell.get('outputs', []) | ||
if not outputs: | ||||
Jonathan Frederic
|
r10674 | return cell, resources | ||
Jonathan Frederic
|
r10485 | last = outputs[0] | ||
new_outputs = [last] | ||||
Jonathan Frederic
|
r10674 | |||
Jonathan Frederic
|
r10485 | for output in outputs[1:]: | ||
if (output.output_type == 'stream' and | ||||
last.output_type == 'stream' and | ||||
last.stream == output.stream | ||||
): | ||||
Jonathan Frederic
|
r15869 | last.text += output.text | ||
# Respect \r characters. | ||||
cr_pat = re.compile(r'.*\r(?=[^\n])') | ||||
last.text = cr_pat.sub('', last.text) | ||||
Jonathan Frederic
|
r10485 | else: | ||
new_outputs.append(output) | ||||
Jonathan Frederic
|
r12268 | last = output | ||
Jonathan Frederic
|
r10485 | |||
cell.outputs = new_outputs | ||||
Jonathan Frederic
|
r10674 | return cell, resources | ||