dave Fri Aug 13 00:59:25 2004 EDT
Added files:
/phpdoc/scripts spell-checker.php
Log:
- Add a custom phpdoc XML spell checker script. Needs the pspell extension
enabled to work.
http://cvs.php.net/co.php/phpdoc/scripts/spell-checker.php?r=1.1&p=1
Index: phpdoc/scripts/spell-checker.php
+++ phpdoc/scripts/spell-checker.php
<?php
/*
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2004 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.0 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_0.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 |
| [EMAIL PROTECTED] so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Dave Barr <[EMAIL PROTECTED]> |
| |
| Description: This file spell checks the manual. You must have the |
| pspell extension installed for it to work. |
| |
| Personal Word List: http://erigol.com/php/custom.pws |
| Put it in your home directory, ~ |
+----------------------------------------------------------------------+
*/
/* path to phpdoc CVS checkout. if this file is in the scripts/ directory
* then the value below will be correct!
*/
$phpdoc = '../';
/* english! */
$lang = 'en';
/* (immediate) tags to check for spelling mistakes */
$check_tags = array( 'para',
'simpara',
'title',
);
$element = '';
$current_file = '';
/* prompt a user and return the response */
function read_line($prompt) {
echo $prompt;
$in = chop(fgets(STDIN, 1024));
return $in;
}
/* recursive glob() with a callback function */
function globbetyglob($globber, $userfunc)
{
foreach (glob("$globber/*") as $file) {
if (is_dir($file)) {
globbetyglob($file, $userfunc);
}
else {
call_user_func($userfunc, $file);
}
}
}
function set_current_element($xml, $name, $attrs)
{
global $element;
$element = strtolower($name);
}
function end_current_element($xml, $name)
{
return;
}
/* spell check a chunk of data */
function check_data($xml, $data)
{
global $element, $dict, $check_tags, $current_file;
if (!in_array($element, $check_tags))
return;
if (trim($data) == '')
return;
$words = preg_split('/\W+/', trim($data));
if (is_array($words)) {
foreach ($words as $word) {
if (trim($word) == '' || is_numeric($word) || preg_match('/[^a-z]/',
$word))
continue;
$word = strtolower($word);
if (!pspell_check($dict, $word)) {
/* known bug: due to trim()ing and whitespace removal, the
* line number shown here might not match the actual line
* number in the file, but it's usually pretty close
*/
echo "$current_file:" . xml_get_current_line_number($xml) . ": $word
(in element $element)\n";
do {
$response = read_line("Add this word to personal wordlist?
(yes/no/save): ");
if ($response{0} == 's') {
pspell_save_wordlist($dict);
echo "Wordlist saved.\n";
}
} while ($response{0} != 'y' && $response{0} != 'n');
if ($response{0} == 'y') {
pspell_add_to_personal($dict, $word);
echo "Added '$word' to personal wordlist.\n";
}
}
}
}
return;
}
function check_file($filename)
{
global $phpdoc, $lang, $current_file;
if (!fnmatch('*.xml', $filename) || fnmatch("$phpdoc$lang/functions/*", $filename))
return;
echo "checking $filename...\n";
$current_file = $filename;
$file = file_get_contents($filename);
if (!$file)
return;
$file = preg_replace('/&(.*?);/', '', $file);
if (trim($file) == '')
return;
$xml = xml_parser_create();
xml_set_element_handler($xml, 'set_current_element', 'end_current_element');
xml_set_character_data_handler($xml, 'check_data');
if (!xml_parse($xml, $file, true)) {
printf("%s: XML error: %s at line %d\n",
$filename,
xml_error_string(xml_get_error_code($xml)),
xml_get_current_line_number($xml)
);
}
xml_parser_free($xml);
}
if (!function_exists('pspell_new_personal')) {
echo "You must compile PHP with pspell support for this script to work.\n";
return;
}
$dict = pspell_new_personal('custom.pws', 'en');
globbetyglob("$phpdoc$lang", 'check_file');
pspell_save_wordlist($dict);
echo "Wordlist saved.\n";
?>