Files
jupyter_contrib_nbextensions/extensions/pre_codefolding.py
T
Josh Barnes 2078dc64bc remove six requirement
* use explicit unicode string, which is supported in python 2 and in python 3.3+ (notebook requires at least 3.3, so we can assume this if py3 is in use at all)
* use splitlines, rather than StringIO.readlines
2016-05-03 00:11:17 +01:00

60 lines
2.0 KiB
Python

# -*- coding: utf-8 -*-
"""
This preprocessor removes lines in code cells that have been marked as `folded`
by the codefolding extension
"""
from nbconvert.preprocessors import Preprocessor
class CodeFoldingPreprocessor(Preprocessor):
fold_mark = u'↔'
def fold_cell(self, cell, folded):
"""
Remove folded lines and add a '<->' at the parent line
"""
lines = cell.splitlines(True)
if folded[0] == 0 and (lines[0][0] == '#' or lines[0][0] == '%') :
# fold whole cell when first line is a comment or magic
return lines[0].rstrip('\n') + self.fold_mark + '\n'
fold_indent = 0
fold = False
fcell = ""
for i, l in enumerate(lines):
# fold indent level
indent = len(l)-len(l.lstrip(' '))
if indent <= fold_indent:
fold = False
fold_indent = 0
if i in folded:
fold = True
fold_indent = indent
fcell += l.rstrip('\n') + self.fold_mark + '\n'
if fold is False:
fcell += l
return fcell
def preprocess_cell(self, cell, resources, index):
"""
Read out metadata and remove lines if marked as `folded` in cell metadata.
Parameters
----------
cell : NotebookNode cell
Notebook cell being processed
resources : dictionary
Additional resources used in the conversion process. Allows
preprocessors to pass variables into the Jinja engine.
index : int
Index of the cell being processed (see base.py)
"""
if hasattr(cell, "source") and cell.cell_type == "code":
if hasattr(cell['metadata'], 'code_folding'):
folded = cell['metadata']['code_folding']
if len(folded) > 0:
cell.source = self.fold_cell(cell.source, folded)
return cell, resources