1 #!/opt/isis/OpenIsis/tcl/bin/isish
2 # let editor know it's Tcl vim:syntax=tcl
4 package require openIsis;
8 # map element names to tags
10 # highest ag used; set to 99 so we start from 100
12 # map attribute names to subfields
13 # map keys are "tag\tatt"
18 proc cdata {data} { # text
19 # puts "0\t[string map {\n " "} $data]"
20 rec add 0 [string map {\n " "} $data]
24 # puts "#\t[string map {\n " "} $data]"
31 proc estart {name attlist args} {
32 global tag ltag subf lsubf
34 foreach {arg val} $args {
35 switch -- $arg -empty { if $val { set start - } }
37 if [catch {set t $tag($name)}] {
38 set t [set tag($name) [incr ltag]]
41 foreach {att val} $attlist {
43 if [catch {set s $subf($attkey)}] {
44 # use $subf($t) as counter for last subfield
45 if [catch {set c [incr subf($t)]}] {
46 set c [set subf($t) 97]
48 set s [set subf($attkey) [format %c $c]]
56 proc eend {name args} {
58 foreach {arg val} $args {
59 switch -- $arg -empty { if $val { return } }
62 rec add $tag($name) ""
66 -ignorewhitespace yes \
68 -characterdatacommand cdata \
69 -commentcommand comment \
70 -doctypecommand doctype \
71 -elementstartcommand estart \
72 -elementendcommand eend \
76 # -endcdatasectioncommand ecdata
77 # -startcdatasectioncommand scdata
79 $xp parse [read stdin]
82 # invert the FDT tag,subf to name,attr
83 foreach {n v} [array get tag] { set name($v) $n}
84 foreach {n v} [array get subf] {
85 if {2 == [scan $n "%u\t%s" t a]} { set attr($t\t$v) $a }
88 foreach t [lsort [array names name]] {
89 # puts stderr "$t\t$name($t)" ;# verbose entry
91 foreach s [lsort [array names attr "$t\t*"]] {
92 # puts stderr "$s\t$attr($s)" ;# verbose entry
94 append line "^$c$attr($s)"
96 puts stderr "$t\t$line" ;# the one-line DTD ;)
99 # use the inverted FDT to create the XML text
106 puts [string repeat \t $depth]$v
109 if {"" == $v} { # close
111 puts [string repeat \t $depth]</$name($t)>
114 set line "<$name($t)"
115 set alist [split $v ^]
116 set hasChilds [expr {"+" == [lindex $alist 0]}]
117 foreach a [lrange $alist 1 end] {
118 append line " $attr($t\t[string index $a 0])=\"[string range $a 1 end]\""
125 puts [string repeat \t $depth]$line