Formater un fichier texte avec wubwikit

 

Cela fait longtemps que je cherche un équivalent de txt2tags en Tcl/TK. L'objectif est de convertir un fichier texte légèrement formaté en un fichier html enrichi. Légèrement formaté signifie que le fichier original est facilement lisible dans un éditeur de texte.

Après avoir fait quelques tentatives à partir d'une page blanche, je me suis aperçu que le Wiki fait déjà cela. Donc profitons de ce travail !

Etapes :

  1. récupérer le fichier wubwikit20090806.vfs.zip dans le site [1]. Le code initial de Wikit n'est pas complet.
  2. extraire les fichiers et les mettre dans un dossier
  1. créer un fichier texte en respectant les règles d'édition
  2. adapter le script ci-dessous
 # sourcer au lieu de package
    source format_2.tcl                                      ;# Callbacks from tclwikit
    source cksum.tcl                                         ;# Callbacks from tclwikit

 # lire le fichier
    set nomfichtxt exemple.txt
    set FileId [open $nomfichtxt r]
    set Texte [read $FileId]
    close $FileId

 # première transformation en Stream
    set Stream [Wikit::Format::TextToStream $Texte]
 # seconde transformation en liste pout html
    set Htxt [Wikit::Format::StreamToHTML $Stream]

 # construction du HTML
    set htm {<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "}">http://www.w3.org/TR/html4/loose.dtd">}
    append htm "\n<html>\n<head>\n"
    append htm {<link rel=stylesheet type="text/css" href="wikit.css">}
    append htm "\n<body>\n\n"
    append htm "<h2> Contenu\n"
    append htm [lindex $Htxt 2]                ;# table des matières
    append htm [lindex $Htxt 0]                ;# contenu
    append htm "\n</body>\n</html>"

 # sauver le fichier html
    set nomfichhtm exemple.html
    set FileId [open $nomfichhtm w]
    puts $FileId $htm
    close $FileId

Voici un fichier exemple, (il faut enlever les : en première colonne)

 :<<TOC>>
 :
 :**Titre 2 exemples de divers structure reconnues**
 :
 :Texte normal suivi d'une liste simple
 :   * format {3 espaces; étoile; 1 espace; le texte}
 :   * texte du second item
 :   ** format {3 espaces; 2 étoiles; 1 espace; le texte}
 :   ** encore un item
 :   *** cela fonctionne jusque 5 niveaux
 :
 :Texte normal suivi d'une liste ordonnée
 :   1. format {3 espaces; 1 chiffre; 1 point; 1 espace; le texte}
 :   1. texte du second numéro
 :   22. format {3 espaces; 2 chiffres; 1 point; 1 espace; le texte}
 :   123. cela fonctionne jusque 5 niveaux
 :
 :Texte normal suivi de ''Definition list''
 :   definition:   texte format {3 espaces; une chaine; 1 double points; 3 espaces; le texte}
 :
 :Texte normal suivit de code à formater
 :===
 :texte en '''CODE FORMATE'''
 :===
 : Mais on peu aussi avoir du texte fixe en mettant un blanc comme premier caractère
 : Ou une tabulation
 :
 :Texte normal suivit de code non formaté
 :======
 :code pas ''taggé''
 :======
 :
 :Texte normal suivit de texte option
 :+++
 :Ceci est une option
 :+++
 :
 :Texte normal suivit de texte centré
 :!!!!!!
 :TEXTE CENTRE
 :!!!!!!
 :
 :Essai de texte mis en commentaire
 :>>>>>>blamed text!!!
 :<<<<<<
 :
 :Références de fin de page
 :<<backrefs>>ici une référence
 :<<backrefs:seconde référence comme ceci>>
 :
 :Et les catégories
 :<<categories>> comme celle ci
 :
 :texte contenant un mot en '''gras''' et un en ''italique''
 :
 :une ligne
 :----
 :
 :&|texte|texte|&
 :%|entête1|entête2|%
 :|Cellule 11|Cellule 12|
 :|Cellule 21|Cellule 22|
 :
 :**Titre 2**
 :paragraphe après le titre
 :
 :***soustitre 3***
 :ce paragraphe est dans le second titre

Et cela marche. Mais encore mieux, dans format.tcl le texte est d'abord analysé, une structure appelée Stream est créée dans un premier temps. Cette structure est ensuite transformée en html ou en format Tk. Celle-ci est facilement affichable dans un widget text.


Pour afficher ceci dans n fichier texte:

Créer une fenêtre

    wm title . thtml
    wm geometry . 790x570+200+100
    set wpage0 .page0                                                      ;# name of frame containing page 0

    labelframe $wpage0 -borderwidth 0 -relief solid -text {Rendered text}            ;# frame containing page 0

    grid\
     [text $wpage0.t -wrap none -background white -state disable \
         -yscrollcommand [list $wpage0.v set]\
         -xscrollcommand [list $wpage0.h set]]\
     [scrollbar $wpage0.v -command [list $wpage0.t yview]]\
     -sticky news
    grid\
     [scrollbar $wpage0.h -orient horizontal  -command [list $wpage0.t xview]]\
     -sticky news
     grid rowconfigure $wpage0 0 -weight 1
     grid columnconfigure $wpage0 0 -weight 1

   pack $wpage0 -fill both -expand 1 -side top -pady 2 -padx 2

La difficile gestion des polices de caractères dans Tk

    font create body
      foreach {option value} [font actual TkDefaultFont] {
        font configure body $option $value
      }
    font create gras
      foreach {option value} [font actual TkDefaultFont] {
        font configure gras $option $value
      }
      font configure gras -weight bold
    font create italique
      foreach {option value} [font actual TkDefaultFont] {
        font configure italique $option $value
      }
      font configure italique -slant italic
    font create gras_ital
      foreach {option value} [font actual TkDefaultFont] {
        font configure gras_ital $option $value
      }
      font configure gras_ital -weight bold -slant italic
    font create fixed
      foreach {option value} [font actual TkFixedFont] {
        font configure fixed $option $value
      }
    font create fb
      foreach {option value} [font actual TkFixedFont] {
        font configure fb $option $value
      }
      font configure fb -weight bold
    font create fi
      foreach {option value} [font actual TkFixedFont] {
        font configure fi $option $value
      }
      font configure fi -weight bold
    font create fbi
      foreach {option value} [font actual TkFixedFont] {
        font configure fbi $option $value
      }
      font configure fbi -weight bold -slant italic
    font create fine
      foreach {option value} [font actual TkSmallCaptionFont] {
        font configure fine $option $value
      }

    $wpage0.t tag configure body -font body -wrap word
    $wpage0.t tag configure b -font gras
    $wpage0.t tag configure i -font italique
    $wpage0.t tag configure bi -font gras_ital
    $wpage0.t tag configure ol -font body -wrap word -lmargin2 1c
    $wpage0.t tag configure ul -font body -wrap word -lmargin2 1c

    $wpage0.t tag configure fixed -font fixed -background #E0F0F0 -relief sunken
    $wpage0.t tag configure code  -font fixed -background #E0E0E0
    $wpage0.t tag configure fb    -font fb    -background #E0F0F0 -borderwidth 1
    $wpage0.t tag configure fb    -font fb    -background #E0F0F0 -borderwidth 1
    $wpage0.t tag configure fbi   -font fbi   -background #E0F0F0 -borderwidth 1

    $wpage0.t tag configure dt    -font body -underline 1
    $wpage0.t tag configure dl    -font italique -wrap word -lmargin1 1c -lmargin2 1c
    $wpage0.t tag configure optfix  -font fine -underline 1 -foreground #0212F0
    $wpage0.t tag configure optfix1  -font fine
    $wpage0.t tag configure optvar1 -font fine -foreground #F0212F

    $wpage0.t tag configure TR -font gras -foreground #F0212F
    $wpage0.t tag configure TDH -font italique
    $wpage0.t tag configure TD -font body

    $wpage0.t tag configure title -font {Arial 12 bold} -underline 1
    $wpage0.t tag configure title3 -font {Arial 12 bold italic}

Transformation en liste pour Tk et affichage

    set Ftxt [Wikit::Format::StreamToTk $Stream {}]
    set Ftxt [lindex $Ftxt 0]
    $wpage0.t configure -state normal
    foreach {token tag} $Ftxt {
      $wpage0.t insert end $token $tag
    }
    $wpage0.t configure -state disable

Il reste du travail avant d'avoir un affichage agréable


voir aussi TTC : sauvegarder les tags et les images avec le texte d'un widget text

TTD : sauvegarder les tags et les images avec le texte d'un widget text