| <?php |
| /** |
| * GeSHi example script |
| * |
| * Just point your browser at this script (with geshi.php in the parent directory, |
| * and the language files in subdirectory "../geshi/") |
| * |
| * @author Nigel McNie |
| * @version $Id: langcheck.php 1971 2008-12-25 15:14:14Z benbe $ |
| */ |
| header('Content-Type: text/html; charset=utf-8'); |
| |
| set_time_limit(0); |
| error_reporting(E_ALL); |
| $time_start = explode(' ', microtime()); |
| |
| define ('TYPE_NOTICE', 0); |
| define ('TYPE_WARNING', 1); |
| define ('TYPE_ERROR', 2); |
| |
| $error_abort = false; |
| $error_cache = array(); |
| function output_error_cache(){ |
| global $error_cache, $error_abort; |
| |
| if(count($error_cache)) { |
| echo "<span style=\"color: #F00; font-weight: bold;\">Failed</span><br />"; |
| echo "<ol>\n"; |
| foreach($error_cache as $error_msg) { |
| echo "<li>"; |
| switch($error_msg['t']) { |
| case TYPE_NOTICE: |
| echo "<span style=\"color: #080; font-weight: bold;\">NOTICE:</span>"; |
| break; |
| case TYPE_WARNING: |
| echo "<span style=\"color: #CC0; font-weight: bold;\">WARNING:</span>"; |
| break; |
| case TYPE_ERROR: |
| echo "<span style=\"color: #F00; font-weight: bold;\">ERROR:</span>"; |
| break; |
| } |
| echo " " . $error_msg['m'] . "</li>"; |
| } |
| echo "</ol>\n"; |
| } else { |
| echo "<span style=\"color: #080; font-weight: bold;\">OK</span><br />"; |
| } |
| echo "\n"; |
| |
| $error_cache = array(); |
| } |
| |
| function report_error($type, $message) { |
| global $error_cache, $error_abort; |
| |
| $error_cache[] = array('t' => $type, 'm' => $message); |
| if(TYPE_ERROR == $type) { |
| $error_abort = true; |
| } |
| } |
| |
| ?> |
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" |
| "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
| <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> |
| <head> |
| <title>GeSHi Language File Validation Script</title> |
| <style type="text/css"> |
| <!-- |
| html { |
| background-color: #f0f0f0; |
| } |
| body { |
| font-family: Verdana, Arial, sans-serif; |
| margin: 10px; |
| border: 2px solid #e0e0e0; |
| background-color: #fcfcfc; |
| padding: 5px; |
| font-size: 10pt; |
| } |
| h2 { |
| margin: .1em 0 .2em .5em; |
| border-bottom: 1px solid #b0b0b0; |
| color: #b0b0b0; |
| font-weight: normal; |
| font-size: 150%; |
| } |
| h3 { |
| margin: .1em 0 .2em .5em; |
| color: #b0b0b0; |
| font-weight: normal; |
| font-size: 120%; |
| } |
| #footer { |
| text-align: center; |
| font-size: 80%; |
| color: #a9a9a9; |
| } |
| #footer a { |
| color: #9999ff; |
| } |
| textarea { |
| border: 1px solid #b0b0b0; |
| font-size: 90%; |
| color: #333; |
| margin-left: 20px; |
| } |
| select, input { |
| margin-left: 20px; |
| } |
| p { |
| font-size: 90%; |
| margin-left: .5em; |
| } |
| --> |
| </style> |
| </head> |
| <body> |
| <h2>GeSHi Language File Validation Script</h2> |
| <p>To use this script, make sure that <strong>geshi.php</strong> is in the |
| parent directory or in your include_path, and that the language files are in a |
| subdirectory of GeSHi's directory called <strong>geshi/</strong>.</p> |
| <p>Everything else will be done by this script automatically. After the script |
| finished you should see messages of what could cause trouble with GeSHi or where |
| your language files can be improved. Please be patient, as this might take some time.</p> |
| |
| <ol> |
| <li>Checking where to find GeSHi installation ... <?php |
| // Rudimentary checking of where GeSHi is. In a default install it will be in ../, but |
| // it could be in the current directory if the include_path is set. There's nowhere else |
| // we can reasonably guess. |
| if (is_readable('../geshi.php')) { |
| $path = '../'; |
| } elseif (is_readable('geshi.php')) { |
| $path = './'; |
| } else { |
| report_error(TYPE_ERROR, 'Could not find geshi.php - make sure it is in your include path!'); |
| } |
| |
| if(!$error_abort) { |
| require $path . 'geshi.php'; |
| |
| if(!class_exists('GeSHi')) { |
| report_error(TYPE_ERROR, 'The GeSHi class was not found, although it seemed we loaded the correct file!'); |
| } |
| } |
| |
| if(!$error_abort) { |
| if(!defined('GESHI_LANG_ROOT')) { |
| report_error(TYPE_ERROR, 'There\'s no information present on where to find the language files!'); |
| } else if(!is_dir(GESHI_LANG_ROOT)) { |
| report_error(TYPE_ERROR, 'The path "'.GESHI_LANG_ROOT.'" given, does not ressemble a directory!'); |
| } else if(!is_readable(GESHI_LANG_ROOT)) { |
| report_error(TYPE_ERROR, 'The path "'.GESHI_LANG_ROOT.'" is not readable to this script!'); |
| } |
| } |
| |
| output_error_cache(); |
| |
| if(!$error_abort) { |
| echo "</li>\n<li>Listing available language files ... "; |
| |
| if (!($dir = @opendir(GESHI_LANG_ROOT))) { |
| report_error(TYPE_ERROR, 'Error requesting listing for available language files!'); |
| } |
| |
| $languages = array(); |
| |
| if(!$error_abort) { |
| while ($file = readdir($dir)) { |
| if (!$file || $file[0] == '.' || strpos($file, '.') === false) { |
| continue; |
| } |
| $lang = substr($file, 0, strpos($file, '.')); |
| $languages[] = $lang; |
| } |
| closedir($dir); |
| } |
| |
| $languages = array_unique($languages); |
| sort($languages); |
| |
| if(!count($languages)) { |
| report_error(TYPE_WARNING, 'Unable to locate any usable language files in "'.GESHI_LANG_ROOT.'"!'); |
| } |
| |
| output_error_cache(); |
| } |
| |
| if (isset($_REQUEST['show']) && in_array($_REQUEST['show'], $languages)) { |
| $languages = array($_REQUEST['show']); |
| } |
| |
| if(!$error_abort) { |
| foreach ($languages as $lang) { |
| echo "</li>\n<li>Validating language file for '$lang' ... "; |
| |
| $langfile = GESHI_LANG_ROOT . $lang . '.php'; |
| |
| unset($language_data); |
| |
| if(!is_file($langfile)) { |
| report_error(TYPE_ERROR, 'The path "' .$langfile. '" does not ressemble a regular file!'); |
| } else if(!is_readable($langfile)) { |
| report_error(TYPE_ERROR, 'Cannot read file "' .$langfile. '"!'); |
| } else { |
| $langfile_content = file_get_contents($langfile); |
| if(preg_match("/\?>(?:\r?\n|\r(?!\n)){2,}\Z/", $langfile_content)) { |
| report_error(TYPE_ERROR, 'Language file contains trailing empty lines at EOF!'); |
| } |
| if(!preg_match("/\?>(?:\r?\n|\r(?!\n))?\Z/", $langfile_content)) { |
| report_error(TYPE_ERROR, 'Language file contains no PHP end marker at EOF!'); |
| } |
| if(preg_match("/\t/", $langfile_content)) { |
| report_error(TYPE_NOTICE, 'Language file contains unescaped tabulator chars (probably for indentation)!'); |
| } |
| if(preg_match('/^(?: )*(?! )(?! \*) /m', $langfile_content)) { |
| report_error(TYPE_NOTICE, 'Language file contains irregular indentation (other than 4 spaces per indentation level)!'); |
| } |
| |
| if(!preg_match("/\/\*\*((?!\*\/).)*?Author:((?!\*\/).)*?\*\//s", $langfile_content)) { |
| report_error(TYPE_WARNING, 'Language file does not contain a specification of an author!'); |
| } |
| if(!preg_match("/\/\*\*((?!\*\/).)*?Copyright:((?!\*\/).)*?\*\//s", $langfile_content)) { |
| report_error(TYPE_WARNING, 'Language file does not contain a specification of the copyright!'); |
| } |
| if(!preg_match("/\/\*\*((?!\*\/).)*?Release Version:((?!\*\/).)*?\*\//s", $langfile_content)) { |
| report_error(TYPE_WARNING, 'Language file does not contain a specification of the release version!'); |
| } |
| if(!preg_match("/\/\*\*((?!\*\/).)*?Date Started:((?!\*\/).)*?\*\//s", $langfile_content)) { |
| report_error(TYPE_WARNING, 'Language file does not contain a specification of the date it was started!'); |
| } |
| if(!preg_match("/\/\*\*((?!\*\/).)*?This file is part of GeSHi\.((?!\*\/).)*?\*\//s", $langfile_content)) { |
| report_error(TYPE_WARNING, 'Language file does not state that it belongs to GeSHi!'); |
| } |
| if(!preg_match("/\/\*\*((?!\*\/).)*?language file for GeSHi\.((?!\*\/).)*?\*\//s", $langfile_content)) { |
| report_error(TYPE_WARNING, 'Language file does not state that it is a language file for GeSHi!'); |
| } |
| if(!preg_match("/\/\*\*((?!\*\/).)*?GNU General Public License((?!\*\/).)*?\*\//s", $langfile_content)) { |
| report_error(TYPE_WARNING, 'Language file does not state that it is provided under the terms of the GNU GPL!'); |
| } |
| |
| unset($langfile_content); |
| |
| include $langfile; |
| |
| if(!isset($language_data)) { |
| report_error(TYPE_ERROR, 'Language file does not contain a $language_data structure to check!'); |
| } else if (!is_array($language_data)) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data structure which is not an array!'); |
| } |
| } |
| |
| if(!$error_abort) { |
| if(!isset($language_data['LANG_NAME'])) { |
| report_error(TYPE_ERROR, 'Language file contains no $language_data[\'LANG_NAME\'] specification!'); |
| } else if (!is_string($language_data['LANG_NAME'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'LANG_NAME\'] specification which is not a string!'); |
| } |
| |
| if(!isset($language_data['COMMENT_SINGLE'])) { |
| report_error(TYPE_ERROR, 'Language file contains no $language_data[\'COMMENT_SIGNLE\'] structure to check!'); |
| } else if (!is_array($language_data['COMMENT_SINGLE'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'COMMENT_SINGLE\'] structure which is not an array!'); |
| } |
| |
| if(!isset($language_data['COMMENT_MULTI'])) { |
| report_error(TYPE_ERROR, 'Language file contains no $language_data[\'COMMENT_MULTI\'] structure to check!'); |
| } else if (!is_array($language_data['COMMENT_MULTI'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'COMMENT_MULTI\'] structure which is not an array!'); |
| } |
| |
| if(isset($language_data['COMMENT_REGEXP'])) { |
| if (!is_array($language_data['COMMENT_REGEXP'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'COMMENT_REGEXP\'] structure which is not an array!'); |
| } |
| } |
| |
| if(!isset($language_data['QUOTEMARKS'])) { |
| report_error(TYPE_ERROR, 'Language file contains no $language_data[\'QUOTEMARKS\'] structure to check!'); |
| } else if (!is_array($language_data['QUOTEMARKS'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'QUOTEMARKS\'] structure which is not an array!'); |
| } |
| |
| if(isset($language_data['HARDQUOTE'])) { |
| if (!is_array($language_data['HARDQUOTE'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'HARDQUOTE\'] structure which is not an array!'); |
| } |
| } |
| |
| if(!isset($language_data['ESCAPE_CHAR'])) { |
| report_error(TYPE_ERROR, 'Language file contains no $language_data[\'ESCAPE_CHAR\'] specification to check!'); |
| } else if (!is_string($language_data['ESCAPE_CHAR'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'ESCAPE_CHAR\'] specification which is not a string!'); |
| } else if (1 < strlen($language_data['ESCAPE_CHAR'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'ESCAPE_CHAR\'] specification is not empty or exactly one char!'); |
| } |
| |
| if(!isset($language_data['CASE_KEYWORDS'])) { |
| report_error(TYPE_ERROR, 'Language file contains no $language_data[\'CASE_KEYWORDS\'] specification!'); |
| } else if (!is_int($language_data['CASE_KEYWORDS'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'CASE_KEYWORDS\'] specification which is not an integer!'); |
| } else if (GESHI_CAPS_NO_CHANGE != $language_data['CASE_KEYWORDS'] && |
| GESHI_CAPS_LOWER != $language_data['CASE_KEYWORDS'] && |
| GESHI_CAPS_UPPER != $language_data['CASE_KEYWORDS']) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'CASE_KEYWORDS\'] specification which is neither of GESHI_CAPS_NO_CHANGE, GESHI_CAPS_LOWER nor GESHI_CAPS_UPPER!'); |
| } |
| |
| if(!isset($language_data['KEYWORDS'])) { |
| report_error(TYPE_ERROR, 'Language file contains no $language_data[\'KEYWORDS\'] structure to check!'); |
| } else if (!is_array($language_data['KEYWORDS'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'KEYWORDS\'] structure which is not an array!'); |
| } else { |
| foreach($language_data['KEYWORDS'] as $kw_key => $kw_value) { |
| if(!is_integer($kw_key)) { |
| report_error(TYPE_WARNING, "Language file contains an key '$kw_key' in \$language_data['KEYWORDS'] that is not integer!"); |
| } else if (!is_array($kw_value)) { |
| report_error(TYPE_ERROR, "Language file contains a \$language_data['CASE_SENSITIVE']['$kw_value'] structure which is not an array!"); |
| } |
| } |
| } |
| |
| if(!isset($language_data['SYMBOLS'])) { |
| report_error(TYPE_ERROR, 'Language file contains no $language_data[\'SYMBOLS\'] structure to check!'); |
| } else if (!is_array($language_data['SYMBOLS'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'SYMBOLS\'] structure which is not an array!'); |
| } |
| |
| if(!isset($language_data['CASE_SENSITIVE'])) { |
| report_error(TYPE_ERROR, 'Language file contains no $language_data[\'CASE_SENSITIVE\'] structure to check!'); |
| } else if (!is_array($language_data['CASE_SENSITIVE'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'CASE_SENSITIVE\'] structure which is not an array!'); |
| } else { |
| foreach($language_data['CASE_SENSITIVE'] as $cs_key => $cs_value) { |
| if(!is_integer($cs_key)) { |
| report_error(TYPE_WARNING, "Language file contains an key '$cs_key' in \$language_data['CASE_SENSITIVE'] that is not integer!"); |
| } else if (!is_bool($cs_value)) { |
| report_error(TYPE_ERROR, "Language file contains a Case Sensitivity specification for \$language_data['CASE_SENSITIVE']['$cs_value'] which is not a boolean!"); |
| } |
| } |
| } |
| |
| if(!isset($language_data['URLS'])) { |
| report_error(TYPE_ERROR, 'Language file contains no $language_data[\'URLS\'] structure to check!'); |
| } else if (!is_array($language_data['URLS'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'URLS\'] structure which is not an array!'); |
| } else { |
| foreach($language_data['URLS'] as $url_key => $url_value) { |
| if(!is_integer($url_key)) { |
| report_error(TYPE_WARNING, "Language file contains an key '$url_key' in \$language_data['URLS'] that is not integer!"); |
| } else if (!is_string($url_value)) { |
| report_error(TYPE_ERROR, "Language file contains a Documentation URL specification for \$language_data['URLS']['$url_value'] which is not a string!"); |
| } else if (preg_match('#&([^;]*(=|$))#U', $url_value)) { |
| report_error(TYPE_ERROR, "Language file contains unescaped ampersands (&) in \$language_data['URLS']!"); |
| } |
| } |
| } |
| |
| if(!isset($language_data['OOLANG'])) { |
| report_error(TYPE_ERROR, 'Language file contains no $language_data[\'OOLANG\'] specification!'); |
| } else if (!is_int($language_data['OOLANG']) && !is_bool($language_data['OOLANG'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'OOLANG\'] specification which is neither boolean nor integer!'); |
| } else if (false !== $language_data['OOLANG'] && |
| true !== $language_data['OOLANG'] && |
| 2 !== $language_data['OOLANG']) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'OOLANG\'] specification which is neither of false, true or 2!'); |
| } |
| |
| if(!isset($language_data['OBJECT_SPLITTERS'])) { |
| report_error(TYPE_ERROR, 'Language file contains no $language_data[\'OBJECT_SPLITTERS\'] structure to check!'); |
| } else if (!is_array($language_data['OBJECT_SPLITTERS'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'OBJECT_SPLITTERS\'] structure which is not an array!'); |
| } |
| |
| if(!isset($language_data['REGEXPS'])) { |
| report_error(TYPE_ERROR, 'Language file contains no $language_data[\'REGEXPS\'] structure to check!'); |
| } else if (!is_array($language_data['REGEXPS'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'REGEXPS\'] structure which is not an array!'); |
| } |
| |
| if(!isset($language_data['STRICT_MODE_APPLIES'])) { |
| report_error(TYPE_ERROR, 'Language file contains no $language_data[\'STRICT_MODE_APPLIES\'] specification!'); |
| } else if (!is_int($language_data['STRICT_MODE_APPLIES'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'STRICT_MODE_APPLIES\'] specification which is not an integer!'); |
| } else if (GESHI_MAYBE != $language_data['STRICT_MODE_APPLIES'] && |
| GESHI_ALWAYS != $language_data['STRICT_MODE_APPLIES'] && |
| GESHI_NEVER != $language_data['STRICT_MODE_APPLIES']) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'STRICT_MODE_APPLIES\'] specification which is neither of GESHI_MAYBE, GESHI_ALWAYS nor GESHI_NEVER!'); |
| } |
| |
| if(!isset($language_data['SCRIPT_DELIMITERS'])) { |
| report_error(TYPE_ERROR, 'Language file contains no $language_data[\'SCRIPT_DELIMITERS\'] structure to check!'); |
| } else if (!is_array($language_data['SCRIPT_DELIMITERS'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'SCRIPT_DELIMITERS\'] structure which is not an array!'); |
| } |
| |
| if(!isset($language_data['HIGHLIGHT_STRICT_BLOCK'])) { |
| report_error(TYPE_ERROR, 'Language file contains no $language_data[\'HIGHLIGHT_STRICT_BLOCK\'] structure to check!'); |
| } else if (!is_array($language_data['HIGHLIGHT_STRICT_BLOCK'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'HIGHLIGHT_STRICT_BLOCK\'] structure which is not an array!'); |
| } |
| |
| if(isset($language_data['TAB_WIDTH'])) { |
| if (!is_int($language_data['TAB_WIDTH'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'TAB_WIDTH\'] specification which is not an integer!'); |
| } else if (1 > $language_data['TAB_WIDTH']) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'TAB_WIDTH\'] specification which is less than 1!'); |
| } |
| } |
| |
| if(isset($language_data['PARSER_CONTROL'])) { |
| if (!is_array($language_data['PARSER_CONTROL'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'PARSER_CONTROL\'] structure which is not an array!'); |
| } |
| } |
| |
| if(!isset($language_data['STYLES'])) { |
| report_error(TYPE_ERROR, 'Language file contains no $language_data[\'STYLES\'] structure to check!'); |
| } else if (!is_array($language_data['STYLES'])) { |
| report_error(TYPE_ERROR, 'Language file contains a $language_data[\'STYLES\'] structure which is not an array!'); |
| } else { |
| $style_arrays = array('KEYWORDS', 'COMMENTS', 'ESCAPE_CHAR', |
| 'BRACKETS', 'STRINGS', 'NUMBERS', 'METHODS', 'SYMBOLS', |
| 'REGEXPS', 'SCRIPT'); |
| foreach($style_arrays as $style_kind) { |
| if(!isset($language_data['STYLES'][$style_kind])) { |
| report_error(TYPE_ERROR, "Language file contains no \$language_data['STYLES']['$style_kind'] structure to check!"); |
| } else if (!is_array($language_data['STYLES'][$style_kind])) { |
| report_error(TYPE_ERROR, "Language file contains a \$language_data['STYLES\']['$style_kind'] structure which is not an array!"); |
| } else { |
| foreach($language_data['STYLES'][$style_kind] as $sk_key => $sk_value) { |
| if(!is_int($sk_key) && ('COMMENTS' != $style_kind && 'MULTI' != $sk_key) |
| && !(('STRINGS' == $style_kind || 'ESCAPE_CHAR' == $style_kind) && 'HARD' == $sk_key)) { |
| report_error(TYPE_WARNING, "Language file contains an key '$sk_key' in \$language_data['STYLES']['$style_kind'] that is not integer!"); |
| } else if (!is_string($sk_value)) { |
| report_error(TYPE_WARNING, "Language file contains a CSS specification for \$language_data['STYLES']['$style_kind'][$key] which is not a string!"); |
| } |
| } |
| } |
| } |
| |
| unset($style_arrays); |
| } |
| } |
| |
| if(!$error_abort) { |
| //Initial sanity checks survived? --> Let's dig deeper! |
| foreach($language_data['KEYWORDS'] as $key => $keywords) { |
| if(!isset($language_data['CASE_SENSITIVE'][$key])) { |
| report_error(TYPE_ERROR, "Language file contains no \$language_data['CASE_SENSITIVE'] specification for keyword group $key!"); |
| } |
| if(!isset($language_data['URLS'][$key])) { |
| report_error(TYPE_ERROR, "Language file contains no \$language_data['URLS'] specification for keyword group $key!"); |
| } |
| if(empty($keywords)) { |
| report_error(TYPE_WARNING, "Language file contains an empty keyword list in \$language_data['KEYWORDS'] for group $key!"); |
| } |
| foreach($keywords as $id => $kw) { |
| if(!is_string($kw)) { |
| report_error(TYPE_WARNING, "Language file contains an non-string entry at \$language_data['KEYWORDS'][$key][$id]!"); |
| } else if (!strlen($kw)) { |
| report_error(TYPE_ERROR, "Language file contains an empty string entry at \$language_data['KEYWORDS'][$key][$id]!"); |
| } else if (preg_match('/^([\(\)\{\}\[\]\^=.,:;\-+\*\/%\$\"\'\?]|&[\w#]\w*;)+$/i', $kw)) { |
| report_error(TYPE_NOTICE, "Language file contains an keyword ('$kw') at \$language_data['KEYWORDS'][$key][$id] which seems to be better suited for the symbols section!"); |
| } |
| } |
| if(count($keywords) != count(array_unique($keywords))) { |
| $kw_diffs = array_count_values($keywords); |
| foreach($kw_diffs as $kw => $kw_count) { |
| if($kw_count > 1) { |
| report_error(TYPE_WARNING, "Language file contains per-group duplicate keyword '$kw' in \$language_data['KEYWORDS'][$key]!"); |
| } |
| } |
| } |
| } |
| |
| $disallowed_before = "(?<![a-zA-Z0-9\$_\|\#;>|^&"; |
| $disallowed_after = "(?![a-zA-Z0-9_\|%\\-&;"; |
| |
| foreach($language_data['KEYWORDS'] as $key => $keywords) { |
| foreach($language_data['KEYWORDS'] as $key2 => $keywords2) { |
| if($key2 <= $key) { |
| continue; |
| } |
| $kw_diffs = array_intersect($keywords, $keywords2); |
| foreach($kw_diffs as $kw) { |
| if(isset($language_data['PARSER_CONTROL']['KEYWORDS'])) { |
| //Check the precondition\post-cindition for the involved keyword groups |
| $g1_pre = $disallowed_before; |
| $g2_pre = $disallowed_before; |
| $g1_post = $disallowed_after; |
| $g2_post = $disallowed_after; |
| if(isset($language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_BEFORE'])) { |
| $g1_pre = $language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_BEFORE']; |
| $g2_pre = $language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_BEFORE']; |
| } |
| if(isset($language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_AFTER'])) { |
| $g1_post = $language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_AFTER']; |
| $g2_post = $language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_AFTER']; |
| } |
| |
| if(isset($language_data['PARSER_CONTROL']['KEYWORDS'][$key]['DISALLOWED_BEFORE'])) { |
| $g1_pre = $language_data['PARSER_CONTROL']['KEYWORDS'][$key]['DISALLOWED_BEFORE']; |
| } |
| if(isset($language_data['PARSER_CONTROL']['KEYWORDS'][$key]['DISALLOWED_AFTER'])) { |
| $g1_post = $language_data['PARSER_CONTROL']['KEYWORDS'][$key]['DISALLOWED_AFTER']; |
| } |
| |
| if(isset($language_data['PARSER_CONTROL']['KEYWORDS'][$key2]['DISALLOWED_BEFORE'])) { |
| $g2_pre = $language_data['PARSER_CONTROL']['KEYWORDS'][$key2]['DISALLOWED_BEFORE']; |
| } |
| if(isset($language_data['PARSER_CONTROL']['KEYWORDS'][$key2]['DISALLOWED_AFTER'])) { |
| $g2_post = $language_data['PARSER_CONTROL']['KEYWORDS'][$key2]['DISALLOWED_AFTER']; |
| } |
| |
| if($g1_pre != $g2_pre || $g1_post != $g2_post) { |
| continue; |
| } |
| } |
| report_error(TYPE_WARNING, "Language file contains cross-group duplicate keyword '$kw' in \$language_data['KEYWORDS'][$key] and \$language_data['KEYWORDS'][$key2]!"); |
| } |
| } |
| } |
| foreach($language_data['CASE_SENSITIVE'] as $key => $keywords) { |
| if(!isset($language_data['KEYWORDS'][$key]) && $key != GESHI_COMMENTS) { |
| report_error(TYPE_WARNING, "Language file contains an superfluous \$language_data['CASE_SENSITIVE'] specification for non-existing keyword group $key!"); |
| } |
| } |
| foreach($language_data['URLS'] as $key => $keywords) { |
| if(!isset($language_data['KEYWORDS'][$key])) { |
| report_error(TYPE_WARNING, "Language file contains an superfluous \$language_data['URLS'] specification for non-existing keyword group $key!"); |
| } |
| } |
| foreach($language_data['STYLES']['KEYWORDS'] as $key => $keywords) { |
| if(!isset($language_data['KEYWORDS'][$key])) { |
| report_error(TYPE_WARNING, "Language file contains an superfluous \$language_data['STYLES']['KEYWORDS'] specification for non-existing keyword group $key!"); |
| } |
| } |
| |
| foreach($language_data['COMMENT_SINGLE'] as $ck => $cv) { |
| if(!is_int($ck)) { |
| report_error(TYPE_WARNING, "Language file contains an key '$ck' in \$language_data['COMMENT_SINGLE'] that is not integer!"); |
| } |
| if(!is_string($cv)) { |
| report_error(TYPE_WARNING, "Language file contains an non-string entry at \$language_data['COMMENT_SINGLE'][$ck]!"); |
| } |
| if(!isset($language_data['STYLES']['COMMENTS'][$ck])) { |
| report_error(TYPE_WARNING, "Language file contains no \$language_data['STYLES']['COMMENTS'] specification for comment group $ck!"); |
| } |
| } |
| if(isset($language_data['COMMENT_REGEXP'])) { |
| foreach($language_data['COMMENT_REGEXP'] as $ck => $cv) { |
| if(!is_int($ck)) { |
| report_error(TYPE_WARNING, "Language file contains an key '$ck' in \$language_data['COMMENT_REGEXP'] that is not integer!"); |
| } |
| if(!is_string($cv)) { |
| report_error(TYPE_WARNING, "Language file contains an non-string entry at \$language_data['COMMENT_REGEXP'][$ck]!"); |
| } |
| if(!isset($language_data['STYLES']['COMMENTS'][$ck])) { |
| report_error(TYPE_WARNING, "Language file contains no \$language_data['STYLES']['COMMENTS'] specification for comment group $ck!"); |
| } |
| } |
| } |
| foreach($language_data['STYLES']['COMMENTS'] as $ck => $cv) { |
| if($ck != 'MULTI' && !isset($language_data['COMMENT_SINGLE'][$ck]) && |
| !isset($language_data['COMMENT_REGEXP'][$ck])) { |
| report_error(TYPE_NOTICE, "Language file contains an superfluous \$language_data['STYLES']['COMMENTS'] specification for Single Line or Regular-Expression Comment key $ck!"); |
| } |
| } |
| if (isset($language_data['STYLES']['STRINGS']['HARD'])) { |
| if (empty($language_data['HARDQUOTE'])) { |
| report_error(TYPE_NOTICE, "Language file contains superfluous \$language_data['STYLES']['STRINGS'] specification for key 'HARD', but no 'HARDQUOTE's are defined!"); |
| } |
| unset($language_data['STYLES']['STRINGS']['HARD']); |
| } |
| foreach($language_data['STYLES']['STRINGS'] as $sk => $sv) { |
| if($sk && !isset($language_data['QUOTEMARKS'][$sk])) { |
| report_error(TYPE_NOTICE, "Language file contains an superfluous \$language_data['STYLES']['STRINGS'] specification for non-existing quotemark key $sk!"); |
| } |
| } |
| |
| foreach($language_data['REGEXPS'] as $rk => $rv) { |
| if(!is_int($rk)) { |
| report_error(TYPE_WARNING, "Language file contains an key '$rk' in \$language_data['REGEXPS'] that is not integer!"); |
| } |
| if(is_string($rv)) { |
| //Check for unmasked / in regular expressions ... |
| if(empty($rv)) { |
| report_error(TYPE_WARNING, "Language file contains an empty regular expression at \$language_data['REGEXPS'][$rk]!"); |
| } else { |
| if(preg_match("/(?<!\\\\)\//s", $rv)) { |
| report_error(TYPE_WARNING, "Language file contains a regular expression with an unmasked / character at \$language_data['REGEXPS'][$rk]!"); |
| } elseif (preg_match("/(?<!<)(\\\\\\\\)*\\\\\|(?!>)/s", $rv)) { |
| report_error(TYPE_WARNING, "Language file contains a regular expression with an unescaped match for a pipe character '|' which needs escaping as '<PIPE>' instead at \$language_data['REGEXPS'][$rk]!"); |
| } |
| } |
| } elseif(is_array($rv)) { |
| if(!isset($rv[GESHI_SEARCH])) { |
| report_error(TYPE_ERROR, "Language file contains no GESHI_SEARCH entry in extended regular expression at \$language_data['REGEXPS'][$rk]!"); |
| } elseif(!is_string($rv[GESHI_SEARCH])) { |
| report_error(TYPE_ERROR, "Language file contains a GESHI_SEARCH entry in extended regular expression at \$language_data['REGEXPS'][$rk] which is not a string!"); |
| } else { |
| if(preg_match("/(?<!\\\\)\//s", $rv[GESHI_SEARCH])) { |
| report_error(TYPE_WARNING, "Language file contains a regular expression with an unmasked / character at \$language_data['REGEXPS'][$rk]!"); |
| } elseif (preg_match("/(?<!<)(\\\\\\\\)*\\\\\|(?!>)/s", $rv[GESHI_SEARCH])) { |
| report_error(TYPE_WARNING, "Language file contains a regular expression with an unescaped match for a pipe character '|' which needs escaping as '<PIPE>' instead at \$language_data['REGEXPS'][$rk]!"); |
| } |
| } |
| if(!isset($rv[GESHI_REPLACE])) { |
| report_error(TYPE_WARNING, "Language file contains no GESHI_REPLACE entry in extended regular expression at \$language_data['REGEXPS'][$rk]!"); |
| } elseif(!is_string($rv[GESHI_REPLACE])) { |
| report_error(TYPE_ERROR, "Language file contains a GESHI_REPLACE entry in extended regular expression at \$language_data['REGEXPS'][$rk] which is not a string!"); |
| } |
| if(!isset($rv[GESHI_MODIFIERS])) { |
| report_error(TYPE_WARNING, "Language file contains no GESHI_MODIFIERS entry in extended regular expression at \$language_data['REGEXPS'][$rk]!"); |
| } elseif(!is_string($rv[GESHI_MODIFIERS])) { |
| report_error(TYPE_ERROR, "Language file contains a GESHI_MODIFIERS entry in extended regular expression at \$language_data['REGEXPS'][$rk] which is not a string!"); |
| } |
| if(!isset($rv[GESHI_BEFORE])) { |
| report_error(TYPE_WARNING, "Language file contains no GESHI_BEFORE entry in extended regular expression at \$language_data['REGEXPS'][$rk]!"); |
| } elseif(!is_string($rv[GESHI_BEFORE])) { |
| report_error(TYPE_ERROR, "Language file contains a GESHI_BEFORE entry in extended regular expression at \$language_data['REGEXPS'][$rk] which is not a string!"); |
| } |
| if(!isset($rv[GESHI_AFTER])) { |
| report_error(TYPE_WARNING, "Language file contains no GESHI_AFTER entry in extended regular expression at \$language_data['REGEXPS'][$rk]!"); |
| } elseif(!is_string($rv[GESHI_AFTER])) { |
| report_error(TYPE_ERROR, "Language file contains a GESHI_AFTER entry in extended regular expression at \$language_data['REGEXPS'][$rk] which is not a string!"); |
| } |
| } else { |
| report_error(TYPE_WARNING, "Language file contains an non-string and non-array entry at \$language_data['REGEXPS'][$rk]!"); |
| } |
| if(!isset($language_data['STYLES']['REGEXPS'][$rk])) { |
| report_error(TYPE_WARNING, "Language file contains no \$language_data['STYLES']['REGEXPS'] specification for regexp group $rk!"); |
| } |
| } |
| foreach($language_data['STYLES']['REGEXPS'] as $rk => $rv) { |
| if(!isset($language_data['REGEXPS'][$rk])) { |
| report_error(TYPE_NOTICE, "Language file contains an superfluous \$language_data['STYLES']['REGEXPS'] specification for regexp key $rk!"); |
| } |
| } |
| |
| |
| } |
| |
| output_error_cache(); |
| |
| flush(); |
| |
| if($error_abort) { |
| break; |
| } |
| } |
| } |
| ?></li> |
| </ol> |
| |
| <p>Validation process completed in <? |
| $time_end = explode(' ', microtime()); |
| $time_diff = $time_end[0] + $time_end[1] - $time_start[0] - $time_start[1]; |
| |
| echo sprintf("%.2f", $time_diff); |
| ?> seconds.</p> |
| |
| <div id="footer">GeSHi © 2004-2007 Nigel McNie, 2007-2008 Benny Baumann, released under the GNU GPL</div> |
| </body> |
| </html> |