Site WWW de Laurent Bloch
Slogan du site

ISSN 2271-3905
Cliquez ici si vous voulez visiter mon autre site, orienté vers des sujets moins techniques.

Pour recevoir (au plus une fois par semaine) les nouveautés de ce site, indiquez ici votre adresse électronique :

Produire des documents, une seule fois
Conversion du format Spip à AsciiDoc
Article mis en ligne le 20 décembre 2020
dernière modification le 30 décembre 2020

par Laurent Bloch

Un article précédent annonçait mon choix d’utiliser désormais pour rédiger mes textes le format AsciiDoc, à partir duquel on peut générer facilement des sorties aux formats PDF, DocBook, LaTeX, Html et même docx : quel luxe, pouvoir créer un document Word, ce que l’on nous demande à tout bout de champ, sans avoir à utiliser ce logiciel calamiteux ni ses succédanés qui ne valent guère mieux ! Étant bien entendu que pour la vraie typographie LaTeX demeure indispensable.

Pour mon site et mon blog j’utilise le CMS Spip, qui me donne toute satisfaction. Pour information, au gré de mes collaborations et emplois successifs, j’ai eu à utiliser Typo3, Dokuwiki, Joomla !, Dotclear, Drupal, Wordpress et Nuxeo : Spip me semble le compromis le plus raisonnable, entre les CMS au mode d’emploi inextricable, ceux dont les fonctions sont rudimentaires et mal conçues et ceux percés de trop de failles de sécurité. Comme parmi les logiciels de conversion disponibles il n’en existait pas d’AsciiDoc vers Spip, j’ai écrit AsciiDoc-Spip, disponible ici, à base d’expressions régulières.

Mais je possède déjà un stock important de textes composés avec les balises de Spip, ce qui m’a amené à écrire le logiciel inverse, Spip-AsciiDoc, cette fois avec un analyseur lexical basé sur une vraie grammaire. Ce n’est pas encore parfait, il y a quelques écritures parasites qui demandent un peu de finition manuelle, il manque encore ce qu’il faut pour les textes de programmes, je n’ai pas réussi à composer les textes attachés aux URL en italique ou en gras, je persévère, mais si l’un de mes lecteurs avait un conseil à me donner, il en serait remercié.

Comme pour AsciiDoc-Spip j’ai programmé en Scheme, avec le compilateur Bigloo et ses extensions d’analyse grammaticale (voir ici pour installer Bigloo sous Ubuntu, cela marche avec l’instance Ubuntu de Windows 10). . Voici le programme :

  1. (module Spip-AsciiDoc
  2.    (main analyse-fichier)
  3.    (import Spad-Grammar))
  4.  
  5. (define (analyse-fichier args)
  6.    (let ((un-fichier (cadr args)))
  7.       (call-with-input-file un-fichier lire-des-lignes)))
  8.  
  9. (define (lire-des-lignes flux)
  10.    (let boucle ((ligne (read-line flux)))
  11.       (if (not (eof-object? ligne))
  12.           (let ((port (open-input-string ligne)))
  13.              (print (read/rp spad:the-grammar port))
  14.              (boucle (read-line flux))))))

Télécharger

Le fichier .afile qui permet de localiser les modules :

  1. ((Spad-Grammar "Spad-Grammar.scm")
  2.  (Spip-AsciiDoc "Spip-AsciiDoc.scm"))

