tkispell
view release on metacpan or search on metacpan
#!/usr/bin/perl -w
use Tk;
use Tk::widgets qw(Label Dialog SimpleFileSelect Balloon);
$VERSION=0.17;
#
# Default font - edit this for your system.
#
my $fn = '*-helvetica-medium-r-*-*-12-*'; # Widget font
my $lang = $ENV{LANG};
if ($lang =~ /^C$/ || ! defined ($lang)) {$lang = 'default'; }
my $hdict = $ENV{HOME}."/.ispell_$lang"; # Personal dictionary.
my $ispell_prog = `which ispell`;
chomp $ispell_prog;
my ($cw, $b1, @misspelledlist, @replacementlist, @addlist, $midx);
my $ifname = '';
my $lastmatchindex = '1.0';
my $matchlength = 0;
my $nextmiss = 0;
my $scriptname = $O;
sub mainwindow {
$cw = new MainWindow (-title => $O);
$b1 = $cw -> Balloon ();
@opts = (-padx => 5, -pady => 5);
my $cl = $cw->Scrolled ('Text', -height => 3, -wrap => 'none',
-font => $fn, -scrollbars => 'se');
$b1 -> attach ($cl, -balloonmsg => 'Misspelled text.');
$cl->Subwidget($_)->configure(-width=>10) foreach('xscrollbar','yscrollbar');
$cl->grid (-row => 2,-column => 1,-columnspan => 3,-sticky => 'ew',@opts);
$cw->Advertise ('text' => $cl);
my $lb = $cw -> Scrolled ('Listbox', -font => $fn, -scrollbars => 'osoe');
$lb->grid(-row => 3,-column => 1,-columnspan => 2,-sticky => 'ew',@opts);
$cw->Advertise('list' => $lb);
$b1 -> attach ($lb, -balloonmsg => 'Selection of replacement words.');
my $f = $cw->Frame(-container => 0)->grid(-row => 3,-column => 3);
my $b = $cw->Button (-text => 'Accept',-command => sub {checknext ()},
-width => 15, -font => $fn);
$b->grid(-row => 1, -column => 1, -in => $f, -sticky => 'w', @opts);
$b1 -> attach ($b, -balloonmsg => 'Accept the misspelled word.');
$b = $cw->Button(-text => 'Add', -command => sub {push
@addlist, (gettextselection ()); checknext ()},
-width => 15, -font => $fn);
$b->grid(-row => 2, -column => 1, -in => $f, -sticky => 'w', @opts);
$b1 -> attach ($b, -balloonmsg => 'Add the misspelled wordto dictionary.');
$b = $cw->Button(-text => 'Replace', -command =>
sub{replace () && checknext ()}, -width => 15, -font => $fn);
$b1 -> attach ($b, -balloonmsg => 'Replace this misspelling.');
$b->grid(-row => 3, -column => 1, -in => $f, -sticky => 'w', @opts);
$b = $cw->Button(-text => 'Replace All', -command =>
sub {replaceall () ; checknext ()}, -width => 15, -font => $fn);
$b->grid(-row => 4, -column => 1, -in => $f, -sticky => 'w', @opts);
$b1 -> attach ($b, -balloonmsg => 'Replace all occurrences of misspelling.');
my $l = $cw->Label (-text => 'Replace with:', -font => $fn, -width => 15);
$l->grid(-row => 5, -column => 1, -padx => 5, -in => $f, -sticky => 'w');
my $e = $cw->Entry (-width => 20);
$e->grid(-row => 6, -column => 1, -padx => 5, -in => $f, -sticky => 'ew');
$cw->Advertise ('replaceentry' => $e);
$b1 -> attach ($e, -balloonmsg => 'Edit and replace the misspelling.');
$lb -> bind ('<Button-1>', sub { $e->delete (0,'end');
$e->insert(0, $lb->get ($lb->curselection))});
$f2 = $cw->Frame(-container => 0);
$f2->grid (-row => 5, -column => 1, -columnspan => 4, -sticky => 'ew');
$b = $cw->Button(-text => 'Check...', -command => sub {checkfirst ()},
-width => 15, -font => $fn);
$b1 -> attach ($b, -balloonmsg => 'Begin spell check.');
$b -> grid (-row => 5, -column => 1, -sticky => 'ew', -in => $f2, @opts);
$b = $cw -> Button (-text => 'Select File...',
-command => sub {selectfile ()},-width => 15, -font => $fn);
$b1 -> attach ($b, -balloonmsg => 'Select file to spell check.');
$b -> grid (-row => 5, -column => 2, -sticky => 'ew', -in => $f2, @opts);
$b = $cw -> Button (-text => 'Dismiss', -command => sub{save_and_exit ()},
-width => 15, -font => $fn);
$b -> grid (-row => 5, -column => 3, -sticky => 'ew', -in => $f2, @opts);
$b1 -> attach ($b, -balloonmsg => 'Exit the program.');
}
sub save_and_exit {
$cw -> WmDeleteWindow if (defined ($ifname) && ! length ($ifname));
if ($#misspelledlist >= 0) {
my $d = $cw -> Dialog (-title => 'Save File',
-text => "Save $ifname?\nOriginal file will be saved as $ifname.bak.",
-bitmap => 'question', -font => $fn, -buttons => [qw/Yes No/],
-default_button => 'Yes');
$d -> Subwidget ('B_Yes') -> configure (-font => $fn);
$d -> Subwidget ('B_No') -> configure (-font => $fn);
if (($d->Show) =~ /Yes/) {
$cw -> Busy;
system ('mv', $ifname, "$ifname.bak");
open OUT, "+>>$ifname" or die "Couldn't overwrite old $ifname: $!\n";
print OUT ($cw -> Subwidget ('text') -> get ('1.0', 'end'));
close OUT;
$cw -> Unbusy;
}
}
if ($#addlist >= 0) {
$d = $cw -> Dialog (-title => 'Add Words',
-text => 'Save new words to your personal dictionary?',
-bitmap => 'question', -font => $fn,
-buttons => [qw/Yes No/], -default_button => 'Yes');
$d -> Subwidget ('B_Yes') -> configure (-font => $fn);
$d -> Subwidget ('B_No') -> configure (-font => $fn);
if (($d->Show) =~ /Yes/) {
$cw -> Busy;
open OUT, ">>$hdict" or die "Couldn't add words to $hdict: $!\n";
foreach (@addlist) { print OUT "$_\n"}
close OUT;
$cw -> Unbusy;
}
}
$cw -> WmDeleteWindow;
}
sub filenotfound {
$cw->Dialog (-title => 'File Not Found', -text => "Could not open @_",
-bitmap => 'error', -font => $fn) -> Show;
}
sub selectfile {
my $d = $cw -> SimpleFileSelect;
$ifname = $d -> Show;
return filenotfound ($ifname) if (length $ifname and (not -f $ifname));
openfile ();
( run in 0.698 second using v1.01-cache-2.11-cpan-39bf76dae61 )