Files
pagemark/README.md
2026-03-07 11:50:19 +01:00

258 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PageMark
Générateur de site statique minimaliste alimenté par des fichiers Markdown.
Écrivez du contenu en `.md`, lancez `python3 build.py`, déployez les fichiers HTML générés.
## Fonctionnalités
- Pages et articles en Markdown avec coloration syntaxique
- Page d'accueil générée automatiquement (5 derniers articles, du plus récent au plus ancien)
- Catégorisation automatique des articles avec arborescence de dossiers
- Métadonnées par article : titre, date, auteur, catégorie, image de couverture
- Dark mode : automatique selon l'heure (light 08h3017h30) + toggle manuel mémorisé
- Ancres cliquables sur les titres `h1``h4`
- HTML personnalisé dans les articles
- Menu avec filtrage automatique des liens invalides et distinction liens internes/externes
- Aucune dépendance JavaScript côté client
## Prérequis
- Python 3.x
- `pip install markdown`
## Installation
```bash
git clone https://github.com/votre-repo/pagemark
cd pagemark
pip install markdown
```
## Structure du projet
```
pagemark/
├── build.py # Générateur de site (lancer pour builder)
├── README.md
├── static/
│ ├── style.css # Styles (light + dark mode)
│ └── theme.js # Gestion du dark mode (localStorage + heure)
└── md/
├── header.md # Nom du site (# Titre) + tagline (texte suivant)
├── footer.md # Pied de page
├── menu.md # Navigation (liste Markdown)
├── categories.md # Mapping catégories → dossiers de sortie
├── images/ # Images référençables via /images/fichier.jpg
└── pages/
├── index.md # Contenu optionnel affiché au-dessus des articles
└── *.md # Vos pages et articles
```
Les fichiers HTML sont générés à la racine du projet.
## Mise en route rapide
### 1. Configurer le site
**`md/header.md`** — la première ligne `# Titre` devient le logo dans la nav, le reste la tagline :
```markdown
# Mon Site
Le blog d'un passionné de technologie
```
**`md/footer.md`** — pied de page en Markdown :
```markdown
© 2026 Votre Nom
```
**`md/menu.md`** — liste de liens. Les liens internes sont filtrés automatiquement (masqués si la page n'existe pas), les liens externes s'ouvrent dans un nouvel onglet avec le suffixe `↗` :
```markdown
- [Accueil](/)
- [À propos](/racine/a-propos/)
- [GitHub](https://github.com/vous)
```
> Le chemin d'un lien interne doit correspondre au chemin de sortie généré (voir section Catégories).
### 2. Créer une page ou un article
Créez un fichier `.md` dans `md/pages/`. Les métadonnées se placent en tête de fichier :
```markdown
::Titre:Mon premier article
::Date:07/03/2026
::Auteur:Votre Nom
::Categories:Blog
::Image:/images/cover.jpg
Contenu de l'article en Markdown...
```
> Une page sans `::Date:` est une page statique (elle n'apparaît pas dans le listing de la page d'accueil).
### 3. Générer le site
```bash
python3 build.py
```
### 4. Tester en local
```bash
python3 -m http.server 3000
```
Puis ouvrez [http://localhost:3000](http://localhost:3000).
---
## Métadonnées
| Métadonnée | Syntaxe | Rôle |
|---|---|---|
| `::Titre:` | `::Titre:Mon titre` | Affiché en `<h1>` avant le contenu |
| `::Date:` | `::Date:dd/mm/YYYY` | Date de publication, utilisée pour le tri |
| `::Auteur:` | `::Auteur:Pseudo` | Nom de l'auteur |
| `::Categories:` | `::Categories:Blog-Tutos` | Catégorie et sous-catégorie |
| `::Image:` | `::Image:/images/cover.jpg` | Image de couverture dans les cards |
Toutes les métadonnées sont optionnelles. Seules les pages avec `::Date:` sont traitées comme des **articles** et apparaissent dans le listing de la page d'accueil.
---
## Catégories
Le fichier `md/categories.md` mappe les noms de catégories vers des dossiers de sortie :
```
- Blog:/blog
- News:/news
- Tutoriels:/tutos
```
**Exemple :** `::Categories:News-Tech`
1. `News` est résolu via `categories.md` → dossier `news`
2. `Tech` (sous-catégorie) → sous-dossier `tech`
3. Fichier `mon-article.md` → généré dans `news/tech/mon-article/index.html`
4. URL : `/news/tech/mon-article/`
Si une catégorie n'est pas dans `categories.md`, son nom en minuscules est utilisé comme dossier.
---
## Navigation
**`md/menu.md`** contient une liste Markdown de liens :
```markdown
- [Accueil](/)
- [Blog](/blog/)
- [GitHub](https://github.com/vous)
```
| Type de lien | Comportement |
|---|---|
| Chemin relatif (`/page/`) | Lien **interne** — affiché uniquement si la page a été générée |
| URL complète (`https://`) | Lien **externe** — toujours affiché, suffixe `↗`, `target="_blank"` |
---
## Images
Placez vos images dans `md/images/` et référencez-les dans le Markdown :
```markdown
![Description de l'image](/images/photo.jpg)
```
Pour l'image de couverture d'un article (affichée dans les cards de la page d'accueil) :
```
::Image:/images/cover.jpg
```
---
## HTML personnalisé
Du HTML peut être inséré directement dans n'importe quel fichier `.md` :
```html
<div style="background: var(--accent-soft); padding: 1rem; border-radius: 8px;">
Bloc personnalisé — les variables CSS du thème sont disponibles.
</div>
```
Les variables CSS `var(--bg)`, `var(--text)`, `var(--accent)`, etc. s'adaptent automatiquement au dark mode.
---
## Dark mode
| Comportement | Détail |
|---|---|
| **Par défaut** | Light de 08h30 à 17h30, dark le reste du temps |
| **Manuel** | Bouton `☾` / `☀` dans la barre de navigation |
| **Mémorisation** | Le choix est sauvegardé via `localStorage` — il prend le dessus sur le comportement automatique |
---
## Ancres de titres
Les titres `h1` à `h4` reçoivent automatiquement un `id` et un lien `#` cliquable au survol. Cela permet de créer des liens directs vers une section :
```
https://monsite.com/mon-article#sous-titre
```
L'`id` est généré à partir du texte du titre (minuscules, tirets à la place des espaces).
---
## Déploiement avec nginx
Copiez les fichiers générés vers votre serveur. Configuration nginx minimale :
```nginx
server {
listen 80;
server_name monsite.com;
root /var/www/pagemark;
location / {
try_files $uri $uri/index.html =404;
}
}
```
La directive `try_files $uri $uri/index.html` permet de résoudre `/mon-article/``/mon-article/index.html` sans redirection.
---
## Workflow recommandé
```
1. Éditer md/pages/mon-article.md
2. python3 build.py
3. Copier les fichiers générés sur le serveur
```
Pour automatiser le déploiement, un simple script shell suffit :
```bash
#!/bin/bash
python3 build.py && rsync -avz --delete . user@serveur:/var/www/pagemark \
--exclude='md/' --exclude='static/' --exclude='*.py' --exclude='*.md' --exclude='.git'
```
---
## Licence
MIT