Utilise maintenant Zola v0.23.1

This commit is contained in:
julien
2026-08-06 20:23:55 +02:00
parent 1767245f10
commit d7b8aeab93
30 changed files with 759 additions and 1170 deletions
-4
View File
@@ -1,5 +1,3 @@
# Seuls le Dockerfile, le validateur et les sources Zola
# sont nécessaires à la construction.
* *
!Dockerfile !Dockerfile
!scripts/ !scripts/
@@ -7,6 +5,4 @@
!scripts/_schema.py !scripts/_schema.py
!src/ !src/
!src/** !src/**
# Ne jamais envoyer le site déjà généré
src/public/ src/public/
+19
View File
@@ -0,0 +1,19 @@
lescarnetsdakkadien.netig.net {
@assets path /main.css /giallo.css /images/* /fonts/*
@documents {
not path /main.css /giallo.css /images/* /fonts/*
}
header {
Content-Security-Policy "default-src 'self'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; object-src 'none'"
Referrer-Policy "strict-origin-when-cross-origin"
Strict-Transport-Security "max-age=31536000"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
}
header @assets >Cache-Control "public, max-age=86400"
header @documents >Cache-Control "no-cache"
reverse_proxy 127.0.0.1:8002
}
+10 -11
View File
@@ -1,17 +1,16 @@
FROM python:3.13-alpine AS validator FROM python:3.13-alpine AS validator
COPY ./scripts/check-content.py ./scripts/_schema.py /project/scripts/
COPY ./src /project/src
WORKDIR /project WORKDIR /project
RUN ["python3", "scripts/check-content.py"] COPY scripts/check-content.py scripts/_schema.py ./scripts/
COPY src ./src
RUN python3 scripts/check-content.py
FROM ghcr.io/getzola/zola:v0.22.1 AS zola FROM ghcr.io/getzola/zola:v0.23.1 AS builder
COPY --from=validator /project/src /project
WORKDIR /project WORKDIR /project
RUN ["zola", "build"] COPY --from=validator /project/src ./
RUN zola build
FROM ghcr.io/static-web-server/static-web-server:2 FROM ghcr.io/static-web-server/static-web-server:2
ENV SERVER_ROOT=/public \
ENV SERVER_ROOT=/public SERVER_CACHE_CONTROL_HEADERS=false \
COPY --from=zola /project/public /public SERVER_SECURITY_HEADERS=false
COPY --from=builder /project/public /public
+185 -177
View File
@@ -1,17 +1,19 @@
# Guide de rédaction # Guide de rédaction
Ce guide explique comment créer, compléter, mettre à jour et publier les contenus de **Les Carnets dAkkadien**. Ce guide décrit la création, la mise à jour et la publication des fiches du site **Les Carnets dAkkadien**.
Le principe général est simple : Le principe est le suivant :
- le front matter TOML contient les données brèves et structurées ; - le front matter TOML contient les données courtes et structurées ;
- le corps Markdown contient les explications, tableaux, exemples et commentaires ; - le corps Markdown contient les explications, exemples, tableaux et commentaires ;
- les champs prévus par un modèle restent présents, même lorsquils sont vides ; - tous les champs prévus par le modèle restent présents, même lorsquils sont vides ;
- les champs optionnels vides sont généralement omis du rendu ; les champs structurels restent néanmoins présents dans le front matter. - les valeurs vides sont généralement omises du rendu.
Toutes les commandes sont exécutées depuis la racine du dépôt. Toutes les commandes sont exécutées depuis la racine du dépôt.
## Organisation des contenus ## Périmètre des outils
Les fiches se trouvent dans cinq sections :
| Type | Répertoire | Taxonomie | | Type | Répertoire | Taxonomie |
|---|---|---| |---|---|---|
@@ -21,35 +23,45 @@ Toutes les commandes sont exécutées depuis la racine du dépôt.
| Texte | `src/content/textes/` | `genres` | | Texte | `src/content/textes/` | `genres` |
| Vocabulaire | `src/content/vocabulaire/` | `natures` | | Vocabulaire | `src/content/vocabulaire/` | `natures` |
La bibliographie et les mentions légales sont des pages autonomes placées directement dans `src/content/`. Les trois scripts de fiches ne les créent, ne les modifient et ne les valident pas. Les fichiers `_index.md` définissent les sections et restent maintenus manuellement. Les pages autonomes placées directement dans `src/content/`, comme la bibliographie et les mentions légales, ne sont ni créées, ni horodatées, ni validées par les scripts de fiches.
Chaque section contient un fichier `_index.md` qui définit son titre, sa description, son tri et ses templates. Ces index sont maintenus manuellement ; le générateur crée uniquement des pages de contenu. Les commandes publiques sont :
- `new-content.py` : création dun brouillon ;
- `update-content.py` : mise à jour de lhorodatage `updated` ;
- `check-content.py` : validation structurelle des fiches.
`_schema.py` est leur module commun et ne se lance pas directement.
## Cycle de rédaction ## Cycle de rédaction
1. créer un brouillon avec `new-content.py` ; 1. créer un brouillon avec `new-content.py` ;
2. compléter le front matter et le corps Markdown ; 2. compléter les données et le corps Markdown ;
3. vérifier localement la fiche avec les brouillons affichés ; 3. contrôler son rendu avec les brouillons ;
4. passer `draft` à `false` lorsque la fiche est prête ; 4. passer `draft` à `false` lorsquil est prêt ;
5. lancer le validateur et la vérification Zola ; 5. exécuter les validations et construire la version publique ;
6. après une modification substantielle ultérieure, actualiser `updated` avec `update-content.py`. 6. après une modification substantielle ultérieure, actualiser `updated`.
Afficher les brouillons localement : Pendant la rédaction :
```sh ```sh
zola --root src serve --drafts zola --root src serve --drafts
``` ```
Contrôler la structure des fiches et la construction du site avant publication : Avant publication :
```sh ```sh
./scripts/check-content.py ./scripts/check-content.py
zola --root src check --drafts --skip-external-links zola --root src check --drafts
zola --root src build --drafts
zola --root src build
``` ```
`zola check` contrôle le chargement du site et ses liens. Les deux constructions suivantes vérifient réellement le rendu de tous les brouillons, puis celui de la version publique. En labsence daccès réseau, ajouter `--skip-external-links` à la commande `zola check`.
## Créer une fiche ## Créer une fiche
La commande générale est : Syntaxe générale :
```sh ```sh
./scripts/new-content.py SECTION IDENTIFIANT [--nature NATURE] [--title TITRE] ./scripts/new-content.py SECTION IDENTIFIANT [--nature NATURE] [--title TITRE]
@@ -74,25 +86,29 @@ nom, adjectif, verbe, pronom, préposition,
adverbe, conjonction, particule, numéral adverbe, conjonction, particule, numéral
``` ```
Lorsque `--nature` est omise dans un terminal interactif, le générateur propose un menu. Elle est obligatoire dans un contexte non interactif. Dans un terminal interactif, lomission de `--nature` ouvre un menu. Dans un contexte non interactif, loption est obligatoire.
Le générateur normalise lidentifiant et le titre en Unicode NFC, prépare tous les champs nécessaires et refuse d’écraser un fichier existant. Il ne renseigne pas les données linguistiques et ne rédige pas le corps Markdown. Le générateur :
Pour un article, un texte ou une note de grammaire, le titre est déduit de lidentifiant en remplaçant les tirets par des espaces et en mettant linitiale en majuscule. Pour le vocabulaire, il reprend lidentifiant. Pour un signe, il reste vide sauf si `--title` est fourni. - normalise lidentifiant et le titre en Unicode NFC ;
- crée tous les champs prévus par le modèle ;
- initialise la fiche comme brouillon ;
- refuse d’écraser un fichier existant ;
- ne renseigne aucune donnée linguistique et ne rédige pas le corps Markdown.
Le titre est déduit de lidentifiant pour les articles, la grammaire et les textes. Pour le vocabulaire, il reprend lidentifiant. Pour un signe, il reste vide sauf si `--title` est fourni.
## Conventions générales ## Conventions générales
### Période et terminologie ### Période et terminologie
Le site est principalement consacré au paléo-babylonien. Une forme, une graphie ou une analyse relevant dune autre période ou dun autre dialecte est signalée dans la fiche concernée. Le site est principalement consacré au paléo-babylonien. Toute forme, graphie ou analyse relevant dune autre période ou dun autre dialecte est signalée dans la fiche concernée.
Les clés du front matter sont en anglais. Les noms des taxonomies sont en français ; leurs termes suivent la donnée affichée, en français pour les catégories et en translittération pour les lectures. Les clés du front matter sont en anglais. Les taxonomies portent des noms français. Les lectures conservent exactement leur translittération.
### Unicode et translittération ### Unicode et translittération
Tous les fichiers de contenu sont enregistrés en UTF-8 et normalisés en Unicode NFC, y compris leurs noms. Les sources sont enregistrées en UTF-8 et utilisent la normalisation Unicode NFC. Les lemmes, lectures et formes akkadiennes conservent leurs diacritiques :
Les lemmes, lectures et formes akkadiennes conservent leurs diacritiques :
```text ```text
bītum bītum
@@ -101,17 +117,16 @@ aš
ṭim ṭim
``` ```
Dans le corps Markdown, les formes linguistiques sont généralement écrites en *italique*. Le code en ligne est réser aux commandes, chemins et noms de champs. Dans le corps Markdown, les formes linguistiques sont généralement écrites en *italique*. Le code en ligne sert aux commandes, chemins et noms de champs.
### Noms de fichiers ### Identifiants et noms de fichiers
Pour les articles, la grammaire, les textes et le vocabulaire, lidentifiant fourni au générateur devient le nom du fichier. Il doit être écrit sous sa forme finale : Pour les articles, la grammaire, les textes et le vocabulaire, lidentifiant devient le nom du fichier. Il doit être fourni sans extension et respecter les règles suivantes :
- en minuscules ; - minuscules uniquement ;
- sans espace ni underscore ; - aucun espace ni underscore ;
- avec seulement des lettres Unicode, des chiffres et des tirets ; - lettres Unicode, chiffres et tirets seulement ;
- sans double tiret ni tiret final ; - aucun double tiret ni tiret final.
- sans extension `.md`.
Exemples : Exemples :
@@ -124,7 +139,7 @@ src/content/articles/les-carnets-sont-en-ligne.md
Un tiret initial est accepté uniquement pour le vocabulaire, par exemple `-ma.md`. Un tiret initial est accepté uniquement pour le vocabulaire, par exemple `-ma.md`.
Les signes utilisent toujours un numéro MZL sur trois chiffres : Les signes utilisent un numéro MZL compris entre 1 et 999. Le générateur produit automatiquement un nom sur trois chiffres :
```text ```text
src/content/signes/mzl-001.md src/content/signes/mzl-001.md
@@ -132,120 +147,125 @@ src/content/signes/mzl-113.md
src/content/signes/mzl-167.md src/content/signes/mzl-167.md
``` ```
Les chemins et les termes de taxonomie utilisent la stratégie de slugification `safe` de Zola. Les diacritiques sont donc conservés : `tim` et `ṭim` restent distincts. Zola utilise la stratégie de slugification `safe`, afin de conserver notamment la distinction entre `tim` et `ṭim`.
### Taxonomies
Les taxonomies publiques sont :
- `natures` pour le vocabulaire ;
- `lectures` pour les signes ;
- `themes` pour la grammaire ;
- `genres` pour les textes.
Une fiche de vocabulaire contient exactement une nature reconnue, car elle détermine son modèle de champs. Les autres taxonomies peuvent contenir plusieurs termes.
Dans `themes` et `genres`, les termes composés utilisent des tirets :
```toml
natures = ["préposition"]
lectures = ["tim", "ṭim"]
themes = ["morphologie-nominale"]
genres = ["inscription-commémorative"]
```
Les templates rétablissent les espaces à laffichage, tandis que les URL restent sans espace :
```text
/themes/morphologie-nominale/
/genres/inscription-commémorative/
```
La graphie dun terme doit rester stable après sa publication.
## Front matter commun ## Front matter commun
Le générateur place les éléments suivants en tête de chaque fiche : Chaque fiche créée par le générateur commence par :
```toml ```toml
title = "Titre" title = "Titre"
date = 2026-08-05T12:30:00+02:00 date = 2026-08-06T12:30:00+02:00
# updated = YYYY-MM-DDTHH:MM:SS+HH:MM # updated = YYYY-MM-DDTHH:MM:SS+HH:MM
description = "" description = ""
draft = true draft = true
``` ```
Les tables propres au type de contenu viennent ensuite dans le même front matter. - `title` : titre affiché ;
- `date` : horodatage initial et date de publication ;
- `updated` : dernière modification substantielle ;
- `description` : résumé court facultatif ;
- `draft` : état de publication.
- `title` est le titre affiché ; `date` et `updated` sont des horodatages TOML sans guillemets, produits dans le fuseau `Europe/Paris`. Chaque fiche doit conserver **exactement une** ligne `updated`, commentée ou active.
- `date` est lhorodatage initial de la fiche et sert de date de publication ;
- `updated` est lhorodatage de la dernière modification substantielle ;
- `description` est un résumé court, rédigé manuellement lorsquil est utile ;
- `draft` détermine si la page est publiée.
`date` est un horodatage TOML sans guillemets, créé dans le fuseau `Europe/Paris`. La fiche doit toujours conserver exactement une ligne `updated`, commentée ou active. Pour actualiser une fiche :
Après une modification substantielle, lancer :
```sh ```sh
./scripts/update-content.py src/content/vocabulaire/bītum.md ./scripts/update-content.py src/content/vocabulaire/bītum.md
``` ```
La forme abrégée, relative à `src/content/`, est également acceptée : La forme relative à `src/content/` est également acceptée :
```sh ```sh
./scripts/update-content.py vocabulaire/bītum.md ./scripts/update-content.py vocabulaire/bītum.md
``` ```
Le chemin complet peut être saisi rapidement avec lautocomplétion du shell. Le script accepte uniquement les fiches Markdown placées dans une section connue ; il refuse donc les index, les pages situées directement dans `src/content/` et les fichiers extérieurs à ce répertoire. Il remplace ensuite lunique ligne `updated` par lheure courante de `Europe/Paris` : Le script refuse les index, les pages autonomes et les chemins extérieurs aux cinq sections. Il remplace lunique ligne `updated` par lheure courante :
```toml ```toml
updated = 2026-08-05T16:47:00+02:00 updated = 2026-08-06T16:47:00+02:00
``` ```
Sur la page daccueil, `updated` prime sur `date` pour classer les « Fiches récentes ». Il ne doit donc être activé quaprès une modification substantielle. Sur la page daccueil, `updated` prime sur `date` pour le classement des trois fiches récentes. Il ne doit donc être activé quaprès une modification substantielle.
### Descriptions automatiques
Lorsque `description` reste vide : Lorsque `description` reste vide :
- une fiche de vocabulaire affiche une phrase construite à partir de sa nature, de son genre et de son sens ; - une fiche de vocabulaire affiche un résumé construit à partir de sa nature, de son genre et de son sens ;
- une fiche de signe affiche une phrase construite à partir de son titre et de son numéro MZL ; - une fiche de signe affiche son titre et son numéro MZL ;
- un article, une note de grammaire ou un texte naffiche pas de résumé de remplacement. - les autres fiches naffichent pas de résumé de remplacement dans leur contenu.
La métadescription HTML utilise alors, en dernier recours, la description générale du site. Les mêmes résumés automatiques servent de métadescription aux fiches de vocabulaire et de signes. Pour les autres pages sans description spécifique, le template utilise la description générale du site.
## Brouillons et publication Une description manuelle reste préférable lorsquelle apporte une information plus précise, notamment pour les articles, la grammaire et les textes.
Un brouillon peut conserver des valeurs vides, mais tous les champs de son modèle restent présents afin que sa structure puisse être vérifiée dès sa création. Pour publier une fiche : ### Brouillons
1. compléter les données disponibles sans supprimer les champs de son modèle ; Un brouillon peut conserver des valeurs vides, mais tous les champs de son modèle restent présents. Pour publier une fiche :
1. compléter les informations disponibles ;
2. rédiger le corps Markdown ; 2. rédiger le corps Markdown ;
3. vérifier que `date` correspond à la publication souhaitée ; 3. vérifier la date souhaitée ;
4. remplacer `draft = true` par `draft = false` ; 4. remplacer `draft = true` par `draft = false` ;
5. lancer les contrôles indiqués dans le cycle de rédaction. 5. exécuter les contrôles du cycle de rédaction.
Une fiche temporairement retirée du site peut repasser à `draft = true`. Une fiche publiée peut repasser temporairement à `draft = true`.
## Taxonomies ## Modèles de contenu
Les taxonomies publiques sont : Les tables suivantes viennent après les champs communs, dans le même front matter délimité par `+++`.
- `natures` pour la nature grammaticale du vocabulaire ; ### Vocabulaire
- `lectures` pour les lectures des signes ;
- `themes` pour les notions grammaticales ;
- `genres` pour les types documentaires des textes.
Les termes sont écrits sous leur forme destinée à laffichage : Toutes les fiches lexicales contiennent au minimum :
```toml ```toml
natures = ["préposition"]
lectures = ["tim", "ṭim"]
themes = ["morphologie nominale"]
genres = ["lettre"]
```
La graphie doit rester stable. Une fiche de vocabulaire contient exactement une nature connue, car cette valeur sélectionne le modèle de champs à contrôler. Les autres taxonomies peuvent contenir plusieurs termes lorsque cela est pertinent.
## Fiches de vocabulaire
Toutes les fiches lexicales utilisent la structure générale suivante :
```toml
+++
title = "lemme"
date = 2026-08-05T12:30:00+02:00
# updated = YYYY-MM-DDTHH:MM:SS+HH:MM
description = ""
draft = true
[extra] [extra]
meaning = "" meaning = ""
logograms = [] logograms = []
[taxonomies] [taxonomies]
natures = ["nature"] natures = ["nature"]
+++
``` ```
`meaning` contient le sens principal ou une courte série de sens. Il est normalement renseigné avant publication, mais peut rester vide pendant la rédaction. `meaning` contient le sens principal ou une courte série de sens. `logograms` est toujours un tableau de chaînes :
`logograms` reste toujours un tableau de chaînes :
```toml ```toml
logograms = ["LUGAL"] logograms = ["LUGAL"]
``` ```
Chaque nature ajoute les champs suivants, dans lordre produit par le générateur : Chaque nature ajoute les champs suivants :
| Nature | Champs supplémentaires | | Nature | Champs supplémentaires |
|---|---| |---|---|
@@ -259,14 +279,14 @@ Chaque nature ajoute les champs suivants, dans lordre produit par le généra
| Particule | `function` | | Particule | `function` |
| Numéral | `numeral_type`, `value`, `gender`, `feminine` | | Numéral | `numeral_type`, `value`, `gender`, `feminine` |
Tous les champs simples restent des chaînes, même lorsquils sont vides. Chaque fiche, brouillon compris, doit conserver tous les champs prévus pour sa nature. Le validateur contrôle leur présence et leur type, sans imposer de valeur non vide ni refuser d’éventuels champs supplémentaires. Pour un verbe, le titre fournit déjà linfinitif et celui-ci nest donc pas répété dans `[extra]`. Tous les champs simples sont des chaînes, même lorsquils sont vides. Pour un verbe, le titre fournit déjà linfinitif et celui-ci nest pas répété dans `[extra]`.
### Sens des principaux champs Principaux champs :
- `gender` : genre grammatical ; - `gender` : genre grammatical ;
- `bound` : forme liée ; - `bound` : forme liée ;
- `plural` : pluriel lexical ; - `plural` : pluriel lexical ;
- `predicative` : forme prédicative de référence, affichée comme « Prédicatif (3 m. s.) » ; - `predicative` : forme affichée comme « Prédicatif (3 m. s.) » ;
- `root` : racine, par exemple `p-r-s` ; - `root` : racine, par exemple `p-r-s` ;
- `stem` : thème verbal, par exemple `G`, `D`, `Š` ou `N` ; - `stem` : thème verbal, par exemple `G`, `D`, `Š` ou `N` ;
- `verb_class` : classe morphologique, par exemple `fort`, `I-n` ou `III-faible` ; - `verb_class` : classe morphologique, par exemple `fort`, `I-n` ou `III-faible` ;
@@ -274,10 +294,10 @@ Tous les champs simples restent des chaînes, même lorsquils sont vides. Cha
- `pronoun_type` : type de pronom ; - `pronoun_type` : type de pronom ;
- `governs` : cas régi par une préposition ; - `governs` : cas régi par une préposition ;
- `function` : fonction dun adverbe, dune conjonction ou dune particule ; - `function` : fonction dun adverbe, dune conjonction ou dune particule ;
- `numeral_type` : cardinal, ordinal ou autre type de numéral ; - `numeral_type` : cardinal, ordinal ou autre type ;
- `value` : valeur numérique. - `value` : valeur numérique.
Le corps Markdown reste libre. Les rubriques suivantes peuvent servir de repères lorsquelles sont utiles : Le corps Markdown reste libre. Rubriques possibles :
```markdown ```markdown
## Emploi ## Emploi
@@ -289,44 +309,34 @@ Le corps Markdown reste libre. Les rubriques suivantes peuvent servir de repère
## Sources ## Sources
``` ```
Les paradigmes, exceptions, constructions et commentaires détaillés appartiennent au corps plutôt quau front matter. Les rubriques vides ne sont pas ajoutées. ### Signes
## Fiches de signes Commande :
La commande suivante :
```sh ```sh
./scripts/new-content.py signes 113 --title BE ./scripts/new-content.py signes 113 --title BE
``` ```
produit : Champs propres :
```toml ```toml
+++
title = "BE"
date = 2026-08-05T12:30:00+02:00
# updated = YYYY-MM-DDTHH:MM:SS+HH:MM
description = ""
draft = true
[extra] [extra]
sign = "" sign = ""
mzl = "113" mzl = "113"
[taxonomies] [taxonomies]
lectures = [] lectures = []
+++
``` ```
- le fichier est nommé `mzl-113.md` ; - le fichier est nommé `mzl-113.md` ;
- `title` contient le nom usuel du signe ; - `title` contient le nom usuel du signe ;
- `sign` contient le caractère cunéiforme Unicode ; - `sign` contient le caractère cunéiforme Unicode ;
- `mzl` reprend exactement les trois chiffres du nom de fichier ; - `mzl` contient les trois chiffres du numéro ;
- `lectures` contient les lectures translittérées. - `lectures` contient les lectures translittérées.
Le générateur forme automatiquement le nom `mzl-XXX.md` et renseigne le numéro MZL correspondant. Le validateur vérifie ensuite que `sign`, `mzl` et `lectures` restent présents avec le type attendu, même lorsque la fiche est en brouillon. Il nimpose pas de valeur non vide et ne compare pas le numéro au nom du fichier. Le validateur vérifie la présence et le type de ces champs, mais ne compare pas `mzl` au nom du fichier.
Le corps peut accueillir, selon le besoin : Rubriques possibles :
```markdown ```markdown
## Valeurs syllabiques ## Valeurs syllabiques
@@ -336,43 +346,27 @@ Le corps peut accueillir, selon le besoin :
## Notes ## Notes
``` ```
Une fiche de signe peut rester sans corps si son front matter suffit. Le corps peut rester vide lorsque le front matter suffit.
## Notes de grammaire ### Grammaire
```toml ```toml
+++
title = "Titre de la fiche"
date = 2026-08-05T12:30:00+02:00
# updated = YYYY-MM-DDTHH:MM:SS+HH:MM
description = ""
draft = true
[taxonomies] [taxonomies]
themes = [] themes = []
+++
``` ```
`themes` regroupe les fiches par notion grammaticale. Le corps est organisé librement selon le sujet. `themes` regroupe les fiches par notion grammaticale. Le corps est organisé librement selon le sujet.
## Textes étudiés ### Textes
```toml ```toml
+++
title = "Titre du texte"
date = 2026-08-05T12:30:00+02:00
# updated = YYYY-MM-DDTHH:MM:SS+HH:MM
description = ""
draft = true
[taxonomies] [taxonomies]
genres = [] genres = []
+++
``` ```
`genres` décrit le type documentaire, par exemple `lettre` ou `inscription commémorative`. `genres` décrit le type documentaire, par exemple `lettre` ou `inscription-commémorative`.
Une structure fréquente est : Structure possible :
```markdown ```markdown
## Présentation ## Présentation
@@ -383,35 +377,27 @@ Une structure fréquente est :
## Vocabulaire ## Vocabulaire
``` ```
Elle peut être adaptée à chaque texte. ### Articles
## Articles
```toml ```toml
+++
title = "Titre de larticle"
date = 2026-08-05T12:30:00+02:00
# updated = YYYY-MM-DDTHH:MM:SS+HH:MM
description = ""
draft = true
[extra] [extra]
banner = "" banner = ""
banner_alt = "" banner_alt = ""
banner_credit = "" banner_credit = ""
+++
``` ```
- `description` est affichée dans la liste des articles, sur la page daccueil et dans la page elle-même ; - `description` est affichée dans la liste des articles, sur laccueil et dans la page ;
- `banner` indique un chemin relatif à `src/static/`, par exemple `images/articles/article.webp` ; - `banner` est un chemin relatif à `src/static/`, par exemple `images/articles/article.webp` ;
- `banner_alt` contient le texte alternatif de limage ; - `banner_alt` contient le texte alternatif ;
- `banner_credit` contient une attribution ou une légende facultative. - `banner_credit` contient une attribution ou une légende facultative.
Lorsque `banner` reste vide, aucune image ni aucun espace réservé ne sont générés. Lorsquune image est ajoutée, son texte alternatif doit décrire utilement son contenu ; une image purement décorative peut utiliser une chaîne vide. Lorsque `banner` est vide, aucune image nest générée. Lorsquil est renseigné, le template lit les dimensions du fichier avec Zola et les ajoute au HTML. Une image informative doit avoir un texte alternatif utile ; une image purement décorative peut utiliser une chaîne vide.
## Liens internes ## Markdown et ressources
Les liens entre contenus utilisent les chemins internes de Zola : ### Liens internes
Les liens vers dautres contenus utilisent la syntaxe interne de Zola :
```markdown ```markdown
[Voir bītum](@/vocabulaire/bītum.md) [Voir bītum](@/vocabulaire/bītum.md)
@@ -420,45 +406,67 @@ Les liens entre contenus utilisent les chemins internes de Zola :
Ils sont ajoutés lorsquils apportent un contexte réel : occurrence dans un texte, exemple grammatical, signe observé ou relation lexicale utile. Ils sont ajoutés lorsquils apportent un contexte réel : occurrence dans un texte, exemple grammatical, signe observé ou relation lexicale utile.
### Blocs de code
Un bloc délimité par trois accents graves et associé à une langue reçoit automatiquement la coloration syntaxique :
````markdown
```python
print("šulmu")
```
````
Zola génère `giallo.css`, tandis que le HTML rendu utilise les classes correspondantes. Cette feuille est produite pendant la construction et ne doit pas être modifiée ou ajoutée aux sources.
## Ce que contrôle le validateur ## Ce que contrôle le validateur
Le validateur est volontairement limité à la structure des fiches placées dans `articles/`, `grammaire/`, `signes/`, `textes/` et `vocabulaire/`. Les pages situées directement dans `src/content/`, comme la bibliographie et les mentions légales, ainsi que les fichiers `_index.md`, sont entièrement ignorés. `check-content.py` contrôle uniquement les fiches des cinq sections. Il ignore les fichiers `_index.md` et les pages placées directement dans `src/content/`.
Pour chaque fiche, il vérifie que le fichier peut être lu en UTF-8, que son front matter TOML est valide et quil contient exactement une ligne `updated`, commentée ou active. Il contrôle ensuite la présence et le type des champs communs : Pour chaque fiche, il vérifie :
- `title` et `description` doivent être des chaînes, éventuellement vides ; - la lecture en UTF-8 ;
- `date` doit être un horodatage TOML ; - la présence dun front matter délimité par `+++` ;
- `draft` doit être un booléen ; - la validité du TOML ;
- `updated`, lorsquil est actif, doit également être un horodatage TOML. - exactement une ligne `updated`, commentée ou active ;
- `title` et `description` de type chaîne ;
- `date` de type horodatage TOML ;
- `draft` de type booléen ;
- `updated`, lorsquil est actif, de type horodatage TOML.
Les brouillons et les fiches publiées sont contrôlés de la même façon. Le validateur n’évalue pas la qualité éditoriale des valeurs et nexige donc ni titre, ni sens, ni thème verbal non vide. La nature grammaticale unique et connue sert seulement à déterminer le modèle lexical applicable. Pour le vocabulaire, il vérifie également :
Pour le vocabulaire, il vérifie en plus : - exactement une nature grammaticale reconnue ;
- tous les champs `[extra]` prévus pour cette nature ;
- la présence dune seule nature grammaticale connue dans `taxonomies.natures` ;
- la présence de tous les champs `[extra]` prévus pour cette nature ;
- des chaînes pour les champs simples ; - des chaînes pour les champs simples ;
- un tableau de chaînes pour `logograms`, qui peut être vide. - un tableau de chaînes pour `logograms`.
Pour les autres sections, il vérifie les modèles centralisés dans `_schema.py` : Pour les autres sections, il vérifie :
- `banner`, `banner_alt` et `banner_credit` pour les articles ; - `banner`, `banner_alt` et `banner_credit` pour les articles ;
- `themes` pour la grammaire ; - `themes` pour la grammaire ;
- `sign`, `mzl` et `lectures` pour les signes ; - `sign`, `mzl` et `lectures` pour les signes ;
- `genres` pour les textes. - `genres` pour les textes.
Les tableaux peuvent être vides et les chaînes peuvent être vides. Les champs supplémentaires ne sont pas rejetés. Le validateur ne contrôle ni la forme des noms de fichiers, ni la correspondance du numéro MZL avec le fichier, ni la normalisation Unicode du chemin ou du contenu. Dans `themes` et `genres`, les espaces sont refusés : un terme composé doit utiliser des tirets.
Zola reste responsable de la construction, des liens internes, des taxonomies et du rendu des templates. Le générateur reste responsable de produire les noms de fichiers attendus et des squelettes complets. Le validateur accepte les chaînes et tableaux vides. Il ne contrôle pas :
## Principes de cohérence - la qualité ou lexactitude linguistique des valeurs ;
- les champs supplémentaires ;
- la forme des noms de fichiers ;
- la correspondance entre le numéro MZL et le nom du fichier ;
- la normalisation Unicode des fichiers existants.
- conserver tous les champs prévus par le modèle, même vides ; Zola reste responsable des liens, taxonomies et templates. Le générateur reste responsable de produire des noms de fichiers valides et des squelettes complets.
- conserver exactement une ligne `updated`, commentée ou active ;
- ne renseigner que des informations établies ou utiles ; ## Vérification avant publication
- garder une graphie stable pour chaque lemme, lecture et terme de taxonomie ;
- employer `draft = true` pour un contenu incomplet ou temporairement hors ligne ; Avant de publier ou déployer :
- exécuter `update-content.py` uniquement après une modification substantielle ;
- éviter de répéter dans le corps une donnée déjà claire dans le front matter, sauf lorsquune explication apporte quelque chose ; - conserver tous les champs du modèle, même vides ;
- rédiger des descriptions courtes et informatives lorsquun résumé spécifique est utile ; - conserver exactement une ligne `updated` ;
- ne pas ajouter de rubriques vides ni de textes dattente. - utiliser `draft = false` uniquement pour un contenu prêt ;
- utiliser des tirets dans les thèmes et genres composés ;
- éviter les rubriques vides et les textes dattente ;
- lancer `update-content.py` seulement après une modification substantielle ;
- exécuter le validateur, `zola check`, la construction avec brouillons, puis la construction publique.
+95 -57
View File
@@ -4,32 +4,32 @@
Site public : <https://lescarnetsdakkadien.netig.net> Site public : <https://lescarnetsdakkadien.netig.net>
Le site est construit avec [Zola](https://www.getzola.org/) à partir de fichiers Markdown. Il ne nécessite ni base de données ni interface dadministration : les contenus restent lisibles et modifiables comme de simples fichiers texte. Le site est généré avec **Zola 0.23.1** et **Tera 2** à partir de fichiers Markdown. Il est entièrement statique : aucune base de données, aucune interface dadministration et aucune exécution côté serveur ne sont nécessaires.
## Sections du site ## Contenu
- **Signes** : signes cunéiformes classés par numéro MZL et par lecture ; - **Signes** : signes cunéiformes classés par numéro MZL et par lecture ;
- **Vocabulaire** : fiches adaptées à la nature grammaticale des mots ; - **Vocabulaire** : fiches adaptées à la nature grammaticale des mots ;
- **Grammaire** : notes organisées par thème ; - **Grammaire** : notes regroupées par thème ;
- **Textes** : translittérations, traductions et commentaires classés par genre ; - **Textes** : translittérations, traductions et commentaires classés par genre ;
- **Articles** : billets consacrés à lapprentissage et au projet. - **Articles** : billets consacrés à lapprentissage et au projet.
La page daccueil présente le dernier article et les trois fiches les plus récemment publiées ou mises à jour. Des flux Atom et RSS sont également générés. La page daccueil présente le dernier article et les trois fiches les plus récemment publiées ou mises à jour. Un flux Atom est disponible à ladresse `/atom.xml`.
## Prérequis ## Prérequis
Pour travailler directement sur le projet : Pour le développement local :
- Python 3.11 ou ultérieur ; - Python 3.11 ou ultérieur ;
- Zola 0.22.1 ; - Zola 0.23.1 ;
- Git, si le dépôt est versionné avec Git. - Git, si le dépôt est versionné avec Git.
Pour le déploiement conteneurisé : Pour le déploiement décrit ici :
- Docker Engine ; - Docker Engine et Docker Compose ;
- Docker Compose. - Caddy 2 sur lhôte public.
Toutes les commandes ci-dessous sont exécutées depuis la racine du dépôt. Toutes les commandes suivantes sont exécutées depuis la racine du dépôt.
## Développement local ## Développement local
@@ -39,13 +39,31 @@ Valider la structure des fiches :
./scripts/check-content.py ./scripts/check-content.py
``` ```
Vérifier la construction Zola, brouillons compris : Vérifier le chargement du site et ses liens, brouillons compris :
```sh
zola --root src check --drafts
```
Sans accès réseau, les liens externes peuvent être ignorés :
```sh ```sh
zola --root src check --drafts --skip-external-links zola --root src check --drafts --skip-external-links
``` ```
`--skip-external-links` évite de dépendre du réseau. Retirer cette option pour vérifier également les liens externes. Rendre le site avec les brouillons afin de tester tous les templates :
```sh
zola --root src build --drafts
```
Construire ensuite la version publique, sans les brouillons :
```sh
zola --root src build
```
Les fichiers générés sont écrits dans `src/public/`, répertoire ignoré par Git.
Lancer le serveur de développement : Lancer le serveur de développement :
@@ -59,94 +77,114 @@ Afficher également les brouillons :
zola --root src serve --drafts zola --root src serve --drafts
``` ```
Construire le site statique : ## Rédaction
```sh Les contenus sont stockés dans `src/content/`. Trois commandes accompagnent leur rédaction :
zola --root src build
```
Le résultat est écrit dans `src/public/`, répertoire ignoré par Git. - `new-content.py` crée un brouillon complet pour une section donnée ;
- `update-content.py` actualise son horodatage `updated` ;
- `check-content.py` vérifie la présence et le type des champs prévus.
## Rédaction des contenus Le module `_schema.py` centralise les modèles utilisés par le générateur et le validateur ; il nest pas exécuté directement.
Les contenus sont rédigés en Markdown dans `src/content/`. Des scripts permettent de créer des squelettes complets, dhorodater les modifications substantielles et de vérifier que chaque fiche conserve les champs prévus pour son modèle. Ils concernent uniquement les fiches placées dans les cinq sections du site ; les fichiers `_index.md` et les pages autonomes situées directement dans `src/content/` restent gérés manuellement. Les commandes, conventions et modèles de front matter sont détaillés dans le [guide de rédaction](GUIDE_REDACTION.md).
Les conventions éditoriales, les commandes et les modèles de chaque type de fiche sont décrits dans le [guide de rédaction](GUIDE_REDACTION.md). ## Architecture
## Organisation du dépôt
```text ```text
. .
├── Caddyfile.example
├── Dockerfile ├── Dockerfile
├── compose.yml ├── compose.yml
├── README.md ├── README.md
├── GUIDE_REDACTION.md ├── GUIDE_REDACTION.md
├── LICENSE-CODE ├── LICENSE-CODE
├── LICENSE-CONTENT ├── LICENSE-CONTENT
├── scripts ├── scripts/
│ ├── _schema.py └── src/
├── check-content.py ├── content/
├── new-content.py ├── sass/main.scss
── update-content.py ── static/
└── src ├── templates/
├── content ├── components.html
├── sass │ ├── partials/
├── static │ └── *.html
├── templates
└── zola.toml └── zola.toml
``` ```
- `src/content/` contient les pages Markdown ; - `src/content/` contient les sources Markdown ;
- `src/templates/` contient les templates Tera ; - `src/templates/components.html` contient les composants Tera 2 paramétrés ;
- `src/sass/main.scss` contient les styles ; - `src/templates/partials/` contient les fragments utilisant le contexte courant ;
- `src/static/` contient les ressources servies telles quelles ; - `src/templates/sitemap.xml` retire du sitemap les taxonomies sans contenu publié ;
- `src/zola.toml` contient la configuration de Zola ; - `src/sass/main.scss` définit lapparence, le responsive et limpression ;
- `scripts/` contient les outils de création, de mise à jour et de validation structurelle des fiches. - Zola génère `giallo.css` à partir du thème `github-light` pour la coloration syntaxique par classes ;
- `src/static/` contient les images, la police et le favicon servis tels quels ;
- `src/zola.toml` contient la configuration générale, les taxonomies et le flux Atom.
`giallo.css` et `main.css` sont des fichiers générés dans `src/public/` : ils ne doivent pas être ajoutés manuellement à `src/static/`.
## Déploiement avec Docker Compose ## Déploiement avec Docker Compose
Limage est construite en trois étapes : validation structurelle des fiches, construction complète avec Zola 0.22.1, puis service des seuls fichiers statiques. Limage est construite en trois étapes :
Vérifier la configuration : 1. validation des fiches avec Python ;
2. génération du site avec Zola 0.23.1 ;
3. copie des seuls fichiers publics dans un serveur HTTP statique.
Vérifier puis démarrer le service :
```sh ```sh
docker compose config docker compose config
```
Construire et lancer le service :
```sh
docker compose up -d --build docker compose up -d --build
``` ```
Consulter son état et ses journaux : Le conteneur est exposé uniquement sur linterface locale de lhôte :
```sh
docker compose ps
docker compose logs --tail=100 zola
```
Le service écoute uniquement sur linterface locale de lhôte :
```text ```text
http://127.0.0.1:8002 http://127.0.0.1:8002
``` ```
Le domaine public et le certificat TLS sont pris en charge par un proxy inverse placé devant le conteneur. Pour mettre à jour le déploiement :
Mettre à jour le déploiement :
```sh ```sh
git pull --ff-only git pull --ff-only
docker compose up -d --build docker compose up -d --build
``` ```
Arrêter le service : Pour larrêter :
```sh ```sh
docker compose down docker compose down
``` ```
## Proxy inverse Caddy
Caddy prend en charge le domaine public, HTTPS, les en-têtes de sécurité et la politique de cache. Le serveur HTTP interne désactive ses propres en-têtes de cache et de sécurité afin d’éviter deux configurations concurrentes.
[`Caddyfile.example`](Caddyfile.example) fournit le bloc correspondant au port publié par `compose.yml`. Il applique :
- `Cache-Control: no-cache` aux documents ;
- un cache navigateur dune journée aux feuilles de style, images et polices ;
- une CSP compatible avec les ressources locales du site ;
- HSTS, `Referrer-Policy`, `X-Content-Type-Options` et `X-Frame-Options`.
Le fichier peut être importé au niveau principal du Caddyfile de lhôte ou servir de modèle pour un bloc existant. Sa syntaxe peut être contrôlée avec :
```sh
caddy validate --config Caddyfile.example --adapter caddyfile
```
## Flux Atom
Le flux est activé dans `src/zola.toml` :
```toml
generate_feeds = true
feed_filenames = ["atom.xml"]
```
Le template de base affiche automatiquement la balise de découverte et le lien du pied de page lorsque cette configuration est active.
## Licences ## Licences
Le code propre au projet est distribué sous licence MIT ; voir [`LICENSE-CODE`](LICENSE-CODE). Le code propre au projet est distribué sous licence MIT ; voir [`LICENSE-CODE`](LICENSE-CODE).
+1
View File
@@ -71,6 +71,7 @@ SECTION_FIELDS = {
} }
LIST_FIELDS = frozenset({"logograms", "lectures", "themes", "genres"}) LIST_FIELDS = frozenset({"logograms", "lectures", "themes", "genres"})
URL_TERM_FIELDS = frozenset({"themes", "genres"})
CONTENT_SECTIONS = frozenset(SECTION_FIELDS) | {"vocabulaire"} CONTENT_SECTIONS = frozenset(SECTION_FIELDS) | {"vocabulaire"}
UPDATED_LINE_RE = re.compile(r"(?m)^(?:#\s*)?updated\s*=.*?(?=\r?$)") UPDATED_LINE_RE = re.compile(r"(?m)^(?:#\s*)?updated\s*=.*?(?=\r?$)")
+13 -2
View File
@@ -12,6 +12,7 @@ from _schema import (
LIST_FIELDS, LIST_FIELDS,
SECTION_FIELDS, SECTION_FIELDS,
UPDATED_LINE_RE, UPDATED_LINE_RE,
URL_TERM_FIELDS,
VOCABULARY_FIELDS, VOCABULARY_FIELDS,
) )
@@ -26,7 +27,6 @@ COMMON_FIELDS = {
} }
class Validator: class Validator:
def __init__(self) -> None: def __init__(self) -> None:
self.errors = 0 self.errors = 0
@@ -118,7 +118,18 @@ def check_fields(
label = f"{table_name}.{field}" label = f"{table_name}.{field}"
if field in LIST_FIELDS: if field in LIST_FIELDS:
check_string_list(table[field], label, path, validator) if check_string_list(table[field], label, path, validator) and field in URL_TERM_FIELDS:
spaced_terms = [
term
for term in table[field]
if any(char.isspace() for char in term)
]
if spaced_terms:
validator.error(
path,
f"{label} doit utiliser des tirets à la place des espaces : "
+ ", ".join(repr(term) for term in spaced_terms),
)
else: else:
check_type(table[field], str, label, path, validator) check_type(table[field], str, label, path, validator)
+1 -1
View File
@@ -6,7 +6,7 @@ description = "Fiche dexemple consacrée à la forme liée du nom akkadien."
draft = true draft = true
[taxonomies] [taxonomies]
themes = ["morphologie nominale"] themes = ["morphologie-nominale"]
+++ +++
> Cette fiche factice sert à vérifier la présentation des notes de grammaire. > Cette fiche factice sert à vérifier la présentation des notes de grammaire.
+112 -258
View File
@@ -1,21 +1,22 @@
// Couleurs :root {
$paper: #fbf8f0; color-scheme: light;
$paper-soft: #f3eee4; --paper: #fbf8f0;
$paper-edge: #e7dfcf; --paper-soft: #f3eee4;
$ink: #28231d; --paper-edge: #e7dfcf;
$heading: #3d2c20; --ink: #28231d;
$muted: #6c6257; --heading: #3d2c20;
$cuneiform: #5b5046; --muted: #6c6257;
$accent: #7a3f22; --cuneiform: #5b5046;
$rule: #d8cdbb; --accent: #7a3f22;
--accent-faint: rgba(122, 63, 34, 0.035);
--accent-soft: rgba(122, 63, 34, 0.06);
--rule: #d8cdbb;
--content-width: 50rem;
--font-text: Georgia, "Times New Roman", serif;
--font-cuneiform: "Assurbanipal", "Noto Sans Cuneiform", "Segoe UI Historic", sans-serif;
--font-code: ui-monospace, "Cascadia Code", "Liberation Mono", monospace;
}
// Typographie et mise en page
$font-text: Georgia, "Times New Roman", serif;
$font-cuneiform: "Assurbanipal", "Noto Sans Cuneiform", "Segoe UI Historic", sans-serif;
$font-code: ui-monospace, "Cascadia Code", "Liberation Mono", monospace;
$content-width: 50rem;
// Police cunéiforme
@font-face { @font-face {
font-family: "Assurbanipal"; font-family: "Assurbanipal";
src: url("fonts/assurbanipal.woff2") format("woff2"); src: url("fonts/assurbanipal.woff2") format("woff2");
@@ -25,54 +26,44 @@ $content-width: 50rem;
unicode-range: U+12000-123FF, U+12400-1247F; unicode-range: U+12000-123FF, U+12400-1247F;
} }
// Base
*, *,
*::before, *::before,
*::after { *::after {
box-sizing: border-box; box-sizing: border-box;
} }
html {
color-scheme: light;
}
body { body {
display: flex; display: flex;
min-height: 100vh; min-height: 100vh;
min-height: 100svh; min-height: 100svh;
margin: 0; margin: 0;
flex-direction: column; flex-direction: column;
color: $ink; color: var(--ink);
background: $paper; background: var(--paper);
font-family: $font-text; font-family: var(--font-text);
font-size: clamp(1.0625rem, 1.02rem + 0.18vw, 1.125rem); font-size: clamp(1.0625rem, 1.02rem + 0.18vw, 1.125rem);
line-height: 1.7; line-height: 1.7;
text-rendering: optimizeLegibility; text-rendering: optimizeLegibility;
} }
::selection { ::selection {
color: $ink; color: var(--ink);
background: $paper-edge; background: var(--paper-edge);
} }
a { a {
color: $accent; color: var(--accent);
text-decoration-thickness: 0.08em; text-decoration-thickness: 0.08em;
text-underline-offset: 0.16em; text-underline-offset: 0.16em;
&:hover { &:hover { text-decoration-thickness: 0.14em; }
text-decoration-thickness: 0.14em;
}
&:focus-visible { &:focus-visible {
outline: 3px solid rgba($accent, 0.35); outline: 3px solid rgba(122, 63, 34, 0.35);
outline-offset: 3px; outline-offset: 3px;
} }
} }
[id] { [id] { scroll-margin-top: 2rem; }
scroll-margin-top: 2rem;
}
img, img,
svg { svg {
@@ -81,27 +72,24 @@ svg {
height: auto; height: auto;
} }
// Mise en page générale
.container { .container {
width: min(100% - 2rem, $content-width); width: min(100% - 2rem, var(--content-width));
margin-inline: auto; margin-inline: auto;
} }
.skip-link { .skip-link {
position: fixed; position: fixed;
left: 0.75rem;
top: 0.75rem; top: 0.75rem;
left: 0.75rem;
z-index: 100; z-index: 100;
padding: 0.65rem 0.95rem; padding: 0.65rem 0.95rem;
color: $paper; color: var(--paper);
background: $ink; background: var(--ink);
font-weight: 700; font-weight: 700;
text-decoration: none; text-decoration: none;
transform: translateY(-180%); transform: translateY(-180%);
&:focus { &:focus { transform: translateY(0); }
transform: translateY(0);
}
} }
.site-main { .site-main {
@@ -109,9 +97,8 @@ svg {
flex: 1 0 auto; flex: 1 0 auto;
} }
// En-tête et navigation
.site-header { .site-header {
border-bottom: 1px solid $rule; border-bottom: 1px solid var(--rule);
background: rgba(255, 255, 255, 0.35); background: rgba(255, 255, 255, 0.35);
&__inner { &__inner {
@@ -128,7 +115,7 @@ svg {
align-items: flex-start; align-items: flex-start;
flex-direction: column; flex-direction: column;
gap: 0.2rem; gap: 0.2rem;
color: $ink; color: var(--ink);
line-height: 1.08; line-height: 1.08;
text-decoration: none; text-decoration: none;
white-space: nowrap; white-space: nowrap;
@@ -140,8 +127,8 @@ svg {
} }
&__cuneiform { &__cuneiform {
color: $cuneiform; color: var(--cuneiform);
font-family: $font-cuneiform; font-family: var(--font-cuneiform);
font-size: 1.52rem; font-size: 1.52rem;
font-synthesis: none; font-synthesis: none;
font-weight: 400; font-weight: 400;
@@ -150,9 +137,7 @@ svg {
} }
&:hover &__cuneiform, &:hover &__cuneiform,
&:focus-visible &__cuneiform { &:focus-visible &__cuneiform { color: var(--accent); }
color: $accent;
}
} }
.site-nav { .site-nav {
@@ -170,29 +155,25 @@ svg {
display: inline-block; display: inline-block;
padding-block: 0.3rem; padding-block: 0.3rem;
border-bottom: 2px solid transparent; border-bottom: 2px solid transparent;
color: $muted; color: var(--muted);
font-size: 0.95rem; font-size: 0.95rem;
font-weight: 600; font-weight: 600;
line-height: 1.25; line-height: 1.25;
text-decoration: none; text-decoration: none;
&:hover, &:hover,
&:focus-visible { &:focus-visible { color: var(--accent); }
color: $accent;
}
&[aria-current] { &[aria-current] {
border-bottom-color: $accent; border-bottom-color: var(--accent);
color: $ink; color: var(--ink);
} }
} }
} }
// Titres et contenu courant
h1, h1,
h2, h2,
h3 { h3 {
color: $heading; color: var(--heading);
line-height: 1.22; line-height: 1.22;
} }
@@ -219,48 +200,38 @@ ol,
dl, dl,
table, table,
pre, pre,
blockquote { blockquote { margin-block: 1rem; }
margin-block: 1rem;
}
ul, ul,
ol { ol { padding-left: 1.45rem; }
padding-left: 1.45rem; li + li { margin-top: 0.18rem; }
}
li + li {
margin-top: 0.18rem;
}
hr { hr {
height: 1px; height: 1px;
margin-block: 2.25rem; margin-block: 2.25rem;
border: 0; border: 0;
background: $rule; background: var(--rule);
} }
// En-têtes de page et métadonnées
.entry-header { .entry-header {
margin-bottom: 2rem; margin-bottom: 2rem;
padding-bottom: 1.15rem; padding-bottom: 1.15rem;
border-bottom: 1px solid $rule; border-bottom: 1px solid var(--rule);
> :last-child { > :last-child { margin-bottom: 0; }
margin-bottom: 0;
}
} }
.entry-description, .entry-description,
.section-description { .section-description {
max-width: 72ch; max-width: 72ch;
color: $muted; color: var(--muted);
font-size: 1.12rem; font-size: 1.12rem;
line-height: 1.62; line-height: 1.62;
} }
.entry-date, .entry-date,
.entry-list__meta { .entry-list__meta {
color: $muted; color: var(--muted);
font-size: 0.92rem; font-size: 0.92rem;
font-variant-numeric: tabular-nums; font-variant-numeric: tabular-nums;
} }
@@ -272,7 +243,7 @@ hr {
margin-block: 1.3rem 0; margin-block: 1.3rem 0;
dt { dt {
color: $muted; color: var(--muted);
font-weight: 700; font-weight: 700;
} }
@@ -282,27 +253,25 @@ hr {
} }
} }
// Bannière facultative des articles
.article-cover { .article-cover {
margin: 0 0 1.6rem; margin: 0 0 1.6rem;
img { img {
width: 100%; width: 100%;
aspect-ratio: 16 / 7; aspect-ratio: 16 / 7;
border: 1px solid $paper-edge; border: 1px solid var(--paper-edge);
object-fit: cover; object-fit: cover;
object-position: center; object-position: center;
} }
figcaption { figcaption {
margin-top: 0.25rem; margin-top: 0.25rem;
color: $muted; color: var(--muted);
font-size: 0.8rem; font-size: 0.8rem;
text-align: right; text-align: right;
} }
} }
// Listes de contenus
.entry-list { .entry-list {
margin: 1.25rem 0 0; margin: 1.25rem 0 0;
padding: 0; padding: 0;
@@ -311,12 +280,10 @@ hr {
li { li {
margin: 0; margin: 0;
padding-block: 0.82rem; padding-block: 0.82rem;
border-bottom: 1px solid $paper-edge; border-bottom: 1px solid var(--paper-edge);
} }
a { a { font-weight: 700; }
font-weight: 700;
}
&__meta { &__meta {
margin-top: 0.12rem; margin-top: 0.12rem;
@@ -324,39 +291,30 @@ hr {
a { a {
color: inherit; color: inherit;
font-weight: 600; font-weight: 600;
&:hover, &:hover,
&:focus-visible { &:focus-visible { color: var(--accent); }
color: $accent;
}
} }
} }
} }
// Page daccueil
.home-intro { .home-intro {
display: grid; display: grid;
grid-template-columns: minmax(0, 1fr) 13.75rem; grid-template-columns: minmax(0, 1fr) 13.75rem;
gap: 2.25rem; gap: 2.25rem;
align-items: start; align-items: start;
&__text > :first-child { &__text > :first-child { margin-top: 0; }
margin-top: 0;
}
&__figure { &__figure {
margin: 0; margin: 0;
text-align: center; text-align: center;
} }
&__image { &__image {
width: 100%; width: 100%;
filter: drop-shadow(0 0.4rem 0.7rem rgba($ink, 0.2)); filter: drop-shadow(0 0.4rem 0.7rem rgba(40, 35, 29, 0.2));
} }
&__caption { &__caption {
margin-top: 0.55rem; margin-top: 0.55rem;
color: $muted; color: var(--muted);
font-size: 0.78rem; font-size: 0.78rem;
line-height: 1.4; line-height: 1.4;
} }
@@ -366,32 +324,19 @@ hr {
.home-directory, .home-directory,
.home-about { .home-about {
margin-top: 2.4rem; margin-top: 2.4rem;
> h2 { margin-top: 0; }
> h2 {
margin-top: 0;
}
} }
.home-latest { .home-latest {
&__entry { &__entry {
margin-top: 1.15rem; margin-top: 1.15rem;
padding: 1.1rem 1.25rem; padding: 1.1rem 1.25rem;
border: 1px solid $rule; border: 1px solid var(--rule);
background: rgba($accent, 0.035); background: var(--accent-faint);
} }
h3 { margin: 0; }
h3 { .entry-date { margin: 0.2rem 0 0; }
margin: 0; &__description { margin: 0.75rem 0 0; }
}
.entry-date {
margin: 0.2rem 0 0;
}
&__description {
margin: 0.75rem 0 0;
}
&__link { &__link {
display: inline-block; display: inline-block;
margin-top: 0.75rem; margin-top: 0.75rem;
@@ -399,11 +344,10 @@ hr {
} }
} }
.home-directory { .home-directory__list {
&__list {
margin: 1.15rem 0 0; margin: 1.15rem 0 0;
padding: 0; padding: 0;
border-top: 1px solid $paper-edge; border-top: 1px solid var(--paper-edge);
list-style: none; list-style: none;
li { li {
@@ -412,21 +356,15 @@ hr {
gap: 1rem; gap: 1rem;
margin: 0; margin: 0;
padding-block: 0.82rem; padding-block: 0.82rem;
border-bottom: 1px solid $paper-edge; border-bottom: 1px solid var(--paper-edge);
} }
a { font-weight: 700; }
a {
font-weight: 700;
}
p { p {
margin: 0; margin: 0;
color: $muted; color: var(--muted);
}
} }
} }
// Navigation secondaire et liens de contexte
.section-tools { .section-tools {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -434,19 +372,17 @@ hr {
gap: 1.5rem; gap: 1.5rem;
margin-block: 2rem 2.5rem; margin-block: 2rem 2.5rem;
padding: 1.1rem 1.25rem; padding: 1.1rem 1.25rem;
border: 1px solid $rule; border: 1px solid var(--rule);
background: rgba($accent, 0.035); background: var(--accent-faint);
h2 { h2 {
margin: 0 0 0.2rem; margin: 0 0 0.2rem;
font-size: 1.2rem; font-size: 1.2rem;
} }
p { p {
margin: 0; margin: 0;
color: $muted; color: var(--muted);
} }
&__link { &__link {
flex: 0 0 auto; flex: 0 0 auto;
font-weight: 700; font-weight: 700;
@@ -458,22 +394,20 @@ hr {
font-size: 0.95rem; font-size: 0.95rem;
a { a {
color: $muted; color: var(--muted);
text-decoration: none; text-decoration: none;
&:hover, &:hover,
&:focus-visible { &:focus-visible {
color: $accent; color: var(--accent);
text-decoration: underline; text-decoration: underline;
} }
} }
} }
// Cunéiforme
.cuneiform { .cuneiform {
display: inline-block; display: inline-block;
margin-right: 0.25em; margin-right: 0.25em;
font-family: $font-cuneiform; font-family: var(--font-cuneiform);
font-synthesis: none; font-synthesis: none;
font-size: 1.2em; font-size: 1.2em;
font-weight: 400; font-weight: 400;
@@ -481,7 +415,6 @@ hr {
vertical-align: -0.08em; vertical-align: -0.08em;
} }
// Tableaux, citations et code
table { table {
width: 100%; width: 100%;
border-collapse: collapse; border-collapse: collapse;
@@ -491,40 +424,32 @@ table {
th, th,
td { td {
padding: 0.58rem 0.72rem; padding: 0.58rem 0.72rem;
border: 1px solid $rule; border: 1px solid var(--rule);
text-align: left; text-align: left;
vertical-align: top; vertical-align: top;
} }
th { th {
color: $heading; color: var(--heading);
background: rgba($accent, 0.06); background: var(--accent-soft);
} }
tbody tr:nth-child(even) { tbody tr:nth-child(even) { background: rgba(122, 63, 34, 0.018); }
background: rgba($accent, 0.018);
}
blockquote { blockquote {
margin-inline: 0; margin-inline: 0;
padding: 0.05rem 0 0.05rem 1rem; padding: 0.05rem 0 0.05rem 1rem;
border-left: 0.2rem solid $rule; border-left: 0.2rem solid var(--rule);
color: $muted; color: var(--muted);
> :first-child { margin-top: 0; }
> :first-child { > :last-child { margin-bottom: 0; }
margin-top: 0;
}
> :last-child {
margin-bottom: 0;
}
} }
code { code {
padding: 0.08em 0.28em; padding: 0.08em 0.28em;
border: 1px solid $paper-edge; border: 1px solid var(--paper-edge);
background: $paper-soft; background: var(--paper-soft);
font-family: $font-code; font-family: var(--font-code);
font-size: 0.9em; font-size: 0.9em;
overflow-wrap: anywhere; overflow-wrap: anywhere;
} }
@@ -532,8 +457,8 @@ code {
pre { pre {
overflow-x: auto; overflow-x: auto;
padding: 1rem 1.1rem; padding: 1rem 1.1rem;
border: 1px solid $paper-edge; border: 1px solid var(--paper-edge);
background: $paper-soft; background: var(--paper-soft);
line-height: 1.55; line-height: 1.55;
tab-size: 4; tab-size: 4;
@@ -546,11 +471,10 @@ pre {
} }
} }
// Pied de page
.site-footer { .site-footer {
padding-block: 1.5rem 2rem; padding-block: 1.5rem 2rem;
border-top: 1px solid $rule; border-top: 1px solid var(--rule);
color: $muted; color: var(--muted);
font-size: 0.9rem; font-size: 0.9rem;
&__inner { &__inner {
@@ -577,41 +501,32 @@ pre {
} }
p, p,
&__contact { &__contact { margin: 0; }
margin: 0;
}
&__contact { &__contact {
font-style: normal; font-style: normal;
> a { > a {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
padding: 0.32rem 0.72rem; padding: 0.32rem 0.72rem;
border: 1px solid rgba($accent, 0.5); border: 1px solid rgba(122, 63, 34, 0.5);
border-radius: 0.3rem; border-radius: 0.3rem;
color: $accent; color: var(--accent);
background: rgba($accent, 0.05); background: rgba(122, 63, 34, 0.05);
font-size: 0.95rem; font-size: 0.95rem;
font-weight: 700; font-weight: 700;
line-height: 1.2; line-height: 1.2;
text-decoration: none; text-decoration: none;
&:hover, &:hover,
&:focus-visible { &:focus-visible {
border-color: $accent; border-color: var(--accent);
color: $heading; color: var(--heading);
background: rgba($accent, 0.12); background: rgba(122, 63, 34, 0.12);
} }
} }
} }
small { font-size: inherit; }
}
small {
font-size: inherit;
}
}
// Numéros de ligne générés par la coloration syntaxique de Zola
.giallo-l { .giallo-l {
display: inline-block; display: inline-block;
min-height: 1lh; min-height: 1lh;
@@ -628,12 +543,8 @@ pre {
opacity: 0.72; opacity: 0.72;
} }
// Petits écrans
@media (max-width: 45rem) { @media (max-width: 45rem) {
.container { .container { width: min(100% - 1.5rem, var(--content-width)); }
width: min(100% - 1.5rem, $content-width);
}
.site-header__inner { .site-header__inner {
align-items: center; align-items: center;
flex-direction: column; flex-direction: column;
@@ -641,192 +552,135 @@ pre {
padding-block: 1rem; padding-block: 1rem;
text-align: center; text-align: center;
} }
.site-title { align-items: center; }
.site-title {
align-items: center;
}
.site-nav { .site-nav {
width: 100%; width: 100%;
ul { ul {
justify-content: center; justify-content: center;
gap: 0.1rem 0.85rem; gap: 0.1rem 0.85rem;
} }
} }
.site-main { padding-block: 2.15rem 3.25rem; }
.site-main { h1 { font-size: clamp(2rem, 10vw, 2.55rem); }
padding-block: 2.15rem 3.25rem;
}
h1 {
font-size: clamp(2rem, 10vw, 2.55rem);
}
.section-tools { .section-tools {
align-items: flex-start; align-items: flex-start;
flex-direction: column; flex-direction: column;
gap: 0.75rem; gap: 0.75rem;
} }
.home-intro { .home-intro {
grid-template-columns: 1fr; grid-template-columns: 1fr;
gap: 1.5rem; gap: 1.5rem;
&__figure { &__figure {
width: min(100%, 13.75rem); width: min(100%, 13.75rem);
margin-inline: auto; margin-inline: auto;
} }
} }
.home-directory__list li { .home-directory__list li {
grid-template-columns: 1fr; grid-template-columns: 1fr;
gap: 0.1rem; gap: 0.1rem;
} }
.metadata { .metadata {
grid-template-columns: 1fr; grid-template-columns: 1fr;
gap: 0.1rem; gap: 0.1rem;
dd + dt { margin-top: 0.65rem; }
dd + dt {
margin-top: 0.65rem;
} }
}
table { table {
display: block; display: block;
max-width: 100%; max-width: 100%;
overflow-x: auto; overflow-x: auto;
white-space: nowrap; white-space: nowrap;
} }
.site-footer__inner { .site-footer__inner {
align-items: center; align-items: center;
text-align: center; text-align: center;
} }
.site-footer__links { .site-footer__links {
align-items: center; align-items: center;
flex-direction: column; flex-direction: column;
gap: 0.75rem; gap: 0.75rem;
nav { nav {
justify-content: center; justify-content: center;
text-align: center; text-align: center;
} }
} }
.site-footer__license { .site-footer__license {
width: 100%; width: 100%;
text-align: center; text-align: center;
} }
} }
// Impression
@media print { @media print {
@page { @page { margin: 18mm; }
margin: 18mm;
}
html, html,
body { body {
color: #000; color: #000;
background: #fff; background: #fff;
} }
body { body {
display: block; display: block;
min-height: auto; min-height: auto;
font-size: 11pt; font-size: 11pt;
line-height: 1.5; line-height: 1.5;
} }
.container { .container {
width: 100%; width: 100%;
max-width: none; max-width: none;
margin: 0; margin: 0;
} }
.skip-link, .skip-link,
.site-nav, .site-nav,
.site-footer, .site-footer,
.section-tools, .section-tools,
.context-link { .context-link { display: none !important; }
display: none !important; .home-intro__image { filter: none; }
}
.home-intro__image {
filter: none;
}
.site-header { .site-header {
border-bottom: 1px solid #999; border-bottom: 1px solid #999;
background: transparent; background: transparent;
&__inner { &__inner {
display: block; display: block;
padding-block: 0 0.8rem; padding-block: 0 0.8rem;
} }
} }
.site-title { .site-title {
align-items: flex-start; align-items: flex-start;
color: #000; color: #000;
&__cuneiform { color: #333; }
&__cuneiform {
color: #333;
} }
} .site-main { padding-block: 1.2rem 0; }
.site-main {
padding-block: 1.2rem 0;
}
h1, h1,
h2, h2,
h3 { h3 {
color: #000; color: #000;
break-after: avoid-page; break-after: avoid-page;
} }
p, p,
li, li,
blockquote { blockquote {
orphans: 3; orphans: 3;
widows: 3; widows: 3;
} }
.entry-header, .entry-header,
.article-cover, .article-cover,
.entry-list li, .entry-list li,
table, table,
blockquote, blockquote,
pre, pre,
img { img { break-inside: avoid; }
break-inside: avoid;
}
a { a {
color: inherit; color: inherit;
text-decoration: underline; text-decoration: underline;
} }
table { table {
display: table; display: table;
max-width: none; max-width: none;
overflow: visible; overflow: visible;
white-space: normal; white-space: normal;
} }
thead { display: table-header-group; }
thead {
display: table-header-group;
}
th { th {
background: #eee; background: #eee;
print-color-adjust: exact; print-color-adjust: exact;
} }
pre { pre {
overflow: visible; overflow: visible;
border-color: #aaa; border-color: #aaa;
+2 -7
View File
@@ -1,9 +1,4 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block title %}Page introuvable · {{ config.title }}{% endblock title %} {% block title %}Page introuvable · {{ config.title }}{% endblock title %}
{% block description %}La page demandée nexiste pas ou a été déplacée.{% endblock description %}
{% block content %} {% block content %}<h1>Page introuvable</h1><p>La page demandée nexiste pas ou a été déplacée.</p><p><a href="{{ get_url(path='@/_index.md') }}">Revenir à laccueil</a></p>{% endblock content %}
<h1>Page introuvable</h1>
<p>La page demandée nexiste pas ou a été déplacée.</p>
<p><a href="{{ get_url(path='@/_index.md') | safe }}">Revenir à laccueil</a></p>
{% endblock content %}
+1 -20
View File
@@ -1,29 +1,10 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block title %}{{ section.title }} · {{ config.title }}{% endblock title %} {% block title %}{{ section.title }} · {{ config.title }}{% endblock title %}
{% block content %} {% block content %}
{% include "partials/section-header.html" %} {% include "partials/section-header.html" %}
{{ section.content | safe }} {{ section.content | safe }}
{% if section.pages %} {% if section.pages %}
<h2>Liste des articles</h2> <h2>Liste des articles</h2>
<ul class="entry-list"> <ul class="entry-list">{% for page in section.pages %}{{<document_entry page={page} show_date={true} />}}{% endfor %}</ul>
{% for page in section.pages %}
<li>
<a href="{{ page.permalink | safe }}">{{ page.title }}</a>
{% if page.date or page.description %}
<div class="entry-list__meta">
{% if page.date %}
<time datetime="{{ page.date }}">{{ page.date | date(format="%d/%m/%Y") }}</time>
{% endif %}
{% if page.date and page.description %} — {% endif %}
{% if page.description %}{{ page.description }}{% endif %}
</div>
{% endif %}
</li>
{% endfor %}
</ul>
{% endif %} {% endif %}
{% endblock content %} {% endblock content %}
+39 -76
View File
@@ -1,40 +1,40 @@
<!doctype html> <!doctype html>
<html lang="{{ lang }}"> <html lang="{{ lang }}">
{% set nav_path = current_path if current_path is defined else "" %}
{% set atom_enabled = config.generate_feeds and "atom.xml" in config.feed_filenames %}
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
{% if page is defined and page.description %} <meta name="description" content="{% block description -%}
<meta name="description" content="{{ page.description }}"> {%- if page is defined and page.description -%}
{% elif section is defined and section.description %} {{- page.description -}}
<meta name="description" content="{{ section.description }}"> {%- elif section is defined and section.description -%}
{% elif term is defined %} {{- section.description -}}
<meta name="description" content="Contenus associés à « {{ term.name }} » dans {{ config.title }}."> {%- elif term is defined -%}
{% elif taxonomy is defined %} {%- set term_label = term.name | replace(from="-", to=" ") if taxonomy.name != "lectures" else term.name -%}
<meta name="description" content="Index « {{ taxonomy.name }} » de {{ config.title }}."> Contenus associés à « {{ term_label }} » dans {{ config.title }}.
{% else %} {%- elif taxonomy is defined -%}
<meta name="description" content="{{ config.description }}"> Index « {{ taxonomy.name }} » de {{ config.title }}.
{% endif %} {%- else -%}
<meta name="author" content="{{ config.extra.author }}"> {{- config.description -}}
{% if current_url is defined %} {%- endif -%}
<link rel="canonical" href="{{ current_url | safe }}"> {%- endblock description %}">
{% endif %} <meta name="author" content="{{ config.author }}">
{% if current_url is defined %}<link rel="canonical" href="{{ current_url }}">{% endif %}
<meta property="og:site_name" content="{{ config.title }}"> <meta property="og:site_name" content="{{ config.title }}">
{% if atom_enabled %}
<link rel="alternate" type="application/atom+xml" title="{{ config.title }} — Atom" <link rel="alternate" type="application/atom+xml" title="{{ config.title }} — Atom"
href="{{ get_url(path='atom.xml', trailing_slash=false) | safe }}"> href="{{ get_url(path='atom.xml', trailing_slash=false) }}">
<link rel="alternate" type="application/rss+xml" title="{{ config.title }} — RSS" {% endif %}
href="{{ get_url(path='rss.xml', trailing_slash=false) | safe }}">
<title>{% block title %}{{ config.title }}{% endblock title %}</title> <title>{% block title %}{{ config.title }}{% endblock title %}</title>
<link rel="icon" type="image/png" sizes="64x64" href="{{ get_url(path='images/favicon.png') | safe }}"> <link rel="icon" type="image/png" sizes="64x64" href="{{ get_url(path='images/favicon.png') }}">
<link rel="stylesheet" href="{{ get_url(path='main.css') | safe }}"> <link rel="stylesheet" href="{{ get_url(path='giallo.css', trailing_slash=false) }}">
<link rel="stylesheet" href="{{ get_url(path='main.css') }}">
</head> </head>
<body> <body>
{% set nav_path = current_path | default(value="") %}
{% if nav_path == "/" %} {% if nav_path == "/" %}
<div itemscope itemtype="https://schema.org/WebSite"> <div itemscope itemtype="https://schema.org/WebSite">
<link itemprop="url" href="{{ get_url(path='@/_index.md') | safe }}"> <link itemprop="url" href="{{ get_url(path='@/_index.md') }}">
<meta itemprop="name" content="{{ config.title }}"> <meta itemprop="name" content="{{ config.title }}">
<meta itemprop="alternateName" content="lescarnetsdakkadien.netig.net"> <meta itemprop="alternateName" content="lescarnetsdakkadien.netig.net">
</div> </div>
@@ -44,33 +44,18 @@
<header class="site-header"> <header class="site-header">
<div class="container site-header__inner"> <div class="container site-header__inner">
<a class="site-title" href="{{ get_url(path='@/_index.md') | safe }}"> <a class="site-title" href="{{ get_url(path='@/_index.md') }}">
<span class="site-title__text">{{ config.title }}</span> <span class="site-title__text">{{ config.title }}</span>
<span class="site-title__cuneiform" lang="akk-Xsux" aria-hidden="true">𒀝𒅗𒁺𒌑𒌝</span> <span class="site-title__cuneiform" lang="akk-Xsux" aria-hidden="true">𒀝𒅗𒁺𒌑𒌝</span>
</a> </a>
<nav class="site-nav" aria-label="Navigation principale"> <nav class="site-nav" aria-label="Navigation principale">
<ul> <ul>
<li> <li><a href="{{ get_url(path='@/signes/_index.md') }}"{% if "/signes/" in nav_path or "/lectures/" in nav_path %} aria-current="location"{% endif %}>Signes</a></li>
<a href="{{ get_url(path='@/signes/_index.md') | safe }}" {% if "/signes/" in nav_path <li><a href="{{ get_url(path='@/vocabulaire/_index.md') }}"{% if "/vocabulaire/" in nav_path or "/natures/" in nav_path %} aria-current="location"{% endif %}>Vocabulaire</a></li>
or "/lectures/" in nav_path %} aria-current="location" {% endif %}>Signes</a> <li><a href="{{ get_url(path='@/grammaire/_index.md') }}"{% if "/grammaire/" in nav_path or "/themes/" in nav_path %} aria-current="location"{% endif %}>Grammaire</a></li>
</li> <li><a href="{{ get_url(path='@/textes/_index.md') }}"{% if "/textes/" in nav_path or "/genres/" in nav_path %} aria-current="location"{% endif %}>Textes</a></li>
<li> <li><a href="{{ get_url(path='@/articles/_index.md') }}"{% if "/articles/" in nav_path %} aria-current="location"{% endif %}>Articles</a></li>
<a href="{{ get_url(path='@/vocabulaire/_index.md') | safe }}" {% if "/vocabulaire/" in nav_path
or "/natures/" in nav_path %} aria-current="location" {% endif %}>Vocabulaire</a>
</li>
<li>
<a href="{{ get_url(path='@/grammaire/_index.md') | safe }}" {% if "/grammaire/" in nav_path
or "/themes/" in nav_path %} aria-current="location" {% endif %}>Grammaire</a>
</li>
<li>
<a href="{{ get_url(path='@/textes/_index.md') | safe }}" {% if "/textes/" in nav_path
or "/genres/" in nav_path %} aria-current="location" {% endif %}>Textes</a>
</li>
<li>
<a href="{{ get_url(path='@/articles/_index.md') | safe }}" {% if "/articles/" in nav_path %}
aria-current="location" {% endif %}>Articles</a>
</li>
</ul> </ul>
</nav> </nav>
</div> </div>
@@ -83,40 +68,18 @@
<footer class="site-footer"> <footer class="site-footer">
<div class="container site-footer__inner"> <div class="container site-footer__inner">
<div class="site-footer__links"> <div class="site-footer__links">
<address class="site-footer__contact"> <address class="site-footer__contact"><a href="mailto:{{ config.extra.email }}">Me contacter</a></address>
<a href="mailto:{{ config.extra.email }}">Me contacter</a>
</address>
<nav aria-label="Liens complémentaires"> <nav aria-label="Liens complémentaires">
<a href="{{ get_url(path='@/bibliographie.md') | safe }}"> <a href="{{ get_url(path='@/bibliographie.md') }}">Bibliographie</a>
Bibliographie <a href="{{ get_url(path='@/mentions-legales.md') }}">Mentions légales</a>
</a> {% if atom_enabled %}<a href="{{ get_url(path='atom.xml', trailing_slash=false) }}" type="application/atom+xml">Flux Atom</a>{% endif %}
<a href="{{ get_url(path='@/mentions-legales.md') | safe }}">
Mentions légales
</a>
<a href="{{ get_url(path='atom.xml', trailing_slash=false) | safe }}" type="application/atom+xml">
Flux Atom
</a>
<a href="{{ get_url(path='rss.xml', trailing_slash=false) | safe }}" type="application/rss+xml">
Flux RSS
</a>
</nav> </nav>
</div> </div>
<p class="site-footer__license"><small>
<p class="site-footer__license"> Sauf mention contraire, le contenu original du site web {{ config.author }} est placé sous licence
<small> <a href="https://creativecommons.org/licenses/by-sa/4.0/deed.fr" rel="license">CC BY-SA 4.0</a>
Sauf mention contraire, le contenu original du site web </small></p>
{{ config.extra.author }} est placé sous licence
<a href="https://creativecommons.org/licenses/by-sa/4.0/deed.fr" rel="license">
CC BY-SA 4.0
</a>
</small>
</p>
</div> </div>
</footer> </footer>
</body> </body>
</html> </html>
+94
View File
@@ -0,0 +1,94 @@
{% component taxonomy_links(terms: array, kind: string) -%}
{%- for term in terms -%}
{%- if not loop.first %}, {% endif -%}
{% set term_label = term | replace(from="-", to=" ") if kind != "lectures" else term %}
<a href="{{ get_taxonomy_url(kind=kind, term=term) }}">{{ term_label }}</a>
{%- endfor -%}
{%- endcomponent taxonomy_links %}
{% component taxonomy_panel(kind: string, heading_id: string, title: string, description: string, link_label: string) %}
{% set taxonomy = get_taxonomy(kind=kind, required=false) %}
{% if taxonomy and taxonomy.items %}
<nav class="section-tools" aria-labelledby="{{ heading_id }}">
<div>
<h2 id="{{ heading_id }}">{{ title }}</h2>
<p>{{ description }}</p>
</div>
<a class="section-tools__link" href="{{ taxonomy.permalink }}">{{ link_label }}</a>
</nav>
{% endif %}
{% endcomponent taxonomy_panel %}
{% component metadata_field(extra, key: string, label: string, lang: string = "") -%}
{%- set value = extra | get(key=key, default="") -%}
{%- if value -%}
<dt>{{ label }}</dt>
<dd{% if lang %} lang="{{ lang }}"{% endif %}>{{ value }}</dd>
{%- endif -%}
{%- endcomponent metadata_field %}
{% component metadata_list(extra, key: string, label: string, lang: string = "") -%}
{%- set values = extra | get(key=key, default=[]) -%}
{%- if values -%}
<dt>{{ label }}</dt>
<dd{% if lang %} lang="{{ lang }}"{% endif %}>
{%- for value in values -%}
{%- if not loop.first %}, {% endif -%}
{{- value -}}
{%- endfor -%}
</dd>
{%- endif -%}
{%- endcomponent metadata_list %}
{% component sign_entry(page, show_readings: bool = true) %}
<li>
<a href="{{ page.permalink }}">
<span class="cuneiform" lang="und-Xsux" aria-hidden="true">{{ page.extra.sign }}</span>
{{ page.title }}
</a>
<div class="entry-list__meta">
MZL {{ page.extra.mzl }}
{% if show_readings and page.taxonomies.lectures %}
· {{<taxonomy_links terms={page.taxonomies.lectures} kind="lectures" />}}
{% endif %}
</div>
</li>
{% endcomponent sign_entry %}
{% component word_entry(page, show_nature: bool = true) %}
<li>
<a href="{{ page.permalink }}"><span lang="akk-Latn">{{ page.title }}</span></a>
{% if page.extra.meaning %} — {{ page.extra.meaning }}{% endif %}
{% if show_nature or page.extra.gender %}
<div class="entry-list__meta">
{% if show_nature %}
{{<taxonomy_links terms={page.taxonomies.natures} kind="natures" />}}
{% endif %}
{% if show_nature and page.extra.gender %} · {% endif %}
{% if page.extra.gender %}{{ page.extra.gender }}{% endif %}
</div>
{% endif %}
</li>
{% endcomponent word_entry %}
{% component document_entry(page, taxonomy_kind: string = "", show_date: bool = false) %}
<li>
<a href="{{ page.permalink }}">{{ page.title }}</a>
{% if show_date or page.description or taxonomy_kind %}
<div class="entry-list__meta">
{% if show_date and page.date %}
<time datetime="{{ page.date }}">{{ page.date | date(format="%d/%m/%Y") }}</time>
{% endif %}
{% if show_date and page.date and page.description %} — {% endif %}
{% if page.description %}{{ page.description }}{% endif %}
{% if taxonomy_kind %}
{% set terms = page.taxonomies | get(key=taxonomy_kind, default=[]) %}
{% if terms %}
{% if (show_date and page.date) or page.description %}<br>{% endif %}
{{<taxonomy_links terms={terms} kind={taxonomy_kind} />}}
{% endif %}
{% endif %}
</div>
{% endif %}
</li>
{% endcomponent document_entry %}
+3 -30
View File
@@ -1,38 +1,11 @@
{% extends "base.html" %} {% extends "base.html" %}
{% import "macros.html" as macros %}
{% block title %}{{ section.title }} · {{ config.title }}{% endblock title %} {% block title %}{{ section.title }} · {{ config.title }}{% endblock title %}
{% block content %} {% block content %}
{% include "partials/section-header.html" %} {% include "partials/section-header.html" %}
{{ section.content | safe }} {{ section.content | safe }}
{{<taxonomy_panel kind="themes" heading_id="grammaire-index-title" title="Explorer la grammaire" description="Retrouver les fiches par notion grammaticale." link_label="Par thème grammatical" />}}
{{ macros::taxonomy_nav(
kind="themes",
heading_id="grammaire-index-title",
title="Explorer la grammaire",
description="Retrouver les fiches par notion grammaticale.",
path="themes",
link_label="Par thème grammatical"
) }}
{% if section.pages %} {% if section.pages %}
<h2>Liste des fiches</h2> <h2>Liste des fiches</h2>
<ul class="entry-list"> <ul class="entry-list">{% for page in section.pages %}{{<document_entry page={page} taxonomy_kind="themes" />}}{% endfor %}</ul>
{% for page in section.pages %} {% else %}<p>Aucune fiche nest encore publiée dans cette section.</p>{% endif %}
<li>
<a href="{{ page.permalink | safe }}">{{ page.title }}</a>
{% if page.description %} — {{ page.description }}{% endif %}
{% if page.taxonomies.themes %}
<div class="entry-list__meta">
{{ macros::taxonomy_links(terms=page.taxonomies.themes, kind="themes") }}
</div>
{% endif %}
</li>
{% endfor %}
</ul>
{% else %}
<p>Aucune fiche nest encore publiée dans cette section.</p>
{% endif %}
{% endblock content %} {% endblock content %}
+31 -106
View File
@@ -7,140 +7,74 @@
{% set textes = get_section(path="textes/_index.md") %} {% set textes = get_section(path="textes/_index.md") %}
{% set articles = get_section(path="articles/_index.md") %} {% set articles = get_section(path="articles/_index.md") %}
{% set recent = signes.pages | concat(with=vocabulaire.pages) %} {% set recent_items = [
{% set recent = recent | concat(with=grammaire.pages) %} ...[{"key": ((item.updated if item.updated else item.date) | date(format="%Y%m%d%H%M%S")) ~ item.permalink, "kind": "Signe", "page": item} for item in signes.pages],
{% set recent = recent | concat(with=textes.pages) %} ...[{"key": ((item.updated if item.updated else item.date) | date(format="%Y%m%d%H%M%S")) ~ item.permalink, "kind": "Vocabulaire", "page": item} for item in vocabulaire.pages],
{% set recent = recent | filter(attribute="date") %} ...[{"key": ((item.updated if item.updated else item.date) | date(format="%Y%m%d%H%M%S")) ~ item.permalink, "kind": "Grammaire", "page": item} for item in grammaire.pages],
...[{"key": ((item.updated if item.updated else item.date) | date(format="%Y%m%d%H%M%S")) ~ item.permalink, "kind": "Texte", "page": item} for item in textes.pages]
{# Les pages proviennent de plusieurs sections. Tera ne peut pas les trier ] | sort(attribute="key") | reverse %}
directement sur « updated, sinon date » ; on trie donc des clés composées
de la date dactivité et du permalien. #}
{% set recent_keys = [] %}
{% for item in recent %}
{% if item.updated %}
{% set activity_date = item.updated | date(format="%Y%m%d%H%M%S") %}
{% else %}
{% set activity_date = item.date | date(format="%Y%m%d%H%M%S") %}
{% endif %}
{% set item_key = activity_date ~ item.permalink %}
{% set_global recent_keys = recent_keys | concat(with=item_key) %}
{% endfor %}
{% set recent_keys = recent_keys | sort | reverse %}
{% include "partials/section-header.html" %} {% include "partials/section-header.html" %}
<section class="home-intro"> <section class="home-intro">
<div class="home-intro__text"> <div class="home-intro__text">{{ section.content | safe }}</div>
{{ section.content | safe }}
</div>
<figure class="home-intro__figure"> <figure class="home-intro__figure">
<img class="home-intro__image" src="{{ get_url(path='images/DP-12499-013.webp') | safe }}" width="640" <img class="home-intro__image" src="{{ get_url(path='images/DP-12499-013.webp') }}" width="640" height="1120"
height="1120" alt="Tablette cunéiforme portant une lettre privée en akkadien paléo-babylonien" alt="Tablette cunéiforme portant une lettre privée en akkadien paléo-babylonien" decoding="async">
decoding="async">
<figcaption class="home-intro__caption"> <figcaption class="home-intro__caption">
Lettre privée paléo-babylonienne, vers 1632 av. J.-C. — Lettre privée paléo-babylonienne, vers 1632 av. J.-C. —
<a href="https://www.metmuseum.org/art/collection/search/321706" target="_blank" rel="noopener noreferrer"> <a href="https://www.metmuseum.org/art/collection/search/321706" target="_blank" rel="noopener noreferrer">The Metropolitan Museum of Art, 86.11.111</a>.
The Metropolitan Museum of Art, 86.11.111
</a>.
</figcaption> </figcaption>
</figure> </figure>
</section> </section>
{% if articles.pages %} {% if articles.pages %}
{% set article = articles.pages | first %} {% set article = articles.pages[0] %}
<section class="home-latest" aria-labelledby="home-latest-title"> <section class="home-latest" aria-labelledby="home-latest-title">
<h2 id="home-latest-title">Dernier article</h2> <h2 id="home-latest-title">Dernier article</h2>
<article class="home-latest__entry"> <article class="home-latest__entry">
<h3> <h3><a href="{{ article.permalink }}">{{ article.title }}</a></h3>
<a href="{{ article.permalink | safe }}">{{ article.title }}</a> <p class="entry-date"><time datetime="{{ article.date }}">{{ article.date | date(format="%d/%m/%Y") }}</time></p>
</h3> {% if article.description %}<p class="home-latest__description">{{ article.description }}</p>{% endif %}
<a class="home-latest__link" href="{{ article.permalink }}">Lire larticle</a>
<p class="entry-date">
<time datetime="{{ article.date }}">{{ article.date | date(format="%d/%m/%Y") }}</time>
</p>
{% if article.description %}
<p class="home-latest__description">{{ article.description }}</p>
{% endif %}
<a class="home-latest__link" href="{{ article.permalink | safe }}">Lire larticle</a>
</article> </article>
</section> </section>
{% endif %} {% endif %}
{% set directory_sections = [
signes,
vocabulaire,
grammaire,
textes,
articles
] %}
<nav class="home-directory" aria-labelledby="home-directory-title"> <nav class="home-directory" aria-labelledby="home-directory-title">
<h2 id="home-directory-title">Explorer les carnets</h2> <h2 id="home-directory-title">Explorer les carnets</h2>
<ul class="home-directory__list"> <ul class="home-directory__list">
{% for directory_section in directory_sections %} {% for directory_section in [signes, vocabulaire, grammaire, textes, articles] %}
<li> <li>
<a href="{{ directory_section.permalink | safe }}"> <a href="{{ directory_section.permalink }}">{{ directory_section.title }}</a>
{{ directory_section.title }} {% if directory_section.description %}<p>{{ directory_section.description }}</p>{% endif %}
</a>
{% if directory_section.description %}
<p>{{ directory_section.description }}</p>
{% endif %}
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>
</nav> </nav>
{% if recent_keys %} {% if recent_items %}
<section aria-labelledby="recent-title"> <section aria-labelledby="recent-title">
<h2 id="recent-title">Fiches récentes</h2> <h2 id="recent-title">Fiches récentes</h2>
<ul class="entry-list"> <ul class="entry-list">
{% for recent_key in recent_keys | slice(end=3) %} {% for recent in recent_items[:3] %}
{% for item in recent %} {% set item = recent.page %}
{% if item.updated %}
{% set activity_date = item.updated | date(format="%Y%m%d%H%M%S") %}
{% else %}
{% set activity_date = item.date | date(format="%Y%m%d%H%M%S") %}
{% endif %}
{% set item_key = activity_date ~ item.permalink %}
{% if item_key == recent_key %}
<li> <li>
<a href="{{ item.permalink | safe }}"> <a href="{{ item.permalink }}">
{% if "/signes/" in item.path %} {% if recent.kind == "Signe" %}
{% set sign = item.extra | get(key="sign", default="") %} <span class="cuneiform" lang="und-Xsux" aria-hidden="true">{{ item.extra.sign }}</span>
{% if sign %}
<span class="cuneiform" lang="und-Xsux" aria-hidden="true">{{ sign }}</span>
{% endif %} {% endif %}
{% endif %} {% if recent.kind == "Vocabulaire" %}<span lang="akk-Latn">{{ item.title }}</span>{% else %}{{ item.title }}{% endif %}
{% if "/vocabulaire/" in item.path %}<span lang="akk-Latn">{{ item.title }}</span>{% else %}{{
item.title }}{% endif %}
</a> </a>
<div class="entry-list__meta"> <div class="entry-list__meta">
{% if "/signes/" in item.path %} {{ recent.kind }} ·
Signe
{% elif "/vocabulaire/" in item.path %}
Vocabulaire
{% elif "/grammaire/" in item.path %}
Grammaire
{% elif "/textes/" in item.path %}
Texte
{% endif %}
{% if item.updated %} {% if item.updated %}
· Mise à jour le <time datetime="{{ item.updated }}">{{ item.updated | date(format="%d/%m/%Y") }}</time> Mise à jour le <time datetime="{{ item.updated }}">{{ item.updated | date(format="%d/%m/%Y") }}</time>
{% else %} {% else %}
· Publication le <time datetime="{{ item.date }}">{{ item.date | date(format="%d/%m/%Y") }}</time> Publication le <time datetime="{{ item.date }}">{{ item.date | date(format="%d/%m/%Y") }}</time>
{% endif %} {% endif %}
</div> </div>
</li> </li>
{% break %}
{% endif %}
{% endfor %}
{% endfor %} {% endfor %}
</ul> </ul>
</section> </section>
@@ -148,17 +82,8 @@
<section class="home-about" aria-labelledby="home-about-title"> <section class="home-about" aria-labelledby="home-about-title">
<h2 id="home-about-title">À propos de ce site</h2> <h2 id="home-about-title">À propos de ce site</h2>
<p> <p>Ce site évolue au rythme de mon apprentissage et ne prétend pas se substituer à une grammaire ou à un dictionnaire spécialisé. Japprends pour linstant le paléo-babylonien : les formes et les analyses présentées ici concernent donc principalement cette période. Les autres périodes ou dialectes seront précisés au fil de mes découvertes. Les principaux ouvrages sur lesquels je mappuie sont présentés dans la bibliographie.</p>
Ce site évolue au rythme de mon apprentissage et ne prétend pas se substituer à une grammaire ou à un <p>Les fiches peuvent être consultées à l’écran, imprimées ou enregistrées au format PDF.</p>
dictionnaire spécialisé. Japprends pour linstant le paléo-babylonien : les formes et les analyses présentées <p>Suggestions, remarques et corrections sont les bienvenues ; un lien de contact est disponible ci-dessous.</p>
ici concernent donc principalement cette période. Les autres périodes ou dialectes seront précisés au fil de mes
découvertes. Les principaux ouvrages sur lesquels je mappuie sont présentés dans la bibliographie.
</p>
<p>
Les fiches peuvent être consultées à l’écran, imprimées ou enregistrées au format PDF.
</p>
<p>
Suggestions, remarques et corrections sont les bienvenues ; un lien de contact est disponible ci-dessous.
</p>
</section> </section>
{% endblock content %} {% endblock content %}
-43
View File
@@ -1,43 +0,0 @@
{% macro taxonomy_links(terms, kind) -%}
{%- for term in terms -%}
{%- if not loop.first %}, {% endif -%}
<a href="{{ get_taxonomy_url(kind=kind, name=term) | safe }}">{{ term }}</a>
{%- endfor -%}
{%- endmacro taxonomy_links %}
{% macro taxonomy_nav(kind, heading_id, title, description, path, link_label) %}
{% set taxonomy = get_taxonomy(kind=kind, required=false) %}
{% if taxonomy and taxonomy.items %}
<nav class="section-tools" aria-labelledby="{{ heading_id }}">
<div>
<h2 id="{{ heading_id }}">{{ title }}</h2>
<p>{{ description }}</p>
</div>
<a class="section-tools__link" href="{{ get_url(path=path, trailing_slash=true) | safe }}">
{{ link_label }}
</a>
</nav>
{% endif %}
{% endmacro taxonomy_nav %}
{% macro metadata_field(extra, key, label, lang="") -%}
{%- set value = extra | get(key=key, default="") -%}
{%- if value -%}
<dt>{{ label }}</dt>
<dd{% if lang %} lang="{{ lang }}"{% endif %}>{{ value }}</dd>
{%- endif -%}
{%- endmacro metadata_field %}
{% macro metadata_list(extra, key, label, lang="") -%}
{%- set values = extra | get(key=key, default="") -%}
{%- if values -%}
<dt>{{ label }}</dt>
<dd{% if lang %} lang="{{ lang }}"{% endif %}>
{%- for value in values -%}
{%- if not loop.first %}, {% endif -%}
{{- value -}}
{%- endfor -%}
</dd>
{%- endif -%}
{%- endmacro metadata_list %}
+35 -46
View File
@@ -1,66 +1,55 @@
{% extends "base.html" %} {% extends "base.html" %}
{% import "macros.html" as macros %}
{% block title %}{{ page.title }} · {{ config.title }}{% endblock title %} {% block title %}{{ page.title }} · {{ config.title }}{% endblock title %}
{% block description -%}
{%- if page.description -%}
{{- page.description -}}
{%- else -%}
{% if page.taxonomies.natures %}{{ page.taxonomies.natures[0] | capitalize }}{% else %}Mot{% endif %}{% if page.extra.gender %} {{ page.extra.gender }}{% endif %}{% if page.extra.meaning %} signifiant « {{ page.extra.meaning }} »{% endif %}.
{%- endif -%}
{%- endblock description %}
{% block content %} {% block content %}
{% include "partials/back-to-section.html" %} {% include "partials/back-to-section.html" %}
<article> <article>
<header class="entry-header"> <header class="entry-header">
<h1 lang="akk-Latn">{{ page.title }}</h1> <h1 lang="akk-Latn">{{ page.title }}</h1>
{% if page.description %} {% if page.description %}
<p class="entry-description">{{ page.description }}</p> <p class="entry-description">{{ page.description }}</p>
{% else %} {% else %}
<p class="entry-description"> <p class="entry-description">
{% if page.taxonomies.natures %} {% if page.taxonomies.natures %}{{ page.taxonomies.natures[0] | capitalize }}{% else %}Mot{% endif %}{% if page.extra.gender %} {{ page.extra.gender }}{% endif %}{% if page.extra.meaning %} signifiant « {{ page.extra.meaning }} »{% endif %}.
{% for nature in page.taxonomies.natures %}
{% if loop.first %}{{ nature | capitalize }}{% endif %}
{% endfor %}
{% else %}
Mot
{% endif %}
{% if page.extra.gender %} {{ page.extra.gender }}{% endif %}{% if page.extra.meaning %} signifiant « {{ page.extra.meaning }} »{% endif %}.
</p> </p>
{% endif %} {% endif %}
{% include "partials/entry-dates.html" %} {% include "partials/entry-dates.html" %}
<dl class="metadata"> <dl class="metadata">
<dt>Nature grammaticale</dt> <dt>Nature grammaticale</dt><dd>{{<taxonomy_links terms={page.taxonomies.natures} kind="natures" />}}</dd>
<dd>{{ macros::taxonomy_links(terms=page.taxonomies.natures, kind="natures") }}</dd> {{<metadata_field extra={page.extra} key="meaning" label="Sens" />}}
{{<metadata_list extra={page.extra} key="logograms" label="Logogrammes" lang="sux-Latn" />}}
{# Tera 1 naccepte pas les tableaux imbriqués dans un littéral set. {{<metadata_field extra={page.extra} key="gender" label="Genre" />}}
Les champs sont donc déclarés explicitement et leur balisage est factorisé par macro. #} {{<metadata_field extra={page.extra} key="pronoun_type" label="Type de pronom" />}}
{{ macros::metadata_field(extra=page.extra, key="meaning", label="Sens") }} {{<metadata_field extra={page.extra} key="person" label="Personne" />}}
{{ macros::metadata_list(extra=page.extra, key="logograms", label="Logogrammes", lang="sux-Latn") }} {{<metadata_field extra={page.extra} key="number" label="Nombre" />}}
{{ macros::metadata_field(extra=page.extra, key="gender", label="Genre") }} {{<metadata_field extra={page.extra} key="numeral_type" label="Type de numéral" />}}
{{ macros::metadata_field(extra=page.extra, key="pronoun_type", label="Type de pronom") }} {{<metadata_field extra={page.extra} key="value" label="Valeur" />}}
{{ macros::metadata_field(extra=page.extra, key="person", label="Personne") }} {{<metadata_field extra={page.extra} key="governs" label="Cas régi" />}}
{{ macros::metadata_field(extra=page.extra, key="number", label="Nombre") }} {{<metadata_field extra={page.extra} key="function" label="Fonction" />}}
{{ macros::metadata_field(extra=page.extra, key="numeral_type", label="Type de numéral") }} {{<metadata_field extra={page.extra} key="bound" label="Forme liée" lang="akk-Latn" />}}
{{ macros::metadata_field(extra=page.extra, key="value", label="Valeur") }} {{<metadata_field extra={page.extra} key="plural" label="Pluriel" lang="akk-Latn" />}}
{{ macros::metadata_field(extra=page.extra, key="governs", label="Cas régi") }} {{<metadata_field extra={page.extra} key="feminine" label="Féminin" lang="akk-Latn" />}}
{{ macros::metadata_field(extra=page.extra, key="function", label="Fonction") }} {{<metadata_field extra={page.extra} key="masculine_plural" label="Pluriel masculin" lang="akk-Latn" />}}
{{ macros::metadata_field(extra=page.extra, key="bound", label="Forme liée", lang="akk-Latn") }} {{<metadata_field extra={page.extra} key="feminine_plural" label="Pluriel féminin" lang="akk-Latn" />}}
{{ macros::metadata_field(extra=page.extra, key="plural", label="Pluriel", lang="akk-Latn") }} {{<metadata_field extra={page.extra} key="predicative" label="Prédicatif (3 m. s.)" lang="akk-Latn" />}}
{{ macros::metadata_field(extra=page.extra, key="feminine", label="Féminin", lang="akk-Latn") }} {{<metadata_field extra={page.extra} key="root" label="Racine" lang="akk-Latn" />}}
{{ macros::metadata_field(extra=page.extra, key="masculine_plural", label="Pluriel masculin", lang="akk-Latn") }} {{<metadata_field extra={page.extra} key="stem" label="Thème" />}}
{{ macros::metadata_field(extra=page.extra, key="feminine_plural", label="Pluriel féminin", lang="akk-Latn") }} {{<metadata_field extra={page.extra} key="verb_class" label="Classe verbale" />}}
{{ macros::metadata_field(extra=page.extra, key="predicative", label="Prédicatif (3 m. s.)", lang="akk-Latn") }} {{<metadata_field extra={page.extra} key="vowel_class" label="Classe vocalique" />}}
{{ macros::metadata_field(extra=page.extra, key="root", label="Racine", lang="akk-Latn") }} {{<metadata_field extra={page.extra} key="preterite" label="Prétérit" lang="akk-Latn" />}}
{{ macros::metadata_field(extra=page.extra, key="stem", label="Thème") }} {{<metadata_field extra={page.extra} key="durative" label="Duratif" lang="akk-Latn" />}}
{{ macros::metadata_field(extra=page.extra, key="verb_class", label="Classe verbale") }} {{<metadata_field extra={page.extra} key="perfect" label="Parfait" lang="akk-Latn" />}}
{{ macros::metadata_field(extra=page.extra, key="vowel_class", label="Classe vocalique") }} {{<metadata_field extra={page.extra} key="imperative" label="Impératif" lang="akk-Latn" />}}
{{ macros::metadata_field(extra=page.extra, key="preterite", label="Prétérit", lang="akk-Latn") }} {{<metadata_field extra={page.extra} key="participle" label="Participe" lang="akk-Latn" />}}
{{ macros::metadata_field(extra=page.extra, key="durative", label="Duratif", lang="akk-Latn") }} {{<metadata_field extra={page.extra} key="verbal_adjective" label="Adjectif verbal" lang="akk-Latn" />}}
{{ macros::metadata_field(extra=page.extra, key="perfect", label="Parfait", lang="akk-Latn") }}
{{ macros::metadata_field(extra=page.extra, key="imperative", label="Impératif", lang="akk-Latn") }}
{{ macros::metadata_field(extra=page.extra, key="participle", label="Participe", lang="akk-Latn") }}
{{ macros::metadata_field(extra=page.extra, key="verbal_adjective", label="Adjectif verbal", lang="akk-Latn") }}
</dl> </dl>
</header> </header>
{{ page.content | safe }} {{ page.content | safe }}
</article> </article>
{% endblock content %} {% endblock content %}
+7 -30
View File
@@ -1,47 +1,24 @@
{% extends "base.html" %} {% extends "base.html" %}
{% import "macros.html" as macros %}
{% block title %}{{ page.title }} · {{ config.title }}{% endblock title %} {% block title %}{{ page.title }} · {{ config.title }}{% endblock title %}
{% block content %} {% block content %}
{% include "partials/back-to-section.html" %} {% include "partials/back-to-section.html" %}
<article> <article>
<header class="entry-header"> <header class="entry-header">
<h1>{{ page.title }}</h1> <h1>{{ page.title }}</h1>
{% if page.description %}<p class="entry-description">{{ page.description }}</p>{% endif %}
{% if page.description %}
<p class="entry-description">{{ page.description }}</p>
{% endif %}
{% include "partials/entry-dates.html" %} {% include "partials/entry-dates.html" %}
{% if page.taxonomies.themes %}<dl class="metadata"><dt>Thème</dt><dd>{{<taxonomy_links terms={page.taxonomies.themes} kind="themes" />}}</dd></dl>{% endif %}
{% if page.taxonomies.themes %}
<dl class="metadata">
<dt>Thème</dt>
<dd>
{{ macros::taxonomy_links(terms=page.taxonomies.themes, kind="themes") }}
</dd>
</dl>
{% endif %}
</header> </header>
{% set banner = page.extra | get(key="banner", default="") %} {% set banner = page.extra | get(key="banner", default="") %}
{% if banner %} {% if banner %}
{% set banner_alt = page.extra | get(key="banner_alt", default="") %} {% set banner_meta = get_image_metadata(path=banner) %}
{% set banner_credit = page.extra | get(key="banner_credit", default="") %}
<figure class="article-cover"> <figure class="article-cover">
<img <img src="{{ get_url(path=banner) }}" width="{{ banner_meta.width }}" height="{{ banner_meta.height }}"
src="{{ get_url(path=banner) | safe }}" alt="{{ page.extra | get(key='banner_alt', default='') }}">
alt="{{ banner_alt }}" {% set credit = page.extra | get(key="banner_credit", default="") %}
> {% if credit %}<figcaption>{{ credit }}</figcaption>{% endif %}
{% if banner_credit %}
<figcaption>{{ banner_credit }}</figcaption>
{% endif %}
</figure> </figure>
{% endif %} {% endif %}
{{ page.content | safe }} {{ page.content | safe }}
</article> </article>
{% endblock content %} {% endblock content %}
+3 -11
View File
@@ -1,13 +1,5 @@
{% if page.ancestors %} {% if page.ancestors %}
{% set parent_path = page.ancestors | last %} {% set parent = get_section(path=page.ancestors[-1], metadata_only=true) %}
{% set parent = get_section(path=parent_path, metadata_only=true) %} {% set label = parent.extra | get(key="back_label", default="") %}
{% set back_label = parent.extra | get(key="back_label", default="") %} {% if label %}<p class="context-link"><a href="{{ parent.permalink }}">← {{ label }}</a></p>{% endif %}
{% if back_label %}
<p class="context-link">
<a href="{{ parent.permalink | safe }}">
← {{ back_label }}
</a>
</p>
{% endif %}
{% endif %} {% endif %}
+2 -9
View File
@@ -1,13 +1,6 @@
{% if page.date or page.updated %} {% if page.date or page.updated %}
<p class="entry-date"> <p class="entry-date">
{% if page.date %} {% if page.date %}Mis en ligne le <time datetime="{{ page.date }}">{{ page.date | date(format="%d/%m/%Y") }}</time>{% endif %}
Mis en ligne le {% if page.updated %}{% if page.date %} · {% endif %}Mis à jour le <time datetime="{{ page.updated }}">{{ page.updated | date(format="%d/%m/%Y") }}</time>{% endif %}
<time datetime="{{ page.date }}">{{ page.date | date(format="%d/%m/%Y") }}</time>
{% endif %}
{% if page.updated %}
{% if page.date %} · {% endif %}
Mis à jour le
<time datetime="{{ page.updated }}">{{ page.updated | date(format="%d/%m/%Y") }}</time>
{% endif %}
</p> </p>
{% endif %} {% endif %}
+1 -3
View File
@@ -1,6 +1,4 @@
<header class="entry-header"> <header class="entry-header">
<h1>{{ section.title }}</h1> <h1>{{ section.title }}</h1>
{% if section.description %} {% if section.description %}<p class="section-description">{{ section.description }}</p>{% endif %}
<p class="section-description">{{ section.description }}</p>
{% endif %}
</header> </header>
+11 -22
View File
@@ -1,39 +1,28 @@
{% extends "base.html" %} {% extends "base.html" %}
{% import "macros.html" as macros %}
{% block title %}{{ page.title }} · {{ config.title }}{% endblock title %} {% block title %}{{ page.title }} · {{ config.title }}{% endblock title %}
{% block description -%}
{%- if page.description -%}
{{- page.description -}}
{%- else -%}
Signe cunéiforme {{ page.title }}{% if page.extra.mzl %} — MZL {{ page.extra.mzl }}{% endif %}.
{%- endif -%}
{%- endblock description %}
{% block content %} {% block content %}
{% include "partials/back-to-section.html" %} {% include "partials/back-to-section.html" %}
<article> <article>
<header class="entry-header"> <header class="entry-header">
<h1><span class="cuneiform" lang="und-Xsux" aria-hidden="true">{{ page.extra.sign }}</span> {{ page.title }} <h1><span class="cuneiform" lang="und-Xsux" aria-hidden="true">{{ page.extra.sign }}</span> {{ page.title }}</h1>
</h1>
{% if page.description %} {% if page.description %}
<p class="entry-description">{{ page.description }}</p> <p class="entry-description">{{ page.description }}</p>
{% else %} {% else %}
<p class="entry-description"> <p class="entry-description">Signe cunéiforme {{ page.title }}{% if page.extra.mzl %} — MZL {{ page.extra.mzl }}{% endif %}.</p>
Signe cunéiforme {{ page.title }}{% if page.extra.mzl %} — MZL {{ page.extra.mzl }}{% endif %}.
</p>
{% endif %} {% endif %}
{% include "partials/entry-dates.html" %} {% include "partials/entry-dates.html" %}
<dl class="metadata"> <dl class="metadata">
<dt>MZL</dt> <dt>MZL</dt><dd>{{ page.extra.mzl }}</dd>
<dd>{{ page.extra.mzl }}</dd> {% if page.taxonomies.lectures %}<dt>Lectures</dt><dd>{{<taxonomy_links terms={page.taxonomies.lectures} kind="lectures" />}}</dd>{% endif %}
{% if page.taxonomies.lectures %}
<dt>Lectures</dt>
<dd>
{{ macros::taxonomy_links(terms=page.taxonomies.lectures, kind="lectures") }}
</dd>
{% endif %}
</dl> </dl>
</header> </header>
{{ page.content | safe }} {{ page.content | safe }}
</article> </article>
{% endblock content %} {% endblock content %}
+2 -30
View File
@@ -1,39 +1,11 @@
{% extends "base.html" %} {% extends "base.html" %}
{% import "macros.html" as macros %}
{% block title %}{{ section.title }} · {{ config.title }}{% endblock title %} {% block title %}{{ section.title }} · {{ config.title }}{% endblock title %}
{% block content %} {% block content %}
{% include "partials/section-header.html" %} {% include "partials/section-header.html" %}
{{ section.content | safe }} {{ section.content | safe }}
{{<taxonomy_panel kind="lectures" heading_id="signes-index-title" title="Explorer les signes" description="Retrouver les signes par lecture." link_label="Index des lectures" />}}
{{ macros::taxonomy_nav(
kind="lectures",
heading_id="signes-index-title",
title="Explorer les signes",
description="Retrouver les signes par lecture.",
path="lectures",
link_label="Index des lectures"
) }}
{% if section.pages %} {% if section.pages %}
<h2>Liste des signes</h2> <h2>Liste des signes</h2>
<ul class="entry-list"> <ul class="entry-list">{% for page in section.pages %}{{<sign_entry page={page} />}}{% endfor %}</ul>
{% for page in section.pages %}
<li>
<a href="{{ page.permalink | safe }}">
<span class="cuneiform" lang="und-Xsux" aria-hidden="true">{{ page.extra.sign }}</span> {{ page.title }}
</a>
<div class="entry-list__meta">
MZL {{ page.extra.mzl }}
{% if page.taxonomies.lectures %}
·
{{ macros::taxonomy_links(terms=page.taxonomies.lectures, kind="lectures") }}
{% endif %}
</div>
</li>
{% endfor %}
</ul>
{% endif %} {% endif %}
{% endblock content %} {% endblock content %}
+18
View File
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
{% set empty_taxonomy_urls = [
get_url(path=taxonomy.name, trailing_slash=true)
for taxonomy in config.taxonomies
if not (get_taxonomy(kind=taxonomy.name, required=false) | get(key="items", default=[]))
] %}
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{%- for entry in entries %}
{%- if entry.permalink not in empty_taxonomy_urls %}
<url>
<loc>{{ entry.permalink | escape_xml | safe }}</loc>
{%- if entry.updated %}
<lastmod>{{ entry.updated }}</lastmod>
{%- endif %}
</url>
{%- endif %}
{%- endfor %}
</urlset>
+7 -45
View File
@@ -1,59 +1,21 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block title %}{% if taxonomy.name == "natures" %}Vocabulaire par nature grammaticale{% elif taxonomy.name == "lectures" %}Index des lectures des signes{% elif taxonomy.name == "genres" %}Textes par type{% elif taxonomy.name == "themes" %}Grammaire par thème{% else %}{{ taxonomy.name | capitalize }}{% endif %} · {{ config.title }}{% endblock title %} {% block title %}{% if taxonomy.name == "natures" %}Vocabulaire par nature grammaticale{% elif taxonomy.name == "lectures" %}Index des lectures des signes{% elif taxonomy.name == "genres" %}Textes par type{% elif taxonomy.name == "themes" %}Grammaire par thème{% else %}{{ taxonomy.name | capitalize }}{% endif %} · {{ config.title }}{% endblock title %}
{% block content %} {% block content %}
{% set heading = taxonomy.name | capitalize %} {% set heading = taxonomy.name | capitalize %}
{% set description = "Index des entrées de cette taxonomie." %} {% set description = "Index des entrées de cette taxonomie." %}
{% set back_url = get_url(path='@/_index.md') %} {% set back_url = get_url(path='@/_index.md') %}
{% set back_label = "Retour à laccueil" %} {% set back_label = "Retour à laccueil" %}
{% set item_label = "entrée" %} {% set item_label = "entrée" %}
{% if taxonomy.name == "natures" %} {% if taxonomy.name == "natures" %}
{% set heading = "Vocabulaire par nature grammaticale" %} {% set heading = "Vocabulaire par nature grammaticale" %}{% set description = "Index des fiches lexicales regroupées selon leur nature grammaticale." %}{% set back_url = get_url(path='@/vocabulaire/_index.md') %}{% set back_label = "Retour au vocabulaire" %}{% set item_label = "mot" %}
{% set description = "Index des fiches lexicales regroupées selon leur nature grammaticale." %}
{% set back_url = get_url(path='@/vocabulaire/_index.md') %}
{% set back_label = "Retour au vocabulaire" %}
{% set item_label = "mot" %}
{% elif taxonomy.name == "lectures" %} {% elif taxonomy.name == "lectures" %}
{% set heading = "Index des lectures des signes" %} {% set heading = "Index des lectures des signes" %}{% set description = "Index permettant de retrouver les signes cunéiformes à partir dune lecture." %}{% set back_url = get_url(path='@/signes/_index.md') %}{% set back_label = "Retour aux signes cunéiformes" %}{% set item_label = "signe" %}
{% set description = "Index permettant de retrouver les signes cunéiformes à partir dune lecture." %}
{% set back_url = get_url(path='@/signes/_index.md') %}
{% set back_label = "Retour aux signes cunéiformes" %}
{% set item_label = "signe" %}
{% elif taxonomy.name == "genres" %} {% elif taxonomy.name == "genres" %}
{% set heading = "Types de textes" %} {% set heading = "Types de textes" %}{% set description = "Index des textes étudiés regroupés selon leur type documentaire." %}{% set back_url = get_url(path='@/textes/_index.md') %}{% set back_label = "Retour aux textes" %}{% set item_label = "texte" %}
{% set description = "Index des textes étudiés regroupés selon leur type documentaire." %}
{% set back_url = get_url(path='@/textes/_index.md') %}
{% set back_label = "Retour aux textes" %}
{% set item_label = "texte" %}
{% elif taxonomy.name == "themes" %} {% elif taxonomy.name == "themes" %}
{% set heading = "Thèmes grammaticaux" %} {% set heading = "Thèmes grammaticaux" %}{% set description = "Index des fiches de grammaire regroupées selon la notion étudiée." %}{% set back_url = get_url(path='@/grammaire/_index.md') %}{% set back_label = "Retour à la grammaire" %}{% set item_label = "fiche" %}
{% set description = "Index des fiches de grammaire regroupées selon la notion étudiée." %}
{% set back_url = get_url(path='@/grammaire/_index.md') %}
{% set back_label = "Retour à la grammaire" %}
{% set item_label = "fiche" %}
{% endif %}
<p class="context-link">
<a href="{{ back_url | safe }}">← {{ back_label }}</a>
</p>
<header class="entry-header">
<h1>{{ heading }}</h1>
<p class="section-description">{{ description }}</p>
</header>
{% if terms %}
<ul class="entry-list">
{% for term in terms %}
<li>
<a href="{{ term.permalink | safe }}">{{ term.name }}</a>
<span class="entry-list__meta">
— {{ term.page_count }} {{ item_label }}{% if term.page_count > 1 %}s{% endif %}
</span>
</li>
{% endfor %}
</ul>
{% endif %} {% endif %}
<p class="context-link"><a href="{{ back_url }}">← {{ back_label }}</a></p>
<header class="entry-header"><h1>{{ heading }}</h1><p class="section-description">{{ description }}</p></header>
{% if terms %}<ul class="entry-list">{% for term in terms %}{% set term_label = term.name | replace(from="-", to=" ") if taxonomy.name != "lectures" else term.name %}<li><a href="{{ term.permalink }}">{{ term_label }}</a><span class="entry-list__meta"> — {{ term.page_count }} {{ item_label }}{% if term.page_count > 1 %}s{% endif %}</span></li>{% endfor %}</ul>{% endif %}
{% endblock content %} {% endblock content %}
+15 -63
View File
@@ -1,75 +1,27 @@
{% extends "base.html" %} {% extends "base.html" %}
{% set term_label = term.name | replace(from="-", to=" ") if taxonomy.name != "lectures" else term.name %}
{% block title %}{% if taxonomy.name == "natures" %}Mots : {{ term.name }}{% elif taxonomy.name == "lectures" %}Lecture « {{ term.name }} »{% elif taxonomy.name == "genres" %}Textes : {{ term.name }}{% elif taxonomy.name == "themes" %}Grammaire : {{ term.name }}{% else %}{{ term.name }}{% endif %} · {{ config.title }}{% endblock title %} {% block title %}{% if taxonomy.name == "natures" %}Mots : {{ term_label }}{% elif taxonomy.name == "lectures" %}Lecture « {{ term_label }} »{% elif taxonomy.name == "genres" %}Textes : {{ term_label }}{% elif taxonomy.name == "themes" %}Grammaire : {{ term_label }}{% else %}{{ term_label }}{% endif %} · {{ config.title }}{% endblock title %}
{% block content %} {% block content %}
{% set heading = term.name %} {% set heading = term_label %}{% set description = "Entrées classées dans cet index." %}{% set back_url = get_url(path=taxonomy.name, trailing_slash=true) %}{% set back_label = "Retour à lindex" %}
{% set description = "Entrées classées dans cet index." %}
{% set back_url = get_url(path=taxonomy.name, trailing_slash=true) %}
{% set back_label = "Retour à lindex" %}
{% if taxonomy.name == "natures" %} {% if taxonomy.name == "natures" %}
{% set heading = "Mots : " ~ term.name %} {% set heading = "Mots : " ~ term_label %}{% set description = "Fiches de vocabulaire classées comme « " ~ term_label ~ " »." %}{% set back_label = "Toutes les natures grammaticales" %}
{% set description = "Fiches de vocabulaire classées comme « " ~ term.name ~ " »." %}
{% set back_url = get_url(path='natures', trailing_slash=true) %}
{% set back_label = "Toutes les natures grammaticales" %}
{% elif taxonomy.name == "lectures" %} {% elif taxonomy.name == "lectures" %}
{% set heading = "Lecture « " ~ term.name ~ " »" %} {% set heading = "Lecture « " ~ term_label ~ " »" %}{% set description = "Signes cunéiformes pouvant recevoir la lecture « " ~ term_label ~ " »." %}{% set back_label = "Toutes les lectures" %}
{% set description = "Signes cunéiformes pouvant recevoir la lecture « " ~ term.name ~ " »." %}
{% set back_url = get_url(path='lectures', trailing_slash=true) %}
{% set back_label = "Toutes les lectures" %}
{% elif taxonomy.name == "genres" %} {% elif taxonomy.name == "genres" %}
{% set heading = "Textes : " ~ term.name %} {% set heading = "Textes : " ~ term_label %}{% set description = "Textes classés dans le type « " ~ term_label ~ " »." %}{% set back_label = "Tous les types de textes" %}
{% set description = "Textes classés dans le type « " ~ term.name ~ " »." %}
{% set back_url = get_url(path='genres', trailing_slash=true) %}
{% set back_label = "Tous les types de textes" %}
{% elif taxonomy.name == "themes" %} {% elif taxonomy.name == "themes" %}
{% set heading = "Thème : " ~ term.name %} {% set heading = "Thème : " ~ term_label %}{% set description = "Fiches de grammaire classées dans le thème « " ~ term_label ~ " »." %}{% set back_label = "Tous les thèmes grammaticaux" %}
{% set description = "Fiches de grammaire classées dans le thème « " ~ term.name ~ " »." %}
{% set back_url = get_url(path='themes', trailing_slash=true) %}
{% set back_label = "Tous les thèmes grammaticaux" %}
{% endif %} {% endif %}
<p class="context-link"><a href="{{ back_url }}">← {{ back_label }}</a></p>
<p class="context-link"> <header class="entry-header"><h1>{{ heading }}</h1><p class="section-description">{{ description }}</p></header>
<a href="{{ back_url | safe }}">← {{ back_label }}</a>
</p>
<header class="entry-header">
<h1>{{ heading }}</h1>
<p class="section-description">{{ description }}</p>
</header>
{% if term.pages %} {% if term.pages %}
{% if taxonomy.name == "lectures" %} {% set pages = term.pages | sort(attribute="slug") if taxonomy.name == "lectures" else term.pages | sort(attribute="title") %}
{% set taxonomy_pages = term.pages | sort(attribute="slug") %}
{% else %}
{% set taxonomy_pages = term.pages | sort(attribute="title") %}
{% endif %}
<ul class="entry-list"> <ul class="entry-list">
{% for page in taxonomy_pages %} {% for page in pages %}
<li> {% if taxonomy.name == "lectures" %}{{<sign_entry page={page} show_readings={false} />}}
{% if taxonomy.name == "lectures" %} {% elif taxonomy.name == "natures" %}{{<word_entry page={page} show_nature={false} />}}
<a href="{{ page.permalink | safe }}"> {% else %}{{<document_entry page={page} />}}{% endif %}
<span class="cuneiform" lang="und-Xsux" aria-hidden="true">{{ page.extra.sign }}</span> {{ page.title }}
</a>
<div class="entry-list__meta">MZL {{ page.extra.mzl }}</div>
{% elif taxonomy.name == "natures" %}
<a href="{{ page.permalink | safe }}"><span lang="akk-Latn">{{ page.title }}</span></a>
{% if page.extra.meaning %} — {{ page.extra.meaning }}{% endif %}
{% if page.extra.gender %}
<div class="entry-list__meta">{{ page.extra.gender }}</div>
{% endif %}
{% else %}
<a href="{{ page.permalink | safe }}">{{ page.title }}</a>
{% if page.description %}
<div class="entry-list__meta">{{ page.description }}</div>
{% endif %}
{% endif %}
</li>
{% endfor %} {% endfor %}
</ul> </ul>
{% else %} {% else %}<p>Aucune fiche nest encore associée à cette entrée.</p>{% endif %}
<p>Aucune fiche nest encore associée à cette entrée.</p>
{% endif %}
{% endblock content %} {% endblock content %}
+2 -18
View File
@@ -1,30 +1,14 @@
{% extends "base.html" %} {% extends "base.html" %}
{% import "macros.html" as macros %}
{% block title %}{{ page.title }} · {{ config.title }}{% endblock title %} {% block title %}{{ page.title }} · {{ config.title }}{% endblock title %}
{% block content %} {% block content %}
{% include "partials/back-to-section.html" %} {% include "partials/back-to-section.html" %}
<article> <article>
<header class="entry-header"> <header class="entry-header">
<h1>{{ page.title }}</h1> <h1>{{ page.title }}</h1>
{% if page.description %}<p class="entry-description">{{ page.description }}</p>{% endif %}
{% if page.description %}
<p class="entry-description">{{ page.description }}</p>
{% endif %}
{% include "partials/entry-dates.html" %} {% include "partials/entry-dates.html" %}
{% if page.taxonomies.genres %}<dl class="metadata"><dt>Type de texte</dt><dd>{{<taxonomy_links terms={page.taxonomies.genres} kind="genres" />}}</dd></dl>{% endif %}
{% if page.taxonomies.genres %}
<dl class="metadata">
<dt>Type de texte</dt>
<dd>
{{ macros::taxonomy_links(terms=page.taxonomies.genres, kind="genres") }}
</dd>
</dl>
{% endif %}
</header> </header>
{{ page.content | safe }} {{ page.content | safe }}
</article> </article>
{% endblock content %} {% endblock content %}
+3 -30
View File
@@ -1,38 +1,11 @@
{% extends "base.html" %} {% extends "base.html" %}
{% import "macros.html" as macros %}
{% block title %}{{ section.title }} · {{ config.title }}{% endblock title %} {% block title %}{{ section.title }} · {{ config.title }}{% endblock title %}
{% block content %} {% block content %}
{% include "partials/section-header.html" %} {% include "partials/section-header.html" %}
{{ section.content | safe }} {{ section.content | safe }}
{{<taxonomy_panel kind="genres" heading_id="textes-index-title" title="Explorer les textes" description="Retrouver les textes par type documentaire." link_label="Par type de texte" />}}
{{ macros::taxonomy_nav(
kind="genres",
heading_id="textes-index-title",
title="Explorer les textes",
description="Retrouver les textes par type documentaire.",
path="genres",
link_label="Par type de texte"
) }}
{% if section.pages %} {% if section.pages %}
<h2>Liste des textes</h2> <h2>Liste des textes</h2>
<ul class="entry-list"> <ul class="entry-list">{% for page in section.pages %}{{<document_entry page={page} taxonomy_kind="genres" />}}{% endfor %}</ul>
{% for page in section.pages %} {% else %}<p>Aucun texte nest encore publié dans cette section.</p>{% endif %}
<li>
<a href="{{ page.permalink | safe }}">{{ page.title }}</a>
{% if page.description %} — {{ page.description }}{% endif %}
{% if page.taxonomies.genres %}
<div class="entry-list__meta">
{{ macros::taxonomy_links(terms=page.taxonomies.genres, kind="genres") }}
</div>
{% endif %}
</li>
{% endfor %}
</ul>
{% else %}
<p>Aucun texte nest encore publié dans cette section.</p>
{% endif %}
{% endblock content %} {% endblock content %}
+2 -26
View File
@@ -1,35 +1,11 @@
{% extends "base.html" %} {% extends "base.html" %}
{% import "macros.html" as macros %}
{% block title %}{{ section.title }} · {{ config.title }}{% endblock title %} {% block title %}{{ section.title }} · {{ config.title }}{% endblock title %}
{% block content %} {% block content %}
{% include "partials/section-header.html" %} {% include "partials/section-header.html" %}
{{ section.content | safe }} {{ section.content | safe }}
{{<taxonomy_panel kind="natures" heading_id="vocabulaire-index-title" title="Explorer le vocabulaire" description="Retrouver les mots par nature grammaticale." link_label="Par nature grammaticale" />}}
{{ macros::taxonomy_nav(
kind="natures",
heading_id="vocabulaire-index-title",
title="Explorer le vocabulaire",
description="Retrouver les mots par nature grammaticale.",
path="natures",
link_label="Par nature grammaticale"
) }}
{% if section.pages %} {% if section.pages %}
<h2>Liste des mots</h2> <h2>Liste des mots</h2>
<ul class="entry-list"> <ul class="entry-list">{% for page in section.pages %}{{<word_entry page={page} />}}{% endfor %}</ul>
{% for page in section.pages %}
<li>
<a href="{{ page.permalink | safe }}"><span lang="akk-Latn">{{ page.title }}</span></a>
{% if page.extra.meaning %} — {{ page.extra.meaning }}{% endif %}
<div class="entry-list__meta">
{{ macros::taxonomy_links(terms=page.taxonomies.natures, kind="natures") }}
{% if page.extra.gender %} · {{ page.extra.gender }}{% endif %}
</div>
</li>
{% endfor %}
</ul>
{% endif %} {% endif %}
{% endblock content %} {% endblock content %}
+5 -5
View File
@@ -2,12 +2,13 @@ base_url = "https://lescarnetsdakkadien.netig.net"
title = "Les Carnets dAkkadien" title = "Les Carnets dAkkadien"
description = "Un site consacré à lapprentissage de la langue akkadienne et de l’écriture cunéiforme." description = "Un site consacré à lapprentissage de la langue akkadienne et de l’écriture cunéiforme."
default_language = "fr" default_language = "fr"
author = "Les Carnets dAkkadien"
compile_sass = true compile_sass = true
build_search_index = false build_search_index = false
generate_feeds = true generate_feeds = true
feed_filenames = ["atom.xml", "rss.xml"] feed_filenames = ["atom.xml"]
taxonomies = [ taxonomies = [
{ name = "natures" }, { name = "natures" },
@@ -19,14 +20,13 @@ taxonomies = [
[markdown] [markdown]
[markdown.highlighting] [markdown.highlighting]
style = "class"
theme = "github-light" theme = "github-light"
[slugify] [slugify]
# Conserver les diacritiques dans les termes de taxonomie afin de # Les diacritiques distinguent notamment des lectures comme « tim » et « ṭim ».
# distinguer des lectures comme « tim » et « ṭim ».
taxonomies = "safe"
paths = "safe" paths = "safe"
taxonomies = "safe"
[extra] [extra]
author = "Les Carnets dAkkadien"
email = "julien.deb@netig.net" email = "julien.deb@netig.net"