gen_tree_text.tcl

Go to the documentation of this file.
00001 /*  -*- tcl -*-*/
00002 /* */
00003 /*  Copyright (c) 2005 by Andreas Kupries <andreas_kupries@users.sourceforge.net>*/
00004 /*  Parser Generator / Backend - Dump (A)ST for inspection.*/
00005 
00006 /*  ### ### ### ######### ######### #########*/
00007 /*  Requisites*/
00008 
00009 package require page::util::quote
00010 
00011 namespace ::page::gen::tree::text {
00012     /*  Get the peg char de/encoder commands.*/
00013     /*  (unquote, quote'tcl)*/
00014 
00015     namespace import ::page::util::quote::*
00016 }
00017 
00018 /*  ### ### ### ######### ######### #########*/
00019 /*  API*/
00020 
00021 ret  ::page::gen::tree::text (type t , type chan) {
00022     set indent ""
00023     set bystr  "  "
00024     set bysiz  [string length $bystr]
00025     set byoff  end-$bysiz
00026 
00027     $t walk root -order both -type dfs {a n} {
00028     if {$a eq "enter"} {
00029         text::WriteNode $indent $chan $t $n
00030         append indent $bystr
00031     } else {
00032         set indent [string range $indent 0 $byoff]
00033     }
00034     }
00035     return
00036 }
00037 
00038 /*  ### ### ### ######### ######### #########*/
00039 /*  Internal. Helpers*/
00040 
00041 ret  ::page::gen::tree::text::WriteNode (type indent , type chan , type t , type n) {
00042     array set attr [$t getall $n]
00043 
00044     if {[array size attr] == 0} {
00045     puts $chan "$indent$n <>"
00046     } else {
00047     puts -nonewline $chan "$indent$n < "
00048 
00049     set max -1
00050     set d {}
00051     foreach k [array names attr] {
00052         set l [string length $k]
00053         if {$l > $max} {set max $l}
00054         lappend d [list $k [Quote $attr($k)] $l]
00055     }
00056 
00057     if {[llength $d] == 1} {
00058         puts $chan "$k = $attr($k) >"
00059         return
00060     }
00061 
00062     set first 1
00063     set space $indent[string repeat " " [string length "$n < "]]
00064 
00065     foreach e [lsort -dict -index 0 $d] {
00066         foreach {k v l} $e break
00067         set off [string repeat " " [expr {$max-$l}]]
00068 
00069         if {$first} {
00070         puts -nonewline $chan "$k$off = $v"
00071         set first 0
00072         } else {
00073         puts -nonewline $chan "\n$space$k$off = $v"
00074         }
00075     }
00076 
00077     puts $chan " >"
00078     }
00079 }
00080 
00081 ret  ::page::gen::tree::text::Quote (type str) {
00082     return $str
00083 
00084     set res ""
00085     foreach c [split $str {}] {
00086     append res [quote'tcl $c]
00087     }
00088     return $res
00089 }
00090 
00091 /*  ### ### ### ######### ######### #########*/
00092 /*  Ready*/
00093 
00094 package provide page::gen::tree::text 0.1
00095 

Generated on 21 Sep 2010 for Gui by  doxygen 1.6.1