Transforme des documents collaboratifs Docs en site statique avec Zensical. Homepage stylisee incluse.
Exemple : Document source -> Site genere
# Avec pip
pip install docs2static
# Avec uv
uv add docs2static
# Depuis les sources
git clone git@github.com:CoopCodeCommun/Docs2static.git
cd Docs2static
uv syncRequiert Python 3.14+.
cp env_example .envVariables dans le .env :
| Variable | Description |
|---|---|
DOCS_URL |
URL du document Docs racine |
GITHUB_REPO |
Adresse SSH du depot GitHub (ex: git@github.com:User/Repo.git) |
GITLAB_REPO |
Adresse SSH du depot GitLab (alternative) |
BACKEND |
Moteur statique (par defaut : zensical) |
TEMPLATE |
Template homepage (par defaut : phantom) |
Le .env suivant produit le site CoopCodeCommun.github.io/Docs2static :
DOCS_URL=https://notes.liiib.re/docs/fa5583b2-37fc-4016-998f-f5237fd41642/
GITHUB_REPO=https://github.com/CoopCodeCommun/Docs2static
BACKEND=zensical# Telecharger les documents et construire le site
docs2static
# Deployer sur GitHub/GitLab Pages (sans retelecharger)
docs2static --deploy
# Forcer le telechargement sans cache
docs2static --no-cache
# Specifier le format de sortie
docs2static -f html # html, markdown ou both| Option | Description |
|---|---|
-f, --format |
Format de sortie (html, markdown, both) |
--no-cache |
Ignorer le cache SQLite (24h par defaut) |
-b, --backend |
Moteur de site statique |
-d, --deploy |
Deployer sans retelecharger |
Ajoutez un bloc frontmatter au debut de vos documents Docs :
---
titre: Ma page
auteur·ice: Jonas
brouillon: non
resume: Description de la page
date: 2026-01-15
---| Cle (FR / EN) | Usage |
|---|---|
titre / title |
Titre de la page |
auteur·ice / author |
Auteur du site (copyright) |
resume / summary |
Description du site ou extrait |
licence / license |
Licence affichee dans le copyright |
brouillon / draft |
oui / true = page et enfants ignores |
date |
Date du document (AAAA-MM-JJ) |
Dans le document racine Docs :
- 1re image → logo du site (
logo_filedans les metadonnees) - 2e image → image hero de fond (
hero_imagedans les metadonnees)
Docs2Static extrait automatiquement ces champs si absents du frontmatter :
| Champ | Source |
|---|---|
image |
1re image du contenu |
hero_image |
2e image du contenu |
excerpt |
1er paragraphe de texte (tronque a 160 caracteres) |
Le template par defaut est phantom (inspire de HTML5UP Phantom). La homepage est generee dynamiquement depuis l'arbre de navigation : chaque section enfant devient une tuile coloree avec image, titre et extrait.
Pour changer de template :
# Dans le frontmatter du document racine
template: phantomOu via variable d'environnement :
TEMPLATE=phantomLes templates sont stockes dans docs2static/assets/templates/{nom}/ avec les sous-dossiers overrides/ et stylesheets/.
Pour integrer un contenu externe (agenda, formulaire, etc.), ajoutez une cle iframe dans le frontmatter :
---
iframe: src="https://example.com/embed/" width="100%" height="1000px"
---L'iframe sera affichee sous le contenu de la page.
Creez .github/workflows/docs2static.yml :
name: Build & Deploy Documentation
on:
schedule:
- cron: '0 6 * * *' # Tous les jours a 6h
workflow_dispatch: # Lancement manuel
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v4
- name: Setup Python
run: uv python install 3.14
- name: Install docs2static
run: uv add docs2static
- name: Build & Deploy
env:
DOCS_URL: ${{ secrets.DOCS_URL }}
GITHUB_REPO: ${{ secrets.GITHUB_REPO }}
BACKEND: zensical
run: |
uv run docs2static
uv run docs2static --deployAjoutez les secrets DOCS_URL et GITHUB_REPO dans les parametres du depot.
Configurez une cle SSH de deploiement avec acces en ecriture au depot cible.
Creez .gitlab-ci.yml :
pages:
image: python:3.14
stage: deploy
script:
- pip install uv
- uv add docs2static
- uv run docs2static
- uv run docs2static --deploy
variables:
DOCS_URL: $DOCS_URL
GITLAB_REPO: $GITLAB_REPO
BACKEND: zensical
only:
- schedules
- webAjoutez les variables DOCS_URL et GITLAB_REPO dans CI/CD > Variables.
# Installation
pip install docs2static
# Configuration
export DOCS_URL="https://notes.liiib.re/docs/votre-doc-id/"
export GITHUB_REPO="git@github.com:Org/Repo.git"
export BACKEND="zensical"
# Execution
docs2static # Telecharge + build
docs2static --deploy # Deploie sur Pages
# Cron (optionnel)
echo "0 6 * * * cd /opt/docs && docs2static && docs2static --deploy" | crontab -docs2static/
main.py # Orchestration : API, arbre, frontmatter, images
zensical_backend.py # Integration Zensical : navigation, toml, deploiement
assets/templates/ # Templates homepage (phantom, etc.)
phantom/
overrides/ # Surcharge du theme Zensical (main.html)
stylesheets/ # CSS homepage (home.css)
Pipeline : Docs API -> arbre -> frontmatter -> images -> Markdown -> Zensical build -> deploy
Pour plus de details, voir guideline.md.
uv run python -m pytest tests/
# Avec options
uv run python tests/test_main.py --no-cache # Sans cache
uv run python tests/test_main.py --deploy # Test deploiement reel
uv run python tests/test_main.py --test-zensical # Test rendu interactifApache 2.0 - Voir LICENSE.
- Inspire par le travail de Sylvain Zimmer (stack Node.js).
- Developpe par CoopCodeCommun en Python, style FALC.