commit 8afbee4a4cdc2a95a0128a6babfa5391724509d2
parent 97362ab5294e6a158f175a6cf382c4a59136920f
Auteur: Selve <selve@asteride.xyz>
Date: Thu, 26 Oct 2023 15:31:03 -0400
[gen] changements structurels dans génération
La modification la plus importante est dans l'architecture de la génération des
fichiers gemtext et html. La bibliothèque awk lib/pres/pres.awk se charge de
repérer les étiquettes utiles et d'appeler les fonctions qui leur correspondent.
Je crois que cette manière de faire rend plus facile à la fois la maintenance du
programme et la génération d'autres formats.
Diffstat:
14 files changed, 598 insertions(+), 499 deletions(-)
diff --git a/construire.sh b/construire.sh
@@ -24,7 +24,7 @@ liens_std() {
echo "$FCH_LIENS_STD -> $DOS_LIENS/$1"
aplat <"$FCH_LIENS_STD" | exclure -vproto="$1" | \
awk -v plan="$1" -v ext="$2" -f "$DOS_LIB/general.awk" \
- -f "$DOS_LIB/liens_gen.awk" \
+ -f "$DOS_LIB/liens/gen.awk" \
>"$DOS_LIENS/$1"
}
@@ -51,7 +51,7 @@ robots.txt() {
aplat <"$special" | exclure -vdest="$2" | \
awk -v fichier="$DOS_LIENS/$1" \
-f "$DOS_LIB/general.awk" \
- -f "$DOS_LIB/liens_rempl.awk" | \
+ -f "$DOS_LIB/liens/rempl.awk" | \
awk -f "$DOS_LIB/general.awk" -f "$DOS_LIB/robots.awk" >"$dst"
}
@@ -108,7 +108,7 @@ gen_aplat() {
aplat <"$f" | exclure -vdest="$2" | \
awk -v fichier="$DOS_LIENS/$1" \
-f "$DOS_LIB/general.awk" \
- -f "$DOS_LIB/liens_rempl.awk" >"$res"
+ -f "$DOS_LIB/liens/rempl.awk" >"$res"
done
}
@@ -123,7 +123,8 @@ gen_final() {
plus_jeune "$res" "$f" || continue
echo "$f -> $res"
awk -f "$DOS_LIB/general.awk" \
- -f "$DOS_LIB/vers/$2.awk" <"$f" >"$res"
+ -f "$DOS_LIB/pres/pres.awk" \
+ -f "$DOS_LIB/pres/$2.awk" <"$f" >"$res"
done
}
@@ -164,6 +165,7 @@ https() {
compresser "$DOS_DST/https"
}
+# $1 protocol
compresser() {
for f in $(find "$1" -type f ! -name '*.gz')
do
diff --git a/doc/éléments.txt b/doc/éléments.txt
@@ -1,3 +1,11 @@
+Métadonnées généraux
+
+@césure
+* Type de césure
+* Valeurs possibles:
+ - continue (défaut)
+ - pre: texte préformaté
+
:doc:
Racine du document.
@@ -35,11 +43,6 @@ qu'on pourrait isoler par des lignes vides.
- texte (défaut)
- liens
- citation
-@césure
-* Type de césure
-* Valeurs possibles:
- - continue (défaut)
- - pre: texte préformaté
:par:lien:
diff --git a/lib/general.awk b/lib/general.awk
@@ -1,19 +1,14 @@
+# general.awk - fonctions auxiliaires pour le format @plat
+
BEGIN {
FS = "\t"
RS = "\n"
OFS = "\t"
- div_normale = "normale"
- div_act = div_normale
- div_tbl[div_act] = ""
-}
-
-END {
- printf("%s", div_tbl[div_normale])
}
-etq_reserv != ""{
- $0 = etq_reserv "\t" $0
- etq_reserv = ""
+etq_reservee {
+ $0 = etq_reservee "\t" $0
+ etq_reservee = ""
}
function ouvrante() {
@@ -28,89 +23,86 @@ function etq(EXPR) {
return match($1, EXPR)
}
-function metadonnees_lire() {
+# lire les metadonnees d'une étiquette
+# doit être appelée à la ligne d'ouverture de l'étiquette
+# laisse sur la ligne de fermeture de :@:
+# 0 : aucune métadonnée lue
+# 1 : au moins une métadonnée lue
+function metadonnees_lire(META) {
if ($3 !~ /^$/ || fermante())
- return 0
- # obtenir l'étiquette
+ return 1
+ # n'obtenir que l'étiquette
RS = "\t"
getline
RS = "\n"
if ($1 !~ /:@:$/) {
- etq_reserv = $1
- return 0
+ etq_reservee = $0
+ return 1
}
+ getline # reste de la ligne
getline
do {
- meta[$1] = meta[$1] $3
+ META[$1] = META[$1] $3
getline
} while ($1 !~ /:@:$/)
- getline
return 0
}
-function metadonnees_supp(DOMAINE, etq) {
- for (etq in meta)
+function metadonnees_trouver(META, EXPR, m, m_tmp, n, n_tmp) {
+ n = 0
+ for (m_tmp in META)
+ if (match(m_tmp, EXPR))
+ if ((n_tmp = gsub(":", ":", m_tmp)) > n) {
+ n = n_tmp
+ m = m_tmp
+ }
+ return m
+}
+
+function metadonnees_supp(META, DOMAINE, etq) {
+ for (etq in META)
if (match(etq, "^" DOMAINE))
delete meta[etq]
}
-function ramasser(CHAINE) {
- div_tbl[div_act] = div_tbl[div_act] CHAINE
+function dechapper_cont(TEXTE) {
+ gsub(/\\[ntr]/, " ", TEXTE)
+ return TEXTE
}
-function intervalle() {
-{
- m = trouver_meta(":@:césure:$")
- if (meta[m] == "pre")
- ramasser(ces_pre($3))
- else
- ramasser(dechapper($3))
+function dechapper_pre(TEXTE) {
+ gsub(/\\n/, "\n", TEXTE)
+ gsub(/\\t/, "\t", TEXTE)
+ gsub(/\\r/, "\r", TEXTE)
+ return TEXTE
}
+function ramasser(CHAINE) {
+ if (!div_act)
+ printf("%s", CHAINE)
+ else {
+ div_tbl[div_act] = div_tbl[div_act] CHAINE
+ }
}
function div(NOM) {
- if (NOM == "")
- NOM=div_normale
div_act = NOM
}
-function div_contenu(NOM) {
- if (NOM == "")
- NOM=div_act
+function div_obtenir(NOM) {
+ if (!NOM)
+ return
return div_tbl[NOM]
}
-function div_vider(NOM) {
- if (NOM == "")
- NOM=div_act
+function div_vider(NOM, chaine) {
+ if (!NOM)
+ return
+ chaine = div_tbl[NOM]
div_tbl[NOM] = ""
+ return chaine
}
-function dechapper(TEXTE) {
- gsub(/\\[ntr]/, " ", TEXTE)
- return TEXTE
-}
-
-function ces_pre(TEXTE) {
- gsub(/\\n/, "\n", TEXTE)
- gsub(/\\t/, "\t", TEXTE)
- gsub(/\\r/, "\r", TEXTE)
- return TEXTE
-}
-
-function trouver_meta(EXPR, m, m_tmp, n, n_tmp) {
- n = 0
- for (m_tmp in meta)
- if (match(m_tmp, EXPR))
- if ((n_tmp = gsub(":", ":", m_tmp)) > n) {
- n = n_tmp
- m = m_tmp
- }
- return m
-}
-
-# format: AAAA-MM-JJTHH:MM:SS
function date_lire(CHAINE, TABLEAU, jh, d1, d2, i) {
split(CHAINE, jh, "T")
split(jh[1], d1, "-")
@@ -127,29 +119,29 @@ function date_lire(CHAINE, TABLEAU, jh, d1, d2, i) {
else
TABLEAU[i] = TABLEAU[i] + 0
}
- return
}
-function date_formater(DATE, mots) {
- mots = noms_jours(DATE[3]) " " noms_mois(DATE[2]) " " DATE[1]
- if (DATE[4] != -1)
- mots = mots " à " noms_heures(DATE[4])
- if (DATE[5] != -1)
- mots = mots " et " noms_minutes(DATE[5])
- return mots
+function date_formater(DATE, phrase) {
+ phrase = noms_jours(DATE[3]) " " noms_mois(DATE[2]) " " DATE[1]
+ if (DATE[4] != -1) {
+ phrase = phrase " à " noms_heures(DATE[4])
+ if (DATE[5] != -1)
+ phrase = phrase " à " noms_minutes(DATE[5])
+ }
+ return phrase
}
-function noms_jours(NUM) {
- if (NUM < 1 || NUM > 31)
+function noms_jours(N) {
+ if (N < 1 || N > 31)
return ""
- if (NUM == 1)
+ if (N == 1)
return "premier"
else
- return NUM
+ return N
}
-function noms_mois(NUM, tableau) {
- if (NUM < 1 || NUM > 12)
+function noms_mois(N, tableau) {
+ if (N < 1 || N > 12)
return ""
tableau[1] = "janvier"
tableau[2] = "février"
@@ -163,68 +155,61 @@ function noms_mois(NUM, tableau) {
tableau[10] = "octobre"
tableau[11] = "novembre"
tableau[12] = "décembre"
- return tableau[NUM]
+ return tableau[N]
}
-function noms_heures(NUM) {
- if (NUM < 0 || NUM > 23)
+function noms_heures(N) {
+ if (N < 0 || N > 23)
return ""
- if (NUM == 0)
+ if (N == 0)
return "minuit"
- else if (NUM == 12)
+ else if (N == 12)
return "midi"
- else if (NUM == 1)
- return NUM " heure"
+ else if (N == 1)
+ return N " heure"
else
- return NUM " heures"
+ return N " heures"
}
-function noms_minutes(NUM) {
- if (NUM < 0 || NUM > 23)
+function nom_minutes(N) {
+ if (N < 0 || N > 59)
return ""
- if (NUM == 0)
+ if (N == 0)
return "pile"
- else if (NUM == 1)
- return NUM " minute"
+ else if (N == 1)
+ return N " minute"
else
- return NUM " minutes"
+ return N " minutes"
}
function date_nombre(DATE, chaine, lng) {
- chaine = sprintf("%.4d%.2d%.2d%.2d%.2d%.2d", DATE[1], DATE[2], DATE[3], \
+ chaine = sprintf("%.4d%.2d%.2d%.2d%.2d%.2d", DATE[1], DATE[2], DATE[3], \
DATE[4], DATE[5], DATE[6])
gsub("-0001", "0000", chaine)
gsub("-01", "00", chaine)
return chaine
}
-function date_date(CHAINE, DATE, n) {
- for (n = 1; n <= 6; n++)
+function nombre_date(CHAINE, DATE, n) {
+ for (n = 1; n <= 6; n++)
DATE[n] = -1
- if ((n = substr(CHAINE, 1, 4)) == "0000")
- return
- DATE[1] = n + 0
- if ((n = substr(CHAINE, 5, 2)) == "00")
- return
- DATE[2] = n + 0
- if ((n = substr(CHAINE, 7, 2)) == "00")
- return
- DATE[3] = n + 0
- if ((n = substr(CHAINE, 9, 2)) == "00")
- return
- DATE[4] = n + 0
- if ((n = substr(CHAINE, 11, 2)) == "00")
- return
- DATE[5] = n + 0
- if ((n = substr(CHAINE, 13, 2)) == "00")
- return
- DATE[6] = n + 0
- return
-}
-
-function max(N1, N2) {
- if (N1 > N2)
- return N1
- else
- return N2
+ if ((n = substr(CHAINE, 1, 4)) == "0000")
+ return
+ DATE[1] = n + 0
+ if ((n = substr(CHAINE, 5, 2)) == "00")
+ return
+ DATE[2] = n + 0
+ if ((n = substr(CHAINE, 7, 2)) == "00")
+ return
+ DATE[3] = n + 0
+ if ((n = substr(CHAINE, 9, 2)) == "00")
+ return
+ DATE[4] = n + 0
+ if ((n = substr(CHAINE, 11, 2)) == "00")
+ return
+ DATE[5] = n + 0
+ if ((n = substr(CHAINE, 13, 2)) == "00")
+ return
+ DATE[6] = n + 0
+ return
}
diff --git a/lib/humans.awk b/lib/humans.awk
@@ -1,11 +1,17 @@
+function max(N1, N2) {
+ if (N1 > N2)
+ return N1
+ return N2
+}
+
etq("^:doc:$") && ouvrante() {
- metadonnees_lire()
+ metadonnees_lire(meta)
date_lire(meta[":doc:@:date-mod:"], date_mod)
date_lire(meta[":doc:@:date-pub:"], date_pub)
date_max = max(max(date_nombre(date_mod), date_nombre(date_pub)), \
date_max)
if (meta[":doc:@:type:"] != "humans.txt") {
- metadonnees_supp(":doc:")
+ metadonnees_supp(meta, ":doc:")
while (!(etq("^:doc:$") && fermante())) {
getline
}
@@ -14,20 +20,20 @@ etq("^:doc:$") && ouvrante() {
}
etq("^:doc:DMAJ:$") && ouvrante() {
- metadonnees_lire()
+ metadonnees_lire(meta)
}
{
- intervalle()
+ ramasser(dechapper_pre($3))
}
etq("^:doc:$") && fermante() {
ramasser("\n")
- metadonnees_supp($1)
+ metadonnees_supp(meta, $1)
}
etq("^:doc:DMAJ:$") && fermante() {
- date_date(date_max, date)
+ nombre_date(date_max, date)
ramasser(date_formater(date))
- metadonnees_supp($1)
+ metadonnees_supp(meta, $1)
}
diff --git a/lib/liens/gen.awk b/lib/liens/gen.awk
@@ -0,0 +1,26 @@
+BEGIN {
+ if (plan == "")
+ plan = "gemini"
+ if (ext == "")
+ ext = "gmi"
+}
+
+etq("^:doc:lien:$") && ouvrante() {
+ metadonnees_lire(meta)
+}
+
+{
+ lien = lien $3
+}
+
+etq("^:doc:lien:$") && fermante() {
+ lien = dechapper_cont(lien)
+ if (match(lien, /^:\/\//))
+ lien = plan lien
+ if (match(lien, /\.$/))
+ lien = lien ext
+ print meta[":doc:lien:@:id:"], lien
+ lien = ""
+ #ramasser(meta[":doc:lien:@:id:"] "\t" lien "\n" )
+ metadonnees_supp(meta, $1)
+}
diff --git a/lib/liens_rempl.awk b/lib/liens/rempl.awk
diff --git a/lib/liens_gen.awk b/lib/liens_gen.awk
@@ -1,27 +0,0 @@
-BEGIN {
- if (plan == "")
- plan = "gemini"
- if (ext == "")
- ext = "gmi"
-}
-
-etq("^:doc:lien:$") && ouvrante() {
- metadonnees_lire()
-}
-
-{
- div("entree")
- ramasser($3)
-}
-
-etq("^:doc:lien:$") && fermante() {
- contenu = div_contenu()
- div_vider()
- div()
- if (match(contenu, /^:\/\//))
- contenu = plan contenu
- if (match(contenu, /\.$/))
- contenu = contenu ext
- ramasser(sprintf("%s\t%s\n", meta[":doc:lien:@:id:"], contenu))
- metadonnees_supp($1)
-}
diff --git a/lib/pres/fonctions.awk b/lib/pres/fonctions.awk
@@ -0,0 +1,52 @@
+# fonctions.awk - liste des fonctions à implémenter
+
+function intervalle() {
+}
+
+function doc_ouv(META, ETQ) {
+}
+
+function doc_ferm(META, ETQ) {
+}
+
+function par_ouv(META, ETQ) {
+}
+
+function par_ferm(META, ETQ) {
+}
+
+function lien_ouv(META, ETQ) {
+}
+
+function lien_ferm(META, ETQ) {
+}
+
+function liste_ouv(META, ETQ) {
+}
+
+function liste_ferm(META, ETQ) {
+}
+
+function elem_ouv(META, ETQ) {
+}
+
+function elem_ferm(META, ETQ) {
+}
+
+function section_ouv(META, ETQ) {
+}
+
+function section_ferm(META, ETQ) {
+}
+
+function note_ouv(META, ETQ) {
+}
+
+function note_ferm(META, ETQ) {
+}
+
+function encrage_ouv(META, ETQ) {
+}
+
+function encrage_ferm(META, ETQ) {
+}
diff --git a/lib/pres/gemtext.awk b/lib/pres/gemtext.awk
@@ -0,0 +1,129 @@
+# gemtext.awk - présentation spécifique au format gemtext
+
+BEGIN {
+ racine = "/~selve/"
+}
+
+function intervalle() {
+ cesure = meta[metadonnees_trouver(meta, ":@:césure:$")]
+ if (cesure == "pre")
+ ramasser(dechapper_pre($3))
+ else
+ ramasser(dechapper_cont($3))
+}
+
+function doc_ouv(META, ETQ) {
+ type = meta[ETQ "@:type:"]
+ titre = meta[ETQ "@:titre:"]
+ date_pub = meta[ETQ "@:date-pub:"]
+ date_mod = meta[ETQ "@:date-mod:"]
+ msg_date = ""
+ ramasser("# " titre "\n")
+ if (type == "accueil") {
+ date_lire(date_pub, date)
+ msg_date = "Depuis le " date_formater(date)
+ }
+ else if (type == "article") {
+ date_lire(date_pub, date)
+ msg_date = "Publié le " date_formater(date)
+ if (date_mod) {
+ date_lire(date_mod, date)
+ msg_date = msg_date " et modifié le " date_formater(date)
+ }
+ }
+ else if (type == "florilège") {
+ }
+ if (msg_date)
+ ramasser("\n``` " msg_date "\n" msg_date "\n```\n")
+}
+
+function doc_ferm(META, ETQ) {
+ type = meta[ETQ "@:type:"]
+ auteur = meta[ETQ "@:auteur:"]
+ if (type == "article")
+ ramasser("\n— " auteur "\n")
+ if (type != "accueil")
+ ramasser("\n=> " racine " Retourner à la page d'accueil\n")
+}
+
+function par_ouv(META, ETQ) {
+ type = meta[ETQ "@:type:"]
+ cesure = meta[ETQ "@:césure:"]
+ ramasser("\n")
+ if (cesure == "pre")
+ ramasser("```\n")
+ if (aff_note_num) {
+ ramasser("[" note_num "] ")
+ aff_note_num = 0
+ }
+ if (type == "citation")
+ ramasser("« ")
+}
+
+function par_ferm(META, ETQ) {
+ type = meta[ETQ "@:type:"]
+ cesure = meta[ETQ "@:césure:"]
+ if (type == "citation")
+ ramasser(" »")
+ if (type != "liens")
+ ramasser("\n")
+ if (cesure == "pre")
+ ramasser("```\n")
+}
+
+function lien_ouv(META, ETQ) {
+ ref = meta[ETQ "@:ref:"]
+ ramasser("=> " ref " ")
+}
+
+function lien_ferm(META, ETQ) {
+ ramasser("\n")
+}
+
+function liste_ouv(META, ETQ) {
+}
+
+function liste_ferm(META, ETQ) {
+ ramasser("\n")
+}
+
+function elem_ouv(META, ETQ) {
+ ramasser("\n* ")
+}
+
+function elem_ferm(META, ETQ) {
+}
+
+function section_ouv(META, ETQ) {
+ niveau = meta[ETQ "@:niveau:"]
+ if (!niveau)
+ niveau = 1
+ ramasser("\n")
+ while (niveau-- > -1)
+ ramasser("#")
+ ramasser(" ")
+}
+
+function section_ferm(META, ETQ) {
+ ramasser("\n")
+}
+
+function note_ouv(META, ETQ) {
+ ramasser("[" ++note_num "]")
+ aff_note_num = 1
+ div("notes")
+}
+
+function note_ferm(META, ETQ) {
+ div()
+}
+
+function encrage_ouv(META, ETQ) {
+}
+
+function encrage_ferm(META, ETQ) {
+ if (meta[ETQ "@:id:"] == "notes") {
+ ramasser("\n## Notes\n")
+ ramasser(div_vider("notes"))
+ }
+}
diff --git a/lib/pres/html.awk b/lib/pres/html.awk
@@ -0,0 +1,168 @@
+# fonctions.awk - liste des fonctions à implémenter
+
+BEGIN {
+ racine = "/~selve/"
+}
+
+function intervalle() {
+ cesure = meta[metadonnees_trouver(meta, ":@:césure:$")]
+ if (cesure == "pre")
+ ramasser(dechapper_pre($3))
+ else
+ ramasser(dechapper_cont($3))
+}
+
+function doc_ouv(META, ETQ) {
+ type = meta[ETQ "@:type:"]
+ titre = meta[ETQ "@:titre:"]
+ date_pub = meta[ETQ "@:date-pub:"]
+ date_mod = meta[ETQ "@:date-mod:"]
+ auteur = meta[ETQ "@:auteur:"]
+ description = meta[ETQ "@:description:"]
+ ramasser("\
+<!DOCTYPE html>\n\
+<html lang=\"fr\">\n\
+<head>\n\
+ <title>" titre "</title>\n\
+ <meta charset=\"UTF-8\">\n\
+ <meta name=\"author\" content=\"" auteur "\">\n\
+ <meta name=\"robots\" content=\"index,follow\">\n\
+ <meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\n\
+ <link rel=\"stylesheet\" type=\"text/css\" href=\"/~selve/style.css\">\n\
+ <link rel=\"icon\" href=\"data:;base64,iVBORw0KGgo=\">\n\
+</head>\n\
+<body>\n\
+<main>\n")
+ if (titre == "article")
+ ramasser("<article>\n")
+ ramasser("<header>\n\
+ <hr>\n\
+ <h1>" titre "</h1>\n")
+ if (type == "accueil") {
+ date_lire(date_pub, date)
+ msg_date = "~ Depuis le <time datetime=" date_pub ">" \
+ date_formater(date) "</time> ~"
+ ramasser("\t<p><i>" msg_date "</i></p>\n")
+ } else if (type == "article") {
+ date_lire(date_pub, date)
+ msg_date = "Publié le <time datetime=" date_pub ">" \
+ date_formater(date) "</time>"
+ if (date_mod) {
+ date_lire(date_mod, date)
+ msg_date = msg_date " et modifié le <time datetime=" \
+ date_mod ">" date_formater(date) "</time>"
+ }
+ ramasser("\t<p><i>" msg_date "</i></p>\n")
+ }
+ if (description && type == "florilège")
+ ramasser("\t<p><i>" description "</i></p>\n")
+ ramasser("\t<hr>\n</header>\n")
+}
+
+function doc_ferm(META, ETQ) {
+ type = meta[ETQ "@:type:"]
+ auteur = meta[ETQ "@:auteur:"]
+ if (type == "article")
+ ramasser("<p>— " auteur "</p>\n</article>\n")
+ ramasser("</main>\n\
+<hr>\n")
+ if (type != "accueil")
+ ramasser("<footer>\n\
+<nav>\n\
+ <p><a href=\"" racine "\">Retourner à la page d'accueil</a></p>\n\
+</nav>\n\
+</footer>\n")
+ ramasser("</body>\n</html>\n")
+}
+
+function par_ouv(META, ETQ) {
+ type = meta[ETQ "@:type:"]
+ cesure = meta[ETQ "@:césure:"]
+ if (cesure == "pre")
+ nom = "pre"
+ else if (type == "citation")
+ nom = "blockquote"
+ else
+ nom = "p"
+ if (aff_note_num) {
+ ramasser("<" nom " id =\"note-" note_num "\"><a href=\"#ref-" note_num "\"> [" note_num "]</a> ")
+ aff_note_num = 0
+ } else {
+ ramasser("<" nom ">")
+ }
+}
+
+function par_ferm(META, ETQ) {
+ type = meta[ETQ "@:type:"]
+ cesure = meta[ETQ "@:césure:"]
+ if (cesure == "pre")
+ nom = "pre"
+ else if (type == "citation")
+ nom = "blockquote"
+ else
+ nom = "p"
+ ramasser("</" nom ">\n")
+}
+
+function lien_ouv(META, ETQ) {
+ ref = meta[ETQ "@:ref:"]
+ ramasser("<a href=\"" ref "\">=> ")
+}
+
+function lien_ferm(META, ETQ) {
+ ramasser("</a><br>\n")
+}
+
+function liste_ouv(META, ETQ) {
+ ramasser("<ul>\n")
+}
+
+function liste_ferm(META, ETQ) {
+ ramasser("</ul>\n")
+}
+
+function elem_ouv(META, ETQ) {
+ ramasser("\t<li>")
+}
+
+function elem_ferm(META, ETQ) {
+ ramasser("</li>\n")
+}
+
+function section_ouv(META, ETQ) {
+ niveau = meta[ETQ "@:niveau:"]
+ if (!niveau)
+ niveau = 1
+ niveau++
+ ramasser("<h" niveau ">")
+
+}
+
+function section_ferm(META, ETQ) {
+ niveau = meta[ETQ "@:niveau:"]
+ if (!niveau)
+ niveau = 1
+ niveau++
+ ramasser("</h" niveau ">\n")
+}
+
+function note_ouv(META, ETQ) {
+ note_num++
+ ramasser("<sup id=\"ref-" note_num "\"><a href=\"#note-" note_num "\">[" note_num "]</a></sup>")
+ aff_note_num = 1
+ div("notes")
+}
+
+function note_ferm(META, ETQ) {
+ div()
+}
+
+function encrage_ouv(META, ETQ) {
+}
+
+function encrage_ferm(META, ETQ) {
+ if (meta[ETQ "@:id:"] == "notes") {
+ ramasser("\n<h2>Notes</h2>\n")
+ ramasser(div_vider("notes"))
+ }
+}
diff --git a/lib/pres/pres.awk b/lib/pres/pres.awk
@@ -0,0 +1,93 @@
+# pres.awk - couche intermédiaire de présentation
+
+etq("^:doc:$") && ouvrante() {
+ etiquette = $1
+ metadonnees_lire(meta)
+ doc_ouv(meta, etiquette)
+}
+
+etq(":par:$") && ouvrante() {
+ etiquette = $1
+ metadonnees_lire(meta)
+ par_ouv(meta, etiquette)
+}
+
+etq(":lien:$") && ouvrante() {
+ etiquette = $1
+ metadonnees_lire(meta)
+ lien_ouv(meta, etiquette)
+}
+
+etq(":liste:$") && ouvrante() {
+ etiquette = $1
+ metadonnees_lire(meta)
+ liste_ouv(meta, etiquette)
+}
+
+etq(":elem:$") && ouvrante() {
+ etiquette = $1
+ metadonnees_lire(meta)
+ elem_ouv(meta, etiquette)
+}
+
+etq(":section:$") && ouvrante() {
+ etiquette = $1
+ metadonnees_lire(meta)
+ section_ouv(meta, etiquette)
+}
+
+etq(":note:$") && ouvrante() {
+ etiquette = $1
+ metadonnees_lire(meta)
+ note_ouv(meta, etiquette)
+}
+
+etq(":encrage:$") && ouvrante() {
+ etiquette = $1
+ metadonnees_lire(meta)
+ encrage_ouv(meta, etiquette)
+}
+
+{
+ intervalle()
+}
+
+etq("^:doc:$") && fermante() {
+ doc_ferm(meta, $1)
+ metadonnees_supp(meta, $1)
+}
+
+etq(":par:$") && fermante() {
+ par_ferm(meta, $1)
+ metadonnees_supp(meta, $1)
+}
+
+etq(":lien:$") && fermante() {
+ lien_ferm(meta, $1)
+ metadonnees_supp(meta, $1)
+}
+
+etq(":liste:$") && fermante() {
+ liste_ferm(meta, $1)
+ metadonnees_supp(meta, $1)
+}
+
+etq(":elem:$") && fermante() {
+ elem_ferm(meta, $1)
+ metadonnees_supp(meta, $1)
+}
+
+etq(":section:$") && fermante() {
+ section_ferm(meta, $1)
+ metadonnees_supp(meta, $1)
+}
+
+etq(":note:$") && fermante() {
+ note_ferm(meta, $1)
+ metadonnees_supp(meta, $1)
+}
+
+etq(":encrage:$") && fermante() {
+ encrage_ferm(meta, $1)
+ metadonnees_supp(meta, $1)
+}
diff --git a/lib/robots.awk b/lib/robots.awk
@@ -3,7 +3,7 @@ etq("^:doc:$") && ouvrante() {
}
{
- intervalle()
+ ramasser(dechapper_pre($3))
}
etq("^:doc:$") && fermante() {
diff --git a/lib/vers/gemtext.awk b/lib/vers/gemtext.awk
@@ -1,146 +0,0 @@
-BEGIN {
- note_num = 0
- aff_note_num = 0
- echapper = 0
-}
-
-etq("^:doc:$") && ouvrante() {
- metadonnees_lire()
- aff_date = 0
- ramasser(sprintf("# %s\n", meta[":doc:@:titre:"]))
- type = meta[":doc:@:type:"]
- if (type == "accueil") {
- date_lire(meta[":doc:@:date-pub:"], date)
- msg = "Depuis le " date_formater(date)
- aff_date = 1
- } else if (type == "article") {
- date_lire(meta[":doc:@:date-pub:"], date)
- msg = "Publié le " date_formater(date)
- if (meta[":doc:@:date-mod:"] != "") {
- date_lire(meta[":doc:@:date-mod:"], date)
- msg = msg " et modifié le " date_formater(date)
- }
- aff_date = 1
- } else if (type == "florilège") {
- ramasser(sprintf("\n%s\n", meta[":doc:@:description:"]))
- }
- if (aff_date)
- ramasser(sprintf("\n``` %s\n%s\n```\n", msg, msg))
-}
-
-etq("^:doc:section:$") && ouvrante() {
- metadonnees_lire()
- ramasser("\n")
- niveau = meta[":doc:section:@:niveau:"]
- if (niveau == "")
- niveau = 1
- while (niveau-- > -1)
- ramasser("#")
- ramasser(" ")
-}
-
-etq(":par:$") && ouvrante() {
- metadonnees_lire()
- ramasser("\n")
- if (aff_note_num) {
- ramasser("[" note_num "] ")
- aff_note_num = 0
- }
- m = trouver_meta(":par:@:citation:$")
- if (m != "")
- ramasser("« ")
-}
-
-etq(":lien:$") && ouvrante() {
- metadonnees_lire()
- ref = trouver_meta(":lien:@:ref:$")
- ramasser("=> " dechapper(meta[ref]) " ")
-}
-
-etq(":liste:$") && ouvrante() {
- metadonnees_lire()
-}
-
-etq(":liste:elem:$") && ouvrante() {
- metadonnees_lire()
- ramasser("\n* ")
-}
-
-etq(":note:$") && ouvrante() {
- metadonnees_lire()
- ramasser("["++note_num"]")
- aff_note_num = 1
- div("notes")
-}
-
-etq(":encrage:$") && ouvrante() {
- metadonnees_lire()
-}
-
-etq(":it:$") && ouvrante() {
- metadonnees_lire()
- ramasser("_")
-}
-
-{
- intervalle()
-}
-
-etq("^:doc:$") && fermante() {
- type = meta[":doc:@:type:"]
- if (type == "article") {
- ramasser("\n— " meta[":doc:@:auteur:"] "\n")
- }
- if (type != "accueil")
- ramasser("\n=> ../ Revenir à la page d'accueil\n")
- metadonnees_supp($1)
-}
-
-etq("^:doc:section:$") && fermante() {
- ramasser("\n")
- metadonnees_supp($1)
-}
-
-etq(":par:$") && fermante() {
- type = trouver_meta(":par:@:type:$")
- m = trouver_meta(":par:@:citation:$")
- if (m != "")
- ramasser(" »")
- if (meta[type] != "liens")
- ramasser("\n")
- metadonnees_supp($1)
-}
-
-etq(":lien:$") && fermante() {
- ramasser("\n")
- metadonnees_supp($1)
-}
-
-etq(":liste:$") && fermante() {
- ramasser("\n")
- metadonnees_supp($1)
-}
-
-etq(":liste:elem:$") && ouvrante() {
- metadonnees_supp($1)
-}
-
-etq(":note:$") && fermante() {
- div()
- metadonnees_supp($1)
-}
-
-etq(":encrage:$") && fermante() {
- ramasser("\n## Notes\n")
- id = trouver_meta(":encrage:@:id:$")
- if (meta[id] == "notes") {
- ramasser(div_contenu("notes"))
- div_vider("notes")
- }
- metadonnees_supp($1)
-}
-
-etq(":it:$") && ouvrante() {
- metadonnees_lire()
- ramasser("_")
-}
diff --git a/lib/vers/html.awk b/lib/vers/html.awk
@@ -1,192 +0,0 @@
-etq("^:doc:$") && ouvrante() {
- metadonnees_lire()
- type = meta[":doc:@:type:"]
- if (type == "article") {
- options["article"] = 1
- options["signature"] = 1
- options["aff_date"] = 1
- options["retour_accueil"] = 1
- } else if (type == "accueil") {
- options["aff_date"] = 1
- } else if (type == "florilège") {
- options["retour_accueil"] = 1
- options["aff_desc"] = 1
- }
- ramasser("\
-<!DOCTYPE html>\n\
-<html lang=\"fr\">\n\
-<head>\n\
- <title>" meta[":doc:@:titre:"] "</title>\n\
- <meta charset=\"UTF-8\">\n\
- <meta name=\"author\" content=\"" meta[":doc:@:auteur:"] "\">\n\
- <meta name=\"robots\" content=\"index,follow\">\n\
- <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\
- <link rel=\"stylesheet\" type=\"text/css\" href=\"/~selve/style.css\">\n\
- <link rel=\"icon\" href=\"data:;base64,iVBORw0KGgo=\">\n\
-</head>\n\
-<body>\n\
-<main>\n")
- if (options["article"])
- ramasser("<article>\n")
- ramasser("\
-<header>\n\
- <hr>\n\
- <h1>" meta[":doc:@:titre:"] "</h1>\n")
- if (options["aff_date"]) {
- date_lire(meta[":doc:@:date-pub:"], date)
- if (type == "accueil") {
- msg = "<i>~ Depuis le <time datetime=" \
- meta[":doc:@:date-pub:"]">" date_formater(date) \
- "</time> ~</i>"
- } else {
- msg = "Publié le " date_formater(date)
- if (meta[":doc:@:date-mod:"] != "") {
- date_lire(meta[":doc:@:date-mod:"], date)
- msg = msg " et modifié le <time datetime=" \
- meta[":doc:@:date-mod:"]">" \
- date_formater(date) "</time>"
- }
- }
- ramasser("\
- <p id=\"date-publication\"><i>" msg "</i></p>\n")
- }
- if (options["aff_desc"])
- ramasser("\t<p><i>" meta[":doc:@:description:"] "</p></i>\n")
- ramasser("<hr>\n</header>\n")
-}
-
-etq("^:doc:section:$") && ouvrante() {
- metadonnees_lire()
- niveau = meta[":doc:section:@:niveau:"]
- if (!niveau)
- niveau = 1
- niveau++
- ramasser("<h" niveau ">")
-}
-
-etq(":par:$") && ouvrante() {
- metadonnees_lire()
- m = trouver_meta(":@:césure:$")
- if (meta[m] == "pre")
- nom = "pre"
- else
- nom = "p"
- m = trouver_meta(":par:@:citation:$")
- if (m != "")
- nom = "blockquote"
- if (aff_note_num) {
- ramasser("<" nom " id=\"note-" note_num "\"><a href=\"#ref-" note_num "\">[" note_num "]</a> ")
- aff_note_num = 0
- } else {
- ramasser("<" nom ">")
- }
-}
-
-etq(":lien:$") && ouvrante() {
- metadonnees_lire()
- ref = trouver_meta(":lien:@:ref:$")
- ramasser("<a href=\"" meta[ref] "\">=> ")
-}
-
-etq(":liste:$") && ouvrante() {
- metadonnees_lire()
- ramasser("<ul>\n")
-}
-
-etq(":liste:elem:$") && ouvrante() {
- metadonnees_lire()
- ramasser(" <li>")
-}
-
-etq(":note:$") && ouvrante() {
- metadonnees_lire()
- note_num++
- ramasser("<sup id=\"ref-" note_num "\"><a href=\"#note-" note_num "\">[" note_num "]</a></sup>")
- aff_note_num = 1
- div("notes")
-}
-
-etq(":encrage:$") && ouvrante() {
- metadonnees_lire()
-}
-
-etq(":it:$") && ouvrante() {
- metadonnees_lire()
- ramasser("<em>")
-}
-
-{
- intervalle()
-}
-
-etq("^:doc:$") && fermante() {
- if (options["signature"])
- ramasser("<p id=\"signature\">— "\
- meta[":doc:@:auteur:"] "</p>\n")
- if (options["article"])
- ramasser("</article>\n")
- ramasser("\
-</main>\n\
-<hr>\n\
-<footer>\n")
- if (options["retour_accueil"])
- ramasser("\
-<nav><p class=\"lien-retour\">\
-<a href=\"../\">Revenir à la page d'accueil</a></p></nav>\n")
- ramasser("</footer>\n\
-</body>\n\
-</html>\n")
- metadonnees_supp($1)
-}
-
-etq("^:doc:section:$") && fermante() {
- ramasser("</h" niveau ">\n")
- metadonnees_supp($1)
-}
-
-etq(":par:$") && fermante() {
- m = trouver_meta(":@:césure:$")
- if (meta[m] == "pre")
- ramasser("</pre>\n")
- else
- ramasser("</p>\n")
- m = trouver_meta(":par:@:citation:$")
- if (m != "")
- ramasser("</blockquote>\n")
- metadonnees_supp($1)
-}
-
-etq(":lien:$") && fermante() {
- ramasser("</a><br>\n")
- metadonnees_supp($1)
-}
-
-etq(":liste:$") && fermante() {
- ramasser("</ul>\n")
- metadonnees_supp($1)
-}
-
-etq(":liste:elem:$") && fermante() {
- ramasser("</li>\n")
- metadonnees_supp($1)
-}
-
-etq(":note:$") && fermante() {
- div()
- metadonnees_supp($1)
-}
-
-etq(":encrage:$") && fermante() {
- ramasser("<h2>Notes</h2>\n")
- id = trouver_meta(":encrage:@:id:$")
- if (meta[id] == "notes") {
- ramasser(div_contenu("notes"))
- div_vider("notes")
- }
- metadonnees_supp($1)
-}
-
-etq(":it:$") && fermante() {
- ramasser("</em>")
- metadonnees_supp($1)
-}