spellchecker.pl
上传用户:ah_jiwei
上传日期:2022-07-24
资源大小:54044k
文件大小:5k
源码类别:

数据库编程

开发平台:

Visual C++

  1. #!/usr/bin/perl
  2. use CGI qw/ :standard /;
  3. use File::Temp qw/ tempfile tempdir /;
  4. # my $spellercss = '/speller/spellerStyle.css'; # by FredCK
  5. my $spellercss = '../spellerStyle.css'; # by FredCK
  6. # my $wordWindowSrc = '/speller/wordWindow.js'; # by FredCK
  7. my $wordWindowSrc = '../wordWindow.js'; # by FredCK
  8. my @textinputs = param( 'textinputs[]' ); # array
  9. # my $aspell_cmd = 'aspell'; # by FredCK (for Linux)
  10. my $aspell_cmd = '"C:Program FilesAspellbinaspell.exe"'; # by FredCK (for Windows)
  11. my $lang = 'en_US';
  12. # my $aspell_opts = "-a --lang=$lang --encoding=utf-8"; # by FredCK
  13. my $aspell_opts = "-a --lang=$lang --encoding=utf-8 -H --rem-sgml-check=alt"; # by FredCK
  14. my $input_separator = "A";
  15. # set the 'wordtext' JavaScript variable to the submitted text.
  16. sub printTextVar {
  17. for( my $i = 0; $i <= $#textinputs; $i++ ) {
  18.         print "textinputs[$i] = decodeURIComponent('" . escapeQuote( $textinputs[$i] ) . "')n";
  19. }
  20. }
  21. sub printTextIdxDecl {
  22. my $idx = shift;
  23. print "words[$idx] = [];n";
  24. print "suggs[$idx] = [];n";
  25. }
  26. sub printWordsElem {
  27. my( $textIdx, $wordIdx, $word ) = @_;
  28. print "words[$textIdx][$wordIdx] = '" . escapeQuote( $word ) . "';n";
  29. }
  30. sub printSuggsElem {
  31. my( $textIdx, $wordIdx, @suggs ) = @_;
  32. print "suggs[$textIdx][$wordIdx] = [";
  33. for my $i ( 0..$#suggs ) {
  34. print "'" . escapeQuote( $suggs[$i] ) . "'";
  35. if( $i < $#suggs ) {
  36. print ", ";
  37. }
  38. }
  39. print "];n";
  40. }
  41. sub printCheckerResults {
  42. my $textInputIdx = -1;
  43. my $wordIdx = 0;
  44. my $unhandledText;
  45. # create temp file
  46. my $dir = tempdir( CLEANUP => 1 );
  47. my( $fh, $tmpfilename ) = tempfile( DIR => $dir );
  48. # temp file was created properly?
  49. # open temp file, add the submitted text.
  50. for( my $i = 0; $i <= $#textinputs; $i++ ) {
  51. $text = url_decode( $textinputs[$i] );
  52. @lines = split( /n/, $text );
  53. print $fh "%n"; # exit terse mode
  54. print $fh "^$input_separatorn";
  55. print $fh "!n";  # enter terse mode
  56. for my $line ( @lines ) {
  57. # use carat on each line to escape possible aspell commands
  58. print $fh "^$linen";
  59. }
  60. }
  61. # exec aspell command
  62. my $cmd = "$aspell_cmd $aspell_opts < $tmpfilename 2>&1";
  63. open ASPELL, "$cmd |" or handleError( "Could not execute `$cmd`\n$!" ) and return;
  64. # parse each line of aspell return
  65. for my $ret ( <ASPELL> ) {
  66. chomp( $ret );
  67. # if '&', then not in dictionary but has suggestions
  68. # if '#', then not in dictionary and no suggestions
  69. # if '*', then it is a delimiter between text inputs
  70. if( $ret =~ /^*/ ) {
  71. $textInputIdx++;
  72. printTextIdxDecl( $textInputIdx );
  73. $wordIdx = 0;
  74. } elsif( $ret =~ /^(&|#)/ ) {
  75. my @tokens = split( " ", $ret, 5 );
  76. printWordsElem( $textInputIdx, $wordIdx, $tokens[1] );
  77. my @suggs = ();
  78. if( $tokens[4] ) {
  79. @suggs = split( ", ", $tokens[4] );
  80. }
  81. printSuggsElem( $textInputIdx, $wordIdx, @suggs );
  82. $wordIdx++;
  83. } else {
  84. $unhandledText .= $ret;
  85. }
  86. }
  87. close ASPELL or handleError( "Error executing `$cmd`\n$unhandledText" ) and return;
  88. }
  89. sub escapeQuote {
  90. my $str = shift;
  91. $str =~ s/'/\'/g;
  92. return $str;
  93. }
  94. sub handleError {
  95. my $err = shift;
  96. print "error = '" . escapeQuote( $err ) . "';n";
  97. }
  98. sub url_decode {
  99. local $_ = @_ ? shift : $_;
  100. defined or return;
  101. # change + signs to spaces
  102. tr/+/ /;
  103. # change hex escapes to the proper characters
  104. s/%([a-fA-F0-9]{2})/pack "H2", $1/eg;
  105. return $_;
  106. }
  107. # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
  108. # Display HTML
  109. # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
  110. print <<EOF;
  111. Content-type: text/html; charset=utf-8
  112. <html>
  113. <head>
  114. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  115. <link rel="stylesheet" type="text/css" href="$spellercss"/>
  116. <script src="$wordWindowSrc"></script>
  117. <script type="text/javascript">
  118. var suggs = new Array();
  119. var words = new Array();
  120. var textinputs = new Array();
  121. var error;
  122. EOF
  123. printTextVar();
  124. printCheckerResults();
  125. print <<EOF;
  126. var wordWindowObj = new wordWindow();
  127. wordWindowObj.originalSpellings = words;
  128. wordWindowObj.suggestions = suggs;
  129. wordWindowObj.textInputs = textinputs;
  130. function init_spell() {
  131. // check if any error occured during server-side processing
  132. if( error ) {
  133. alert( error );
  134. } else {
  135. // call the init_spell() function in the parent frameset
  136. if (parent.frames.length) {
  137. parent.init_spell( wordWindowObj );
  138. } else {
  139. error = "This page was loaded outside of a frameset. ";
  140. error += "It might not display properly";
  141. alert( error );
  142. }
  143. }
  144. }
  145. </script>
  146. </head>
  147. <body onLoad="init_spell();">
  148. <script type="text/javascript">
  149. wordWindowObj.writeBody();
  150. </script>
  151. </body>
  152. </html>
  153. EOF