chiark / gitweb /
Use gzip --rsyncable -7 instead of -1
[ypp-sc-tools.db-live.git] / pctb / dictionary-manager
index a638d9e7b5449d056ce3e90225f96a12b161b447..5501765992e14e21953238e4fce7724a4801bc32 100755 (executable)
 # 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
@@ -39,6 +42,9 @@
 #  if it wrote a byte to fd 4, it can take another question
 
 
+set aadepth 2
+
+
 #---------- library routines ----------
 
 proc manyset {list args} {
@@ -88,6 +94,13 @@ proc bgerror {m} {
     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
@@ -108,7 +121,7 @@ proc init_widgets {} {
 
     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
@@ -117,7 +130,8 @@ proc init_widgets {} {
     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[] = {
@@ -126,20 +140,21 @@ 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
@@ -150,9 +165,10 @@ proc resize_widgets_core {} {
     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]
 }
@@ -221,7 +237,7 @@ proc write_database {} {
     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
@@ -235,13 +251,13 @@ proc write_database {} {
     }
     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} {
@@ -276,30 +292,31 @@ proc required/char {} {
     }
     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
@@ -355,15 +372,17 @@ proc pixmap_select {ncol} {
     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
@@ -372,9 +391,11 @@ proc pixmap_maybe_ok {} {
     }
     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 {} {
@@ -382,9 +403,9 @@ 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
@@ -408,8 +429,7 @@ proc required/pixmap {} {
        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]
 
@@ -421,29 +441,29 @@ proc required/pixmap {} {
     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.}}
     }
 }
 
@@ -508,7 +528,7 @@ proc upload_status {} {
 }
 
 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
@@ -517,6 +537,8 @@ proc maybe_upload_entry {im def} {
 
     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)]
@@ -684,9 +706,9 @@ proc char_read_pgm {f} {
        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 ----------
@@ -718,7 +740,7 @@ proc startup_cursor {} {
     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}]
@@ -732,7 +754,7 @@ proc char_exactly_selctxts {contexts} {
     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 {
@@ -759,7 +781,7 @@ proc recursor//01 {z1} {
        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] {}
@@ -767,7 +789,7 @@ proc recursor//01 {z1} {
        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}]
@@ -813,7 +835,7 @@ proc recursor/text {} {
        {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]
@@ -892,7 +914,7 @@ proc recursor {} {
 
 # $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
@@ -1046,9 +1068,14 @@ proc remote-serv/take {yesno file dict} {
     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
@@ -1128,10 +1155,10 @@ proc chop_counted {var} {
 }
 
 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
@@ -1141,7 +1168,7 @@ proc approve_decompose_data {specdata} {
     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} {
@@ -1181,9 +1208,12 @@ proc approve_showentry {ix file specdata} {
     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
@@ -1231,6 +1261,8 @@ proc approve_check_server {} {
 
 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)
@@ -1265,6 +1297,7 @@ proc approve_fetch_list {} {
 
     set approve_list [lsort -command approve_compare $approve_list]
     approve_show_page 0
+    .ok configure -state normal
 }
 
 proc main/approve {} {