docsh est une petite collection de scripts Bash pour faciliter la génération et la maintenance
de la documentation statique (par exemple pour Docsify). Les scripts parcourent l'arborescence
du projet, génèrent un _sidebar.md et un _navbar.md, insèrent des sous-navigations dans les
README.md, récupèrent les listes de dépôts git depuis GitHub, GitLab et Codeberg, compilent
les documents Typst et gèrent l'insertion d'éléments médias et de listes de fichiers.
Les scripts sont numérotés et s'exécutent dans cet ordre via autorun.sh.
bash4+,python3,gittypst— seulement pour90_compile_typst.shGITHUB_TOKEN(optionnel) — évite la limite de débit de l'API GitHub dans80_generate_gitrepos.sh
30_generate_media.sh
Remplace le bloc entre <!-- start-replace-media ... --> et <!-- end-replace-media --> par
une liste d'images issues du dossier medias/ du répertoire courant.
Option no-caption : utilise un espace comme texte alternatif (pas de légende).
<!-- start-replace-media -->
* 
<!-- end-replace-media -->35_generate_filelist.sh
Remplace le bloc entre <!-- start-replace-filelist ... --> et <!-- end-replace-filelist -->
par une liste de liens Markdown.
Comportement par défaut : liste tout le contenu non-caché du dossier du README.md (fichiers
et sous-dossiers), en excluant README.md lui-même.
Paramètres du tag :
folder="./chemin"— dossier à scanner (défaut : dossier duREADME.md)pattern="regex"— filtre les noms de fichiers par expression régulièrerecursive(flag) — inclut les sous-dossiersraw(flag) — noms bruts sans mise en forme Title Case
<!-- start-replace-filelist folder="./export" pattern="\.stl$" -->
<!-- end-replace-filelist -->40_variable_expansion.sh
Remplace les variables inline ou blocs entre <!-- %: CLE --> et <!-- %; --> par leur valeur
définie dans un fichier .variable_expansion à la racine du dépôt.
Options CLI : -f VARFILE, -r ROOT, -n (dry-run), -v (verbose).
Version : <!-- %: VERSION -->1.0<!-- %; -->50_generate_frontmatter_content.sh
Scanne les README.md pour leurs métadonnées YAML frontmatter et génère du contenu Markdown
formaté (grille d'images, liste ou tableau) entre les tags <!-- start-replace-frontmatter -->.
Paramètres du tag :
dir="./chemin"— dossier à scannerfilter="cle=valeur"— filtre par champ frontmatter (ex.filter="frontpage=1")sort="champ"— tri par champ frontmatter (numérique : décroissant, texte : croissant)template="grid|list|table"— format de sortie (défaut :grid)fields="champ1,champ2"— colonnes pourlistettable
<!-- start-replace-frontmatter dir="./projets" filter="frontpage=1" sort="year_start" template="grid" -->
<!-- end-replace-frontmatter -->60_generate_subnav.sh
Insère ou met à jour une sous-navigation (liens vers les sous-dossiers) entre les tags
<!-- start-replace-subnav --> et <!-- end-replace-subnav --> dans chaque README.md.
Supporte une image de couverture _cover.png / _cover.jpg dans les sous-dossiers.
Option depth=N dans le tag de début pour limiter la profondeur de récursion.
<!-- start-replace-subnav depth=1 -->
<!-- end-replace-subnav -->70_generate_sidebar.sh
Génère le contenu du _sidebar.md à la racine du dépôt.
Mode tag : si _sidebar.md contient un tag start-replace-sidebar, seul le contenu entre
les tags est remplacé. Mode héritage : si aucun tag, le fichier entier est réécrit.
Paramètres du tag :
dir="./chemin"— dossier à parcourir (défaut : dossier du_sidebar.md)maxdepth="N"— profondeur maximale (défaut : illimitée)filter="cle=valeur"— filtre par champ frontmattersort="champ"— tri par champ frontmatterflat="true"— liste à plat (non indentée)
Un fichier .docshignore dans un dossier exclut ce dossier et ses enfants.
<!-- start-replace-sidebar maxdepth="6" sort="year_start" -->
<!-- end-replace-sidebar -->75_generate_navbar.sh
Génère le contenu du _navbar.md à la racine du dépôt.
Si aucun _navbar.md n'existe, un nouveau fichier est créé.
Paramètres du tag :
dir="./chemin"— dossier à parcourir (défaut : dossier du_navbar.md)maxdepth="N"— profondeur maximale (défaut : 1)filter="cle=valeur"— filtre par champ frontmatter (ex.filter="navbar=1")sort="champ"— tri par champ frontmatter
Les entrées dont le frontmatter contient navbar: 1 sont incluses. Une icône SVG
_icon.svg dans le dossier est automatiquement intégrée en base64 dans le lien.
<!-- start-replace-navbar maxdepth="1" filter="navbar=1" -->
<!-- end-replace-navbar -->80_generate_gitrepos.sh
Pour chaque README.md contenant un tag start-replace-gitrepos, récupère la liste des
dépôts publics depuis GitHub, GitLab ou Codeberg et insère un tableau Markdown.
Les résultats sont mis en cache localement (.gitrepos-result-*.json) et utilisés comme
solution de repli en cas d'échec de l'API.
Attributs du tag :
service="github|gitlab|codeberg"— obligatoireusername="USER"— dépôts d'un compte utilisateurorg="ORG"— dépôts d'une organisation GitHubgroup="chemin/groupe"— dépôts d'un groupe GitLabcreator="LOGIN"— filtre par auteur du premier commit (GitHub uniquement)exclude="regex"— masque les dépôts dont le nom ou la description correspondheading="Titre"— titre de section Markdown au-dessus du tableau
Variable d'environnement : GITHUB_TOKEN pour augmenter la limite de débit de l'API.
<!-- start-replace-gitrepos service="github" username="moncompte" -->
<!-- end-replace-gitrepos -->
<!-- start-replace-gitrepos service="github" org="mon-org" creator="monlogin" exclude="^archive-" -->
<!-- end-replace-gitrepos -->90_compile_typst.sh
Compile les fichiers .typ Typst en PDF. Ne recompile que si la source a été modifiée
depuis la dernière compilation (vérification par mtime).
autorun.sh
Exécute tous les scripts .sh du dossier docsh dans l'ordre alphabétique/numérique,
sauf lui-même. Affiche le temps d'exécution de chaque script.
# Exécuter tous les scripts depuis la racine du dépôt
bash docsh/autorun.sh
# Exécuter un script individuellement
bash docsh/70_generate_sidebar.sh
bash docsh/80_generate_gitrepos.shPour une reconstruction automatique chaque semaine :
- Créer un Project Access Token (
Settings → Access Tokens) avec le scopewrite_repository - L'ajouter comme variable CI
PUSH_TOKEN(Settings → CI/CD → Variables) - Ajouter optionnellement
GITHUB_TOKENpour les appels API GitHub - Créer un Scheduled Pipeline (
CI/CD → Schedules) avec le cron0 4 * * 1(lundi 04h UTC)
Le job rebuild dans .gitlab-ci.yml exécute autorun.sh, commite les fichiers modifiés et
pousse sur la branche principale — ce qui déclenche le déploiement Pages.
- Exécuter depuis la racine du dépôt pour que les chemins relatifs fonctionnent.
- Rendre les scripts exécutables si besoin :
chmod +x docsh/*.sh. - Utiliser
.docshignorepour exclure un dossier de la sidebar et de la subnav. - Commiter les fichiers
.gitrepos-result-*.jsonpour assurer la continuité en cas d'indisponibilité de l'API.
docsh is a small collection of Bash scripts to help generate and maintain static
documentation (for example, Docsify). Scripts walk the project tree, generate _sidebar.md
and _navbar.md, insert sub-navigations into README.md files, fetch repository lists from
GitHub, GitLab and Codeberg, compile Typst documents, and manage media and file-list insertion.
Scripts are numbered and run in order via autorun.sh.
bash4+,python3,gittypst— only required for90_compile_typst.shGITHUB_TOKEN(optional) — avoids GitHub API rate limits in80_generate_gitrepos.sh
30_generate_media.sh
Replaces the block between <!-- start-replace-media ... --> and <!-- end-replace-media -->
with a list of images found in the directory's medias/ folder.
no-caption flag: uses a space as alt text (no visible caption).
<!-- start-replace-media -->
<!-- end-replace-media -->35_generate_filelist.sh
Replaces the block between <!-- start-replace-filelist ... --> and <!-- end-replace-filelist -->
with a Markdown link list.
Default: lists all non-hidden contents of the README's own directory (files and
subdirectories), excluding README.md itself.
Tag parameters:
folder="./path"— folder to scan (default: directory of theREADME.md)pattern="regex"— filter filenames by regexrecursive(flag) — include subdirectoriesraw(flag) — use bare filenames instead of Title Case link text
<!-- start-replace-filelist folder="./export" pattern="\.stl$" -->
<!-- end-replace-filelist -->40_variable_expansion.sh
Replaces inline or block variables between <!-- %: KEY --> and <!-- %; --> with values
defined in a .variable_expansion file at the repository root.
CLI options: -f VARFILE, -r ROOT, -n (dry-run), -v (verbose).
Version: <!-- %: VERSION -->1.0<!-- %; -->50_generate_frontmatter_content.sh
Scans subdirectory README.md files for YAML frontmatter and generates formatted Markdown
content (image grid, list, or table) between <!-- start-replace-frontmatter --> tags.
Tag parameters:
dir="./path"— directory to scanfilter="key=value"— include only entries where frontmatter field equals value (e.g.filter="frontpage=1")sort="field"— sort by frontmatter field (numeric → descending, text → ascending)template="grid|list|table"— output format (default:grid)fields="field1,field2"— columns forlistandtabletemplates
<!-- start-replace-frontmatter dir="./projets" filter="frontpage=1" sort="year_start" template="grid" -->
<!-- end-replace-frontmatter -->60_generate_subnav.sh
Inserts or updates a sub-navigation (links to subdirectories) between
<!-- start-replace-subnav --> and <!-- end-replace-subnav --> in each README.md.
Supports a _cover.png / _cover.jpg cover image in subdirectories.
Add depth=N to the start tag to limit recursion depth.
<!-- start-replace-subnav depth=1 -->
<!-- end-replace-subnav -->70_generate_sidebar.sh
Generates _sidebar.md content at the repository root.
Tag mode: if _sidebar.md contains a start-replace-sidebar tag, only the content between
tags is replaced. Legacy mode: if no tag, the whole file is rewritten.
Tag parameters:
dir="./path"— directory to scan (default: directory of_sidebar.md)maxdepth="N"— stop recursing after N levels (default: unlimited)filter="key=value"— include only entries matching a frontmatter fieldsort="field"— sort siblings by frontmatter fieldflat="true"— emit a flat non-indented list
A .docshignore file in a directory excludes it and its children.
<!-- start-replace-sidebar maxdepth="6" sort="year_start" -->
<!-- end-replace-sidebar -->75_generate_navbar.sh
Generates _navbar.md content at the repository root.
If no _navbar.md exists, a new one is created.
Tag parameters:
dir="./path"— directory to scan (default: directory of_navbar.md)maxdepth="N"— stop after N levels (default: 1)filter="key=value"— include only entries matching a frontmatter field (e.g.filter="navbar=1")sort="field"— sort siblings by frontmatter field
Entries with navbar: 1 in their frontmatter are included. An _icon.svg file in a directory
is automatically base64-embedded as an inline icon in the link.
<!-- start-replace-navbar maxdepth="1" filter="navbar=1" -->
<!-- end-replace-navbar -->80_generate_gitrepos.sh
For each README.md containing a start-replace-gitrepos tag, fetches the public repository
list from GitHub, GitLab, or Codeberg and inserts a Markdown table.
Results are cached locally (.gitrepos-result-*.json) and used as a fallback on API failure.
All providers are fetched in parallel.
Tag attributes:
service="github|gitlab|codeberg"— requiredusername="USER"— user account repositoriesorg="ORG"— GitHub organisation repositoriesgroup="path/group"— GitLab group repositoriescreator="LOGIN"— filter by first-commit author (GitHub only)exclude="regex"— hide repos whose name or description matchesheading="Title"— Markdown section heading above the table
Environment: GITHUB_TOKEN to raise the GitHub API rate limit (60 → 5 000 req/h).
<!-- start-replace-gitrepos service="github" username="myaccount" -->
<!-- end-replace-gitrepos -->
<!-- start-replace-gitrepos service="github" org="my-org" creator="mylogin" exclude="^archive-" -->
<!-- end-replace-gitrepos -->90_compile_typst.sh
Compiles Typst .typ source files to PDF. Skips files that are already up to date
(mtime-based check — no unnecessary recompilation).
autorun.sh
Runs all .sh scripts in the docsh folder in alphabetical/numeric order, skipping itself.
Prints elapsed time per script.
# Run all scripts from the repository root
bash docsh/autorun.sh
# Run a single script
bash docsh/70_generate_sidebar.sh
bash docsh/80_generate_gitrepos.shFor automatic weekly rebuilds:
- Create a Project Access Token (
Settings → Access Tokens) withwrite_repositoryscope - Add it as a CI variable
PUSH_TOKEN(Settings → CI/CD → Variables) - Optionally add
GITHUB_TOKENfor GitHub API calls - Create a Scheduled Pipeline (
CI/CD → Schedules) with cron0 4 * * 1(Monday 04:00 UTC)
The rebuild job in .gitlab-ci.yml runs autorun.sh, commits any changed files, and pushes
to the main branch — triggering a Pages deployment.
- Run from the repository root so relative paths behave as expected.
- Make scripts executable if preferred:
chmod +x docsh/*.sh. - Use
.docshignoreto exclude a directory from the sidebar and subnav. - Commit
.gitrepos-result-*.jsonfiles to ensure continuity when the API is unavailable.
See the LICENSE file in the repository.
35_generate_filelist.sh
Remplace le bloc entre <!-- start-replace-filelist ... --> et <!-- end-replace-filelist -->
par une liste de liens Markdown.
Comportement par défaut (sans arguments) : liste tout le contenu non-caché du dossier du
README.md (fichiers et sous-dossiers), en excluant README.md lui-même. Les titres
des sous-dossiers sont lus depuis leur propre README.md. Cela crée une navigation augmentée
et un inventaire de fichiers en un seul bloc.
Paramètres du tag :
folder="./chemin"— dossier à scanner (défaut : dossier duREADME.md)pattern="regex"— filtre les noms de fichiers par expression régulière (défaut : tout)recursive(flag) — inclut les sous-dossiersraw(flag) — noms bruts sans mise en forme Title Case
<!-- start-replace-filelist -->
- [Module 2020 Box Corner](./modules/2020-box-corner/)
- [Schema.pdf](./doc/schema.pdf)
<!-- end-replace-filelist -->
<!-- start-replace-filelist folder="./export" pattern="\.stl$" -->
- [Boite Extrusion EnsembleBody Bottom](./export/boite-extrusion-ensembleBody-bottom.stl)
<!-- end-replace-filelist -->40_variable_expansion.sh
Remplace les variables inline ou blocs entre <!-- %: CLE --> et <!-- %; --> par leur valeur
définie dans un fichier .variable_expansion à la racine du dépôt.
Options CLI : -f VARFILE, -r ROOT, -n (dry-run), -v (verbose).
Version : <!-- %: VERSION -->1.0<!-- %; -->60_generate_subnav.sh
Insère ou met à jour une sous-navigation (liste de liens vers les sous-dossiers) entre les tags
<!-- start-replace-subnav --> et <!-- end-replace-subnav --> dans chaque README.md.
Supporte une image de couverture _cover.png / _cover.jpg dans les sous-dossiers.
Option depth=N dans le tag de début pour limiter la profondeur de récursion.
<!-- start-replace-subnav depth=1 -->
* [Sous-section](./sous-section/)
<!-- end-replace-subnav -->70_generate_sidebar.sh
Génère le fichier _sidebar.md à la racine du dépôt en parcourant tous les README.md.
Un fichier .docshignore dans un dossier exclut ce dossier et ses enfants.
Options CLI :
-r,--include-root— inclut leREADME.mdracine comme entrée de premier niveau-h,--help— aide
autorun.sh
Exécute tous les scripts .sh du dossier docsh dans l'ordre alphabétique/numérique,
sauf lui-même.
Exécuter tous les scripts depuis la racine du dépôt :
bash docsh/autorun.shExécuter un script individuellement :
bash docsh/70_generate_sidebar.sh --include-root- Exécuter depuis la racine du dépôt pour que les chemins relatifs fonctionnent.
- Rendre les scripts exécutables si besoin :
chmod +x docsh/*.sh. - Utiliser
.docshignorepour exclure un dossier de la sidebar et de la subnav.
docsh is a small collection of Bash scripts to help generate and maintain static
documentation (for example, Docsify). Scripts are numbered and run in order via autorun.sh.
30_generate_media.sh
Replaces the block between <!-- start-replace-media ... --> and <!-- end-replace-media -->
with a list of images found in the directory's medias/ folder.
no-caption flag: uses a space as alt text (no visible caption).
<!-- start-replace-media -->
* 
<!-- end-replace-media -->35_generate_filelist.sh
Replaces the block between <!-- start-replace-filelist ... --> and <!-- end-replace-filelist -->
with a Markdown link list.
Default behaviour (no arguments): lists all non-hidden contents of the README's own directory
(files and subdirectories), excluding README.md itself. Subdirectory titles are read from
their own README.md. This produces an augmented navigation + file inventory in one block.
Tag parameters:
folder="./path"— folder to scan (default: directory of theREADME.md)pattern="regex"— filter filenames by regex (default: list everything)recursive(flag) — include subdirectoriesraw(flag) — use bare filenames instead of Title Case link text
<!-- start-replace-filelist -->
- [Module 2020 Box Corner](./modules/2020-box-corner/)
- [Schema.pdf](./doc/schema.pdf)
<!-- end-replace-filelist -->
<!-- start-replace-filelist folder="./export" pattern="\.stl$" -->
- [Boite Extrusion EnsembleBody Bottom](./export/boite-extrusion-ensembleBody-bottom.stl)
<!-- end-replace-filelist -->40_variable_expansion.sh
Replaces inline or block variables between <!-- %: KEY --> and <!-- %; --> with values
defined in a .variable_expansion file at the repository root.
CLI options: -f VARFILE, -r ROOT, -n (dry-run), -v (verbose).
Version: <!-- %: VERSION -->1.0<!-- %; -->60_generate_subnav.sh
Inserts or updates a sub-navigation (links to subdirectories) between
<!-- start-replace-subnav --> and <!-- end-replace-subnav --> in each README.md.
Supports a _cover.png / _cover.jpg cover image in subdirectories.
Add depth=N in the start tag to limit recursion depth.
<!-- start-replace-subnav depth=1 -->
* [Sub-section](./sub-section/)
<!-- end-replace-subnav -->70_generate_sidebar.sh
Generates _sidebar.md at the repository root by walking all README.md files.
A .docshignore file in a directory excludes that directory and its children.
CLI options:
-r,--include-root— include the rootREADME.mdas the top-level entry-h,--help— show help
autorun.sh
Runs all .sh scripts in the docsh folder in alphabetical/numeric order, skipping itself.
Run all scripts from the repository root:
bash docsh/autorun.shRun a single script:
bash docsh/70_generate_sidebar.sh --include-root- Run from the repository root so relative paths behave as expected.
- Make scripts executable if preferred:
chmod +x docsh/*.sh. - Use
.docshignoreto exclude a directory from the sidebar and subnav.
See the LICENSE file in the repository.