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>