]> granicus.if.org Git - php/commitdiff
Initial release. Includes:
authorVlad Krupin <vlad@php.net>
Mon, 10 Jul 2000 21:29:19 +0000 (21:29 +0000)
committerVlad Krupin <vlad@php.net>
Mon, 10 Jul 2000 21:29:19 +0000 (21:29 +0000)
- Functionality of aspell
- 3 modes of spellchecking (fast, normal, bad_spellers)
- support for run-together words

ext/pspell/Makefile.in [new file with mode: 0644]
ext/pspell/README [new file with mode: 0644]
ext/pspell/config.m4 [new file with mode: 0644]
ext/pspell/php_pspell.h [new file with mode: 0644]
ext/pspell/pspell.c [new file with mode: 0644]

diff --git a/ext/pspell/Makefile.in b/ext/pspell/Makefile.in
new file mode 100644 (file)
index 0000000..5c323c8
--- /dev/null
@@ -0,0 +1,5 @@
+
+LTLIBRARY_NAME    = libpspell.la
+LTLIBRARY_SOURCES = pspell.c
+
+include $(top_srcdir)/build/dynlib.mk
diff --git a/ext/pspell/README b/ext/pspell/README
new file mode 100644 (file)
index 0000000..97373af
--- /dev/null
@@ -0,0 +1,35 @@
+README file for pspell (spellchecker) module for PHP4
+-----------------------------------------------------
+
+The latest release of pspell is always available from
+
+  http://pspell.sourceforge.net/
+
+This module was developed and tested with aspell-.31.1 and pspell-.11.0.2,
+although slightly earlier (and hopefully later) versions of those libraries
+should work as well.
+
+General notes
+-------------
+
+Plese, note that somewhere around version .27.x (I believe) aspell stopped
+working with the aspell module for php. This is due to the fact that the
+author changed things around a bit, and suggested that people link to pspell
+in the future rather than to aspell. That's exactly what this module is for.
+It has the same basic functionality as aspell (and more features are being
+added). I did not want to modify existing aspell module, because it would
+break things for those who are using older aspell, or result in very ugly code.
+Rather, I wrote a new module - pspell.
+
+
+Building pspell on a Unix system
+--------------------------------
+
+In order to use pspell, you need to have *both* aspell and pspell libraries
+installed, and they have to be compatible with each other. Get the latest
+release of both at the URL given above.
+
+I expect the libraries to be in /usr/local (that's the default when you
+cofigure pspell and aspell with their 'configure' scripts woth no parameters).
+If that location is different, please specify it in --with-pspell=PATH, where
+PATH is the path you specified for pspell libraries.
diff --git a/ext/pspell/config.m4 b/ext/pspell/config.m4
new file mode 100644 (file)
index 0000000..52a962a
--- /dev/null
@@ -0,0 +1,28 @@
+dnl $Id$
+
+AC_MSG_CHECKING(for PSPELL support)
+AC_ARG_WITH(pspell,
+[  --with-pspell[=DIR]     Include PSPELL support.],
+[
+  if test "$withval" != "no"; then
+    if test "$withval" = "yes"; then
+      PSPELL_DIR=/usr/local
+    else
+      PSPELL_DIR=$withval
+    fi
+
+    AC_ADD_INCLUDE($PSPELL_DIR/include)
+    AC_ADD_LIBRARY_WITH_PATH(pspell, $PSPELL_DIR/lib)
+
+    if test ! -f "$PSPELL_DIR/include/pspell/pspell.h"; then
+      AC_MSG_ERROR(Could not find pspell.h in $PSPELL_DIR/include/pspell - please copy it manually from the pspell sources to $PSPELL_DIR/include/pspell)
+    fi
+    AC_DEFINE(HAVE_PSPELL,1,[Whether you have pspell])
+    AC_MSG_RESULT(yes)
+       PHP_EXTENSION(pspell)
+  else
+    AC_MSG_ERROR(no)
+  fi
+],[
+  AC_MSG_RESULT(no)
+])
diff --git a/ext/pspell/php_pspell.h b/ext/pspell/php_pspell.h
new file mode 100644 (file)
index 0000000..272272d
--- /dev/null
@@ -0,0 +1,53 @@
+/* 
+   +----------------------------------------------------------------------+
+   | PHP HTML Embedded Scripting Language Version 3.0                     |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-1999 PHP Development Team (See Credits file)      |
+   +----------------------------------------------------------------------+
+   | This program is free software; you can redistribute it and/or modify |
+   | it under the terms of one of the following licenses:                 |
+   |                                                                      |
+   |  A) the GNU General Public License as published by the Free Software |
+   |     Foundation; either version 2 of the License, or (at your option) |
+   |     any later version.                                               |
+   |                                                                      |
+   |  B) the PHP License as published by the PHP Development Team and     |
+   |     included in the distribution in the file: LICENSE                |
+   |                                                                      |
+   | This program is distributed in the hope that it will be useful,      |
+   | but WITHOUT ANY WARRANTY; without even the implied warranty of       |
+   | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        |
+   | GNU General Public License for more details.                         |
+   |                                                                      |
+   | You should have received a copy of both licenses referred to here.   |
+   | If you did not, or have any questions about PHP licensing, please    |
+   | contact core@php.net.                                                |
+   +----------------------------------------------------------------------+
+   | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca>                       |
+   +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+
+#ifndef _PSPELL_H
+#define _PSPELL_H
+#if HAVE_PSPELL
+extern zend_module_entry pspell_module_entry;
+#define pspell_module_ptr &pspell_module_entry
+
+extern PHP_MINIT_FUNCTION(pspell);
+extern PHP_MINFO_FUNCTION(pspell);
+
+PHP_FUNCTION(pspell_new);
+PHP_FUNCTION(pspell_mode);
+PHP_FUNCTION(pspell_runtogether);
+PHP_FUNCTION(pspell_check);
+PHP_FUNCTION(pspell_suggest);
+#else
+#define pspell_module_ptr NULL
+#endif
+
+#define phpext_pspell_ptr pspell_module_ptr
+
+#endif /* _PSPELL_H */
diff --git a/ext/pspell/pspell.c b/ext/pspell/pspell.c
new file mode 100644 (file)
index 0000000..ef5802c
--- /dev/null
@@ -0,0 +1,272 @@
+/*
+       +----------------------------------------------------------------------+
+       | PHP version 4.0                                                      |
+       +----------------------------------------------------------------------+
+       | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group                   |
+       +----------------------------------------------------------------------+
+       | This source file is subject to version 2.02 of the PHP license,      |
+       | that is bundled with this package in the file LICENSE, and is        |
+       | available at through the world-wide-web at                           |
+       | http://www.php.net/license/2_02.txt.                                 |
+       | If you did not receive a copy of the PHP license and are unable to   |
+       | obtain it through the world-wide-web, please send a note to          |
+       | license@php.net so we can mail you a copy immediately.               |
+       +----------------------------------------------------------------------+
+       | Authors:   Vlad Krupin <phpdevel@echospace.com>                      |
+       +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#include "php.h"
+
+#ifdef COMPILE_DL_PSPELL
+#include "phpdl.h"
+#endif
+#include <stdlib.h>
+#include <ctype.h>
+#include <stdio.h>
+
+#if HAVE_PSPELL
+
+#include "php_pspell.h"
+#include <pspell/pspell.h>
+#include "ext/standard/info.h"
+
+#define PS_FAST 1
+#define PS_NORMAL 2
+#define PS_BAD_SPELLERS 3
+
+function_entry pspell_functions[] = {
+       PHP_FE(pspell_new,              NULL)
+       PHP_FE(pspell_mode,             NULL)
+       PHP_FE(pspell_runtogether,      NULL)
+       PHP_FE(pspell_check,            NULL)
+       PHP_FE(pspell_suggest,          NULL)
+};
+
+static int le_pspell;
+
+zend_module_entry pspell_module_entry = {
+       "pspell", pspell_functions, PHP_MINIT(pspell), NULL, NULL, NULL, PHP_MINFO(pspell), STANDARD_MODULE_PROPERTIES
+};
+
+#ifdef COMPILE_DL_PSPELL
+ZEND_GET_MODULE(pspell)
+#endif
+
+static void php_pspell_close(PspellManager *manager){
+       delete_pspell_manager(manager);
+}
+
+
+PHP_MINIT_FUNCTION(pspell){
+       REGISTER_MAIN_LONG_CONSTANT("PS_FAST", PS_FAST, CONST_PERSISTENT | CONST_CS);
+       REGISTER_MAIN_LONG_CONSTANT("PS_NORMAL", PS_NORMAL, CONST_PERSISTENT | CONST_CS);
+       REGISTER_MAIN_LONG_CONSTANT("PS_BAD_SPELLERS", PS_BAD_SPELLERS, CONST_PERSISTENT | CONST_CS);
+       le_pspell = register_list_destructors(php_pspell_close,NULL);
+       return SUCCESS;
+}
+
+/* {{{ proto int pspell_new(string language [, string spelling [, string jargon [, string encoding]]])
+   Load a dictionary */
+PHP_FUNCTION(pspell_new){
+       pval **language,**spelling,**jargon,**encoding;
+       int argc;
+       int ind;
+
+       PspellCanHaveError *ret;
+       PspellManager *manager;
+       PspellConfig *config;
+       
+       argc = ZEND_NUM_ARGS();
+       if (argc < 1 || argc > 4 || zend_get_parameters_ex(argc,&language,&spelling,&jargon,&encoding) == FAILURE) {
+               WRONG_PARAM_COUNT;
+       }
+
+       config = new_pspell_config();
+       convert_to_string_ex(language);
+       if(argc > 1){
+               convert_to_string_ex(spelling) ;
+               pspell_config_replace(config, "spelling", (*spelling)->value.str.val);
+       }
+
+       if(argc > 2){
+               convert_to_string_ex(jargon) ;
+               pspell_config_replace(config, "jargon", (*jargon)->value.str.val);
+       }
+
+       if(argc > 3){
+               convert_to_string_ex(encoding) ;
+               pspell_config_replace(config, "encoding", (*encoding)->value.str.val);
+       }
+
+       ret = new_pspell_manager(config);
+       delete_pspell_config(config);
+
+       if(pspell_error_number(ret) != 0){
+               php_error(E_WARNING, "PSPELL couldn't open the dictionary. reason: %s ", pspell_error_message(ret));
+               RETURN_FALSE;
+       }
+       
+       manager = to_pspell_manager(ret);
+       config = pspell_manager_config(manager);
+       ind = zend_list_insert(manager, le_pspell);
+       RETURN_LONG(ind);
+}
+/* }}} */
+
+
+/* {{{ proto int pspell_mode(string mode)
+   Change the mode between 'fast', 'normal' and 'bad-spellers' */
+PHP_FUNCTION(pspell_mode)
+{
+       int type;
+       pval **scin, **pmode;
+       int argc;
+       long mode = 0L;
+       PspellManager *manager;
+       PspellConfig *config;
+
+       argc = ZEND_NUM_ARGS();
+       if (argc != 2 || zend_get_parameters_ex(argc, &scin, &pmode) == FAILURE) {
+               WRONG_PARAM_COUNT;
+       }
+
+       convert_to_long_ex(scin);
+       convert_to_long_ex(pmode);
+       mode = Z_LVAL_PP(pmode);
+       manager = (PspellManager *) zend_list_find((*scin)->value.lval, &type);
+       if(!manager){
+               php_error(E_WARNING, "%d is not an PSPELL result index",(*scin)->value.lval);
+               RETURN_FALSE;
+       }
+       config = pspell_manager_config(manager);
+
+       if(mode == PS_FAST){
+               pspell_config_replace(config, "sug-mode", "fast");
+       }else if(mode == PS_NORMAL){
+               pspell_config_replace(config, "sug-mode", "normal");
+       }else if(mode == PS_BAD_SPELLERS){
+               pspell_config_replace(config, "sug-mode", "bad-spellers");
+       }else{
+               RETURN_FALSE;
+       }
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto int pspell_runtogether(string mode)
+   Change the mode between whether we want to treat run-together words as valid */
+PHP_FUNCTION(pspell_runtogether)
+{
+       int type;
+       pval **scin, **pruntogether;
+       int argc;
+       int runtogether;
+       PspellManager *manager;
+       PspellConfig *config;
+
+       argc = ZEND_NUM_ARGS();
+       if (argc != 2 || zend_get_parameters_ex(argc, &scin, &pruntogether) == FAILURE) {
+               WRONG_PARAM_COUNT;
+       }
+
+       convert_to_long_ex(scin);
+       convert_to_boolean_ex(pruntogether);
+       runtogether = (*pruntogether)->value.lval;
+       manager = (PspellManager *) zend_list_find((*scin)->value.lval, &type);
+       if(!manager){
+               php_error(E_WARNING, "%d is not an PSPELL result index",(*scin)->value.lval);
+               RETURN_FALSE;
+       }
+       config = pspell_manager_config(manager);
+
+       if(runtogether){
+               pspell_config_replace(config, "run-together", "true");
+       }else{
+               pspell_config_replace(config, "run-together", "false");
+       }
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto int pspell_check(aspell int, string word)
+   Return if word is valid */
+PHP_FUNCTION(pspell_check){
+       int type;
+       pval **scin,**word;
+       PspellManager *manager;
+
+       int argc;
+       argc = ZEND_NUM_ARGS();
+       if (argc != 2 || zend_get_parameters_ex(argc, &scin,&word) == FAILURE) {
+               WRONG_PARAM_COUNT;
+       }
+    
+       convert_to_long_ex(scin);
+       convert_to_string_ex(word);
+       manager = (PspellManager *) zend_list_find((*scin)->value.lval, &type);
+       if(!manager){
+               php_error(E_WARNING, "%d is not an PSPELL result index",(*scin)->value.lval);
+               RETURN_FALSE;
+       }
+
+       if(pspell_manager_check(manager, (*word)->value.str.val)){
+               RETURN_TRUE;
+       }else{
+               RETURN_FALSE;
+       }
+}
+/* }}} */
+
+/* {{{ proto array pspell_suggest(aspell int, string word)
+   Return array of Suggestions */
+PHP_FUNCTION(pspell_suggest)
+{
+       pval **scin, **word;
+       int argc;
+       PspellManager *manager;
+       int type;
+       const PspellWordList *wl;
+       const char *sug;
+
+       argc = ZEND_NUM_ARGS();
+       if(argc != 2 || zend_get_parameters_ex(argc, &scin,&word) == FAILURE) {
+               WRONG_PARAM_COUNT;
+       }
+    
+       convert_to_long_ex(scin);
+       convert_to_string_ex(word);
+       manager = (PspellManager *) zend_list_find((*scin)->value.lval, &type);
+       if(!manager){
+               php_error(E_WARNING, "%d is not an PSPELL result index",(*scin)->value.lval);
+       RETURN_FALSE;
+       }
+
+       if (array_init(return_value) == FAILURE){
+               RETURN_FALSE;
+       }
+
+       wl = pspell_manager_suggest(manager, (*word)->value.str.val);
+       if(wl){
+               PspellStringEmulation *els = pspell_word_list_elements(wl);
+               while((sug = pspell_string_emulation_next(els)) != 0){
+                       add_next_index_string(return_value,(char *)sug,1);
+               }
+               delete_pspell_string_emulation(els);
+       }else{
+               php_error(E_WARNING, "PSPELL had a problem. details: %s ", pspell_manager_error_message(manager));
+               RETURN_FALSE;
+       }
+}
+/* }}} */
+
+PHP_MINFO_FUNCTION(pspell)
+{
+       php_info_print_table_start();
+       php_info_print_table_row(2, "PSpell Support", "enabled");
+       php_info_print_table_end();
+}
+
+#endif