--- loncom/interface/lonspeller.pm 2004/07/22 23:50:55 1.4
+++ loncom/interface/lonspeller.pm 2006/07/03 13:40:42 1.17
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Interface routines for Aspell
#
-# $Id: lonspeller.pm,v 1.4 2004/07/22 23:50:55 www Exp $
+# $Id: lonspeller.pm,v 1.17 2006/07/03 13:40:42 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -30,13 +30,19 @@
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 spellcheck_language {
- if ($ENV{'form.lang'}) { return $ENV{'form.lang'}; }
+ if ($env{'form.lang'}) { return $env{'form.lang'}; }
if (&mt('spellcheck_lang') ne 'spellcheck_lang') {
return &mt('spellcheck_lang');
}
@@ -48,27 +54,81 @@ sub set_language {
$speller->set_option('lang',$lang);
}
-sub markeduptext {
+{
+ my $uniq;
+ sub get_uniq {
+ return ++$uniq;
+ }
+}
+
+sub textsection {
my $input=shift;
my $output='';
&set_language();
- foreach my $word (split(/\W+/,$input)) {
- if ($speller->check($word)) {
- $output.=$word.' ';
+ 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.='';
+ $suggestions = &Apache::loncommon::js_ready($suggestions);
+ if (($suggestions) && (!$insidelink)) {
+ my $start_page=
+ &Apache::loncommon::start_page('Speller Suggestions',undef,
+ {'only_body' => 1,
+ 'js_ready' => 1,
+ 'bgcolor' => '#FFFFFF'});
+ my $end_page=
+ &Apache::loncommon::end_page({'js_ready' => 1,});
+ my $num = &get_uniq();
+ my $info =''.$word.'
'.$suggestions;
+ $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;
}
@@ -76,8 +136,8 @@ sub initspeller {
unless (defined($speller)) {
$speller = Text::Aspell->new;
$speller->set_option('lang','en_US');
- $speller->set_option('sug-mode','fast');
}
+ $insidelink=0;
}
sub handler {
@@ -89,11 +149,14 @@ sub handler {
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
&initspeller();
- $r->print('