File:  [LON-CAPA] / loncom / interface / spellcheck.pm
Revision 1.1: download - view: text, annotated - select for diffs
Tue Aug 21 10:31:52 2012 UTC (11 years, 11 months ago) by foxr
Branches: MAIN
CVS tags: HEAD
Ajax helper for jquery-spellcheck.

    1: # The LearningOnline Network
    2: # Printout
    3: #
    4: # $Id: spellcheck.pm,v 1.1 2012/08/21 10:31:52 foxr Exp $
    5: #
    6: # Copyright Michigan State University Board of Trustees
    7: #
    8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
    9: #
   10: # LON-CAPA is free software; you can redistribute it and/or modify
   11: # it under the terms of the GNU General Public License as published by
   12: # the Free Software Foundation; either version 2 of the License, or
   13: # (at your option) any later version.
   14: #
   15: # LON-CAPA is distributed in the hope that it will be useful,
   16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
   17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   18: # GNU General Public License for more details.
   19: #
   20: # You should have received a copy of the GNU General Public License
   21: # along with LON-CAPA; if not, write to the Free Software
   22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   23: #
   24: # /home/httpd/html/adm/gpl.txt
   25: # http://www.lon-capa.org/
   26: #
   27: #
   28: package Apache::spellcheck;
   29: use strict;
   30: use Text::Aspell;
   31: 
   32: #------------------------------------------------------
   33: #
   34: # array_to_json - Take a Perl array of strings and convert
   35: #                 it to JSON representation.  Note that
   36: #                 this could be done with the JSON package
   37: #                 but in this application context it's just
   38: #                 too trivial to bother.
   39: # @param values - reference to an array.
   40: #
   41: # @return string - the JSON for the array.
   42: #
   43: sub array_to_json {
   44:     my $array_ref = shift;
   45:     my @array     = @$array_ref;
   46: 
   47:     # surround each array element in double quotes.
   48:     # ..and convert into a comma separated string:
   49: 
   50:     for (my $i = 0; $i < scalar(@array); $i++) {
   51: 	$array[$i] = '"' . $array[$i] . '"';
   52:     }
   53:     my $array_guts = join(', ', @array);
   54:     return '[' . $array_guts . ']';
   55: }
   56: 
   57: #--------------------------------------------------------
   58: #
   59: # spell_check -  Check the spellings of a set of white-space
   60: #                separated words.  Output is a JSON array
   61: #                of the mis-spelled words.
   62: #
   63: #
   64: #  @param words - the words to check.
   65: #  @param lang  - The language in which to run the spell checker.
   66: #
   67: #  @return - The JSON array to print.
   68: #
   69: sub spell_check {
   70:     my ($words, $lang) = @_;
   71:     
   72:     my $checker = Text::Aspell->new;
   73:     $checker->set_option('lang', $lang);
   74: 
   75:     #  Turn the words into an array:
   76: 
   77:     my @word_list = split(/\s+/, $words);
   78: 
   79:     my @mis_spelled;
   80:     foreach my $word (@word_list) {
   81: 	if (!$checker->check($word)) {
   82: 	    push (@mis_spelled $word);
   83: 	}
   84:     }
   85:     return &array_to_json(\@mis_spelled);
   86: }
   87: #-------------------------------------------------------
   88: #
   89: # suggest spellings for a mis-spelled word.
   90: # 
   91: # @param word - The mis-spelled word.
   92: # @param lang - The language in which to suggest.
   93: #
   94: # @return the JSON to output.
   95: #
   96: sub suggest_spellings {
   97:     my ($word, $lang) = @_;
   98:     my $checker = Text::Aspell->new;
   99:     $checker->set_option('lang', $lang);
  100: 
  101:     @suggestions = $checker->suggest($word);
  102: 
  103:     return &array_to_json(\@suggestions);
  104: }
  105: #--------------------------------------------------------
  106: #
  107: #  Handler.  We are given some query parameters that tell us
  108: #  what to do.  Specifically:
  109: #    lang = The spellcheck language
  110: #    The Data is the text to check with no punctuation.
  111: #    we must respond with Json of the miss-spelled words.
  112: #    if the data is of the form suggest='word' we must
  113: #    return suggested spellings for "word"
  114: #    as a Json array.
  115: 
  116: sub handler {
  117:     my $r = shift;
  118: 
  119:     # Figure out the language defaulting to english.
  120: 
  121:     my $language = "en-US";
  122:     if ($r->param{'lang'}) {
  123: 	$language = $r->param{'lang'};
  124:     }
  125:     #  Regardless, response Content type: is application/json:
  126: 
  127:     $h->header_out('Content-Type', 'application/json');
  128: 
  129:     # Whether we are suggesting or spell checking
  130:     # depends on which of the suggest or text args are present:
  131: 
  132: 
  133:     my $data;
  134: 
  135:     if ($h->args{'text'}) {
  136: 	$data =  &spell_check($h->args{'text'}, $language);
  137:     } eslif ($h->args{'suggest'}) {
  138: 	$data = &suggest_spellings($h->args{'suggest'}, $language);
  139:     } else {
  140: 	die "Invalid request";
  141:     }
  142:     $r->print($data);
  143: 
  144: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>