diff options
Diffstat (limited to 'program/js/tiny_mce/plugins/spellchecker/classes/utils')
-rwxr-xr-x | program/js/tiny_mce/plugins/spellchecker/classes/utils/JSON.php | 595 | ||||
-rwxr-xr-x | program/js/tiny_mce/plugins/spellchecker/classes/utils/Logger.php | 268 |
2 files changed, 863 insertions, 0 deletions
diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/utils/JSON.php b/program/js/tiny_mce/plugins/spellchecker/classes/utils/JSON.php new file mode 100755 index 000000000..1c4611676 --- /dev/null +++ b/program/js/tiny_mce/plugins/spellchecker/classes/utils/JSON.php @@ -0,0 +1,595 @@ +<?php +/** + * $Id: JSON.php 40 2007-06-18 11:43:15Z spocke $ + * + * @package MCManager.utils + * @author Moxiecode + * @copyright Copyright © 2007, Moxiecode Systems AB, All rights reserved. + */ + +define('JSON_BOOL', 1); +define('JSON_INT', 2); +define('JSON_STR', 3); +define('JSON_FLOAT', 4); +define('JSON_NULL', 5); +define('JSON_START_OBJ', 6); +define('JSON_END_OBJ', 7); +define('JSON_START_ARRAY', 8); +define('JSON_END_ARRAY', 9); +define('JSON_KEY', 10); +define('JSON_SKIP', 11); + +define('JSON_IN_ARRAY', 30); +define('JSON_IN_OBJECT', 40); +define('JSON_IN_BETWEEN', 50); + +class Moxiecode_JSONReader { + var $_data, $_len, $_pos; + var $_value, $_token; + var $_location, $_lastLocations; + var $_needProp; + + function Moxiecode_JSONReader($data) { + $this->_data = $data; + $this->_len = strlen($data); + $this->_pos = -1; + $this->_location = JSON_IN_BETWEEN; + $this->_lastLocations = array(); + $this->_needProp = false; + } + + function getToken() { + return $this->_token; + } + + function getLocation() { + return $this->_location; + } + + function getTokenName() { + switch ($this->_token) { + case JSON_BOOL: + return 'JSON_BOOL'; + + case JSON_INT: + return 'JSON_INT'; + + case JSON_STR: + return 'JSON_STR'; + + case JSON_FLOAT: + return 'JSON_FLOAT'; + + case JSON_NULL: + return 'JSON_NULL'; + + case JSON_START_OBJ: + return 'JSON_START_OBJ'; + + case JSON_END_OBJ: + return 'JSON_END_OBJ'; + + case JSON_START_ARRAY: + return 'JSON_START_ARRAY'; + + case JSON_END_ARRAY: + return 'JSON_END_ARRAY'; + + case JSON_KEY: + return 'JSON_KEY'; + } + + return 'UNKNOWN'; + } + + function getValue() { + return $this->_value; + } + + function readToken() { + $chr = $this->read(); + + if ($chr != null) { + switch ($chr) { + case '[': + $this->_lastLocation[] = $this->_location; + $this->_location = JSON_IN_ARRAY; + $this->_token = JSON_START_ARRAY; + $this->_value = null; + $this->readAway(); + return true; + + case ']': + $this->_location = array_pop($this->_lastLocation); + $this->_token = JSON_END_ARRAY; + $this->_value = null; + $this->readAway(); + + if ($this->_location == JSON_IN_OBJECT) + $this->_needProp = true; + + return true; + + case '{': + $this->_lastLocation[] = $this->_location; + $this->_location = JSON_IN_OBJECT; + $this->_needProp = true; + $this->_token = JSON_START_OBJ; + $this->_value = null; + $this->readAway(); + return true; + + case '}': + $this->_location = array_pop($this->_lastLocation); + $this->_token = JSON_END_OBJ; + $this->_value = null; + $this->readAway(); + + if ($this->_location == JSON_IN_OBJECT) + $this->_needProp = true; + + return true; + + // String + case '"': + case '\'': + return $this->_readString($chr); + + // Null + case 'n': + return $this->_readNull(); + + // Bool + case 't': + case 'f': + return $this->_readBool($chr); + + default: + // Is number + if (is_numeric($chr) || $chr == '-' || $chr == '.') + return $this->_readNumber($chr); + + return true; + } + } + + return false; + } + + function _readBool($chr) { + $this->_token = JSON_BOOL; + $this->_value = $chr == 't'; + + if ($chr == 't') + $this->skip(3); // rue + else + $this->skip(4); // alse + + $this->readAway(); + + if ($this->_location == JSON_IN_OBJECT && !$this->_needProp) + $this->_needProp = true; + + return true; + } + + function _readNull() { + $this->_token = JSON_NULL; + $this->_value = null; + + $this->skip(3); // ull + $this->readAway(); + + if ($this->_location == JSON_IN_OBJECT && !$this->_needProp) + $this->_needProp = true; + + return true; + } + + function _readString($quote) { + $output = ""; + $this->_token = JSON_STR; + $endString = false; + + while (($chr = $this->peek()) != -1) { + switch ($chr) { + case '\\': + // Read away slash + $this->read(); + + // Read escape code + $chr = $this->read(); + switch ($chr) { + case 't': + $output .= "\t"; + break; + + case 'b': + $output .= "\b"; + break; + + case 'f': + $output .= "\f"; + break; + + case 'r': + $output .= "\r"; + break; + + case 'n': + $output .= "\n"; + break; + + case 'u': + $output .= $this->_int2utf8(hexdec($this->read(4))); + break; + + default: + $output .= $chr; + break; + } + + break; + + case '\'': + case '"': + if ($chr == $quote) + $endString = true; + + $chr = $this->read(); + if ($chr != -1 && $chr != $quote) + $output .= $chr; + + break; + + default: + $output .= $this->read(); + } + + // String terminated + if ($endString) + break; + } + + $this->readAway(); + $this->_value = $output; + + // Needed a property + if ($this->_needProp) { + $this->_token = JSON_KEY; + $this->_needProp = false; + return true; + } + + if ($this->_location == JSON_IN_OBJECT && !$this->_needProp) + $this->_needProp = true; + + return true; + } + + function _int2utf8($int) { + $int = intval($int); + + switch ($int) { + case 0: + return chr(0); + + case ($int & 0x7F): + return chr($int); + + case ($int & 0x7FF): + return chr(0xC0 | (($int >> 6) & 0x1F)) . chr(0x80 | ($int & 0x3F)); + + case ($int & 0xFFFF): + return chr(0xE0 | (($int >> 12) & 0x0F)) . chr(0x80 | (($int >> 6) & 0x3F)) . chr (0x80 | ($int & 0x3F)); + + case ($int & 0x1FFFFF): + return chr(0xF0 | ($int >> 18)) . chr(0x80 | (($int >> 12) & 0x3F)) . chr(0x80 | (($int >> 6) & 0x3F)) . chr(0x80 | ($int & 0x3F)); + } + } + + function _readNumber($start) { + $value = ""; + $isFloat = false; + + $this->_token = JSON_INT; + $value .= $start; + + while (($chr = $this->peek()) != -1) { + if (is_numeric($chr) || $chr == '-' || $chr == '.') { + if ($chr == '.') + $isFloat = true; + + $value .= $this->read(); + } else + break; + } + + $this->readAway(); + + if ($isFloat) { + $this->_token = JSON_FLOAT; + $this->_value = floatval($value); + } else + $this->_value = intval($value); + + if ($this->_location == JSON_IN_OBJECT && !$this->_needProp) + $this->_needProp = true; + + return true; + } + + function readAway() { + while (($chr = $this->peek()) != null) { + if ($chr != ':' && $chr != ',' && $chr != ' ') + return; + + $this->read(); + } + } + + function read($len = 1) { + if ($this->_pos < $this->_len) { + if ($len > 1) { + $str = substr($this->_data, $this->_pos + 1, $len); + $this->_pos += $len; + + return $str; + } else + return $this->_data[++$this->_pos]; + } + + return null; + } + + function skip($len) { + $this->_pos += $len; + } + + function peek() { + if ($this->_pos < $this->_len) + return $this->_data[$this->_pos + 1]; + + return null; + } +} + +/** + * This class handles JSON stuff. + * + * @package MCManager.utils + */ +class Moxiecode_JSON { + function Moxiecode_JSON() { + } + + function decode($input) { + $reader = new Moxiecode_JSONReader($input); + + return $this->readValue($reader); + } + + function readValue(&$reader) { + $this->data = array(); + $this->parents = array(); + $this->cur =& $this->data; + $key = null; + $loc = JSON_IN_ARRAY; + + while ($reader->readToken()) { + switch ($reader->getToken()) { + case JSON_STR: + case JSON_INT: + case JSON_BOOL: + case JSON_FLOAT: + case JSON_NULL: + switch ($reader->getLocation()) { + case JSON_IN_OBJECT: + $this->cur[$key] = $reader->getValue(); + break; + + case JSON_IN_ARRAY: + $this->cur[] = $reader->getValue(); + break; + + default: + return $reader->getValue(); + } + break; + + case JSON_KEY: + $key = $reader->getValue(); + break; + + case JSON_START_OBJ: + case JSON_START_ARRAY: + if ($loc == JSON_IN_OBJECT) + $this->addArray($key); + else + $this->addArray(null); + + $cur =& $obj; + + $loc = $reader->getLocation(); + break; + + case JSON_END_OBJ: + case JSON_END_ARRAY: + $loc = $reader->getLocation(); + + if (count($this->parents) > 0) { + $this->cur =& $this->parents[count($this->parents) - 1]; + array_pop($this->parents); + } + break; + } + } + + return $this->data[0]; + } + + // This method was needed since PHP is crapy and doesn't have pointers/references + function addArray($key) { + $this->parents[] =& $this->cur; + $ar = array(); + + if ($key) + $this->cur[$key] =& $ar; + else + $this->cur[] =& $ar; + + $this->cur =& $ar; + } + + function getDelim($index, &$reader) { + switch ($reader->getLocation()) { + case JSON_IN_ARRAY: + case JSON_IN_OBJECT: + if ($index > 0) + return ","; + break; + } + + return ""; + } + + function encode($input) { + switch (gettype($input)) { + case 'boolean': + return $input ? 'true' : 'false'; + + case 'integer': + return (int) $input; + + case 'float': + case 'double': + return (float) $input; + + case 'NULL': + return 'null'; + + case 'string': + return $this->encodeString($input); + + case 'array': + return $this->_encodeArray($input); + + case 'object': + return $this->_encodeArray(get_object_vars($input)); + } + + return ''; + } + + function encodeString($input) { + // Needs to be escaped + if (preg_match('/[^a-zA-Z0-9]/', $input)) { + $output = ''; + + for ($i=0; $i<strlen($input); $i++) { + switch ($input[$i]) { + case "\b": + $output .= "\\b"; + break; + + case "\t": + $output .= "\\t"; + break; + + case "\f": + $output .= "\\f"; + break; + + case "\r": + $output .= "\\r"; + break; + + case "\n": + $output .= "\\n"; + break; + + case '\\': + $output .= "\\\\"; + break; + + case '\'': + $output .= "\\'"; + break; + + case '"': + $output .= '\"'; + break; + + default: + $byte = ord($input[$i]); + + if (($byte & 0xE0) == 0xC0) { + $char = pack('C*', $byte, ord($input[$i + 1])); + $i += 1; + $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char))); + } if (($byte & 0xF0) == 0xE0) { + $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2])); + $i += 2; + $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char))); + } if (($byte & 0xF8) == 0xF0) { + $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2], ord($input[$i + 3]))); + $i += 3; + $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char))); + } if (($byte & 0xFC) == 0xF8) { + $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2], ord($input[$i + 3]), ord($input[$i + 4]))); + $i += 4; + $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char))); + } if (($byte & 0xFE) == 0xFC) { + $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2], ord($input[$i + 3]), ord($input[$i + 4]), ord($input[$i + 5]))); + $i += 5; + $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char))); + } else if ($byte < 128) + $output .= $input[$i]; + } + } + + return '"' . $output . '"'; + } + + return '"' . $input . '"'; + } + + function _utf82utf16($utf8) { + if (function_exists('mb_convert_encoding')) + return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); + + switch (strlen($utf8)) { + case 1: + return $utf8; + + case 2: + return chr(0x07 & (ord($utf8[0]) >> 2)) . chr((0xC0 & (ord($utf8[0]) << 6)) | (0x3F & ord($utf8[1]))); + + case 3: + return chr((0xF0 & (ord($utf8[0]) << 4)) | (0x0F & (ord($utf8[1]) >> 2))) . chr((0xC0 & (ord($utf8[1]) << 6)) | (0x7F & ord($utf8[2]))); + } + + return ''; + } + + function _encodeArray($input) { + $output = ''; + $isIndexed = true; + + $keys = array_keys($input); + for ($i=0; $i<count($keys); $i++) { + if (!is_int($keys[$i])) { + $output .= $this->encodeString($keys[$i]) . ':' . $this->encode($input[$keys[$i]]); + $isIndexed = false; + } else + $output .= $this->encode($input[$keys[$i]]); + + if ($i != count($keys) - 1) + $output .= ','; + } + + return $isIndexed ? '[' . $output . ']' : '{' . $output . '}'; + } +} + +?> diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/utils/Logger.php b/program/js/tiny_mce/plugins/spellchecker/classes/utils/Logger.php new file mode 100755 index 000000000..bc501ea75 --- /dev/null +++ b/program/js/tiny_mce/plugins/spellchecker/classes/utils/Logger.php @@ -0,0 +1,268 @@ +<?php
+/**
+ * $Id: Logger.class.php 10 2007-05-27 10:55:12Z spocke $
+ *
+ * @package MCFileManager.filesystems
+ * @author Moxiecode
+ * @copyright Copyright © 2005, Moxiecode Systems AB, All rights reserved.
+ */
+
+// File type contstants
+define('MC_LOGGER_DEBUG', 0);
+define('MC_LOGGER_INFO', 10);
+define('MC_LOGGER_WARN', 20);
+define('MC_LOGGER_ERROR', 30);
+define('MC_LOGGER_FATAL', 40);
+
+/**
+ * Logging utility class. This class handles basic logging with levels, log rotation and custom log formats. It's
+ * designed to be compact but still powerful and flexible.
+ */
+class Moxiecode_Logger {
+ // Private fields
+ var $_path;
+ var $_filename;
+ var $_maxSize;
+ var $_maxFiles;
+ var $_maxSizeBytes;
+ var $_level;
+ var $_format;
+
+ /**
+ * Constructs a new logger instance.
+ */
+ function Moxiecode_Logger() {
+ $this->_path = "";
+ $this->_filename = "{level}.log";
+ $this->setMaxSize("100k");
+ $this->_maxFiles = 10;
+ $this->_level = MC_LOGGER_DEBUG;
+ $this->_format = "[{time}] [{level}] {message}";
+ }
+
+ /**
+ * Sets the current log level, use the MC_LOGGER constants.
+ *
+ * @param int $level Log level instance for example MC_LOGGER_DEBUG.
+ */
+ function setLevel($level) {
+ if (is_string($level)) {
+ switch (strtolower($level)) {
+ case "debug":
+ $level = MC_LOGGER_DEBUG;
+ break;
+
+ case "info":
+ $level = MC_LOGGER_INFO;
+ break;
+
+ case "warn":
+ case "warning":
+ $level = MC_LOGGER_WARN;
+ break;
+
+ case "error":
+ $level = MC_LOGGER_ERROR;
+ break;
+
+ case "fatal":
+ $level = MC_LOGGER_FATAL;
+ break;
+
+ default:
+ $level = MC_LOGGER_FATAL;
+ }
+ }
+
+ $this->_level = $level;
+ }
+
+ /**
+ * Returns the current log level for example MC_LOGGER_DEBUG.
+ *
+ * @return int Current log level for example MC_LOGGER_DEBUG.
+ */
+ function getLevel() {
+ return $this->_level;
+ }
+
+ function setPath($path) {
+ $this->_path = $path;
+ }
+
+ function getPath() {
+ return $this->_path;
+ }
+
+ function setFileName($file_name) {
+ $this->_filename = $file_name;
+ }
+
+ function getFileName() {
+ return $this->_filename;
+ }
+
+ function setFormat($format) {
+ $this->_format = $format;
+ }
+
+ function getFormat() {
+ return $this->_format;
+ }
+
+ function setMaxSize($size) {
+ // Fix log max size
+ $logMaxSizeBytes = intval(preg_replace("/[^0-9]/", "", $size));
+
+ // Is KB
+ if (strpos((strtolower($size)), "k") > 0)
+ $logMaxSizeBytes *= 1024;
+
+ // Is MB
+ if (strpos((strtolower($size)), "m") > 0)
+ $logMaxSizeBytes *= (1024 * 1024);
+
+ $this->_maxSizeBytes = $logMaxSizeBytes;
+ $this->_maxSize = $size;
+ }
+
+ function getMaxSize() {
+ return $this->_maxSize;
+ }
+
+ function setMaxFiles($max_files) {
+ $this->_maxFiles = $max_files;
+ }
+
+ function getMaxFiles() {
+ return $this->_maxFiles;
+ }
+
+ function debug($msg) {
+ $args = func_get_args();
+ $this->_logMsg(MC_LOGGER_DEBUG, implode(', ', $args));
+ }
+
+ function info($msg) {
+ $args = func_get_args();
+ $this->_logMsg(MC_LOGGER_INFO, implode(', ', $args));
+ }
+
+ function warn($msg) {
+ $args = func_get_args();
+ $this->_logMsg(MC_LOGGER_WARN, implode(', ', $args));
+ }
+
+ function error($msg) {
+ $args = func_get_args();
+ $this->_logMsg(MC_LOGGER_ERROR, implode(', ', $args));
+ }
+
+ function fatal($msg) {
+ $args = func_get_args();
+ $this->_logMsg(MC_LOGGER_FATAL, implode(', ', $args));
+ }
+
+ function isDebugEnabled() {
+ return $this->_level >= MC_LOGGER_DEBUG;
+ }
+
+ function isInfoEnabled() {
+ return $this->_level >= MC_LOGGER_INFO;
+ }
+
+ function isWarnEnabled() {
+ return $this->_level >= MC_LOGGER_WARN;
+ }
+
+ function isErrorEnabled() {
+ return $this->_level >= MC_LOGGER_ERROR;
+ }
+
+ function isFatalEnabled() {
+ return $this->_level >= MC_LOGGER_FATAL;
+ }
+
+ function _logMsg($level, $message) {
+ $roll = false;
+
+ if ($level < $this->_level)
+ return;
+
+ $logFile = $this->toOSPath($this->_path . "/" . $this->_filename);
+
+ switch ($level) {
+ case MC_LOGGER_DEBUG:
+ $levelName = "DEBUG";
+ break;
+
+ case MC_LOGGER_INFO:
+ $levelName = "INFO";
+ break;
+
+ case MC_LOGGER_WARN:
+ $levelName = "WARN";
+ break;
+
+ case MC_LOGGER_ERROR:
+ $levelName = "ERROR";
+ break;
+
+ case MC_LOGGER_FATAL:
+ $levelName = "FATAL";
+ break;
+ }
+
+ $logFile = str_replace('{level}', strtolower($levelName), $logFile);
+
+ $text = $this->_format;
+ $text = str_replace('{time}', date("Y-m-d H:i:s"), $text);
+ $text = str_replace('{level}', strtolower($levelName), $text);
+ $text = str_replace('{message}', $message, $text);
+ $message = $text . "\r\n";
+
+ // Check filesize
+ if (file_exists($logFile)) {
+ $size = @filesize($logFile);
+
+ if ($size + strlen($message) > $this->_maxSizeBytes)
+ $roll = true;
+ }
+
+ // Roll if the size is right
+ if ($roll) {
+ for ($i=$this->_maxFiles-1; $i>=1; $i--) {
+ $rfile = $this->toOSPath($logFile . "." . $i);
+ $nfile = $this->toOSPath($logFile . "." . ($i+1));
+
+ if (@file_exists($rfile))
+ @rename($rfile, $nfile);
+ }
+
+ @rename($logFile, $this->toOSPath($logFile . ".1"));
+
+ // Delete last logfile
+ $delfile = $this->toOSPath($logFile . "." . ($this->_maxFiles + 1));
+ if (@file_exists($delfile))
+ @unlink($delfile);
+ }
+
+ // Append log line
+ if (($fp = @fopen($logFile, "a")) != null) {
+ @fputs($fp, $message);
+ @fflush($fp);
+ @fclose($fp);
+ }
+ }
+
+ /**
+ * Converts a Unix path to OS specific path.
+ *
+ * @param String $path Unix path to convert.
+ */
+ function toOSPath($path) {
+ return str_replace("/", DIRECTORY_SEPARATOR, $path);
+ }
+}
+
+?>
\ No newline at end of file |