--- loncom/interface/lonspeller.pm 2004/07/22 19:43:46 1.2
+++ loncom/interface/lonspeller.pm 2006/03/23 23:43:13 1.15
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Interface routines for Aspell
#
-# $Id: lonspeller.pm,v 1.2 2004/07/22 19:43:46 www Exp $
+# $Id: lonspeller.pm,v 1.15 2006/03/23 23:43:13 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -30,39 +30,125 @@
package Apache::lonspeller;
+use Apache::Constants qw(:common);
use Text::Aspell;
use Apache::lonlocal;
+use Apache::lonnet;
+use Apache::lontexconvert();
+use HTML::LCParser;
use strict;
+
my $speller;
+my $insidelink;
-sub markeduptext {
+sub spellcheck_language {
+ if ($env{'form.lang'}) { return $env{'form.lang'}; }
+ if (&mt('spellcheck_lang') ne 'spellcheck_lang') {
+ return &mt('spellcheck_lang');
+ }
+ return 'en_US';
+}
+
+sub set_language {
+ my $lang=&spellcheck_language();
+ $speller->set_option('lang',$lang);
+}
+
+sub textsection {
my $input=shift;
my $output='';
- foreach my $word (split(/\W+/,$input)) {
- if ($speller->check($word)) {
- $output.=$word.' ';
+ &set_language();
+ foreach my $word (split(/\b/,$input)) {
+ if (($word=~/\W/) || ($word=~/^(lt|gt|nbsp|amp)$/i)
+ || ($speller->check($word))) {
+ $output.=$word;
} else {
my $suggestions=join(' ',$speller->suggest($word));
- &Apache::lonnet::logthis($suggestions);
$suggestions=~s/\'/\\\'/gs;
- if ($suggestions) {
- $output.='';
+ if (($suggestions) && (!$insidelink)) {
+ my $start_page=
+ &Apache::loncommon::start_page('Speller Suggestions',undef,
+ {'only_body' => 1,
+ 'js_ready' => 1,
+ 'html_encode' => 1,
+ 'bgcolor' => '#FFFFFF'});
+ my $end_page=
+ &Apache::loncommon::end_page({'js_ready' => 1,
+ 'html_encode' => 1,});
+ $output.='';
}
$output.=''.$word.'';
- if ($suggestions) { $output.=''; }
- $output.=' ';
+ if (($suggestions) && (!$insidelink)) { $output.=''; }
+ }
+ }
+ return $output;
+}
+
+
+sub markeduptext {
+ my $input=shift;
+ my $output='';
+ my $parser=HTML::LCParser->new(\$input);
+ $insidelink=0;
+ my $token;
+ while ($token=$parser->get_token) {
+ if ($token->[0] eq 'T') {
+ $output.=&textsection($token->[1]);
+ } elsif ($token->[0] eq 'S') {
+ $output.=$token->[4];
+ foreach my $tag ('m','script') {
+ if ($token->[1] eq $tag) {
+ $output.=$parser->get_text('/'.$tag);
+ }
+ }
+ if ($token->[1] eq 'a') {
+ $insidelink=1;
+ }
+ } elsif ($token->[0] eq 'E') {
+ $output.=$token->[2];
+ if ($token->[1] eq 'a') {
+ $insidelink=0;
+ }
}
}
+ $insidelink=0;
return $output;
}
+sub initspeller {
+ unless (defined($speller)) {
+ $speller = Text::Aspell->new;
+ $speller->set_option('lang','en_US');
+ }
+ $insidelink=0;
+}
+
+sub handler {
+ my $r = shift;
+ &Apache::loncommon::content_type($r,'text/html');
+ $r->send_http_header;
+ return OK if $r->header_only;
+
+ &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
+
+ &initspeller();
+ my $start_page =
+ &Apache::loncommon::start_page('Spell Checker',undef,
+ {'only_body' => 1,
+ 'bgcolor' => '#DDDDDD'});
+ $r->print($start_page.
+ &Apache::lontexconvert::msgtexconverted(
+ &markeduptext($env{'form.text'})).
+ &Apache::loncommon::end_page());
+ return OK;
+}
+
BEGIN {
- $speller = Text::Aspell->new;
- $speller->set_option('lang','en_US');
- $speller->set_option('sug-mode','fast');
-# $speller->set_option('mode','sgml');
+ &initspeller();
}
1;