tk-latex-editor/lib/modules/encode.tcl

239 lines
8.2 KiB
Tcl
Raw Normal View History

2017-07-13 12:45:37 +03:00
###########################################################
# Tcl/Tk project Manager
# Distributed under GNU Public License
# Author: Sergey Kalinin banzaj@lrn.ru
# Copyright (c) "CONERO lab", 2002, http://conero.lrn.ru
###########################################################
###########################################################
# ENCODING files procedure #
###########################################################
proc GetCorrectEncode {latexEncode} {
global files dir activeFile files
set f [open "[file join $dir(work) encode.lst]" r]
set encodeList [encoding names]
while {[gets $f line]} {
if {[string index [string trim $line] 0] == "#"} {
continue
}
scan $line "%s%s" texEnc tclEnc
#puts "$texEnc $tclEnc"
if {$texEnc == $latexEncode} {
close $f
return $tclEnc
} else {
set ind [lsearch -exact $encodeList $latexEncode]
#puts $latexEncode
if {$ind == -1} {
set answer [tk_messageBox\
-message "[lindex $files($activeFile) 0] [::msgcat::mc "Don't find any system encoding for"] $latexEncode \
[::msgcat::mc "You must write correctly encode name in"] [file join $dir(work) encode.lst] [::msgcat::mc "file"]"\
-type ok -icon warning\
-title [::msgcat::mc "Warning"]]
case $answer {
ok {return}
}
close $f
return $latexEncode
} else {
close $f
return $latexEncode
}
}
}
}
proc EncodeDialog {type} {
global color files activeFile
set w .encode
# destroy the find window if it already exists
if {[winfo exists .encode]} {
destroy .encode
}
toplevel .encode
wm title .encode [::msgcat::mc "Encoding"]
wm resizable .encode 0 0
wm transient .encode .
frame .encode.encodings -width 10
eval {
listbox .encode.encodings.list -height 10 -width 20 -selectbackground $color(selectbg)\
-selectborderwidth 0 -yscrollcommand {.encode.encodings.yscroll set}
}
eval {scrollbar .encode.encodings.yscroll -orient vertical -command {.encode.encodings.list yview}}
pack .encode.encodings.list -side left -expand true -fill y
pack .encode.encodings.yscroll -side left -expand false -fill y
pack .encode.encodings -side top -expand true -fill both
canvas .encode.line -border 0 -height 1 -background black -width 10
pack .encode.line -side top -expand true -fill x
frame .encode.command -width 10
if {$type == "file"} {
eval {
button .encode.command.ok -text [::msgcat::mc "Ok"] -command {
SetEncode [.encode.encodings.list get [.encode.encodings.list curselection]]
}
}
} else {
eval {
button .encode.command.ok -text [::msgcat::mc "Ok"] -command {
TextRecode [.encode.encodings.list get [.encode.encodings.list curselection]]
}
}
}
eval {button .encode.command.cancel -text [::msgcat::mc "Cancel"] -command {destroy .encode }}
grid .encode.command.ok -row 0 -column 0 -sticky e -pady 2 -padx 2
grid .encode.command.cancel -row 0 -column 1 -sticky w -pady 2 -padx 2
pack .encode.command -side top -expand true -fill x
bind .encode.encodings.list <Double-1> {eval [.encode.command.ok cget -command]}
bind .encode.encodings.list <Return> {eval [.encode.command.ok cget -command]}
bind .encode <Escape> {eval [.encode.command.cancel cget -command]}
set i 0 ; set cur_encoding [encoding system]
foreach { name_encodings } [lsort [encoding names] ] {
.encode.encodings.list insert end $name_encodings
if { $name_encodings == $cur_encoding } { set enc_pos $i }
incr i
} ;# foreach encoding names
wm resizable .encode 0 0
.encode.encodings.list activate $enc_pos
.encode.encodings.list selection set $enc_pos $enc_pos
.encode.encodings.list see $enc_pos
focus -force .encode.encodings.list
}
## Source encode ##
proc DocRecode {pipe} {
global files tree activeFile
set parentNode [$tree parent $activeFile]
if [info exists files($parentNode)] {
set sourceEnc [lindex $files($parentNode) 2]
} else {
set sourceEnc [encoding system] ;#[EncodeDialog]
}
puts $sourceEnc
while {[gets $pipe line]>=0} {
if [regexp -nocase -all -- {(\\)(usepackage)(\[)(.*?)(\])(\{)inputenc(\})} $line match v1 v2 v3 sourceEnc v5 v6 v7] {
if [set ind [string last "," $sourceEnc]] {
set sourceEnc [string range $sourceEnc [expr $ind + 1] end]
}
puts "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> $sourceEnc"
set sourceEnc [GetCorrectEncode $sourceEnc]
puts "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> $sourceEnc"
}
}
fconfigure $pipe -encoding binary
seek $pipe 0 start
return $sourceEnc
}
## CHANGE SOURCE FIELE ENCODING ##
proc SetEncode {encode} {
global files activeFile status nb
destroy .encode
set files($activeFile) [list [lindex $files($activeFile) 0] [lindex $files($activeFile) 1] "$encode"]
#puts $files($activeFile)
$status(encode) configure -text "[lindex $files($activeFile) 2]"
}
## Reencoding text ##
proc TextRecode {encode} {
global files activeFile status nb
destroy .encode
set text $nb.f$activeFile.f.text
set contents [$text get 0.0 end]
#puts "[lindex $files($activeFile) 2] $encode"
set contents [encoding convertto [lindex $files($activeFile) 2] $contents]
set contents [encoding convertfrom $encode $contents]
$text delete 0.0 end
$text insert end $contents
unset text
SetEncode $encode
}
proc CheckEncoding {text} {
global files activeFile
set sourceEnc "" ;#[EncodeDialog]
set line [$text get 0.0 end]
if [regexp -nocase -all -- {(\\)(usepackage)(\[)(.*?)(\])(\{)inputenc(\})} $line match v1 v2 v3 sourceEnc v5 v6 v7] {
#break
if {$sourceEnc != "[lindex $files($activeFile) 2]"} {
set answer [tk_messageBox -message "[::msgcat::mc "Don't correctly setting document encoding! Save anyway?"]"\
-type yesno -icon warning\
-title [::msgcat::mc "Warning"]]
case $answer {
yes {return 1}
no {return 0}
}
}
puts "DocEnc-$sourceEnc ViewEnc-[lindex $files($activeFile) 2]"
}
}
## clipboard encode ##
set xselection ""
proc EncodeTextSelection {txt offset len} {
set ::xselection [eval $txt get [$txt tag ranges sel]]
encoding convertto \
[crange $::xselection $offset [expr $offset + $len - 1]]
}
proc EncodeEntrySelection {txt offset len} {
if [$txt selection present] {
set idx1 [$txt index sel.first]
set idx2 [$txt index sel.last]
set ::xselection [string range [$txt get] $idx1 $idx2]
encoding convertto \
[crange $::xselection $offset [expr $offset + $len - 1]]
} else {
set ::xselection ""
}
}
if {$tcl_platform(platform) == "win"} {
bind Text <Map> { selection handle %W "EncodeTextSelection %W"}
bind Entry <Map> { selection handle %W "EncodeEntrySelection %W"}
bind Text <Unmap> { selection handle %W {}}
bind Entry <Unmap> { selection handle %W {}}
bind Text <ButtonRelease-2> {
if [catch {set sel [selection get]}] continue
if {[selection own] == ""} {
set sel [encoding convertfrom $sel]
} else {
set sel $xselection
}
%W insert current $sel
}
bind Entry <ButtonRelease-2> {
if [catch {set sel [selection get]}] continue
if {[selection own] == ""} {
set sel [encoding convertfrom $sel]
} else {
set sel $xselection
}
%W insert insert $sel
}
}
#set class Text
#bind $class <Map> "selection handle %W \"unix::Encode${class}Selection %W\""
#bind $class <Unmap> { selection handle %W {}}
#proc EncodeTextSelection {txt offset len} {encoding convertto [eval $txt get [$txt tag ranges sel]]}