diff options
author | Vlad Krupin <vlad@php.net> | 2000-07-10 21:29:19 +0000 |
---|---|---|
committer | Vlad Krupin <vlad@php.net> | 2000-07-10 21:29:19 +0000 |
commit | a58ca45b2e8ef555d6028481bf2b188164a641f9 (patch) | |
tree | e4c4e23645b196423d3f1ccfdc10f526f6bcc0e0 /ext/pspell | |
parent | 96675e9d5839398e94e7bfd0ea461f17f2841e91 (diff) | |
download | php-git-a58ca45b2e8ef555d6028481bf2b188164a641f9.tar.gz |
Initial release. Includes:
- Functionality of aspell
- 3 modes of spellchecking (fast, normal, bad_spellers)
- support for run-together words
Diffstat (limited to 'ext/pspell')
-rw-r--r-- | ext/pspell/Makefile.in | 5 | ||||
-rw-r--r-- | ext/pspell/README | 35 | ||||
-rw-r--r-- | ext/pspell/config.m4 | 28 | ||||
-rw-r--r-- | ext/pspell/php_pspell.h | 53 | ||||
-rw-r--r-- | ext/pspell/pspell.c | 272 |
5 files changed, 393 insertions, 0 deletions
diff --git a/ext/pspell/Makefile.in b/ext/pspell/Makefile.in new file mode 100644 index 0000000000..5c323c8fde --- /dev/null +++ b/ext/pspell/Makefile.in @@ -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 index 0000000000..97373af4a1 --- /dev/null +++ b/ext/pspell/README @@ -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 index 0000000000..52a962a733 --- /dev/null +++ b/ext/pspell/config.m4 @@ -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 index 0000000000..272272da69 --- /dev/null +++ b/ext/pspell/php_pspell.h @@ -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 index 0000000000..ef5802c62b --- /dev/null +++ b/ext/pspell/pspell.c @@ -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 |