# sponsored by Three Rings.
-# ./dictionary-manager --approve-updates ijackson@login.chiark.greenend.org.uk /home/ijackson/things/ypp-sc-tools.pctb-dict-test/pctb /home/ftp/users/ijackson/pctb/test
# ./dictionary-manager --approve-updates ijackson@login.chiark.greenend.org.uk /home/ijackson/things/ypp-sc-tools.pctb-dict/pctb /home/ftp/users/ijackson/pctb
+# ./dictionary-manager --approve-updates ijackson@login.chiark.greenend.org.uk /home/ijackson/things/ypp-sc-tools.pctb-dict-test/pctb /home/ftp/users/ijackson/pctb/test
+
+# ./dictionary-manager --approve-updates '' . .
+
# invocation:
# OUT OF DATE
# if it wrote a byte to fd 4, it can take another question
+set aadepth 2
+
+
#---------- library routines ----------
proc manyset {list args} {
exit 16
}
+proc execpnm_createphoto {photoname args} {
+ set tmpfile ./_dictimage.tmp
+ eval exec $args > $tmpfile
+ image create photo $photoname -file $tmpfile
+ file delete $tmpfile
+}
+
#---------- display core ----------
set mul 6
upload_init
- frame .d -bd 2 -relief groove -pady 2 -padx 2
+ frame .d -pady 2 -padx 2 -bg black -bd 2 -relief sunken
image create bitmap image/main
label .d.mi -image image/main -bd 0
frame .d.got -bg black -height $gotsh
frame .d.ctx -bg black
- image create bitmap image/cursor -data \
+ image create bitmap image/cursor -foreground white -background black \
+ -data \
{#define csr_width 11
#define csr_height 11
static unsigned char csr_bits[] = {
}
frame .d.csr.csr
- label .d.csr.csr.l -image image/cursor -compound left
+ label .d.csr.csr.l -image image/cursor -compound left -fg white -bg black
entry .d.csr.csr.e -bd 0
pack .d.csr.csr.l -side left
- frame .d.selctx -bd 2 -relief groove
+ frame .selctx -bd 2 -relief groove
frame .d.mi.csr_0 -bg white -width 1
frame .d.mi.csr_1 -bg white -width 1
- frame .d.pe
- frame .d.pe.grid
+ frame .pe
+ frame .pe.grid
- button .d.pe.ok -text OK
- pack .d.pe.grid .d.pe.ok -side left
+ button .pe.ok -text OK
+ pack .pe.grid .pe.ok -side left
+ bind .pe.ok <Key-Return> { .pe.ok invoke }
- pack .d.mi .d.ctx -side top
+ pack .d.mi .d.ctx -side top -anchor w
pack .d -fill x -padx 2 -pady 2
frame .help -bd 2 -relief groove
global mulcols mulrows csrh gotsh ctxh
global unk_l unk_contexts
- foreach w {.d.csr .d.got .d.ctx .d.mi} {
+ foreach w {.d.csr .d.got .d.ctx} {
$w configure -width $mulcols
}
+ .d.csr configure -width [expr {$mulcols+150}]
eval destroy [winfo children .d.ctx]
}
global reqkind database_fn database
upvar #0 database_magic/$reqkind magic
- set f [open $database_fn.new w]
+ set f [open $database_fn.tmp w]
puts $f $magic
write_database_header/$reqkind $f
}
puts $f "."
close $f
- file rename -force $database_fn.new $database_fn
+ file rename -force $database_fn.tmp $database_fn
}
proc select_database {dbname_spec} {
global dbname
set dbname $dbname_spec
- read_database "./#local-$dbname#.txt"
+ read_database "./_local-$dbname.txt"
}
proc do_database_update {im def} {
}
foreach ctx $unk_contexts { set all_contexts($ctx) 1 }
- eval destroy [winfo children .d.selctx]
- label .d.selctx.title -text \
+ eval destroy [winfo children .selctx]
+ label .selctx.title -text \
{Select match context for altering dictionary:}
- pack .d.selctx.title -side left
- set new_context [lindex $unk_contexts 0]
+ pack .selctx.title -side left
+ set new_context {}
set ci 0; foreach ctx [lsort [array names all_contexts]] {
set all_contexts($ctx) $ci
- set selw .d.selctx.c$ci
+ set selw .selctx.c$ci
set seltxt $ctx
radiobutton $selw -variable new_context -value $ctx -text $seltxt
pack $selw -side left
incr ci
}
$selw configure -text "$seltxt."
- label .d.selctx.warning -text {See README.charset.}
- pack .d.selctx.warning -side left
+ label .selctx.warning -text {See README.charset.}
+ pack .selctx.warning -side left
show_context maxh $unk_l $unk_contexts
.d.ctx configure -height $maxh
- pack forget .d.pe
- pack .d.selctx .d.csr -side top -before .d.mi
- pack .d.got .d.ctx -side top -after .d.mi
- pack configure .d.selctx -fill x
+ pack forget .pe
+ pack .selctx -before .d -padx 2 -fill x
+ pack .d.csr -side top -before .d.mi -anchor w
+ pack .d.got .d.ctx -side top -after .d.mi -anchor w
+ pack configure .selctx -fill x
focus .d
select_database char$rows
debug "PIX SELECT $ncol [llength $alloptions]"
foreach_pixmap_col col {
if {$col==$ncol} continue
- .d.pe.grid.l$col selection clear 0 end
+ .pe.grid.l$col selection clear 0 end
+ }
+ if {[pixmap_maybe_ok]} {
+ focus .pe.ok
}
- pixmap_maybe_ok
}
proc pixmap_maybe_ok {} {
global alloptions pixmap_selcol pixmap_selrow
set nsel 0
foreach_pixmap_col col {
- set cs [.d.pe.grid.l$col curselection]
+ set cs [.pe.grid.l$col curselection]
set lcs [llength $cs]
if {!$lcs} continue
incr nsel $lcs
}
if {$nsel==1} {
debug "MAYBE_OK YES col=$pixmap_selcol row=$pixmap_selrow."
- .d.pe.ok configure -state normal -command pixmap_ok
+ .pe.ok configure -state normal -command pixmap_ok
+ return 1
} else {
- .d.pe.ok configure -state disabled -command {}
+ .pe.ok configure -state disabled -command {}
+ return 0
}
}
proc pixmap_ok {} {
return_result_start
foreach_pixmap_col col {
- .d.pe.grid.l$col configure -state disabled
+ .pe.grid.l$col configure -state disabled
}
- .d.pe.ok configure -state disabled
+ .pe.ok configure -state disabled
manyset [lrange $alloptions [expr {$pixmap_selcol*3}] end] \
colname coldesc rows
if {![string length $ppml]} break
append ppm $ppml "\n"
}
- set data [exec pnmscale 2 << $ppm]
- image create photo image/main -data $data
+ execpnm_createphoto image/main pnmscale 2 << $ppm
set alloptions [exec ./database-info-fetch $unk_what]
place forget .d.mi.csr_0
place forget .d.mi.csr_1
- pack forget .d.selctx .d.csr .d.got
- pack .d.pe -side top -before .d.mi -pady 2
+ pack forget .selctx .d.csr .d.got
+ pack .pe -side top -before .d -pady 2
.d configure -takefocus 0
#-pady 2 -fill x
- eval destroy [winfo children .d.pe.grid]
+ eval destroy [winfo children .pe.grid]
set col 0; foreach {colname coldesc rows} $alloptions {
debug "INIT $col $colname \"$coldesc\""
- label .d.pe.grid.t$col -text $colname
- listbox .d.pe.grid.l$col
+ label .pe.grid.t$col -text $colname
+ listbox .pe.grid.l$col
foreach {rowname rowdesc} $rows {
debug "INIT $col $colname \"$coldesc\" $rowname \"$rowdesc\""
- .d.pe.grid.l$col insert end $rowdesc
+ .pe.grid.l$col insert end $rowdesc
}
- bind .d.pe.grid.l$col <<ListboxSelect>> [list pixmap_select $col]
- grid .d.pe.grid.t$col -column $col -row 0
- grid .d.pe.grid.l$col -column $col -row 1
+ bind .pe.grid.l$col <<ListboxSelect>> [list pixmap_select $col]
+ grid .pe.grid.t$col -column $col -row 0
+ grid .pe.grid.l$col -column $col -row 1
incr col
}
pixmap_maybe_ok
helptext {
- {{Indicate the meaning of this image, and click OK.}}
+ {{Indicate the meaning of this image; then click OK or hit Return.}}
}
}
}
proc maybe_upload_entry {im def} {
- global reqkind privacy_setting env dbname quiet
+ global reqkind privacy_setting env dbname quiet aadepth
debug "DB-UPDATE PRIVACY $privacy_setting"
if {!$privacy_setting} return
set pl {}
lappend pl dict $dbname
+ lappend pl version 3
+ lappend pl depth $aadepth
if {$privacy_setting>=2} {
set pirate [string totitle $env(YPPSC_PIRATE)]
append o $ointerl
}
-# debug "DATA $o"
- set data [exec pnmscale 1 << $o]
- image create photo image/main -data $data
+# debug "DATA1 $o"
+
+ execpnm_createphoto image/main pnmscale 1 << $o
}
#---------- character set editor display ----------
global glyphsdone unk_l unk_r
set cur_already [expr {[llength $glyphsdone]/5-1}]
- set cur_mode 1 ;# one of: 0 1 already text
+ set cur_mode 0 ;# one of: 0 1 already text
set cur_0 $unk_l
set cur_1 [expr {$unk_r+1}]
global all_contexts
foreach ctx [array names all_contexts] {
set ci $all_contexts($ctx)
- set selw .d.selctx.c$ci
+ set selw .selctx.c$ci
if {[lsearch -exact $contexts $ctx]>=0} {
set state normal
} else {
if {[lsearch -exact $okctxts $ctx] >= 0} {
bind_key [string tolower $key] "
[list set new_context $ctx]
- recursor
+ char_start_define_text
"
} else {
bind_key [string tolower $key] {}
lappend context_help $key
}
set context_help [list [join $context_help " "] \
- {Set match context for new glyph.}]
+ {Set match context for new glyph, confirm location, and start entry.}]
bind_key space { othercursor }
bind_leftright_q cur_$z1 0 [expr {$cols-1}]
{Escape {abandon entry}}
}
unbind_all_keys
- pack .d.csr.csr.e -side left
+ pack .d.csr.csr.e -side left -padx 2
focus .d.csr.csr.e
bind .d.csr.csr.e <Key-Return> {
set strq [.d.csr.csr.e get]
# $database($context 0x<bits> 0x<bits>...) = $hex
-set database_magic/char {# ypp-sc-tools pctb font v2}
+set database_magic/char "# ypp-sc-tools pctb font v3 depth=$aadepth"
proc read_database_header/char {f} {
global rows
manyset [dict2_reqkind_rows $dict] reqkind rows
if {$yesno} {
- read_database $dictdir/master-$dict.txt
+ set fnbase $dictdir/master-$dict.txt
+ read_database $fnbase
set database($key) $val
write_database
+
+ exec gzip --rsyncable -7 < $fnbase > $fnbase.gz.new
+ exec mv -f -- $fnbase.gz.new $fnbase.gz
+
set desc approve
} else {
set desc reject
}
proc approve_decompose_data {specdata} {
- global data
+ global data aadepth
set data $specdata
- regsub-data {^ypp-sc-tools dictionary update v1\n} {}
+ regsub-data "^ypp-sc-tools dictionary update v3 depth=$aadepth\\n" {}
uplevel 1 chop_counted pirate
uplevel 1 chop_counted caller
uplevel 1 chop_counted dict
uplevel 1 chop_counted key
uplevel 1 chop_counted val
- return [uplevel 1 {list $dict $def $image}]
+ return [uplevel 1 {list $dict $ctx $def $image}]
}
proc approve_compare {fd1 fd2} {
label $wb-def.def -text $def
pack $wb-def.scope $wb-def.def -side bottom
- set ppm [exec pnmscale 2 << $image]
- image create photo approve/$ix -data $ppm
- label $wb-image -image approve/$ix -bd 2 -relief sunken
+ if {[regexp {^P2} $image]} {
+ set image [exec pgmtoppm {#008-white} << $image | pnmnoraw]
+ append image "\n"
+ }
+ execpnm_createphoto approve/$ix pnmscale 3 << $image
+ label $wb-image -image approve/$ix -bd 2 -relief flat -bg black
manyset [dict2_reqkind_rows $dict] reqkind
approve_showentry_xinfo/$reqkind $wb-xinfo $def
proc approve_confirm {} {
global approve_ixes approve_entryhow
+ .ok configure -state disabled
+ update idletasks
approve_check_server
foreach ix $approve_ixes {
set how $approve_entryhow($ix)
set approve_list [lsort -command approve_compare $approve_list]
approve_show_page 0
+ .ok configure -state normal
}
proc main/approve {} {