12 proc vwaitTimed { var {delay 0} {warn "warnuser"} } {
14 proc trigger {var warn} {
15 if {$warn == "warnuser"} {
16 tk_messageBox -type ok -icon error -parent . -title "Protocol error" -message "vwait timeout for $var"
22 set timerId [after $delay "trigger $var $warn"]
27 if [
info exists timerId] { after cancel $timerId}
39 proc bindFocusColors {w {inColor lightYellow} {outColor white}} {
40 $w configure -background $outColor
53 proc bindMouseWheel {bindtag callback} {
54 switch -- [tk windowingsystem] {
56 bind $bindtag <ButtonPress-4> "$callback -1; break"
57 bind $bindtag <ButtonPress-5> "$callback +1; break"
60 bind $bindtag <<MWheel>> "[
append callback { [expr {-(%d/120)}]}]; break"
63 bind $bindtag <MouseWheel> "[
append callback { [expr {-(%D)}]}]; break"
74 proc dialogbuttonframe {frame buttonlist} {
78 foreach buttonargs $buttonlist {
79 set bname $frame.[
lindex $buttonargs 0]
80 set bargs [
lrange $buttonargs 1 end]
81 eval ttk::button $bname $bargs
82 set bnames [
linsert $bnames 0 $bname]
83 set length [
string length [$bname cget -text]]
84 if {$length > $maxlength} {
set length $maxlength}
86 if {$maxlength < 7} {
set maxlength 7}
88 $b configure -width $maxlength -padx 4
89 pack $b -side right -padx 4 -pady 4
97 proc packbuttons {side args} {
98 eval pack $args -side $side -padx 5 -pady 3
100 proc packdlgbuttons {args} {
101 pack {*}$args -side right -padx 5 -pady "15 5"
107 proc dialogbutton {w args} {
108 set retval [
eval ttk::button $w $args]
109 set length [
string length [$w cget -text]]
110 if {$length < 7} {
set length 7}
111 $w configure -width $length
115 proc dialogbuttonsmall {w args {style "Small.TButton"} } {
116 set retval [
eval ttk::button $w -style $style $args]
117 set length [
string length [$w cget -text]]
118 if {$length < 7} {
set length 7}
119 $w configure -width $length
135 proc autoscrollframe {args} {
137 if {[
lindex $args 0] == "-bars"} {
138 set bars [
lindex $args 1]
139 if {$bars != "x" && $bars != "y" && $bars != "none" && $bars != "both"} {
140 return -code error "Invalid parameter: -bars $bars"
142 set args [
lrange $args 2 end]
144 if {[
llength $args] < 3} {
145 return -code error "Insufficient number of parameters"
147 set frame [
lindex $args 0]
148 set type [
lindex $args 1]
149 set w [
lindex $args 2]
150 set args [
lrange $args 3 end]
153 if {! [
winfo exists $frame]} {
155 $frame configure -relief sunken -borderwidth 2
157 if {! [
winfo exists $w]} {
159 if {[
llength $args] > 0} {
160 eval $w configure $args
162 $w configure -relief flat -borderwidth 0
169 proc autoscrollText {bars frame widget style} {
171 text $widget -cursor arrow -state disabled -highlightthickness 0
176 proc autoscrollBars {bars frame w} {
179 grid $w -in $frame -row 0 -column 0 -sticky news
181 if {$bars == "y" || $bars == "both"} {
182 ttk::scrollbar $frame.ybar -command [list $w yview] -takefocus 0
183 $w configure -yscrollcommand [list _autoscroll $frame.ybar]
184 grid $frame.ybar -row 0 -column 1 -sticky ns
185 set _autoscroll($frame.ybar) 1
186 set _autoscroll(time:$frame.ybar) 0
189 if {$bars == "x" || $bars == "both"} {
190 ttk::scrollbar $frame.xbar -command [list $w xview] -takefocus 0 -orient horizontal
191 $w configure -xscrollcommand [list _autoscroll $frame.xbar]
192 grid $frame.xbar -row 1 -column 0 -sticky we
193 set _autoscroll($frame.xbar) 1
194 set _autoscroll(time:$frame.xbar) 0
196 grid rowconfigure $frame 0 -weight 1
197 grid columnconfigure $frame 0 -weight 1
198 grid rowconfigure $frame 1 -weight 0
199 grid columnconfigure $frame 1 -weight 0
202 proc _autoscrollMouseWheel {{w} {bar} {direction}} {
203 if {$::_autoscroll($bar) == 0}
return 204 $w yview scroll $direction units
207 array set _autoscroll {}
219 proc _autoscroll {bar args} {
221 if {[
llength $args] == 2} {
222 set min [
lindex $args 0]
223 set max [
lindex $args 1]
224 if {$min > 0.0 || $max < 1.0} {
225 if {! $_autoscroll($bar)} {
227 set _autoscroll($bar) 1
228 set _autoscroll(time:$bar) [
clock clicks -milli]
231 if {[
clock clicks -milli] > [
expr {$_autoscroll(time:$bar) + 100}]} {
233 set _autoscroll($bar) 0
240 proc _autoscrollMap {frame} {
249 array set scid_busycursor {}
250 set scid_busycursorState 0
252 proc doBusyCursor {w flag} {
253 global scid_busycursor
254 if {! [
winfo exists $w]} {
return}
255 if {[
winfo class $w] == "Menu"} {
return}
258 if { [
catch {
set scid_busycursor($w) [$w cget -cursor]}] } {
261 catch {$w configure -cursor watch}
263 catch {$w configure -cursor $scid_busycursor($w)} err
268 proc busyCursor {w {flag 1}} {
269 global scid_busycursor scid_busycursorState
270 if {$scid_busycursorState == $flag} {
return}
271 set scid_busycursorState $flag
283 set horizRuleCounter 0
284 set vertRuleCounter 0
286 proc addHorizontalRule {w {ypadding 5} {relief sunken} {height 2} } {
287 global horizRuleCounter
289 ttk::separator $w.line$horizRuleCounter -orient horizontal
290 pack $w.line$horizRuleCounter -fill x
294 incr horizRuleCounter
297 proc addVerticalRule {w {xpadding 5} {relief sunken}} {
298 global vertRuleCounter
300 ttk::separator $w.line$vertRuleCounter -orient vertical
301 pack $w.line$vertRuleCounter -fill y -side left
312 proc progressWindow { title text {button ""} {command "progressBarCancel"} } {
314 if {[
winfo exists $w]} {
return}
316 set ::progressWin_focus [
focus]
323 ttk::label $w.f.t -text $text
324 autoscrollframe -bars y $w.f.cmsg text $w.f.cmsg.text -width 70 -height 14 -wrap word -font font_Regular
325 canvas $w.f.c -width 400 -height 20 -bg white -relief solid -border 1 -highlightthickness 0
326 $w.f.c create rectangle 0 0 0 0 -fill blue -outline blue -tags bar
327 $w.f.c create text 395 10 -anchor e -font font_Regular -tags time -fill black -text "0:00 / 0:00"
328 ttk::button $w.f.cancel -text $button -command "$command"
330 grid $w.f.t -row 0 -columnspan 2 -pady 4 -sticky news
331 grid $w.f.cmsg -row 1 -columnspan 2 -pady 4 -sticky news
332 grid $w.f.c -row 2 -column 0 -pady 4 -stick w
333 grid $w.f.cancel -row 2 -column 1 -padx "10 0"
334 grid $w.f -sticky news
335 grid rowconfigure $w.f 1 -weight 1
336 grid columnconfigure $w.f 0 -weight 1
337 grid remove $w.f.cmsg
338 if {$button == ""} {
grid remove $w.f.cancel}
341 set x [
expr ([
winfo screenwidth $w] - 400) / 2]
342 set y [
expr ([
winfo screenheight $w] - 40) / 2]
343 wm geometry $w +$x+$y
347 set ::progressWin_time [
clock seconds]
350 set ::progressCanvas(show) "catch {wm deiconify $w}"
353 proc progressBarSet { canvasname width height } {
355 set ::progressCanvas(name) $canvasname
356 set ::progressCanvas(w) $width
357 set ::progressCanvas(h) $height
358 set ::progressCanvas(cancel) 0
359 set ::progressCanvas(init) 1
360 set ::progressCanvas(show) {}
361 after idle { unset ::progressCanvas(init) }
364 proc progressBarCancel { } {
365 set ::progressCanvas(cancel) 1
369 proc progressCallBack {done {total 1} {elapsed 0} {estimated 0} {msg ""}} {
370 if {$done == "init"} {
371 if {[
info exists ::progressCanvas(init)]} {
372 return $::progressCanvas(init)
378 if {! [
winfo exists $::progressCanvas(name)] || $::progressCanvas(cancel)} {
383 if {$::progressCanvas(show) != ""} {
384 if {$elapsed == 0 && $estimated < 2 && $msg == ""} {
return}
385 eval $::progressCanvas(show)
386 set ::progressCanvas(show) {}
389 set width $::progressCanvas(w)
391 set width [
expr {int(double($width) * double($done) / double($total))}]
393 $::progressCanvas(name) coords bar 0 0 $width $::progressCanvas(h)
395 set t [
format "%d:%02d / %d:%02d" \
396 [
expr {$elapsed / 60}] [
expr {$elapsed % 60}] \
397 [
expr {$estimated / 60}] [
expr {$estimated % 60}]]
398 $::progressCanvas(name) itemconfigure time -text $t
402 set widget "$::progressCanvas(name)msg"
404 append widget ".text"
405 $widget insert end "$msg\n"
412 proc changeProgressWindow {newtext} {
414 if {[
winfo exists $w]} {
415 $w.f.t configure -text $newtext
420 proc updateProgressWindow {done total} {
422 if {! [
winfo exists $w]} {
return}
423 set elapsed [
expr {[clock seconds] - $::progressWin_time}]
424 set estimated $elapsed
426 set estimated [
expr {int(double($elapsed) * double($total) / double($done))}]
431 proc closeProgressWindow {{force false}} {
433 if {! [
winfo exists $w]} {
return}
435 if {!$force && [$w.f.cmsg.text index end] != "2.0" } {
436 $w.f.cancel configure -text "$::tr(Close)"
437 $w.f.cancel configure -command "closeProgressWindow true"
440 $w.f.cmsg.text configure -state disabled
446 catch {
focus $::progressWin_focus}
449 proc CreateSelectDBWidget {{w} {varname} {ref_base ""} {readOnly 1}} {
451 if {$ref_base == ""} {
set ref_base [
sc_base current]}
452 set tr_database [
tr Database]
453 set tr_prefix_len [
expr {[string length $tr_database] + 1}]
456 if {$readOnly || ![
sc_base isReadOnly $i]} {
457 set fname [
file tail [
sc_base filename $i]]
458 if {$i == $ref_base} {
set selected [
llength $listbases]}
459 lappend listbases "$tr_database $i: $fname"
463 ttk::combobox $w.lb -values $listbases -state readonly
464 grid $w.lb -sticky news
465 grid columnconfigure $w 0 -weight 1
467 bind $w.lb <<ComboboxSelected>> "
468 set $varname \[ string index \[$w.lb get\] $tr_prefix_len \]
470 $w.lb current $selected
471 event generate $w.lb <<ComboboxSelected>>
473 proc storeEmtComment { h m s } {
474 set time "[
format "%d" $h]:[
format "%02d" $m]:[
format "%02d" $s]"
477 if {[regsub {\[%emt\s*.*?\]} [
sc_pos getComment] "\[%emt $time\]" comment]} {
478 sc_pos setComment "$comment"
480 sc_pos setComment "\[%emt $time\]$comment"
483 proc storeEvalComment { value } {
485 if {[regsub {\[%eval\s*.*?\]} [
sc_pos getComment] "\[%eval $value\]" comment]} {
486 sc_pos setComment "$comment"
488 sc_pos setComment "\[%eval $value\]$comment"
495 namespace eval gameclock {
498 proc new { parent n { size 100 } {showfall 0} } {
499 global ::gameclock::data
500 set data(showfallen$n) $showfall
503 set data(id$n) $parent.clock$n
504 canvas $data(id$n) -height $size -width $size
505 pack $data(id$n) -side top -anchor center
506 for {
set i 1} {$i<13} {
incr i} {
507 set a [
expr {$i/6.*acos(-1)}]
508 set x [
expr { ($size/2 + (($size-15)/2)*sin($a) ) }]
509 set y [
expr { ($size/2 - (($size-15)/2)*cos($a) ) }]
510 $data(id$n) create text $x $y -text $i -tag clock$n
512 bind $data(id$n) <Button-1> "::gameclock::toggleClock $n"
514 set data(fg$n) "black"
515 set data(running$n) 0
516 set data(digital$n) 1
522 global ::gameclock::data
527 set sec $data(counter$n)
528 set h [
format "%d" [
expr abs($sec) / 60 / 60]]
529 set m [
format "%02d" [
expr (abs($sec) / 60) % 60]]
530 set s [
format "%02d" [
expr abs($sec) % 60]]
531 if {$n == 1} {
set ::gamePlayers(clockW) "$h:$m:$s"}
532 if {$n == 2} {
set ::gamePlayers(clockB) "$h:$m:$s"}
534 if {! [
winfo exists $data(id$n)]} {
return}
535 $data(id$n) delete aig$n
537 set w [$data(id$n) cget -width]
538 set h [$data(id$n) cget -height]
539 set cx [
expr $w / 2]
540 set cy [
expr $h / 2]
542 set size [
expr $w - 15]
544 set size [
expr $h - 15]
547 if { $sec > 0 && $data(showfallen$n) } {
550 set color $::gameclock::data(fg$n)
553 if {$color == "white"} {
set fg "black"}
else {
set fg "white"}
555 foreach divisor {30 1800 21600} length "[
expr $size/2 * 0.8] [
expr $size/2 * 0.7] [
expr $size/2 * 0.4]" \
557 set angle [
expr {$sec * acos(-1) / $divisor}]
558 set x [
expr {$cx + $length * sin($angle)}]
559 set y [
expr {$cy - $length * cos($angle)}]
560 $data(id$n) create line $cx $cy $x $y -width $width -tags aig$n -fill $color
563 if {$data(digital$n)} {
564 set m [
format "%02d" [
expr abs($sec) / 60]]
565 set s [
format "%02d" [
expr abs($sec) % 60]]
566 $data(id$n) create text $cx [
expr $cy + $size/4] -text "$m:$s" -anchor center -fill $color -tag aig$n
570 proc every {ms body n} {
571 incr ::gameclock::data(counter$n)
573 if {$::gameclock::data(id$n) == "" ||
574 [
winfo exists $::gameclock::data(id$n)]} {
575 after $ms [
info level 0]
580 return [
expr 0 - $::gameclock::data(counter$n)]
583 proc setSec { n value } {
584 set ::gameclock::data(counter$n) $value
588 proc add { n value } {
589 set ::gameclock::data(counter$n) [
expr $::gameclock::data(counter$n) - $value]
596 set ::gameclock::data(counter$n) 0
600 if {$::gameclock::data(running$n)} {
return}
601 set ::gameclock::data(running$n) 1
606 if {! $::gameclock::data(running$n)} {
return 0}
607 set ::gameclock::data(running$n) 0
608 after cancel "::gameclock::every 1000 \{draw $n\} $n"
612 proc storeTimeComment { color } {
614 set h [
format "%d" [
expr abs($sec) / 60 / 60]]
615 set m [
format "%02d" [
expr (abs($sec) / 60) % 60]]
616 set s [
format "%02d" [
expr abs($sec) % 60]]
620 if {[regsub {\[%clk\s*.*?\]} [
sc_pos getComment] "\[%clk $time\]" comment]} {
621 sc_pos setComment "$comment"
623 sc_pos setComment "\[%clk $time\]$comment"
627 proc toggleClock { n } {
628 if { $::gameclock::data(running$n) } {
635 proc setColor { n color } {
636 if {$color == "white"} {
643 set ::gameclock::data(fg$n) $fg
644 $::gameclock::data(id$n) configure -background $bg
645 $::gameclock::data(id$n) itemconfigure clock$n -fill $fg
646 $::gameclock::data(id$n) itemconfigure aig$n -fill $fg
650 global ::gameclock::data
652 if {$data(running1) || $data(running2)} {
return 1}
660 namespace eval html {
665 proc exportCurrentFilter {} {
668 tk_messageBox -title "Scid: Filter empty" -type ok -icon info \
669 -message "The filter contains no games."
673 { "HTML files" {".html" ".htm"} }
674 { "All files" {"*"} }
676 set idir $::initialDir(html)
677 set fName [
tk_getSaveFile -initialdir $idir -filetypes $ftype -defaultextension ".html" -title "Create an HTML file"]
678 if {$fName == ""} {
return}
679 if {[
file extension $fName] != ".html" } {
682 set prefix [
file rootname [
file tail $fName]]
683 set dirtarget [
file dirname $fName]
684 set sourcedir [
file join $::scidExeDir html]
685 catch {
file copy -force [
file join $sourcedir bitmaps] $dirtarget}
686 catch {
file copy -force [
file join $sourcedir scid.js] $dirtarget}
687 catch {
file copy -force [
file join $sourcedir scid.css] $dirtarget}
690 set savedGameNum [
sc_game number]
693 set ::html::cancelHTML 0
698 while {$gn != 0 && ! $::html::cancelHTML} {
709 while {$gn != 0 && ! $::html::cancelHTML} {
720 exportPGN "[
file join $dirtarget $prefix].pgn" "filter"
724 proc sc_progressBar {} {
725 set ::html::cancelHTML 1
728 proc exportCurrentGame {} {
731 { "HTML files" {".html" ".htm"} }
732 { "All files" {"*"} }
734 set idir $::initialDir(html)
735 set fName [
tk_getSaveFile -initialdir $idir -filetypes $ftype -defaultextension ".html" -title "Create an HTML file"]
736 if {[
file extension $fName] != ".html" && [
file extension $fName] != ".htm" } {
739 if {$fName == ""} {
return}
740 set prefix [
file rootname [
file tail $fName]]
741 set dirtarget [
file dirname $fName]
742 set sourcedir [
file join $::scidExeDir html]
743 catch {
file copy -force [
file join $sourcedir bitmaps] $dirtarget}
744 catch {
file copy -force [
file join $sourcedir scid.js] $dirtarget}
745 catch {
file copy -force [
file join $sourcedir scid.css] $dirtarget}
748 set players [list "[
sc_game tags get White] - [
sc_game tags get Black]"]
749 toHtml $::html::data -1 $dirtarget $prefix $players [
lindex $players 0] \
752 exportPGN "[
file join $dirtarget $prefix].pgn" "current"
757 \xa0 \xa1 ¡ \xa2 ¢ \xa3 £ \xa4 ¤
758 \xa5 ¥ \xa6 ¦ \xa7 § \xa8 ¨ \xa9 ©
759 \xaa ª \xab « \xac ¬ \xad ­ \xae ®
760 \xaf ¯ \xb0 ° \xb1 ± \xb2 ² \xb3 ³
761 \xb4 ´ \xb5 µ \xb6 ¶ \xb7 · \xb8 ¸
762 \xb9 ¹ \xba º \xbb » \xbc ¼ \xbd ½
763 \xbe ¾ \xbf ¿ \xc0 À \xc1 Á \xc2 Â
764 \xc3 Ã \xc4 Ä \xc5 Å \xc6 Æ \xc7 Ç
765 \xc8 È \xc9 É \xca Ê \xcb Ë \xcc Ì
766 \xcd Í \xce Î \xcf Ï \xd0 Ð \xd1 Ñ
767 \xd2 Ò \xd3 Ó \xd4 Ô \xd5 Õ \xd6 Ö
768 \xd7 × \xd8 Ø \xd9 Ù \xda Ú \xdb Û
769 \xdc Ü \xdd Ý \xde Þ \xdf ß \xe0 à
770 \xe1 á \xe2 â \xe3 ã \xe4 ä \xe5 å
771 \xe6 æ \xe7 ç \xe8 è \xe9 é \xea ê
772 \xeb ë \xec ì \xed í \xee î \xef ï
773 \xf0 ð \xf1 ñ \xf2 ò \xf3 ó \xf4 ô
774 \xf5 õ \xf6 ö \xf7 ÷ \xf8 ø \xf9 ù
775 \xfa ú \xfb û \xfc ü \xfd ý \xfe þ
776 \xff ÿ \u192 ƒ \u391 Α \u392 Β \u393 Γ
777 \u394 Δ \u395 Ε \u396 Ζ \u397 Η \u398 Θ
778 \u399 Ι \u39A Κ \u39B Λ \u39C Μ \u39D Ν
779 \u39E Ξ \u39F Ο \u3A0 Π \u3A1 Ρ \u3A3 Σ
780 \u3A4 Τ \u3A5 Υ \u3A6 Φ \u3A7 Χ \u3A8 Ψ
781 \u3A9 Ω \u3B1 α \u3B2 β \u3B3 γ \u3B4 δ
782 \u3B5 ε \u3B6 ζ \u3B7 η \u3B8 θ \u3B9 ι
783 \u3BA κ \u3BB λ \u3BC μ \u3BD ν \u3BE ξ
784 \u3BF ο \u3C0 π \u3C1 ρ \u3C2 ς \u3C3 σ
785 \u3C4 τ \u3C5 υ \u3C6 φ \u3C7 χ \u3C8 ψ
786 \u3C9 ω \u3D1 ϑ \u3D2 ϒ \u3D6 ϖ
787 \u2022 • \u2026 … \u2032 ′ \u2033 ″
788 \u203E ‾ \u2044 ⁄ \u2118 ℘ \u2111 ℑ
789 \u211C ℜ \u2122 ™ \u2135 ℵ \u2190 ←
790 \u2191 ↑ \u2192 → \u2193 ↓ \u2194 ↔ \u21B5 ↵
791 \u21D0 ⇐ \u21D1 ⇑ \u21D2 ⇒ \u21D3 ⇓ \u21D4 ⇔
792 \u2200 ∀ \u2202 ∂ \u2203 ∃ \u2205 ∅
793 \u2207 ∇ \u2208 ∈ \u2209 ∉ \u220B ∋ \u220F ∏
794 \u2211 ∑ \u2212 − \u2217 ∗ \u221A √
795 \u221D ∝ \u221E ∞ \u2220 ∠ \u2227 ∧ \u2228 ∨
796 \u2229 ∩ \u222A ∪ \u222B ∫ \u2234 ∴ \u223C ∼
797 \u2245 ≅ \u2248 ≈ \u2260 ≠ \u2261 ≡ \u2264 ≤
798 \u2265 ≥ \u2282 ⊂ \u2283 ⊃ \u2284 ⊄ \u2286 ⊆
799 \u2287 ⊇ \u2295 ⊕ \u2297 ⊗ \u22A5 ⊥
800 \u22C5 ⋅ \u2308 ⌈ \u2309 ⌉ \u230A ⌊
801 \u230B ⌋ \u2329 ⟨ \u232A ⟩ \u25CA ◊
802 \u2660 ♠ \u2663 ♣ \u2665 ♥ \u2666 ♦
803 \x22 " \x26 & \x3C < \x3E > \u152 Œ
804 \u153 œ \u160 Š \u161 š \u178 Ÿ
805 \u2C6 ˆ \u2DC ˜ \u2002   \u2003   \u2009  
806 \u200C ‌ \u200D ‍ \u200E ‎ \u200F ‏ \u2013 –
807 \u2014 — \u2018 ‘ \u2019 ’ \u201A ‚
808 \u201C “ \u201D ” \u201E „ \u2020 †
809 \u2021 ‡ \u2030 ‰ \u2039 ‹ \u203A ›
812 proc html_entities {s} {
814 return [
string map $entities $s]
817 proc toHtml { dt game dirtarget prefix {players ""} {this_players ""} {event ""} {eco "ECO"} {result "*"} {date ""} } {
820 set f [open "[
file join $dirtarget $prefix]_${game}.html" w]
822 set f [open "[
file join $dirtarget $prefix].html" w]
825 puts $f "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"
826 puts $f "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">"
828 puts $f "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />"
829 puts $f "<link rel=\"stylesheet\" type=\"text/css\" href=\"scid.css\" />"
830 puts $f "<script src=\"scid.js\" type=\"text/javascript\"></script>"
831 puts $f "<script type=\"text/javascript\">"
832 puts $f "// <!\[CDATA\["
833 puts $f "movesArray = new Array("
834 for {
set i 0} {$i<[
llength $dt]} {
incr i} {
835 array set elt [
lindex $dt $i]
836 puts -nonewline $f "\"$elt(fen) $elt(prev) $elt(next)\""
837 if {$i < [
expr [
llength $dt] -1]} {
puts $f ","}
840 puts $f "var current = 0;"
841 puts $f "var prefix = \"$prefix\";"
844 puts $f "<title>Scid</title>"
845 puts $f "<meta content=\"Scid\" name=\"author\" />"
847 puts $f "<body onload=\"doinit()\" onkeydown=\"handlekey(event)\">"
848 puts $f "<div id=\"framecontent\">"
849 puts $f "<div class=\"innertube\">"
851 puts $f "<div id=\"diagram\"><!-- diagram goes here --></div>"
853 puts $f "<div id=\"nav\" style=\"text-align: center\"><!-- navigation goes here -->"
854 puts $f "<form action=\"#\">"
856 puts $f "<input type='button' value=' ↓↑ ' onclick='rotate()' /> <input type='button' value=' |< ' onclick='jump(0)' /> <input type='button' value=' < ' onclick='moveForward(0)' /> <input type='button' value=' > ' onclick='moveForward(1)' /> <input type='button' value=' >| ' onclick='jump(1)' /> "
859 puts $f "<select name=\"gameselect\" id=\"gameselect\" size=\"1\" onchange=\"gotogame()\">"
863 puts $f "<option selected=\"selected\">$i. [
html_entities $l]</option>"
871 puts $f "<input type=\"button\" value=\"<--\" onclick=\"gotoprevgame()\" /> <input type=\"button\" value=\"-->\" onclick=\"gotonextgame()\" />"
873 puts $f "<a href=\"${prefix}.pgn\">${prefix}.pgn</a>"
879 puts $f "<div id=\"maincontent\">"
880 puts $f "<div class=\"innertube\">"
881 puts $f "<div id=\"moves\"><!-- moves go here -->"
883 puts $f "<span class=\"hPlayers\"> [
html_entities $this_players]</span>"
884 puts $f "<span class=\"hEvent\"><br /> [
html_entities $event]</span>"
885 puts $f "<span class=\"hEvent\"><br />\[$date\]</span>"
886 puts $f "<span class=\"hAnnot\"><br />\[$eco\]</span>"
891 for {
set i 0} {$i<[
llength $dt]} {
incr i} {
892 array set elt [
lindex $dt $i]
893 if {$elt(depth) == 0} {
895 }
elseif {$elt(depth) == 1} {
900 if { $prevdepth == $elt(depth) && $prevvarnumber != $elt(var) } {
901 puts $f "<span class=\"VC\">\]</span></div>"
902 puts $f "<div class=\"var\"><span class=\"VC\">\[</span>"
904 while { $prevdepth > $elt(depth) } {
905 puts $f "<span class=\"VC\">\]</span></div>"
906 set prevdepth [
expr $prevdepth - 1]
908 while { $prevdepth < $elt(depth) } {
909 puts $f "<div class=\"var\"><span class=\"VC\">\[</span>"
910 set prevdepth [
expr $prevdepth + 1]
913 set prevvarnumber $elt(var)
917 puts $f "<a href=\"javascript:gotoMove($elt(idx))\" id=\"mv$elt(idx)\" class=\"$class\">$elt(move)$nag</a>"
921 if {$comment != ""} {
922 puts $f "<span class=\"VC\">$comment</span>"
925 while { $prevdepth > 0 } {
926 puts $f "<span class=\"VC\">\]</span></div>"
927 set prevdepth [
expr $prevdepth - 1]
930 puts $f "<br /><span class=\"VH\">$result</span>"
932 puts $f "<a href=\"http://scid.sourceforge.net/\" style=\"font-size: 0.8em\">Created with Scid</a>"
942 if { [
expr $sq % 2] == 1 && [
expr int($sq / 8) %2] == 0 || [
expr $sq % 2] == 0 && [
expr int($sq / 8) %2] == 1 } {
949 proc piece2gif {piece} {
950 if {$piece == "K"} {
return "wk"}
951 if {$piece == "k"} {
return "bk"}
952 if {$piece == "Q"} {
return "wq"}
953 if {$piece == "q"} {
return "bq"}
954 if {$piece == "R"} {
return "wr"}
955 if {$piece == "r"} {
return "br"}
956 if {$piece == "B"} {
return "wb"}
957 if {$piece == "b"} {
return "bb"}
958 if {$piece == "N"} {
return "wn"}
959 if {$piece == "n"} {
return "bn"}
960 if {$piece == "P"} {
return "wp"}
961 if {$piece == "p"} {
return "bp"}
962 if {$piece == " "} {
return "sq"}
965 proc insertMiniDiag {fen f} {
969 puts $f "<table Border=0 CellSpacing=0 CellPadding=0><tr>"
971 for {
set i 0} {$i < [
string length $fen]} {
incr i} {
972 set l [
string range $fen $i $i]
973 set res [
scan $l "%d" c]
975 if { $c >= 1 && $c <= 8 } {
976 for {
set j 0} {$j < $c} {
incr j} {
977 puts $f "<td class=\"[
colorSq $square]\"><img border=0 align=\"left\" src=\"bitmaps/mini/[
piece2gif $space].gif\"></td>"
981 }
elseif {$l == "/"} {
984 puts $f "<td class=\"[
colorSq $square]\"><img border=0 align=\"left\" src=\"bitmaps/mini/[
piece2gif $l].gif\"></td>"
989 puts $f "</tr></table>"
1002 proc parseGame { {prev -2} } {
1003 global ::html::data ::html::idx
1005 set already_written 0
1010 if { ! $already_written } {
1017 set already_written 0
1023 if { ![
sc_pos isAt vend]} {
1028 set already_written 1
1030 for {
set v 0} {$v<[
sc_var count]} {
incr v} {
1038 array set elt [
lindex $data $lastIdx]
1039 set elt(next) [
expr $idx + 1]
1040 lset data $lastIdx [
array get elt]
1045 if {[
sc_pos isAt vend]} { break}
1050 proc recordElt { dots {prev -2} } {
1051 global ::html::data ::html::idx
1057 set elt(fen) [
lindex [
split [
sc_pos fen]] 0]
1061 set elt(prev) [
expr $idx-1]
1065 if {$nag == "0"} {
set nag ""}
1066 if {[
string match "*D *" $nag] || [
string match "*# *" $nag]} {
1071 set nag [regsub -all "D " $nag ""]
1072 set nag [regsub -all "# " $nag ""]
1074 set comment [
sc_pos getComment]
1075 set comment [regsub -all "\[\x5B\]%draw (.)+\[\x5D\]" $comment ""]
1076 set elt(comment) $comment
1077 set elt(depth) [
sc_var level]
1078 set elt(var) [
sc_var number]
1079 if {![
sc_pos isAt vend]} {
1080 set elt(next) [
expr $idx +1]
1085 set m [
sc_game info previousMove]
1086 set mn [
sc_pos moveNumber]
1089 if {[
sc_pos side] == "black" && $m != ""} {
1090 set elt(move) "$mn.$m"
1093 if {! [
sc_pos isAt vstart] } {
1095 set pnag [
sc_pos getNags]
1096 if {$pnag == "0"} {
set pnag ""}
1097 if {[
string match "*D *" $pnag] || [
string match "*# *" $pnag]} {
1102 if { [
sc_pos isAt vstart] || [
sc_pos getComment] != "" || $pdiag > 0 } {
1108 if {$dots && $m != ""} {
1109 set elt(move) "[
expr $mn -1]. ... $m"
1116 lappend ::html::data [
array get elt]
1141 proc exportPGN { fName selection } {
1142 if {$selection == "filter"} {
1145 sc_base export $selection "PGN" $fName -append 0 -starttext "" -endtext "" -comments 1 -variations 1 \
1146 -space 1 -symbols 1 -indentC 0 -indentV 0 -column 0 -noMarkCodes 1 -convertNullMoves 1
1147 if {$selection == "filter"} {