Exemple d'arbre

 

dc 14/04/06

Un exemple d'utilisation de struct::tree et de htmlparse de la TclLib, et du widget Tree de BWidget.

On parse une page html unepage.html, on affiche l'arbre de la syntaxe html et est renvoyé en sortie standard les contenus de toutes les balises a.

 package require struct::tree
 package require htmlparse
 package require BWidget

 set f [open unepage.html]
 set codeHTML [read $f]
 close $f

 struct::tree arbre
 htmlparse::2tree $codeHTML arbre

 pack [Tree .arbre] -expand 1 -fill both
 pack [label .l] -fill x

 proc creeBranche {} {
  if {[string equal $::var "root"]} {return}
    .arbre insert end [arbre parent $::var] $::var\
      -text [arbre get $::var type]
 }
 arbre walk root var creeBranche

 proc afficheContenu {noeud} {
    .l configure -text [arbre get $noeud data]
 }
 .arbre bindText <1> afficheContenu

 proc baliseA {a n} {
    if {[string equal [$a get $n type] "a"]} {return 1}
    return 0
 }
 proc afficheBaliseA {} {
    foreach noeud [arbre descendants root filter baliseA] {
	lappend listeA [arbre get $noeud data]
    }
    return $listeA
 }
 puts [afficheBaliseA]

le parcours de l'arbre arbre walk root var creeBranche peut aussi se faire avec la méthode walkproc (accessible selon les versions de struct::tree)

 proc creeBranche2 {a n action} {
  if {[string equal $n "root"]} {return}
    .$a insert end [$a parent $n] $n\
      -text [$a get $n type]
 }
 arbre walkproc root creeBranche2

dc 30/04/06 Un autre exemple : on utilise cette fois-ci le package tdom pour parser du xml renvoyé sous forme d'une liste puis on crée un arbre compatible avec struct::tree :

 package require tdom
 package require struct::tree

 set f [open un_fil_rss.xml]
 set xml [read $f]
 close $f

 dom parse $xml doc
 $doc documentElement root

 struct::tree arbre

 set compteur -1
 proc parcours_rec {liste indexParent} {
    foreach {node attr enfants} $liste {
	set n node[incr ::compteur]
	lappend ::arbreS $n $indexParent [list $node $attr]
	parcours_rec [join $enfants] [expr {[llength $::arbreS]-3}]
    }
 }
 parcours_rec [$root asList] 0
 set arbreS [lreplace $arbreS 0 1 root {}]
 arbre deserialize $arbreS

Pour créer un lecteur RSS, on peut plus simplement utiliser les possibilités du package tdom qui permet de parcourir son propre arbre. On peut par exemple aller voir sur le wikit anglophone ici [1].

ulis Juste une petite rectification : le Tcler's Wiki est un wiki (et peut-être pas un wikit qui est une implémentation particulière de wiki).

Kroc : Le Tcler's Wiki est un wiki et un wikit, comme ici.