oun nouveau markup language me2html

Creation: 29 aout 2016
Mise à jour: 30 aout 2016
Version: 1.1
Author: Jean-Louis Bicquelet-Salaün
Location: http://jlbicquelet.free.fr
Copyright: (c) 2016 Jean-Louis BICQUELET-SALAÜN

markup language

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.

mef2html version awk

le markup language de mef2html

La documentation de mef2html est [mef2html.html:ici].

exemples

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

utilisation de mef2html

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

programmation de mef2html

lire la ligne d'arguments en awk

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()).

principe du programme

Chaque ligne du fichier est évaluée.

En fonction du mode de traitement elle peut être:

  • éliminée si il s'agit d'un commentaire
    les :: en début de ligne correspondent à des commentaires
  • interprétée.
    on remplace les tags par leur contenu
  • etre dans un tableau
    On la traite comme tel jusqu'à la fin du tableau
  • faire parti d'une liste
    On la traite comme tel jusqu'à la fin de la liste
  • correspondre à une zone de téléchargement
    une fonction dédié y est associé.
  • correspondre à un header
  • correspondre à un début ou fin de tableau
  • correspondre à un début ou fin de zone de téléchargement
  • correspondre à un début ou fin de code
  • correspondre à un début ou fin de fichier
  • correspondre à un début ou fin de console écran
  • correspondre à un début ou fin de liste
  • être un include de fichier
  • afficher le résultat d'une commande système
  • modifier une variable de contrôle

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 }

fonction réutilisables

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; }