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:
@@ -0,0 +1,5 @@
|
||||
|
||||
LTLIBRARY_NAME = libpspell.la
|
||||
LTLIBRARY_SOURCES = pspell.c
|
||||
|
||||
include $(top_srcdir)/build/dynlib.mk
|
||||
@@ -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.
|
||||
@@ -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)
|
||||
])
|
||||
@@ -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 */
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user