accueil Voir tout le site

 programmes en TCL/Tk 

 

TTC tous tags compris

Format TTC pour un widget text TCL//TK et ses contenus 

 

Le format .ttc est une curiosité qui n'a semble-t-il aucune utilisation recensée et on ne voit pas bien à quoi ça pourrait servir.

En général le contenu texte d'un widget text peut être sauvegardé nativement au format txt classique. Pour sauvegarder les tags et les widgets intégrés il faut un autre système. A ma connaissance il n'y en avait pas avant le format ttc.

Le contenu complexe d'un widget text peut-être sauvegardé dans un fichier text et réaffiché dans un autre logiciel. C'est le principe du rtf de Microsoft qui a inspiré ttc.

Le procédé a été développé vers 2005. Vous trouverez les liens des pages du "wiki francophone" aujourd'hui disparu, correspondants aux routines de ce format de fichier.

Tous les textes et leurs tags, les widget text incorporés, les buttons, labels, etc. ainsi que les canvas et leurs contenus sont sauvegardés et réaffichés grace aux routines ttc.

Seuls les menus et les frames ne sont pas mémorisables selon les procédures des autres éléments, du fait d'une syntaxe de création différente.

Le principe de base m'avait été fourni par Richard Suchenwirth, l'un des grands maîtres de la Team Tcl. Voici son code:


package require Tk

 pack [text .t -wrap word] -fill both -expand 1
 set font [.t cget -font]
 set bfont [concat $font 15 bold]
 .t tag config bold -font $bfont
 .t tag config red -foreground red
 .t insert end "Hello " {} world bold , "" this {} " is " bold red red

 bind .t <F1> {
   set dump [dumptags %W]\n[%W dump 1.0 end]
   %W delete 1.0 end
   %W insert end $dump
 }
 bind .t <F2> {
    set content [%W get 1.0 end-1c]
   %W delete 1.0 end
   undump %W $content
 }
 proc undump {w content} {
    foreach {type value pos} $content {
	switch -- $type {
	    text   {$w insert $pos $value}
            tag    {eval [list $w tag configure $value] $pos}
	    tagon  {set on($value) $pos}
	    tagoff {$w tag add $value $on($value) $pos; unset on($value)}
	}
    }
 }
 proc dumptags w {
    set res {}
    foreach name [$w tag names] {
        set items {}
        foreach tag [$w tag configure $name] {
            if {[lindex $tag 3] ne [lindex $tag 4]} {
               lappend items [lindex $tag 0] [lindex $tag 4]
            }
        }
        if [llength $items] {lappend res tag $name $items}
    }
    set res
 }


Ce script permet en utilisant la touche F1 (ou fn+f1 selon les systèmes) d'afficher un fichier dumpé, et par f2 (ou fn+f2) de réafficher le Hello world et ses rougeurs.

À partir de ce script, j'ai développé le système pour sauvegarder le texte et ses tags, mais encore tous les widgets insérables dans le text et leurs contenus. Le format s'appuie sur la sous commande "dump".

Le fichier ttc n'est pas lié au logiciel qui l'a créé, il peut être relu par n'importe quel logiciel qui incorpore les routines. Les noms des widgets peuvent être modifiés manuellement dans le fichier ttc, et quand même être réouverts. D'après mes divers essais, le système semble robuste.

On peut se servir de toutenkamon pour créer des fichiers sauvegardables en .ttc. Ce logiciel n'est pas terminé, toutes les boites de création de widgets ne sont pas développées. Dans l'ensemble c'est surtout un travail de copié-collé d'une autre boite en modifiant juste une ou deux options selon les cas.

Voici un petit fichier ttc qui correspond à cette image

image d'un fichier ttc

tag sel {-background #c3c3c3 -borderwidth 0 -foreground red -relief raised}
Frame frame0 {-borderwidth 3 -relief raised -background white -height 60 -width 150} Button bouton0 {-background red -borderwidth 3 -command {tk_messageBox -message {Vous avez cliqué!}} -foreground black -text {le fenobjet}}
mark current 1.0 text {
} 1.0 window .frame0 2.0 window .bouton0 2.1 text {
} 2.2 text rutabéga 3.0 mark tk::anchor1 3.8 mark insert 3.8 text {
} 3.8

Comme on le voit, le système est construit sur des suites de trois éléments : type nom {options}. On a d'abord le type d'objet tels que  tag, button, frame ; puis le nom de l'objet comme bouton0, frame0 ; enfin, entre accolades pour ne faire qu'un élément, toute une série d'options avec leurs valeurs.

La première ligne permettra de créer un tag qui s'appliquera à sel la portion de texte sélectionné et qui fournira un background de couleur #c3c3c3 et un foreground  de couleur red, etc.

Ensuite il y a une Frame, nommée frame0 et toutes ses options entre accolades. On continue avec un Button nommé bouton0, avec des options comme le background red et sa command qui lance une boite de message disant "Vous avez cliqué!".

Ce n'est qu'après avoir créé les widgets et les tags, qu'on les insère à la place qui avait été mémorisée. Par exemple

text {

} 1.0

est un saut de ligne inséré au premier caractère de la première ligne.

ou encore text rutabéga 3.0 permettra d'afficher "rutabéga" au premier caractère de la troisième ligne.

Et sur le même modèle que le texte, les procédures undump  recréeront les widgets reconnus avec window Widget x.x , par exemple window .frame0 2.0 insèrera dans l'objet text la frame .frame0 au premier caractère de la deuxième ligne.

Pour réutiliser les routines TTC, il suffit d'avoir une application ouvrant un widget text et deux boutons, l'un appelant l'ouverture d'un fichier ttc et l'autre appelant les procédures de sauvegarde. Et bien sûr de sourcer les procédures ttc ou les incorporer dans le script. TTCreader est un exemple du programme minimal.

Télécharger les routines TTC; routines TTC.zip

Télécharger l'archive ttc programmes exemples

 On peut voir les pages du défunt wiki-francophone tcl/Tk, datant de 2006 environ (réactualisées plus tard sans changements) qui sont disponibles ci-après :

     * TTC

    * TTCreader

    *Toutankamon