Spaces:
Running
Running
| # AUTOGENERATED! DO NOT EDIT! File to edit: curations/devtips/02_nbdev_quarto.ipynb. | |
| # %% auto 0 | |
| __all__ = ['MyFrontmatterProc', 'filter_nb'] | |
| # %% curations/devtips/02_nbdev_quarto.ipynb 4 | |
| import sys | |
| import nbformat | |
| from nbdev.imports import * | |
| from nbdev.process import * | |
| from nbdev.processors import NBProcessor, mk_cell, populate_language, add_show_docs, insert_warning,\ | |
| strip_ansi, hide_line, filter_stream_, rm_header_dash,\ | |
| clean_show_doc, exec_show_docs, rm_export, clean_magics, hide_, add_links, strip_hidden_metadata | |
| from pathlib import Path | |
| import yaml | |
| import re | |
| from execnb.nbio import dict2nb,loads | |
| # %% curations/devtips/02_nbdev_quarto.ipynb 5 | |
| _RE_FM_BASE=r'''^---\s* | |
| (.*?\S+.*?) | |
| ---\s*''' | |
| _re_fm_nb = re.compile(_RE_FM_BASE+'$', flags=re.DOTALL) | |
| _re_fm_md = re.compile(_RE_FM_BASE, flags=re.DOTALL) | |
| def _fm2dict(s:str, nb=True): | |
| "Load YAML frontmatter into a `dict`" | |
| re_fm = _re_fm_nb if nb else _re_fm_md | |
| match = re_fm.search(s.strip()) | |
| return yaml.safe_load(match.group(1)) if match else {} | |
| def _md2dict(s:str): | |
| "Convert H1 formatted markdown cell to frontmatter dict" | |
| if '#' not in s: return {} | |
| m = re.search(r'^#\s+(\S.*?)\s*$', s, flags=re.MULTILINE) | |
| if not m: return {} | |
| res = {'title': m.group(1)} | |
| m = re.search(r'^>\s+(\S.*?)\s*$', s, flags=re.MULTILINE) | |
| if m: res['description'] = m.group(1) | |
| r = re.findall(r'^-\s+(\S.*:.*\S)\s*$', s, flags=re.MULTILINE) | |
| if r: | |
| try: res.update(yaml.safe_load('\n'.join(r))) | |
| except Exception as e: warn(f'Failed to create YAML dict for:\n{r}\n\n{e}\n') | |
| return res | |
| # %% curations/devtips/02_nbdev_quarto.ipynb 6 | |
| def _dict2fm(d): return f'---\n{yaml.dump(d)}\n---\n\n' | |
| def _insertfm(nb, fm): nb.cells.insert(0, mk_cell(_dict2fm(fm), 'raw')) | |
| class MyFrontmatterProc(Processor): | |
| "A YAML and formatted-markdown frontmatter processor" | |
| def begin(self): self.fm = getattr(self.nb, 'frontmatter_', {}) | |
| def _update(self, f, cell): | |
| s = cell.get('source') | |
| if not s: return | |
| d = f(s) | |
| if not d: return | |
| self.fm.update(d) | |
| cell.source = None | |
| def cell(self, cell): | |
| if cell.cell_type=='raw': self._update(_fm2dict, cell) | |
| elif cell.cell_type=='markdown' and 'title' not in self.fm: self._update(_md2dict, cell) | |
| def end(self): | |
| self.nb.frontmatter_ = self.fm | |
| if not self.fm: return | |
| _insertfm(self.nb, self.fm) | |
| # %% curations/devtips/02_nbdev_quarto.ipynb 7 | |
| def filter_nb(): | |
| procs = [MyFrontmatterProc, populate_language, insert_warning, | |
| strip_ansi, hide_line, filter_stream_, rm_header_dash, | |
| clean_magics, hide_, strip_hidden_metadata] | |
| nb_txt = sys.stdin.read() | |
| nb = dict2nb(loads(nb_txt)) | |
| nbp = NBProcessor(nb=nb, procs=procs) | |
| nbp.process() | |
| nbformat.write(nbp.nb, sys.stdout) | |
| filter_nb() | |