mirror of
https://github.com/wassname/jupyter_contrib_nbextensions.git
synced 2026-06-27 16:10:24 +08:00
58 lines
1.9 KiB
Python
58 lines
1.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""This preprocessor removes lines in code cells that have been marked as `folded`
|
|
by the codefolding extension
|
|
"""
|
|
|
|
from IPython.nbconvert.preprocessors import *
|
|
from six import StringIO
|
|
|
|
class CodeFoldingPreprocessor(Preprocessor):
|
|
|
|
def fold_cell(self,cell,folded):
|
|
"""
|
|
Remove folded lines and add a '<->' at the parent line
|
|
"""
|
|
f = StringIO(cell)
|
|
lines = f.readlines()
|
|
|
|
if folded[0] == 0 and lines[0][0] == '#':
|
|
# fold when first line is a comment
|
|
return lines[0].rstrip('\n') + '<->\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') + '<->\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.
|
|
cell_index : int
|
|
Index of the cell being processed (see base.py)
|
|
"""
|
|
if hasattr(cell, "input") and cell.cell_type == "code":
|
|
if hasattr(cell['metadata'], 'code_folding'):
|
|
folded = cell['metadata']['code_folding']
|
|
if len(folded) > 0:
|
|
cell.input = self.fold_cell(cell.input, folded)
|
|
return cell, resources
|