X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-test.git;a=blobdiff_plain;f=pctb%2Fdictionary-manager;h=d9de00cb99da21296c1142952e15a2eb4961e23c;hp=911cb634edd3d6fa096bfc7c7e8af05e110109c9;hb=9c4e6ae34ea06c776ebbf5410f7bc1ce78edad2f;hpb=b0b0b88ed34882b5de7323e339f03a44af024d5f diff --git a/pctb/dictionary-manager b/pctb/dictionary-manager index 911cb63..d9de00c 100755 --- a/pctb/dictionary-manager +++ b/pctb/dictionary-manager @@ -25,9 +25,12 @@ # 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} { @@ -53,6 +59,13 @@ proc must_gets {f lvar} { if {[gets $f l] < 0} { error "huh?" } } +proc must_gets_imagel {f lvar} { + global debug_rect + upvar 1 $lvar l + must_gets $f l + if {$debug_rect} { debug "<< $l" } +} + proc must_gets_exactly {f expected} { must_gets $f got if {[string compare $expected $got]} { error "$expected $got ?" } @@ -101,7 +114,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 @@ -110,7 +123,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[] = { @@ -119,20 +133,20 @@ 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 - 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 @@ -146,6 +160,7 @@ proc resize_widgets_core {} { 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] } @@ -195,7 +210,7 @@ proc read_database {fn} { set database_fn $fn if {![file exists $database_fn]} return set f [open $database_fn r] - if {[string compare [db_getsl $f] $magic]} { error "$l $reqkind ?" } + if {[string compare [db_getsl $f] $magic]} { error "$magic $reqkind ?" } read_database_header/$reqkind $f while 1 { @@ -214,7 +229,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 @@ -228,7 +243,7 @@ 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} { @@ -246,15 +261,15 @@ proc do_database_update {im def} { proc required/char {} { global mulrows glyphsdone unk_l unk_r unk_contexts rows new_context - global all_contexts + global all_contexts debug_rect must_gets stdin l + debug "GOT $l" manyset [lrange $l 0 3] unk_l unk_r unk_contexts set glyphsdone [lrange $l 3 end] - debug "GOT $l" - char_read_xpm stdin + char_read_pgm stdin catch { unset all_contexts } @@ -269,30 +284,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 @@ -348,7 +364,7 @@ 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 } pixmap_maybe_ok } @@ -356,7 +372,7 @@ 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 @@ -365,9 +381,9 @@ 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 } else { - .d.pe.ok configure -state disabled -command {} + .pe.ok configure -state disabled -command {} } } proc pixmap_ok {} { @@ -375,9 +391,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 @@ -397,7 +413,7 @@ proc required/pixmap {} { debug "GOT pixmap $unk_what" set ppm {} while 1 { - must_gets stdin ppml + must_gets_imagel stdin ppml if {![string length $ppml]} break append ppm $ppml "\n" } @@ -414,23 +430,23 @@ 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 <> [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 <> [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 @@ -501,7 +517,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 @@ -510,6 +526,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)] @@ -568,118 +586,120 @@ proc maybe_upload_entry {im def} { if {!$quiet} { puts stderr \ - "Uploaded $dbname dictionary entry `$def': $body" + "Uploaded $dbname `$def': $body" } } #========== CHARACTER SET ========== -#---------- xpm input processor ---------- +#---------- pgm input processor ---------- -proc char_read_xpm {f} { +proc char_read_pgm {f} { global glyphsdone mul inter rhsmost_max unk_l unk_r mulcols mulrows - global cols rows wordmap + global cols rows charkey - set o {} - set y -3 - while 1 { - must_gets $f l - if {![regexp {^"(.*)",$} $l dummy l]} { - append o "$l\n" - if {[regexp {^\}\;$} $l]} break - continue - } - if {$y==-3} { - manyset $l cols rows colours cpp - if {$colours!=2 || $cpp!=1} { error "$l ?" } - - set chop_l [expr {$unk_l - 80}] - set chop_r [expr {$cols - $unk_l - 100}] - if {$chop_l<0} { set chop_l 0 } - - set unk_l [expr {$unk_l - $chop_l}] - set unk_r [expr {$unk_r - $chop_l}] - set ngd {} - foreach {min max context contexts got} $glyphsdone { - lappend ngd \ - [expr {$min-$chop_l}] \ - [expr {$max-$chop_l}] \ - $context $contexts $got - } - set glyphsdone $ngd + must_gets_imagel $f l + if {[string compare $l P2]} { error "magic $l ?" } + + must_gets_imagel $f l + if {![regexp {^([1-9]\d{0,3}) ([1-9]\d{0,3}) ([1-9]\d?)$} \ + $l dummy cols rows maxval]} { error "head $l ?" } + + for {set depth 1} {$maxval != (1<<$depth)-1} {incr depth} { + if {$depth >= 16} { error "maxval $maxval ?" } + } + + set chop_l [expr {$unk_l - 80}] + set chop_r [expr {$cols - $unk_l - 100}] + if {$chop_l<0} { set chop_l 0 } + if {$chop_r<0} { set chop_r 0 } + + set unk_l [expr {$unk_l - $chop_l}] + set unk_r [expr {$unk_r - $chop_l}] + set ngd {} + foreach {min max context contexts got} $glyphsdone { + lappend ngd \ + [expr {$min-$chop_l}] \ + [expr {$max-$chop_l}] \ + $context $contexts $got + } + set glyphsdone $ngd - set realcols $cols - set cols [expr {$cols - $chop_l - $chop_r}] - debug "NOW cols=$cols chop_l,r=$chop_l,$chop_r rows=$rows\ + set realcols $cols + set cols [expr {$cols - $chop_l - $chop_r}] + debug "NOW cols=$cols chop_l,r=$chop_l,$chop_r rows=$rows\ $unk_l $unk_r $ngd" - - set mulcols [expr {$cols*$mul+$inter}] - set mulrows [expr {$rows*$mul+$inter}] - append o "\"$mulcols $mulrows 9 1\",\n" - for {set x 0} {$x<$cols} {incr x} { set wordmap($x) 0 } - } elseif {$y==-2} { # first pixel - append o \ -"\"+ c #111\", -\"a c #800\", -\"A c #fcc\", -\"b c #00c\", -\"B c #fff\", -\"u c #000\", -\"U c #ff0\", -\"q c #000\", -\"Q c #ff0\",\n" - } elseif {$y==-1} { # 2nd pixel but we've already printed ours - } else { - set ybit [expr {1<<$y}] - set x 0 - set ol "\"+" - set olh $ol - if {$chop_r>=0} { - set l [string range $l $chop_l end-$chop_r] + + set mulcols [expr {$cols*$mul+$inter}] + set mulrows [expr {$rows*$mul+$inter}] + + set o "P3\n$mulcols $mulrows 15\n" + + for {set x 0} {$x<$cols} {incr x} { set charkey($x) {} } + + set ointer1 " 1 1 1" + set ointer [string repeat $ointer1 $inter] + set ointerl "[string repeat $ointer1 $mulcols]\n" + + append o $ointerl + + for {set y 0} {$y<$rows} {incr y} { + must_gets_imagel $f l + if {[llength $l] != $realcols} { error "realcols=$realcols $l ?" } + + set ol $ointer + + for {set x 0} {$x<$cols} {incr x} { + set realx [expr {$x + $chop_l}] + set c [lindex $l $realx] + append charkey($x) [format %x $c] + + set how "u" + if {$x >= $unk_l && $x <= $unk_r} { + set how q } else { - set l [string range $l $chop_l end] - append l [string repeat " " [expr -$chop_r]] - } - foreach c [split $l ""] { - set how "u" - if {$x >= $unk_l && $x <= $unk_r} { - set how q - } else { - set ab 0 - foreach {min max context contexts got} $glyphsdone { - set rhsmost_max $max - if {$x >= $min && $x <= $max} { - set how [lindex {a b} $ab] - break - } - set ab [expr {!$ab}] + set ab 0 + foreach {min max context contexts got} $glyphsdone { + set rhsmost_max $max + if {$x >= $min && $x <= $max} { + set how [lindex {a b} $ab] + break } + set ab [expr {!$ab}] } - switch -exact $c { - " " { set p $how } - "o" { - set p [string toupper $how] - incr wordmap($x) $ybit - } - default { error "$c ?" } - } - append ol "[string repeat $p [expr {$mul-$inter}]][ - string repeat + $inter]" - append olh [string repeat + $mul] - incr x } - set ole "\",\n" - append ol $ole - append olh $ole - set olhn [string repeat $olh $inter] - if {!$y} { append o $olhn } - append o [string repeat $ol [expr {$mul-1}]] - append o $olhn + set c15 [expr {$c << (16-$depth)}] + set c15 [expr {$c15 | ($c15 >> $depth)}] + set c15 [expr {$c15 | ($c15 >> $depth*2)}] + set c15 [expr {$c15 >> 12}] + + foreach rgb {r g b} { set $rgb {$c15} } + switch -exact $how { + a { set r {$c15>>1 | 0x8} } + b { set b {$c15>>2 | 0xc} } + u { set b 0 } + q { set b 0 } + default { error "how $how ?" } + } +#debug "PIXEL $x,$y how=$how c=$c c15=$c15 $r $g $b" + + set opixel " " + foreach rgb {r g b} { + append opixel [format " %2d" [expr [set $rgb]]] + } + append ol [string repeat $opixel [expr {$mul-$inter}]] + append ol $ointer } - incr y + append ol "\n" + append o [string repeat $ol [expr {$mul-$inter}]] + append o $ointerl } - set data [exec xpmtoppm << $o] - image create photo image/main -data $data + + debug "DATA1 $o" + set tmpfile ./#dictimage#.tmp + exec pnmscale 1 << $o >$tmpfile + image create photo image/main -file $tmpfile + file delete $tmpfile } #---------- character set editor display ---------- @@ -725,7 +745,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 { @@ -806,7 +826,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 { set strq [.d.csr.csr.e get] @@ -885,11 +905,12 @@ proc recursor {} { # $database($context 0x 0x...) = $hex -set database_magic/char {# ypp-sc-tools pctb font v1} +set database_magic/char "# ypp-sc-tools pctb font v3 depth=$aadepth" proc read_database_header/char {f} { global rows - if {([db_getsl $f])+0 != $rows} { error "wrong h ?" } + set l [db_getsl $f] + if {$l+0 != $rows} { error "wrong h $l $rows ?" } } proc read_database_entry/char {f context} { global database @@ -898,7 +919,7 @@ proc read_database_entry/char {f context} { while 1 { set l [db_getsl $f] if {![string length $l]} break - lappend bm [format %x 0x$l] + lappend bm $l } set database($bm) $strq } @@ -915,10 +936,10 @@ proc format_database_entry/char {bm strq} { } proc dbkey {ctx l r} { - global wordmap + global charkey set bm $ctx for {set x $l} {$x <= $r} {incr x} { - lappend bm [format %x $wordmap($x)] + lappend bm $charkey($x) } return $bm } @@ -936,7 +957,7 @@ proc char_get_definition_cursors {} { } proc char_get_definition_contexts {} { - global glyphsdone unk_l unk_contexts wordmap database + global glyphsdone unk_l unk_contexts database manyset [char_get_definition_cursors] c0 c1 @@ -1102,7 +1123,7 @@ proc dict2_reqkind_rows {dict} { debug "DICT PIXMAP" } elseif {[regexp {^(char)([1-9]\d*)$} $dict dummy reqkind rows]} { debug "DICT CHAR rqk=$reqkind r=$rows." - return [list $reqkind rows] + return [list $reqkind $rows] } else { error "$dict ?" } @@ -1120,10 +1141,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 @@ -1173,9 +1194,14 @@ 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" + } + set image [exec pnmscale 2 << $image] + + image create photo approve/$ix -data $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 @@ -1376,12 +1402,14 @@ proc debug {m} { } set mainkind default set ai 0 set debug 0 +set debug_rect 0 set quiet 0 foreach arg $argv { incr ai switch -exact -- $arg { {--quiet} { set quiet 1 } {--debug} { set debug 1 } + {--debug-rect} { set debug_rect 1 } {--debug-server} { proc debug {m} { puts stderr "DICT-MGR-SVR $m" }} {--noop-arg} { } {--approve-updates} { set mainkind approve; break }