--- loncom/interface/lonspeller.pm 2004/07/22 23:50:55 1.4 +++ loncom/interface/lonspeller.pm 2004/12/02 20:54:26 1.9 @@ -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.9 2004/12/02 20:54:26 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -30,10 +30,15 @@ package Apache::lonspeller; +use Apache::Constants qw(:common); use Text::Aspell; use Apache::lonlocal; +use Apache::lontexconvert(); +use HTML::LCParser; use strict; + my $speller; +my $insidelink; sub spellcheck_language { if ($ENV{'form.lang'}) { return $ENV{'form.lang'}; } @@ -48,27 +53,59 @@ sub set_language { $speller->set_option('lang',$lang); } -sub markeduptext { +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.=''; + if (($suggestions) && (!$insidelink)) { + $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 +113,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 { @@ -92,7 +129,8 @@ sub handler { $r->print(''. &mt('Spell Checker'). ''. - &markeduptext($ENV{'form.text'}). + &Apache::lontexconvert::msgtexconverted( + &markeduptext($ENV{'form.text'})). ''); return OK; }