/usr/bin/wordview is in catdoc 1:0.94.3~git20160113.dbc9ec6+dfsg-1+deb9u1.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 | #! /usr/bin/wish
set charset_lib "/usr/share/catdoc"
# -* wish *-
# fallback which allows me to run wordview.tcl without doing make
package require Tcl 8.3
if ![info exist charset_lib] {
set charset_lib /usr/local/lib/catdoc
}
option add *Text.Font {Courier 11} widgetDefault
option add *Text.Background white widgetDefault
option add *Text.Foreground black widgetDefault
option add *Text.selectBackground black widgetDefault
option add *Text.selectForeground white widgetDefault
option add *Text.findMode exact widgetDefault
option add *Text.findCase no widgetDefault
option add *Menu.highlightBackground MidnightBlue widgetDefault
option add *Menu.highlightThickness 0 widgetDefault
option add *Menu.activeBackground MidnightBlue widgetDefault
option add *Menu.activeForeground white widgetDefault
option add *Menu.activeBorderWidth 0 widgetDefault
menu .mainmenu
. configure -menu .mainmenu
.mainmenu add cascade -label File -menu [set m [menu .mainmenu.file]] -underline 0
$m add command -label Open... -command load_file -accelerator Ctrl-O
$m add command -label "Save As..." -command write_file -accelerator Ctrl-S -state disabled
$m add separator
$m add command -label Quit -command exit -accelerator Alt-F4
set m [menu .mainmenu.edit -postcommand EditEnable]
.mainmenu add cascade -label Edit -menu $m -underline 0 -state disabled
$m add command -label Copy -command CopySel -accelerator Ctrl-C
$m add separator
$m add command -label "Select All" -accelerator Ctrl-A -command \
{.text tag add sel 0.0 end}
.mainmenu add cascade -label Find -menu .mainmenu.search -underline 1 -state disabled
set m [menu .mainmenu.search -postcommand EnableSearch]
$m add command -label "Find..." -command FindDialog -accelerator Ctrl-F
$m add command -label "Find Again" -accelerator F3 -command DoFind
#
# build charset menu
#
.mainmenu add cascade -state disabled -label Encoding -menu [set m [menu .mainmenu.encoding]]
$m add radio -label Default -value Default -var in_charset
$m add radio -label unicode -value unicode -var in_charset
foreach l [glob [file join $charset_lib *.txt]] {
set n [file rootname [file tail $l]]
$m add radio -label $n -value $n -var in_charset
}
set in_charset Default
trace var in_charset w reread
set m [menu .mainmenu.help]
.mainmenu add cascade -label Help -menu $m -underline 0
$m add command -label "Manual page" -command [list show_help [file tail $argv0]]
$m add command -label "Regular expressions" -command {show_help re_syntax}
$m add separator
$m add command -label "About..." -command AboutDialog
text .text -width 80 -height 25 -xscrollcommand ".xs set" \
-yscrollcommand ".ys set" -wrap word \
-spacing3 2m
.text tag configure sel -relief flat -borderwidth 0
.text tag configure doc -lmargin1 0.2i -lmargin2 0
scrollbar .ys -orient vert -command ".text yview"
scrollbar .xs -orient horiz -command ".text xview"
bind .text <F3> { if [info exists FindPattern] DoFind}
bind .text <Control-O> load_file
bind .text <Control-o> load_file
bind .text <Control-S> {write_file}
bind .text <Control-s> {write_file}
bind .text <Control-F> FindDialog
bind .text <Control-f> FindDialog
grid .text .ys
grid .xs x
grid .text -sticky news
grid .xs -sticky we
grid .ys -sticky ns
grid columnconfigure . 0 -weight 1
grid columnconfigure . 1 -weight 0
grid rowconfigure . 0 -weight 1
grid rowconfigure . 1 -weight 0
# Find options (All this can be tuned from dialog)
set FindMode -[option get .text findMode FindMode] ;# no -regexp for novices
set FindDir -forwards ;# Why not -backwards
set FindCase -nocase ;# Leave it empty if you want to be case sensitive
if {[option get .text findCase FindCase]} {
set FindCase ""
}
proc show_help {page} {
global argv0
if [winfo exists .man] {
wm deiconify .man
raise .man
.man.text delete 0.0 end
} else {
toplevel .man -class Man
wm title .man "[file tail $argv0] help: $page"
menu .man.menu
.man.menu add cascade -label File -menu [set m [menu .man.menu.file]]
.man configure -menu .man.menu
$m add command -label Close -command {destroy .man}
text .man.text -yscrollcommand {.man.y set}
scrollbar .man.y -command {.man.text yview} -orient vert
grid .man.text .man.y -sticky news
grid columnconfigure .man 0 -weight 1
grid columnconfigure .man 1 -weight 0
}
.man.text insert end [exec man $page 2>/dev/null | col -b ]
}
proc load_file {{name {}}} {
global filename
if ![string length $name] {set name [tk_getOpenFile -filetypes {
{{Msword files} .doc}
{{RTF files} .rtf}
{{MS Write files} .wri}
{{All files} *}} ]}
if ![string length $name] return
if ![file readable $name] {
return -code error "Cannot open file $name"
}
set filename $name
.mainmenu entryconfigure Encoding -state normal
.mainmenu.file entryconfigure "Save As..." -state normal
.mainmenu entryconfigure "Edit" -state normal
.mainmenu entryconfigure "Find" -state normal
reread
}
proc make_opt {var flag} {
upvar #0 $var charset
switch $charset {
"Default" {return ""}
"unicode" {return "-u"}
default {return "$flag $charset"}
}
}
proc reread {args} {
global filename in_charset out_charset
set inopt [make_opt in_charset -s]
set f [open "|catdoc -w $inopt -d utf-8 \"$filename\"" r]
fconfigure $f -encoding utf-8
.text configure -state normal
.text delete 0.0 end
.text insert 0.0 [read $f] doc
.text mark set insert 1.0
.text configure -state disabled
.text see 1.0
if [catch {close $f} msg] {
tk_messageBox -icon error -title error -message $msg -type ok
return
}
}
proc write_file {{name {}}} {
global filename
if ![string length $name] {
set name [tk_getSaveFile -filetypes {
{{Text files} .txt}
{{LaTeX files} .tex}}]
}
if ![string length $name] return
if {[file extension $name]==".tex"} {
eval exec catdoc -t [make_opt in_charset -s] [make_opt out_charset -d]\
[list $filename] > [list $name]
} else {
eval exec catdoc [make_opt in_charset -s] [make_opt out_charset -d]\
[list $filename] > [list $name]
}
}
# -postcommand for Edit menu
proc EditEnable {} {
if [llength [.text tag ranges sel]] {
.mainmenu.edit entryconfigure Copy -state normal
} else {
.mainmenu.edit entryconfigure Copy -state disabled
}
}
proc CopySel {} {
clipboard clear
clipboard append -- [.text get sel.first sel.last]
}
proc FindDialog {} {
make_transient .find "Find"
frame .find.top
label .find.top.l -text "Find"
entry .find.top.e -width 30 -textvar FindPattern
bind .find.top.e <Key-Return> ".find.b.find invoke"
pack .find.top.l .find.top.e -side left
FindOptionFrame
frame .find.b
button .find.b.find -text "Search" -command DoFind
button .find.b.close -text "Close" -command "destroy .find"
pack .find.b.find .find.b.close -side left -padx 20
pack .find.top -pady 5 -anchor w -padx 10
pack .find.opt -pady 10
pack .find.b
focus .find.top.e
}
proc EnableSearch {} {
global FindPattern ReplaceString
if ![info exists FindPattern] {
.mainmenu.search entryconfigure "Find Again" -state disabled
} else {
.mainmenu.search entryconfigure "Find Again" -state normal
}
}
proc make_transient {wpath title} {
set x [expr [winfo rootx .]+[winfo width .]/3]
set y [expr [winfo rooty .]+[winfo height .]/3]
catch {destroy $wpath}
toplevel $wpath
wm transient $wpath .
wm positionfrom $wpath program
wm geometry $wpath +$x+$y
wm title $wpath $title
}
proc FindOptionFrame {} {
frame .find.opt
checkbutton .find.opt.dir -variable FindDir -onvalue -backwards\
-offvalue -forwards -text Backward
checkbutton .find.opt.regex -variable FindMode -onvalue\
-regex -offvalue -exact -text RegExp
checkbutton .find.opt.case -variable FindCase -onvalue -nocase -offvalue {}\
-text "Ignore case"
pack .find.opt.dir .find.opt.regex .find.opt.case -side left
}
proc DoFind {{quiet 0}} {
global FindPattern FindMode FindDir FindCase
if ![string length $FindPattern] {return 0}
if {$FindMode=="-backwords"} {
set stopindex 0.0
} else {
set stopindex end
}
set index [eval ".text search $FindCase $FindMode $FindDir -- \
[list $FindPattern] insert $stopindex"]
if ![string length $index] {
if !$quiet {
tk_messageBox -type ok -title "Not found" -message "Pattern not found"
}
return 0
} else {
.text tag remove sel 0.0 end
if {$FindMode=="-exact"} {
.text tag add sel $index "$index + [string length $FindPattern] chars"
} else {
eval "regexp $FindCase --" [list $FindPattern [.text get "$index linestart"\
"$index lineend"] match]
.text tag add sel $index "$index + [string length $match] chars"
}
.text mark set insert sel.last
.text see $index
.text see insert
focus .text
return 1
}
}
proc AboutDialog {} {
make_transient .about "About WordView"
message .about.m -aspect 250 -text "MS-Word viewer for UNIX
Copyright (c) by Victor B. Wagner 1997-98
This program is distributed under
GNU General Public License Version 2 or above
Check http://www.gnu.org/copyleft/gpl.html for copying
and warranty conditions" -justify center
button .about.ok -text Ok -command {destroy .about}
pack .about.m .about.ok
}
if [llength $argv] {
if {![file exist [lindex $argv 0]]} {
puts stderr "No such file: [lindex $argv 0]"
exit 1
}
load_file [lindex $argv 0]
}
focus .text
|