summaryrefslogtreecommitdiff
path: root/ext/pspell
diff options
context:
space:
mode:
authorVlad Krupin <vlad@php.net>2000-07-10 21:29:19 +0000
committerVlad Krupin <vlad@php.net>2000-07-10 21:29:19 +0000
commita58ca45b2e8ef555d6028481bf2b188164a641f9 (patch)
treee4c4e23645b196423d3f1ccfdc10f526f6bcc0e0 /ext/pspell
parent96675e9d5839398e94e7bfd0ea461f17f2841e91 (diff)
downloadphp-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.in5
-rw-r--r--ext/pspell/README35
-rw-r--r--ext/pspell/config.m428
-rw-r--r--ext/pspell/php_pspell.h53
-rw-r--r--ext/pspell/pspell.c272
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