Source code for ipypublish.preprocessors.latex_doc_defaults
import logging
import traitlets as traits
from nbconvert.preprocessors import Preprocessor
from nbformat.notebooknode import NotebookNode
[docs]def flatten(d, key_as_tuple=True, sep="."):
""" get nested dict as {key:val,...},
where key is tuple/string of all nested keys
Parameters
----------
d : dict
key_as_tuple : bool
whether keys are list of nested keys or delimited string of nested keys
sep : str
if key_as_tuple=False, delimiter for keys
Examples
--------
>>> from pprint import pprint
>>> d = {1:{"a":"A"},2:{"b":"B"}}
>>> pprint(flatten(d))
{(1, 'a'): 'A', (2, 'b'): 'B'}
>>> d = {1:{"a":"A"},2:{"b":"B"}}
>>> pprint(flatten(d,key_as_tuple=False))
{'1.a': 'A', '2.b': 'B'}
"""
def expand(key, value):
if isinstance(value, dict):
if key_as_tuple:
return [(key + k, v) for k, v in flatten(value, key_as_tuple).items()]
else:
return [
(str(key) + sep + k, v)
for k, v in flatten(value, key_as_tuple).items()
]
else:
return [(key, value)]
if key_as_tuple:
items = [item for k, v in d.items() for item in expand((k,), v)]
else:
items = [item for k, v in d.items() for item in expand(k, v)]
return dict(items)
[docs]class MetaDefaults(Preprocessor):
""" a preprocessor which enters default metadata tags
into all cell metadata, without overriding any currently set
"""
nb_defaults = traits.Dict(
default_value={}, help="dict of notebook level defaults"
).tag(config=True)
cell_defaults = traits.Dict(
default_value={}, help="dict of cell level defaults"
).tag(config=True)
overwrite = traits.Bool(
False, help="whether existing values should be overwritten"
).tag(config=True)
[docs] def preprocess(self, nb, resources):
logging.info("adding ipub defaults to notebook")
for keys, val in flatten(self.nb_defaults).items():
dct = nb.metadata
for key in keys[:-1]:
if key not in dct:
dct[key] = NotebookNode({})
dct = dct[key]
if keys[-1] not in dct:
dct[keys[-1]] = val
elif self.overwrite:
dct[keys[-1]] = val
for cell in nb.cells:
for keys, val in flatten(self.cell_defaults).items():
dct = cell.metadata
leaf_not_dict = False
for key in keys[:-1]:
if key not in dct:
dct[key] = NotebookNode({})
elif dct[key] is False and self.overwrite:
dct[key] = NotebookNode({})
elif dct[key] is True:
dct[key] = NotebookNode({})
elif not hasattr(dct[key], "items"):
leaf_not_dict = True
break
dct = dct[key]
if leaf_not_dict:
pass
elif keys[-1] not in dct:
dct[keys[-1]] = val
elif self.overwrite:
dct[keys[-1]] = val
return nb, resources