capsite

Ressources et outils pour la génération de ma capsule et de mon site
git clone git://git.asteride.xyz/~ldp/capsite.git
Journaux | Fichiers | Références

commit 73c3e069e42eb9e2d3bff32e57963990d42730bf
parent f8e9af6a3d1190ee605ab12adc60c950695a2116
Auteur: ldp <ldp@asteride.xyz>
Date:   Wed,  7 Aug 2024 11:20:06 -0400

[gen] rerefonte du système de génération

Diffstat:
M.gitignore | 6------
Abin/convertir.sh | 21+++++++++++++++++++++
Dconstruire.sh | 213-------------------------------------------------------------------------------
Ddoc/éléments.txt | 106-------------------------------------------------------------------------------
Alib/analyser.awk | 107+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dlib/atom.awk | 60------------------------------------------------------------
Dlib/general.awk | 231-------------------------------------------------------------------------------
Dlib/humans.awk | 39---------------------------------------
Dlib/liens/gen.awk | 26--------------------------
Dlib/liens/rempl.awk | 26--------------------------
Dlib/pres/fonctions.awk | 64----------------------------------------------------------------
Dlib/pres/gemtext.awk | 141-------------------------------------------------------------------------------
Dlib/pres/html.awk | 197-------------------------------------------------------------------------------
Dlib/pres/pres.awk | 115-------------------------------------------------------------------------------
Dlib/robots.awk | 12------------
Dlib/style.css | 24------------------------
Alib/suf.sh | 20++++++++++++++++++++
Alib/vers_gemtext.awk | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alib/vers_html.awk | 126+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dliens/liens.aplat | 74--------------------------------------------------------------------------
Dsrc/a_visiter.aplat | 63---------------------------------------------------------------
Asrc/a_visiter.conv | 26++++++++++++++++++++++++++
Dsrc/articles/aplat_1_documents_structures_unix.aplat | 373-------------------------------------------------------------------------------
Asrc/articles/aplat_1_documents_structures_unix.conv | 211+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dsrc/articles/avant-propos.aplat | 164-------------------------------------------------------------------------------
Asrc/articles/avant-propos.conv | 44++++++++++++++++++++++++++++++++++++++++++++
Dsrc/articles/chute_voyelles_aymara.aplat | 104-------------------------------------------------------------------------------
Asrc/articles/chute_voyelles_aymara.conv | 44++++++++++++++++++++++++++++++++++++++++++++
Dsrc/articles/curiosites_catalan.aplat | 434-------------------------------------------------------------------------------
Asrc/articles/curiosites_catalan.conv | 188+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dsrc/articles/finger_openbsd.aplat | 490-------------------------------------------------------------------------------
Asrc/articles/finger_openbsd.conv | 295+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dsrc/articles/index.aplat | 19-------------------
Asrc/articles/index.conv | 10++++++++++
Dsrc/articles/jex_construction_ideolangue_pile.aplat | 548-------------------------------------------------------------------------------
Asrc/articles/jex_construction_ideolangue_pile.conv | 230+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dsrc/florilege/index.aplat | 59-----------------------------------------------------------
Asrc/florilege/index.conv | 34++++++++++++++++++++++++++++++++++
Dsrc/flux/cybercarnet.special.aplat | 13-------------
Asrc/flux/cybercarnet_gemini.atom.cp | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/flux/cybercarnet_https.atom.cp | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dsrc/flux/index.aplat | 24------------------------
Asrc/flux/index.conv | 10++++++++++
Dsrc/humans.special.aplat | 20--------------------
Asrc/humans.txt.cp | 14++++++++++++++
Dsrc/index.aplat | 101-------------------------------------------------------------------------------
Asrc/index.conv | 48++++++++++++++++++++++++++++++++++++++++++++++++
Dsrc/robots.special.aplat | 10----------
Asuf/conv | 17+++++++++++++++++
Asuf/cp | 8++++++++
50 files changed, 1653 insertions(+), 3756 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -1,7 +1 @@ -brouillons dst -*.plat -*.gz -liens/gemini -liens/http -liens/https diff --git a/bin/convertir.sh b/bin/convertir.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +DOS_SRC="src" +DOS_DST="dst" +DOS_SUF="suf" +FORMATS="gemtext html" + +FCH_SRC="$(find "$DOS_SRC" -type f)" + +mkdir -p "$DOS_DST" + +for FOR in $FORMATS +do + for FCH in $FCH_SRC + do + SUFFIXE=${FCH##*.} + INVARIANT=${FCH#$DOS_SRC/} + INVARIANT=${INVARIANT%.*} + "$DOS_SUF/$SUFFIXE" -f $FOR "$DOS_DST" "$INVARIANT" < $FCH + done +done diff --git a/construire.sh b/construire.sh @@ -1,213 +0,0 @@ -#!/bin/sh - -DOS_LIB="lib" -DOS_SRC="src" -DOS_DST="dst" -DOS_LIENS="liens" -RACINE="asteride.xyz/~selve" - -FCH_LIENS_STD="$DOS_LIENS/liens.aplat" - -# $1 protocole -# $2 extension -liens_std() { - echo "$FCH_LIENS_STD -> $DOS_LIENS/$1" - aplat <"$FCH_LIENS_STD" | bloquer -vproto="$1" | \ - awk -v plan="$1" -v ext="$2" -f "$DOS_LIB/general.awk" \ - -f "$DOS_LIB/liens/gen.awk" \ - >"$DOS_LIENS/$1" -} - -humans() { - special="humans.special.aplat" - inter="${special%.aplat}.plat" - dst="${special%.special.aplat}.txt" - tous="$(find "$DOS_SRC/" -type f -name "*.$1.plat" \ - ! -name 'humans.special.plat')" - echo "$DOS_SRC/$special -> $DOS_DST/$1/$dst" - aplat <"$DOS_SRC/$special" >"$DOS_SRC/$inter" - awk -f "$DOS_LIB/general.awk" -f "$DOS_LIB/humans.awk" \ - $tous "$DOS_SRC/$inter" >"$DOS_DST/$1/$dst" -} - -# $1 protocole -# $2 destination -robots.txt() { - special="$DOS_SRC/robots.special.aplat" - dst="$DOS_DST/$1/robots.txt" - echo "$special -> $dst" - aplat <"$special" | bloquer -vdest="$2" | \ - awk -v fichier="$DOS_LIENS/$1" \ - -f "$DOS_LIB/general.awk" \ - -f "$DOS_LIB/liens/rempl.awk" | \ - awk -f "$DOS_LIB/general.awk" -f "$DOS_LIB/robots.awk" >"$dst" -} - -# recréer la hiérarchie de dossiers -hierarchie() { - for d in $(find "$DOS_SRC/"* -type d) - do - mkdir -p "$DOS_DST/$1/${d#$DOS_SRC/}" - done -} - -# copier les fichiers .cp -copier() { - for f in $(find "$DOS_SRC" -type f -name '*.cp' \ - ! -name '*.special.cp') - do - res="$DOS_DST/$1/${f#$DOS_SRC/}" - res="${res%.cp}" - echo "$f -> $res" - cp "$f" "$res" - done -} - -# $1 protocole -sitemap.txt() { - res="$DOS_DST/$1/sitemap.txt" - tous="$(find "$DOS_DST/$1/" -type f ! -name 'sitemap.*' \ - ! -name '*.gz' ! -name '*.css' ! -name '*.atom')" - echo "$res" - echo "$tous" | sed 's|^dst/\([^/]*\)|\1://'"$RACINE"'|' > "$res" -} - -# $1 fichier -# $2 protocole -# $3 destination -# $4 flux -# $+ fichiers -flux() { - f="$1" - proto="$2" - dest="$3" - flux="$4" - shift 4 - echo "$f -> $flux" - aplat <"$f" | bloquer -vdest="$dest" | awk -v fichier="$DOS_LIENS/$proto" \ - -f "$DOS_LIB/general.awk" -f "$DOS_LIB/liens/rempl.awk" | - awk -f "$DOS_LIB/general.awk" -f "$DOS_LIB/atom.awk" - "$@" \ - >"$flux" -} - -# $1 protocole -# $2 destination -flux_cybercarnet() { - fichiers="$(find "$DOS_SRC/articles" -type f -name "*.$1.plat")" - flux "$DOS_SRC/flux/cybercarnet.special.aplat" "$1" "$2" \ - "$DOS_DST/$2/flux/cybercarnet_$1.atom" $fichiers -} - -# $1 protocole -# $2 destination -gen_aplat() { - for f in $(find "$DOS_SRC" -type f -name '*.aplat' \ - ! -name '*.special.aplat') - do - res="${f%.aplat}.$1.plat" - echo "$f -> $res" - aplat <"$f" | bloquer -vdest="$2" | \ - awk -v fichier="$DOS_LIENS/$1" \ - -f "$DOS_LIB/general.awk" \ - -f "$DOS_LIB/liens/rempl.awk" >"$res" - done -} - -# $1 protocole -# $2 format -# $3 extension -gen_final() { - for f in $(find "$DOS_SRC" -type f -name "*.$1.plat" ) - do - res="${f%.$1.plat}.$3" - res="$DOS_DST/$1/${res#$DOS_SRC/}" - echo "$f -> $res" - awk -f "$DOS_LIB/general.awk" \ - -f "$DOS_LIB/pres/pres.awk" \ - -f "$DOS_LIB/pres/$2.awk" <"$f" >"$res" - done -} - -gemini() { - liens_std "gemini" "gmi" - gen_aplat "gemini" "gemini" - hierarchie "gemini" - robots.txt "gemini" "gemini" - copier "gemini" - gen_final "gemini" "gemtext" "gmi" - humans "gemini" - sitemap.txt "gemini" - flux_cybercarnet "gemini" "gemini" - flux_cybercarnet "https" "gemini" - flux_cybercarnet "http" "gemini" -} - -http() { - liens_std "http" "html" - gen_aplat "http" "web" - hierarchie "http" - robots.txt "http" "web" - copier "http" - gen_final "http" "html" "html" - humans "http" - sitemap.txt "http" - compresser "$DOS_DST/http" - flux_cybercarnet "gemini" "http" - flux_cybercarnet "https" "http" - flux_cybercarnet "http" "http" -} - -https() { - liens_std "https" "html" - gen_aplat "https" "web" - hierarchie "https" - robots.txt "https" "web" - copier "https" - gen_final "https" "html" "html" - humans "https" - sitemap.txt "https" - compresser "$DOS_DST/https" - flux_cybercarnet "gemini" "https" - flux_cybercarnet "https" "https" - flux_cybercarnet "http" "https" -} - -# $1 protocol -compresser() { - for f in $(find "$1" -type f ! -name '*.gz') - do - echo "$f -> $f.gz" - gzip -9fk "$f" - done -} - -nettoyer() { - rm -f "$DOS_LIENS/gemini" "$DOS_LIENS/http" "$DOS_LIENS/https" - find "$DOS_SRC" -type f ! \( -name '*.aplat' -o -name '*.cp' \) | \ - xargs rm -f - rm -rf "$DOS_DST" -} - -tout() { - gemini - http - https -} - -publier() { - openrsync --rsync-path=/usr/bin/openrsync -va --del "$DOS_DST/gemini/"\ - 'asteride.xyz:/var/gemini/asteride.xyz/~selve/' - openrsync --rsync-path=/usr/bin/openrsync -va --del "$DOS_DST/https/"\ - 'asteride.xyz:/var/www/htdocs/asteride.xyz/https/~selve/' - openrsync --rsync-path=/usr/bin/openrsync -va --del "$DOS_DST/http/"\ - 'asteride.xyz:/var/www/htdocs/asteride.xyz/http/~selve/' -} - -case "$1" in - gemini) gemini ;; - http) http ;; - https) https ;; - net) nettoyer ;; - pub) publier ;; - tout|*) tout ;; -esac diff --git a/doc/éléments.txt b/doc/éléments.txt @@ -1,106 +0,0 @@ -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. - -@titre -* Titre du document. -@type -* Type de document. -* Valeurs possibles: - - accueil - - article - - index - - florilège - - page -@date-pub -* Date de la publication. -@date-mod -* Date de la dernière modification. -@auteur -* Auteur du document -@uuid -* Identifiant unique. -* Utile à la génération des flux atom. -@description -* Description de la page - -:par: - -Cet élément tire son nom de « paragraphe » mais ne correspond pas exactement à -ce concept. :par: est destiné à contenir quelque chose qui a une certaine unité, -qu'on pourrait isoler par des lignes vides. - -@type -* Type de « paragraphe » -* Valeurs possibles: - - texte (défaut) - - liens - - citation - -:par:lien: - -Décrit un lien. Il contient le texte affiché à la place du lien. -Voir aussi :@:ref:std: - -@ref -* URL - -:@:ref:std: - -Contient un identifiant qu'un programme externe remplacera par une URL. Utile -pour éviter l'élément :si:. - -:it: - -Italique - -:code: - -Bout de code. - -:liste: - -Décrit une liste. - -@ordonnée -* Créer une liste ordonnée à la place. Gemini ne supporte pas les listes - ordonnées. - -:liste:elem: - -Élément d'une liste. - -:section: - -Section d'un document. Par défaut, correspond à ## ou à <h2> - -@niveau -* Niveau - - 2 (défaut) - - 3 - -:note: - -Note de bas de page. S'encre au premire l':encrage: avec un identifiant "notes". - -:citation: - -Citation. - -@auteur -@date - -:encrage: - -Point d'encrage. - -@id -* Identifiant diff --git a/lib/analyser.awk b/lib/analyser.awk @@ -0,0 +1,107 @@ +BEGIN { + dans_pre = 0 + dans_liste = 0 + section = 0 # entête +} + +section == 0 && /^$/ { + section = 1 + afficher_entete() + next +} + +section == 0 { + i = index($0, ":") + etq = substr($0, 1, i-1) + meta[etq] = substr($0, i+1) + next +} + +/^```/ { + if (dans_pre) { + elem_prefin() + dans_pre = 0 + } else { + elem_predep(substr($0, 4)) + dans_pre = 1 + } + next +} + +dans_pre == 1{ + elem_pre($0) + next +} + +/^# / { + elem_titre1(substr($0, 2)) + next +} + +/^## / { + elem_titre2(substr($0, 3)) + next +} + +/^### / { + elem_titre3(substr($0, 4)) + next +} + +/^> / { + elem_citation(substr($0, 2)) + next +} + +/^=> / { + if (!dans_liens) { + elem_liensdeb() + dans_liens = 1 + } + lien = $2 + $1 = "" + $2 = "" + if (match(lien, "[.]$")) + lien = lien format + elem_lien(ee(lien), ee($0)) + next +} + +/^\* / { + if (!dans_liste) { + elem_listedeb() + dans_liste = 1 + } + elem_liste(substr($0, 2)) + next +} + +/^$/ { + if (dans_liste) { + elem_listefin() + dans_liste = 0 + } else if (dans_liens) { + elem_liensfin() + dans_liens = 0 + } + elem_lignevide() + next +} + +{ + elem_paragraphe($0) +} + +END { + if (dans_liste) { + elem_listefin() + dans_liste = 0 + } + afficher_pieddepage() +} + +# enlever les espaces +function ee(texte) { + sub("^[ \t]*", "", texte) + return texte +} diff --git a/lib/atom.awk b/lib/atom.awk @@ -1,60 +0,0 @@ -etq("^:doc:$") && ouvrante() { - metadonnees_lire(meta) - type = meta[":doc:@:type:"] - titre = meta[":doc:@:titre:"] - sous_titre = meta[":doc:@:sous-titre:"] - uuid = meta[":doc:@:uuid:"] - auteur = meta[":doc:@:auteur:"] - - if (type == "article") { - date_pub = meta[":doc:@:date-pub:"] - date_mod = meta[":doc:@:date-mod:"] - lien = meta[":doc:@:lien:"] - description = meta[":doc:@:description:"] - date_lire(date_pub, date) - uuid_date[uuid] = date_nombre(date) - tampons[uuid] = "\t<entry>\n\ - <title>" titre "</title>\n\ - <link href=\"" lien "\" />\n\ - <id>urn:uuid:" uuid "</id>\n\ - <published>" date_pub "</published>\n\ - <author><name>" auteur "</name></author>\n" - if (date_mod) - tampons[uuid] = tampons[uuid] \ -" <updated>" date_mod "</updated>\n" - if (description) - tampons[uuid] = tampons[uuid] \ -" <summary>" description "</summary>\n" - tampons[uuid] = tampons[uuid] "\t</entry>\n\n" - } else if (type == "atom") { - cible = meta[":doc:@:cible:"] - entete = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\ -<feed xmlns=\"http://www.w3.org/2005/Atom\">\n\n\ - <title>" titre "</title>\n\ - <link href=\"" cible "\" />\n\ - <id>urn:uuid:" uuid "</id>\n" - } - metadonnees_supp(meta, $1) -} - -END { - i = 0 - while (length(uuid_date)) { - max = 0 - for (v in uuid_date) { - if (uuid_date[v] > max) { - max = uuid_date[v] - uuid = v - } - } - d = uuid_date[uuid] - delete uuid_date[uuid] - ordre[++i] = uuid - } - nombre_date(d, date) - printf("%s%s\n\n", entete, - "\t<updated>" date_nombre_formater(date) "</updated>") - for (j = 1; j <= i; j++) - printf("%s", tampons[ordre[j]]) - print "</feed>" -} diff --git a/lib/general.awk b/lib/general.awk @@ -1,231 +0,0 @@ -# general.awk - fonctions auxiliaires pour le format @plat - -BEGIN { - FS = "\t" - RS = "\n" - OFS = "\t" -} - -etq_reservee { - $0 = etq_reservee "\t" $0 - etq_reservee = "" -} - -function ouvrante() { - return $2 ~ /\(/ -} - -function fermante() { - return $2 ~ /\)/ -} - -function etq(EXPR) { - return match($1, EXPR) -} - -# 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 1 - # n'obtenir que l'étiquette - RS = "\t" - getline - RS = "\n" - if ($1 !~ /:@:$/) { - etq_reservee = $0 - return 1 - } - getline # reste de la ligne - getline - do { - META[$1] = META[$1] $3 - getline - } while ($1 !~ /:@:$/) - return 0 -} - -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 dechapper_cont(TEXTE) { - gsub(/\\[nt]/, " ", TEXTE) - gsub(/\\\\/, "\\", TEXTE) - return TEXTE -} - -function dechapper_pre(TEXTE) { - gsub(/\\n/, "\n", TEXTE) - gsub(/\\t/, "\t", TEXTE) - gsub(/\\\\/, "\\", TEXTE) - gsub(/\\\n/, "\\n", TEXTE) - gsub(/\\\t/, "\\t", 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) { - div_act = NOM -} - -function div_obtenir(NOM) { - if (!NOM) - return - return div_tbl[NOM] -} - -function div_vider(NOM, chaine) { - if (!NOM) - return - chaine = div_tbl[NOM] - div_tbl[NOM] = "" - return chaine -} - -function date_lire(CHAINE, TABLEAU, jh, d1, d2, i) { - split(CHAINE, jh, "T") - split(jh[1], d1, "-") - split(jh[2], d2, ":") - TABLEAU[1] = d1[1] - TABLEAU[2] = d1[2] - TABLEAU[3] = d1[3] - TABLEAU[4] = d2[1] - TABLEAU[5] = d2[2] - TABLEAU[6] = d2[3] - for (i in TABLEAU) { - if (TABLEAU[i] == "") - TABLEAU[i] = -1 - else - TABLEAU[i] = TABLEAU[i] + 0 - } -} - -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 date_nombre_formater(DATE, chaine) { - chaine = DATE[1] "-" DATE[2] "-" DATE[3] - if (DATE[4] != -1) { - chaine = chaine "T" DATE[4] - if (DATE[5] != -1) { - chaine = chaine - DATE[5] - if (DATE[6] != -1) - chaine = chaine - DATE[6] - } - } - return chaine -} - -function noms_jours(N) { - if (N < 1 || N > 31) - return "" - if (N == 1) - return "premier" - else - return N -} - -function noms_mois(N, tableau) { - if (N < 1 || N > 12) - return "" - tableau[1] = "janvier" - tableau[2] = "février" - tableau[3] = "mars" - tableau[4] = "avril" - tableau[5] = "mai" - tableau[6] = "juin" - tableau[7] = "juillet" - tableau[8] = "août" - tableau[9] = "septembre" - tableau[10] = "octobre" - tableau[11] = "novembre" - tableau[12] = "décembre" - return tableau[N] -} - -function noms_heures(N) { - if (N < 0 || N > 23) - return "" - if (N == 0) - return "minuit" - else if (N == 12) - return "midi" - else if (N == 1) - return N " heure" - else - return N " heures" -} - -function nom_minutes(N) { - if (N < 0 || N > 59) - return "" - if (N == 0) - return "pile" - else if (N == 1) - return N " minute" - else - return N " minutes" -} - -function date_nombre(DATE, chaine, lng) { - 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 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 -} diff --git a/lib/humans.awk b/lib/humans.awk @@ -1,39 +0,0 @@ -function max(N1, N2) { - if (N1 > N2) - return N1 - return N2 -} - -etq("^:doc:$") && ouvrante() { - 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(meta, ":doc:") - while (!(etq("^:doc:$") && fermante())) { - getline - } - next - } -} - -etq("^:doc:DMAJ:$") && ouvrante() { - metadonnees_lire(meta) -} - -{ - ramasser(dechapper_pre($3)) -} - -etq("^:doc:$") && fermante() { - ramasser("\n") - metadonnees_supp(meta, $1) -} - -etq("^:doc:DMAJ:$") && fermante() { - nombre_date(date_max, date) - ramasser(date_formater(date)) - metadonnees_supp(meta, $1) -} diff --git a/lib/liens/gen.awk b/lib/liens/gen.awk @@ -1,26 +0,0 @@ -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 @@ -1,26 +0,0 @@ -BEGIN { - if (fichier == "") - fichier = "liens/gemini" - while ((getline < fichier) > 0) - tableau[$1] = $2 - dans = 0 -} - -dans == 0 && etq(":ref-std:$") && ouvrante() { - dans = 1 -} - -dans == 1 { - ramasser() -} - -dans == 1 && etq(":ref-std:$") && fermante() { - sub(/ref-std:$/, "", $1) - $2 = "" - $3 = tableau[$3] - dans = 0 -} - -dans == 0 { - print -} diff --git a/lib/pres/fonctions.awk b/lib/pres/fonctions.awk @@ -1,64 +0,0 @@ -# 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 it_ouv(META, ETQ) { -} - -function it_ferm(META, ETQ) { -} - -function code_ouv(META, ETQ) { -} - -function code_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 @@ -1,141 +0,0 @@ -# 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" || type == "page") { - 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 it_ouv(META, ETQ) { -} - -function it_ferm(META, ETQ) { -} - -function code_ouv(META, ETQ) { -} - -function code_ferm(META, ETQ) { -} - -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 @@ -1,197 +0,0 @@ -# fonctions.awk - liste des fonctions à implémenter - -BEGIN { - racine = "/~selve/" - f_css = "lib/style.css" -} - -function echapper_html(TEXTE) { - gsub(/&/, "\\&amp;", TEXTE) - gsub(/</, "\\&lt;", TEXTE) - gsub(/>/, "\\&gt;", TEXTE) - - return TEXTE -} - -function intervalle() { - cesure = meta[metadonnees_trouver(meta, ":@:césure:$")] - if (cesure == "pre") - ramasser(echapper_html(dechapper_pre($3))) - else - ramasser(echapper_html(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=\"icon\" href=\"data:;base64,iVBORw0KGgo=\">\n\ - <style>\n") - while ((getline ligne < f_css) > 0) - ramasser("\t\t" ligne "\n") - close(f_css) - ramasser("\t</style>\n\ -</head>\n\ -<body>\n\ -<main>\n") - if (type == "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" || type == "page") { - 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 it_ouv(META, ETQ) { - ramasser("<em>") -} - -function it_ferm(META, ETQ) { - ramasser("</em>") -} - -function code_ouv(META, ETQ) { - ramasser("<code>") -} - -function code_ferm(META, ETQ) { - ramasser("</code>") -} - -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 @@ -1,115 +0,0 @@ -# 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(":it:$") && ouvrante() { - etiquette = $1 - metadonnees_lire(meta) - it_ouv(meta, etiquette) -} - -etq(":code:$") && ouvrante() { - etiquette = $1 - metadonnees_lire(meta) - code_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(":it:$") && fermante() { - it_ferm(meta, $1) - metadonnees_supp(meta, $1) -} - -etq(":code:$") && fermante() { - code_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 @@ -1,12 +0,0 @@ -etq("^:doc:$") && ouvrante() { - metadonnees_lire() -} - -{ - ramasser(dechapper_pre($3)) -} - -etq("^:doc:$") && fermante() { - ramasser("\n") - metadonnees_supp($1) -} diff --git a/lib/style.css b/lib/style.css @@ -1,24 +0,0 @@ -@media (prefers-color-scheme: dark) { - html { - background-color: #000000; - color: #ffffff; - } -} -@media (prefers-color-scheme: light) { - html { - background-color: #ffffff; - color: #000000; - } -} -body { - font: 1.2em/1.7 serif; - max-width: 760px; - margin: auto; - padding: 15px; -} -a { color: #1177ff; text-decoration: none; } -a:hover { color: #ff0000; } -sup { font-size: 0.8em } -header { text-align: center; padding-bottom: 10px; } -pre { line-height: normal; overflow: auto; } -blockquote { font-style: italic; } diff --git a/lib/suf.sh b/lib/suf.sh @@ -0,0 +1,20 @@ +# suf.sh -- code partagé par les programmes suf/* +# +# -f [format de sortie] [dossier dst] [chemin] + +utilisation() { + echo "Utilisation: $0 -f [format] <fichier" +} + +while getopts f: opt +do + case $opt in + f) OPT_FORMAT="$OPTARG" ;; + ?) utilisation ; exit 1 ;; + esac +done +shift $(($OPTIND - 1)) + +OPT_DST="$1/$OPT_FORMAT/$2" + +DOS_LIB="lib" diff --git a/lib/vers_gemtext.awk b/lib/vers_gemtext.awk @@ -0,0 +1,76 @@ +function afficher_entete( message) { + if (meta["titre"]) + printf("# %s\n\n", meta["titre"]) + if (meta["type"] == "accueil") + message = meta["message"] + else if (meta["date_pub"]) { + message = "Publié le " meta["date_pub"] + if (meta["date_mod"]) + message = message " et modifié le " meta["date_mod"] + } + if (message) + printf("``` %s\n%s\n```\n\n", message, message) +} + +function afficher_pieddepage() { + if (meta["type"] != "accueil") + printf("\n=> /~ldp/ Retourner à la page d'accueil\n"); +} + +function elem_titre1(titre) { + print titre > "/dev/stderr" +} + +function elem_titre2(titre) { + print "## " titre +} + +function elem_titre3(titre) { + print "### " titre +} + +function elem_citation(cit) { + print "> " cit +} + +function elem_liensdeb() { +} + +function elem_liensfin() { +} + +function elem_lien(lien, titre) { + printf("=> %s", lien) + if (titre) + print " " titre +} + +function elem_predep(desc) { + print "``` " desc +} + +function elem_prefin() { + print "```" +} + +function elem_pre(ligne) { + print ligne +} + +function elem_listedeb() { +} + +function elem_listefin() { +} + +function elem_liste(elem) { + print "* " elem +} + +function elem_lignevide() { + print "" +} + +function elem_paragraphe(contenu) { + print contenu +} diff --git a/lib/vers_html.awk b/lib/vers_html.awk @@ -0,0 +1,126 @@ +function afficher_entete( message) { + print "<!DOCTYPE html>" + print "<html lang=\"fr\">" + print "<head>" + if (meta["titre"]) + print "\t<title>" meta["titre"] "</title>" + print "\t<meta charset=\"UTF-8\">" + if (meta["auteur"]) + print "\t<meta name=\"author\" content=\"" meta["auteur"] "\">" + print "\t<meta name=\"robots\" content=\"index,follow\">" + print "\t<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">" + print "\t<link rel=\"icon\" href=\"data:;base64,iVBORw0KGgo=\">" + print "<style>" + print "\thtml {" + print "\t\tbackground-color: #000000;" + print "\t\tcolor: #ffffff;" + print "\t}" + print "\tbody {" + print "\t\tfont: 1.2em/1.7 serif;" + print "\t\tmax-width: 760px;" + print "\t\tmargin: auto;" + print "\t\tpadding: 15px;" + print "\t}" + print "\ta { color: #1177ff; text-decoration: none; }" + print "\ta:hover { color: #ff0000; }" + print "\tsup { font-size: 0.8em }" + print "\theader { text-align: center; padding-bottom: 10px; }" + print "\tpre { line-height: normal; overflow: auto; }" + print "\tblockquote { font-style: italic; }" + print "</style>" + print "</head>" + print "<body>" + print "<main>" + if (meta["titre"]) { + print "<header>" + print "\t<hr>" + if (meta["titre"]) + print "\t<h1>" meta["titre"] "</h1>" + if (meta["type"] == "accueil") + message = meta["message"] + else if (meta["date_pub"]) { + message = "Publié le " meta["date_pub"] + if (meta["date_mod"]) + message = message " et modifié le " meta["date_mod"] + } + if (message) + print "\t<p><i>" message "</i></p>" + print "\t<hr>" + print "</header>" + } + print +} + +function afficher_pieddepage() { + print "</main>" + print "<hr>" + if (meta["type"] != "accueil") { + print "<footer>" + print "<nav>" + print "<p><a href=\"/~ldp/\">Retourner à la page d'accueil</a></p>" + print "</nav>" + print "</footer>" + } + print "</body>" + print "</html>" + +} + +function elem_titre2(titre) { + print "<h2>" titre "</h2>" +} + +function elem_titre3(titre) { + print "<h3>" titre "</h3>" +} + +function elem_citation(cit) { + print "<blockquote><p>" cit "</p></blockquote>" +} + +function elem_liensdeb() { + printf("<p>") +} + +function elem_liensfin() { + printf("</p>") +} + +function elem_lien(lien, titre) { + printf("<a href=\"%s\">", lien) + if (titre) + printf("%s", titre) + print "</a><br>" +} + +function elem_predep(desc) { + printf "<pre>" +} + +function elem_prefin() { + print "</pre>" +} + +function elem_pre(ligne) { + print ligne +} + +function elem_listedeb() { + print "<ul>" +} + +function elem_listefin() { + print "</ul>" +} + +function elem_liste(elem) { + print "<li>" elem "</li>" +} + +function elem_lignevide() { + print +} + +function elem_paragraphe(contenu) { + print "<p>" contenu "</p>" +} diff --git a/liens/liens.aplat b/liens/liens.aplat @@ -1,74 +0,0 @@ -(doc - (lien (@ (id "ACCUEIL")) - "://asteride.xyz/~selve/") - (lien (@ (id "ART")) - "://asteride.xyz/~selve/articles/") - (lien (@ (id "FLO")) - "://asteride.xyz/~selve/florilege/") - (lien (@ (id "EXT_SOLDERPUNK_GIT_CONTENT_DISTRIBUTION")) - "gemini://gemini.circumlunar.space/~solderpunk/gemlog/low-budget-p2p-content-distribution-with-git.gmi") - (lien (@ (id "ART_JEX_CONSTRUCTION_PILE")) - "://asteride.xyz/~selve/articles/jex_construction_ideolangue_pile.") - (lien (@ (id "ART_FINGER_OPENBSD")) - "://asteride.xyz/~selve/articles/finger_openbsd.") - (lien (@ (id "ART_CATALAN_CURIOSITES")) - "://asteride.xyz/~selve/articles/curiosites_catalan.") - (lien (@ (id "ART_AYMARA_VOYELLES")) - "://asteride.xyz/~selve/articles/chute_voyelles_aymara.") - (lien (@ (id "ART_AVANT_PROPOS")) - "://asteride.xyz/~selve/articles/avant-propos.") - (lien (@ (id "ART_APLAT_1")) - "://asteride.xyz/~selve/articles/aplat_1_documents_structures_unix.") - (lien (@ (id "PAGE_A_VISITER")) - "://asteride.xyz/~selve/a_visiter.") - (lien (@ (id "PAGE_FLUX")) - "://asteride.xyz/~selve/flux/") - (lien (@ (id "FLUX_CYBERCARNET_GEMINI")) - "://asteride.xyz/~selve/flux/cybercarnet_gemini.atom") - (lien (@ (id "FLUX_CYBERCARNET_HTTP")) - "://asteride.xyz/~selve/flux/cybercarnet_http.atom") - (lien (@ (id "FLUX_CYBERCARNET_HTTPS")) - "://asteride.xyz/~selve/flux/cybercarnet_https.atom") - (lien (@ (id "MAN_APLAT_1")) - "://asteride.xyz/~selve/man/aplat.1.txt") - (lien (@ (id "MAN_APLAT_5")) - "://asteride.xyz/~selve/man/aplat.5.txt") - (lien (@ (id "MAN_PLAT_5")) - "://asteride.xyz/~selve/man/plat.5.txt") - (lien (@ (id "PUB_APLAT")) - "://asteride.xyz/~selve/publications/aplat/aplat.tgz") - (lien (@ (id "SITEMAP.TXT")) - "://asteride.xyz/~selve/sitemap.txt") - (lien (@ (id "HUMANS.TXT")) - "://asteride.xyz/~selve/humans.txt") - (lien (@ (id "ROBOTS.TXT")) - "://asteride.xyz/~selve/robots.txt") - (lien (@ (id "EXT_GAMIFICAT")) - "://gamifi.cat/") - (lien (@ (id "EXT_SI3TCH")) - "://si3t.ch/") - - (si (@ (#proto=gemini - (lien (@ (id "EXT_SOLENE")) - "://perso.pw/blog/") - (lien (@ (id "GIT_APLAT")) - "https://git.asteride.xyz/~selve/aplat/") - (lien (@ (id "GIT_CAPSITE")) - "https://git.asteride.xyz/~selve/capsite/") - (lien (@ (id "EXT_HUGO_SOUCY")) - "https://hugo.soucy.cc/")))) - - - (si (@ (#proto=http|proto=https - (lien (@ (id "EXT_SOLENE")) - "://dataswamp.org/~solene/") - (lien (@ (id "ART_AVANT_PROPOS")) - "://asteride.xyz/~selve/articles/avant-propos.html") - (lien (@ (id "GIT_APLAT")) - "://git.asteride.xyz/~selve/aplat/") - (lien (@ (id "GIT_CAPSITE")) - "://git.asteride.xyz/~selve/capsite/") - (lien (@ (id "ART_A_VISITER")) - "://asteride.xyz/~selve/articles/a_visiter.html") - (lien (@ (id "EXT_HUGO_SOUCY")) - "://hugo.soucy.cc/"))))) diff --git a/src/a_visiter.aplat b/src/a_visiter.aplat @@ -1,63 +0,0 @@ -(doc - (@ (titre "À visiter") - (type "page") - (date-pub "2021-12-21") - (date-mod "2023-10-23") - (auteur "Selve") - (lien (ref-std "PAGE_A_VISITER")) - (uuid "06bace23-abb0-412e-acaf-4d9a5e8459c7")) - - (par (@ (type "liens")) - (lien (@ (ref (ref-std "EXT_SI3TCH"))) - "Si₃TcH")) - - (par - (si (@ (#dest=web "Site (aussi disponible par le protocole gemini)")) - "Capsule") -" de prx. J'aime beaucoup lire ses tutoriels informatiques et ses -opinions sur le domaine. Ses articles concernent surtout Unix et le Web. C'est -un utilisateur d'OpenBSD, et le système est souvent abordé. On y trouve -l'excellent guide « Héberger son serveur avec OpenBSD », qui m'a été et qui -continue de m'être d'une grande utilité. Il publie parfois des textes à teneur -politique, ce que j'aime bien.") - - (par (@ (type "liens")) - (lien (@ (ref (ref-std "EXT_GAMIFICAT"))) - "Gamifi.ca't!")) - - (par - (si (@ (#dest=web "Site (aussi disponible par le protocole gemini)")) - "Capsule") -" trilingue catalanophone, espérantophone et hispanophone. On y trouve -beaucoup de choses, mais ce sont surtout ses textes en faveur du logiciel libre -et du fédivers qui ont attiré mon attention jusqu'à maintenant. C'est une -occasion de plus de pratiquer mon catalan.") - - (par (@ (type "liens")) - (lien (@ (ref (ref-std "EXT_SOLENE"))) - "Solène's gemini space")) - - (par - (si (@ (#dest=web "Site (aussi disponible par le protocole gemini)")) - "Capsule") -" surtout anglophone (on y trouve bien quelques rares articles en français) de -Solène, développeuse d'OpenBSD. Elle publie surtout des tutoriels informatiques -et des commentaires sur des programmes informatiques qu'elle a utilisés. Ses -articles sont très intéressants.") - - (par (@ (type "liens")) - (lien (@ (ref "gemini://warmedal.se/~antenna/")) - "Antenna")) - - (par -"C'est un agrégateur de publications sur Gemini. On peut donc y découvrir de -nouvelles capsules intéressantes.") - - (par (@:type "liens") - (lien (@:ref:ref-std "EXT_HUGO_SOUCY") - "hs0ucy")) - - (par -"Site d'Hugo Soucy. On y trouve de notes de lecture et des réflexions, souvent -brèves mais réfléchies, qui portent la plupart du temps sur la société, sur -l'informatique ou sur les deux à la fois.")) diff --git a/src/a_visiter.conv b/src/a_visiter.conv @@ -0,0 +1,26 @@ +titre:À visiter +date_pub:21 décembre 2021 +date_mod:4 juin 2024 +type:page +autreur:~ldp + +=> //si3t.ch/ Si₃TcH + +Capsule et site de prx. J'aime beaucoup lire ses tutoriels informatiques et ses opinions sur le domaine. Ses articles concernent surtout Unix et le Web. C'est un utilisateur d'OpenBSD, et le système est souvent abordé. On y trouve l'excellent guide « Héberger son serveur avec OpenBSD », qui m'a été et qui continue de m'être d'une grande utilité. Il publie parfois des textes à teneur politique, ce que j'aime bien. + +=> //gamifi.cat/ Gamifi.ca't! + +Capsule e site trilingue catalanophone, espérantophone et hispanophone. On y trouve beaucoup de choses, mais ce sont surtout ses textes en faveur du logiciel libre et du fédivers qui ont attiré mon attention jusqu'à maintenant. C'est une occasion de plus de pratiquer mon catalan. + +=> gemini://perso.pw/blog/ Solène's gemini space +=> https://dataswamp.org/~solene/ Solène'% + +Capsule et site surtout anglophone (on y trouve bien quelques rares articles en français) de Solène, développeuse d'OpenBSD. Elle publie surtout des tutoriels informatiques et des commentaires sur des programmes informatiques qu'elle a utilisés. Ses articles sont très intéressants. + +=> gemini://warmedal.se/~antenna/ Antenna + +C'est un agrégateur de publications sur Gemini. On peut donc y découvrir de nouvelles capsules intéressantes. + +=> https://hugo.soucy.cc/ hs0ucy + +Site d'Hugo Soucy. On y trouve de notes de lecture et des réflexions, souvent brèves mais réfléchies, qui portent la plupart du temps sur la société, sur l'informatique ou sur les deux à la fois. diff --git a/src/articles/aplat_1_documents_structures_unix.aplat b/src/articles/aplat_1_documents_structures_unix.aplat @@ -1,373 +0,0 @@ -(doc - (@ (type "article") - (titre "aplat(1) : documents structurés pour Unix") - (date-pub "2024-01-25") - (date-mod "2024-01-26") - (auteur "Selve") - (lien:ref-std "ART_APLAT_1") - (uuid "89352ae7-b5d5-4c87-bf51-edd280ae0c62")) - -(par "Les utilitaires classiques de Unix se prêtent très bien à la manipulation -de données structurées par des listes ou par des tableaux, c’est-à-dire à la -manipulation de données qu’on encode aisément avec des lignes et des champs. Un -bon nombre de ces utilitaires (grep, sed, awk, cut, sort, diff, uniq, etc.) ont -en effet été conçus spécialement pour l’analyse et le traitement des données -ligne par ligne. Aussi, ils offrent souvent la possibilité de reconnaître des -segments de ligne séparés par un délimitateur arbitraire, faisant émerger ce -deuxième niveau d’organisation qu’est le champs.") - -(par "Il existe cependant d’autres types de strutures de données qu’on ne -représente pas instinctivement par ces éléments, et les utilitaires qui -s’attendent à trouver des données organisées ligne par ligne ont évidemment bien -souvent de la difficulté à traiter correctement les formats de document -structurés selon un autre principe. Parmi ces formats, on compte notamment le -XML, le TeX, le Markdown, etc., mais aussi le C, le Shell, le Scheme, etc. Parce -qu’ils supposent une structure au nombre de niveaux fixe et assez limité -(souvent deux : la ligne et le champ), ces utilitaires semblent parfaitement -inadaptés au traitement de ces autres formats, d’autant plus que plusieurs -d’entre eux ont une structure récursive, admettant donc un nombre illimité de -niveaux.") - -(par "Bien que, donc, les utilitaires de traitement de texte conçus pour bien -fonctionner dans un environnement de type Unix n’ont pas une portée absolument -générale, ils restent très utiles pour mener à bien un grand nombre de tâches. -Comme beaucoup d’autres, j’attribue cette utilité à leur simplicité, à leur -(relative) cohérence, à leur composabilité et à leur omniprésence. Je les trouve -en outre agréables à utiliser. Mais je ne venterai pas davantage leurs mérites, -car le programme informatique que cet article doit présenter s’adresse avant -tout à ceux que ces mérites séduisent déjà, surtout que ce programme est -parfaitement inutile lorsqu’utilisé seul et qu’il ne trouve sa valeur que dans -la coopérations avec ces autres utilitaires.") - -(par "Puisqu’il est de toute façon utile d’apprendre à maîtriser ces utilitaires -Unix et que je suis maintenant devenu à l’aise avec eux, je me suis donné pour -objectif d’étendre leur portée en créant un format de document structuré selon -le principe des lignes et des champs qui permettrait de représenter des données -structurées selon n’importe quel autre principe.") - -(par "Je présente ici le programme " (code "aplat(1)") " et les deux formats -qu’il utilise. Le programme lit en entrée standard un document dans un certain -format et exporte en sortie standard sa représentation dans un format pont -organisé selon des lignes et des champs.") - -(par "J’ai conçu le format de sortie pour qu’il soit facile pour les utilitaires -classiques de Unix de le manipuler. Puisqu’il présente la structure des -documents sous une forme applatie, j’ai décidé de lui donner le nom de " (it -"plat") ".") - -(par "J’ai conçu le format d’entrée pour qu’il soit facile pour une personne de -le manipuler. C’est un format beaucoup plus simple à comprendre et selon moi -beaucoup moins pénible à écrire à la main que le XML. Il s’inspire beaucoup du -SXML. Puisqu’il s’oppose en quelque sorte au format " (code "plat(5)") ", je lui ai -donné le nom de " (it "a") "plat " (it "(non-plat)")". Il s’agit d’un " (it "a") -" privatif, qu’un trouve par exemple dans des mots comme " (it "apatride") " ou -" (it "anonyme") ".") - -(par "Quant au programme, il se serait appelé " (it "àplat") " si la tradition -restreignait pas le nom des programmes à l’ensemble des suite de caractères -ASCII affichables. Sa tâche est en effet de passer d’" (code "aplat(5)") " " (it -"à") " " (code "plat(5)")".") - - (section:code "aplat(5)") - -(par "Le format " (code "aplat(5)") " permet une organisation hiérarchique de -données étiquettées. Il est inspiré du SXML et est aussi puissant que lui. C’est -surtout pour des raisons de simplicité que j’ai choisi de créer un nouveau -format de document plutôt que d’en utiliser un qui existait déjà. Bien que cette -entreprise aurait été tout à fait possible, je ne voulais pas avoir à composer -avec la complexité du XML, par exemple. Aussi, la création d’un nouveau format -de toutes pièces donne une liberté bien plus grande. De toute façon, l’intérêt -d’" (code "aplat(1)") "se trouve selon moi bien plus dans son format de sortie -que dans son format d’entrée, et il est possible de créer un programme distinct -traduisant le XML, le SXML, le HTML ou n’importe quel autre format vers "(code -"plat(5)") ".") - -(par "Voici un exemple de document valide.") - -(par (@:césure "pre") -""" -(doc - (titre Un\ programme\ en\ C) - (auteur Selve) - (date-pub 2023 - 11 - 18) - (date-mod (vide)) - (par "Voici un exemple de document dans le format aplat.") - (lien - (url "https://asteride.xyz/~selve/exemple.txt") - (texte "Un exemple d’URL")) - (pre -"""! langue=C -#include <stdio.h> - -int -main(void) -{ - printf("Bonjour tout le monde!\n"); - return 0; -} -"""! - ) - (par "Ce paragraphe affiche " (it "Bonjour tout le monde!"))) -""") - -(par "Je veux faire quelques remarques sur le contenu de cet exemple. Sachez -cependant que cet article complète plutôt qu’il ne remplace les pages du manuel -livrées avec le programme.") - - (par (@:type "liens") - (lien (@:ref:ref-std "MAN_APLAT_1") - "aplat(1)") - (lien (@:ref:ref-std "MAN_APLAT_5") - "aplat(5)") - (lien (@:ref:ref-std "MAN_PLAT_5") - "plat(5)")) - -(par "La structure hiérarchique d’un document " (code "aplat(5)") " est -explicitée par les parenthèses qui encadrent une section de ce document. -J’appelle " (it "domaine") " l’espace se trouvant entre deux parenthèses de même -niveau.") - -(par "Un domaine, s’il n’est pas vide, est composé d’" (it "atomes") ". Un atome -est une chaîne de caractères séparés par une parenthèse ou par des blancs -(espaces, caractères de tabulation ou nouvelles lignes).") - -(par "Le premier atome d’un domaine correspond à l’" (it "étiquette") ". Il -nomme un domaine. Tous les autres atomes d’un même domaine sont comme concatenés -pour former une longue chaîne de caractères. Je nomme cette chaîne le " (it -"contenu") ". « " (code "doc") " », « " (code "titre") " », « " (code "auteur") -" », « " (code "vide") " », etc. sont tous des exemples d’étiquettes ; « " (code -"Selve") " » est un exemple de contenu. Aussi, notons que, puisque les atomes -adjacents sont concatenés, le segment « " (code "2023 - 11 - 18") " » correspond -à l’atome « " (code "2023-11-18") " ».") - -(par "Il est possible d’inclure des caractères spéciaux dans des atomes en les -échappant. Ils seront alors traités comme des caractères normaux.") - -(par "Il existe trois manières d’échapper des caractères spéciaux.") - -(par "D’abord, on peut utiliser la barre oblique inversée (« \\\\ »). Son effet -varie selon le caractère échappé. Les parenthèses, les espaces normaux, les -caractères de tabulation, les guillemets et le caractère d’échappement lui-même -sont interprétés dans leur sens littéral lorsque ce caractère les précède. -Cependant, une nouvelle ligne échappée est ignorée. Dans l’exemple ci-dessus, la -chaîne « " (code "Un\\ programme\\ en\\ C") " » est interprété comme un seul -atome et correspond à « Un programme en C ».") - -(par "Ensuite, on peut placer les caractères à échapper entre guillemets. Les -parenthèses et les blancs placés entre deux guillemets reçoivent leur -interprétation littérale. Par exemple, ici la chaîne « " (code "\"Voici un -exemple de document dans le format aplat.\"") " » forme un seul atome.") - -(par "Finalement, on peut créer un " (it "bloc") " en plaçant les caractères à -échapper entre deux triples guillemets droits doubles (« "(code \"\"\") " »). -Tous les caractères reçoivent alors leur interprétation littérale. À l’intérieur -d’un bloc, il est possible d’échapper la séquence « "(code \"\"\") " » en la -faisant suivre d’un point d’exclamation (« " (code \"\"\"!) " »).") - -(par "Tous les caractères entre la séquence d’ouverture d’un bloc et la première -nouvelle ligne, inclusivement sont ignorés. C’est pour faciliter le travail de -préprocesseurs, qui fonctionneront d’une manière analogue à ceux de troff. Ces -préprocesseurs, contrairement aux postprocesseurs, opéreront sur l’entrée de -aplat(1) plutôt que sur sa sortie. On pourra alors leur fournir de l’information -sur cette première ligne.") - -(par "Les blocs sont utiles pour inclure verbatim un bloc de texte, comme un -programme informatique ou un document HTML.") - - (section (@:niveau 2) "Métaformats") - -(par "À partir de cette description, il est possible — nécessaire, même — de -créer un métaformat adapté à certains besoins. Ainsi, on peut imaginer une -manière de représenter les métadonnées comme le fait le XML. Cette idée est -empruntée au SXML. Est une métadonnée (paire attribut-valeur) un domaines et son -contenu s’ils se trouvent à l’intérieur d’un domaine étiquetté avec « " (code @) -" ».") - -(par "Voici l’exemple précédent converti à cette convention.") - -(par (@:césure "pre") -""" -(doc - (@ (titre "Un programme en C") - (auteur "Selve") - (date-pub "2023-11-18") - (date-mod (vide)) - (métaformat "genre-de-sxml")) - (par "Voici un exemple de document dans le format aplat.") - (lien (@ (ref "https://asteride.xyz/~selve/exemple.txt")) - "Un exemple d’URL") - (pre -"""! lang=C -#include <stdio.h> - -int -main(void) -{ - printf("Bonjour tout le monde!\n"); - return 0; -} -"""! - ) - (par "Ce paragraphe affiche " (it "Bonjour tout le monde!"))) -""") - -(par "Ici, les attributs « " (code "titre") " », « " (code "auteur") " », « " -(code "date-pub") " », etc. portent sur le domaine nommé « " (code "doc") " » et -l’attribut « " (code "ref") " » porte sur celui nommé « " (code "lien") " ».") - - (section (code "plat(5)")) - -(par "Le format " (code "plat(5)") " est une représentation équivalente au " -(code "aplat(5)") ", au XML, etc.") - -(par "Voici la représentation en plat du dernier exemple en aplat.") - -(par (@:césure "pre") -""" -:doc: ( -:doc:@: ( -:doc:@:titre: () Un programme en C -:doc:@:auteur: () Selve -:doc:@:date-pub: () 2023-11-18 -:doc:@:date-mod: ( -:doc:@:date-mod:vide: () -:doc:@:date-mod: ) -:doc:@:métaformat: () genre-de-sxml -:doc:@: ) -:doc:par: () Voici un exemple de document dans le format aplat. -:doc:lien: ( -:doc:lien:@: ( -:doc:lien:@:ref: () https://asteride.xyz/~selve/exemple.txt -:doc:lien:@: ) -:doc:lien: ) Un exemple d’URL -:doc:pre: () #include <stdio.h>\n\nint\nmain(void)\n{\n\tprintf("Bonjour tout le monde!\\n");\n\treturn 0;\n} -:doc:par: ( Ce paragraphe affiche -:doc:par:it: () Bonjour tout le monde! -:doc:par: ) -:doc: ) -""") - -(par "On voit tout de suite pourquoi ce format n’est pas destiné à être manipulé -par des humains. Il est en revanche très adapté à des outils analysant les -fichiers ligne par ligne et champ par champ.") - -(par "Un document " (code "plat(5)") " est composé d’une série de lignes et de -trois champs, séparés par des caractères de tabulation.") - -(par "Le premier champ correspond au nom du domaine. Il prend la forme de la -liste des toutes les étiquettes des domaines parents, précédées d’un deux-points -(« : »). La dernière étiquette est aussi suivie d’un deux-points. Il n’est pas -possible d’échapper ce caractère, car plusieurs outils auraient du mal à -composer avec une telle syntaxe.") - -(par "J’appelle " (it "domaine cadet") " le domaine le plus imbriqué. Ainsi, à -la ligne commençant par « " (code ":doc:@:date-mod:vide:" ) " », le domaine -cadet est « " (code ":vide:") " », alors qu’à la première ligne le domaine cadet -est « " (code ":doc:") " ».") - -(par "Tout nom de domaine doit apparaître au moins une fois en position de -domaine cadet, et ce même s’il est vide. Par exemple, bien que « " (code ":@:") -" », dans le domaine « " (code ":doc:@:") " », ne renferme que d’autres -domaines, il a droit à sa ligne, de même que « " (code ":vide:")" ».") - -(par "Le second champ est une liste de drapeaux. Pour l’instant — et je ne pense -pas en ajouter de si tôt —, il en existe deux: la parenthèse ouvrante (« " (code -"(") " ») et la parenthèse fermante (« " (code ")") " »), dénotant -respectivement la limite initiale et la limite finale d’un domaine.") - -(par "Le troisième champ correspond au « contenu » du format " (code "aplat(5)") -".") - -(par (code "plat(5)") " est organisé selon le principe des lignes et des champs ; -les lignes sont séparées par le caractère de saut de ligne et les champs par -un caractère de tabulation. Pour utiliser ces caractères au sens propre, il -suffit de les échapper. On peut voir le mécanisme d’échappement à l’œuvre à la -ligne commençant par « " (code ":doc:pre:") " » dans l’exemple ci-dessus.") - - (section "Utilisation d’" (code "aplat(1)")) - -(par "Le programme " (code "aplat(1)") " ne lit aucun argument en ligne de -commandes : ni options ni nom de fichier ; il se contente de lire en entrée -standard et d’écrire en sortie standard.") - -(par "Il s’ulitise donc de la manière suivante.") - -(par (@:césure "pre") -"$ aplat <entree.aplat >sortie.plat") - -(par "En supposant que le document " (code "aplat(5)") " de l’exemple précédent -se trouve dans le fichier " (code "bonjour.aplat" ) ", on pourrait écrire la -séquence de commandes suivantes pour en extraire le programme, le compiler et -l’exécuter.") - -(par (@:césure "pre") -""" -$ aplat <bonjour.aplat | grep '^:doc:pre: ' | cut -f3 | - { tr -d '\n'; echo; } | xargs -0 printf '%b' | - cc -o bonjour -x c - && ./bonjour -Bonjour tout le monde! -""") - -(par "Ici, " (code "aplat") " fait passer du format " (code "aplat(5)") " au -format " (code "plat(5)") " le contenu du fichier " (code "bonjour.aplat") " ; " -(code "grep") " ne retient de la sortie de la commande précédente que les lignes -dont l'étiquette est " (code ":doc:pre:") " ; " (code "cut") " isole le -troisième champ ; " (code "tr") " fusionne toutes les lignes en supprimant tous -les caractère de saut de ligne ; " (code "echo") " réinsère la dernière nouvelle -ligne, que " (code "tr") " avait supprimé en trop ; " (code "xargs -0 printf -'%b'") " a pour effet de déséchapper les caractères de nouvelle ligne et de -tabulation, " (code "cc") " compile le texte résultant et, finalement, " (code -"./bonjour") " exécute le programme.") - - (section "Conclusion") - -(par "J’ai créé cet utilitaire après de nombreuses heures de patentatage avec -les solutions existantes. Je cherchais un format de document sémantique qui soit -à la fois agréable à utiliser et qui s’intégre bien avec les utilitaires Unix. -Je suis content de dire que cette recherche est maintenant terminée ; je suis -satisfait de ma création.") - -(par "Je ne prétends pas que ce programme et que les formats qu’il utilise -soient d’une utilité universelle. On a vu dans le dernier exemple que les -chaînes de commandes qui manipulent des documents " (code "plat(5)") " sont -assez complexes. Cet exemple est même relativement simple dans son genre, -puisqu’il ignore complètement le deuxième champ, celui des parenthèses, dont on -n’aurait pas pu se passer si on n’avait pas préssuposé que le champ ne -contiendrait qu’un seul domaine avec l’étiquette " (code ":doc:pre:") ". Aussi -le format " (code "plat(5)") " est-il mieux adapté à être manipulé dans des -scripts qu’à la ligne de commandes. On peut cependant abstraire une partie de la -chaîne de commandes de cet exemple et en la plaçant dans un fichier " (code -"compiler_c") ".") - -(par (@:césure "pre") -""" -$ cat compiler_c -#!/bin/sh - -grep '^:doc:pre: ' | - cut -f3 | - { tr -d '\n'; echo; } | - xargs -0 printf '%b' | - cc -o "$1" -x c - -$ chmod +x compiler_c -""") - -(par "On peut alors composer :") - -(par (@:césure "pre") -""" -$ aplat <bonjour.aplat | ./compiler_c "bonjour" && ./bonjour -Bonjour tout le monde! -""") - -(par "J’ai de nombreuses idées de programmes auxiliaires qui permettront de -faciliter l’utilisation des formats " (code "aplat(5)") " et " (code "plat(5)") -". Je leur dédierai certainement d’autres articles.") - - (section "Voir aussi") - - (par (@ (type "liens")) - (lien (@:ref:ref-std "PUB_APLAT") - "Télécharger " (code "aplat(1)")) - (lien (@:ref:ref-std "GIT_APLAT") - "Dépôt git du programme."))) diff --git a/src/articles/aplat_1_documents_structures_unix.conv b/src/articles/aplat_1_documents_structures_unix.conv @@ -0,0 +1,211 @@ +titre:aplat(1) : documents structurés pour Unix +date_pub:25 janvier 2024 +date_mod:4 juin 2024 +auteur:~ldp +type:article +uuid:89352ae7-b5d5-4c87-bf51-edd280ae0c62 + +Les utilitaires classiques de Unix se prêtent très bien à la manipulation de données structurées par des listes ou par des tableaux, c’est-à-dire à la manipulation de données qu’on encode aisément avec des lignes et des champs. Un bon nombre de ces utilitaires (grep, sed, awk, cut, sort, diff, uniq, etc.) ont en effet été conçus spécialement pour l’analyse et le traitement des données ligne par ligne. Aussi, ils offrent souvent la possibilité de reconnaître des segments de ligne séparés par un délimitateur arbitraire, faisant émerger ce deuxième niveau d’organisation qu’est le champs. + +Il existe cependant d’autres types de strutures de données qu’on ne représente pas instinctivement par ces éléments, et les utilitaires qui s’attendent à trouver des données organisées ligne par ligne ont évidemment bien souvent de la difficulté à traiter correctement les formats de document structurés selon un autre principe. Parmi ces formats, on compte notamment le XML, le TeX, le Markdown, etc., mais aussi le C, le Shell, le Scheme, etc. Parce qu’ils supposent une structure au nombre de niveaux fixe et assez limité (souvent deux : la ligne et le champ), ces utilitaires semblent parfaitement inadaptés au traitement de ces autres formats, d’autant plus que plusieurs d’entre eux ont une structure récursive, admettant donc un nombre illimité de niveaux. + +Bien que, donc, les utilitaires de traitement de texte conçus pour bien fonctionner dans un environnement de type Unix n’ont pas une portée absolument générale, ils restent très utiles pour mener à bien un grand nombre de tâches. Comme beaucoup d’autres, j’attribue cette utilité à leur simplicité, à leur (relative) cohérence, à leur composabilité et à leur omniprésence. Je les trouve en outre agréables à utiliser. Mais je ne venterai pas davantage leurs mérites, car le programme informatique que cet article doit présenter s’adresse avant tout à ceux que ces mérites séduisent déjà, surtout que ce programme est parfaitement inutile lorsqu’utilisé seul et qu’il ne trouve sa valeur que dans la coopérations avec ces autres utilitaires. + +Puisqu’il est de toute façon utile d’apprendre à maîtriser ces utilitaires Unix et que je suis maintenant devenu à l’aise avec eux, je me suis donné pour objectif d’étendre leur portée en créant un format de document structuré selon le principe des lignes et des champs qui permettrait de représenter des données structurées selon n’importe quel autre principe. + +Je présente ici le programme aplat(1) et les deux formats qu’il utilise. Le programme lit en entrée standard un document dans un certain format et exporte en sortie standard sa représentation dans un format pont organisé selon des lignes et des champs. + +J’ai conçu le format de sortie pour qu’il soit facile pour les utilitaires classiques de Unix de le manipuler. Puisqu’il présente la structure des documents sous une forme applatie, j’ai décidé de lui donner le nom de plat. + +J’ai conçu le format d’entrée pour qu’il soit facile pour une personne de le manipuler. C’est un format beaucoup plus simple à comprendre et selon moi beaucoup moins pénible à écrire à la main que le XML. Il s’inspire beaucoup du SXML. Puisqu’il s’oppose en quelque sorte au format plat(5), je lui ai donné le nom de aplat (non-plat). Il s’agit d’un a privatif, qu’un trouve par exemple dans des mots comme apatride ou anonyme. + +Quant au programme, il se serait appelé àplat si la tradition restreignait pas le nom des programmes à l’ensemble des suite de caractères ASCII affichables. Sa tâche est en effet de passer d’aplat(5) à plat(5). + +## aplat(5) + +Le format aplat(5) permet une organisation hiérarchique de données étiquettées. Il est inspiré du SXML et est aussi puissant que lui. C’est surtout pour des raisons de simplicité que j’ai choisi de créer un nouveau format de document plutôt que d’en utiliser un qui existait déjà. Bien que cette entreprise aurait été tout à fait possible, je ne voulais pas avoir à composer avec la complexité du XML, par exemple. Aussi, la création d’un nouveau format de toutes pièces donne une liberté bien plus grande. De toute façon, l’intérêt d’aplat(1)se trouve selon moi bien plus dans son format de sortie que dans son format d’entrée, et il est possible de créer un programme distinct traduisant le XML, le SXML, le HTML ou n’importe quel autre format vers plat(5). + +Voici un exemple de document valide. + +``` +(doc + (titre Un\ programme\ en\ C) + (auteur ~ldp) + (date-pub 2023 - 11 - 18) + (date-mod (vide)) + (par "Voici un exemple de document dans le format aplat.") + (lien + (url "https://asteride.xyz/~ldp/exemple.txt") + (texte "Un exemple d’URL")) + (pre +""" langue=C +#include <stdio.h> + +int +main(void) +{ + printf("Bonjour tout le monde!\n"); + return 0; +} +""" + ) + (par "Ce paragraphe affiche " (it "Bonjour tout le monde!"))) +``` + +Je veux faire quelques remarques sur le contenu de cet exemple. Sachez cependant que cet article complète plutôt qu’il ne remplace les pages du manuel livrées avec le programme. + +=> /~ldp/man/aplat.1.txt aplat(1) +=> /~ldp/man/aplat.5.txt aplat(5) +=> /~ldp/man/plat.5.txt plat(5) + +La structure hiérarchique d’un document aplat(5) est explicitée par les parenthèses qui encadrent une section de ce document. J’appelle domaine l’espace se trouvant entre deux parenthèses de même niveau. + +Un domaine, s’il n’est pas vide, est composé d’atomes. Un atome est une chaîne de caractères séparés par une parenthèse ou par des blancs (espaces, caractères de tabulation ou nouvelles lignes). + +Le premier atome d’un domaine correspond à l’étiquette. Il nomme un domaine. Tous les autres atomes d’un même domaine sont comme concatenés pour former une longue chaîne de caractères. Je nomme cette chaîne le contenu. « doc », « titre », « auteur », « vide », etc. sont tous des exemples d’étiquettes ; « ~ldp » est un exemple de contenu. Aussi, notons que, puisque les atomes adjacents sont concatenés, le segment « 2023 - 11 - 18 » correspond à l’atome « 2023-11-18 ». + +Il est possible d’inclure des caractères spéciaux dans des atomes en les échappant. Ils seront alors traités comme des caractères normaux. + +Il existe trois manières d’échapper des caractères spéciaux. + +D’abord, on peut utiliser la barre oblique inversée (« \\ »). Son effet varie selon le caractère échappé. Les parenthèses, les espaces normaux, les caractères de tabulation, les guillemets et le caractère d’échappement lui-même sont interprétés dans leur sens littéral lorsque ce caractère les précède. Cependant, une nouvelle ligne échappée est ignorée. Dans l’exemple ci-dessus, la chaîne « Un\ programme\ en\ C » est interprété comme un seul atome et correspond à « Un programme en C ». + +Ensuite, on peut placer les caractères à échapper entre guillemets. Les parenthèses et les blancs placés entre deux guillemets reçoivent leur interprétation littérale. Par exemple, ici la chaîne « "Voici un exemple de document dans le format aplat." » forme un seul atome. + +Finalement, on peut créer un bloc en plaçant les caractères à échapper entre deux triples guillemets droits doubles (« """ »). Tous les caractères reçoivent alors leur interprétation littérale. À l’intérieur d’un bloc, il est possible d’échapper la séquence « """ » en la faisant suivre d’un point d’exclamation (« """! »). + +Tous les caractères entre la séquence d’ouverture d’un bloc et la première nouvelle ligne, inclusivement sont ignorés. C’est pour faciliter le travail de préprocesseurs, qui fonctionneront d’une manière analogue à ceux de troff. Ces préprocesseurs, contrairement aux postprocesseurs, opéreront sur l’entrée de aplat(1) plutôt que sur sa sortie. On pourra alors leur fournir de l’information sur cette première ligne. + +Les blocs sont utiles pour inclure verbatim un bloc de texte, comme un programme informatique ou un document HTML. + +### Métaformats + +À partir de cette description, il est possible — nécessaire, même — de créer un métaformat adapté à certains besoins. Ainsi, on peut imaginer une manière de représenter les métadonnées comme le fait le XML. Cette idée est empruntée au SXML. Est une métadonnée (paire attribut-valeur) un domaines et son contenu s’ils se trouvent à l’intérieur d’un domaine étiquetté avec « @ ». + +Voici l’exemple précédent converti à cette convention. + +``` +(doc + (@ (titre "Un programme en C") + (auteur "~ldp") + (date-pub "2023-11-18") + (date-mod (vide)) + (métaformat "genre-de-sxml")) + (par "Voici un exemple de document dans le format aplat.") + (lien (@ (ref "https://asteride.xyz/~ldp/exemple.txt")) + "Un exemple d’URL") + (pre +""" lang=C +#include <stdio.h> + +int +main(void) +{ + printf("Bonjour tout le monde!\n"); + return 0; +} +""" + ) + (par "Ce paragraphe affiche " (it "Bonjour tout le monde!"))) +``` + +Ici, les attributs « titre », « auteur », « date-pub », etc. portent sur le domaine nommé « doc » et l’attribut « ref » porte sur celui nommé « lien ». + +## plat(5) + +Le format plat(5) est une représentation équivalente au aplat(5), au XML, etc. + +Voici la représentation en plat du dernier exemple en aplat. + +``` +:doc: ( +:doc:@: ( +:doc:@:titre: () Un programme en C +:doc:@:auteur: () ~ldp +:doc:@:date-pub: () 2023-11-18 +:doc:@:date-mod: ( +:doc:@:date-mod:vide: () +:doc:@:date-mod: ) +:doc:@:métaformat: () genre-de-sxml +:doc:@: ) +:doc:par: () Voici un exemple de document dans le format aplat. +:doc:lien: ( +:doc:lien:@: ( +:doc:lien:@:ref: () https://asteride.xyz/~ldp/exemple.txt +:doc:lien:@: ) +:doc:lien: ) Un exemple d’URL +:doc:pre: () #include <stdio.h>\n\nint\nmain(void)\n{\n\tprintf("Bonjour tout le monde!\\n");\n\treturn 0;\n} +:doc:par: ( Ce paragraphe affiche +:doc:par:it: () Bonjour tout le monde! +:doc:par: ) +:doc: ) +``` + +On voit tout de suite pourquoi ce format n’est pas destiné à être manipulé par des humains. Il est en revanche très adapté à des outils analysant les fichiers ligne par ligne et champ par champ. + +Un document plat(5) est composé d’une série de lignes et de trois champs, séparés par des caractères de tabulation. + +Le premier champ correspond au nom du domaine. Il prend la forme de la liste des toutes les étiquettes des domaines parents, précédées d’un deux-points (« : »). La dernière étiquette est aussi suivie d’un deux-points. Il n’est pas possible d’échapper ce caractère, car plusieurs outils auraient du mal à composer avec une telle syntaxe. + +J’appelle domaine cadet le domaine le plus imbriqué. Ainsi, à la ligne commençant par « :doc:@:date-mod:vide: », le domaine cadet est « :vide: », alors qu’à la première ligne le domaine cadet est « :doc: ». + +Tout nom de domaine doit apparaître au moins une fois en position de domaine cadet, et ce même s’il est vide. Par exemple, bien que « :@: », dans le domaine « :doc:@: », ne renferme que d’autres domaines, il a droit à sa ligne, de même que « :vide: ». + +Le second champ est une liste de drapeaux. Pour l’instant — et je ne pense pas en ajouter de si tôt —, il en existe deux: la parenthèse ouvrante (« ( ») et la parenthèse fermante (« ) »), dénotant respectivement la limite initiale et la limite finale d’un domaine. + +Le troisième champ correspond au « contenu » du format aplat(5). + +plat(5) est organisé selon le principe des lignes et des champs ; les lignes sont séparées par le caractère de saut de ligne et les champs par un caractère de tabulation. Pour utiliser ces caractères au sens propre, il suffit de les échapper. On peut voir le mécanisme d’échappement à l’œuvre à la ligne commençant par « :doc:pre: » dans l’exemple ci-dessus. + +## Utilisation d’aplat(1) + +Le programme aplat(1) ne lit aucun argument en ligne de commandes : ni options ni nom de fichier ; il se contente de lire en entrée standard et d’écrire en sortie standard. + +Il s’ulitise donc de la manière suivante. + +``` +$ aplat <entree.aplat >sortie.plat +``` + +En supposant que le document aplat(5) de l’exemple précédent se trouve dans le fichier bonjour.aplat, on pourrait écrire la séquence de commandes suivantes pour en extraire le programme, le compiler et l’exécuter. + +``` +$ aplat <bonjour.aplat | grep '^:doc:pre: ' | cut -f3 | + { tr -d '\n'; echo; } | xargs -0 printf '%b' | + cc -o bonjour -x c - && ./bonjour +Bonjour tout le monde! +``` + +Ici, aplat fait passer du format aplat(5) au format plat(5) le contenu du fichier bonjour.aplat ; grep ne retient de la sortie de la commande précédente que les lignes dont l'étiquette est :doc:pre: ; cut isole le troisième champ ; tr fusionne toutes les lignes en supprimant tous les caractère de saut de ligne ; echo réinsère la dernière nouvelle ligne, que tr avait supprimé en trop ; xargs -0 printf '%b' a pour effet de déséchapper les caractères de nouvelle ligne et de tabulation, cc compile le texte résultant et, finalement, ./bonjour exécute le programme. + +## Conclusion + +J’ai créé cet utilitaire après de nombreuses heures de patentatage avec les solutions existantes. Je cherchais un format de document sémantique qui soit à la fois agréable à utiliser et qui s’intégre bien avec les utilitaires Unix. Je suis content de dire que cette recherche est maintenant terminée ; je suis satisfait de ma création. + +Je ne prétends pas que ce programme et que les formats qu’il utilise soient d’une utilité universelle. On a vu dans le dernier exemple que les chaînes de commandes qui manipulent des documents plat(5) sont assez complexes. Cet exemple est même relativement simple dans son genre, puisqu’il ignore complètement le deuxième champ, celui des parenthèses, dont on n’aurait pas pu se passer si on n’avait pas préssuposé que le champ ne contiendrait qu’un seul domaine avec l’étiquette :doc:pre:. Aussi le format plat(5) est-il mieux adapté à être manipulé dans des scripts qu’à la ligne de commandes. On peut cependant abstraire une partie de la chaîne de commandes de cet exemple et en la plaçant dans un fichier compiler_c. + +``` +$ cat compiler_c +#!/bin/sh + +grep '^:doc:pre: ' | + cut -f3 | + { tr -d '\n'; echo; } | + xargs -0 printf '%b' | + cc -o "$1" -x c - +$ chmod +x compiler_c +``` + +On peut alors composer : + +``` +$ aplat <bonjour.aplat | ./compiler_c "bonjour" && ./bonjour +Bonjour tout le monde! +``` + +J’ai de nombreuses idées de programmes auxiliaires qui permettront de faciliter l’utilisation des formats aplat(5) et plat(5). Je leur dédierai certainement d’autres articles. + +## Voir aussi + +=> /~ldp/publications/aplat/aplat.tgz Télécharger aplat(1) +=> https://git.asteride.xyz/~selve/aplat/ Dépôt git du programme. diff --git a/src/articles/avant-propos.aplat b/src/articles/avant-propos.aplat @@ -1,164 +0,0 @@ -(doc - (@ (type "article") - (titre "Avant-propos") - (date-pub "2021-12-21") - (date-mod "2023-10-23") - (auteur "Selve") - (lien (ref-std "ART_AVANT_PROPOS")) - (uuid "8473c6b7-2371-45c6-9670-041596b4c712")) - - (par -"Je tiens à présenter ce petit coin d’Internet qui m’est réservé et qui -sera le relais des curiosités et des réflexions, sérieuses ou légères, qui me -viennent et que j’estime dignes d’être partagées.") - - (par -"Je suis un étudiant au baccalauréat en linguistique et je m’intéresse -beaucoup à cette discipline. Il ne faudra donc pas se surprendre de la voir -venir garnir " - (si (@ ("#dest=web" "ce site")) - "cette capsule") -". J’ai d'ailleurs déjà quelques idées d’articles en tête. Mais la linguistique -n’accapare pas toute mon attention, car je m’intéresse aussi à l’informatique, à -l’organisation sociale, à l’actualité, etc. Autant de sujets susceptibles d’être -abordés ici. Je pourrai aussi publier des tutoriels si j’en imagine et réalise -que je croie pertinents.") - - (par -"Le ton pourra varier : dans un article, je défendrai avec vigueur une idée -qui me tient à cœur, et dans un autre, je serai ambivalent, ou peut-être même -complètement indifférent. Peu importe, je ne veux jamais qu’on me croie -véritablement convaincu. Je ne cesse de douter, mais, lorsqu’il m’arrive de ne -pas trouver de contrargument substantiel aux opinions que je formule, je peux -difficilement m’empêcher de les soutenir vigoureusement. Ce que j’espère que ce -cybercarnet pourra apporter, ce sont des idées. Je ne sais pas si elles seront -intéressantes ; je serais surpris qu’elles soient nouvelles ; mais je peux -assurer qu’elles ne seront toujours défendues que provisoirement.") - - (par -"Si jamais je suis lu — ce qui n’est pas donné —, j’aimerais beaucoup que -le lecteur me dise ce qu’il pense de ce que j’ai écrit et qu’il me corrige s’il -en sait plus que moi. C’est une chose qui m’apparait extrêmement -enrichissante.") - - (par -"Le fait que je doute implique que je suis susceptible de changer d’avis. -De même, il est probable que des idées sur un sujet dont un de mes articles -aura déjà traité me viennent après sa publication ; et il est inévitable que -quelques coguilles se glissent quelque part. Je pourrai donc modifier des -articles une semaine, un mois, des années après les avoir publiés. Il est vrai -qu’il existe un certain type de contenu qui se prête mal à ce genre de révision -; je me contenterai alors d’en corriger les coquiIles. Par souci de transparence -et parce que j’ai été influencé par une idée de Solderpunk, je rends disponible -le dépôt git à partir duquel sont générés " - (si (@ ("#dest=web" "mon site Internet et de ma capsule (puisque le contenu" - " de ce site est aussi accessible via le protocole gemini)")) - "ma capsule et de mon site Internet (puisque le contenu" - "de cette capsule est aussi accessible via http(s))") -". On pourra donc en consulter l’historique complet, et si on le veut vraiment, -en étudier les changements.") - - (par (@ (type "liens")) - (lien (@ (ref (ref-std "GIT_CAPSITE"))) - "Dépôt git")) - - (par (@ (type "liens")) - (lien (@ (ref (ref-std "EXT_SOLDERPUNK_GIT_CONTENT_DISTRIBUTION"))) - "Texte où Solderpunk présente son idée (en anglais)")) - - (par -"Je crois avoir à dire quelques mots au sujet de la structure de " - (si (@ (#dest=web "ce site")) - "cette capsule") -". Au cours de l’une de mes visites dans le cyberespace, j’ai cherché à -identifier ce qui fait les bonnes capsules et les bons sites. L’intérêt du -contenu est bien sûr le critère décisif, mais outre cela, j’ai pu trouver une -propriété structurale que j’estime importante. Je ne sais pas si je devrais la -nommer « désordre », « profondeur » ou « richesse ». Elle est caractérisée par -un réseau de pages entremêlées, peut-être disparates, qui obéissent pourtant à -leur propre structure interne, en des labyrinthes où l’on peut se perdre, en des -curiosités qu’on découvre par hasard. J’aime les capsules et les sites assez -garnis pour qu’on puisse y faire du tourisme et dont on découvre encore de -nouveaux racoins à chaque visite. Je veux qu’on puisse un jour trouver ce genre -d’atmosphère et de richesse ici. Cela prendra du temps, et ce coin risque de -rester pauvre un certain moment à cet égard.") - - (par -"J’ai donc voulu imaginer la structure de " - (si (@ (#dest=web "mon site")) - "ma capsule") -" de telle sorte qu’elle n’en contraigne pas trop inflexiblement les -possibilités de désordre. Je ne crois pas avoir atteint cet objectif -complètement. Aussi est-il possible que sa structure change un jour.") - - (par -"J’aime beaucoup les flux RSS (ou Atom, peu importe), et je veux que la -structure de " - (si (@ (#dest=web "mon site")) - "ma capsule") -" s’y prête bien. Sa colonne vertébrale sera donc un cybercarnet, dont ce texte -est d’ailleurs la première publication. Les articles y seront affichés en ordre -antéchronologique. Si ce modèle temporel est simple et utile, je soupçonne qu'il -tende à favoriser d’une part le roulement et d’autre part l’obsolescence rapide -de son contenu, dont le corolaire semble être la publication fréquente de -nouveaux articles superficiels et peu réfléchis puisqu’éphémères. Certains -vivent bien avec ce système et réussissent à faire des sites et des capsules -intéressants qui ne souffrent pas ou peu de ces écueils. Ça ne correspond -cependant pas à ce à quoi j'aspire. Je prévois donc établir, lorsque mes -publications seront suffisamment nombreuses, une organisation parallèle qui -classera les articles thématiquement. Avec le temps, ils constitueront une sorte -de wiki personnel public que je maintiendrai continuellement.") - - (par (@ (type "liens")) - (lien (@ (ref ".")) - "Cybernarnet")) - - (par -"On peut s’y abonner par l’un des flux Atom qu’on trouvera dans la page -ci-dessous.") - - (par (@ (type "liens")) - (lien (@ (ref (ref-std "PAGE_FLUX"))) - "Flux Atom")) - - (par -"À côté de ce cybercarnet, j’ai décidé de créer un florilège. Si le premier -contiendra des textes plus longs et — on l’espère — plus réfléchis, le florilège -rassemblera des textes très courts où l’on pourra trouver aussi bien des -passages que j’ai lus quelque part et qui m’ont particulièrement plu que des -pensées personnelles trop courtes ou trop peu matures pour faire l’objet d’un -article dans le cybercarnet. Ce sera en même temps pour moi une façon de -conserver ces citations et ces pensées que je ne veux pas perdre. On peut -naturellement s’attendre à ce que cette section soit alimentée plus fréquemment -que le cybercarnet.") - - (par (@ (type "liens")) - (lien (@ (ref "../florilege/")) - "Florilège")) - - (par -"Finalement, conformément à mon intention de créer un peu de de « désordre » -dans " - (si (@ (#dest=web "mon site")) - "ma capsule") -", je créerai parallèlement des pages indépendantes de ces trois sections. Pour -l'instant, cette idée est portée seule par une page contenant des liens vers -quelques capsules et sites que je trouve intéressants.") - - (par (@ (type "liens")) - (lien (@ (ref (ref-std "PAGE_A_VISITER"))) - "Capsules et sites à visiter")) - - (par -"Pendant un peu plus d'un an, " - (si (@ (#dest=web "ce site")) - "cette capsule") -" n'était disponible que par le protocole gemini. J'ai maintenant modifié mon -système de publication de manière à rendre possible la génération de fichiers -gemtext et HTML. Je n'exclus pas de l'exporter vers Gopher un jour, peut-être -bientôt.") - - (par -"Je tâche de publier le plus souvent possible, mais j’écris lentement, et -je suis parfois pris de paresse ; le rythme de mes publications n'est pas très -régulier. Je continue à viser le mois ; on verra si un jour j'y arriverai.")) diff --git a/src/articles/avant-propos.conv b/src/articles/avant-propos.conv @@ -0,0 +1,44 @@ +titre:Avant-propos +date_pub:21 décembre 2021 +date_mod:4 juin 2024 +auteur:~ldp +type:article +uuid:8473c6b7-2371-45c6-9670-041596b4c712 + +Je tiens à présenter ce petit coin d’Internet qui m’est réservé et qui sera le relais des curiosités et des réflexions, sérieuses ou légères, qui me viennent et que j’estime dignes d’être partagées. + +Je suis un étudiant au baccalauréat en linguistique et je m’intéresse beaucoup à cette discipline. Il ne faudra donc pas se surprendre de la voir venir garnir cette capsule. J’ai d'ailleurs déjà quelques idées d’articles en tête. Mais la linguistique n’accapare pas toute mon attention, car je m’intéresse aussi à l’informatique, à l’organisation sociale, à l’actualité, etc. Autant de sujets susceptibles d’être abordés ici. Je pourrai aussi publier des tutoriels si j’en imagine et réalise que je croie pertinents. + +Le ton pourra varier : dans un article, je défendrai avec vigueur une idée qui me tient à cœur, et dans un autre, je serai ambivalent, ou peut-être même complètement indifférent. Peu importe, je ne veux jamais qu’on me croie véritablement convaincu. Je ne cesse de douter, mais, lorsqu’il m’arrive de ne pas trouver de contrargument substantiel aux opinions que je formule, je peux difficilement m’empêcher de les soutenir vigoureusement. Ce que j’espère que ce cybercarnet pourra apporter, ce sont des idées. Je ne sais pas si elles seront intéressantes ; je serais surpris qu’elles soient nouvelles ; mais je peux assurer qu’elles ne seront toujours défendues que provisoirement. + +Si jamais je suis lu — ce qui n’est pas donné —, j’aimerais beaucoup que le lecteur me dise ce qu’il pense de ce que j’ai écrit et qu’il me corrige s’il en sait plus que moi. C’est une chose qui m’apparait extrêmement enrichissante. + +Le fait que je doute implique que je suis susceptible de changer d’avis. De même, il est probable que des idées sur un sujet dont un de mes articles aura déjà traité me viennent après sa publication ; et il est inévitable que quelques coguilles se glissent quelque part. Je pourrai donc modifier des articles une semaine, un mois, des années après les avoir publiés. Il est vrai qu’il existe un certain type de contenu qui se prête mal à ce genre de révision ; je me contenterai alors d’en corriger les coquiIles. Par souci de transparence et parce que j’ai été influencé par une idée de Solderpunk, je rends disponible le dépôt git à partir duquel sont générés ma capsule et de mon site Internet (puisque le contenude cette capsule est aussi accessible via http(s)). On pourra donc en consulter l’historique complet, et si on le veut vraiment, en étudier les changements. + +=> https://git.asteride.xyz/~ldp/capsite/ Dépôt git + +=> gemini://gemini.circumlunar.space/~solderpunk/gemlog/low-budget-p2p-content-distribution-with-git.gmi Texte où Solderpunk présente son idée (en anglais) + +Je crois avoir à dire quelques mots au sujet de la structure de cette capsule. Au cours de l’une de mes visites dans le cyberespace, j’ai cherché à identifier ce qui fait les bonnes capsules et les bons sites. L’intérêt du contenu est bien sûr le critère décisif, mais outre cela, j’ai pu trouver une propriété structurale que j’estime importante. Je ne sais pas si je devrais la nommer « désordre », « profondeur » ou « richesse ». Elle est caractérisée par un réseau de pages entremêlées, peut-être disparates, qui obéissent pourtant à leur propre structure interne, en des labyrinthes où l’on peut se perdre, en des curiosités qu’on découvre par hasard. J’aime les capsules et les sites assez garnis pour qu’on puisse y faire du tourisme et dont on découvre encore de nouveaux racoins à chaque visite. Je veux qu’on puisse un jour trouver ce genre d’atmosphère et de richesse ici. Cela prendra du temps, et ce coin risque de rester pauvre un certain moment à cet égard. + +J’ai donc voulu imaginer la structure de ma capsule de telle sorte qu’elle n’en contraigne pas trop inflexiblement les possibilités de désordre. Je ne crois pas avoir atteint cet objectif complètement. Aussi est-il possible que sa structure change un jour. + +J’aime beaucoup les flux RSS (ou Atom, peu importe), et je veux que la structure de ma capsule s’y prête bien. Sa colonne vertébrale sera donc un cybercarnet, dont ce texte est d’ailleurs la première publication. Les articles y seront affichés en ordre antéchronologique. Si ce modèle temporel est simple et utile, je soupçonne qu'il tende à favoriser d’une part le roulement et d’autre part l’obsolescence rapide de son contenu, dont le corolaire semble être la publication fréquente de nouveaux articles superficiels et peu réfléchis puisqu’éphémères. Certains vivent bien avec ce système et réussissent à faire des sites et des capsules intéressants qui ne souffrent pas ou peu de ces écueils. Ça ne correspond cependant pas à ce à quoi j'aspire. Je prévois donc établir, lorsque mes publications seront suffisamment nombreuses, une organisation parallèle qui classera les articles thématiquement. Avec le temps, ils constitueront une sorte de wiki personnel public que je maintiendrai continuellement. + +=> ./ Cybernarnet + +On peut s’y abonner par l’un des flux Atom qu’on trouvera dans la page ci-dessous. + +=> /~ldp/flux/ Flux Atom + +À côté de ce cybercarnet, j’ai décidé de créer un florilège. Si le premier contiendra des textes plus longs et — on l’espère — plus réfléchis, le florilège rassemblera des textes très courts où l’on pourra trouver aussi bien des passages que j’ai lus quelque part et qui m’ont particulièrement plu que des pensées personnelles trop courtes ou trop peu matures pour faire l’objet d’un article dans le cybercarnet. Ce sera en même temps pour moi une façon de conserver ces citations et ces pensées que je ne veux pas perdre. On peut naturellement s’attendre à ce que cette section soit alimentée plus fréquemment que le cybercarnet. + +=> /~ldp/florilege/ Florilège + +Finalement, conformément à mon intention de créer un peu de de « désordre » dans ma capsule, je créerai parallèlement des pages indépendantes de ces trois sections. Pour l'instant, cette idée est portée seule par une page contenant des liens vers quelques capsules et sites que je trouve intéressants. + +=> /~ldp/a_visiter. Capsules et sites à visiter + +Pendant un peu plus d'un an, cette capsule n'était disponible que par le protocole gemini. J'ai maintenant modifié mon système de publication de manière à rendre possible la génération de fichiers gemtext et HTML. Je n'exclus pas de l'exporter vers Gopher un jour, peut-être bientôt. + +Je tâche de publier le plus souvent possible, mais j’écris lentement, et je suis parfois pris de paresse ; le rythme de mes publications n'est pas très régulier. Je continue à viser le mois ; on verra si un jour j'y arriverai. diff --git a/src/articles/chute_voyelles_aymara.aplat b/src/articles/chute_voyelles_aymara.aplat @@ -1,104 +0,0 @@ -(doc - (@ (type "article") - (titre "Chute de voyelles conditionnée morphologiquement en aymara") - (date-pub "2022-01-05") - (date-mod "2023-04-07") - (auteur "Selve") - (lien (ref-std "ART_AYMARA_VOYELLES")) - (uuid "6f484b41-5262-4643-9d31-57c782a7ceab")) - - (par -"Sauf indication contraire, toute l'information qui est présentée ici vient -de Hardman (2001).") - - (par -"L'aymara est une langue indigène d'Amérique du Sud parlée principalement -aux abords du lac Titicaca, de chaque côté de la frontière séparant le Pérou de -la Bolivie. Elle est singulière à plusieurs égards et sait déstabiliser celui -qui ne connait rien de plus exotique que les langues européennes. Elle -réapparaitra assurément dans un autre article.") - - (par -"L'aymara est une langue agglutinante, c'est-à-dire que les mots qu'elle -forme sont souvent composés d'un grand nombre de petites unités porteuses de -sens appelées morphèmes. Autrement dit, ses mots tendent à être longs et -complexes. Du point de vue de la forme, ces morphèmes se répartissent en deux -classes : celle des racines et celle des suffixes. On peut, pour les besoins de -l'exposé, définir le mot aymara comme étant une racine seule ou une racine à -laquelle se sont agglutinés un ou plusieurs suffixes.") - - (par -"Par exemple, le mot « utankaña », qui signifie « être à la maison », se -compose de quatre morphèmes : « Uta », qui veut dire « maison » et qui est la -racine du mot ; « ni », qui exprime la possession ; « ka », qui convertit un nom -en verbe, avec le sens de « X est (quelque part) » ; « ña », qui convertit un -verbe en nom et qui est, en l'occurrence, à rapprocher d'une marque -d'infinitif.") - - (par -"On constate que la simple agglutination des suffixes à la racine donnerait -« utanikaña ». Or, la forme attestée est « utankaña », sans le « i », donc. -C'est ce phénomène de chute de voyelles que je veux expliquer.") - - (par -"En se combinant, plusieurs suffixes imposent la chute ou le maintien de la -voyelle qui les précède ou qui les termine. Ces règles sont entièrement -lexicales et font partie de la nature même d'un suffixe ; si quelques -régularités ont été décelées, il reste indispensable de spécifier la nature -combinatoire de chaque suffixe indépendamment de tout autre attribut. On peut -noter la chute et le maintien des voyelles par un « (C) » et un « (V) », -respectivement. Ainsi, dans l'exemple précédant, « (V)ni » impose à « uta » le -maintien de sa voyelle finale, « (C)ka » en impose la chute à « utani » et « -(V)ña » en impose le maintien à « utanka ».") - - (par -"Un petit nombre de suffixes admet de la variation. Coler et al. (2020) ont -ainsi reconnu que « pacha », « kama », « naqa » et « hama » pouvaient tantôt -faire tomber la voyelle qui les précèdent, tantôt la conserver. En outre, la -variation dialectale, bien que plutôt faible, peut venir modifier la nature -combinatoire de certains suffixes.") - - (par -"Je trouve ce phénomène franchement fantastique. Le plus intéressant est -que la nature combinatoire des suffixes peut parfois servir à en distinguer -certains qui semblent homophones lorsque pris individuellement.") - - (par -"Hardman (2001) donne l'exemple de quatre suffixes « -ta » distincts, dont -les formes ne diffèrent que par les règles combinatoires :") - - (liste - (elem "uma + (C)ta(C) + wa : umtwa (Je bois)") - (elem "uma + (V)ta(V) + wa : umatawa (Une personne soule)") - (elem "uma + (C)ta(V) + wa : umtawa (Tu bois)") - (elem "uma + (V)ta(C) + wa : umatwa (Depuis l'eau)")) - - (par -"Qu'arrive-t-il lorsque les suffixes imposent des règles contradictoires, -lorsque celui qui précède veut conserver sa voyelle finale et que celui qui suit -veut la faire chuter, ou que celui qui précède veut la faire chuter et que celui -qui suit veut la maintenir? Hardman (2021), n'aborde pas la question. En -revanche, Kim (2016) affirme que les règles spécifiant la chute ou le maintien -de la voyelle finale n'ont pas d'influence en cas de désaccord, que les caprices -du suffixe de droite ont préséance.") - - (par -"D'autres phénomènes causant la chute de voyelles existent en aymara. -Certains sont ainsi conditionnés phonologiquement ou syntaxiquement. Celui que -je viens de présenter est le plus fréquent et reste selon moi le plus -impressionnant.") - - (section "Bibliographie") - - (liste - (elem "Hardman, M. J. (2001). Aymara (Ser. Lincom studies in native american linguistics, 35). LINCOM Europa.") - (elem "Kim Y. (2016). Vowel elision and the morphophonology of dominance in Aymara. Onomázein, 33(21), 367-384.") - (elem "Coler, M., Emlen, N. Q., Banegas-Flores, E. (2020). Vowel deletion in two Aymara varieties. Italian Journal of Linguistics, 32(1), 151-174.")) - - (section "Voir aussi") - - (par (@ (type "liens")) - (lien (@ (ref "https://fr.wikipedia.org/wiki/Aymara_(langue)")) - "Page Wikipédia (la page en espagnol est plus complète)") - (lien (@ (ref "http://www.ilcanet.org/publicaciones/pdf_compendio.html")) - "Grammaire de l'aymara (en espagnol)"))) diff --git a/src/articles/chute_voyelles_aymara.conv b/src/articles/chute_voyelles_aymara.conv @@ -0,0 +1,44 @@ +titre:Chute de voyelles conditionnée morphologiquement en aymara +date_pub:5 janvier 2022 +date_mod:7 avril 2023 +auteur:~ldp +type:article +uuid:6f484b41-5262-4643-9d31-57c782a7ceab + +Sauf indication contraire, toute l'information qui est présentée ici vient de Hardman (2001). + +L'aymara est une langue indigène d'Amérique du Sud parlée principalement aux abords du lac Titicaca, de chaque côté de la frontière séparant le Pérou de la Bolivie. Elle est singulière à plusieurs égards et sait déstabiliser celui qui ne connait rien de plus exotique que les langues européennes. Elle réapparaitra assurément dans un autre article. + +L'aymara est une langue agglutinante, c'est-à-dire que les mots qu'elle forme sont souvent composés d'un grand nombre de petites unités porteuses de sens appelées morphèmes. Autrement dit, ses mots tendent à être longs et complexes. Du point de vue de la forme, ces morphèmes se répartissent en deux classes : celle des racines et celle des suffixes. On peut, pour les besoins de l'exposé, définir le mot aymara comme étant une racine seule ou une racine à laquelle se sont agglutinés un ou plusieurs suffixes. + +Par exemple, le mot « utankaña », qui signifie « être à la maison », se compose de quatre morphèmes : « Uta », qui veut dire « maison » et qui est la racine du mot ; « ni », qui exprime la possession ; « ka », qui convertit un nom en verbe, avec le sens de « X est (quelque part) » ; « ña », qui convertit un verbe en nom et qui est, en l'occurrence, à rapprocher d'une marque d'infinitif. + +On constate que la simple agglutination des suffixes à la racine donnerait « utanikaña ». Or, la forme attestée est « utankaña », sans le « i », donc. C'est ce phénomène de chute de voyelles que je veux expliquer. + +En se combinant, plusieurs suffixes imposent la chute ou le maintien de la voyelle qui les précède ou qui les termine. Ces règles sont entièrement lexicales et font partie de la nature même d'un suffixe ; si quelques régularités ont été décelées, il reste indispensable de spécifier la nature combinatoire de chaque suffixe indépendamment de tout autre attribut. On peut noter la chute et le maintien des voyelles par un « (C) » et un « (V) », respectivement. Ainsi, dans l'exemple précédant, « (V)ni » impose à « uta » le maintien de sa voyelle finale, « (C)ka » en impose la chute à « utani » et « (V)ña » en impose le maintien à « utanka ». + +Un petit nombre de suffixes admet de la variation. Coler et al. (2020) ont ainsi reconnu que « pacha », « kama », « naqa » et « hama » pouvaient tantôt faire tomber la voyelle qui les précèdent, tantôt la conserver. En outre, la variation dialectale, bien que plutôt faible, peut venir modifier la nature combinatoire de certains suffixes. + +Je trouve ce phénomène franchement fantastique. Le plus intéressant est que la nature combinatoire des suffixes peut parfois servir à en distinguer certains qui semblent homophones lorsque pris individuellement. + +Hardman (2001) donne l'exemple de quatre suffixes « -ta » distincts, dont les formes ne diffèrent que par les règles combinatoires : + +* uma + (C)ta(C) + wa : umtwa (Je bois) +* uma + (V)ta(V) + wa : umatawa (Une personne soule) +* uma + (C)ta(V) + wa : umtawa (Tu bois) +* uma + (V)ta(C) + wa : umatwa (Depuis l'eau) + +Qu'arrive-t-il lorsque les suffixes imposent des règles contradictoires, lorsque celui qui précède veut conserver sa voyelle finale et que celui qui suit veut la faire chuter, ou que celui qui précède veut la faire chuter et que celui qui suit veut la maintenir? Hardman (2021), n'aborde pas la question. En revanche, Kim (2016) affirme que les règles spécifiant la chute ou le maintien de la voyelle finale n'ont pas d'influence en cas de désaccord, que les caprices du suffixe de droite ont préséance. + +D'autres phénomènes causant la chute de voyelles existent en aymara. Certains sont ainsi conditionnés phonologiquement ou syntaxiquement. Celui que je viens de présenter est le plus fréquent et reste selon moi le plus impressionnant. + +## Bibliographie + +* Hardman, M. J. (2001). Aymara (Ser. Lincom studies in native american linguistics, 35). LINCOM Europa. +* Kim Y. (2016). Vowel elision and the morphophonology of dominance in Aymara. Onomázein, 33(21), 367-384. +* Coler, M., Emlen, N. Q., Banegas-Flores, E. (2020). Vowel deletion in two Aymara varieties. Italian Journal of Linguistics, 32(1), 151-174. + +## Voir aussi + +=> https://fr.wikipedia.org/wiki/Aymara_(langue) Page Wikipédia (la page en espagnol est plus complète) +=> http://www.ilcanet.org/publicaciones/pdf_compendio.html Grammaire de l'aymara (en espagnol) diff --git a/src/articles/curiosites_catalan.aplat b/src/articles/curiosites_catalan.aplat @@ -1,434 +0,0 @@ -(doc - (@ (type "article") - (titre "Quelques curiosités du catalan") - (date-pub "2022-09-11") - (date-mod "2023-04-07") - (auteur "Selve") - (lien (ref-std "ART_CATALAN_CURIOSITES")) - (uuid "96585df5-41e7-4910-98b3-7ffc503e114c")) - - (par -"Devant l'immense diversité des langues du monde, le francophone ne se doute -peut-être pas que le catalan, langue avec laquelle le français partage pourtant -de nombreux traits linguistiques, est rempli de curiosités capables de -l'émerveiller. Il est vrai que les deux langues se ressemblent beaucoup. Non -seulement sont-elles toutes deux issues de la même mère, le latin, mais leur -évolution a pris un cours semblable : bon nombre des changements linguistiques -qui ont modelé l'une ont aussi modelé l'autre.") - - (par -"C'est d'ailleurs avant tout en raison d'intérêts d'ordre politique que -j'ai moi-même commencé à apprendre le catalan : la Catalogne vit en effet une -période fort intéressante sur ce plan. Son histoire ne manque pas d'intérêt non -plus. Et bien que j'étudie la linguistique, c'était moins en sa qualité de -langue que comme porte d'entrée vers sa culture que le catalan m'attirait. -Cependant, dès le premier jour de mon apprentissage, et régulièrement par la -suite, j'ai découvert une foule de faits sur la langue, anecdotiques ou -fondamentaux, qui n'ont pas cessé de m'enchanter. Cette langue ne présente -peut-être pas l'exotisme des médiatifs de l'aymara, des tons du cantonais ou des -racines trilitères de l'hébreu, mais ce n'est pas pour autant que le francophone -n'a rien à y trouver d'intéressant. Au contraire, la proximité du catalan et du -français permet justement d'explorer plus facilement et plus profondément des -caractéristiques qui auraient demandé de longues explications eussent-elles été -présentes dans une langue aux structures plus dépaysantes et au vocabulaire -moins familier. Le regard sur une langue sœur permet en outre la comparaison et -peut ainsi servir à exposer des pans peu connus de l'histoire de notre propre -langue.") - - (par -"Je veux présenter quatre aspects du catalan qui risquent d'intéresser le -francophone : l'auxiliaire « anar » du passé périphrastique, le forclusif de -négation « pas », l'influence de l'accent tonique dans la phonologie catalane et -une manière unique de dire l'heure.") - - (par -"À l'image de la plupart des autres langues, le catalan n'est pas homogène -et fédère un ensemble de variétés parlées notamment à Andorre, à Valence" - (note - (par -"Certains affirment que la variété de catalan parlée à Valence est une langue -distincte, le valencien. Je crois cependant que cette distinction n'est pas -justifiée sur le plan linguistique.")) -", aux Îles Baléars, en Catalogne et à L'Alguer. Si elles partagent toutes les -mêmes traits fondamentaux qui témoignent de l'appartenance à une même langue, -elles divergent en certains points. Mais, je n'en dirai pas plus, car la -dialectologie catalane est un thème trop vaste pour cet article. Je me -contenterai d'avertir le lecteur que c'est à la variété centrale, parlée en -Catalogne" - (note - (par -"Il y a d'autres variétés parlées en Catalogne, la nord-occidental, par -exemple.")) -", que la plupart de traits que j'exposerai ici s'appliqueront.") - - (par (@ (type "liens")) - (lien (@ (ref "https://fr.wikipedia.org/wiki/Dialectologie_de_la_langue_catalane")) - "Article de Wikipédia sur la dialectologie catalane")) - - (par -"Avant de poursuivre, je tiens à insister sur le fait que le catalan n'est -pas ma langue maternelle. Je me suis appuyé sur des ouvrages de référence et sur -des œuvres de la litérature catalans, mais il n'est pas impossible que des -erreurs se soient malencontreusement glissées dans ce texte. Si ce devait être -le cas, je prie le lecteur de me le faire savoir.") - - (section "Passé périphrastique") - - (par -"En français et dans plusieurs autres langues, l'auxiliaire du verbe -correspondant à « aller » marque le futur. Nous avons ainsi « Je vais manger », -« Voy a comer » (espagnol), « I am going to eat » (anglais), etc. En catalan, -c'est toutefois le passé que l'auxiliaire « anar » exprime : « Vaig menjar » ne -signifie pas « Je vais manger », mais bien « J'ai mangé ».") - - (par -"Le passé périphrastique relate une action passée, réalisée au sein d'un -cadre temporel envisagé comme un tout. En ce sens, il s'oppose à l'imparfait -(imperfet), qui a la même valeur que son équivalent français. Là où l'imparfait -installe le contexte " - (div (@ (citation)) "« quan l'Alba ja " (it "deixava") " el cistellet… »") -", le passé périphrastique le meuble par les actions qui s'y -produisent " - (div (@ (citation)) "« …el cel i la terra " (it "van començar") " a vibrar »") -".") - - (liste - (elem (@ (citation (auteur "Manuel de Pedrolo") - (date "2013"))) -"I aleshores, quan l'Alba ja deixava el cistellet per tal de llançar-se a -l'aigua […], el cel i la terra van començar a vibrar amb una mena de trepidació -sorda que s'anava accentuant.") - (elem (@ (citation)) -"Et alors, quand Aube délaissait déjà le panier afin de se lancer à l'eau […], -le ciel et la terre comencèrent à trembler d'une sorte d'émoi qui allait en -s'accentuant.")) - - (par -"Le passé périphrastique s'oppose également au passat d'indicatiu, plus ou -moins analogue au passé composé français. Ces deux temps verbaux s'utilisent -pour présenter comme un tout insécable une action passée. La différence qui les -distingue réside dans la distance temporelle entre cette action et son -énonciation. Si l'action et l'énonciation font partie d'une même période -temporelle du point de vu du discours, il faut employer le passat d'indicatiu ; -sinon, c'est du passé périphrastique qu'il faut se servir. Notons au passage -qu'on utilise toujours le passat d'indicatiu lorsque que l'énonciation à lieu le -même jour que l'action qu'elle relate.") - - (liste - (elem -"La setmana passada, va quedar amb uns amics. (La semaine passée, il est sorti -avec des amis.)") - (elem -"Aquesta setmana, ha quedat amb uns amics. (Cette semaine, il est sorti avec des -amis.)")) - - (liste - (elem -"L'any 1908, va néixer la Mercè Rodoreda. (Mercè Rodoreda est née en 1908.)") - (elem -"Aquest any, ha nascut el seu fill. (Son fils est né cette année.)")) - - (par -"Le fait que le catalan utilise ainsi l'auxiliaire « aller » (« anar ») ne -manque pas d'étonner ; puisqu'il désigne étymologiquement un mouvement vers -quelque chose, on l'imagine plus facilement récupéré comme marqueur du futur que -comme marqueur de passé. Cette particularité catalane n'est pourtant pas -complètement étrangère à l'usage français. On rencontre en effet souvent, dans -les narrations d'historiens notamment, des verbes conjugués au présent et au -futur qui expriment indubitablement le passé.") - - (par -"Voici la transcription d'un extrait de l'épisode d'Aujourd'hui l'Histoire -du 3 mars 2020, Félix Leclerc, le militant :") - - (par - (@ (citation)) -"Mais vers la fin des années 60, il va rencontrer sa nouvelle épouse, Gaëtane -Morin, il va beaucoup fréquenter les cercles péquistes et on sent qu'il se remet -à l'écriture de chansons.") - - (par -"Dans cet extrait, la forme aller + infinitif exprime le passé. À la place, -on aurait très bien pu dire : « il a rencontré sa nouvelle épouse », « il a -beaucoup fréquenté les cercles péquistes », etc. Cet usage du futur simple pour -exprimer le passé s'appelle futur historique.") - - (par -"Remarquons finalement que le futur historique est un effet de style que se -distingue de la manière standard d'exprimer le passé parfait en français, le -passé composé. En catalan, il n'est pas question de style, car le passé -périphrastique est la manière standard d'exprimer le passé parfait.") - - (par -"Le processus qui a mené au futur historique en français est peut-être -complètement étrangé à celui qui a mené au passé périphrastique catalan. Je veux -simplement montrer que la voie catalane n'est pas complètement étrangère à -l'usage français. Peut-être augmenterai-je un jour cet article de précisions -diachroniques.") - - (section "Influence de l'accent tonique") - - (par -"L'accent tonique joue un rôle bien plus important en catalan qu'en -français. D'abord, il est pertinent sur le plan phonologique, c'est-à-dire qu'il -peu servir à distinguer deux mots autrement identiques" - (note - (par -"Je ne parle pas ici de l'accent graphique qui sert à distinguer à -l'écrit deux homophones (« es », le pronom réflexif « se » et « és », « il -est », par exemple). Je parle de l'accent tel qu'il est prononcé.")) -".") - - (par -"Note : dans les transcriptions suivantes, le point (.) sépare les -syllabes ; l'apostrophe (') précède la syllabe accentuée et remplace, s'il y a -lieu, le point. Lorsque la prononciation est donnée entre des barre-obliques -(//), il s'agit d'une transcription phonémique, c'est-à-dire qu'elle représente -les sons tels que les locuteurs pensent intuitivement les prononcer ; -lorsqu'elle est donnée entre crochets ([]), il s'agit d'une transcription -phonétique, c'est-à-dire qu'elle représente les sons tels qu'ils sont -prononcés" - (note - (par -"La différence entre les représentations phonétiques et phonémiques -s'illustre bien par l'exemple suivant. La plupart des locuteurs du français -québécois, bien qu'ils remarquent à peu près tous une différence par rapport aux -autres variétés de français, n'ont pas conscience de prononcer spécifiquement -[pətsi] plutôt que [pəti] le mot « petit ». Il s'agit d'une différence -phonétique, mais pas phonémique. La transcription phonétique de ces deux -prononciations est la même, /pəti/.")) -".") - - (liste - (elem "Brunzir /brun'zi/ " (it "(bourdonner)")) - (elem "Brunzi /'brun.zi/ " (it "(que je bourdonne/qu'il bourdonne)"))) - - (liste - (elem "Donar /dɔ'na/ " (it "(donner)")) - (elem "Dona /'dɔ.na/ " (it "(il/elle donne)"))) - - (liste - (elem "Secretaria /se.cre.ta'ri.a/ " (it "(secrétariat)")) - (elem "Secretària /se.cre'ta.ri.a/ " (it "(secrétaire)"))) - - (par -"La distinction entre /o/, /ɔ/ et /u/ s'efface en syllabe non -accentuée : dans ce contexte, tous se prononcent [u].") - - (liste - (elem "Donar [du'na]") - (elem "Dona ['dɔ.nə]")) - - (par -"Voici d'autres exemples, tirés de (IEC, 2018).") - - (liste - (elem "Fosc ['fosk] " (it "(sombre)")) - (elem "Foscor [fus'ko] " (it "(obscurité)"))) - - (liste - (elem "Poc ['pɔc] " (it "(peu)")) - (elem "Poquet [pu'kɛt] " (it "(petit peu)"))) - - (par -"Un phénomène analogue se produit avec /a/, /e/ et /ɛ/, qui se centralisent -tous en [ə] en syllabes non-accentuées.") - - (liste - (elem "Secretaria [sə.crə.tə'ri.ə]") - (elem "Secretària [sə.crə'ta.ri.ə]")) - - (par -"Voici d'autres exemples, tirés également de (IEC, 2018).") - - (liste - (elem "Carrer [kər're] " (it "(rue)")) - (elem "Carreró [kər.rə'ro] " (it "(ruelle)"))) - - (liste - (elem "Mel ['mɛl] " (it "(miel)")) - (elem "Melós [mə'los] " (it "(mielleux)"))) - - (liste - (elem "Cantar [kən'ta] " (it "(chanter)")) - (elem "Canta ['kan.tə] " (it "(il/elle chante)"))) - - (section "« Pas »") - - (par -"Utiliser deux mots plutôt qu'un pour marquer la négation est un trait -caractéristique du français : nous disons « Je " (it ne) " veux " (it pas) " ». -J'ai été très surpris d'apprendre que catalan lui aussi possède cette double -marque de la négation. Seulement, à la différence du français, le « pas » y est -facultatif. Les phrases « No vull » et « No vull pas » sont toutes deux -grammaticales.") - - (par -"Ces deux phrases n'ont cependant pas exactement le même sens. La première -est équivalente à la phrase en français ; la seconde met davantage l'accent sur -le fait de ne pas vouloir. Elle est plus près de « Je ne veux pas du tout ».") - - (par -"Le français réservait il y a fort longtemps un usage bien différent au -forclusif « pas ». Cette particule servait à renforcer la négation et était à -l'origine beaucoup plus chargée sémantiquement. Dire « Je ne marche pas » -signifiait alors « Je ne marche pas même un pas » et dire « Je n'écris point » -signifiait « Je n'écris pas même un point ». L'inventaire de forclusifs était -alors beaucoup plus riche, et l'on disait volontiers « Je ne bois goutte » et -« Je ne mange mie ».") - - (par -"Avec le temps, « pas » et « point » se sont généralisés et les autres -forclusifs sont tombés en désuétude. Leurs sens se sont aussi progressivement -effacés, jusqu'à ce qu'ils deviennent interchangeables et qu'ils ne gardent plus -rien du pas qu'on marche et du point qu'on écrit.") - - (par -"À cette époque ces forclusifs avaient à peu près le même usage que celui -qui prévaut en catalan. On ne les employait que pour renforcer un affirmation et -on les laissait de côté le reste du temps.") - - (par -"En quête d'expressivité plus grande, les francophones se mirent à employer -ces forclusifs de plus en plus souvent, en particulier « pas ». Mais leur sens -ternissait de plus en plus à mesure que leur utilisation s'intensifiait, la -force d'une expression venant beaucoup de la parcimonie avec laquelle on -l'emploie ; c'est un principe d'économie. Avec le temps, « pas » en est venu à -être si fréquent qu'il est devenu obligatoire. On appelle grammaticalisation ce -processus par lequel un simple mot de vocabulaire entre dans la grammaire.") - - (par -"Et maintenant, c'est le marqueur de négation originel « ne » qui est -devenu facultatif et qui est en voie de disparition, car on entend plus souvent -« Je veux pas » que « Je ne veux pas ».") - - (par -"Les Catalans ont su rester parcimonieux, et dans leur langue « pas » -conserve encore toute sa force" - (note - (par -"J'ai entendu à deux reprises, dans une vidéo d'"(it "Easy Catalan")", une même -personne dire « gota » (goute) : la première fois seule, avec le sens de « pas -du tout », et la deuxième fois au sein d'une phrase, pour renforcer la négation -(« Que no hom som gota ».). Je ne sais pas si le phénomène est courant ; c'est -la première (et seule) fois que j'ai remarqué un tel usage. En tout cas, ça -témoigne de la conservation d'un élément que le français a délaissé. Belle -richesse.") - (par (@ (type "liens")) - (lien (@ (ref -"https://www.youtube.com/watch?v=jQvoY5cH1nk")) "Vidéo en question"))) -". Il est vrai que le catalan septentrional (aussi appelé roussillonnais), parlé -en Catalogne-Nord, a tout comme le français supprimé la particule de négation -originelle correspondant à « ne » et que « pas » y est obligatoire.") - - (section "Dire l'heure") - - (par -"Plusieurs façons de dire l'heure cohabitent dans les pays catalans, mais -la plus traditionnelle est appelée « sistema de campanar ». Elle doit son nom -aux clochers des églises dont les tintements, à tous les quarts d'heure, servent -de repère.") - - (par -"Contrairement au français, l'expression des heures requiert l'article -défini. Le mot « hora » (« heure ») n'est pas prononcé, mais étant sous-entendu, -l'article est féminin. De plus, l'article est singulier lorsque l'heure en -question est 1h et pluriel dans les autres cas.") - - (liste - (elem "Avui, m'he aixecat a les vuit.") - (elem "Aujourd'hui je me suis levé à huit heures "(it "(aux huit)")".")) - - (liste - (elem "Ja és la una.") - (elem "Il est déjà une heure " (it "(la une)")".")) - - (par -"Le sistema de campanar admet deux subdivisions de l'heure. D'abord le -quart d'heure. Il s'additionne aux heures, mais le fait d'une manière assez -singulière. Mieux vaut d'abord présenter quelques exemples.") - - (liste - (elem "Un quart de vuit.") - (elem "7h15. " (it "(un quart de huit)")".")) - - (liste - (elem "Tres quarts de deu.") - (elem "9h45. "(it "(trois quarts de dix)")".")) - - (liste - (elem "Dos quarts de dues.") - (elem "1h30. "(it "(deux quarts de deux)")".")) - - (par -"Nous voyons que l'heure exprimée est systématiquement décalée d'une heure -par rapport à ce qu'aurait donné une simple addition des heures et des quarts -d'heure. C'est que pour savoir ce que signifie « Un quart de vuit », il ne faut -pas additionner 1 quart d'heure à 8h, mais 1 quart d'heure à la huitième heure, -qui est 7h. En effet, à minuit commence la première heure, à une heure la -deuxième, à deux heures la troisième, etc. Ainsi, la calcul qu'il faut faire est -le suivant.") - - (liste - (elem "Un quart de vuit.") - (elem "Un quart d'heure + la huitième heure = 7h15.")) - - (liste - (elem "Tres quarts de deu.") - (elem "Trois quarts d'heure + la dixième heure = 9h45.")) - - (liste - (elem "Dos quarts de dues.") - (elem "Deux quarts d'heure + la deuxième heure = 1h30.")) - - (par -"Afin d'être plus précis, le système permet l'addition et la soustraction -de minutes.") - - (liste - (elem "Falten deu minuts per a les quatre.") - (elem "3h50. "(it "(Il manque dix minutes pour les quatre)")".")) - - (liste - (elem "És un quart i tres de set.") - (elem "6h18. " (it "(Il est un qurat et trois de sept)")".")) - - (par -"La deuxième subdivision de l'heure est le mig quart " (it "(demi quart -d'heure)")", équivalent à sept minutes et demie.") - - (liste - (elem "Tres quarts i mig d'onze.") - (elem "10h52. " (it "(Trois quarts et demi d'onze)")".")) - - (liste - (elem "Mig quart de nou.") - (elem "8h07. " (it "(Demi quart de neuf)")".")) - - (par -"Le site internet Softcatala, qui propose une foule d'outils en lien avec -le catalan, rend disponible en ligne un programme permettant de convertir -l'heure sous la forme HH:MM en mots, et ce pour trois systèmes différents, dont -le sistema de camapanar.") - - (par (@ (type "liens")) - (lien (@ (ref "https://www.softcatala.org/hora-en-catala/")) - "L'hora en català")) - - (section "Conclusion") - - (par -"Voici donc quatre faits du catalan que je trouve très intéressants et qui -contribuent à en faire une langue unique. Il y en a bien entendu beaucoup -d'autres, et je n'exclue pas d'augmenter au jour cet article d'autres -curiosités.") - - (encrage (@ (id "notes"))) - - (section "Bibliographie") - - (liste - (elem "Institut d'Estudis Catalans (IEC). (2016). Gramàtica de la llengua catalana.") - (elem "Institut d'Estudis Catalans (IEC). (2018). Gramàtica essential de la llengua catalana.") - (elem "Institut d'Estudis Catalans (IEC). (2019). Gramàtica bàsica i d'ús de la llengua catalana.") - (elem "De Pedrolo, M. (2013). Mecanoscrit del segon origen. Edicions 62."))) diff --git a/src/articles/curiosites_catalan.conv b/src/articles/curiosites_catalan.conv @@ -0,0 +1,188 @@ +titre:Quelques curiosités du catalan +date_pub:11 septembre 2022 +date_mod:7 avril 2023 +auteur:~ldp +type:article +uuid:96585df5-41e7-4910-98b3-7ffc503e114c + +Devant l'immense diversité des langues du monde, le francophone ne se doute peut-être pas que le catalan, langue avec laquelle le français partage pourtant de nombreux traits linguistiques, est rempli de curiosités capables de l'émerveiller. Il est vrai que les deux langues se ressemblent beaucoup. Non seulement sont-elles toutes deux issues de la même mère, le latin, mais leur évolution a pris un cours semblable : bon nombre des changements linguistiques qui ont modelé l'une ont aussi modelé l'autre. + +C'est d'ailleurs avant tout en raison d'intérêts d'ordre politique que j'ai moi-même commencé à apprendre le catalan : la Catalogne vit en effet une période fort intéressante sur ce plan. Son histoire ne manque pas d'intérêt non plus. Et bien que j'étudie la linguistique, c'était moins en sa qualité de langue que comme porte d'entrée vers sa culture que le catalan m'attirait. Cependant, dès le premier jour de mon apprentissage, et régulièrement par la suite, j'ai découvert une foule de faits sur la langue, anecdotiques ou fondamentaux, qui n'ont pas cessé de m'enchanter. Cette langue ne présente peut-être pas l'exotisme des médiatifs de l'aymara, des tons du cantonais ou des racines trilitères de l'hébreu, mais ce n'est pas pour autant que le francophone n'a rien à y trouver d'intéressant. Au contraire, la proximité du catalan et du français permet justement d'explorer plus facilement et plus profondément des caractéristiques qui auraient demandé de longues explications eussent-elles été présentes dans une langue aux structures plus dépaysantes et au vocabulaire moins familier. Le regard sur une langue sœur permet en outre la comparaison et peut ainsi servir à exposer des pans peu connus de l'histoire de notre propre langue. + +Je veux présenter quatre aspects du catalan qui risquent d'intéresser le francophone : l'auxiliaire « anar » du passé périphrastique, le forclusif de négation « pas », l'influence de l'accent tonique dans la phonologie catalane et une manière unique de dire l'heure. + +À l'image de la plupart des autres langues, le catalan n'est pas homogène et fédère un ensemble de variétés parlées notamment à Andorre, à Valence[1], aux Îles Baléars, en Catalogne et à L'Alguer. Si elles partagent toutes les mêmes traits fondamentaux qui témoignent de l'appartenance à une même langue, elles divergent en certains points. Mais, je n'en dirai pas plus, car la dialectologie catalane est un thème trop vaste pour cet article. Je me contenterai d'avertir le lecteur que c'est à la variété centrale, parlée en Catalogne[2], que la plupart de traits que j'exposerai ici s'appliqueront. + +=> https://fr.wikipedia.org/wiki/Dialectologie_de_la_langue_catalane Article de Wikipédia sur la dialectologie catalane + +Avant de poursuivre, je tiens à insister sur le fait que le catalan n'est pas ma langue maternelle. Je me suis appuyé sur des ouvrages de référence et sur des œuvres de la litérature catalans, mais il n'est pas impossible que des erreurs se soient malencontreusement glissées dans ce texte. Si ce devait être le cas, je prie le lecteur de me le faire savoir. + +## Passé périphrastique + +En français et dans plusieurs autres langues, l'auxiliaire du verbe correspondant à « aller » marque le futur. Nous avons ainsi « Je vais manger », « Voy a comer » (espagnol), « I am going to eat » (anglais), etc. En catalan, c'est toutefois le passé que l'auxiliaire « anar » exprime : « Vaig menjar » ne signifie pas « Je vais manger », mais bien « J'ai mangé ». + +Le passé périphrastique relate une action passée, réalisée au sein d'un cadre temporel envisagé comme un tout. En ce sens, il s'oppose à l'imparfait (imperfet), qui a la même valeur que son équivalent français. Là où l'imparfait installe le contexte « quan l'Alba ja deixava el cistellet… », le passé périphrastique le meuble par les actions qui s'y produisent « …el cel i la terra van començar a vibrar ». + +* I aleshores, quan l'Alba ja deixava el cistellet per tal de llançar-se a l'aigua […], el cel i la terra van començar a vibrar amb una mena de trepidació sorda que s'anava accentuant. +* Et alors, quand Aube délaissait déjà le panier afin de se lancer à l'eau […], le ciel et la terre comencèrent à trembler d'une sorte d'émoi qui allait en s'accentuant. + +Le passé périphrastique s'oppose également au passat d'indicatiu, plus ou moins analogue au passé composé français. Ces deux temps verbaux s'utilisent pour présenter comme un tout insécable une action passée. La différence qui les distingue réside dans la distance temporelle entre cette action et son énonciation. Si l'action et l'énonciation font partie d'une même période temporelle du point de vu du discours, il faut employer le passat d'indicatiu ; sinon, c'est du passé périphrastique qu'il faut se servir. Notons au passage qu'on utilise toujours le passat d'indicatiu lorsque que l'énonciation à lieu le même jour que l'action qu'elle relate. + +* La setmana passada, va quedar amb uns amics. (La semaine passée, il est sorti avec des amis.) +* Aquesta setmana, ha quedat amb uns amics. (Cette semaine, il est sorti avec des amis.) + +* L'any 1908, va néixer la Mercè Rodoreda. (Mercè Rodoreda est née en 1908.) +* Aquest any, ha nascut el seu fill. (Son fils est né cette année.) + +Le fait que le catalan utilise ainsi l'auxiliaire « aller » (« anar ») ne manque pas d'étonner ; puisqu'il désigne étymologiquement un mouvement vers quelque chose, on l'imagine plus facilement récupéré comme marqueur du futur que comme marqueur de passé. Cette particularité catalane n'est pourtant pas complètement étrangère à l'usage français. On rencontre en effet souvent, dans les narrations d'historiens notamment, des verbes conjugués au présent et au futur qui expriment indubitablement le passé. + +Voici la transcription d'un extrait de l'épisode d'Aujourd'hui l'Histoire du 3 mars 2020, Félix Leclerc, le militant : + +Mais vers la fin des années 60, il va rencontrer sa nouvelle épouse, Gaëtane Morin, il va beaucoup fréquenter les cercles péquistes et on sent qu'il se remet à l'écriture de chansons. + +Dans cet extrait, la forme aller + infinitif exprime le passé. À la place, on aurait très bien pu dire : « il a rencontré sa nouvelle épouse », « il a beaucoup fréquenté les cercles péquistes », etc. Cet usage du futur simple pour exprimer le passé s'appelle futur historique. + +Remarquons finalement que le futur historique est un effet de style que se distingue de la manière standard d'exprimer le passé parfait en français, le passé composé. En catalan, il n'est pas question de style, car le passé périphrastique est la manière standard d'exprimer le passé parfait. + +Le processus qui a mené au futur historique en français est peut-être complètement étrangé à celui qui a mené au passé périphrastique catalan. Je veux simplement montrer que la voie catalane n'est pas complètement étrangère à l'usage français. Peut-être augmenterai-je un jour cet article de précisions diachroniques. + +## Influence de l'accent tonique + +L'accent tonique joue un rôle bien plus important en catalan qu'en français. D'abord, il est pertinent sur le plan phonologique, c'est-à-dire qu'il peu servir à distinguer deux mots autrement identiques[3]. + +Note : dans les transcriptions suivantes, le point (.) sépare les syllabes ; l'apostrophe (') précède la syllabe accentuée et remplace, s'il y a lieu, le point. Lorsque la prononciation est donnée entre des barre-obliques (//), il s'agit d'une transcription phonémique, c'est-à-dire qu'elle représente les sons tels que les locuteurs pensent intuitivement les prononcer ; lorsqu'elle est donnée entre crochets ([]), il s'agit d'une transcription phonétique, c'est-à-dire qu'elle représente les sons tels qu'ils sont prononcés[4]. + +* Brunzir /brun'zi/ (bourdonner) +* Brunzi /'brun.zi/ (que je bourdonne/qu'il bourdonne) + +* Donar /dɔ'na/ (donner) +* Dona /'dɔ.na/ (il/elle donne) + +* Secretaria /se.cre.ta'ri.a/ (secrétariat) +* Secretària /se.cre'ta.ri.a/ (secrétaire) + +La distinction entre /o/, /ɔ/ et /u/ s'efface en syllabe non accentuée : dans ce contexte, tous se prononcent [u]. + +* Donar [du'na] +* Dona ['dɔ.nə] + +Voici d'autres exemples, tirés de (IEC, 2018). + +* Fosc ['fosk] (sombre) +* Foscor [fus'ko] (obscurité) + +* Poc ['pɔc] (peu) +* Poquet [pu'kɛt] (petit peu) + +Un phénomène analogue se produit avec /a/, /e/ et /ɛ/, qui se centralisent tous en [ə] en syllabes non-accentuées. + +* Secretaria [sə.crə.tə'ri.ə] +* Secretària [sə.crə'ta.ri.ə] + +Voici d'autres exemples, tirés également de (IEC, 2018). + +* Carrer [kər're] (rue) +* Carreró [kər.rə'ro] (ruelle) + +* Mel ['mɛl] (miel) +* Melós [mə'los] (mielleux) + +* Cantar [kən'ta] (chanter) +* Canta ['kan.tə] (il/elle chante) + +## « Pas » + +Utiliser deux mots plutôt qu'un pour marquer la négation est un trait caractéristique du français : nous disons « Je ne veux pas  ». J'ai été très surpris d'apprendre que catalan lui aussi possède cette double marque de la négation. Seulement, à la différence du français, le « pas » y est facultatif. Les phrases « No vull » et « No vull pas » sont toutes deux grammaticales. + +Ces deux phrases n'ont cependant pas exactement le même sens. La première est équivalente à la phrase en français ; la seconde met davantage l'accent sur le fait de ne pas vouloir. Elle est plus près de « Je ne veux pas du tout ». + +Le français réservait il y a fort longtemps un usage bien différent au forclusif « pas ». Cette particule servait à renforcer la négation et était à l'origine beaucoup plus chargée sémantiquement. Dire « Je ne marche pas » signifiait alors « Je ne marche pas même un pas » et dire « Je n'écris point » signifiait « Je n'écris pas même un point ». L'inventaire de forclusifs était alors beaucoup plus riche, et l'on disait volontiers « Je ne bois goutte » et « Je ne mange mie ». + +Avec le temps, « pas » et « point » se sont généralisés et les autres forclusifs sont tombés en désuétude. Leurs sens se sont aussi progressivement effacés, jusqu'à ce qu'ils deviennent interchangeables et qu'ils ne gardent plus rien du pas qu'on marche et du point qu'on écrit. + +À cette époque ces forclusifs avaient à peu près le même usage que celui qui prévaut en catalan. On ne les employait que pour renforcer un affirmation et on les laissait de côté le reste du temps. + +En quête d'expressivité plus grande, les francophones se mirent à employer ces forclusifs de plus en plus souvent, en particulier « pas ». Mais leur sens ternissait de plus en plus à mesure que leur utilisation s'intensifiait, la force d'une expression venant beaucoup de la parcimonie avec laquelle on l'emploie ; c'est un principe d'économie. Avec le temps, « pas » en est venu à être si fréquent qu'il est devenu obligatoire. On appelle grammaticalisation ce processus par lequel un simple mot de vocabulaire entre dans la grammaire. + +Et maintenant, c'est le marqueur de négation originel « ne » qui est devenu facultatif et qui est en voie de disparition, car on entend plus souvent « Je veux pas » que « Je ne veux pas ». + +Les Catalans ont su rester parcimonieux, et dans leur langue « pas » conserve encore toute sa force[5]. Il est vrai que le catalan septentrional (aussi appelé roussillonnais), parlé en Catalogne-Nord, a tout comme le français supprimé la particule de négation originelle correspondant à « ne » et que « pas » y est obligatoire. + +## Dire l'heure + +Plusieurs façons de dire l'heure cohabitent dans les pays catalans, mais la plus traditionnelle est appelée « sistema de campanar ». Elle doit son nom aux clochers des églises dont les tintements, à tous les quarts d'heure, servent de repère. + +Contrairement au français, l'expression des heures requiert l'article défini. Le mot « hora » (« heure ») n'est pas prononcé, mais étant sous-entendu, l'article est féminin. De plus, l'article est singulier lorsque l'heure en question est 1h et pluriel dans les autres cas. + +* Avui, m'he aixecat a les vuit. +* Aujourd'hui je me suis levé à huit heures (aux huit). + +* Ja és la una. +* Il est déjà une heure (la une). + +Le sistema de campanar admet deux subdivisions de l'heure. D'abord le quart d'heure. Il s'additionne aux heures, mais le fait d'une manière assez singulière. Mieux vaut d'abord présenter quelques exemples. + +* Un quart de vuit. +* 7h15. (un quart de huit). + +* Tres quarts de deu. +* 9h45. (trois quarts de dix). + +* Dos quarts de dues. +* 1h30. (deux quarts de deux). + +Nous voyons que l'heure exprimée est systématiquement décalée d'une heure par rapport à ce qu'aurait donné une simple addition des heures et des quarts d'heure. C'est que pour savoir ce que signifie « Un quart de vuit », il ne faut pas additionner 1 quart d'heure à 8h, mais 1 quart d'heure à la huitième heure, qui est 7h. En effet, à minuit commence la première heure, à une heure la deuxième, à deux heures la troisième, etc. Ainsi, la calcul qu'il faut faire est le suivant. + +* Un quart de vuit. +* Un quart d'heure + la huitième heure = 7h15. + +* Tres quarts de deu. +* Trois quarts d'heure + la dixième heure = 9h45. + +* Dos quarts de dues. +* Deux quarts d'heure + la deuxième heure = 1h30. + +Afin d'être plus précis, le système permet l'addition et la soustraction de minutes. + +* Falten deu minuts per a les quatre. +* 3h50. (Il manque dix minutes pour les quatre). + +* És un quart i tres de set. +* 6h18. (Il est un qurat et trois de sept). + +La deuxième subdivision de l'heure est le mig quart (demi quart d'heure), équivalent à sept minutes et demie. + +* Tres quarts i mig d'onze. +* 10h52. (Trois quarts et demi d'onze). + +* Mig quart de nou. +* 8h07. (Demi quart de neuf). + +Le site internet Softcatala, qui propose une foule d'outils en lien avec le catalan, rend disponible en ligne un programme permettant de convertir l'heure sous la forme HH:MM en mots, et ce pour trois systèmes différents, dont le sistema de camapanar. + +=> https://www.softcatala.org/hora-en-catala/ L'hora en català + +## Conclusion + +Voici donc quatre faits du catalan que je trouve très intéressants et qui contribuent à en faire une langue unique. Il y en a bien entendu beaucoup d'autres, et je n'exclue pas d'augmenter au jour cet article d'autres curiosités. + +## Notes + +[1] Certains affirment que la variété de catalan parlée à Valence est une langue distincte, le valencien. Je crois cependant que cette distinction n'est pas justifiée sur le plan linguistique. + +[2] Il y a d'autres variétés parlées en Catalogne, la nord-occidental, par exemple. + +[3] Je ne parle pas ici de l'accent graphique qui sert à distinguer à l'écrit deux homophones (« es », le pronom réflexif « se » et « és », « il est », par exemple). Je parle de l'accent tel qu'il est prononcé. + +[4] La différence entre les représentations phonétiques et phonémiques s'illustre bien par l'exemple suivant. La plupart des locuteurs du français québécois, bien qu'ils remarquent à peu près tous une différence par rapport aux autres variétés de français, n'ont pas conscience de prononcer spécifiquement [pətsi] plutôt que [pəti] le mot « petit ». Il s'agit d'une différence phonétique, mais pas phonémique. La transcription phonétique de ces deux prononciations est la même, /pəti/. + +[5] J'ai entendu à deux reprises, dans une vidéo d'Easy Catalan, une même personne dire « gota » (goute) : la première fois seule, avec le sens de « pas du tout », et la deuxième fois au sein d'une phrase, pour renforcer la négation (« Que no hom som gota ».). Je ne sais pas si le phénomène est courant ; c'est la première (et seule) fois que j'ai remarqué un tel usage. En tout cas, ça témoigne de la conservation d'un élément que le français a délaissé. Belle richesse. + +=> https://www.youtube.com/watch?v=jQvoY5cH1nk Vidéo en question + +## Bibliographie + +* Institut d'Estudis Catalans (IEC). (2016). Gramàtica de la llengua catalana. +* Institut d'Estudis Catalans (IEC). (2018). Gramàtica essential de la llengua catalana. +* Institut d'Estudis Catalans (IEC). (2019). Gramàtica bàsica i d'ús de la llengua catalana. +* De Pedrolo, M. (2013). Mecanoscrit del segon origen. Edicions 62. diff --git a/src/articles/finger_openbsd.aplat b/src/articles/finger_openbsd.aplat @@ -1,490 +0,0 @@ -(doc - (@ (type "article") - (titre "Configurer un serveur finger sous OpenBSD") - (date-pub "2023-02-11") - (date-mod "2023-10-22") - (auteur "Selve") - (lien (ref-std "ART_FINGER_OPENBSD")) - (uuid "f4c6527f-504d-4e4f-946e-fbb0b7e659d7")) - - (par -"Le protocole finger est à l'image des premiers temps d'Internet : -simplissime et convivial" - (note - (par -"Certains ajouteraient que le peu de souci porté à la sécurité informatique fait -de finger un digne représentant de son époque. Ce n'est pas exactement mon avis. -J'y reviendrai.")) -". Publiée en 1977, la RFC 742 est la première à en détailler le fonctionnement. -Notre protocole dépasse donc aujourd'hui les 45 ans. Trois autres RFC ont suivi -la première, la dernière étant la RFC 1288, publiée en 1991.") - - (par (@ (type "liens")) - (lien (@ (ref "https://www.rfc-editor.org/rfc/rfc742")) - "RFC 742") - (lien (@ (ref "https://www.rfc-editor.org/rfc/rfc1288")) - "RFC 1288")) - - (par -"finger est une sorte de super carnet d'adresses en ligne. Une simple -requête permet de recevoir ce qu'on pourrait appeler la « page d'accueil » du -serveur, qui contient souvent la liste des utilisateurs qui y sont connectés. -Augmentée d'un nom d'utilisateur, la requête fournit une somme variable -d'informations concernant cet utilisateur. Il s'agit traditionnellement de son -nom complet, de l'emplacement de son dossier ~/, du programme shell qu'il -utilise, de la date et de l'heure de sa dernière connexion, de son numéro de -téléphone, de l'état de sa boîte courriel, etc. En outre, les serveurs finger -affichent typiquement le contenu des fichiers ~/.project et ~/.plan. Le premier -tend à contenir des informations générales sur l'utilisateur, sur ses intérêts, -etc. ; le second est souvent plus spécifique et changeant et lui sert à informer -les autres de ses plans à court terme, de ce qui l'occupe, de ce qu'il explore -ou veut explorer, etc. Mais ce qu'affiche une requête finger dépend en -définitive des préférences de l'administrateur et de l'utilisateur.") - - (par -"L'âge d'or de finger semble révolu. Il était une l'époque où très peu -d'individus possédaient un ordinateur personnel et où une grande partie de ceux -qui avaient à en utiliser un devaient se connecter à un ordinateur central, donc -partagé, appartenant à quelque université ou entreprise. Alors, « toutes les -machines Unix connectées au réseau avaient un serveur finger », dit-on" - (note - (par -"Voir l'article de Stéphane Bortzmeyer sur finger.")) -". Avant l'avènement du Web, c'était un des seuls moyens informatisés répandus -et efficaces d'obtenir de l'information sur quelqu'un.") - - (par -"Aujourd'hui, le protocole, sans être totalement tombé en désuétude, est -assez marginal ; c'est le moins qu'on puisse dire. Il jouit toutefois d'un -regain d'intérêt récent avec la montée de l'Internet simple et indépendant (je -suis toujours à la recherche d'un terme français pour « smol web »). Il est -apprécié pour sa simplicité et pour son fonctionnement décentralisé. Plusieurs -serveurs tildes mettent ainsi à la disposition de leurs membres un serveur -finger.") - - (par (@ (type "liens")) - (lien (@ (ref "gemini://zaibatsu.circumlunar.space/~solderpunk/phlog/were-bringin-finger-back.txt")) - "Article de Solderpunk « We're bringin' finger back! » (en anglais)")) - - (par -"J'héberge de depuis peu mon propre serveur finger. J'ai été séduit par sa -simplicité et par l'espoir de le voir renaître comme moyen d'échange et de -socialisation au sein des petites communautés de l'Internet citoyen.") - - (par -"C'est avec OpenBSD et ses outils que j'ai monté ce serveur, et en la -matière, je n'ai pas d'expérience avec d'autres systèmes. Je n'aurai donc -qu'OpenBSD en tête en écrivant cet article. Je serais cependant surpris -d'apprendre que la marche à suivre diffère grandement entre les systèmes de type -Unix.") - - (section "Exemples d'utilisation") - - (par -"De nombreux systèmes dérivés de Unix sont livrés avec le programme -finger(1), qui permet de réaliser des requêtes par ce protocole.") - - (par - (@ (césure "pre")) -"$ finger selve@asteride.xyz -[asteride.xyz/207.148.27.164] - - ---------------- - * ASTERIDE.XYZ * - ---------------- - -Utilisateur: selve Nom: Selve -Dossier: /home/selve Shell: /bin/ksh -Courriel: selve@asteride.xyz -Gemini: gemini://asteride.xyz/~selve/ -Langues: FranC'ais, catalan et anglais -DC)connectC) depuis le 2023-02-10 C 03:20:17 (UTC) - -[Et cetera]") - - (par -"Le client d'OpenBSD ne gère que l'encodage ASCII. C'est pourquoi le texte -n'est pas affiché correctement. Les RFC sur finger à partir de 1194 RECOMMANDENT -en effet de filtrer des caractères et de ne laisser passer que les caractères -entre 32 et 126, de même que \t, \r et \n. Il est en outre spécifié que le -serveur DOIT transmettre des caractères ASCII entre 128 et 255. D'habitude, je -respecte les standards de bon cœur, mais quand j'écris en français, j'emploie -les caractères en usage dans cette langue. Je ne me passerai ni des accents, ni -des cédilles, ni des guillemets, ni, tant qu'à y être, d'autres commodités -typographiques comme les ligatures. Je pense que nous pouvons nous permettre -d'utiliser l'UTF-8" (note (par "Le client Bombadillo, par exemple, accepte les -textes encodés en UTF-8. Je serais d'accord pour qu'on modifie le client -d'OpenBSD afin qu'il respecte LC_CTYPE.")) ".") - - (par -"Heureusement, le protocole est si simple qu'on peut simuler le -fonctionnement du programme avec netcat ou telnet, qui ne souffrent pas des -mêmes limitations. Il suffit d'ouvrir un connexion avec le serveur approprié au -port 79 et d'envoyer une seule ligne de texte. Cette ligne correspond -généralement à l'utilisateur au sujet duquel on veut obtenir de l'information.") - - (par - (@ (césure "pre")) -"$ telnet asteride.xyz 79 -selve - - ---------------- - * ASTERIDE.XYZ * - ---------------- - -Utilisateur: selve Nom: Selve -Dossier: /home/selve Shell: /bin/ksh -Courriel: selve@asteride.xyz -Gemini: gemini://asteride.xyz/~selve/ -Langues: Français, catalan et anglais -Déconnecté depuis le 2023-02-10 à 03:20:17 (UTC) - -[Et cetera]") - - (par -"On peut même créer une fonction shell avec netcat pour remplacer le client -de base. Elle n'est pas complète, mais elle sait faire l'important.") - - (par - (@ (césure "pre")) -"finger() { - echo "$1" | grep "@" >/dev/null && - printf "${1%@*}\r\n" | nc "${1##*@}" 79 || - printf "${1%@*}\r\n" | nc 127.0.0.1 79 -}") - - (par -"On peut souvent obtenir la liste des utilisateurs connectés à un système -en ne précisant pas de nom d'utilisateur. Bien sûr, l'administrateur est maître -de ce qui est envoyé.") - - (par - (@ (césure "pre")) -"$ finger @asteride.xyz - - ---------------- - * ASTERIDE.XYZ * - ---------------- - -Bienvenue sur asteride.xyz. - -D'habitude, lorsqu'on interroge un serveur finger sans spécifier de nom -d'utilisateur, il répond par la liste de tous les utilisateurs actifs au -moment de la requête. Mais la liste risque d'être plutôt courte ici, -car asteride.xyz n'en compte qu'il seul : selve (il est actif en ce -moment!). - -Il vous invite à exécuter « finger selve@asteride.xyz ».") - -(par "Cela revient à envoyer une ligne vide.") - - (par - (@ (césure "pre")) -"$ telnet asteride.xyz 79 -[ENTRÉE] - - ---------------- - * ASTERIDE.XYZ * - ---------------- - -Bienvenue sur asteride.xyz. - -[Et cetera]") - - (par -"asteride.xyz ne compte qu'un seul (vrai) utilisateur. On peut aller voir -sur des serveurs tildes comme zaibatsu.circumlunar.space, tilde.club, -tilde.institude, etc. pour consulter une liste plus longue.") - - (par - (@ (césure "pre")) -"$ finger @zaibatsu.circumlunar.space -$ finger @tilde.club -$ finger @tilde.institute -$ finger @etc.") - - (par -"Je veux aussi donner un exemple d'utilisation originale du protocole. -Techniquement, il ne s'agit que d'envoyer du texte en réponse à une ligne de -texte. Un serveur peut alors interpréter cette ligne comme il le veut. graph.no -permet ainsi de consulter la météo avec finger.") - - (par - (@ (césure "pre")) -"$ finger québec~72@graph.no -[graph.no/178.255.144.27] - -= Meteogram for Quebec, Canada =- - 'C Rain (mm) --16 --17--- --18 ------ --19 ------ =-- --20 ---=--^^^ --- --21 ^^^=== --- --22 ====== --- --23 ^^^ --24 =--=-- --25 - 18 19 20 21 22 23 09/02 02 03 04 05 06 07_08_09_10_11_12 Hour - - W W W W W W W W W W W W NW W W W W W W Wind dir. - 5 5 5 5 5 4 4 4 4 4 3 3 2 2 2 1 1 1 1 Wind(m/s) - -Legend left axis: - Sunny ^ Scattered = Clouded =V= Thunder # Fog -Legend right axis: | Rain ! Sleet * Snow -[Terminal FTW!]") - - (par -"On peut envoyer une ligne vide pour consulter les options de ce serveur.") - - (par - (@ (césure "pre")) -"finger @graph.no") - - (section "Configuration") - - (par -"Cette présentation achevée, nous pouvons maintenant voir comment mettre en -place un serveur finger sous OpenBSD. Ce n'est pas extrêmement compliqué. -D'abord, le système d'exploitation vient un serveur finger (fingerd(8)) et avec -tous les outils nécessaires à son fonctionnement.") - - (par -"fingerd(8) n'est pas un serveur à part entière : il ne tourne pas en -arrière-plan (ce n'est un daimôn) et il n'accepte pas lui-même les connections -entrantes ; il a besoin d'inetd(8) pour fonctionner. inetd(8) surveille une -série de ports et transmet les requêtes à certains programmes.") - - (par -"C'est par le fichier de configuration /etc/inetd.conf qu'on lui indique -quels ports surveiller et quel programme exécuter en cas de requête. Un exemple -de configuration est disponible au /etc/examples/inetd.conf. Ce sont les lignes -qui commencent par « #finger » qui nous intéressent. Il s'agit de les copier -dans le fichier de configuration /etc/inetd.conf et de retirer ces dièses qui -marquent les commentaires.") - - (par - (@ (césure "pre")) -"$ cat /etc/inetd.conf -finger stream tcp nowait _fingerd /usr/libexec/fingerd fingerd -lsm -finger stream tcp6 nowait _fingerd /usr/libexec/fingerd fingerd -lsm") - - (par -"Il y a deux lignes, car on veut qu'inetd(8) soit attentif au requêtes -venants d'IPv4 et d'IPv6. Si on voulait surveiller non pas le port 79, qui est -le port standard de finger, mais à un autre port, on replacerait le premier -champ (« finger ») par le numéro de ce port. On peut aussi écrire :") - - (par - (@ (césure "pre")) -"$ cat /etc/inetd.conf.fictif -79 stream tcp nowait _fingerd /usr/libexec/fingerd fingerd -lsm -79 stream tcp6 nowait _fingerd /usr/libexec/fingerd fingerd -lsm") - - (par -"En fait, inetd(8) consulte le fichier /etc/services pour connaître la -correspondance entre le nom du service et numéro de port à utiliser. Une autre -option serait donc de modifier ce fichier.") - - (par -"Le quatrième champ spécifie le nom de l'utilisateur sous lequel exécuter -le programme finger. Ici, il s'agit de _fingerd, ce qui est tout à fait -approprié.") - - (par -"Le cinquième champ donne le chemin vers le programme qui doit traiter la -requête. Ici, il nous utilisons le programme inclus dans OpenBSD. Les champs -suivants seront donnés en argument à ce programme (avec « fingerd » comme -argument 0). Trois options sont spécifiées. -l demande de noter chaque requête -dans les journaux. -s empêche le transfert des requêtes. Sans cela, la -commande") - - (par - (@ (césure "pre")) -"finger québec~72@graph.no@asteride.xyz") - - (par -"demanderait à asteride.xyz d'effectuer lui-même la requête à graph.no. -Celui-ci n'aurait aucune idée de l'identité de l'initiateur et penserait qu'il -s'agit d'asteride.xyz. On comprend que ce n'est pas ce qu'on souhaite -permettre.") - - (par -"Finalement, l'option -m oblige l'utilisateur à envoyer le nom -d'utilisateur exacte au serveur. Autrement, on s'attend à ce que, advenant une -requête au sujet d'un utilisateur inexistant, le serveur réponde avec une liste -nom d'utilisateurs qui ressemblent à celui de la requête.") - - (par -"La page du manuel de fingerd(8) dresse la liste de toutes les options -disponibles.") - - (section (@ (niveau 2)) "Modifier la réponse du serveur") - - (par -"fingerd(8) offre très peu d'options pour modifier l'apparence du contenu -de la réponse ; la liberté de l'utilisateur se limite à ce qu'il peut écrire -dans ~/.plan et dans ~/.project.") - - (par -"En fait, sur OpenBSD fingerd(8) ne s'occupe pas lui-même la recherche et -de la présentation des données. Il délègue ces tâches à finger(1), le même -programme qu'on utilise normalement pour effectuer une requête à partir de la -ligne de commande. D'ailleurs, il est possible d'utiliser localement la commande -sans serveur finger. Voici la réponse affichée par la commande finger(1) que -j'ai exécutée sur mon ordinateur portable. (Notez l'absence de « @ »).") - - (par - (@ (césure "pre")) -"Login: selve Name: Selve -Directory: /home/selve Shell: /bin/ksh -On since Fri Feb 10 12:43 (EST) on ttyp0 from :0 -On since Fri Feb 10 13:48 (EST) on ttyp4 from :0 -On since Fri Feb 10 13:47 (EST) on ttyp6 from :0 -On since Fri Feb 10 13:49 (EST) on ttyp7 from :0 -On since Fri Feb 10 13:50 (EST) on ttyp8 from :0 -On since Fri Feb 10 14:19 (EST) on ttypa from :0 -New mail received Thu Feb 9 13:35 2023 (EST) - Unread since Wed Sep 14 18:06 2022 (EDT) -No Plan.") - - (par -"fingerd(8) propose d'utiliser un autre programme que finger(1). On -l'indique à l'aide de l'option -P. Voici à quoi devrait ressembler le fichier de -configuration d'inetd(8) si on voulait que fingerd(8) transmette le texte généré -à chaque requête par le programme qui se trouve au /etc/finger. Bien entendu, il -faut que ce programme soit exécutable par _fingerd.") - - (par - (@ (césure "pre")) -"$ cat /etc/inetd.conf -finger stream tcp nowait _fingerd /usr/libexec/fingerd fingerd -lsm -P /etc/finger -finger stream tcp6 nowait _fingerd /usr/libexec/fingerd fingerd -lsm -P /etc/finger") - - (par -"À partir de là, on peut faire ce qu'on veut. Selon ce que j'ai trouvé dans -le code source de fingerd(8), le programme de remplacement devrait savoir gérer -(ou ignorer) les options -smMpl, telles que décrites dans finger(1). Les -arguments sont donnés par fingerd(8) dans cet ordre : les options sont placées -d'abord, suivies du marqueur de fin des options (--) et du contenu de la seule -ligne envoyée par le client (un nom d'utilisateur ou rien, la plupart du -temps)"(note (par "Astuce : si on veut avoir une idée des arguments que -finderd(8) donne au programme, on peut remplacer « /etc/finger » par « echo ». -Ces arguments seront ainsi transmis par finger.")) ) - - (par -"Voici un exemple de programme de remplacement.") - - (par - (@ (césure "pre")) -"$ cat /etc/finger -#!/bin/sh - -# interpréter les options (en fait, elles sont ignorées) -PLAN=1 -while getopts \"smMpl\" OPT -do -case "$OPT" in - s) FG_COURT=1 ;; - m) FG_CHERCHER= ;; - M) FG_CHERCHER=1 ;; - p) FG_PLAN= ;; - l) FG_LONG=1 ;; - *) logger -t finger \"L'option -$OPT n'est pas supportée.\" -esac -done -shift $((OPTIND - 1)) - -UTILISATEUR=\"$1\" -printf '%s\n\n' "$UTILISATEUR" -[ -r \"/home/$UTILISATEUR/.plan\" ] && cat \"/home/$UTILISATEUR/.plan\" -[ -r \"/home/$UTILISATEUR/.projet\" ] && cat \"/home/$UTILISATEUR/.projet\"") - - (par -"Ce programme n'est pas robuste. Il ne sait même pas gérer la ligne vide. -De plus, les dossiers de certains utilisateurs ne se trouvent pas dans /home/ ; -c'est le cas de root, par exemple. Il faudrait consulter /etc/passwd pour savoir -où le dossier de chaque utilisateur se trouve. Le but est simplement de donner -un aperçu du pouvoir qui est entre nos mains.") - - (section "Brèves remarques sur la sécurité") - - (par -"Cette section s'impose, car le protocole finger n'a pas une bonne -réputation en matière de sécurité. Cette réputation n'est qu'en partie -justifiée. Elle est répandue surtout à cause du ver de Morris, qui a, entre -autres, profité d'une vulnérabilité dans le programme fingerd répandu à l'époque -(c'est-à-dire 1988). Ce n'est pas le protocole lui-même qui a été pris en -défaut, mais une mise en œuvre particulière. D'ailleurs, tout service exposé à -l'Internet vient avec ses risques en matière de sécurité. Et gardons en tête que -ces vulnérabilités ont d'autant moins de chances de survenir que le programme -est simple.") - - (par (@ (type "liens")) - (lien (@ (ref "https://fr.wikipedia.org/wiki/Morris_(ver_informatique)")) - "Article Wikipédia sur le ver de Morris")) - - (par -"Si on veut affirmer que finger n'est pas sécuritaire, c'est à l'objectif -même du service qu'il faut s'en prendre. Si on essaie généralement de divulguer -le moins d'information possible aux pirates potentiels, c'est parce qu'ils -peuvent parfois s'en servir pour mieux cibler leurs attaques. Or, le but de -finger est de partager de l'information. Disposer de la liste des utilisateurs -connectés et connaître leurs plans et leurs intérêts a des chances de faciliter -la vie de ces pirates. Ça ne fait aucun doute. Par contre, avoir un blogue, un -compte Facebook, un compte Mastodon, etc. bref être présent et actif sur ce -genre de plateforme accessible publiquement risque d'aider les pirates bien plus -que d'avoir une présence sur finger.") - - (par -"S'il y a peu de chance d'y avoir une faille utile aux pirates dans les -programmes finger contemporains et si j'estime que les risques associés à -l'information disponible par leur truchement est négligeable, je crois qu'il -faut être extrêmement vigilant au moment de créer un programme finger -alternatif. Il est très facile de faire des erreurs, surtout dans des programmes -shell. Prudence! donc.") - - (section "Conclusion") - - (par -"Si la configuration de base d'un serveur finger sous OpenBSD est très -simple, j'ai trouvé moins évident l'exécution d'un programme finger alternatif. -Dans ce cas, malgré la réputation d'OpenBSD dans ce domaine, la page de manuel -de fingerd(8) ne semble malheureusement aider que ceux qui savent déjà comment -faire. J'ai en effet dû consulter le code source du programme pour comprendre -comment le configurer. J'ai donc écrit ce guide pour aider ceux qui auraient la -même idée que moi.") - - (section "Voir aussi") - - (section (@ (niveau 2)) "Mon serveur finger") - - (par (@ (type "liens")) - (lien (@ (ref "finger://selve@asteride.xyz")) - "selve@asteride.xyz")) - - (section (@ (niveau 2)) "Les RFC") - - (par (@ (type "liens")) - (lien (@ (ref "https://www.rfc-editor.org/rfc/rfc742")) - "RFC 742") - (lien (@ (ref "https://www.rfc-editor.org/rfc/rfc1194")) - "RFC 1194") - (lien (@ (ref "https://www.rfc-editor.org/rfc/rfc1196")) - "RFC 1196") - (lien (@ (ref "https://www.rfc-editor.org/rfc/rfc1288")) - "RFC 1288")) - - (section (@ (niveau 2)) "L'article Wikipédia sur finger") - - (par (@ (type "liens")) - (lien (@ (ref "https://fr.wikipedia.org/wiki/Finger_(Unix)")) - "finger (Unix)")) - - (section (@ (niveau 2)) "L'article de Bortzmeyer sur finger") - - (par (@ (type "liens")) - (lien (@ (ref "https://www.bortzmeyer.org/1288.html")) - "RFC 1288: The Finger User Information Protocol (en français malgré le titre)")) - - (encrage (@ (id "notes")))) diff --git a/src/articles/finger_openbsd.conv b/src/articles/finger_openbsd.conv @@ -0,0 +1,295 @@ +titre:Configurer un serveur finger sous OpenBSD +date_pub:11 février 2023 +date_mod:22 octobre 2023 +auteur:~ldp +type:article +uuid:f4c6527f-504d-4e4f-946e-fbb0b7e659d7 + +Le protocole finger est à l'image des premiers temps d'Internet : simplissime et convivial[1]. Publiée en 1977, la RFC 742 est la première à en détailler le fonctionnement. Notre protocole dépasse donc aujourd'hui les 45 ans. Trois autres RFC ont suivi la première, la dernière étant la RFC 1288, publiée en 1991. + +=> https://www.rfc-editor.org/rfc/rfc742 RFC 742 +=> https://www.rfc-editor.org/rfc/rfc1288 RFC 1288 + +finger est une sorte de super carnet d'adresses en ligne. Une simple requête permet de recevoir ce qu'on pourrait appeler la « page d'accueil » du serveur, qui contient souvent la liste des utilisateurs qui y sont connectés. Augmentée d'un nom d'utilisateur, la requête fournit une somme variable d'informations concernant cet utilisateur. Il s'agit traditionnellement de son nom complet, de l'emplacement de son dossier ~/, du programme shell qu'il utilise, de la date et de l'heure de sa dernière connexion, de son numéro de téléphone, de l'état de sa boîte courriel, etc. En outre, les serveurs finger affichent typiquement le contenu des fichiers ~/.project et ~/.plan. Le premier tend à contenir des informations générales sur l'utilisateur, sur ses intérêts, etc. ; le second est souvent plus spécifique et changeant et lui sert à informer les autres de ses plans à court terme, de ce qui l'occupe, de ce qu'il explore ou veut explorer, etc. Mais ce qu'affiche une requête finger dépend en définitive des préférences de l'administrateur et de l'utilisateur. + +L'âge d'or de finger semble révolu. Il était une l'époque où très peu d'individus possédaient un ordinateur personnel et où une grande partie de ceux qui avaient à en utiliser un devaient se connecter à un ordinateur central, donc partagé, appartenant à quelque université ou entreprise. Alors, « toutes les machines Unix connectées au réseau avaient un serveur finger », dit-on[2]. Avant l'avènement du Web, c'était un des seuls moyens informatisés répandus et efficaces d'obtenir de l'information sur quelqu'un. + +Aujourd'hui, le protocole, sans être totalement tombé en désuétude, est assez marginal ; c'est le moins qu'on puisse dire. Il jouit toutefois d'un regain d'intérêt récent avec la montée de l'Internet simple et indépendant (je suis toujours à la recherche d'un terme français pour « smol web »). Il est apprécié pour sa simplicité et pour son fonctionnement décentralisé. Plusieurs serveurs tildes mettent ainsi à la disposition de leurs membres un serveur finger. + +=> gemini://zaibatsu.circumlunar.space/~solderpunk/phlog/were-bringin-finger-back.txt Article de Solderpunk « We're bringin' finger back! » (en anglais) + +J'héberge de depuis peu mon propre serveur finger. J'ai été séduit par sa simplicité et par l'espoir de le voir renaître comme moyen d'échange et de socialisation au sein des petites communautés de l'Internet citoyen. + +C'est avec OpenBSD et ses outils que j'ai monté ce serveur, et en la matière, je n'ai pas d'expérience avec d'autres systèmes. Je n'aurai donc qu'OpenBSD en tête en écrivant cet article. Je serais cependant surpris d'apprendre que la marche à suivre diffère grandement entre les systèmes de type Unix. + +## Exemples d'utilisation + +De nombreux systèmes dérivés de Unix sont livrés avec le programme finger(1), qui permet de réaliser des requêtes par ce protocole. + +``` +$ finger ldp@asteride.xyz +[asteride.xyz/207.148.27.164] + + ---------------- + * ASTERIDE.XYZ * + ---------------- + +Utilisateur: ldp Nom: LoC/c Daignault-Pichette +Dossier: /home/ldp Shell: /bin/ksh +Courriel: ldp@asteride.xyz +Gemini: gemini://asteride.xyz/~ldp/ +Langues: FranC'ais, catalan et anglais +DC)connectC) depuis le 2023-02-10 C 03:20:17 (UTC) + +[Et cetera] +``` + +Le client d'OpenBSD ne gère que l'encodage ASCII. C'est pourquoi le texte n'est pas affiché correctement. Les RFC sur finger à partir de 1194 RECOMMANDENT en effet de filtrer des caractères et de ne laisser passer que les caractères entre 32 et 126, de même que t, r et n. Il est en outre spécifié que le serveur DOIT transmettre des caractères ASCII entre 128 et 255. D'habitude, je respecte les standards de bon cœur, mais quand j'écris en français, j'emploie les caractères en usage dans cette langue. Je ne me passerai ni des accents, ni des cédilles, ni des guillemets, ni, tant qu'à y être, d'autres commodités typographiques comme les ligatures. Je pense que nous pouvons nous permettre d'utiliser l'UTF-8[3]. + +Heureusement, le protocole est si simple qu'on peut simuler le fonctionnement du programme avec netcat ou telnet, qui ne souffrent pas des mêmes limitations. Il suffit d'ouvrir un connexion avec le serveur approprié au port 79 et d'envoyer une seule ligne de texte. Cette ligne correspond généralement à l'utilisateur au sujet duquel on veut obtenir de l'information. + +``` +$ telnet asteride.xyz 79 +ldp + + ---------------- + * ASTERIDE.XYZ * + ---------------- + +Utilisateur: ldp Nom: Loïc Daignault-Pichette +Dossier: /home/ldp Shell: /bin/ksh +Courriel: ldp@asteride.xyz +Gemini: gemini://asteride.xyz/~ldp/ +Langues: Français, catalan et anglais +Déconnecté depuis le 2023-02-10 à 03:20:17 (UTC) + +[Et cetera] +``` + +On peut même créer une fonction shell avec netcat pour remplacer le client de base. Elle n'est pas complète, mais elle sait faire l'important. + +``` +finger() { + echo "$1" | grep @ >/dev/null && + printf "${1%@*}\r\n" | nc "${1##*@}" 79 || + printf "${1%@*}\r\n" | nc "127.0.0.1 79" +} +``` + +On peut souvent obtenir la liste des utilisateurs connectés à un système en ne précisant pas de nom d'utilisateur. Bien sûr, l'administrateur est maître de ce qui est envoyé. + +``` +$ finger @asteride.xyz + + ---------------- + * ASTERIDE.XYZ * + ---------------- + +Bienvenue sur asteride.xyz. + +Le système héberge les utilisateurs suivants: + +* ldp (alias Loïc Daignault-Pichette) + +Vous pouvez taper quelque chose comme « finger UTILISATEUR@asteride.xyz » +pour consulter le profil d'UTILISATEUR. +``` + +Cela revient à envoyer une ligne vide. + +``` +$ telnet asteride.xyz 79 +[ENTRÉE] + + ---------------- + * ASTERIDE.XYZ * + ---------------- + +Bienvenue sur asteride.xyz. + +[Et cetera] +``` + +asteride.xyz ne compte qu'un seul (vrai) utilisateur. On peut aller voir sur des serveurs tildes comme zaibatsu.circumlunar.space, tilde.club, tilde.institude, etc. pour consulter une liste plus longue. + +``` +$ finger @zaibatsu.circumlunar.space +$ finger @tilde.club +$ finger @tilde.institute +$ finger @etc. +``` + +Je veux aussi donner un exemple d'utilisation originale du protocole. Techniquement, il ne s'agit que d'envoyer du texte en réponse à une ligne de texte. Un serveur peut alors interpréter cette ligne comme il le veut. graph.no permet ainsi de consulter la météo avec finger. + +``` +$ finger québec~72@graph.no +[graph.no/178.255.144.27] + -= Meteogram for Quebec, Canada =- + 'C Rain (mm) +-16 +-17--- +-18 ------ +-19 ------ =-- +-20 ---=--^^^ --- +-21 ^^^=== --- +-22 ====== --- +-23 ^^^ +-24 =--=-- +-25 + 18 19 20 21 22 23 09/02 02 03 04 05 06 07_08_09_10_11_12 Hour + + W W W W W W W W W W W W NW W W W W W W Wind dir. + 5 5 5 5 5 4 4 4 4 4 3 3 2 2 2 1 1 1 1 Wind(m/s) + +Legend left axis: - Sunny ^ Scattered = Clouded =V= Thunder # Fog +Legend right axis: | Rain ! Sleet * Snow +[Terminal FTW!] +``` + +On peut envoyer une ligne vide pour consulter les options de ce serveur. + +``` +finger @graph.no +``` + +## Configuration + +Cette présentation achevée, nous pouvons maintenant voir comment mettre en place un serveur finger sous OpenBSD. Ce n'est pas extrêmement compliqué. D'abord, le système d'exploitation vient un serveur finger (fingerd(8)) et avec tous les outils nécessaires à son fonctionnement. + +fingerd(8) n'est pas un serveur à part entière : il ne tourne pas en arrière-plan (ce n'est un daimôn) et il n'accepte pas lui-même les connections entrantes ; il a besoin d'inetd(8) pour fonctionner. inetd(8) surveille une série de ports et transmet les requêtes à certains programmes. + +C'est par le fichier de configuration /etc/inetd.conf qu'on lui indique quels ports surveiller et quel programme exécuter en cas de requête. Un exemple de configuration est disponible au /etc/examples/inetd.conf. Ce sont les lignes qui commencent par « #finger » qui nous intéressent. Il s'agit de les copier dans le fichier de configuration /etc/inetd.conf et de retirer ces dièses qui marquent les commentaires. + +``` +$ cat /etc/inetd.conf +finger stream tcp nowait _fingerd /usr/libexec/fingerd fingerd -lsm +finger stream tcp6 nowait _fingerd /usr/libexec/fingerd fingerd -lsm +``` + +Il y a deux lignes, car on veut qu'inetd(8) soit attentif au requêtes venants d'IPv4 et d'IPv6. Si on voulait surveiller non pas le port 79, qui est le port standard de finger, mais à un autre port, on replacerait le premier champ (« finger ») par le numéro de ce port. On peut aussi écrire : + +``` +$ cat /etc/inetd.conf.fictif +79 stream tcp nowait _fingerd /usr/libexec/fingerd fingerd -lsm +79 stream tcp6 nowait _fingerd /usr/libexec/fingerd fingerd -lsm +``` + +En fait, inetd(8) consulte le fichier /etc/services pour connaître la correspondance entre le nom du service et numéro de port à utiliser. Une autre option serait donc de modifier ce fichier. + +Le quatrième champ spécifie le nom de l'utilisateur sous lequel exécuter le programme finger. Ici, il s'agit de _fingerd, ce qui est tout à fait approprié. + +Le cinquième champ donne le chemin vers le programme qui doit traiter la requête. Ici, il nous utilisons le programme inclus dans OpenBSD. Les champs suivants seront donnés en argument à ce programme (avec « fingerd » comme argument 0). Trois options sont spécifiées. -l demande de noter chaque requête dans les journaux. -s empêche le transfert des requêtes. Sans cela, la commande + +``` +finger québec~72@graph.no@asteride.xyz +``` + +demanderait à asteride.xyz d'effectuer lui-même la requête à graph.no. Celui-ci n'aurait aucune idée de l'identité de l'initiateur et penserait qu'il s'agit d'asteride.xyz. On comprend que ce n'est pas ce qu'on souhaite permettre. + +Finalement, l'option -m oblige l'utilisateur à envoyer le nom d'utilisateur exacte au serveur. Autrement, on s'attend à ce que, advenant une requête au sujet d'un utilisateur inexistant, le serveur réponde avec une liste nom d'utilisateurs qui ressemblent à celui de la requête. + +La page du manuel de fingerd(8) dresse la liste de toutes les options disponibles. + +### Modifier la réponse du serveur + +fingerd(8) offre très peu d'options pour modifier l'apparence du contenu de la réponse ; la liberté de l'utilisateur se limite à ce qu'il peut écrire dans ~/.plan et dans ~/.project. + +En fait, sur OpenBSD fingerd(8) ne s'occupe pas lui-même la recherche et de la présentation des données. Il délègue ces tâches à finger(1), le même programme qu'on utilise normalement pour effectuer une requête à partir de la ligne de commande. D'ailleurs, il est possible d'utiliser localement la commande sans serveur finger. Voici la réponse affichée par la commande finger(1) que j'ai exécutée sur mon ordinateur portable. (Notez l'absence de « @ »). + +``` +Login: ldp Name: LoC/c Daignault-Pichette +Directory: /home/ldp Shell: /bin/ksh +On since Fri Feb 10 12:43 (EST) on ttyp0 from :0 +On since Fri Feb 10 13:48 (EST) on ttyp4 from :0 +On since Fri Feb 10 13:47 (EST) on ttyp6 from :0 +On since Fri Feb 10 13:49 (EST) on ttyp7 from :0 +On since Fri Feb 10 13:50 (EST) on ttyp8 from :0 +On since Fri Feb 10 14:19 (EST) on ttypa from :0 +New mail received Thu Feb 9 13:35 2023 (EST) + Unread since Wed Sep 14 18:06 2022 (EDT) +No Plan. +``` + +fingerd(8) propose d'utiliser un autre programme que finger(1). On l'indique à l'aide de l'option -P. Voici à quoi devrait ressembler le fichier de configuration d'inetd(8) si on voulait que fingerd(8) transmette le texte généré à chaque requête par le programme qui se trouve au /etc/finger. Bien entendu, il faut que ce programme soit exécutable par _fingerd. + +``` +$ cat /etc/inetd.conf +finger stream tcp nowait _fingerd /usr/libexec/fingerd fingerd -lsm -P /etc/finger +finger stream tcp6 nowait _fingerd /usr/libexec/fingerd fingerd -lsm -P /etc/finger +``` + +À partir de là, on peut faire ce qu'on veut. Selon ce que j'ai trouvé dans le code source de fingerd(8), le programme de remplacement devrait savoir gérer (ou ignorer) les options -smMpl, telles que décrites dans finger(1). Les arguments sont donnés par fingerd(8) dans cet ordre : les options sont placées d'abord, suivies du marqueur de fin des options (--) et du contenu de la seule ligne envoyée par le client (un nom d'utilisateur ou rien, la plupart du temps)[4] + +Voici un exemple de programme de remplacement. + +``` +$ cat /etc/finger +#!/bin/sh + +# interpréter les options (en fait, elles sont ignorées) +PLAN=1 +while getopts "smMpl" OPT +do +case $OPT in + s) FG_COURT=1 ;; + m) FG_CHERCHER= ;; + M) FG_CHERCHER=1 ;; + p) FG_PLAN= ;; + l) FG_LONG=1 ;; + *) logger -t finger "L'option -$OPT n'est pas supportée." +esac +done +shift $((OPTIND - 1)) + +UTILISATEUR="$1" +printf '%snn' $UTILISATEUR +[ -r "/home/$UTILISATEUR/.plan" ] && cat "/home/$UTILISATEUR/.plan" +[ -r "/home/$UTILISATEUR/.projet" ] && cat "/home/$UTILISATEUR/.projet" +``` + +Ce programme n'est pas robuste. Il ne sait même pas gérer la ligne vide. De plus, les dossiers de certains utilisateurs ne se trouvent pas dans /home/ ; c'est le cas de root, par exemple. Il faudrait consulter /etc/passwd pour savoir où le dossier de chaque utilisateur se trouve. Le but est simplement de donner un aperçu du pouvoir qui est entre nos mains. + +## Brèves remarques sur la sécurité + +Cette section s'impose, car le protocole finger n'a pas une bonne réputation en matière de sécurité. Cette réputation n'est qu'en partie justifiée. Elle est répandue surtout à cause du ver de Morris, qui a, entre autres, profité d'une vulnérabilité dans le programme fingerd répandu à l'époque (c'est-à-dire 1988). Ce n'est pas le protocole lui-même qui a été pris en défaut, mais une mise en œuvre particulière. D'ailleurs, tout service exposé à l'Internet vient avec ses risques en matière de sécurité. Et gardons en tête que ces vulnérabilités ont d'autant moins de chances de survenir que le programme est simple. + +=> https://fr.wikipedia.org/wiki/Morris_(ver_informatique) Article Wikipédia sur le ver de Morris + +Si on veut affirmer que finger n'est pas sécuritaire, c'est à l'objectif même du service qu'il faut s'en prendre. Si on essaie généralement de divulguer le moins d'information possible aux pirates potentiels, c'est parce qu'ils peuvent parfois s'en servir pour mieux cibler leurs attaques. Or, le but de finger est de partager de l'information. Disposer de la liste des utilisateurs connectés et connaître leurs plans et leurs intérêts a des chances de faciliter la vie de ces pirates. Ça ne fait aucun doute. Par contre, avoir un blogue, un compte Facebook, un compte Mastodon, etc. bref être présent et actif sur ce genre de plateforme accessible publiquement risque d'aider les pirates bien plus que d'avoir une présence sur finger. + +S'il y a peu de chance d'y avoir une faille utile aux pirates dans les programmes finger contemporains et si j'estime que les risques associés à l'information disponible par leur truchement est négligeable, je crois qu'il faut être extrêmement vigilant au moment de créer un programme finger alternatif. Il est très facile de faire des erreurs, surtout dans des programmes shell. Prudence! donc. + +## Conclusion + +Si la configuration de base d'un serveur finger sous OpenBSD est très simple, j'ai trouvé moins évident l'exécution d'un programme finger alternatif. Dans ce cas, malgré la réputation d'OpenBSD dans ce domaine, la page de manuel de fingerd(8) ne semble malheureusement aider que ceux qui savent déjà comment faire. J'ai en effet dû consulter le code source du programme pour comprendre comment le configurer. J'ai donc écrit ce guide pour aider ceux qui auraient la même idée que moi. + +## Voir aussi + +### Mon serveur finger + +=> finger://ldp@asteride.xyz ldp@asteride.xyz + +### Les RFC + +=> https://www.rfc-editor.org/rfc/rfc742 RFC 742 +=> https://www.rfc-editor.org/rfc/rfc1194 RFC 1194 +=> https://www.rfc-editor.org/rfc/rfc1196 RFC 1196 +=> https://www.rfc-editor.org/rfc/rfc1288 RFC 1288 + +### L'article Wikipédia sur finger + +=> https://fr.wikipedia.org/wiki/Finger_(Unix) finger (Unix) + +### L'article de Bortzmeyer sur finger + +=> https://www.bortzmeyer.org/1288.html RFC 1288: The Finger User Information Protocol (en français malgré le titre) + +## Notes + +[1] Certains ajouteraient que le peu de souci porté à la sécurité informatique fait de finger un digne représentant de son époque. Ce n'est pas exactement mon avis. J'y reviendrai. + +[2] Voir l'article de Stéphane Bortzmeyer sur finger. + +[3] Le client Bombadillo, par exemple, accepte les textes encodés en UTF-8. Je serais d'accord pour qu'on modifie le client d'OpenBSD afin qu'il respecte LC_CTYPE. + +[4] Astuce : si on veut avoir une idée des arguments que finderd(8) donne au programme, on peut remplacer « /etc/finger » par « echo ». Ces arguments seront ainsi transmis par finger. diff --git a/src/articles/index.aplat b/src/articles/index.aplat @@ -1,19 +0,0 @@ -(doc - (@ (type "index") - (titre "Le Cybercarnet de Selve") - (lien (ref-std "ART")) - (uuid "7b0545e6-b168-492f-b3e0-58446ad824ea")) - -(par (@ (type "liens")) - (lien (@ (ref (ref-std "ART_APLAT_1"))) - "2024-01-25 aplat(1) : documents structurés pour Unix") - (lien (@ (ref (ref-std "ART_JEX_CONSTRUCTION_PILE"))) - "2023-05-07 Jex en construction : une idéolangue basée sur le principe de pile") - (lien (@ (ref (ref-std "ART_FINGER_OPENBSD"))) - "2023-02-11 Configurer un serveur finger sous OpenBSD") - (lien (@ (ref (ref-std "ART_CATALAN_CURIOSITES"))) - "2022-10-11 Quelques curiosités du catalan") - (lien (@ (ref (ref-std "ART_AYMARA_VOYELLES"))) - "2022-01-05 Chute de voyelles conditionnée morphologiquement en aymara") - (lien (@ (ref (ref-std "ART_AVANT_PROPOS"))) - "2021-12-21 Avant-propos"))) diff --git a/src/articles/index.conv b/src/articles/index.conv @@ -0,0 +1,10 @@ +titre:Cybercarnet +type:page +auteur:~ldp + +=> /~ldp/articles/aplat_1_documents_structures_unix. 2024-01-25 aplat(1) : documents structurés pour Unix +=> /~ldp/articles/jex_construction_ideolangue_pile. 2023-05-07 Jex en construction : une idéolangue basée sur le principe de pile +=> /~ldp/articles/finger_openbsd. 2023-02-11 Configurer un serveur finger sous OpenBSD +=> /~ldp/articles/curiosites_catalan. 2022-10-11 Quelques curiosités du catalan +=> /~ldp/articles/chute_voyelles_aymara. 2022-01-05 Chute de voyelles conditionnée morphologiquement en aymara +=> /~ldp/articles/avant-propos. 2021-12-21 Avant-propos diff --git a/src/articles/jex_construction_ideolangue_pile.aplat b/src/articles/jex_construction_ideolangue_pile.aplat @@ -1,548 +0,0 @@ -(doc - (@ (type "article") - (titre "Jex en construction : une idéolangue basée sur le principe de pile") - (date-pub "2023-05-07") - (date-mod "2023-05-08") - (auteur "Selve") - (lien (ref-std "ART_JEX_CONSTRUCTION_PILE")) - (uuid "309e3ff8-26b7-4bdc-9053-2548bc639943")) - -(par "Les idéolangues m’intéressent depuis longtemps. Ce sont des langues qui -doivent leur existence non pas aux aléas des siècles et des millénaires, mais à -l’activité créative délibérée. C’est en cela qu’elles se distinguent des -« langues naturelles », qui sont le fruit de l’accumulation d’une foule de -mutations spontanées plus ou moins fortuites qui les travaillent et qui les -adaptent graduellement. Ces langues nous sont données avec le monde, et c’est -pour ainsi dire sans effort que nous — c’est-à-dire l’humanité — les avons -créées et les faisons évoluer.") - -(par "Mais à ce mot d’effort que j’emploie, il manque peut-être l’épithète de " -(it "conscient") ", car il s’agit en fait d’un travail colossal. Les linguistes -sont bien au fait de l’infinie complexité des systèmes linguistiques, et malgré -les quelques deux mille quatre cents ans qui ont passé depuis Pāṇini, malgré le -pouvoir de la technique moderne, nous sommes encore bien loin du jour où nous -pourrons dire : « Voici comment fonctionne une langue. »") - -(par "Même après ce jour, l’effort qu’on devra fournir pour extraire -l’information linguistique du cerveau d’un seul locuteur risque d’être -absolument phénoménale. Car la langue est un système fait de centaines de -milliers de règles, nettement plus que ce qu’aucune grammaire de référence n’a -jamais pu arriver à consigner.") - -(par "Et cela sans parler du fait que ces règles purement linguistiques, en plus -du sens conventionnel qu’elles expriment, donnent lieu à un autre niveau de -complexité qui a pour effet de modifier l’interprétation des énoncés en fonction -du contexte dans lequel ils sont prononcés. Quand au restaurant on entend le -serveur nous demander « Est-ce que c’est terminé? », on comprend que ce n’est -qu’une manière de dire « Puis-je vous débarrasser? ». De même, « Je prendrais -bien de l’eau. » veut souvent dire quelque chose comme « Peux-tu me passer de -l’eau? » Ce niveau d’analyse porte le nom de pragmatique et complexifie encore -l’interprétation et l’analyse de la langue.") - -(par "Ainsi, si l’élaboration des langues est inconsciente, elle reste le fruit -d’une somme prodigieuse d’efforts, distribués sur des milliers d’années et entre -des milliers ou des million d’individus. Ce sont des systèmes de ce genre que se -proposent de recréer les idéolinguistes. On imagine bien que cette activité n’a -rien d’évident. L’immense complexité — non pas seulement numérique mais -structurale surtout — d’une langue et la diversité des formes possibles rend en -outre impensable l’élaboration d’une recette fixant la méthode de leur création. -C’est en cela que l’art se distingue de la technique.") - - -(par (@ (type "liens")) - (lien (@ (ref "https://fr.wikipedia.org/wiki/Langue_construite")) - "Page Wikipédia sur les langues construites")) - -(section "Le bon goût idéolinguistique") - -(par "Je souhaite d’abord avertir le lecteur que, l’idéolinguisme étant pour moi -une activité solitaire, et bien que je crois connaître plutôt bien les tendances -de plusieurs communautés idéolinguistiques, je ne saurais m’en faire le -porte-parole, ne serait-ce que le temps de cet article. Gardons alors à l’esprit -que je ne parlerai que de ma perspective et de mes impressions. Quelque chose me -dit cependant que mon comportement et mes idées ne sont pas totalement -originaux.") - -(par "Les formes linguistiques étant infiniment variées, et puisqu’on est bien -forcé de choisir parmi elles si on veut finir un jour par créer une langue, il -faut se donner des critères de sélection permettant de préférer une forme à une -autre ou une idéolangue à une autre. Ces critères dépendent évidement du ou des -buts que visent l’idéolinguiste en créant sa langue. Les combinaisons possibles -sont très variées, donc.") - -(par "Il me semble que tous ces critères, aussi nombreux et divers qu’ils -soient, peuvent être réunis sous le concept de beauté, c’est-à-dire qu’ils sont -tous l’expression d’une certaine conception de la beauté, dans un contexte -particulier. L’idéolinguisme étant un art, la dimension esthétique y joue un -rôle de grande importance dans l’orientation et dans l’évaluation des créations. -Je ne suis jamais encore tombé sur une idéolangue dont le but n’était pas d’être -belle, agréable à entendre ou à utiliser, pour l’idéolinguiste ou pour d’autres. -Même des langues comme le lojban ou l’ithkuil, dont les créateurs mettent -surtout en évidence l’aspect technique, ne sont pas pour autant dépourvues de -motivations esthétiques, ne serait-ce que parce que c’est cet aspect technique -qu’on peut trouver beau ; on ne doit pas sous-estimer la valeur de l’élégance -dans les créations théoriques. Dans ce genre d’œuvre où l’atteinte de l’objectif -— lui-même difficile à définir précisément — est difficile à mesurer, l’idée de -beau est nécessairement liée à celle de bon.") - -(par (@ (type "liens")) - (lien (@ (ref "https://fr.wikipedia.org/wiki/Lojban")) - "Page Wikipédia sur le lojban") - (lien (@ (ref "https://fr.wikipedia.org/wiki/Ithkuil")) - "Page Wikipédia sur l’ithkuil")) - -(par "Souligner l’universalité du critère esthétique ne veut pas dire affirmer -l’existence d’un étalon universel pour juger des idéolangues. En fait, c’est -affirmer précisément l’inverse, car la beauté est éminemment subjective. Tout le -monde ne s’entend pas pour dire que telle ou telle autre idéolangue est belle ou -déplaisante, bien construite ou mal construite, etc. Cela dépend du but de la -langue, ou mieux, de la perception favorable ou défavorable qu’a de ce but celui -qui en juge et de l’appréciation de ce juge quant à l’atteinte de ce but.") - -(par "Mais cette section a pour titre « Le bon goût idéolinguistique ». C’est -donc que tous les jugements ne sont pas égaux, pas entièrement subjectifs. -Encore une fois cependant, pas d’étalon universelle, mais plutôt diffusion et -conventionalisation des jugements esthétiques dans une communauté. Il s’y -installe toujours en effet, qu’on parle d’une communauté qui rassemble des -amateurs des idéolangues ou d’autres choses, une conception plus ou moins -dominante qui impose plus ou moins doucement une idée du beau, un bon goût. Que -ce phénomène soit bon ou mauvais ne m’importe pas présentement, je me contente -de souligner cette tendance générale" (note (par "Je peux tout de même en dire -quelques mots. Une communauté d’individus est fondamentalement une communauté -d’intérêts, et ce sont ces intérêts qui l’unissent et la maintiennent. Ainsi, -si, par exemple, cette communauté rassemble des partisans de la création d’une -langue internationale destinée à favoriser la communication au sein de -l’humanité, il est essentiel d’accorder une certaine prépondérance aux -discussions qui ont trait à ce thème, plutôt qu’aux langues de Tolkien, par -exemple. L’intérêt d’une communauté peut évoluer avec le temps, mais il importe -que ce changement se fasse surtout de l’intérieur, sans quoi la communauté -risque la dissolution. Une certaine unité dans les jugements est donc utile, -nécessaire même, pour favoriser les discussions qui intéressent les membres -d’une communauté. En revanche, des jugements trop intransigeants ne sont pas -favorables à la communauté. Si les intérêts de ses membres sont particulièrement -nichés, elle risque la disparition en refusant l’apport de ceux dont les idées -sont assez semblables mais pas suffisamment compatibles. Si cette intransigeance -est imposée par un petit nombre, elle risque aussi de faire fuir des membres, -qui ne se reconnaîtraient alors plus dans son attitude. Au contraire, il -n’existe pas de ciment plus fort si elle est unanime.")) ".") - -(par "Ce fait a pour corollaire que l’idée de « bon goût » que se fait un -individu dépend grandement des personnes qu’il fréquente, de sa socialisation. -Le plus souvent, il adoptera leurs jugements, et plus ceux avec qui il -interagira viendront d’horizons différents, plus son goût sera raffiné.") - -(par "Je veux donner quelques exemples de communautés d’idéolinguistes, ainsi -que leurs tendances esthétiques. La plus active est probablement celle qui s’est -bâtie autour de r/conlangs, sur Reddit. Elle tend à préférer les idéolangues -naturalistes, qui tentent d’imiter le mieux possibles l’allure et le -fonctionnement des langues naturelles. On observe la même inclination chez le -balado Conlangery.") - -(par (@ (type "liens")) - (lien (@ (ref "https://www.reddit.com/r/conlangs/")) - "Communauté r/conlangs (en anglais)") - (lien (@ (ref "https://conlangery.com/")) - "Le balado Conlangery (en anglais)")) - -(par "Si les idéolangues naturalistes sont solidement ancrées dans la liste de -diffusion Conlang, les idéolangues idéalistes " (note (par "N’ayant pas trouvé -dans la tradition francophone de terme satisfaisant pour traduire « engelang » -ou « engineered language », j’ai décidé d’en forger un moi-même. J’ai choisi -celui d’idéolangue idéaliste car il suggère que les langues de ce genre ont été -créées pour concrétiser un idéal. Dans le cas du lojban, il s’agit de la -minimisation des ambiguïtés à l’aide de la logique des prédicats, dans le cas du -toki pona, il s’agit de la recherche du minimalisme, etc. Il y avait bien -l’option d’« idéolangue expérimentale », mais elle me semble accorder une trop -grande importance à l’originalité et à l’innovation. Toute idéolangue première -en son genre est expérimentale, mais ce n’est pas nécessairement là son trait -caractéristique. Si on se mettait en grande nombre à faire des idéolangues -logiques du même style que le lojban, il s’en suivrait forcément une certaine -normalisation, et l’activité perdrait son caractère expérimental, sans que -l’essence de ce genre d’idéolangues s’en trouve altérée." )) "y trouvent une -belle place. Quant à la liste de diffusion Auxlang, elle est exclusivement -dédiée aux discussions portant sur les idéolangues auxiliaires, c’est-à-dire sur -les langues qui sont créées pour servir de moyen de communication entre les -cultures de langues différentes.") - -(par (@ (type "liens")) - (lien (@ (ref "https://listserv.brown.edu/archives/conlang.html")) - "Liste de diffusion Conlang (en anglais)") - (lien (@ (ref "https://listserv.brown.edu/cgi-bin/wa?A0=AUXLANG")) - "Liste de diffusion Auxlang (en anglais)")) - -(par "L’Atelier est un forum francophone dédié à l’idéolinguisme. J’admets et je -regrette ne pas bien le connaître ; je ne saurais donc pas en donner -l’orientation exacte. D’après mes quelques visites, je crois qu’on y trouve de -tout, beaucoup d’idéolangues personnelles ne se souciant pas nécessairement de -naturalisme, mais aussi des langue idéalistes. Je tenais à mentionner cette -communauté en dépit de mon manque de connaissance, car il s’agit de la seule -communauté francophone que je connais, et je veux l’encourager ; elle est en -outre assez active. Je me donne pour objectif de la fréquenter plus souvent et -d’y participer activement.") - -(par (@ (type "liens")) - (lien (@ (ref "https://aphil.1fr1.net/")) - "L’Atelier")) - -(par "Plusieurs ont peut-être du mal se représenter un jugement esthétique en -idéolinguistique. Sur quoi peut-il porter? Je veux en donner quelques exemples. -Il s’agit de critères d’idéolinguistes naturalistes, car ce sont ceux que je -connais le mieux.") - -(par "Le lecteur sera peut-être surpris d’apprendre qu’un critère comme -l’euphonie joue rarement un rôle déterminant dans la formulations des jugements -sur l’agencement et la distribution des sons d’une langue. Plusieurs communautés -(surtout celles qui tendent à préférer les idéolangues naturalistes) se sont -dotées de moyens plus sophistiqués et objectifs. L’idée de symétrie du système -phonologique en est un. Le système phonologique d’une langue contient l’ensemble -ses sons tels qu’ils sont perçus par ses locuteurs. Un son n’est pas une unité -inanalysable, mais peut être décomposé en une série des traits distinctifs. Le -phonème /p/ a ainsi les traits suivants: pulmonique, occlusive, bilabiale, -sourd, oral, etc ; le phonème /b/ ne diffère de /p/ que par ce qu’il est sonore -(non sourd), donc par la vibration des cordes vocales au moment de le produire ; -le phonème /m/ ne diffère de /b/ que par ce qu’il est nasal (non oral) ; le -phonème /t/ ne diffère de /p/ que par ce qu’il est alvéo-dentale (non -bilabiale) ; etc. Or, on a remarqué que les phonèmes des langues naturelles -tendent à s’organiser autour de ces traits distinctifs. Par exemple, si une -langue possède les occlusives /p/, /t/ et /k/ et qu’elle possède aussi la -version sonore de /k/ (/g/), on s’attend à qu’elle possède aussi les versions -sonores de /p/ et /t/ (/b/ et /d/). Des exceptions existent toujours, mais il -s’agit d’une tendance universelle, et on s’attend à en voir le reflet dans les -idéolangues naturalistes.") - -(par "Un autre exemple de critère esthétique qui sous-tend généralement les -jugements formulés par les idéolinguistes naturalistes a trait à la présence -d’irrégularités. Comme les langues naturelles présentent un nombre variable -d’accidents dans l’application de certaines règles grammaticales, une idéolangue -qui se veut plausible de ce point de vue doit en contenir au moins un certain -nombre. Il en existe deux types : les « irrégularités irrégulières » et les -« irrégularités régulières ». Les première sont les vrais irrégularités, qu’on -doit apprendre par cœur et qu’on ne peut vraiment généraliser. Les secondes sont -en fait le résultat de l’application de certaines règles dans un certain -environnement. Ainsi, la règle du « h » aspiré en français est un exemple -d’irrégularité irrégulière, car il n’existe pas de règle synchronique qui -permette d’identifier les mots qui demandent l’élision de l’article défini et -ceux qui l’interdisent ; il faut apprendre par cœur qu’on dit « le héros » et -non « *l’héros » et qu’on dit « l’harmonie » et non « *la harmonie ». En -revanche, dans une langue comme le catalan, la règle d’élision de l’article -défini est un exemple d’irrégularité régulière. Elle stipule que l’article doit -être élidé devant une voyelle, sauf si cette voyelle est /i/ ou /u/ et qu’elle -n’est pas accentuée" (note (par "Notons cependant que, si en catalan le -placement de l’accentuation suit des tendances morphophonologiques certaines, -plusieurs exceptions existent.")) ". Ainsi, on dit « la universitat » -(l’université) et non « *l’universitat », car ici l’accent tombe sur la dernière -syllabe, et on dit « l’u d’octubre » (le premier octobre) et non « *el u -d’octubre » parce que l’accent tombe sur le /u/. Une idéolangue naturaliste -devrait donc inclure des irrégularités des deux types et devrait idéalement -justifier leur existence à l’aide d’une explication plausible de leur -émergence.") - -(par "Il en existe beaucoup d’autres, et j’aurais pu ajouter à ces critères ceux -de la cohérence interne, du niveau de complexité approprié, de l’originalité des -moyens grammaticaux, de la monumentalité de l’œuvre, etc.") - -(par "L’idée de bon goût idéolinguistique qu’on a développé, n’est pas qu’un -guide, cependant. Il peut parfois dérouter et asservir le disciple. Il m’est en -effet arrivé quelques fois de me dire que la création serait plus simple si on -ne m’avait pas montré de standards aussi élevés, pour ainsi dire. J’ai -d’ailleurs remarqué que les idéolinguistes qui ont commencé leurs activités -avant l’avènement d’internet et donc avant l’établissement de la grande majorité -des communautés idéolinguistiques ont souvent créé une seule langue, à laquelle -ils pouvaient concentrer toutes leur énergie et leur créativité -idéolinguistique. À l’inverse, il n’est pas rare et même plutôt normal -aujourd’hui pour une seule personne de créer une foule de langues plus ou moins -achevées. Si mon impression est vraie, on pourrait proposer que les -idéolinguistes, qui étaient avant complètement coupés (ou presque) de leurs -camarades, tendaient à être plus satisfaits de leur idéolangue que moi et mes -contemporains, qui aurions acquis des standards que nous peinerions à -atteindre.") - -(par "J’ai étudié plusieurs idéolangues et, homme de mon temps, j’ai entrepris -d’en créer un certain nombre. Parmi les quelques heureuses d’entre elles qui ont -dépassé le stade de simple brouillon, il en est une qui, bien que tout soit -relatif, se démarque par sa maturité et la précision de sa description. Cette -langue, je lui avait donné le nom de syosta. Elle possède une grammaire -s’étendant sur un peu plus de cent pages de livres de poche et un dictionnaire -dépassant les quatre cents entrées" (note (par "Peut-être les retoucherai-je un -jour de manière à les rendre publiables ici.")) ". Inutile de dire que les -langues naturelles, de même qu’un grand nombre d’idéolangues, sont beaucoup plus -riches et détaillées, mais ce stade de développement est dans le domaine du -respectable selon moi.") - -(par "Le syosta rassemble un certain nombre de caractéristiques qui me plaisent -beaucoup : l’ergativité, les manipulation de la valence et les contraintes sur -la relativisation, notamment. Mais je n’en suis pas satisfait. Elle est le fruit -d’un projet scolaire et porte la trace de l’empressement avec lequel le -calendrier m’a forcé à en mener le développement. C’est peut-être en raison de -ce manque de temps que je voyais transparaître dans la langue que, une fois le -travail remis, je ne lui ai plus touché.") - -(par "Mon intérêt pour l’idéolinguisme n’a pas faibli, seulement, ce projet m’a -aussi permis de saisir dans sa pleine mesure ce qu’il faut de temps et d’efforts -pour construire une langue, une langue détaillée et subtile, une langue dont je -pourrais être fier, qui pourrait enfin me satisfaire. Je ne peux donc pas me -tromper trop souvent si je veux avoir le temps dans ma vie de créer une langue -mature qui me plaise. Cette entreprise, si je la veux durable, doit dès ses -débuts s’engager sur un chemin favorable.") - -(section "Un principe") - -(par "J’aime croire que je suis un homme de principe ; je veux donc choisir pour -ma langue un principe qu’elle devra pleinement respecter. C’est lui qui guidera -mes choix et c’est par lui que je pourrai mesurer la réussite ou l’échec de mon -idéolangue. Je veux parler du principe que j’ai choisi et des raisons, pratiques -et esthétiques, qui ont conduites à ce choix.") - -(par "Comme on doit déjà l’avoir compris, j’ai été grandement influencé par le -courant naturaliste de l’idéolinguisme ; c’est par lui que j’ai découvert cet -art. Or, depuis quelques temps, je tente de l’abandonner. Ce n’est pas que j’en -rejette maintenant les visées, que je les trouve moins louables, au contraire. -C’est plutôt que, d’abord, j’ai le sentiment que je ne pourrai jamais, dans ce -cadre, créer une idéolangue qui me plaise, qu’il me serait impossible de -satisfaire le principe naturaliste : il est trop ambitieux ; il surpasse mes -capacités. Ensuite, j’ai le bonheur d’avoir découvert un principe alternatif -tout aussi séduisant, seulement, à ma portée je crois.") - -(par "Nous savons depuis Saussure que la langue est une convention arbitraire et -que, dans les limites qu’impose la faculté de langage, la forme d’une langue ne -dépend finalement que d’une suite d’événements contingents. Il suffit pour s’en -convaincre de jeter un coup d’œil à la diversité des langues du monde. Pour -l’idéolinguiste, cela signifie qu’il lui faut choisir parmi une infinité -d’options. Il est facile de se perdre dans cet abondance ; c’est certainement -mon cas. Comment arrêter son choix si on ne connaît qu’une infime fraction des -possibilités? Comment ne pas anticiper un regret en s’imaginant découvrir plus -tard, lorsqu’il sera difficile de reculer, une option qui nous plairait -davantage? Il me faut limiter les options possibles. Je place mon espoir dans la -contrainte et dans l’ignorance.") - -(par "Plus un principe est contraignant, plus il oriente la création. Les -options ne disparaissent pas pour autant, mais un cadre plus restrictif aide à -les filtrer. Je postule que si la contrainte plaît au créateur la création lui -plaira aussi.") - -(par "J’envie parfois les créateurs des premiers temps de l’idéolinguisme pour -qui l’abondance des options devait sembler plus légère. D’une part, d’options, -ils en avaient considérablement moins, car elles ne se diffusaient pas aussi -facilement et étaient donc bien moins accessibles. On n’a pas besoin de ce qu’on -ignore, disait Laborit. D’autre part, les risques d’un choix importaient bien -moins. Non seulement obéissaient-ils à un sens esthétique souvent moins -exigeant, mais aussi le choix lui-même était en quelque sorte secondaire. Les -premiers idéolinguistiques étaient les premiers habitants d’un nouveau monde, et -ce qui importait alors était de défricher, de bâtir et de semer. Il fallait -manger et passer l’hivers ; voilà à quoi se mesurerait le succès. Ces tâches ne -demandent plus autant d'effort et de créativité à nous qu'à nos prédécesseurs, -et aujourd'hui c’est sur l’allure de la maison qu’on se concentre pour juger du -travail d’un idéolinguiste. Ce serait une bonne stratégie, il me semble, pour -alléger le poids et le nombre des options, que de faire comme les anciens et de -défricher de nouvelles terres, là où les conceptions esthétiques que j’ai -acquises perdent de leur pertinence. Les forêts vierges se font rares dans le -domaine du naturalisme.") - -(par "Qu’on me comprenne bien : il ne s’agit pas de faire une langue médiocre. -Il s’agit au contraire de m’organiser pour éviter la médiocrité. J’identifie mes -critères esthétiques, j’identifie mes limites et je cherche le moyen de -satisfaire les uns en respectant les autres. De même, il ne faut pas se -méprendre sur l’attitude : je ne me " (I "résigne") " pas à délaisser le -principe naturaliste, ce n’est pas non plus par résignation que j’adopte un -autre principe. Chronologiquement, l’alternative est arrivé avant le désir -d’alternative ; il n’y a jamais eu recherche, mais trouvaille puis -comparaison.") - -(par "Quel est donc le principe qui orientera le développement de mon -idéolangue? Ce principe sera la pile.") - -(section "La notion de pile") - -(par "Un pile est une structure de données très simple mais aussi très -polyvalente. Elle fonctionne comme une pile ordinaire : les éléments sont -empilés les uns sur les autres, on ne peut accéder qu’à l’élément supérieur et -on ne peut ajouter des éléments à la pile qu’en les plaçant à son sommet.") - -(par (@ (type "liens")) - (lien (@ (ref "https://fr.wikipedia.org/wiki/Pile_(informatique)")) - "Article Wikipédia sur la pile")) - -(par "L’analogie avec un certain mode de calcul arithmétique sert souvent à en -exemplifier le comportement. La pile illustrée ci-bas peut ainsi être le -résultat de l’empilement successif de 8, de 43 et de 61, dans cet ordre.") - -(par (@ (césure "pre")) -" ————— -| 6 1 | <--- Sommet de la pile - ————— -| 4 3 | - —–––— -| 8 | - —————") - -(par "Dans cette configuration, seul 61 est accessible. On peut manipuler la -pile par des opérations. Supposons un opérateur de sommation +. Il -fonctionnerait de la manière suivante : il dépilerait 61, dépilerait 43, en -ferait la somme et empilerait le résultat, dans cet ordre. L’important ici, -c’est que seul l’élément supérieur est accessible. Voici l’état de la pile après -cette opération.") - -(par (@ (césure "pre")) -" ————— -| 104 | - —–––— -| 8 | - —————") - -(par "Un opérateur de soustraction - fonctionnerait de manière analogue. En -voici le résultat.") - -(par (@ (césure "pre")) -" ————— -| -96 | - —————") - -(par "Dans la notation que nous avons coutume d’utiliser, ce calcul peut être -représenté ainsi :") - -(par (@ (césure "pre")) "8 - (43 + 61)") - -(par "Il existe une notation alternative à celle qui nous est familière, dont -les expressions se calculent très simplement à l’aide d’une pile. Il s’agit de -la notation polonaise inverse, dans laquelle, plutôt que de se placer entre -leurs opérandes, les opérateurs se placent à leur droite. Ainsi, 2 + 3 est -s’écrit 2 3 + dans cette notation, et 8 - (61 + 43) s’écrit :") - -(par (@ (césure "pre")) "8 43 61 + -") - -(par "Pour interpréter le résultat à l’aide d’une pile, il suffit de lire les -éléments de gauche à droite, et selon leur nature, de les empiler ou de les -appliquer, les nombres s’empilant et les opérateurs s’appliquant. Voici -l’évolution de la pile au cours de l’interprétation de la représentation de -notre calcul en notation polonaise inverse. Chaque colonne correspond à l’état -de la pile après la lecture d’un élément.") - -(par (@ (césure "pre")) -" ————— - | 6 1 | - ————— ––––– ––––– - | 4 3 | | 4 3 | | 104 | - ––––– —––—– ––––– ––––– ––––– -| 8 | | 8 | | 8 | | 8 | | -96 | - ————— ––––– ––––– ––––– –––––") - -(par "Remarquons que la notation polonaise inverse ne fait pas usage des -parenthèses : l’ordre d’application des opérations est donné par l’ordre -d’apparition des opérateurs correspondants. Ainsi, plutôt que de placer des -parenthèses, on change l’ordre relatif des opérateurs et des opérandes.") - -(par (@ (césure "pre")) -"8 43 61 + - = 8 - (43 + 61) = -96 -8 43 61 - + = 8 + 43 - 61 = -10 -8 43 - 61 + = 8 - 43 + 61 = 26 -…") - -(par (@ (type "liens")) - (lien (@ (ref "https://fr.wikipedia.org/wiki/Notation_polonaise_inverse")) - "Article Wikipédia sur la notation polonaise inverse")) - -(par "Cette notation me séduit par sa simplicité, par sa flexibilité et par son -élégance. Sa simplicité vient de ce que ses règles syntaxiques sont très peu -nombreuses et prévisibles. Elle peut se passer complètement de la notion de la -priorité des opérations, par exemple. Elle est flexible notamment car elle n’est -pas limitée à des opérateurs unaires ou binaires. On peut en effet imaginer un -opérateur ternaire PLUS_MOINS, qui soustrait à un nombre la somme de deux autres -nombres.") - -(par (@ (césure "pre")) -"8 43 61 PLUS_MOINS = -8 43 51 + -") - -(par "On peut aussi imaginer un opérateur empilant plus d’un élément sur la -pile. En voici un exemple assez artificiel :") - -(par (@ (césure "pre")) -"UN_DEUX + = -1 2 +") - -(par "Son élégante vient de sa simplicité et de sa flexibilité.") - -(par "La syntaxe de ma langue fonctionnera donc comme une pile. Peut-être ne -voit-on pas bien comment une langue peut fonctionner selon ce principe. En fait, -on peut faire l’analogie entre nombre et nom et entre opérateur et verbe. Par -exemple :") - -(par (@ (césure "pre")) -"2 1 - -moi pain manger -Je mange du pain.") - -(par (@ (césure "pre")) -"lui Dieu croire -Il croit en Dieu.") - -(par "Mais le modèle de la pile n’est pas équivalent à celui d’une langue tête -finale, dans laquelle la tête est toujours placée à la fin du syntagme. Les -différences fondamentales sont trop complexes pour que je les expose ici ; je -les réserve pour un autre article. Je peux tout de même en donner un exemple. -Puisque la pile est une structure simple, on peut la modifier simplement. On -peut par exemple inverser l’ordre de deux éléments.") - -(par (@ (césure "pre")) -"pain moi INV manger -Je mange du pain.") - -(par "On peut supprimer un élément.") - -(par (@ (césure "pre")) -"moi pain patates SUPP manger -Je mange des patates") - -(par "On peut dupliquer un élément.") - -(par (@ (césure "pre")) -"Ami DUP parle -Un ami parle à un ami (ou : Des amis se parlent)") - -(par "Et cetera.") - -(par "La pile n’est pas un principe idéolinguistique totalement inexploré. Le -fith, entre autres, est basé sur ce principe. Cependant, si sa qualité de -pionnier et la nature du principe suffit à rendre l'idéolangue digne d’éloge, je -ne trouve pas son approche satisfaisante. Le mode d’interprétation des phrases -est très peu détaillé, par exemple. En particulier, je me demande comment un -prédicat (un verbe) peut être modifié s’il consomme ses arguments et disparaît -aussitôt qu’il est placé sur la pile. La langue est somme toute très peu -documentée.") - -(par (@ (type "liens")) - (lien (@ (ref "https://www.frathwiki.com/Fith")) - "Page sur FrathWiki (en anglais)") - (lien (@ (ref "https://web.archive.org/web/20110610231636/http://www.langmaker.com/fith.htm")) - "Page Langmaker archivée (en anglais)") - (lien (@ (ref "https://dedalvs.com/smileys/2019.html")) - "Survol par David J. Peterson (en anglais)")) - -(par "Le principe de pile satisfait tous mes critères. D’abord, il est -contraignant. Il réduit considérablement le nombre des options ; les structures -présentes dans les langues naturelles ou dans d’autres idéolangues ne -s’appliquent pas (ou alors très difficilement) à une langue à pile. Ce fait -contribue beaucoup au respect de la contrainte d’ignorance et réduit encore une -fois le nombre des options. Puisque la pile est un appareil syntaxique très peu -exploré en idéolinguistique, mises à part celles venant du fith et de quelques -autre pionniers, les options se limiteront à ce que je pourrai imaginer.") - -(section "Le jex") - -(par "Cette langue dont je planifie le développement et dont cet article est -l’acte de naissance, je l’ai baptisée jex ([ʒeʃ], « jéche »). J’ai l’intention -d’en faire une idéolangue personnelle, qui se développera en même temps que -moi.") - -(par "Je compte l’apprendre. Les structures d’une idéolangue basée sur le -principe de pile sont évidemment très différentes de celles des langues -naturelles, et on peut douter de la capacité d’un humain à l'apprendre. Je suis -sceptique moi aussi. Je suppose qu’il est impossible pour un humain d’exploiter -tout le potentiel de la pile, mais ça ne veut pas dire qu’un sous-ensemble pas -tout à fait équivalent aux langues naturelles soit hors de sa portée. Ce sera au -moins l’occasion d’en apprendre plus sur notre faculté de langage.") - -(par "Je rendrai compte du développement du jex dans des articles subséquents. -Au travail!") - -(encrage (@ (id "notes")))) diff --git a/src/articles/jex_construction_ideolangue_pile.conv b/src/articles/jex_construction_ideolangue_pile.conv @@ -0,0 +1,230 @@ +titre:Jex en construction : une idéolangue basée sur le principe de pile +date_pub:7 mai 2023 +date_mod:8 mai 2023 +auteur:~ldp +type:article +uuid:309e3ff8-26b7-4bdc-9053-2548bc639943 + +Les idéolangues m’intéressent depuis longtemps. Ce sont des langues qui doivent leur existence non pas aux aléas des siècles et des millénaires, mais à l’activité créative délibérée. C’est en cela qu’elles se distinguent des « langues naturelles », qui sont le fruit de l’accumulation d’une foule de mutations spontanées plus ou moins fortuites qui les travaillent et qui les adaptent graduellement. Ces langues nous sont données avec le monde, et c’est pour ainsi dire sans effort que nous — c’est-à-dire l’humanité — les avons créées et les faisons évoluer. + +Mais à ce mot d’effort que j’emploie, il manque peut-être l’épithète de conscient, car il s’agit en fait d’un travail colossal. Les linguistes sont bien au fait de l’infinie complexité des systèmes linguistiques, et malgré les quelques deux mille quatre cents ans qui ont passé depuis Pāṇini, malgré le pouvoir de la technique moderne, nous sommes encore bien loin du jour où nous pourrons dire : « Voici comment fonctionne une langue. » + +Même après ce jour, l’effort qu’on devra fournir pour extraire l’information linguistique du cerveau d’un seul locuteur risque d’être absolument phénoménale. Car la langue est un système fait de centaines de milliers de règles, nettement plus que ce qu’aucune grammaire de référence n’a jamais pu arriver à consigner. + +Et cela sans parler du fait que ces règles purement linguistiques, en plus du sens conventionnel qu’elles expriment, donnent lieu à un autre niveau de complexité qui a pour effet de modifier l’interprétation des énoncés en fonction du contexte dans lequel ils sont prononcés. Quand au restaurant on entend le serveur nous demander « Est-ce que c’est terminé? », on comprend que ce n’est qu’une manière de dire « Puis-je vous débarrasser? ». De même, « Je prendrais bien de l’eau. » veut souvent dire quelque chose comme « Peux-tu me passer de l’eau? » Ce niveau d’analyse porte le nom de pragmatique et complexifie encore l’interprétation et l’analyse de la langue. + +Ainsi, si l’élaboration des langues est inconsciente, elle reste le fruit d’une somme prodigieuse d’efforts, distribués sur des milliers d’années et entre des milliers ou des million d’individus. Ce sont des systèmes de ce genre que se proposent de recréer les idéolinguistes. On imagine bien que cette activité n’a rien d’évident. L’immense complexité — non pas seulement numérique mais structurale surtout — d’une langue et la diversité des formes possibles rend en outre impensable l’élaboration d’une recette fixant la méthode de leur création. C’est en cela que l’art se distingue de la technique. + +=> https://fr.wikipedia.org/wiki/Langue_construite Page Wikipédia sur les langues construites + +## Le bon goût idéolinguistique + +Je souhaite d’abord avertir le lecteur que, l’idéolinguisme étant pour moi une activité solitaire, et bien que je crois connaître plutôt bien les tendances de plusieurs communautés idéolinguistiques, je ne saurais m’en faire le porte-parole, ne serait-ce que le temps de cet article. Gardons alors à l’esprit que je ne parlerai que de ma perspective et de mes impressions. Quelque chose me dit cependant que mon comportement et mes idées ne sont pas totalement originaux. + +Les formes linguistiques étant infiniment variées, et puisqu’on est bien forcé de choisir parmi elles si on veut finir un jour par créer une langue, il faut se donner des critères de sélection permettant de préférer une forme à une autre ou une idéolangue à une autre. Ces critères dépendent évidement du ou des buts que visent l’idéolinguiste en créant sa langue. Les combinaisons possibles sont très variées, donc. + +Il me semble que tous ces critères, aussi nombreux et divers qu’ils soient, peuvent être réunis sous le concept de beauté, c’est-à-dire qu’ils sont tous l’expression d’une certaine conception de la beauté, dans un contexte particulier. L’idéolinguisme étant un art, la dimension esthétique y joue un rôle de grande importance dans l’orientation et dans l’évaluation des créations. Je ne suis jamais encore tombé sur une idéolangue dont le but n’était pas d’être belle, agréable à entendre ou à utiliser, pour l’idéolinguiste ou pour d’autres. Même des langues comme le lojban ou l’ithkuil, dont les créateurs mettent surtout en évidence l’aspect technique, ne sont pas pour autant dépourvues de motivations esthétiques, ne serait-ce que parce que c’est cet aspect technique qu’on peut trouver beau ; on ne doit pas sous-estimer la valeur de l’élégance dans les créations théoriques. Dans ce genre d’œuvre où l’atteinte de l’objectif — lui-même difficile à définir précisément — est difficile à mesurer, l’idée de beau est nécessairement liée à celle de bon. + +=> https://fr.wikipedia.org/wiki/Lojban Page Wikipédia sur le lojban +=> https://fr.wikipedia.org/wiki/Ithkuil Page Wikipédia sur l’ithkuil + +Souligner l’universalité du critère esthétique ne veut pas dire affirmer l’existence d’un étalon universel pour juger des idéolangues. En fait, c’est affirmer précisément l’inverse, car la beauté est éminemment subjective. Tout le monde ne s’entend pas pour dire que telle ou telle autre idéolangue est belle ou déplaisante, bien construite ou mal construite, etc. Cela dépend du but de la langue, ou mieux, de la perception favorable ou défavorable qu’a de ce but celui qui en juge et de l’appréciation de ce juge quant à l’atteinte de ce but. + +Mais cette section a pour titre « Le bon goût idéolinguistique ». C’est donc que tous les jugements ne sont pas égaux, pas entièrement subjectifs. Encore une fois cependant, pas d’étalon universelle, mais plutôt diffusion et conventionalisation des jugements esthétiques dans une communauté. Il s’y installe toujours en effet, qu’on parle d’une communauté qui rassemble des amateurs des idéolangues ou d’autres choses, une conception plus ou moins dominante qui impose plus ou moins doucement une idée du beau, un bon goût. Que ce phénomène soit bon ou mauvais ne m’importe pas présentement, je me contente de souligner cette tendance générale[1]. + +Ce fait a pour corollaire que l’idée de « bon goût » que se fait un individu dépend grandement des personnes qu’il fréquente, de sa socialisation. Le plus souvent, il adoptera leurs jugements, et plus ceux avec qui il interagira viendront d’horizons différents, plus son goût sera raffiné. + +Je veux donner quelques exemples de communautés d’idéolinguistes, ainsi que leurs tendances esthétiques. La plus active est probablement celle qui s’est bâtie autour de r/conlangs, sur Reddit. Elle tend à préférer les idéolangues naturalistes, qui tentent d’imiter le mieux possibles l’allure et le fonctionnement des langues naturelles. On observe la même inclination chez le balado Conlangery. + +=> https://www.reddit.com/r/conlangs/ Communauté r/conlangs (en anglais) +=> https://conlangery.com/ Le balado Conlangery (en anglais) + +Si les idéolangues naturalistes sont solidement ancrées dans la liste de diffusion Conlang, les idéolangues idéalistes [2]y trouvent une belle place. Quant à la liste de diffusion Auxlang, elle est exclusivement dédiée aux discussions portant sur les idéolangues auxiliaires, c’est-à-dire sur les langues qui sont créées pour servir de moyen de communication entre les cultures de langues différentes. + +=> https://listserv.brown.edu/archives/conlang.html Liste de diffusion Conlang (en anglais) +=> https://listserv.brown.edu/cgi-bin/wa?A0=AUXLANG Liste de diffusion Auxlang (en anglais) + +L’Atelier est un forum francophone dédié à l’idéolinguisme. J’admets et je regrette ne pas bien le connaître ; je ne saurais donc pas en donner l’orientation exacte. D’après mes quelques visites, je crois qu’on y trouve de tout, beaucoup d’idéolangues personnelles ne se souciant pas nécessairement de naturalisme, mais aussi des langue idéalistes. Je tenais à mentionner cette communauté en dépit de mon manque de connaissance, car il s’agit de la seule communauté francophone que je connais, et je veux l’encourager ; elle est en outre assez active. Je me donne pour objectif de la fréquenter plus souvent et d’y participer activement. + +=> https://aphil.1fr1.net/ L’Atelier + +Plusieurs ont peut-être du mal se représenter un jugement esthétique en idéolinguistique. Sur quoi peut-il porter? Je veux en donner quelques exemples. Il s’agit de critères d’idéolinguistes naturalistes, car ce sont ceux que je connais le mieux. + +Le lecteur sera peut-être surpris d’apprendre qu’un critère comme l’euphonie joue rarement un rôle déterminant dans la formulations des jugements sur l’agencement et la distribution des sons d’une langue. Plusieurs communautés (surtout celles qui tendent à préférer les idéolangues naturalistes) se sont dotées de moyens plus sophistiqués et objectifs. L’idée de symétrie du système phonologique en est un. Le système phonologique d’une langue contient l’ensemble ses sons tels qu’ils sont perçus par ses locuteurs. Un son n’est pas une unité inanalysable, mais peut être décomposé en une série des traits distinctifs. Le phonème /p/ a ainsi les traits suivants: pulmonique, occlusive, bilabiale, sourd, oral, etc ; le phonème /b/ ne diffère de /p/ que par ce qu’il est sonore (non sourd), donc par la vibration des cordes vocales au moment de le produire ; le phonème /m/ ne diffère de /b/ que par ce qu’il est nasal (non oral) ; le phonème /t/ ne diffère de /p/ que par ce qu’il est alvéo-dentale (non bilabiale) ; etc. Or, on a remarqué que les phonèmes des langues naturelles tendent à s’organiser autour de ces traits distinctifs. Par exemple, si une langue possède les occlusives /p/, /t/ et /k/ et qu’elle possède aussi la version sonore de /k/ (/g/), on s’attend à qu’elle possède aussi les versions sonores de /p/ et /t/ (/b/ et /d/). Des exceptions existent toujours, mais il s’agit d’une tendance universelle, et on s’attend à en voir le reflet dans les idéolangues naturalistes. + +Un autre exemple de critère esthétique qui sous-tend généralement les jugements formulés par les idéolinguistes naturalistes a trait à la présence d’irrégularités. Comme les langues naturelles présentent un nombre variable d’accidents dans l’application de certaines règles grammaticales, une idéolangue qui se veut plausible de ce point de vue doit en contenir au moins un certain nombre. Il en existe deux types : les « irrégularités irrégulières » et les « irrégularités régulières ». Les première sont les vrais irrégularités, qu’on doit apprendre par cœur et qu’on ne peut vraiment généraliser. Les secondes sont en fait le résultat de l’application de certaines règles dans un certain environnement. Ainsi, la règle du « h » aspiré en français est un exemple d’irrégularité irrégulière, car il n’existe pas de règle synchronique qui permette d’identifier les mots qui demandent l’élision de l’article défini et ceux qui l’interdisent ; il faut apprendre par cœur qu’on dit « le héros » et non « *l’héros » et qu’on dit « l’harmonie » et non « *la harmonie ». En revanche, dans une langue comme le catalan, la règle d’élision de l’article défini est un exemple d’irrégularité régulière. Elle stipule que l’article doit être élidé devant une voyelle, sauf si cette voyelle est /i/ ou /u/ et qu’elle n’est pas accentuée[3]. Ainsi, on dit « la universitat » (l’université) et non « *l’universitat », car ici l’accent tombe sur la dernière syllabe, et on dit « l’u d’octubre » (le premier octobre) et non « *el u d’octubre » parce que l’accent tombe sur le /u/. Une idéolangue naturaliste devrait donc inclure des irrégularités des deux types et devrait idéalement justifier leur existence à l’aide d’une explication plausible de leur émergence. + +Il en existe beaucoup d’autres, et j’aurais pu ajouter à ces critères ceux de la cohérence interne, du niveau de complexité approprié, de l’originalité des moyens grammaticaux, de la monumentalité de l’œuvre, etc. + +L’idée de bon goût idéolinguistique qu’on a développé, n’est pas qu’un guide, cependant. Il peut parfois dérouter et asservir le disciple. Il m’est en effet arrivé quelques fois de me dire que la création serait plus simple si on ne m’avait pas montré de standards aussi élevés, pour ainsi dire. J’ai d’ailleurs remarqué que les idéolinguistes qui ont commencé leurs activités avant l’avènement d’internet et donc avant l’établissement de la grande majorité des communautés idéolinguistiques ont souvent créé une seule langue, à laquelle ils pouvaient concentrer toutes leur énergie et leur créativité idéolinguistique. À l’inverse, il n’est pas rare et même plutôt normal aujourd’hui pour une seule personne de créer une foule de langues plus ou moins achevées. Si mon impression est vraie, on pourrait proposer que les idéolinguistes, qui étaient avant complètement coupés (ou presque) de leurs camarades, tendaient à être plus satisfaits de leur idéolangue que moi et mes contemporains, qui aurions acquis des standards que nous peinerions à atteindre. + +J’ai étudié plusieurs idéolangues et, homme de mon temps, j’ai entrepris d’en créer un certain nombre. Parmi les quelques heureuses d’entre elles qui ont dépassé le stade de simple brouillon, il en est une qui, bien que tout soit relatif, se démarque par sa maturité et la précision de sa description. Cette langue, je lui avait donné le nom de syosta. Elle possède une grammaire s’étendant sur un peu plus de cent pages de livres de poche et un dictionnaire dépassant les quatre cents entrées[4]. Inutile de dire que les langues naturelles, de même qu’un grand nombre d’idéolangues, sont beaucoup plus riches et détaillées, mais ce stade de développement est dans le domaine du respectable selon moi. + +Le syosta rassemble un certain nombre de caractéristiques qui me plaisent beaucoup : l’ergativité, les manipulation de la valence et les contraintes sur la relativisation, notamment. Mais je n’en suis pas satisfait. Elle est le fruit d’un projet scolaire et porte la trace de l’empressement avec lequel le calendrier m’a forcé à en mener le développement. C’est peut-être en raison de ce manque de temps que je voyais transparaître dans la langue que, une fois le travail remis, je ne lui ai plus touché. + +Mon intérêt pour l’idéolinguisme n’a pas faibli, seulement, ce projet m’a aussi permis de saisir dans sa pleine mesure ce qu’il faut de temps et d’efforts pour construire une langue, une langue détaillée et subtile, une langue dont je pourrais être fier, qui pourrait enfin me satisfaire. Je ne peux donc pas me tromper trop souvent si je veux avoir le temps dans ma vie de créer une langue mature qui me plaise. Cette entreprise, si je la veux durable, doit dès ses débuts s’engager sur un chemin favorable. + +## Un principe + +J’aime croire que je suis un homme de principe ; je veux donc choisir pour ma langue un principe qu’elle devra pleinement respecter. C’est lui qui guidera mes choix et c’est par lui que je pourrai mesurer la réussite ou l’échec de mon idéolangue. Je veux parler du principe que j’ai choisi et des raisons, pratiques et esthétiques, qui ont conduites à ce choix. + +Comme on doit déjà l’avoir compris, j’ai été grandement influencé par le courant naturaliste de l’idéolinguisme ; c’est par lui que j’ai découvert cet art. Or, depuis quelques temps, je tente de l’abandonner. Ce n’est pas que j’en rejette maintenant les visées, que je les trouve moins louables, au contraire. C’est plutôt que, d’abord, j’ai le sentiment que je ne pourrai jamais, dans ce cadre, créer une idéolangue qui me plaise, qu’il me serait impossible de satisfaire le principe naturaliste : il est trop ambitieux ; il surpasse mes capacités. Ensuite, j’ai le bonheur d’avoir découvert un principe alternatif tout aussi séduisant, seulement, à ma portée je crois. + +Nous savons depuis Saussure que la langue est une convention arbitraire et que, dans les limites qu’impose la faculté de langage, la forme d’une langue ne dépend finalement que d’une suite d’événements contingents. Il suffit pour s’en convaincre de jeter un coup d’œil à la diversité des langues du monde. Pour l’idéolinguiste, cela signifie qu’il lui faut choisir parmi une infinité d’options. Il est facile de se perdre dans cet abondance ; c’est certainement mon cas. Comment arrêter son choix si on ne connaît qu’une infime fraction des possibilités? Comment ne pas anticiper un regret en s’imaginant découvrir plus tard, lorsqu’il sera difficile de reculer, une option qui nous plairait davantage? Il me faut limiter les options possibles. Je place mon espoir dans la contrainte et dans l’ignorance. + +Plus un principe est contraignant, plus il oriente la création. Les options ne disparaissent pas pour autant, mais un cadre plus restrictif aide à les filtrer. Je postule que si la contrainte plaît au créateur la création lui plaira aussi. + +J’envie parfois les créateurs des premiers temps de l’idéolinguisme pour qui l’abondance des options devait sembler plus légère. D’une part, d’options, ils en avaient considérablement moins, car elles ne se diffusaient pas aussi facilement et étaient donc bien moins accessibles. On n’a pas besoin de ce qu’on ignore, disait Laborit. D’autre part, les risques d’un choix importaient bien moins. Non seulement obéissaient-ils à un sens esthétique souvent moins exigeant, mais aussi le choix lui-même était en quelque sorte secondaire. Les premiers idéolinguistiques étaient les premiers habitants d’un nouveau monde, et ce qui importait alors était de défricher, de bâtir et de semer. Il fallait manger et passer l’hivers ; voilà à quoi se mesurerait le succès. Ces tâches ne demandent plus autant d'effort et de créativité à nous qu'à nos prédécesseurs, et aujourd'hui c’est sur l’allure de la maison qu’on se concentre pour juger du travail d’un idéolinguiste. Ce serait une bonne stratégie, il me semble, pour alléger le poids et le nombre des options, que de faire comme les anciens et de défricher de nouvelles terres, là où les conceptions esthétiques que j’ai acquises perdent de leur pertinence. Les forêts vierges se font rares dans le domaine du naturalisme. + +Qu’on me comprenne bien : il ne s’agit pas de faire une langue médiocre. Il s’agit au contraire de m’organiser pour éviter la médiocrité. J’identifie mes critères esthétiques, j’identifie mes limites et je cherche le moyen de satisfaire les uns en respectant les autres. De même, il ne faut pas se méprendre sur l’attitude : je ne me résigne pas à délaisser le principe naturaliste, ce n’est pas non plus par résignation que j’adopte un autre principe. Chronologiquement, l’alternative est arrivé avant le désir d’alternative ; il n’y a jamais eu recherche, mais trouvaille puis comparaison. + +Quel est donc le principe qui orientera le développement de mon idéolangue? Ce principe sera la pile. + +## La notion de pile + +Un pile est une structure de données très simple mais aussi très polyvalente. Elle fonctionne comme une pile ordinaire : les éléments sont empilés les uns sur les autres, on ne peut accéder qu’à l’élément supérieur et on ne peut ajouter des éléments à la pile qu’en les plaçant à son sommet. + +=> https://fr.wikipedia.org/wiki/Pile_(informatique) Article Wikipédia sur la pile + +L’analogie avec un certain mode de calcul arithmétique sert souvent à en exemplifier le comportement. La pile illustrée ci-bas peut ainsi être le résultat de l’empilement successif de 8, de 43 et de 61, dans cet ordre. + +``` + ————— +| 6 1 | <--- Sommet de la pile + ————— +| 4 3 | + —–––— +| 8 | + ————— +``` + +Dans cette configuration, seul 61 est accessible. On peut manipuler la pile par des opérations. Supposons un opérateur de sommation +. Il fonctionnerait de la manière suivante : il dépilerait 61, dépilerait 43, en ferait la somme et empilerait le résultat, dans cet ordre. L’important ici, c’est que seul l’élément supérieur est accessible. Voici l’état de la pile après cette opération. + +``` + ————— +| 104 | + —–––— +| 8 | + ————— +``` + +Un opérateur de soustraction - fonctionnerait de manière analogue. En voici le résultat. + +``` + ————— +| -96 | + ————— +``` + +Dans la notation que nous avons coutume d’utiliser, ce calcul peut être représenté ainsi : + +``` +8 - (43 + 61) +``` + +Il existe une notation alternative à celle qui nous est familière, dont les expressions se calculent très simplement à l’aide d’une pile. Il s’agit de la notation polonaise inverse, dans laquelle, plutôt que de se placer entre leurs opérandes, les opérateurs se placent à leur droite. Ainsi, 2 + 3 est s’écrit 2 3 + dans cette notation, et 8 - (61 + 43) s’écrit : + +``` +8 43 61 + - +``` + +Pour interpréter le résultat à l’aide d’une pile, il suffit de lire les éléments de gauche à droite, et selon leur nature, de les empiler ou de les appliquer, les nombres s’empilant et les opérateurs s’appliquant. Voici l’évolution de la pile au cours de l’interprétation de la représentation de notre calcul en notation polonaise inverse. Chaque colonne correspond à l’état de la pile après la lecture d’un élément. + +``` + ————— + | 6 1 | + ————— ––––– ––––– + | 4 3 | | 4 3 | | 104 | + ––––– —––—– ––––– ––––– ––––– +| 8 | | 8 | | 8 | | 8 | | -96 | + ————— ––––– ––––– ––––– ––––– +``` + +Remarquons que la notation polonaise inverse ne fait pas usage des parenthèses : l’ordre d’application des opérations est donné par l’ordre d’apparition des opérateurs correspondants. Ainsi, plutôt que de placer des parenthèses, on change l’ordre relatif des opérateurs et des opérandes. + +``` +8 43 61 + - = 8 - (43 + 61) = -96 +8 43 61 - + = 8 + 43 - 61 = -10 +8 43 - 61 + = 8 - 43 + 61 = 26 +… +``` + +=> https://fr.wikipedia.org/wiki/Notation_polonaise_inverse Article Wikipédia sur la notation polonaise inverse + +Cette notation me séduit par sa simplicité, par sa flexibilité et par son élégance. Sa simplicité vient de ce que ses règles syntaxiques sont très peu nombreuses et prévisibles. Elle peut se passer complètement de la notion de la priorité des opérations, par exemple. Elle est flexible notamment car elle n’est pas limitée à des opérateurs unaires ou binaires. On peut en effet imaginer un opérateur ternaire PLUS_MOINS, qui soustrait à un nombre la somme de deux autres nombres. + +``` +8 43 61 PLUS_MOINS = +8 43 51 + - +``` + +On peut aussi imaginer un opérateur empilant plus d’un élément sur la pile. En voici un exemple assez artificiel : + +``` +UN_DEUX + = +1 2 + +``` + +Son élégante vient de sa simplicité et de sa flexibilité. + +La syntaxe de ma langue fonctionnera donc comme une pile. Peut-être ne voit-on pas bien comment une langue peut fonctionner selon ce principe. En fait, on peut faire l’analogie entre nombre et nom et entre opérateur et verbe. Par exemple : + +``` +2 1 - +moi pain manger +Je mange du pain. +``` + +``` +lui Dieu croire +Il croit en Dieu. +``` + +Mais le modèle de la pile n’est pas équivalent à celui d’une langue tête finale, dans laquelle la tête est toujours placée à la fin du syntagme. Les différences fondamentales sont trop complexes pour que je les expose ici ; je les réserve pour un autre article. Je peux tout de même en donner un exemple. Puisque la pile est une structure simple, on peut la modifier simplement. On peut par exemple inverser l’ordre de deux éléments. + +``` +pain moi INV manger +Je mange du pain. +``` + +On peut supprimer un élément. + +``` +moi pain patates SUPP manger +Je mange des patates +``` + +On peut dupliquer un élément. + +``` +Ami DUP parle +Un ami parle à un ami (ou : Des amis se parlent) +``` + +Et cetera. + +La pile n’est pas un principe idéolinguistique totalement inexploré. Le fith, entre autres, est basé sur ce principe. Cependant, si sa qualité de pionnier et la nature du principe suffit à rendre l'idéolangue digne d’éloge, je ne trouve pas son approche satisfaisante. Le mode d’interprétation des phrases est très peu détaillé, par exemple. En particulier, je me demande comment un prédicat (un verbe) peut être modifié s’il consomme ses arguments et disparaît aussitôt qu’il est placé sur la pile. La langue est somme toute très peu documentée. + +=> https://www.frathwiki.com/Fith Page sur FrathWiki (en anglais) +=> https://web.archive.org/web/20110610231636/http://www.langmaker.com/fith.htm Page Langmaker archivée (en anglais) +=> https://dedalvs.com/smileys/2019.html Survol par David J. Peterson (en anglais) + +Le principe de pile satisfait tous mes critères. D’abord, il est contraignant. Il réduit considérablement le nombre des options ; les structures présentes dans les langues naturelles ou dans d’autres idéolangues ne s’appliquent pas (ou alors très difficilement) à une langue à pile. Ce fait contribue beaucoup au respect de la contrainte d’ignorance et réduit encore une fois le nombre des options. Puisque la pile est un appareil syntaxique très peu exploré en idéolinguistique, mises à part celles venant du fith et de quelques autre pionniers, les options se limiteront à ce que je pourrai imaginer. + +## Le jex + +Cette langue dont je planifie le développement et dont cet article est l’acte de naissance, je l’ai baptisée jex ([ʒeʃ], « jéche »). J’ai l’intention d’en faire une idéolangue personnelle, qui se développera en même temps que moi. + +Je compte l’apprendre. Les structures d’une idéolangue basée sur le principe de pile sont évidemment très différentes de celles des langues naturelles, et on peut douter de la capacité d’un humain à l'apprendre. Je suis sceptique moi aussi. Je suppose qu’il est impossible pour un humain d’exploiter tout le potentiel de la pile, mais ça ne veut pas dire qu’un sous-ensemble pas tout à fait équivalent aux langues naturelles soit hors de sa portée. Ce sera au moins l’occasion d’en apprendre plus sur notre faculté de langage. + +Je rendrai compte du développement du jex dans des articles subséquents. Au travail! + +## Notes + +[1] Je peux tout de même en dire quelques mots. Une communauté d’individus est fondamentalement une communauté d’intérêts, et ce sont ces intérêts qui l’unissent et la maintiennent. Ainsi, si, par exemple, cette communauté rassemble des partisans de la création d’une langue internationale destinée à favoriser la communication au sein de l’humanité, il est essentiel d’accorder une certaine prépondérance aux discussions qui ont trait à ce thème, plutôt qu’aux langues de Tolkien, par exemple. L’intérêt d’une communauté peut évoluer avec le temps, mais il importe que ce changement se fasse surtout de l’intérieur, sans quoi la communauté risque la dissolution. Une certaine unité dans les jugements est donc utile, nécessaire même, pour favoriser les discussions qui intéressent les membres d’une communauté. En revanche, des jugements trop intransigeants ne sont pas favorables à la communauté. Si les intérêts de ses membres sont particulièrement nichés, elle risque la disparition en refusant l’apport de ceux dont les idées sont assez semblables mais pas suffisamment compatibles. Si cette intransigeance est imposée par un petit nombre, elle risque aussi de faire fuir des membres, qui ne se reconnaîtraient alors plus dans son attitude. Au contraire, il n’existe pas de ciment plus fort si elle est unanime. + +[2] N’ayant pas trouvé dans la tradition francophone de terme satisfaisant pour traduire « engelang » ou « engineered language », j’ai décidé d’en forger un moi-même. J’ai choisi celui d’idéolangue idéaliste car il suggère que les langues de ce genre ont été créées pour concrétiser un idéal. Dans le cas du lojban, il s’agit de la minimisation des ambiguïtés à l’aide de la logique des prédicats, dans le cas du toki pona, il s’agit de la recherche du minimalisme, etc. Il y avait bien l’option d’« idéolangue expérimentale », mais elle me semble accorder une trop grande importance à l’originalité et à l’innovation. Toute idéolangue première en son genre est expérimentale, mais ce n’est pas nécessairement là son trait caractéristique. Si on se mettait en grande nombre à faire des idéolangues logiques du même style que le lojban, il s’en suivrait forcément une certaine normalisation, et l’activité perdrait son caractère expérimental, sans que l’essence de ce genre d’idéolangues s’en trouve altérée. + +[3] Notons cependant que, si en catalan le placement de l’accentuation suit des tendances morphophonologiques certaines, plusieurs exceptions existent. + +[4] Peut-être les retoucherai-je un jour de manière à les rendre publiables ici. diff --git a/src/florilege/index.aplat b/src/florilege/index.aplat @@ -1,59 +0,0 @@ -(doc - (@ (type "florilège") - (titre "Florilège") - (date-pub "2021-12-21") - (date-mod "2023-03-2023") - (description "Pensées, citations, etc. que je veux partager.") - (lien (ref-std "FLO")) - (uuid "ded944ec-11b6-425d-bd63-5f3a8b3d1d31")) - -(section "11 mars 2023") - -(par "Je suis depuis longtemps à la recherche d’une traduction française de -« hack » et de ses dérivés « hacker » et « hacking ». « Bidouilleur » et -« bricoleur » sont certes en usage, mais certains termes de la série sont très -peu usités dans ce contexte : « bidouille » et « bricole », par exemple. Il -existe pourtant un mot employé au Québec qui recouvre à peu près le même domaine -sémantique que « hack » et cie. et qui dispose de tous les dérivés nécessaires -pour traduire le concept anglais. Il s’agit de « patente », « patenter », -« patenteux » et « patentage ».") - -(par "Le Dictionnaire Québécois d’aujourd’hui (1992) donne les définitions suivantes :" -(liste - (elem "« Patente » : « Invention, chose nouvelle, procédé ingénieux, parfois - un peu bizarre. »") - (elem "« Patenter » : « Installer, monter qqch. avec des moyens de fortune. », - « Réparer, arranger temporairement, et tant bien que mal, qqch. » et - « Inventer qqch., mettre qqch. au point. »") - (elem "« Patentage » : « Fait de patenter. »") - (elem "« Patenteux » (ou « patenteur ») : « Inventeur; inventif » et - « Personne qui répare, rafistole qqch. avec des moyens de fortune. »"))) - -(par "Il est vrai que le Dictionnaire donne d’autres définitions qui concordent -moins bien avec l’idée de « hack » en anglais, mais il s’agit ici d’un cas de -polysémie et on ne pourrait lui accorder grande importance, car ce genre -d’obstacle est si fréquent que ce serait nous empêcher de traduire en toute -circonstance.") - -(par "C'est donc ces mots que j'emploierai dorénavant.") - -(section "10 mars 2022") - -(par (@ (citation (auteur "François de La Rochefoucauld"))) -"Ce que nous prenons pour des vertus n’est souvent qu’un assemblage de diverses -actions et de divers intérêts, que la fortune ou notre industrie savent arranger -; et ce n’est pas toujours par valeur et par chasteté que les hommes sont -vaillants, et que les femmes sont chastes.") - -(par "Première des Maximes de François de La Rochefoucauld. Profonde en dépit du -sexisme dont elle est teintée.") - -(section "31 décembre 2021") - -(par "C’est une grande sérénité qu’autorise la certitude que tout a un terme et -que le temps avance inexorablement.") - -(section "21 décemble 2021") - -(par "Être féministe ou antiraciste et ne pas être anarchiste, c’est faire -preuve de discrimination entre les opprimés.")) diff --git a/src/florilege/index.conv b/src/florilege/index.conv @@ -0,0 +1,34 @@ +titre:Florilège +type:florilege +auteur:~ldp + +## 11 mars 2023 + +Je suis depuis longtemps à la recherche d’une traduction française de « hack » et de ses dérivés « hacker » et « hacking ». « Bidouilleur » et « bricoleur » sont certes en usage, mais certains termes de la série sont très peu usités dans ce contexte : « bidouille » et « bricole », par exemple. Il existe pourtant un mot employé au Québec qui recouvre à peu près le même domaine sémantique que « hack » et cie. et qui dispose de tous les dérivés nécessaires pour traduire le concept anglais. Il s’agit de « patente », « patenter », « patenteux » et « patentage ». + +Le Dictionnaire Québécois d’aujourd’hui (1992) donne les définitions suivantes : +* « Patente » : « Invention, chose nouvelle, procédé ingénieux, parfois un peu bizarre. » +* « Patenter » : « Installer, monter qqch. avec des moyens de fortune. », « Réparer, arranger temporairement, et tant bien que mal, qqch. » et « Inventer qqch., mettre qqch. au point. » +* « Patentage » : « Fait de patenter. » +* « Patenteux » (ou « patenteur ») : « Inventeur; inventif » et « Personne qui répare, rafistole qqch. avec des moyens de fortune. » + + +Il est vrai que le Dictionnaire donne d’autres définitions qui concordent moins bien avec l’idée de « hack » en anglais, mais il s’agit ici d’un cas de polysémie et on ne pourrait lui accorder grande importance, car ce genre d’obstacle est si fréquent que ce serait nous empêcher de traduire en toute circonstance. + +C'est donc ces mots que j'emploierai dorénavant. + +## 10 mars 2022 + +Ce que nous prenons pour des vertus n’est souvent qu’un assemblage de diverses actions et de divers intérêts, que la fortune ou notre industrie savent arranger ; et ce n’est pas toujours par valeur et par chasteté que les hommes sont vaillants, et que les femmes sont chastes. + +Première des Maximes de François de La Rochefoucauld. Profonde en dépit du sexisme dont elle est teintée. + +## 31 décembre 2021 + +C’est une grande sérénité qu’autorise la certitude que tout a un terme et que le temps avance inexorablement. + +## 21 décemble 2021 + +Être féministe ou antiraciste et ne pas être anarchiste, c’est faire preuve de discrimination entre les opprimés. + +=> /~ldp/ Retourner à la page d'accueil diff --git a/src/flux/cybercarnet.special.aplat b/src/flux/cybercarnet.special.aplat @@ -1,13 +0,0 @@ -(doc - (@ (type "atom") - (type-contenu "article") - (titre (si (@ (#dest=web "Le Site Internet")) - "La Capsule Gemini") - " de Selve") - (sous-titre "Les articles " - (si (@ (#dest=web "du site Internet")) - "de la capsule Gemini") - " de Selve") - (auteur "Selve") - (cible (ref-std "ACCUEIL")) - (uuid "f09e671b-34d3-4ea6-81a9-f71ef2e6277e"))) diff --git a/src/flux/cybercarnet_gemini.atom.cp b/src/flux/cybercarnet_gemini.atom.cp @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="utf-8"?> +<feed xmlns="http://www.w3.org/2005/Atom"> + + <title>Le Cybercarnet d'~ldp</title> + <link href="gemini://asteride.xyz/~ldp/" /> + <id>urn:uuid:f09e671b-34d3-4ea6-81a9-f71ef2e6277e</id> + + <entry> + <title>aplat(1) : documents structurés pour Unix</title> + <link href="gemini://asteride.xyz/~ldp/articles/aplat_1_documents_structures_unix.gmi" /> + <id>urn:uuid:89352ae7-b5d5-4c87-bf51-edd280ae0c62</id> + <published>2024-01-25</published> + <author><name>~ldp</name></author> + <updated>2024-01-26</updated> + </entry> + + <entry> + <title>Jex en construction : une idéolangue basée sur le principe de pile</title> + <link href="gemini://asteride.xyz/~ldp/articles/jex_construction_ideolangue_pile.gmi" /> + <id>urn:uuid:309e3ff8-26b7-4bdc-9053-2548bc639943</id> + <published>2023-05-07</published> + <author><name>~ldp</name></author> + <updated>2023-05-08</updated> + </entry> + + <entry> + <title>Configurer un serveur finger sous OpenBSD</title> + <link href="gemini://asteride.xyz/~ldp/articles/finger_openbsd.gmi" /> + <id>urn:uuid:f4c6527f-504d-4e4f-946e-fbb0b7e659d7</id> + <published>2023-02-11</published> + <author><name>~ldp</name></author> + <updated>2023-10-22</updated> + </entry> + + <entry> + <title>Quelques curiosités du catalan</title> + <link href="gemini://asteride.xyz/~ldp/articles/curiosites_catalan.gmi" /> + <id>urn:uuid:96585df5-41e7-4910-98b3-7ffc503e114c</id> + <published>2022-09-11</published> + <author><name>~ldp</name></author> + <updated>2023-04-07</updated> + </entry> + + <entry> + <title>Chute de voyelles conditionnée morphologiquement en aymara</title> + <link href="gemini://asteride.xyz/~ldp/articles/chute_voyelles_aymara.gmi" /> + <id>urn:uuid:6f484b41-5262-4643-9d31-57c782a7ceab</id> + <published>2022-01-05</published> + <author><name>~ldp</name></author> + <updated>2023-04-07</updated> + </entry> + + <entry> + <title>Avant-propos</title> + <link href="gemini://asteride.xyz/~ldp/articles/avant-propos.gmi" /> + <id>urn:uuid:8473c6b7-2371-45c6-9670-041596b4c712</id> + <published>2021-12-21</published> + <author><name>~ldp</name></author> + <updated>2023-10-23</updated> + </entry> + +</feed> diff --git a/src/flux/cybercarnet_https.atom.cp b/src/flux/cybercarnet_https.atom.cp @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="utf-8"?> +<feed xmlns="http://www.w3.org/2005/Atom"> + + <title>Le Cybercarnet d'~ldp</title> + <link href="https://asteride.xyz/~ldp/" /> + <id>urn:uuid:f09e671b-34d3-4ea6-81a9-f71ef2e6277e</id> + + <entry> + <title>aplat(1) : documents structurés pour Unix</title> + <link href="https://asteride.xyz/~ldp/articles/aplat_1_documents_structures_unix.html" /> + <id>urn:uuid:89352ae7-b5d5-4c87-bf51-edd280ae0c62</id> + <published>2024-01-25</published> + <author><name>~ldp</name></author> + <updated>2024-01-26</updated> + </entry> + + <entry> + <title>Jex en construction : une idéolangue basée sur le principe de pile</title> + <link href="https://asteride.xyz/~ldp/articles/jex_construction_ideolangue_pile.html" /> + <id>urn:uuid:309e3ff8-26b7-4bdc-9053-2548bc639943</id> + <published>2023-05-07</published> + <author><name>~ldp</name></author> + <updated>2023-05-08</updated> + </entry> + + <entry> + <title>Configurer un serveur finger sous OpenBSD</title> + <link href="https://asteride.xyz/~ldp/articles/finger_openbsd.html" /> + <id>urn:uuid:f4c6527f-504d-4e4f-946e-fbb0b7e659d7</id> + <published>2023-02-11</published> + <author><name>~ldp</name></author> + <updated>2023-10-22</updated> + </entry> + + <entry> + <title>Quelques curiosités du catalan</title> + <link href="https://asteride.xyz/~ldp/articles/curiosites_catalan.html" /> + <id>urn:uuid:96585df5-41e7-4910-98b3-7ffc503e114c</id> + <published>2022-09-11</published> + <author><name>~ldp</name></author> + <updated>2023-04-07</updated> + </entry> + + <entry> + <title>Chute de voyelles conditionnée morphologiquement en aymara</title> + <link href="https://asteride.xyz/~ldp/articles/chute_voyelles_aymara.html" /> + <id>urn:uuid:6f484b41-5262-4643-9d31-57c782a7ceab</id> + <published>2022-01-05</published> + <author><name>~ldp</name></author> + <updated>2023-04-07</updated> + </entry> + + <entry> + <title>Avant-propos</title> + <link href="https://asteride.xyz/~ldp/articles/avant-propos.html" /> + <id>urn:uuid:8473c6b7-2371-45c6-9670-041596b4c712</id> + <published>2021-12-21</published> + <author><name>~ldp</name></author> + <updated>2023-10-23</updated> + </entry> + +</feed> diff --git a/src/flux/index.aplat b/src/flux/index.aplat @@ -1,24 +0,0 @@ -(doc - (@ (titre "S’abonner") - (type "page") - (date-pub "2023-10-27") - (auteur "Selve") - (lien (ref-std "PAGE_FLUX")) - (uuid "5b661cbe-9add-4abc-94b1-944f681c3f47")) - -(par "Il est possible de s’abonner au cybercarnet par l’un des trois flux Atom -ci-dessous. Ils ne diffèrent que par le protocole que les liens qu’ils -contiennent utilisent (gemini, http ou https). Ces trois flux sont accessibles -depuis ces mêmes trois protocoles. On peut ainsi, par exemple, télécharger par -le protocole https le flux contenant des liens gemini vers les articles.") - -(si (@ (#dest=web (par "Si vous hésitez, les chances sont que ce soit le flux -https qui vous convienne le mieux.")))) - - (par (@ (type "liens")) - (lien (@ (ref (ref-std "FLUX_CYBERCARNET_GEMINI"))) - "Flux gemini (" (ref-std "FLUX_CYBERCARNET_GEMINI") ")") - (lien (@ (ref (ref-std "FLUX_CYBERCARNET_HTTPS"))) - "Flux https (" (ref-std "FLUX_CYBERCARNET_HTTPS") ")") - (lien (@ (ref (ref-std "FLUX_CYBERCARNET_HTTP"))) - "Flux http (" (ref-std "FLUX_CYBERCARNET_HTTP") ")"))) diff --git a/src/flux/index.conv b/src/flux/index.conv @@ -0,0 +1,10 @@ +titre:S’abonner +auteur:~ldp +date_pub:27 octobre 2023 +date_mod:4 juin 2024 +type:page + +Il est possible de s’abonner au cybercarnet par l’un des deux flux Atom ci-dessous. Ils ne diffèrent que par le protocole que les liens qu’ils contiennent utilisent (gemini ou https). Ces deux flux sont accessibles depuis ces mêmes deux protocoles. On peut ainsi, par exemple, télécharger par le protocole https le flux contenant des liens gemini. + +=> /~ldp/flux/cybercarnet_gemini.atom Flux gemini +=> /~ldp/flux/cybercarnet_https.atom Flux https diff --git a/src/humans.special.aplat b/src/humans.special.aplat @@ -1,20 +0,0 @@ -(doc (@ (césure "pre") - (type "humans.txt") - (date-pub "2021-12-21") - (date-mod "2023-09-30") - (lien (ref-std "HUMANS.TXT")) - (uuid "f1a09e9d-2a18-4d45-92d1-f2b6e762fad6")) -"/* SITE */ -Nom: Selve -Gemini: gemini://asteride.xyz/~selve/ -Web: https://asteride.xyz/~selve/ -Date de création: 21 décembre 2021 -Dernière mise a jour: "(DMAJ)" -Langue: Français - -/* AUTEUR */ -Selve - -/* LIENS */ -Courriel: selve@asteride.xyz -Finger: selve@asteride.xyz") diff --git a/src/humans.txt.cp b/src/humans.txt.cp @@ -0,0 +1,14 @@ +/* SITE */ +Nom: ldp +Gemini: gemini://asteride.xyz/~ldp/ +Web: https://asteride.xyz/~ldp/ +Date de création: 21 décembre 2021 +Dernière mise a jour: 7 août 2024 +Langue: Français + +/* AUTEUR */ +Loïc Daignault-Pichette + +/* LIENS */ +Courriel: ldp@asteride.xyz +Finger: ldp@asteride.xyz diff --git a/src/index.aplat b/src/index.aplat @@ -1,101 +0,0 @@ -(doc - (@ (type "accueil") - (titre (si (@ (#dest=web "Le Site Internet")) - "La Capsule Gemini") - " de Selve") - (date-pub "2021-12-21") - (date-mod "2023-10-01") - (auteur "Selve") - (lien (ref-std "ACCUEIL")) - (uuid "3845624c-af93-44f2-940c-3c89f92621b1")) - - (section "Bienvenue!") - - (par -"Je suis Selve et je vous souhaite la bienvenue sur " - (si (@ (#dest=web "mon site. Il est encore menu")) - "ma capsule. Elle est encore menue") -", mais je crois qu’on peut déjà y trouver quelques attraits. Je " - (si (@ (#dest=web "le")) - "la") -" présente plus complètement dans l’avant-propos que je lui ai consacré, -et dont je recommande la lecture.") - - (par (@ (type "liens")) - (lien (@ (ref (ref-std ART_AVANT_PROPOS))) - "Avant-propos")) - - (si (@ (#dest=web (par "Ce site est aussi disponible sur gemini.") - (par (@ (type "liens")) - (lien (@ (ref gemini://asteride.xyz/~selve/)) - "Ma capsule"))))) - - (section "Cybercarnet") - - (par -"Il est composé d’articles que j’ai écrits pour " - (si (@ (#dest=web "ce site.")) - "cette capsule.")) - - (par (@ (type "liens")) - (lien (@ (ref (ref-std "ART"))) - "Cybercarnet")) - - (par -"On peut s’y abonner par l’un des flux Atom qu'on trouvera dans la page -ci-dessous.") - - (par (@ (type "liens")) - (lien (@ (ref (ref-std "PAGE_FLUX"))) - "Flux Atom")) - - (section "Florilège") - - (par -"J’alimente aussi un florilège. C’est quelque chose comme un microblogue, qui -rassemble(ra) quelques-unes des citations que j’ai aimées, de même que certaines -pensées que j’ai eues et qui ne méritent pas nécessairement un article complet. -Je l’augmente périodiquement.") - - (par (@ (type "liens")) - (lien (@ (ref (ref-std "FLO"))) - "Florilège")) - - (section "Autres endroits à visiter") - - (par - (si (@ (#dest=web "Mon site")) - "Ma capsule") -" n’est pas le seul endroit de tout Internet qui vaille la peine d’être visité. -Je rassemble ici quelques bonnes adresses.") - - (par (@ (type "liens")) - (lien (@ (ref (ref-std "PAGE_A_VISITER"))) - "À visiter")) - - (section "Contact") - - (par -"On peut me contacter par courriel à l’adresse suivante.") - - (par (@ (type "liens")) - (lien (@ (ref "mailto:selve@asteride.xyz")) - "selve@asteride.xyz")) - - (par -"On peut aussi obtenir de l’information sur moi en consultant mon serveur -finger.") - - (par (@ (type "liens")) - (lien (@ (ref "finger://selve@asteride.xyz")) - "selve@asteride.xyz")) - - (section "Licence") - - (par -"Tout ce qui se trouve ici et qui vient de moi est disponible sous la licence -CC-BY-NC-SA.") - - (par (@ (type "liens")) - (lien (@ (ref "https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.fr")) - "Licence CC-BY-NC-SA"))) diff --git a/src/index.conv b/src/index.conv @@ -0,0 +1,48 @@ +titre:Le Site d'~ldp +message:~ Depuis le 21 décembre 2021 ~ +auteur:~ldp +type:accueil + +## Bienvenue! + +Je suis ~ldp et je vous souhaite la bienvenue dans mon humble demeure virtuelle. Elle est encore menue, mais je crois qu’on peut déjà y trouver quelques attraits. Je la présente plus complètement dans l’avant-propos que je lui ai consacré, et dont je recommande la lecture. + +=> /~ldp/articles/avant-propos. Avant-propos + +## Cybercarnet + +Quelques articles que j'ai écrits. + +=> /~ldp/articles/ Cybercarnet + +On peut s’y abonner par l’un des flux Atom qu'on trouvera dans la page ci-dessous. + +=> /~ldp/flux/ Flux Atom + +## Florilège + +J’alimente aussi un florilège. C’est quelque chose comme un microblogue, qui rassemble(ra) quelques-unes des citations que j’ai aimées, de même que certaines pensées que j’ai eues et qui ne méritent pas nécessairement un article complet. Je l’augmente périodiquement. + +=> /~ldp/florilege/ Florilège + +## Autres endroits à visiter + +Ma capsule n’est pas le seul endroit de tout Internet qui vaille la peine d’être visité. Je rassemble ici quelques bonnes adresses. + +=> /~ldp/a_visiter. À visiter + +## Contact + +On peut me contacter par courriel à l’adresse suivante. + +=> mailto:ldp@asteride.xyz ldp@asteride.xyz + +On peut aussi obtenir de l’information sur moi en consultant mon serveur finger. + +=> finger://ldp@asteride.xyz ldp@asteride.xyz + +## Licence + +Tout ce qui se trouve ici et qui vient de moi est disponible sous la licence CC-BY-NC-SA. + +=> https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.fr Licence CC-BY-NC-SA diff --git a/src/robots.special.aplat b/src/robots.special.aplat @@ -1,10 +0,0 @@ -(doc (@ (césure "pre") - (type "robots.txt") - (date-pub "2021-12-21") - (date-mod "2023-10-22") - (lien (ref-std "ROBOTS.TXT")) - (uuid "2aa3ea76-7bc6-4bd3-8288-ccba2a404a1d")) -"User-agent: * -Disallow: /LICENSE.txt - -Sitemap: "(lien (@ (ref (ref-std "SITEMAP.TXT"))))) diff --git a/suf/conv b/suf/conv @@ -0,0 +1,17 @@ +#!/bin/sh +# +# conv + +. lib/suf.sh + +NOM="$(basename "$0")" + +mkdir -p "$(dirname "$OPT_DST")" + +case $OPT_FORMAT in +gemtext) SCRIPT="$DOS_LIB/vers_gemtext.awk"; EXT=gmi ;; +html) SCRIPT="$DOS_LIB/vers_html.awk"; EXT=html ;; +*) exit 1 ;; +esac + +awk -v format="$EXT" -f "$SCRIPT" -f "$DOS_LIB/analyser.awk" > "$OPT_DST.$EXT" diff --git a/suf/cp b/suf/cp @@ -0,0 +1,8 @@ +#!/bin/sh +# +# cp + +. lib/suf.sh + +mkdir -p "$(dirname "$OPT_DST")" +cat > "$OPT_DST"