Un markup language est un système pour annoter un document de manière à ce que la syntaxe se distingue facilement du texte.
En général un markup language permet d'écrire rapidement un texte tout en le mettant en forme. Au fil du temps,j'ai utilisé mtx écrit en perl qui n'existe plus,
puis htmlpp en mode guru, mais pour obtenir ce que je voulais il a fallu que j'utilise un préprocesseur.
Enfin, j'ai utilisé grutatxt qui répondait globalement à mes besoins.
J'ai fini par écrire mes propres script de markup en perl au début, puis en python et enfin en awk car il est facile de trouver un interpréteur awk où que l'on soit.C'est de plus un excellent exercice pour apprendre awk.
La documentation de mef2html est [mef2html.html:ici].
Quelques exemples pour vous faire une idée:
@h1/header 1@p/un paragraphe
@h1/header 1
@p/exemple
header 1
un paragraphe
header 1
exemple
On utilise mef2html de la manière suivante :
awk -f mef2html.awk fichier.mef > fichier.html
On a de plus les options suivantes:
awk -f mef2html.awk usage affichage de l'aide
awk -f mef2html.awk /?
awk -f mef2html.awk doc affichage de l'aide
awk -f mef2html.awk /d
awk -f mef2html.awk version affichage du numéro de version
awk -f mef2html.awk ver
awk -f mef2html.awk /v
Comme de nombreux langages de programmation, il est possible de parser en awk les arguments passés au programme. Ceux-ci se retrouvent dans le tableau ARGV.
Le nom du programme est ARGV[0], le premier argument ARGV[1] et ainsi de suite.ARGC contient le nombre d'argument. AU minimum, ARGC vaut 1, ARGV[0] correspondant au nom du programme.
On peut donc tester les arguments dans la section BEGIN { } qui est exécutée en tout début de programme. J'ai créé une fonction parse_args() pour isolé le traitement.
function parse_args() { FLAG_TEXT=0 if ((ARGV[1]=="usage") || (ARGV[1]=="/?")) { usage() exit; } if ((ARGV[1]=="doc")|| (ARGV[1]=="/d")) { documentation() exit; } if ((ARGV[1]=="version") || (ARGV[1]=="ver")|| (ARGV[1]=="/v")) { version() exit; } if (ARGV[1]=="text") { ARGV[1]=ARGV[2]; ARGC--; FLAG_TEXT=1 } }
Il est facile de faire des combinaisons plus compliquées. Je me suis essentiellement servi des options pour intégrer ma documentation dans mon programme (fonctions usage() et documentation()).
Chaque ligne du fichier est évaluée.
En fonction du mode de traitement elle peut être:
Pour éliminer une ligne, on recherche le pattern et on saute la suite.
/^::/ { next }
La gestion des headers se fait en détectant le tag par une recherhceh et en manipulant la chaine de caractère.
/^@h1\// { print "&tl;h1>" right($0,5) ""; next }
Le tag system demande à couper la ligne en deux à l'aide du caractère / avant de passer la ligne de commande à exécuter à la fionction system de awk.
/@system\// { split($0,val,"/"); system(val[2]) ; next }
J'ai du écrire des fonctions awk qui sont réutilisables ailleurs. En voici la liste.
right(str,pos) | right |
replace_one(str,ch,rep) | replace 1 fois un motif |
readfile(file) | lit un fichier et l'affiche |
date() | retourne la date |
alen(array) | retourne le nombre d'éléments d'un tableau |
function right(str,pos) { return substr(str,pos,length(str)-pos+1) }
function replace_one(str,ch,rep) { s=1 size=length(ch) lg=length(str) while(s>0) { s=index(str,ch) if (s==0) { break; } str=substr(str,1,s-1) rep substr(str,s+size,lg-s-size+1) } return str }
function date() { now = systime() ret = strftime("%d/%m/%Y", now) print ret }
function readfile(file) { if ((getline tmp < file) < 0) return
print tmp while ((getline tmp < file) > 0) print tmp close(file) return }
function alen(array) { len=0 for (dummy in array) len++;return len; }