Files
boxcl/slcread.tcl
T

60 lines
1.2 KiB
Tcl
Raw Normal View History

2024-10-08 23:59:15 +03:00
#!/usr/bin/env tclsh
# slcread: convert a Sokoban levelset in the (XML-based) SLC format
# into the plaintext format readable by BOXcl, depends on TclXML only
# Usage: tclsh slcread.tcl input.scl > output.txt
# Created by Luxferre in 2024, released into public domain
package require xml
set levelsetfile ""
if {$argc > 0} { # get the level set file name
set levelsetfile [lindex $argv 0]
} else {
puts "Missing input file!"
exit 1
}
set fp [open $levelsetfile r]
fconfigure $fp -encoding utf-8 -translation auto
set fdata [read $fp]
close $fp
set dataout 0
set xtitle 0
proc edata {name attlist args} {
global dataout xtitle
if {$name eq "Title"} {set xtitle 1}
if {$name eq "LevelCollection"} {
puts "Author: [dict get $attlist Copyright]"
}
if {$name eq "Level"} {
puts "\nTitle: [dict get $attlist Id]"
}
if {$name eq "L"} {
set dataout 1
}
}
proc edataend {name args} {
global dataout
if {$name eq "L"} {
set dataout 0
}
}
proc cdata {data args} {
global dataout xtitle
if {$dataout eq 1} {
puts $data
}
if {$xtitle eq 1} {
puts "Title: $data"
set xtitle 0
}
}
set parser [::xml::parser -characterdatacommand cdata -elementstartcommand edata -elementendcommand edataend]
$parser parse $fdata
puts ""