diff options
Diffstat (limited to 'lib')
33 files changed, 1 insertions, 1838 deletions
diff --git a/lib/JSON/JSON.php b/lib/JSON/JSON.php deleted file mode 100644 index 0cddbdd..0000000 --- a/lib/JSON/JSON.php +++ /dev/null @@ -1,806 +0,0 @@ -<?php -/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ - -/** - * Converts to and from JSON format. - * - * JSON (JavaScript Object Notation) is a lightweight data-interchange - * format. It is easy for humans to read and write. It is easy for machines - * to parse and generate. It is based on a subset of the JavaScript - * Programming Language, Standard ECMA-262 3rd Edition - December 1999. - * This feature can also be found in Python. JSON is a text format that is - * completely language independent but uses conventions that are familiar - * to programmers of the C-family of languages, including C, C++, C#, Java, - * JavaScript, Perl, TCL, and many others. These properties make JSON an - * ideal data-interchange language. - * - * This package provides a simple encoder and decoder for JSON notation. It - * is intended for use with client-side Javascript applications that make - * use of HTTPRequest to perform server communication functions - data can - * be encoded into JSON notation for use in a client-side javascript, or - * decoded from incoming Javascript requests. JSON format is native to - * Javascript, and can be directly eval()'ed with no further parsing - * overhead - * - * All strings should be in ASCII or UTF-8 format! - * - * LICENSE: Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: Redistributions of source code must retain the - * above copyright notice, this list of conditions and the following - * disclaimer. Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR - * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE - * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * @category - * @package Services_JSON - * @author Michal Migurski <mike-json@teczno.com> - * @author Matt Knapp <mdknapp[at]gmail[dot]com> - * @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com> - * @copyright 2005 Michal Migurski - * @version CVS: $Id: JSON.php,v 1.31 2006/06/28 05:54:17 migurski Exp $ - * @license http://www.opensource.org/licenses/bsd-license.php - * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 - */ - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_SLICE', 1); - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_IN_STR', 2); - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_IN_ARR', 3); - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_IN_OBJ', 4); - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_IN_CMT', 5); - -/** - * Behavior switch for Services_JSON::decode() - */ -define('SERVICES_JSON_LOOSE_TYPE', 16); - -/** - * Behavior switch for Services_JSON::decode() - */ -define('SERVICES_JSON_SUPPRESS_ERRORS', 32); - -/** - * Converts to and from JSON format. - * - * Brief example of use: - * - * <code> - * // create a new instance of Services_JSON - * $json = new Services_JSON(); - * - * // convert a complexe value to JSON notation, and send it to the browser - * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); - * $output = $json->encode($value); - * - * print($output); - * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] - * - * // accept incoming POST data, assumed to be in JSON notation - * $input = file_get_contents('php://input', 1000000); - * $value = $json->decode($input); - * </code> - */ -class Services_JSON -{ - /** - * constructs a new JSON instance - * - * @param int $use object behavior flags; combine with boolean-OR - * - * possible values: - * - SERVICES_JSON_LOOSE_TYPE: loose typing. - * "{...}" syntax creates associative arrays - * instead of objects in decode(). - * - SERVICES_JSON_SUPPRESS_ERRORS: error suppression. - * Values which can't be encoded (e.g. resources) - * appear as NULL instead of throwing errors. - * By default, a deeply-nested resource will - * bubble up with an error, so all return values - * from encode() should be checked with isError() - */ - function Services_JSON($use = 0) - { - $this->use = $use; - } - - /** - * convert a string from one UTF-16 char to one UTF-8 char - * - * Normally should be handled by mb_convert_encoding, but - * provides a slower PHP-only method for installations - * that lack the multibye string extension. - * - * @param string $utf16 UTF-16 character - * @return string UTF-8 character - * @access private - */ - function utf162utf8($utf16) - { - // oh please oh please oh please oh please oh please - if(function_exists('mb_convert_encoding')) { - return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); - } - - $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); - - switch(true) { - case ((0x7F & $bytes) == $bytes): - // this case should never be reached, because we are in ASCII range - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr(0x7F & $bytes); - - case (0x07FF & $bytes) == $bytes: - // return a 2-byte UTF-8 character - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr(0xC0 | (($bytes >> 6) & 0x1F)) - . chr(0x80 | ($bytes & 0x3F)); - - case (0xFFFF & $bytes) == $bytes: - // return a 3-byte UTF-8 character - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr(0xE0 | (($bytes >> 12) & 0x0F)) - . chr(0x80 | (($bytes >> 6) & 0x3F)) - . chr(0x80 | ($bytes & 0x3F)); - } - - // ignoring UTF-32 for now, sorry - return ''; - } - - /** - * convert a string from one UTF-8 char to one UTF-16 char - * - * Normally should be handled by mb_convert_encoding, but - * provides a slower PHP-only method for installations - * that lack the multibye string extension. - * - * @param string $utf8 UTF-8 character - * @return string UTF-16 character - * @access private - */ - function utf82utf16($utf8) - { - // oh please oh please oh please oh please oh please - if(function_exists('mb_convert_encoding')) { - return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); - } - - switch(strlen($utf8)) { - case 1: - // this case should never be reached, because we are in ASCII range - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return $utf8; - - case 2: - // return a UTF-16 character from a 2-byte UTF-8 char - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr(0x07 & (ord($utf8{0}) >> 2)) - . chr((0xC0 & (ord($utf8{0}) << 6)) - | (0x3F & ord($utf8{1}))); - - case 3: - // return a UTF-16 character from a 3-byte UTF-8 char - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr((0xF0 & (ord($utf8{0}) << 4)) - | (0x0F & (ord($utf8{1}) >> 2))) - . chr((0xC0 & (ord($utf8{1}) << 6)) - | (0x7F & ord($utf8{2}))); - } - - // ignoring UTF-32 for now, sorry - return ''; - } - - /** - * encodes an arbitrary variable into JSON format - * - * @param mixed $var any number, boolean, string, array, or object to be encoded. - * see argument 1 to Services_JSON() above for array-parsing behavior. - * if var is a strng, note that encode() always expects it - * to be in ASCII or UTF-8 format! - * - * @return mixed JSON string representation of input var or an error if a problem occurs - * @access public - */ - function encode($var) - { - switch (gettype($var)) { - case 'boolean': - return $var ? 'true' : 'false'; - - case 'NULL': - return 'null'; - - case 'integer': - return (int) $var; - - case 'double': - case 'float': - return (float) $var; - - case 'string': - // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT - $ascii = ''; - $strlen_var = strlen($var); - - /* - * Iterate over every character in the string, - * escaping with a slash or encoding to UTF-8 where necessary - */ - for ($c = 0; $c < $strlen_var; ++$c) { - - $ord_var_c = ord($var{$c}); - - switch (true) { - case $ord_var_c == 0x08: - $ascii .= '\b'; - break; - case $ord_var_c == 0x09: - $ascii .= '\t'; - break; - case $ord_var_c == 0x0A: - $ascii .= '\n'; - break; - case $ord_var_c == 0x0C: - $ascii .= '\f'; - break; - case $ord_var_c == 0x0D: - $ascii .= '\r'; - break; - - case $ord_var_c == 0x22: - case $ord_var_c == 0x2F: - case $ord_var_c == 0x5C: - // double quote, slash, slosh - $ascii .= '\\'.$var{$c}; - break; - - case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): - // characters U-00000000 - U-0000007F (same as ASCII) - $ascii .= $var{$c}; - break; - - case (($ord_var_c & 0xE0) == 0xC0): - // characters U-00000080 - U-000007FF, mask 110XXXXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, ord($var{$c + 1})); - $c += 1; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xF0) == 0xE0): - // characters U-00000800 - U-0000FFFF, mask 1110XXXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c + 1}), - ord($var{$c + 2})); - $c += 2; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xF8) == 0xF0): - // characters U-00010000 - U-001FFFFF, mask 11110XXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c + 1}), - ord($var{$c + 2}), - ord($var{$c + 3})); - $c += 3; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xFC) == 0xF8): - // characters U-00200000 - U-03FFFFFF, mask 111110XX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c + 1}), - ord($var{$c + 2}), - ord($var{$c + 3}), - ord($var{$c + 4})); - $c += 4; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xFE) == 0xFC): - // characters U-04000000 - U-7FFFFFFF, mask 1111110X - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c + 1}), - ord($var{$c + 2}), - ord($var{$c + 3}), - ord($var{$c + 4}), - ord($var{$c + 5})); - $c += 5; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - } - } - - return '"'.$ascii.'"'; - - case 'array': - /* - * As per JSON spec if any array key is not an integer - * we must treat the the whole array as an object. We - * also try to catch a sparsely populated associative - * array with numeric keys here because some JS engines - * will create an array with empty indexes up to - * max_index which can cause memory issues and because - * the keys, which may be relevant, will be remapped - * otherwise. - * - * As per the ECMA and JSON specification an object may - * have any string as a property. Unfortunately due to - * a hole in the ECMA specification if the key is a - * ECMA reserved word or starts with a digit the - * parameter is only accessible using ECMAScript's - * bracket notation. - */ - - // treat as a JSON object - if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { - $properties = array_map(array($this, 'name_value'), - array_keys($var), - array_values($var)); - - foreach($properties as $property) { - if(Services_JSON::isError($property)) { - return $property; - } - } - - return '{' . join(',', $properties) . '}'; - } - - // treat it like a regular array - $elements = array_map(array($this, 'encode'), $var); - - foreach($elements as $element) { - if(Services_JSON::isError($element)) { - return $element; - } - } - - return '[' . join(',', $elements) . ']'; - - case 'object': - $vars = get_object_vars($var); - - $properties = array_map(array($this, 'name_value'), - array_keys($vars), - array_values($vars)); - - foreach($properties as $property) { - if(Services_JSON::isError($property)) { - return $property; - } - } - - return '{' . join(',', $properties) . '}'; - - default: - return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) - ? 'null' - : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string"); - } - } - - /** - * array-walking function for use in generating JSON-formatted name-value pairs - * - * @param string $name name of key to use - * @param mixed $value reference to an array element to be encoded - * - * @return string JSON-formatted name-value pair, like '"name":value' - * @access private - */ - function name_value($name, $value) - { - $encoded_value = $this->encode($value); - - if(Services_JSON::isError($encoded_value)) { - return $encoded_value; - } - - return $this->encode(strval($name)) . ':' . $encoded_value; - } - - /** - * reduce a string by removing leading and trailing comments and whitespace - * - * @param $str string string value to strip of comments and whitespace - * - * @return string string value stripped of comments and whitespace - * @access private - */ - function reduce_string($str) - { - $str = preg_replace(array( - - // eliminate single line comments in '// ...' form - '#^\s*//(.+)$#m', - - // eliminate multi-line comments in '/* ... */' form, at start of string - '#^\s*/\*(.+)\*/#Us', - - // eliminate multi-line comments in '/* ... */' form, at end of string - '#/\*(.+)\*/\s*$#Us' - - ), '', $str); - - // eliminate extraneous space - return trim($str); - } - - /** - * decodes a JSON string into appropriate variable - * - * @param string $str JSON-formatted string - * - * @return mixed number, boolean, string, array, or object - * corresponding to given JSON input string. - * See argument 1 to Services_JSON() above for object-output behavior. - * Note that decode() always returns strings - * in ASCII or UTF-8 format! - * @access public - */ - function decode($str) - { - $str = $this->reduce_string($str); - - switch (strtolower($str)) { - case 'true': - return true; - - case 'false': - return false; - - case 'null': - return null; - - default: - $m = array(); - - if (is_numeric($str)) { - // Lookie-loo, it's a number - - // This would work on its own, but I'm trying to be - // good about returning integers where appropriate: - // return (float)$str; - - // Return float or int, as appropriate - return ((float)$str == (integer)$str) - ? (integer)$str - : (float)$str; - - } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { - // STRINGS RETURNED IN UTF-8 FORMAT - $delim = substr($str, 0, 1); - $chrs = substr($str, 1, -1); - $utf8 = ''; - $strlen_chrs = strlen($chrs); - - for ($c = 0; $c < $strlen_chrs; ++$c) { - - $substr_chrs_c_2 = substr($chrs, $c, 2); - $ord_chrs_c = ord($chrs{$c}); - - switch (true) { - case $substr_chrs_c_2 == '\b': - $utf8 .= chr(0x08); - ++$c; - break; - case $substr_chrs_c_2 == '\t': - $utf8 .= chr(0x09); - ++$c; - break; - case $substr_chrs_c_2 == '\n': - $utf8 .= chr(0x0A); - ++$c; - break; - case $substr_chrs_c_2 == '\f': - $utf8 .= chr(0x0C); - ++$c; - break; - case $substr_chrs_c_2 == '\r': - $utf8 .= chr(0x0D); - ++$c; - break; - - case $substr_chrs_c_2 == '\\"': - case $substr_chrs_c_2 == '\\\'': - case $substr_chrs_c_2 == '\\\\': - case $substr_chrs_c_2 == '\\/': - if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || - ($delim == "'" && $substr_chrs_c_2 != '\\"')) { - $utf8 .= $chrs{++$c}; - } - break; - - case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)): - // single, escaped unicode character - $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2))) - . chr(hexdec(substr($chrs, ($c + 4), 2))); - $utf8 .= $this->utf162utf8($utf16); - $c += 5; - break; - - case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): - $utf8 .= $chrs{$c}; - break; - - case ($ord_chrs_c & 0xE0) == 0xC0: - // characters U-00000080 - U-000007FF, mask 110XXXXX - //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= substr($chrs, $c, 2); - ++$c; - break; - - case ($ord_chrs_c & 0xF0) == 0xE0: - // characters U-00000800 - U-0000FFFF, mask 1110XXXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= substr($chrs, $c, 3); - $c += 2; - break; - - case ($ord_chrs_c & 0xF8) == 0xF0: - // characters U-00010000 - U-001FFFFF, mask 11110XXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= substr($chrs, $c, 4); - $c += 3; - break; - - case ($ord_chrs_c & 0xFC) == 0xF8: - // characters U-00200000 - U-03FFFFFF, mask 111110XX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= substr($chrs, $c, 5); - $c += 4; - break; - - case ($ord_chrs_c & 0xFE) == 0xFC: - // characters U-04000000 - U-7FFFFFFF, mask 1111110X - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= substr($chrs, $c, 6); - $c += 5; - break; - - } - - } - - return $utf8; - - } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { - // array, or object notation - - if ($str{0} == '[') { - $stk = array(SERVICES_JSON_IN_ARR); - $arr = array(); - } else { - if ($this->use & SERVICES_JSON_LOOSE_TYPE) { - $stk = array(SERVICES_JSON_IN_OBJ); - $obj = array(); - } else { - $stk = array(SERVICES_JSON_IN_OBJ); - $obj = new stdClass(); - } - } - - array_push($stk, array('what' => SERVICES_JSON_SLICE, - 'where' => 0, - 'delim' => false)); - - $chrs = substr($str, 1, -1); - $chrs = $this->reduce_string($chrs); - - if ($chrs == '') { - if (reset($stk) == SERVICES_JSON_IN_ARR) { - return $arr; - - } else { - return $obj; - - } - } - - //print("\nparsing {$chrs}\n"); - - $strlen_chrs = strlen($chrs); - - for ($c = 0; $c <= $strlen_chrs; ++$c) { - - $top = end($stk); - $substr_chrs_c_2 = substr($chrs, $c, 2); - - if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { - // found a comma that is not inside a string, array, etc., - // OR we've reached the end of the character list - $slice = substr($chrs, $top['where'], ($c - $top['where'])); - array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); - //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - if (reset($stk) == SERVICES_JSON_IN_ARR) { - // we are in an array, so just push an element onto the stack - array_push($arr, $this->decode($slice)); - - } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { - // we are in an object, so figure - // out the property name and set an - // element in an associative array, - // for now - $parts = array(); - - if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { - // "name":value pair - $key = $this->decode($parts[1]); - $val = $this->decode($parts[2]); - - if ($this->use & SERVICES_JSON_LOOSE_TYPE) { - $obj[$key] = $val; - } else { - $obj->$key = $val; - } - } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { - // name:value pair, where name is unquoted - $key = $parts[1]; - $val = $this->decode($parts[2]); - - if ($this->use & SERVICES_JSON_LOOSE_TYPE) { - $obj[$key] = $val; - } else { - $obj->$key = $val; - } - } - - } - - } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { - // found a quote, and we are not inside a string - array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); - //print("Found start of string at {$c}\n"); - - } elseif (($chrs{$c} == $top['delim']) && - ($top['what'] == SERVICES_JSON_IN_STR) && - ((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) { - // found a quote, we're in a string, and it's not escaped - // we know that it's not escaped becase there is _not_ an - // odd number of backslashes at the end of the string so far - array_pop($stk); - //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); - - } elseif (($chrs{$c} == '[') && - in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { - // found a left-bracket, and we are in an array, object, or slice - array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); - //print("Found start of array at {$c}\n"); - - } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { - // found a right-bracket, and we're in an array - array_pop($stk); - //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - } elseif (($chrs{$c} == '{') && - in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { - // found a left-brace, and we are in an array, object, or slice - array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); - //print("Found start of object at {$c}\n"); - - } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { - // found a right-brace, and we're in an object - array_pop($stk); - //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - } elseif (($substr_chrs_c_2 == '/*') && - in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { - // found a comment start, and we are in an array, object, or slice - array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); - $c++; - //print("Found start of comment at {$c}\n"); - - } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { - // found a comment end, and we're in one now - array_pop($stk); - $c++; - - for ($i = $top['where']; $i <= $c; ++$i) - $chrs = substr_replace($chrs, ' ', $i, 1); - - //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - } - - } - - if (reset($stk) == SERVICES_JSON_IN_ARR) { - return $arr; - - } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { - return $obj; - - } - - } - } - } - - /** - * @todo Ultimately, this should just call PEAR::isError() - */ - function isError($data, $code = null) - { - if (class_exists('pear')) { - return PEAR::isError($data, $code); - } elseif (is_object($data) && (get_class($data) == 'services_json_error' || - is_subclass_of($data, 'services_json_error'))) { - return true; - } - - return false; - } -} - -if (class_exists('PEAR_Error')) { - - class Services_JSON_Error extends PEAR_Error - { - function Services_JSON_Error($message = 'unknown error', $code = null, - $mode = null, $options = null, $userinfo = null) - { - parent::PEAR_Error($message, $code, $mode, $options, $userinfo); - } - } - -} else { - - /** - * @todo Ultimately, this class shall be descended from PEAR_Error - */ - class Services_JSON_Error - { - function Services_JSON_Error($message = 'unknown error', $code = null, - $mode = null, $options = null, $userinfo = null) - { - - } - } - -} - -?> diff --git a/lib/JSON/inc_json.php b/lib/JSON/inc_json.php deleted file mode 100644 index b36c2a4..0000000 --- a/lib/JSON/inc_json.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php - -if (!function_exists('json_decode')) { - function json_decode($content, $assoc=false) { - require_once 'lib/JSON/JSON.php'; - if ($assoc) { - $json = new Services_JSON(SERVICES_JSON_LOOSE_TYPE); - } - else { - $json = new Services_JSON; - } - return $json->decode($content); - } -} - -if (!function_exists('json_encode')) { - function json_encode($content) { - require_once 'lib/JSON/JSON.php'; - $json = new Services_JSON; - return $json->encode($content); - } -} diff --git a/lib/conf/apps.php b/lib/conf/apps.php index 8e755b1..c3efea4 100644 --- a/lib/conf/apps.php +++ b/lib/conf/apps.php @@ -4,7 +4,7 @@ $homepage = "blog"; $apps = array( - // Image upload application + // File upload application "file" => array( "index" => 1, "delete" => 1, @@ -48,43 +48,5 @@ $apps = array( "delcom" => 2, ), - // Studies application - "deck" => array( - "index" => 0, - "new" => 1, - "view" => 0, - // function called for editing - "edit" => 1, // change title, comment - "addent" => 1, // add card - "rment" => 1, // remove card - "edent" => 1, // edit card - "mvent" => 1, // move card - ), - "list" => array( - "index" => 0, - "view" => 0, - "new" => 1, - "edit" => 1, // edit global info = name, desc, ... - - "addbatch" => 1, - "edbatch" => 1, - "rmbatch" => 1, - ), - - "study" => array ( - "index" => 0, - "deckadd" => 1, - "deck" => 1, - "deckrm" => 1, - "setrate" => 1, - "setcard" => 1, - - "listadd" => 1, // create list_study - "list" => 1, // !!!!!! show global progress for a list_study - "listrm" => 1, // delete list_study - "batch" => 1, // (JS) shows progress for a batch_study - "batchreview" => 1, // (JS) batch review app - "brresults" => 1, - ), ); diff --git a/lib/deck/add.php b/lib/deck/add.php deleted file mode 100644 index d7f8e9f..0000000 --- a/lib/deck/add.php +++ /dev/null @@ -1,5 +0,0 @@ -<?php - -$title = "olol"; -$message = 'Placeholder. Go to <a href="deck">study decks</a>.'; -require("tpl/general/empty.php"); diff --git a/lib/deck/addent.php b/lib/deck/addent.php deleted file mode 100644 index a860df1..0000000 --- a/lib/deck/addent.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php - -require("lib/markdown.php"); - -assert_redir(count($args) == 3, 'deck'); -$deckid = intval($args[2]); - -$deck = mysql_fetch_assoc(sql( - "SELECT decks.id AS id, decks.name AS name, decks.comment_md AS comment, decks.owner AS owner_id ". - "FROM decks ". - "WHERE decks.id = $deckid")); -assert_error($deck && $deck['owner_id'] == $user['id'], - "This deck does not exist, or you are not allowed to edit it."); - -$card_name = ""; -$card_text = ""; -if (isset($_POST['name']) && isset($_POST['text'])) { - $card_name = esca($_POST['name']); - $card_text = esca($_POST['text']); - $card_text_html = Markdown($card_text); - if ($card_name == "") { - $error = "You must give your card a name."; - } else if ($card_text == "") { - $error = "You must put some text in your card."; - } else if (mysql_fetch_assoc(sql("SELECT id FROM cards WHERE deck = $deckid AND name = '" . escs($card_name)."'"))) { - $error = "You already have a card using that name."; - } else { - $n = mysql_fetch_assoc(sql("SELECT MAX(number) AS n FROM cards WHERE deck = $deckid")); - $number = $n['n'] + 1; - sql( - "INSERT INTO cards(deck, number, name, text_md, text_html) ". - "VALUES($deckid, $number, '" . escs($card_name) . "', '" . escs($card_text) . "', '" . escs($card_text_html). "')"); - header("Location: view-deck-$deckid"); - die(); - } -} - -$title = "Add card to " . $deck['name']; -$message = "Your card will be added at the end of the deck. You can always move it afterwards."; -$fields = array( - array("label" => "Name : ", "name" => "name", "value" => $card_name), - array("label" => "Text : ", "name" => "text", "type" => "textarea", "value" => $card_text), -); -$validate = "Add card"; - -require("tpl/deck/ef.php"); diff --git a/lib/deck/edent.php b/lib/deck/edent.php deleted file mode 100644 index 8bdfac3..0000000 --- a/lib/deck/edent.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php - -require("lib/markdown.php"); - -assert_redir(count($args) == 3, 'deck'); -$cardid = intval($args[2]); - -$card = mysql_fetch_assoc(sql( - "SELECT decks.id AS deckid, decks.owner AS deckowner, decks.name AS deckname, cards.name AS name, cards.text_md AS text ". - "FROM cards LEFT JOIN decks ON decks.id = cards.deck ". - "WHERE cards.id = $cardid")); -assert_error($card && $card["deckowner"] == $user['id'], - "This card does not exist, or you are not allowed to edit it."); -$deck = array("id" => $card['deckid'], 'name' => $card['deckname']); - -$card_name = $card['name']; -$card_text = $card['text']; -if (isset($_POST['name']) && isset($_POST['text'])) { - $card_name = esca($_POST['name']); - $card_text = esca($_POST['text']); - $card_text_html = Markdown($card_text); - if ($card_name == "") { - $error = "You must give your card a name."; - } else if ($card_text == "") { - $error = "You must put some text in your card."; - } else if (mysql_fetch_assoc(sql("SELECT id FROM cards WHERE deck = " . $deck['id'] . " AND name = '" . escs($card_name)."' AND id != $cardid"))) { - $error = "You already have a card using that name."; - } else { - sql("UPDATE cards SET name = '" . escs($card_name) . "', text_md = '" . escs($card_text) . "', text_html = '" . escs($card_text_html) . "'" . - " WHERE id = $cardid"); - header("Location: view-deck-" . $deck['id']); - die(); - } -} - -$title = "Edit card in " . $deck['name']; -$fields = array( - array("label" => "Name : ", "name" => "name", "value" => $card_name), - array("label" => "Text : ", "name" => "text", "type" => "textarea", "value" => $card_text), -); -$validate = "Edit card"; - -require("tpl/deck/ef.php"); - diff --git a/lib/deck/edit.php b/lib/deck/edit.php deleted file mode 100644 index d4102bb..0000000 --- a/lib/deck/edit.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php - -require("lib/markdown.php"); - -assert_redir(count($args) == 3, 'deck'); -$deckid = intval($args[2]); - -$deck = mysql_fetch_assoc(sql( - "SELECT decks.id AS id, decks.name AS name, decks.comment_md AS comment, account.id AS owner_id ". - "FROM decks LEFT JOIN account ON account.id = decks.owner ". - "WHERE decks.id = $deckid")); -assert_error($deck && $deck['owner_id'] == $user['id'], - "This deck does not exist, or you are not allowed to edit it."); - -$deck_name = $deck['name']; -$deck_comment = $deck['comment']; -if (isset($_POST['name']) && isset($_POST['comment'])) { - $deck_name = esca($_POST['name']); - $deck_comment = esca($_POST['comment']); - $deck_comment_html = Markdown($deck_comment); - if ($deck_name == "") { - $error = "You must enter a name for your deck."; - } else if (mysql_fetch_assoc(sql("SELECT id FROM decks WHERE owner = " . $user['id'] . " AND name = '" . escs($deck_name) . "' AND id != $deckid"))) { - $error = "You already have a deck with that title."; - } else if ($deck_comment == "") { - $error = "Please enter a comment on your deck."; - } else { - sql("UPDATE decks SET name = '" . escs($deck_name) . "', comment_md = '" . escs($deck_comment) . - "', comment_html = '" . escs($deck_comment_html) . "' WHERE id = $deckid"); - header("Location: view-deck-" . $deckid); - die(); - } -} - -$title = "Edit deck : " . $deck['name']; -$fields = array( - array("label" => "Name : ", "name" => "name", "value" => $deck_name), - array("label" => "Comment : ", "name" => "comment", "type" => "textarea", "value" => $deck_comment), -); -$validate = "Edit deck"; - -require("tpl/deck/ef.php"); diff --git a/lib/deck/index.php b/lib/deck/index.php deleted file mode 100644 index ad497d5..0000000 --- a/lib/deck/index.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -$filters = array ( - "order" => array ( - "nbUsers" => "popularity", - "name" => "name", - "owner" => "author", - ), - "way" => $ord_ways, -); -$fdefaults = array ( - "order" => "nbUsers", - "way" => "DESC", -); - -$decks = array(); -$n = sql( - "SELECT decks.id AS id, decks.name AS name, account.login AS owner, COUNT(deck_study.id) AS nbUsers ". - "FROM decks LEFT JOIN account ON decks.owner = account.id LEFT JOIN deck_study ON deck_study.deck = decks.id ". - "GROUP BY decks.id ORDER BY " . get_filter("order") . " " . get_filter("way") - ); -while ($nn = mysql_fetch_assoc($n)) $decks[] = $nn; - -require("tpl/deck/index.php"); - diff --git a/lib/deck/mvent.php b/lib/deck/mvent.php deleted file mode 100644 index 28a7fa3..0000000 --- a/lib/deck/mvent.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php - -require("lib/markdown.php"); - -assert_redir(count($args) == 4, 'deck'); -$cardid = intval($args[2]); -$pos = intval($args[3]); - -$card = mysql_fetch_assoc(sql( - "SELECT decks.id AS deckid, decks.owner AS deckowner, decks.name AS deckname, cards.name AS name, cards.text_md AS text, cards.number AS number ". - "FROM cards LEFT JOIN decks ON decks.id = cards.deck ". - "WHERE cards.id = $cardid")); -assert_error($card && $card["deckowner"] == $user['id'], - "This card does not exist, or you are not allowed to edit it."); -$deck = array("id" => $card['deckid'], 'name' => $card['deckname']); -$deckid = $card['deckid']; - -$mn = mysql_fetch_assoc(sql("SELECT COUNT(*) AS c FROM cards WHERE deck = $deckid")); -$mn = $mn['c']; -if ($pos > $mn) { - $error = "That number is too big. You don't even have that much cards in your deck."; -} else if ($pos < 1) { - $error = "A position is at least one..."; -} else { - sql("UPDATE cards SET number = 0 WHERE id = $cardid"); - sql("UPDATE cards SET number = number - 1 WHERE number > " . $card['number'] . " AND deck = $deckid ORDER BY number ASC"); - sql("UPDATE cards SET number = number + 1 WHERE number >= $pos AND deck = $deckid ORDER BY number DESC"); - sql("UPDATE cards SET number = $pos WHERE id = $cardid"); - sql("UPDATE deck_study SET need_check = 1 WHERE deck = $deckid"); - header("Location: view-deck-$deckid"); -} - -require("tpl/deck/ef.php"); diff --git a/lib/deck/new.php b/lib/deck/new.php deleted file mode 100644 index 2ff1b50..0000000 --- a/lib/deck/new.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -require("lib/markdown.php"); - -$deck_name = ""; -$deck_comment = ""; -if (isset($_POST["name"]) && isset($_POST['comment'])) { - $deck_name = esca($_POST['name']); - $deck_comment = esca($_POST['comment']); - $deck_comment_html = Markdown($deck_comment); - if ($deck_name == "") { - $error = "You must enter a name for your deck."; - } else if (mysql_fetch_assoc(sql("SELECT id FROM decks WHERE owner = " . $user['id'] . " AND name = '" . escs($deck_name) . "'"))) { - $error = "You already have a deck with that title."; - } else if ($deck_comment == "") { - $error = "Please enter a comment on your deck."; - } else { - sql("INSERT INTO decks(owner, name, comment_md, comment_html) ". - "VALUES(" . $user['id'] . ", '" . escs($deck_name) . "', '" . escs($deck_comment) . "', '" . escs($deck_comment_html) . "')"); - header("Location: view-deck-" . mysql_insert_id()); - die(); - } -} - -$title = "Create deck"; -$fields = array( - array("label" => "Name : ", "name" => "name", "value" => $deck_name), - array("label" => "Comment : ", "name" => "comment", "type" => "textarea", "value" => $deck_comment), - ); -$validate = "Create deck"; - -require("tpl/deck/new.php"); diff --git a/lib/deck/rment.php b/lib/deck/rment.php deleted file mode 100644 index c4f86c8..0000000 --- a/lib/deck/rment.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php - -require("lib/markdown.php"); - -assert_redir(count($args) >= 3, 'deck'); -$cardid = intval($args[2]); - -$card = mysql_fetch_assoc(sql( - "SELECT decks.id AS deckid, decks.owner AS deckowner, decks.name AS deckname, cards.name AS name, cards.text_md AS text, cards.number AS number ". - "FROM cards LEFT JOIN decks ON decks.id = cards.deck ". - "WHERE cards.id = $cardid")); -assert_error($card && $card["deckowner"] == $user['id'], - "This card does not exist, or you are not allowed to edit it."); - -token_validate("Do you really want to delete this card ?", "view-deck-". $card['deckid']); -sql("DELETE FROM cards WHERE id = $cardid"); -sql("UPDATE cards SET number = number - 1 WHERE number > " . $card['number'] . " AND deck = " . $card['deckid'] . " ORDER BY number ASC"); -sql("UPDATE deck_study SET need_check = 1 WHERE deck = " . $card['deckid']); -header("Location: view-deck-" . $card['deckid']); -die(); diff --git a/lib/deck/view.php b/lib/deck/view.php deleted file mode 100644 index e9a83e6..0000000 --- a/lib/deck/view.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php - -assert_redir(count($args) == 3, 'deck'); -$deckid = intval($args[2]); - -$deck = mysql_fetch_assoc(sql( - "SELECT decks.id AS id, decks.name AS name, decks.comment_html AS comment, account.login AS owner, account.id AS owner_id ". - "FROM decks LEFT JOIN account ON account.id = decks.owner ". - "WHERE decks.id = $deckid")); -assert_error($deck, "This deck does not exist."); - -$can_edit = false; -if ($deck["owner_id"] == $user['id']) $can_edit = true; - -$filters = array ( - "order" => array ( - "name" => "card name", - "number" => "card number", - ), - "way" => $ord_ways, -); -$fdefaults = array ( - "order" => "number", - "way" => ($can_edit ? "DESC" : "ASC"), -); - -$cards = array(); -$n = sql( - "SELECT id, number, name, text_html AS text FROM cards WHERE deck = $deckid ". - "ORDER BY " . get_filter("order") . " " . get_filter("way") - ); -while ($nn = mysql_fetch_assoc($n)) $cards[] = $nn; - -$can_start_study = false; -if ($user['id'] != 0) { - if (!mysql_fetch_assoc(sql("SELECT id FROM deck_study WHERE deck = $deckid AND user = " . $user['id']))) - $can_start_study = true; -} else { - $message = "You should create an account in order to study this deck."; -} - -require("tpl/deck/view.php"); diff --git a/lib/list/addbatch.php b/lib/list/addbatch.php deleted file mode 100644 index 5cb5fb6..0000000 --- a/lib/list/addbatch.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php - -require("lib/list/inc_process.php"); - -assert_redir(count($args) == 3, 'list'); -$listid = intval($args[2]); - -$list = mysql_fetch_assoc(sql( - "SELECT lists.id AS id, lists.name AS name, lists.owner AS owner_id ". - "FROM lists WHERE lists.id = $listid")); -assert_error($list && $list['owner_id'] == $user['id'], - "This list does not exist, or you are not allowed to edit it."); - -$batch_name = ""; -$batch_model = ""; -$batch_contents = ""; -if (isset($_POST['name']) && isset($_POST['model']) && isset($_POST['contents'])) { - $batch_name = esca($_POST['name']); - $batch_model = esca($_POST['model']); - $batch_contents = esca($_POST['contents']); - $batch_json = mk_batch_json($batch_model, $batch_contents); - if ($batch_name == "") { - $error = "You must give a name to this batch."; - } else if (mysql_fetch_assoc(sql("SELECT id FROM batches WHERE list = $listid AND name = '" . escs($batch_name) . "'"))) { - $error = "You already have a batch using that name."; - } else { - sql( - "INSERT INTO batches(list, name, model, contents, json_data) ". - "VALUES($listid, '" . escs($batch_name) . "', '" . escs($batch_model) . "', '" . escs($batch_contents) . "', '" . escs($batch_json) . "')"); - header("Location: view-list-$listid"); - die(); - } -} - -$title = "Add batch to " . $list['name']; -$fields = array( - array("label" => "Name : ", "name" => "name", "value" => $batch_name), - array("label" => "Columns : ", "name" => "model", "value" => $batch_model), - array("label" => "Contents : ", "name" => "contents", "type" => "textarea", "value" => $batch_contents) -); -$validate = "Add batch"; - -require("tpl/list/ef.php"); diff --git a/lib/list/edbatch.php b/lib/list/edbatch.php deleted file mode 100644 index 380ecf2..0000000 --- a/lib/list/edbatch.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php - -require("lib/list/inc_process.php"); - -assert_redir(count($args) == 3, 'list'); -$batchid = intval($args[2]); - -$batch = mysql_fetch_assoc(sql( - "SELECT lists.id AS listid, lists.owner AS listowner, lists.name AS listname, batches.name AS name, ". - "batches.model AS model, batches.contents AS contents ". - "FROM batches LEFT JOIN lists ON lists.id = batches.list ". - "WHERE batches.id = $batchid")); -assert_error($batch && $batch['listowner'] == $user['id'], - "this batch does not exist, or you are not allowed to edit it."); -$list = array("id" => $batch['listid'], 'name' => $batch['listname']); - -$batch_name = $batch['name']; -$batch_model = $batch['model']; -$batch_contents = $batch['contents']; -if (isset($_POST['name']) && isset($_POST['model']) && isset($_POST['contents'])) { - $batch_name = esca($_POST['name']); - $batch_model = esca($_POST['model']); - $batch_contents = esca($_POST['contents']); - $batch_json = mk_batch_json($batch_model, $batch_contents); - if ($batch_name == "") { - $error = "You must give a name to this batch."; - } else if (mysql_fetch_assoc(sql("SELECT id FROM batches WHERE list = " . $list['id'] . " AND name = '" . escs($batch_name) . "' AND id != $batchid"))) { - $error = "You already have a batch using that name."; - } else { - sql( - "UPDATE batches SET name = '" . escs($batch_name) . "', model = '" . escs($batch_model) . "', ". - "contents = '" . escs($batch_contents) . "', json_data = '" . escs($batch_json) . "' WHERE id = $batchid" - ); - header("Location: view-list-" . $list['id']); - die(); - } -} - -$title = "Edit batch in " . $list['name']; -$fields = array( - array("label" => "Name : ", "name" => "name", "value" => $batch_name), - array("label" => "Columns : ", "name" => "model", "value" => $batch_model), - array("label" => "Contents : ", "name" => "contents", "type" => "textarea", "value" => $batch_contents) -); -$validate = "Edit batch"; - -require("tpl/list/ef.php"); diff --git a/lib/list/edit.php b/lib/list/edit.php deleted file mode 100644 index 64394be..0000000 --- a/lib/list/edit.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php - -require("lib/markdown.php"); - -assert_redir(count($args) == 3, 'list'); -$listid = intval($args[2]); - -$list = mysql_fetch_assoc(sql( - "SELECT lists.id AS id, lists.name AS name, lists.comment_md AS comment, account.id AS owner_id ". - "FROM lists LEFT JOIN account ON account.id = lists.owner ". - "WHERE lists.id = $listid")); -assert_error($list && $list['owner_id'] == $user['id'], - "This list does not exist, or you are not allowed to edit it."); - -$list_name = $list['name']; -$list_comment = $list['comment']; -if (isset($_POST['name']) && isset($_POST['comment'])) { - $list_name = esca($_POST['name']); - $list_comment = esca($_POST['comment']); - $list_comment_html = Markdown($list_comment); - if ($list_name == "") { - $error = "You must enter a name for your list."; - } else if (mysql_fetch_assoc(sql("SELECT id FROM lists WHERE owner = " . $user['id'] . " AND name = '" . escs($list_name) . "' AND id != $listid"))) { - $error = "You already have a list with that title."; - } else if ($list_comment == "") { - $error = "Please enter a comment on your list."; - } else { - sql("UPDATE lists SET name = '" . escs($list_name) . "', comment_md = '" . escs($list_comment) . - "', comment_html = '" . escs($list_comment_html) . "' WHERE id = $listid"); - header("Location: view-list-" . $listid); - die(); - } -} - -$title = "Edit list : " . $list['name']; -$fields = array( - array("label" => "Name : ", "name" => "name", "value" => $list_name), - array("label" => "Comment : ", "name" => "comment", "type" => "textarea", "value" => $list_comment), -); -$validate = "Edit list"; - -require("tpl/list/ef.php"); - diff --git a/lib/list/inc_process.php b/lib/list/inc_process.php deleted file mode 100644 index 0c7dd82..0000000 --- a/lib/list/inc_process.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php - -require("lib/JSON/inc_json.php"); -require("lib/list/list_models.php"); - -function mk_batch_json($models, $contents) { - global $list_models; - - $data = array("columns" => array(), "items" => array(), "questions" => array()); - - if ($models[0] == '*') { - $model = $list_models[substr($models, 1)]; - - $columns = $data['columns'] = $model['columns']; - $data['questions'] = $model['questions']; - } else { - $columns = explode('|', $models); - - foreach ($columns as $k => $c) { - if ($c[0] == '!') { - $data['columns'][] = substr($c, 1); - } else { - $data['columns'][] = $c; - $data['questions'][] = array('col' => $k); - } - } - } - - $items = explode("\n", $contents); - foreach($items as $i) { - $ii = explode('|', str_replace("\r", '', $i)); - if (count($ii) == count($columns)) { - $data['items'][] = $ii; - } - } - - return json_encode($data); -} - - diff --git a/lib/list/index.php b/lib/list/index.php deleted file mode 100644 index cbcad67..0000000 --- a/lib/list/index.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -$filters = array ( - "order" => array ( - "nbUsers" => "popularity", - "name" => "name", - "owner" => "author", - ), - "way" => $ord_ways, -); -$fdefaults = array ( - "order" => "nbUsers", - "way" => "DESC", -); - -$lists = array(); -$n = sql( - "SELECT lists.id AS id, lists.name AS name, account.login AS owner, COUNT(list_study.id) AS nbUsers ". - "FROM lists LEFT JOIN account ON lists.owner = account.id LEFT JOIN list_study ON list_study.list = lists.id ". - "GROUP BY lists.id ORDER BY " . get_filter("order") . " " . get_filter("way") - ); -while ($nn = mysql_fetch_assoc($n)) $lists[] = $nn; - -require("tpl/list/index.php"); - diff --git a/lib/list/list_models.php b/lib/list/list_models.php deleted file mode 100644 index b68b538..0000000 --- a/lib/list/list_models.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php - -$list_models = array( - "RTK-Kanji" => array( - "columns" => array("N#", "Kanji", "Keyword", "Strokes"), - "questions" => array( - array( - 'q' => '<p class="rtk_kr_q_2">%2</p>', - 'a' => '<p class="rtk_kr_a_2">#%0: %2 [%3]<br /><span>%1</span></p>' - ), - array( - 'q' => '<p class="rtk_kr_q_1">%1</p>', - 'a' => '<p class="rtk_kr_a_1">#%0: %1 [%3]<br /><span>%2</span></p>' - ), - ), - ), - "JA-Vocab" => array( - "columns" => array("N#", "Kanji", "Kana", "English"), - "questions" => array( - array( - 'q' => '<p class="vocabqa">%3</p>', - 'a' => '<p class="vocaba"><span class="vocabreading">%2</span><br />%1<br /><span>%3</span></p>', - ), - array( - 'q' => '<p class="vocabqb">%1</p>', - 'a' => '<p class="vocaba"><span class="vocabreading">%2</span><br />%1<br /><span>%3</span></p>', - ), - ), - ), - "JA-Vocab-fr" => array( - "columns" => array("N#", "Kanji", "Kana", "French"), - "questions" => array( - array( - 'q' => '<p class="vocabqb">%1</p>', - 'a' => '<p class="vocaba"><span class="vocabreading">%2</span><br />%1<br /><span>%3</span></p>', - ), - ), - ), -); diff --git a/lib/list/new.php b/lib/list/new.php deleted file mode 100644 index 9a9c801..0000000 --- a/lib/list/new.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php - -require("lib/markdown.php"); - -$list_name = ""; -$list_comment = ""; -if (isset($_POST["name"]) && isset($_POST['comment'])) { - $list_name = esca($_POST['name']); - $list_comment = esca($_POST['comment']); - $list_comment_html = Markdown($list_comment); - if ($list_name == "") { - $error = "You must enter a name for your list."; - } else if (mysql_fetch_assoc(sql("SELECT id FROM lists WHERE owner = " . $user['id'] . " AND name = '" . escs($list_name) . "'"))) { - $error = "You already have a list with that title."; - } else if ($list_comment == "") { - $error = "Please enter a comment on your list."; - } else { - sql("INSERT INTO lists(owner, name, comment_md, comment_html) ". - "VALUES(" . $user['id'] . ", '" . escs($list_name) . "', '" . escs($list_comment) . "', '" . escs($list_comment_html) . "')"); - header("Location: view-list-" . mysql_insert_id()); - die(); - } -} - -$title = "Create list"; -$fields = array( - array("label" => "Name : ", "name" => "name", "value" => $list_name), - array("label" => "Comment : ", "name" => "comment", "type" => "textarea", "value" => $list_comment), - ); -$validate = "Create list"; - -require("tpl/list/new.php"); - diff --git a/lib/list/rmbatch.php b/lib/list/rmbatch.php deleted file mode 100644 index 90ea370..0000000 --- a/lib/list/rmbatch.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php - -assert_redir(count($args) >= 3, 'list'); -$batchid = intval($args[2]); - -$batch = mysql_fetch_assoc(sql( - "SELECT lists.id AS listid, lists.owner AS listowner, lists.name AS listname, batches.name AS name, ". - "batches.model AS model, batches.contents AS contents ". - "FROM batches LEFT JOIN lists ON lists.id = batches.list ". - "WHERE batches.id = $batchid")); -assert_error($batch && $batch['listowner'] == $user['id'], - "this batch does not exist, or you are not allowed to edit it."); - -token_validate("Do you really want to delete this batch ?", "view-list-" . $batch['listid']); - -sql("DELETE FROM batches WHERE id = $batchid"); -sql("DELETE FROM batch_study WHERE batch = $batchid"); -sql("DELETE FROM batch_review WHERE batch = $batchid"); -header("Location: view-list-" . $batch['listid']); -die(); diff --git a/lib/list/view.php b/lib/list/view.php deleted file mode 100644 index 2055523..0000000 --- a/lib/list/view.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php - -assert_redir(count($args) == 3, 'list'); -$listid = intval($args[2]); - -$list = mysql_fetch_assoc(sql( - "SELECT lists.id AS id, lists.name AS name, lists.comment_html AS comment, account.login AS owner, ". - "account.id AS owner_id ". - "FROM lists LEFT JOIN account ON account.id = lists.owner ". - "WHERE lists.id = $listid")); -assert_error($list, "This list does not exist."); - -$can_edit = false; -if ($list["owner_id"] == $user['id']) $can_edit = true; - -$batches = array(); -$n = sql( - "SELECT id, name FROM batches WHERE list = $listid ". - "ORDER BY name ASC" - ); -while ($nn = mysql_fetch_assoc($n)) $batches[] = $nn; - -$can_start_study = false; -if ($user['id'] != 0) { - if (!mysql_fetch_assoc(sql("SELECT id FROM list_study WHERE list = $listid AND user = " . $user['id']))) - $can_start_study = true; -} else { - $message = "You should create an account in order to study this list."; -} - -require("tpl/list/view.php"); diff --git a/lib/study/batch.php b/lib/study/batch.php deleted file mode 100644 index 60152f1..0000000 --- a/lib/study/batch.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php - -assert_redir(count($args) == 3, 'study'); -$batchid = intval($args[2]); - -$info = mysql_fetch_assoc(sql( - "SELECT list_study.id AS studyid, batches.name AS bname, ". - "lists.name AS lname, account.login AS uname, ". - "batch_study.id AS bsid, batch_study.notes_json AS notes, ". - "batches.id AS batchid, batches.json_data AS json_data ". - "FROM batches LEFT JOIN list_study ON list_study.list = batches.list AND list_study.user = " . $user['id'] . " " . - "LEFT JOIN batch_study ON batch_study.batch = $batchid AND batch_study.user = " . $user['id'] . " " . - "LEFT JOIN lists ON batches.list = lists.id ". - "LEFT JOIN account ON account.id = lists.owner ". - "WHERE batches.id = $batchid")); -assert_error($info, "This batch does not exist."); -assert_error($info['studyid'] != 0, "You are not studying this list."); - -if ($info["bsid"] == 0) { - sql("INSERT INTO batch_study(user, batch, last_review, notes_json) ". - "VALUES(" . $user['id'] . ", $batchid, 0, '{}')"); - $info['bsid'] = mysql_insert_id(); - $info['notes'] = '{}'; -} - -$reviews = array(); -$d = sql("SELECT results, score, date, batch FROM batch_review WHERE batch = $batchid AND user = " . $user['id'] ." ORDER BY date ASC"); -while ($r = mysql_fetch_assoc($d)) { - $reviews[] = '{"batch": ' . $r['batch'] . ', "date" : "' . $r['date'] . '", '. - '"score": ' . $r['score'] . ', "results": ' . $r['results'] . '}'; -} -$reviews = '[' . implode(', ', $reviews) . ']'; - -require("tpl/study/batch.php"); diff --git a/lib/study/batchreview.php b/lib/study/batchreview.php deleted file mode 100644 index 58fc852..0000000 --- a/lib/study/batchreview.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -assert_redir(count($args) == 3, 'study'); -$batchid = intval($args[2]); - -$info = mysql_fetch_assoc(sql( - "SELECT list_study.id AS studyid, batches.name AS bname, ". - "lists.name AS lname, account.login AS uname, ". - "batch_study.id AS bsid, batch_study.notes_json AS notes, ". - "batches.id AS batchid, batches.json_data AS json_data ". - "FROM batches LEFT JOIN list_study ON list_study.list = batches.list AND list_study.user = " . $user['id'] . " " . - "LEFT JOIN batch_study ON batch_study.batch = $batchid AND batch_study.user = " . $user['id'] . " " . - "LEFT JOIN lists ON batches.list = lists.id ". - "LEFT JOIN account ON account.id = lists.owner ". - "WHERE batches.id = $batchid")); -assert_error($info, "This batch does not exist."); -assert_error($info['studyid'] != 0, "You are not studying this list."); - -if ($info["bsid"] == 0) { - sql("INSERT INTO batch_study(user, batch, last_review, notes_json) VALUES(" . $user['id'] . ", $batchid, 0, '{}')"); - $info['bsid'] = mysql_insert_id(); - $info['notes'] = '{}'; -} - -require("tpl/study/batch_review.php"); diff --git a/lib/study/brresults.php b/lib/study/brresults.php deleted file mode 100644 index 93ebfdf..0000000 --- a/lib/study/brresults.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php - -assert_redir(count($args) == 3, 'study'); -$batchid = intval($args[2]); - -$info = mysql_fetch_assoc(sql( - "SELECT list_study.id AS studyid, ". - "batch_study.id AS bsid, batches.id AS batchid, batches.json_data AS json_data ". - "FROM batches LEFT JOIN list_study ON list_study.list = batches.list AND list_study.user = " . $user['id'] . " " . - "LEFT JOIN batch_study ON batch_study.batch = $batchid AND batch_study.user = " . $user['id'] . " " . - "WHERE batches.id = $batchid")); -if (!($info)) { - echo "This batch does not exist"; - die(); -} -if (!($info['studyid'] != 0)) { - echo "You are not studying this list."; - die(); -} - -if ($info["bsid"] == 0) { - sql("INSERT INTO batch_study(user, batch, last_review, notes_json) ". - "VALUES(" . $user['id'] . ", $batchid, 0, '{}')"); - $info['bsid'] = mysql_insert_id(); - $info['notes'] = '{}'; -} - -if (isset($_POST['results']) && isset($_POST['score'])) { - sql("UPDATE batch_study SET before_last_review = last_review WHERE id = " . $info['bsid']); - sql("INSERT INTO batch_review(user, batch, results, score, date) ". - "VALUES(" . $user['id'] . ", $batchid, '" . escs(esca($_POST['results'])) . "', " . intval($_POST['score']) . ", NOW())"); - sql("UPDATE batch_study SET last_review = " . mysql_insert_id() . " WHERE id = " . $info['bsid']); - echo 'Saved'; -} else if (isset($_POST['notes'])) { - sql("UPDATE batch_study SET notes_json = '" . escs(esca($_POST['notes'])) . "' WHERE id = " . $info['bsid']); - echo 'Saved'; -} else { - echo 'Error'; -} - -die(); diff --git a/lib/study/deck.php b/lib/study/deck.php deleted file mode 100644 index 752ff98..0000000 --- a/lib/study/deck.php +++ /dev/null @@ -1,96 +0,0 @@ -<?php - -assert_redir(count($args) == 3, 'study'); -$studyid = intval($args[2]); - -$study = mysql_fetch_assoc(sql( - "SELECT decks.id AS deckid, decks.name AS deckname, account.login AS deckowner, ". - " deck_study.learn_rate AS learn_rate, deck_study.user AS learn_user, deck_study.need_check AS need_check, deck_study.last_card AS last_card ". - "FROM deck_study LEFT JOIN decks ON deck_study.deck = decks.id LEFT JOIN account ON account.id = decks.owner ". - "WHERE deck_study.id = $studyid")); -assert_error($study && $study['learn_user'] == $user['id'], "You are not at the right place here."); - -if ($study['need_check']) { - /* Algorithm : - - Delete references to deleted cards - - Check that deck_study.last_card = max(card_study.card.number) - - Check that foreach (card where card.deck = deck_study.deck && card.number < deck_study.last_card), - exists corresponding card_study, if not exist, create level 0 (skipped) - */ - $n = sql("SELECT card_study.id AS id, cards.deck AS d FROM card_study ". - "LEFT JOIN cards ON cards.id = card_study.card WHERE card_study.deck_study = $studyid"); - while ($r = mysql_fetch_assoc($n)) { - if (intval($r['d']) == 0) { - sql("DELETE FROM card_study WHERE id = " . $r['id']); - } - } - $mcn = mysql_fetch_assoc(sql("SELECT MAX(cards.number) AS mcn FROM deck_study ". - "LEFT JOIN card_study ON card_study.deck_study = deck_study.id LEFT JOIN cards ON cards.id = card_study.card ". - "WHERE deck_study.id = $studyid")); - $hasmoar = false; - if ($mcn) { - $mcn = $mcn['mcn']; - if ($study['last_card'] != $mcn) sql('UPDATE deck_study SET last_card = ' . $mcn . ' WHERE id = ' . $studyid); - - $cs = array(); - for($i = 1; $i < $mcn; $i++) $cs[$i] = 0; - - $d = sql("SELECT cards.number AS n, card_study.id AS i FROM card_study LEFT JOIN cards ON cards.id = card_study.card ". - "WHERE card_study.deck_study = $studyid"); - while($r = mysql_fetch_assoc($d)) $cs[$r['n']] = $r['i']; - - for ($i = 1; $i < $mcn; $i++) { - if ($cs[$i] == 0) { - $n = mysql_fetch_assoc(sql("SELECT cards.id AS id FROM deck_study LEFT JOIN cards ON cards.deck = deck_study.deck AND cards.number = $i ". - "WHERE deck_study.id = $studyid")); - assert_error($n, "Fucking deck inconsistency."); - sql("INSERT INTO card_study(deck_study, card, level, next_review) ". - "VALUES($studyid, " . $n['id'] . ", 0, ADDDATE(CURDATE(), INTERVAL 999999 DAY))"); - $hasmoar = true; - } - } - } - sql("UPDATE deck_study SET need_check = 0 WHERE id = $studyid"); - $message = "This deck has been checked. " . ($hasmoar ? "Some cards you hadn't studied before were added to your skipped list." : ""); -} - - -$load = mysql_fetch_assoc(sql("SELECT SUM(4 - level) AS l FROM card_study WHERE deck_study = $studyid AND level < 4 AND level > 0")); -$load = intval($load['l']); - -if ($load < $study['learn_rate']) { - $next_card = mysql_fetch_assoc(sql("SELECT * FROM cards WHERE deck = " . $study['deckid'] . " AND number = " . ($study['last_card'] + 1))); -} - - - -$filters = array( - "what" => array( - "level > 0 AND next_review <= CURDATE()" => "study today", - "level > 0 AND level < 4" => "learning", - "level > 0" => "all except skipped", - "level = 0" => "skipped", - ), - "order" => array( - "level" => "level", - "number" => "card number", - ), - "way" => $ord_ways, -); -$fdefaults = array( - "what" => "level > 0 AND next_review <= CURDATE()", - "order" => "level", - "way" => "ASC", -); - -$study_cards = array(); -$s = sql( - "SELECT cards.id AS id, cards.name AS name, cards.text_html AS text, cards.number AS number, ". - "card_study.level AS level, card_study.next_review <= CURDATE() AS must_study ". - "FROM card_study LEFT JOIN cards ON card_study.card = cards.id WHERE deck_study = $studyid AND " . get_filter("what") . - " ORDER BY " . get_filter("order") . " " . get_filter('way') . (get_filter("order") == "level" ? ", number " . get_filter("way") : "")); -while ($ss = mysql_fetch_assoc($s)) $study_cards[] = $ss; - - - -require("tpl/study/deck.php"); diff --git a/lib/study/deckadd.php b/lib/study/deckadd.php deleted file mode 100644 index b95648c..0000000 --- a/lib/study/deckadd.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php - -assert_redir(count($args) == 3, 'deck'); -$deckid = intval($args[2]); -$deck = mysql_fetch_assoc(sql("SELECT id FROM decks WHERE id = $deckid")); -assert_error($deck, "This deck does not exist."); - -assert_error(!mysql_fetch_assoc(sql("SELECT id FROM deck_study WHERE deck = $deckid AND user = " . $user['id'])), - "You are already studying this deck."); - -sql("INSERT INTO deck_study(user, deck) VALUES(" . $user['id'] . ", $deckid)"); -header("Location: deck-study-".mysql_insert_id()); -die(); diff --git a/lib/study/deckrm.php b/lib/study/deckrm.php deleted file mode 100644 index 6b4e803..0000000 --- a/lib/study/deckrm.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php - -assert_redir(count($args) >= 3, 'study'); -$studyid = intval($args[2]); - -$study = mysql_fetch_assoc(sql( - "SELECT ". - " deck_study.user AS learn_user ". - "FROM deck_study ". - "WHERE deck_study.id = $studyid")); -assert_error($study && $study['learn_user'] == $user['id'], "You are not at the right place here."); - -token_validate("Do you really want to remove this deck from your studies ? ALL YOUR PROGRESS WILL BE LOST!", "deck-study-$studyid"); -sql("DELETE FROM card_study WHERE deck_study = $studyid"); -sql("DELETE FROM deck_study WHERE id = $studyid"); -header("Location: study"); -die(); diff --git a/lib/study/index.php b/lib/study/index.php deleted file mode 100644 index 6b43d53..0000000 --- a/lib/study/index.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -if ($user['id'] == 0) { - $message = "You must create an account to use this study program."; -} - -require("tpl/study/index.php"); diff --git a/lib/study/list.php b/lib/study/list.php deleted file mode 100644 index bebffa6..0000000 --- a/lib/study/list.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php - -assert_redir(count($args) == 3, 'study'); -$studyid = intval($args[2]); - -$study = mysql_fetch_assoc(sql( - "SELECT lists.id AS listid, lists.name AS listname, account.login AS listowner, ". - " list_study.user AS learn_user ". - "FROM list_study LEFT JOIN lists ON list_study.list = lists.id LEFT JOIN account ON account.id = lists.owner ". - "WHERE list_study.id = $studyid")); -assert_error($study && $study['learn_user'] == $user['id'], "You are not at the right place here."); - -$filters = array( - "order" => array( - "name" => "name", - "lr_score" => "last score", - "lr_date" => "last reviewed" - ), - "way" => $ord_ways, -); -$fdefaults = array( - "order" => "name", - "way" => "ASC", -); - -$batches = array(); -$n = sql( - "SELECT batches.id AS id, batches.name AS name, ". - "batch_study.id AS bs_id, ba.date AS lr_date, TO_DAYS(NOW()) - TO_DAYS(ba.date) AS lr_days, ". - "ba.score AS lr_score, bc.date AS blr_date, bc.score AS blr_score, ". - "COUNT(bb.id) AS num_reviews ". - "FROM batches ". - "LEFT JOIN batch_study ON batch_study.batch = batches.id AND batch_study.user = " . $user['id'] . " " . - "LEFT JOIN batch_review ba ON ba.id = batch_study.last_review ". - "LEFT JOIN batch_review bb ON bb.batch = batches.id AND bb.user = " . $user['id'] . " ". - "LEFT JOIN batch_review bc ON bc.id = batch_study.before_last_review ". - "WHERE batches.list = " . $study['listid'] . " " . - "GROUP BY batches.id ". - "ORDER BY " . get_filter("order") . " " . get_filter("way") - ); -while ($b = mysql_fetch_assoc($n)) $batches[] = $b; - -require("tpl/study/list.php"); diff --git a/lib/study/listadd.php b/lib/study/listadd.php deleted file mode 100644 index 536ab1d..0000000 --- a/lib/study/listadd.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php - -assert_redir(count($args) == 3, 'list'); -$listid = intval($args[2]); -$list = mysql_fetch_assoc(sql("SELECT id FROM lists WHERE id = $listid")); -assert_error($list, "This list does not exist."); - -assert_error(!mysql_fetch_assoc(sql("SELECT id FROM list_study WHERE list = $listid AND user = " . $user['id'])), - "You are already studying this list."); - -sql("INSERT INTO list_study(user, list) VALUES(" . $user['id'] . ", $listid)"); -header("Location: list-study-".mysql_insert_id()); -die(); diff --git a/lib/study/listrm.php b/lib/study/listrm.php deleted file mode 100644 index a761e97..0000000 --- a/lib/study/listrm.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php - -assert_redir(count($args) >= 3, 'study'); -$studyid = intval($args[2]); - -$study = mysql_fetch_assoc(sql( - "SELECT ". - " list_study.user AS learn_user ". - "FROM list_study ". - "WHERE list_study.id = $studyid")); -assert_error($study && $study['learn_user'] == $user['id'], "You are not at the right place here."); - -token_validate("Do you really want to remove this list from your studies ? Your progress will not be lost.", "list-study-$studyid"); -sql("DELETE FROM list_study WHERE id = $studyid"); -header("Location: study"); -die(); diff --git a/lib/study/setcard.php b/lib/study/setcard.php deleted file mode 100644 index c71bbfe..0000000 --- a/lib/study/setcard.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php - -assert_redir(count($args) == 4, 'study'); -$cardid = intval($args[2]); - -$info = mysql_fetch_assoc(sql( - "SELECT deck_study.id AS studyid, deck_study.last_card AS last_card, deck_study.need_check AS need_check, ". - "card_study.id AS csid, cards.id AS cardid, cards.number AS cardnumber ". - "FROM cards LEFT JOIN deck_study ON deck_study.deck = cards.deck AND deck_study.user = " . $user['id'] . " ". - "LEFT JOIN card_study ON card_study.deck_study = deck_study.id AND card_study.card = $cardid ". - "WHERE cards.id = $cardid" - )); -assert_error($info, "This card does not exist."); - -$studyid = intval($info['studyid']); -assert_error($studyid > 0, "You are not studying this deck."); - -assert_error($info['need_check'] == 0, - 'This deck needs checking first. Please return <a href="deck-study-'.$studyid.'">here</a> first, it should do it.'); - -assert_error($info['cardnumber'] <= $info['last_card'] + 1, "You must first add previous cards to your study list."); - -$level = intval($args[3]); -assert_error($level >= 0 && $level <= 7, "That level is invalid."); -$intervals = array(999999, 1, 2, 4, 8, 16, 32, 999999); - -if ($info['cardnumber'] == $info['last_card'] + 1) { - sql("INSERT INTO card_study(deck_study, card, level, next_review) ". - "VALUES($studyid, $cardid, $level, ADDDATE(CURDATE(), INTERVAL " . $intervals[$level] . " DAY))"); - sql("UPDATE deck_study SET last_card = last_card + 1 WHERE id = $studyid"); -} else { - assert_error($info['csid'] > 0, "Deck is inconsistent."); - sql("UPDATE card_study SET level = $level, next_review = ADDDATE(CURDATE(), INTERVAL " . $intervals[$level] . " DAY) WHERE id = " . $info['csid']); -} - -header("Location: deck-study-$studyid"); -die(); diff --git a/lib/study/setrate.php b/lib/study/setrate.php deleted file mode 100644 index f893eb9..0000000 --- a/lib/study/setrate.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php - -assert_redir(count($args) >= 3, 'study'); -$studyid = intval($args[2]); - -$study = mysql_fetch_assoc(sql( - "SELECT decks.id AS deckid, decks.name AS deckname, account.login AS deckowner, ". - " deck_study.learn_rate AS learn_rate, deck_study.user AS learn_user ". - "FROM deck_study LEFT JOIN decks ON deck_study.deck = decks.id LEFT JOIN account ON account.id = decks.owner ". - "WHERE deck_study.id = $studyid")); -assert_error($study && $study['learn_user'] == $user['id'], "You are not at the right place here."); - -if (isset($args[3]) && ($rate = intval($args[3])) > 0) { - sql("UPDATE deck_study SET learn_rate = $rate WHERE id = $studyid"); - header("Location: deck-study-$studyid"); - die(); -} - -include ("tpl/study/setrate.php"); |