# Copyright (C) 1999-2018 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc VOTParse {t token} { upvar #0 $t T global $t global debug global debug if {$debug(tcl,cat) || $debug(tcl,sia)} { puts stderr "VOTParse" } # set fp [open debug.xml w] # puts $fp [http::data $token] # close $fp set xml [xml::parser \ -characterdatacommand [list VOTCharCB $t] \ -elementstartcommand [list VOTElemStartCB $t] \ -elementendcommand [list VOTElemEndCB $t] \ -ignorewhitespace 1 \ ] set T(tree,state) {} set T(tree,prev) {} if {[catch {$xml parse [http::data $token]} err]} { if {$debug(tcl,cat) || $debug(tcl,sia)} { puts stderr "VOTParse: $err" } } $xml free } proc VOTRead {t fn} { upvar #0 $t T global $t global debug if {$debug(tcl,cat) || $debug(tcl,sia)} { puts stderr "VOTRead" } if {$fn == {}} { return } catch { set fp [open $fn r] set xml [xml::parser \ -characterdatacommand [list VOTCharCB $t]\ -elementstartcommand [list VOTElemStartCB $t] \ -elementendcommand [list VOTElemEndCB $t] \ -ignorewhitespace 1 \ ] set T(tree,state) {} set T(tree,prev) {} if {[catch {$xml parse [read $fp]} err]} { if {$debug(tcl,cat) || $debug(tcl,sia)} { puts stderr "VOTRead: $err" } } $xml free close $fp } } proc VOTWrite {t fn} { upvar #0 $t T global $t global debug if {$debug(tcl,cat) || $debug(tcl,sia)} { puts stderr "VOTWrite" } if {$fn == {}} { return } set fp [open $fn w] set nr $T(Nrows) set nc $T(Ncols) puts $fp {} puts $fp {} puts $fp {} puts $fp {} # header puts -nonewline $fp {} set nh [expr $T(HLines)-1] for {set hh 1} {$hh < $nh} {incr hh} { puts $fp [XMLQuote "$T(H_$hh)"] } puts $fp {} # cols for {set cc 1} {$cc <= $nc} {incr cc} { puts -nonewline $fp {} if {[info exists ${t}(Description)]} { if {[lindex $T(Description) [expr $cc-1]] != {}} { puts -nonewline $fp {} puts -nonewline $fp "[XMLQuote [lindex $T(Description) [expr $cc-1]]]" puts $fp {} } } puts $fp {} } # data puts $fp {} puts $fp {} for {set rr 1} {$rr <= $nr} {incr rr} { puts -nonewline $fp {} for {set cc 1} {$cc <= $nc} {incr cc} { puts -nonewline $fp "" } puts $fp {} } # clean up puts $fp {} puts $fp {} puts $fp {
[XMLQuote $T($rr,$cc)]
} puts $fp {
} puts $fp {
} close $fp } # Callbacks proc VOTCharCB {t data} { upvar #0 $t T global $t global debug switch -- $T(tree,state) { TD { set r $T(Nrows) set c $T(cnt) set T($r,$c) [string trim $data] } DESCRIPTION { set data [string trim $data] if {$data != {}} { switch -- $T(tree,prev) { VOTABLE - RESOURCE - TABLE { foreach ll [split [string trim $data] "\n"] { incr ${t}(HLines) set n $T(HLines) if {[string range $ll 0 0] == {#}} { set T(H_$n) "$ll" } else { set T(H_$n) "# $ll" } } } FIELD { set T(Description) \ [lreplace $T(Description) end end $data] } } } } } # sometimes, we get a bogus call, (ignore whitespace does not work) set T(tree,state) {} return {} } proc VOTElemStartCB {t name attlist args} { upvar #0 $t T global $t global debug switch -- $name { VOTABLE { # init db set T(Nrows) 0 set T(Ncols) 0 set T(Header) {} set T(HLines) 0 set T(tree,prev) $name } FIELD { set fname {} set id {} set datatype {} set arraysize {} set width {} set precision {} set unit {} set ref {} set ucd {} foreach {key value} $attlist { switch -- [string tolower $key] { name {set fname "$value"} id {set id "$value"} datatype {set datatype $value} arraysize {set arraysize $value} width {set width $value} precision {set precision $value} unit {set unit "$value"} ref {set ref "$value"} ucd {set ucd "$value"} } } if {$fname != {}} { lappend ${t}(Header) "$fname" } else { lappend ${t}(Header) "$id" } lappend ${t}(Id) "$id" lappend ${t}(DataType) $datatype lappend ${t}(ArraySize) $arraysize lappend ${t}(Width) $width lappend ${t}(Precision) $precision lappend ${t}(Unit) "$unit" lappend ${t}(Ref) "$ref" lappend ${t}(Ucd) "$ucd" # filled in later lappend ${t}(Description) {} set T(tree,prev) $name } TABLEDATA { # ok, we now need to build the header incr ${t}(HLines) set n $T(HLines) set T(H_$n) [join $T(Header)] set T(Dashes) [regsub -all {[A-Za-z0-9]} $T(H_$n) {-}] set T(Ndshs) [llength $T(Header)] incr ${t}(HLines) set n $T(HLines) set T(H_$n) [join $T(Dashes)] starbase_colmap $t } TR { incr ${t}(Nrows) set T(cnt) 0 } TD { incr ${t}(cnt) set r $T(Nrows) set c $T(cnt) set T($r,$c) {} } RESOURCE - TABLE { set T(tree,prev) $name } FIELDref - DESCRIPTION - COOSYS - PARAM - PARAMref - INFO - LINK - GROUP - DATA - BINARY - STREAM - FITS - VALUES - MIN - MAX - OPTION - DEFINITIONS {} default {return -code error} } set ${t}(tree,state) $name return {} } proc VOTElemEndCB {t name args} { upvar #0 $t T global $t global debug # we can't count on this being called for all end-tags switch -- $name { TABLEDATA { # ok, we're done return -code break } VOTABLE - FIELD - FIELDref - TR - TD - RESOURCE - TABLE - DESCRIPTION - COOSYS - PARAM - PARAMref - INFO - LINK - GROUP - DATA - BINARY - STREAM - FITS - VALUES - MIN - MAX - OPTION - DEFINITIONS {} default {return -code error} } return {} }