def _run_procs(procs=None, return_nb=False, path=_test_file):
nbp = NBProcessor(path, procs)
nbp.process()
if return_nb: return nbp.nb
return '\n'.join([str(cell) for cell in nbp.nb.cells])processors
On this page we’ll be using this private helper to process a notebook and return the results, to simplify testing:
populate_language
def populate_language(
nb
):Set cell language based on NB metadata and magics
insert_warning
def insert_warning(
nb
):Insert Autogenerated Warning Into Notebook after the first cell.
This preprocessor inserts a warning in the markdown destination that the file is autogenerated. This warning is inserted in the second cell so we do not interfere with front matter.
res = _run_procs(insert_warning)
assert "<!-- WARNING: THIS FILE WAS AUTOGENERATED!" in resL('foo', None, 'a').filter(lambda x:x == 1)
_tstre = re.compile('a')add_show_docs
def add_show_docs(
nb
):Add show_doc cells after exported cells, unless they are already documented
cell_lang
def cell_lang(
cell
):Call self as a function.
res = _run_procs([populate_language, add_show_docs])
assert "show_doc(some_func)'" in res
assert "show_doc(and_another)'" in res
assert "show_doc(another_func)'" not in resfdiv
def fdiv(
attrs:str=''
):Create a fenced div markdown cell in quarto
a = fdiv('.py-2')
test_eq(a.cell_type, 'markdown')
test_eq(a.source, '::: {.py-2}')boxify
def boxify(
cells
):Add a box around cells
mv_exports
def mv_exports(
nb
):Move exports cells to after the show_doc
add_links
def add_links(
cell
):Add links to markdown cells
res = _run_procs(add_links)
assert "[`numpy.array`](https://numpy.org/doc/stable/reference/generated/numpy.array.html#numpy.array)" in res
assert "[`ModuleMaker`](https://nbdev.fast.ai/api/maker.html#modulemaker) but not a link to `foobar`." in res
assert "A link in a docstring: [`ModuleMaker`](https://nbdev.fast.ai/api/maker.html#modulemaker)." in res
assert "And not a link to <code>dict2nb</code>." in res
# nbformat also allows mime data as a *list* of lines -- `add_links` must handle both forms
c = AttrDict(cell_type='code', outputs=[AttrDict(data=AttrDict({'text/markdown': ['A link to\n', '`ModuleMaker`.\n']}))])
add_links(c)
assert 'maker.html#modulemaker' in c.outputs[0].data['text/markdown']add_fold
def add_fold(
cell
):Add code-fold to exports cells
res = _run_procs(add_fold)
assert "#| code-fold: show" in resGets rid of colors that are streamed from standard out, which can interfere with static site generators:
strip_ansi
def strip_ansi(
cell
):Strip Ansi Characters.
res = _run_procs(strip_ansi)
assert not _re_ansi_escape.findall(res)
assert r"'hello\n'" in res # text survives intact, not exploded into charshide_
def hide_(
cell
):Hide cell from output
res = _run_procs(hide_)
assert 'you will not be able to see this cell at all either' not in reshide_line
def hide_line(
cell
):Hide lines of code in code cells with the directive hide_line at the end of a line of code
res = _run_procs(hide_line)
assert r"def show():\n a = 2\n b = 3" not in res
assert r"def show():\n a = 2" in resfilter_stream_
def filter_stream_(
cell, words:VAR_POSITIONAL
):Remove output lines containing any of words in cell stream output
res = _run_procs(filter_stream_)
exp=r"'A line\nAnother line.\n'"
assert exp in resai_magics
def ai_magics(
cell
):A preprocessor to convert AI magics to markdown
res = _run_procs(ai_magics)
assert "'source': 'This is a test.'" in resclean_magics
def clean_magics(
cell
):A preprocessor to remove cell magic commands
res = _run_procs(clean_magics)
assert "%%" not in resrm_header_dash
def rm_header_dash(
cell
):Remove headings that end with a dash -
res = _run_procs(rm_header_dash)
assert 'some words' in res
assert 'A heading to Hide' not in res
assert 'Yet another heading to hide' not in resrm_export
def rm_export(
cell
):Remove code cells that are exported or hidden
res = _run_procs(rm_export)
assert 'dontshow' not in resclean_show_doc
def clean_show_doc(
cell
):Remove ShowDoc input cells
exec_show_docs
def exec_show_docs(
nb
):Execute cells needed for show_docs output, including exported cells and imports
exec_show_docs runs the cells the docs need: exports, imports, show_doc calls, and anything marked exec_doc. A notebook whose frontmatter sets skip_showdoc: true is not executed at all during docs rendering, so its stored outputs are used as-is.
res = _run_procs([add_show_docs, exec_show_docs])
assert resFilterDefaults
def FilterDefaults(
args:VAR_POSITIONAL, kwargs:VAR_KEYWORD
):Override FilterDefaults to change which notebook processors are used