Télécharger

  1. (module Spad-Grammar
  2.    (export spad:the-grammar))
  3.  
  4. (define spad:the-grammar
  5.    (let ((ital? #f)
  6.          (bold? #f)
  7.          (url? #f)
  8.          (txturl? #f)
  9.          (url "")
  10.          (txturl "")
  11.          (note? #f)
  12.          (note "")
  13.          (section? #f))
  14.       (regular-grammar ((carcomp (in "éèàùûçêîâÉÈÀÊÎÂÏïëËÇüôäöœ_!-:\\?,'’()//%&")))
  15.          ((when (not section?)
  16.              (bol "{{{"))
  17.           (set! section? #t)
  18.           (display* "== ")
  19.           (ignore))
  20.          ((when section?
  21.              (: (+ (in alpha carcomp digit space punct)) "}}}"))
  22.           (set! section? #f)
  23.           (print (the-substring 0 (- (the-length) 3)))
  24.           (newline)
  25.           (ignore))
  26.          ((when (not note?)
  27.              (: (+ (in alpha carcomp digit space punct)) "[["))
  28.           (set! note? #t)
  29.           (display* (the-substring 0 (- (the-length) 2)) "<<")
  30.           (ignore))
  31.          ((when note?
  32.              (: (+ (in alpha carcomp digit space punct)) "]]"))
  33.           (set! note? #f)
  34.           (display* (the-substring 0 (- (the-length) 2)) ">>")
  35.           (ignore))
  36.          ((when (not txturl?)
  37.              (: (+ (in alpha carcomp digit space punct)) "["))
  38.           (set! txturl? #t)
  39.           (display* (the-substring 0 (- (the-length) 1)))
  40.           (ignore))
  41.          ((when txturl?
  42.              (: (* (in alpha carcomp digit space punct "{}*")) "->"))
  43. ;;        (set! txturl (read/rp spad:the-grammar (open-input-string (the-substring 0 (- (the-length) 2)))))
  44.           (set! txturl (the-substring 0 (- (the-length) 2)))
  45.           (set! txturl? #f)
  46.           (set! url? #t)
  47.           (ignore))
  48.          ((when url?
  49.              (: (+ (in alpha carcomp digit space punct "{}*")) "]"))
  50.           (set! url (the-substring 0 (- (the-length) 1)))
  51.           (display* url "[" txturl "]")
  52.           (ignore))
  53.          ((when (not bold?)
  54.              (: (+ (in alpha carcomp digit space punct)) "{{"))
  55.           (set! bold? #t)
  56.           (display* (the-substring 0 (- (the-length) 2)) "*")
  57.           (ignore))
  58.          ((when bold?
  59.              (: (+ (in alpha carcomp digit space punct)) "}}"))
  60.           (set! bold? #f)
  61.           (display* (the-substring 0 (- (the-length) 2)) "*")
  62.           (ignore))
  63.          ((when (not ital?) (: (+ (in alpha carcomp digit space punct)) "{"))
  64.           (set! ital? #t)
  65.           (display* (the-substring 0 (- (the-length) 1))  "_")
  66.           (ignore))
  67.          ((when ital? (: (+ (in alpha carcomp digit space punct)) "}"))
  68.           (set! ital? #f)
  69.           (display* (the-substring 0 (- (the-length) 1)) "_" )
  70.           (ignore))
  71.          ((: (+ (in alpha carcomp digit space punct)))
  72.           (print (the-string))
  73.           (ignore))
  74.          ((: #\newline)
  75.           (ignore))
  76.          ((eol #\newline)
  77.           (ignore))
  78.          ((bol #\newline)
  79.           (ignore))
  80.          )))

Télécharger

Pour compiler ce programme il faut avoir créé le fichier .afile, puis :

  1. bigloo -c Spip-AsciiDoc.scm
  2. bigloo -c Spad-Grammar.scm
  3. bigloo Spad-Grammar.o Spip-AsciiDoc.o -o Spip-AsciiDoc

Télécharger

Pour pouvoir essayer, voici un exemple de texte avec des balises Spip, à traduire en AsciiDoc (les paragraphes sur une seule ligne de préférence) :

  1. {{{Un titre}}}
  2.  
  3. Bien que l'idée soit ancienne, c'est depuis une dizaine d'années que les progrès de l'électronique ont permis l'apparition et le développement rapide des [{Solid-State Devices}->https://wakapidia.org] (SSD), c'est-à-dire d'unités de stockage qui utilisent comme support non plus des disques magnétiques en mouvement rotatif, mais des {{circuits électroniques intégrés}}, comme des [clés USB->https://ma-page.org] mais plus grosses et avec un accès plus rapide. Les premiers modèles avaient une faible capacité et un coût élevé, mais aujourd'hui la convergence avec les disques durs traditionnels est telle que l'on peut prévoir la disparition de ces derniers dans quelques années. Actuellement, {à volume égal} un SSD est 10 à 30 fois plus cher qu'un disque dur et 10 fois plus rapide. Les disques durs ont encore quelques arguments[[Fallacieux ? Cf. [arguments->https://mathe.org].]] techniques en leur faveur, mais pas pour longtemps. Les SSD sont moins fragiles parce qu'ils n'ont pas de pièces [->http://toto.fr] mobiles, plus légers, ils consomment moins d'électricité.
  4.  
  5. Et alors [{{voilà}}->https://mon-igloo.fr] là-bas.

Télécharger