This Gist contains a Flask app that emulates a MyST content server. We dynamically generate AST on the fly.
npm run theme:bookin MyST Theme repoflask --app app run --port 3100- Go!
 
| #!/usr/bin/env python | |
| import subprocess | |
| import json | |
| import argparse | |
| import math | |
| import sys | |
| NFS_TEMPLATE = """ | |
| jupyterhub-home-nfs: | |
| quotaEnforcer: | 
| #!/usr/bin/env bash | |
| set -eu | |
| # We ensure that nothing has the wrong project by clearing project IDs | |
| # Clear the /export/staging project (it's not actually a project, but this works) | |
| xfs_quota -x -c "project -C -p /export/staging 0" /export -D /dev/null -P /dev/null | |
| # We ensure no quotas are set, so that the reconciliation loop happens | |
| # Clear all quotas | |
| cut -d: -f1 /etc/projid | tail -n+2 | xargs -I{} xfs_quota -x -c 'limit -p bhard=0 {}' -D /etc/projects -P /etc/projid /export | 
| import retextSpell from "retext-spell"; | |
| async function loadDictionary(dictionary) { | |
| const baseUrl = new URL(`https://unpkg.com/dictionary-${dictionary}@latest/`); | |
| const [aff, dic] = await Promise.all([ | |
| fetch(new URL("index.aff", baseUrl)), | |
| fetch(new URL("index.dic", baseUrl)), | |
| ]); | 
| .jp-NotebookPanel-toolbar { | |
| display: none; | |
| & ~ *{ | |
| top: 0px!important; | |
| } | |
| } | 
| [flake8] | |
| # Match black | |
| max-line-length = 88 | |
| # Allow asymmetric commas, etc. | |
| extend-ignore = | |
| E203, | |
| # Spurious warnings in JupyterLab for code cells that follow Markdown cells | |
| E303 | |
| exclude = .git,__pycache__,build,dist,.venv | |
| max-complexity = 10 | 
npm installnpm run buildnode dist/provision.cjs **/*.md inside your top-level Python virtual environment that is used by MyST to run Jupyter Server| #!/usr/bin/env python3 | |
| import re | |
| import sys | |
| import tomllib | |
| import json | |
| import argparse | |
| import pathlib | |
| import shutil | |
| import subprocess |