gen_tree_text.tcl
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009 package require page::util::quote
00010
00011 namespace ::page::gen::tree::text {
00012
00013
00014
00015 namespace import ::page::util::quote::*
00016 }
00017
00018
00019
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
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
00093
00094 package provide page::gen::tree::text 0.1
00095