summaryrefslogtreecommitdiff
path: root/program/js/tiny_mce/plugins/spellchecker/classes/utils
diff options
context:
space:
mode:
Diffstat (limited to 'program/js/tiny_mce/plugins/spellchecker/classes/utils')
-rwxr-xr-xprogram/js/tiny_mce/plugins/spellchecker/classes/utils/JSON.php595
-rwxr-xr-xprogram/js/tiny_mce/plugins/spellchecker/classes/utils/Logger.php268
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