1
0
mirror of https://github.com/php/php-src.git synced 2026-04-26 17:38:14 +02:00

Initial release. Includes:

- Functionality of aspell
- 3 modes of spellchecking (fast, normal, bad_spellers)
- support for run-together words
This commit is contained in:
Vlad Krupin
2000-07-10 21:29:19 +00:00
parent 96675e9d58
commit a58ca45b2e
5 changed files with 393 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
LTLIBRARY_NAME = libpspell.la
LTLIBRARY_SOURCES = pspell.c
include $(top_srcdir)/build/dynlib.mk
+35
View File
@@ -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.
+28
View File
@@ -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)
])
+53
View File
@@ -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 */
+272
View File
@@ -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