diff --git a/application/config.php b/application/config.php
index a7569ee..70dcfea 100644
--- a/application/config.php
+++ b/application/config.php
@@ -1,5 +1,5 @@
-run();
\ No newline at end of file
diff --git a/migrations.php b/migrations.php
new file mode 100644
index 0000000..ac9ef3d
--- /dev/null
+++ b/migrations.php
@@ -0,0 +1,18 @@
+runMigrations();
\ No newline at end of file
diff --git a/system/engine/SMTP.php b/system/engine/SMTP.php
deleted file mode 100644
index 7a7a5df..0000000
--- a/system/engine/SMTP.php
+++ /dev/null
@@ -1,80 +0,0 @@
-from = $from;
- $this->to = $to;
- $this->subject = $subject;
- $this->msg = $msg;
- $this->user = $user;
- $this->password = $password;
- $this->port = $port;
- $this->server = $server;
- }
-
- public function send($html=false)
- {
- $err = null;
- $errstr = "";
- $this->smtpserverconn = fsockopen($this->server, $this->port, $err, $errstr, 100);
- $response = fgets($this->smtpserverconn, 515);
- if ($response === false)
- {
- throw new Exception("Could not connect to SMTP server!");
- }
-
- if ($this->user != null && $this->password != null)
- {
- $this->sendCommand("AUTH LOGIN");
- $this->sendCommand(base64_encode($this->user));
- $this->sendCommand(base64_encode($this->password));
- }
-
- $this->sendCommand("HELO " . $_SERVER["SERVER_NAME"]);
- $this->sendCommand("MAIL FROM: " . $this->from);
- $this->sendCommand("RCPT TO: " . $this->to);
- $this->sendCommand("DATA");
-
- if ($html)
- {
- $this->sendCommand("MIME-Version: 1.0", false);
- $this->sendCommand("Content-type: text/html; charset=iso-8859-1", false);
- }
-
- $this->sendCommand("From: " . $this->from, false);
- $this->sendCommand("To: " . $this->to, false);
- $this->sendCommand("Subject: " . $this->subject, false);
-
-
- $this->sendCommand($this->msg, false);
-
- $this->sendCommand("", false);
- $this->sendCommand(".", false);
- $this->sendCommand("QUIT");
-
- }
-
- private function sendCommand($command, $return = true)
- {
- fputs($this->smtpserverconn, $command . "\r\n");
- if ($return)
- return fgets($this->smtpserverconn, 515);
- else
- return null;
- }
-}
\ No newline at end of file
diff --git a/system/engine/config-default.php b/system/engine/config-default.php
index 0120424..d91e51a 100644
--- a/system/engine/config-default.php
+++ b/system/engine/config-default.php
@@ -1,15 +1,15 @@
-config = $config;
- $this->tpl = $tpl;
- $this->core = $core;
- $this->initdb();
- }
-
- protected function initdb()
- {
- if (isvarset($this->config["MYSQL_DBNAME"]) && isvarset($this->config["MYSQL_USER"]))
- {
- $pdo = new PDO(
- "mysql:dbname={$this->config['MYSQL_DBNAME']};host={$this->config['MYSQL_HOST']}",
- $this->config['MYSQL_USER'],
- $this->config['MYSQL_PASS'],
- array(
- PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
- PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
- PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
- )
- );
-
- DB::$c = $pdo;
- }
- }
-
- public function loadRender($template, $parameters=array())
- {
- $this->tpl->loadTemplate($template);
- return $this->tpl->render($parameters);
- }
-
-}
\ No newline at end of file
diff --git a/system/engine/core.php b/system/engine/core.php
deleted file mode 100644
index 7472b90..0000000
--- a/system/engine/core.php
+++ /dev/null
@@ -1,277 +0,0 @@
-starttime = microtime(true);
- $config = include("system/engine/config-default.php");
- if (is_file("application/config.php"))
- {
- $newconfig = include("application/config.php");
- }
- $this->config = array_merge($config, $newconfig);
- if ($this->config["USE_H20_TPL"])
- $this->tpl = new H2o(null, array(
- "searchpath" => getcwd() . "/application/views/",
- "cache_dir" => "application/tmp/",
- 'cache' => 'file'
- ));
- set_error_handler("HF_Core::error_handler");
- $this->findController();
- }
-
- public function getRuntime()
- {
- return $this->starttime - microtime(true);
- }
-
- public function siteURL()
- {
- if (isvarset($this->config["SITE_URL"]))
- {
- return $this->config["SITE_URL"];
- }
- $path = explode("/", $_SERVER["REQUEST_URI"]);
- $path = array_filter($path, 'strlen');
- if (count($path) == 0)
- {
- return $_SERVER["HTTP_HOST"] . "/";
- } else {
- if (in_array($this->classname, $path))
- {
- $newpath = implode("/", array_splice($path, 0, -2));
- return $_SERVER["HTTP_HOST"] . "/" . $newpath . "/";
- } else {
- $newpath = implode("/", $path);
- return $_SERVER["HTTP_HOST"] . "/" . $newpath . "/";
- }
- }
- }
-
- private function findController()
- {
- try
- {
- if (isvarset($_SERVER["PATH_INFO"]))
- {
- $request = $_SERVER["PATH_INFO"];
- //$request = $_SERVER["PHP_SELF"];
- $splitreq = explode("/", $request);
- /*$request = "";
- for($i = 0; $i < count($splitreq); $i++)
- {
- if ($splitreq[$i] == "index.php")
- {
- $request = implode("/", array_splice($splitreq, $i+1));
- }
- }*/
- //print $request;
- //$request = substr($request, 1);
- //$request = substr($request, 0, -1);
- } else {
- $request = "";
- }
- if ($request == "" || $request == "/")
- {
- require("application/controllers/" . $this->config["DEFAULT_ROUTE"] . ".php");
- $this->loadController(new $this->config["DEFAULT_ROUTE"]($this->config, $this, $this->tpl), $this->config["DEFAULT_ROUTE"], "index");
- return;
- }
- if ($request[strlen($request)-1] == "/")
- $request = substr($request, 0, -1);
- $arr = explode("/", $request);
- $path = "application/controllers/";
- for($i = 0; $i < count($arr); $i++)
- {
- if (is_file($path . $arr[$i] . ".php")) // found the controller
- {
- include($path . $arr[$i] . ".php");
- if ($i + 1 < count($arr)) // if there is a define after the controller name - this would be the method name
- {
- $this->loadController(new $arr[$i]($this->config, $this, $this->tpl), $arr[$i], $arr[$i+1], array_slice ($arr, 2));
- } else { // call index
- $this->loadController(new $arr[$i]($this->config, $this, $this->tpl), $arr[$i], "index");
- }
- return;
- }
-
- if (is_dir($path . $arr[$i])) // controller is hidden deeper
- {
- $path = $path . $arr[$i] . "/";
- continue;
- }
-
- include($path . $this->config["DEFAULT_ROUTE"] . ".php");
- $this->loadController(new $this->config["DEFAULT_ROUTE"]($this->config, $this, $this->tpl), $this->config["DEFAULT_ROUTE"], "index");
- //$this->load404Controller();
- break;
- // throw exception controller not found
- }
- } catch (Exception $e) {
- if ($this->config["DEBUG"])
- echo vdump($e, $this);
- else
- $this->mail_admins("[Exception - " . $this->config["SITE_NAME"] . "]", vdump($e, $this), true);
- }
- }
-
- private function load404Controller()
- {
- if (is_file(getcwd() . "/application/status.php"))
- {
- include_once (getcwd() . "/application/status.php");
- $this->loadController(new status($this->config, $this, $this->tpl), "status", "Status404");
- } else {
- include_once(getcwd() . "/system/engine/status.php");
- $this->loadController(new HF_Status($this->config, $this, $this->tpl), "HF_Status", "Status404");
-
- }
- }
-
- private function load500Controller()
- {
- if (is_file(getcwd() . "/application/status.php"))
- {
- include_once (getcwd() . "/application/status.php");
- $this->loadController(new status($this->config, $this, $this->tpl), "status", "Status500");
- } else {
- include_once (getcwd() . "/system/engine/status.php");
- $this->loadController(new HF_Status($this->config, $this, $this->tpl), "HF_Status", "Status500");
-
- }
- }
-
- private function loadController($class, $classname, $method, $args = array())
- {
- $this->class = $class;
- $this->classname = $classname;
- $this->method = $method;
- $this->args = $args;
- }
-
- public function run($err=false)
- {
- try
- {
- $call = new ReflectionMethod($this->classname, $this->method);
- if ($err)
- {
- $call->invokeArgs($this->class, $this->args);
- return;
- }
-
- $numOfReqPara = $call->getNumberOfRequiredParameters();
- $numOfOptPara = $call->getNumberOfParameters() - $numOfReqPara;
- $remainparas = count($this->args) - $numOfReqPara;
- if ($numOfReqPara == 0 || ($remainparas >= 0 && $remainparas <= $numOfOptPara))
- {
- $call->invokeArgs($this->class, $this->args);
- }
- else
- {
- $this->load404Controller();
- $this->run(true);
- }
-
- } catch (ReflectionException $e)
- {
- if (strstr($e->getMessage(), "does not exist") !== false)
- {
- $this->load404Controller();
- } else {
- $this->load500Controller();
- }
- $this->run(true);
- if ($this->config["DEBUG"])
- echo vdump($e, $this);
- else
- $this->mail_admins("[Exception - " . $this->config["SITE_NAME"] . "]", vdump($e, $this), true);
-
-
- } catch (Exception $e) {
- $this->load500Controller();
- $this->run(true);
- if ($this->config["DEBUG"])
- echo vdump($e, $this);
- else
- $this->mail_admins("[Exception - " . $this->config["SITE_NAME"] . "]", vdump($e, $this), true);
- }
- }
-
- public function mail_admins($subject, $msg, $html = false)
- {
- if (array_key_exists("ADMINS", $this->config))
- {
- foreach($this->config["ADMINS"] as $email)
- {
- $this->mail_user($email, $subject, $msg, $html);
- }
- }
- }
-
- public function mail_user($to, $subject, $msg, $html = false)
- {
- if ($this->config["USE_HF_SMTP"])
- {
- $smtp = new HF_SMTP($this->config["SMTP_FROM"], $to, $subject, $msg, $this->config["SMTP_SERVER"], $this->config["SMTP_USER"], $this->config["SMTP_PASS"], $this->config["SMTP_PORT"]);
- $smtp->send($html);
- } else {
- require_once "Mail.php";
- $smtp = null;
- if ($this->$this->config["SMTP_USER"] && $this->config["SMTP_PASS"])
- $smtp = Mail::factory('smtp', array(
- "host" => $this->config["SMTP_SERVER"],
- "port" => $this->config["SMTP_PORT"],
- "auth" => true,
- 'username' => $this->config["SMTP_USER"],
- 'password' => $this->config["SMTP_PASS"]
- ));
- else
- $smtp = Mail::factory('smtp', array(
- "host" => $this->config["SMTP_SERVER"],
- "port" => $this->config["SMTP_PORT"]
- ));
- $headers = array ('From' => $this->config["SMTP_FROM"],
- 'To' => $to,
- 'Subject' => $subject);
- $smtp->send($to, $headers, $msg);
- }
- }
-
- public static function error_handler($err_severity, $err_msg, $err_file, $err_line, array $err_context)
- {
- if (0 === error_reporting()) { return false;}
- switch($err_severity)
- {
- case E_ERROR: throw new ErrorException ($err_msg, 0, $err_severity, $err_file, $err_line);
- case E_WARNING: throw new WarningException ($err_msg, 0, $err_severity, $err_file, $err_line);
- case E_PARSE: throw new ParseException ($err_msg, 0, $err_severity, $err_file, $err_line);
- case E_NOTICE: throw new NoticeException ($err_msg, 0, $err_severity, $err_file, $err_line);
- case E_CORE_ERROR: throw new CoreErrorException ($err_msg, 0, $err_severity, $err_file, $err_line);
- case E_CORE_WARNING: throw new CoreWarningException ($err_msg, 0, $err_severity, $err_file, $err_line);
- case E_COMPILE_ERROR: throw new CompileErrorException ($err_msg, 0, $err_severity, $err_file, $err_line);
- case E_COMPILE_WARNING: throw new CoreWarningException ($err_msg, 0, $err_severity, $err_file, $err_line);
- case E_USER_ERROR: throw new UserErrorException ($err_msg, 0, $err_severity, $err_file, $err_line);
- case E_USER_WARNING: throw new UserWarningException ($err_msg, 0, $err_severity, $err_file, $err_line);
- case E_USER_NOTICE: throw new UserNoticeException ($err_msg, 0, $err_severity, $err_file, $err_line);
- case E_STRICT: throw new StrictException ($err_msg, 0, $err_severity, $err_file, $err_line);
- case E_RECOVERABLE_ERROR: throw new RecoverableErrorException ($err_msg, 0, $err_severity, $err_file, $err_line);
- case E_DEPRECATED: throw new DeprecatedException ($err_msg, 0, $err_severity, $err_file, $err_line);
- case E_USER_DEPRECATED: throw new UserDeprecatedException ($err_msg, 0, $err_severity, $err_file, $err_line);
- }
-
- }
-}
\ No newline at end of file
diff --git a/system/engine/exceptions.php b/system/engine/exceptions.php
index 69b0076..dd1b130 100644
--- a/system/engine/exceptions.php
+++ b/system/engine/exceptions.php
@@ -1,18 +1,20 @@
-config = $config;
+ $this->tpl = $tpl;
+ $this->core = $core;
+ }
+
+ protected function loadRender($template, $parameters=array())
+ {
+ $this->tpl->loadTemplate($template);
+ return $this->tpl->render($parameters);
+ }
+
+}
\ No newline at end of file
diff --git a/system/engine/hf_core.php b/system/engine/hf_core.php
new file mode 100644
index 0000000..bb42246
--- /dev/null
+++ b/system/engine/hf_core.php
@@ -0,0 +1,365 @@
+config = array_merge($config, $newconfig);
+ \vendor\DB\DB::$type = $config["DATABASE_TYPE"];
+ if ($this->config["USE_H20_TPL"])
+ $this->tpl = new \H2o(null, array(
+ "searchpath" => getcwd() . "/application/views/",
+ "cache_dir" => "application/tmp/",
+ 'cache' => 'file'
+ ));
+ set_error_handler("\\system\\engine\\HF_Core::error_handler");
+ //set_exception_handler("\\system\\engine\\HF_Core::exception_handler");
+ if (!$migrations)
+ $this->findController();
+ }
+
+ public static function exception_handler($e) {
+ echo "Hello";
+ }
+
+ public function siteURL()
+ {
+ if (isvarset($this->config["SITE_URL"]))
+ {
+ return $this->config["SITE_URL"];
+ }
+ $path = explode("/", $_SERVER["REQUEST_URI"]);
+ $path = array_filter($path, 'strlen');
+ if (count($path) == 0)
+ {
+ return $_SERVER["HTTP_HOST"] . "/";
+ } else {
+ if (in_array($this->classname, $path))
+ {
+ $newpath = implode("/", array_splice($path, 0, -2));
+ return $_SERVER["HTTP_HOST"] . "/" . $newpath . "/";
+ } else {
+ $newpath = implode("/", $path);
+ return $_SERVER["HTTP_HOST"] . "/" . $newpath . "/";
+ }
+ }
+ }
+
+ private function findController()
+ {
+ try
+ {
+ if (isvarset($_SERVER["PATH_INFO"]))
+ {
+ $request = $_SERVER["PATH_INFO"];
+ //$request = $_SERVER["PHP_SELF"];
+ $splitreq = explode("/", $request);
+ /*$request = "";
+ for($i = 0; $i < count($splitreq); $i++)
+ {
+ if ($splitreq[$i] == "index.php")
+ {
+ $request = implode("/", array_splice($splitreq, $i+1));
+ }
+ }*/
+ //print $request;
+ //$request = substr($request, 1);
+ //$request = substr($request, 0, -1);
+ } else {
+ $request = "";
+ }
+ if ($request == "" || $request == "/")
+ {
+ require_once("application/controllers/" . $this->config["DEFAULT_ROUTE"] . ".php");
+ $this->loadController(new $this->config["DEFAULT_ROUTE"]($this->config, $this, $this->tpl), $this->config["DEFAULT_ROUTE"], "index");
+ return;
+ }
+ if ($request[strlen($request)-1] == "/")
+ $request = substr($request, 0, -1);
+ $arr = explode("/", $request);
+ $path = "application/controllers/";
+ for($i = 0; $i < count($arr); $i++)
+ {
+ if (is_file($path . $arr[$i] . ".php")) // found the controller
+ {
+ include_once($path . $arr[$i] . ".php");
+ if ($i + 1 < count($arr)) // if there is a define after the controller name - this would be the method name
+ {
+ $this->loadController(new $arr[$i]($this->config, $this, $this->tpl), $arr[$i], $arr[$i+1], array_slice ($arr, 3));
+ } else { // call index
+ $this->loadController(new $arr[$i]($this->config, $this, $this->tpl), $arr[$i], "index");
+ }
+ return;
+ }
+
+ if (is_dir($path . $arr[$i])) // controller is hidden deeper
+ {
+ $path = $path . $arr[$i] . "/";
+ continue;
+ }
+
+ include_once($path . $this->config["DEFAULT_ROUTE"] . ".php");
+ $this->loadController(new $this->config["DEFAULT_ROUTE"]($this->config, $this, $this->tpl), $this->config["DEFAULT_ROUTE"], "index");
+ //$this->load404Controller();
+ break;
+ // throw exception controller not found
+ }
+ } catch (\Exception $e) {
+ if ($this->config["DEBUG"])
+ echo vdump($e, $this);
+ else
+ $this->mail_admins("[Exception - " . $this->config["SITE_NAME"] . "]", vdump($e, $this), true);
+ }
+ }
+
+ private function load404Controller()
+ {
+ if (is_file(getcwd() . "/application/status.php"))
+ {
+ include_once (getcwd() . "/application/status.php");
+ $this->loadController(new HF_Status($this->config, $this, $this->tpl), "\\system\\engine\\HF_Status", "Status404");
+ } else {
+ include_once(getcwd() . "/system/engine/status.php");
+ $this->loadController(new HF_Status($this->config, $this, $this->tpl), "\\system\\engine\\HF_Status", "Status404");
+
+ }
+ }
+
+ private function load500Controller()
+ {
+ if (is_file(getcwd() . "/application/status.php"))
+ {
+ include_once (getcwd() . "/application/status.php");
+ $this->loadController(new HF_Status($this->config, $this, $this->tpl), "\\system\\engine\\HF_Status", "Status500");
+ } else {
+ include_once (getcwd() . "/system/engine/status.php");
+ $this->loadController(new HF_Status($this->config, $this, $this->tpl), "\\system\\engine\\HF_Status", "Status500");
+
+ }
+ }
+
+ private function loadController($class, $classname, $method, $args = array())
+ {
+ $this->class = $class;
+ $this->classname = $classname;
+ $this->method = $method;
+ $this->args = $args;
+ }
+
+ public function run($err=false)
+ {
+ try
+ {
+ $call = new \ReflectionMethod($this->classname, $this->method);
+ if ($err)
+ {
+ $call->invokeArgs($this->class, $this->args);
+ return;
+ }
+
+ $numOfReqPara = $call->getNumberOfRequiredParameters();
+ $numOfOptPara = $call->getNumberOfParameters() - $numOfReqPara;
+ $remainparas = count($this->args) - $numOfReqPara;
+ if ($numOfReqPara == 0 || ($remainparas >= 0 && $remainparas <= $numOfOptPara))
+ {
+ $call->invokeArgs($this->class, $this->args);
+ }
+ else
+ {
+ $this->load404Controller();
+ $this->run(true);
+ }
+
+ }
+ catch (\ReflectionException $e)
+ {
+ if (strstr($e->getMessage(), "does not exist") !== false)
+ {
+ $this->load404Controller();
+ } else {
+ $this->load500Controller();
+ }
+ $this->run(true);
+ if ($this->config["DEBUG"])
+ echo vdump($e, $this);
+ else
+ $this->mail_admins("[Exception - " . $this->config["SITE_NAME"] . "]", vdump($e, $this), true);
+
+
+ } catch (\Exception $e) {
+ $this->load500Controller();
+ $this->run(true);
+ if ($this->config["DEBUG"])
+ echo vdump($e, $this);
+ else
+ $this->mail_admins("[Exception - " . $this->config["SITE_NAME"] . "]", vdump($e, $this), true);
+ }
+ }
+
+ public function mail_admins($subject, $msg, $html = false)
+ {
+ if (array_key_exists("ADMINS", $this->config))
+ {
+ foreach($this->config["ADMINS"] as $email)
+ {
+ $this->mail_user($email, $subject, $msg, $html);
+ }
+ }
+ }
+
+ public function mail_user($to, $subject, $msg, $html = false)
+ {
+ if ($this->config["USE_HF_SMTP"])
+ {
+ $smtp = new HF_SMTP($this->config["SMTP_FROM"], $to, $subject, $msg, $this->config["SMTP_SERVER"], $this->config["SMTP_USER"], $this->config["SMTP_PASS"], $this->config["SMTP_PORT"]);
+ $smtp->send($html);
+ } else {
+ require_once "Mail.php";
+ $smtp = null;
+ if ($this->$this->config["SMTP_USER"] && $this->config["SMTP_PASS"])
+ $smtp = Mail::factory('smtp', array(
+ "host" => $this->config["SMTP_SERVER"],
+ "port" => $this->config["SMTP_PORT"],
+ "auth" => true,
+ 'username' => $this->config["SMTP_USER"],
+ 'password' => $this->config["SMTP_PASS"]
+ ));
+ else
+ $smtp = Mail::factory('smtp', array(
+ "host" => $this->config["SMTP_SERVER"],
+ "port" => $this->config["SMTP_PORT"]
+ ));
+ $headers = array ('From' => $this->config["SMTP_FROM"],
+ 'To' => $to,
+ 'Subject' => $subject);
+ $smtp->send($to, $headers, $msg);
+ }
+ }
+
+ public static function error_handler($err_severity, $err_msg, $err_file, $err_line, array $err_context)
+ {
+ if (0 === error_reporting()) { return false;}
+ switch($err_severity)
+ {
+ case E_ERROR: throw new \ErrorException ($err_msg, 0, $err_severity, $err_file, $err_line);
+ case E_WARNING: throw new WarningException ($err_msg, 0, $err_severity, $err_file, $err_line);
+ case E_PARSE: throw new ParseException ($err_msg, 0, $err_severity, $err_file, $err_line);
+ case E_NOTICE: throw new NoticeException ($err_msg, 0, $err_severity, $err_file, $err_line);
+ case E_CORE_ERROR: throw new CoreErrorException ($err_msg, 0, $err_severity, $err_file, $err_line);
+ case E_CORE_WARNING: throw new CoreWarningException ($err_msg, 0, $err_severity, $err_file, $err_line);
+ case E_COMPILE_ERROR: throw new CompileErrorException ($err_msg, 0, $err_severity, $err_file, $err_line);
+ case E_COMPILE_WARNING: throw new CoreWarningException ($err_msg, 0, $err_severity, $err_file, $err_line);
+ case E_USER_ERROR: throw new UserErrorException ($err_msg, 0, $err_severity, $err_file, $err_line);
+ case E_USER_WARNING: throw new UserWarningException ($err_msg, 0, $err_severity, $err_file, $err_line);
+ case E_USER_NOTICE: throw new UserNoticeException ($err_msg, 0, $err_severity, $err_file, $err_line);
+ case E_STRICT: throw new StrictException ($err_msg, 0, $err_severity, $err_file, $err_line);
+ case E_RECOVERABLE_ERROR: throw new RecoverableErrorException ($err_msg, 0, $err_severity, $err_file, $err_line);
+ case E_DEPRECATED: throw new DeprecatedException ($err_msg, 0, $err_severity, $err_file, $err_line);
+ case E_USER_DEPRECATED: throw new UserDeprecatedException ($err_msg, 0, $err_severity, $err_file, $err_line);
+ }
+ }
+
+ public function setupDatabaseConnection() {
+ switch($this->config["DATABASE_TYPE"]) {
+ case "SQLITE":
+ DB::$c = new \PDO("sqlite:" . $this->config["DATABASE_FILE"]);
+ break;
+ case "MySQL":
+ DB::$c = new \PDO(
+ "mysql:dbname={$this->config['MYSQL_DBNAME']};host={$this->config['MYSQL_HOST']}",
+ $this->config['MYSQL_USER'],
+ $this->config['MYSQL_PASS'],
+ array(
+ \PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
+ \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_OBJ,
+ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
+ )
+ );
+ break;
+ }
+ DB::$c->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+ }
+
+ public function runMigrations() {
+ global $argv;
+ $this->setupDatabaseConnection();
+ DB::query("CREATE TABLE IF NOT EXISTS migrations (
+ id INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT,
+ migration INTEGER,
+ ran_at DATETIME
+ )");
+ switch ($argv[1]) {
+ case "show":
+ foreach(DB::fetch("SELECT migration, ran_at FROM migrations") as $migration) {
+ echo $migration["migration"] . " => " . $migration["ran_at"] . PHP_EOL;
+ }
+ break;
+ case "count":
+ echo DB::column("SELECT COUNT(id) FROM migrations");
+ break;
+ case "run":
+ $migrations = DB::fetch("SELECT migration FROM migrations");
+ $migrationArray = [];
+ foreach($migrations as $migration) {
+ $migrationArray[] = $migration["migration"];
+ }
+
+ foreach (glob("application/migrations/*.php") as $filename)
+ {
+ if (!in_array($filename, $migrationArray)) {
+ try {
+ include $filename;
+ DB::insert("migrations", ["migration" => $filename, "ran_at" => (new \DateTime())->format("Y-m-d")]);
+ } catch (\Exception $e) {
+ echo "[HF_Core] - Migration error - $e";
+ exit(1);
+ }
+ }
+
+
+ }
+ break;
+ case "clear":
+ DB::query("DELETE FROM migrations");
+ break;
+ case "reset":
+ switch($this->config["DATABASE_TYPE"]) {
+ case "SQLITE":
+ DB::$c = null;
+ unlink($this->config["DATABASE_FILE"]);
+ break;
+ case "MYSQL":
+ DB::query("DROP DATABASE " . $this->config['MYSQL_DBNAME']);
+ DB::query("CREATE DATABASE " . $this->config['MYSQL_DBNAME']);
+ break;
+ }
+ break;
+ }
+
+
+ }
+}
\ No newline at end of file
diff --git a/system/engine/hf_model.php b/system/engine/hf_model.php
new file mode 100644
index 0000000..58e7634
--- /dev/null
+++ b/system/engine/hf_model.php
@@ -0,0 +1,77 @@
+getShortName());
+
+ foreach(DB::getColumns($table) as $column) {
+ if (isset($data[$column])) {
+ $obj->$column = $data[$column];
+ }
+ }
+ return $obj;
+ }
+
+ public function save() {
+ $fieldMap = [];
+ $function = new \ReflectionClass(get_called_class());
+ $table = strtolower($function->getShortName());
+ foreach(DB::getColumns($table) as $column) {
+ $fieldMap[$column] = $this->$column;
+ }
+ if ($fieldMap["id"] == null) {
+ DB::insert($table, $fieldMap);
+ } else {
+ $updateFields = $fieldMap;
+ unset($updateFields["id"]);
+ DB::update($table, $updateFields, $fieldMap["id"]);
+ }
+ }
+
+ public function update($data) {
+ $function = new \ReflectionClass(get_called_class());
+ $table = strtolower($function->getShortName());
+ foreach(DB::getColumns($table) as $column) {
+ if ($column == "id" || strpos($column, "_id") !== false) {
+ continue; // Don't allow to override id
+ }
+ if (isset($data[$column])) {
+ $this->$column = $data[$column];
+ }
+ }
+ return $this;
+ }
+
+ public function delete() {
+ $function = new \ReflectionClass(get_called_class());
+ $table = strtolower($function->getShortName());
+ if ($this->id) {
+ DB::query("DELETE FROM $table WHERE id = " . $this->id);
+ }
+ }
+
+ public function deleteRelated($tables = []) {
+ $function = new \ReflectionClass(get_called_class());
+ $table = strtolower($function->getShortName());
+ foreach($tables as $relatedTable) {
+ DB::query("DELETE FROM $relatedTable WHERE $table" . "_id = " . $this->id);
+ }
+ }
+
+ public static function getByField($field, $value) {
+ $function = new \ReflectionClass(get_called_class());
+ $table = strtolower($function->getShortName());
+ $fields = implode(", ", DB::getColumns($table));
+ return DB::fetchObject("SELECT $fields FROM $table WHERE $field = ?", get_called_class(), [$value]);
+ }
+
+}
\ No newline at end of file
diff --git a/system/engine/hf_smtp.php b/system/engine/hf_smtp.php
new file mode 100644
index 0000000..2f554f1
--- /dev/null
+++ b/system/engine/hf_smtp.php
@@ -0,0 +1,82 @@
+from = $from;
+ $this->to = $to;
+ $this->subject = $subject;
+ $this->msg = $msg;
+ $this->user = $user;
+ $this->password = $password;
+ $this->port = $port;
+ $this->server = $server;
+ }
+
+ public function send($html=false)
+ {
+ $err = null;
+ $errstr = "";
+ $this->smtpserverconn = fsockopen($this->server, $this->port, $err, $errstr, 100);
+ $response = fgets($this->smtpserverconn, 515);
+ if ($response === false)
+ {
+ throw new Exception("Could not connect to SMTP server!");
+ }
+
+ if ($this->user != null && $this->password != null)
+ {
+ $this->sendCommand("AUTH LOGIN");
+ $this->sendCommand(base64_encode($this->user));
+ $this->sendCommand(base64_encode($this->password));
+ }
+
+ $this->sendCommand("HELO " . $_SERVER["SERVER_NAME"]);
+ $this->sendCommand("MAIL FROM: " . $this->from);
+ $this->sendCommand("RCPT TO: " . $this->to);
+ $this->sendCommand("DATA");
+
+ if ($html)
+ {
+ $this->sendCommand("MIME-Version: 1.0", false);
+ $this->sendCommand("Content-type: text/html; charset=iso-8859-1", false);
+ }
+
+ $this->sendCommand("From: " . $this->from, false);
+ $this->sendCommand("To: " . $this->to, false);
+ $this->sendCommand("Subject: " . $this->subject, false);
+
+
+ $this->sendCommand($this->msg, false);
+
+ $this->sendCommand("", false);
+ $this->sendCommand(".", false);
+ $this->sendCommand("QUIT");
+
+ }
+
+ private function sendCommand($command, $return = true)
+ {
+ fputs($this->smtpserverconn, $command . "\r\n");
+ if ($return)
+ return fgets($this->smtpserverconn, 515);
+ else
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/system/engine/status.php b/system/engine/status.php
index eff37e3..85d3ce5 100644
--- a/system/engine/status.php
+++ b/system/engine/status.php
@@ -1,15 +1,17 @@
-
- ********************************** 80 Columns *********************************
- */
-class DB
-{
- static $q,$c,$p,$i = '`';
-
- /**
- * Fetch a column offset from the result set (COUNT() queries)
- *
- * @param string $query query string
- * @param array $params query parameters
- * @param integer $key index of column offset
- * @return array|null
- */
- static function column($query, $params = NULL, $key = 0)
- {
- if($statement = DB::query($query, $params))
- return $statement->fetchColumn($key);
- }
-
- /**
- * Fetch a single query result row
- *
- * @param string $query query string
- * @param array $params query parameters
- * @return mixed
- */
- static function row($query, $params = NULL)
- {
- if($statement = DB::query($query, $params))
- return $statement->fetch();
- }
-
- /**
- * Fetches an associative array of all rows as key-value pairs (first
- * column is the key, second column is the value).
- *
- * @param string $query query string
- * @param array $params query parameters
- * @return array
- */
- static function pairs($query, $params = NULL)
- {
- $data = array();
-
- if($statement = DB::query($query, $params))
- while($row = $statement->fetch(\PDO::FETCH_NUM))
- $data[$row[0]] = $row[1];
-
- return $data;
- }
-
- /**
- * Fetch all query result rows
- *
- * @param string $query query string
- * @param array $params query parameters
- * @param int $column the optional column to return
- * @return array
- */
- static function fetch($query, $params = NULL, $column = NULL)
- {
- if( ! $statement = DB::query($query, $params)) return;
-
- // Return an array of records
- if($column === NULL) return $statement->fetchAll();
-
- // Fetch a certain column from all rows
- return $statement->fetchAll(\PDO::FETCH_COLUMN, $column);
- }
-
- /**
- * Prepare and send a query returning the PDOStatement
- *
- * @param string $query query string
- * @param array $params query parameters
- * @return object|null
- */
- static function query($query, $params = NULL)
- {
- $statement = static::$c->prepare(DB::$q[] = strtr($query, '`', DB::$i));
- $statement->execute($params);
- return $statement;
- }
-
- /**
- * Insert a row into the database
- *
- * @param string $table name
- * @param array $data
- * @return integer|null
- */
- static function insert($table, array $data)
- {
- $query = "INSERT INTO`$table`(`" . implode('`,`', array_keys($data))
- . '`)VALUES(' . rtrim(str_repeat('?,', count($data = array_values($data))), ',') . ')';
- return DB::$p
- ? DB::column($query . 'RETURNING`id`', $data)
- : (DB::query($query, $data) ? static::$c->lastInsertId() : NULL);
- }
-
- /**
- * Update a database row
- *
- * @param string $table name
- * @param array $data
- * @param array $w where conditions
- * @return integer|null
- */
- static function update($table, $data, $value, $column = 'id')
- {
- $keys = implode('`=?,`', array_keys($data));
- if($statement = DB::query(
- "UPDATE`$table`SET`$keys`=? WHERE`$column`=?",
- array_values($data + array($value))
- ))
- return $statement->rowCount();
- }
+
+ ********************************** 80 Columns *********************************
+ */
+
+namespace vendor\DB;
+
+class DB
+{
+ static $q,$c,$p,$i = '`';
+
+ static $type = "";
+
+ /**
+ * Fetch a column offset from the result set (COUNT() queries)
+ *
+ * @param string $query query string
+ * @param array $params query parameters
+ * @param integer $key index of column offset
+ * @return array|null
+ */
+ static function column($query, $params = NULL, $key = 0)
+ {
+ if($statement = DB::query($query, $params))
+ return $statement->fetchColumn($key);
+ }
+
+ /**
+ * Fetch a single query result row
+ *
+ * @param string $query query string
+ * @param array $params query parameters
+ * @return mixed
+ */
+ static function row($query, $params = NULL)
+ {
+ if($statement = DB::query($query, $params))
+ return $statement->fetch();
+ }
+
+ /**
+ * Fetches an associative array of all rows as key-value pairs (first
+ * column is the key, second column is the value).
+ *
+ * @param string $query query string
+ * @param array $params query parameters
+ * @return array
+ */
+ static function pairs($query, $params = NULL)
+ {
+ $data = array();
+
+ if($statement = DB::query($query, $params))
+ while($row = $statement->fetch(\PDO::FETCH_NUM))
+ $data[$row[0]] = $row[1];
+
+ return $data;
+ }
+
+ /**
+ * Fetch all query result rows
+ *
+ * @param string $query query string
+ * @param array $params query parameters
+ * @param int $column the optional column to return
+ * @return array
+ */
+ static function fetch($query, $params = NULL, $column = NULL)
+ {
+ if( ! $statement = DB::query($query, $params)) return;
+
+ // Return an array of records
+ if($column === NULL) return $statement->fetchAll();
+
+ // Fetch a certain column from all rows
+ return $statement->fetchAll(\PDO::FETCH_COLUMN, $column);
+ }
+
+ /**
+ * Fetch all query result rows as object
+ *
+ * @param string $query query string
+ * @param array $params query parameters
+ * @return array
+ */
+ static function fetchObject($query, $className, $params = NULL)
+ {
+ /** @var \PDOStatement $statement */
+ if( ! $statement = DB::query($query, $params)) return null;
+
+ return $statement->fetchAll(\PDO::FETCH_CLASS, $className);
+ }
+
+ /**
+ * Prepare and send a query returning the PDOStatement
+ *
+ * @param string $query query string
+ * @param array $params query parameters
+ * @return object|null
+ */
+ static function query($query, $params = NULL)
+ {
+ $statement = static::$c->prepare(DB::$q[] = strtr($query, '`', DB::$i));
+ $statement->execute($params);
+ return $statement;
+ }
+
+ /**
+ * Insert a row into the database
+ *
+ * @param string $table name
+ * @param array $data
+ * @return integer|null
+ */
+ static function insert($table, array $data)
+ {
+ $query = "INSERT INTO`$table`(`" . implode('`,`', array_keys($data))
+ . '`)VALUES(' . rtrim(str_repeat('?,', count($data = array_values($data))), ',') . ')';
+ return DB::$p
+ ? DB::column($query . 'RETURNING`id`', $data)
+ : (DB::query($query, $data) ? static::$c->lastInsertId() : NULL);
+ }
+
+ /**
+ * Update a database row
+ *
+ * @param string $table name
+ * @param array $data
+ * @param array $w where conditions
+ * @return integer|null
+ */
+ static function update($table, $data, $value, $column = 'id')
+ {
+ $keys = implode('`=?,`', array_keys($data));
+ if($statement = DB::query(
+ "UPDATE`$table`SET`$keys`=? WHERE`$column`=?",
+ array_values($data + array($value))
+ ))
+ return $statement->rowCount();
+ }
+
+ /**
+ * Returns array containing all field names
+ * @param $table
+ * @return array
+ */
+ static function getColumns($table) {
+ switch (self::$type) {
+ case "SQLITE":
+ return self::fetch("PRAGMA table_info($table)", null, 1);
+ break;
+ case "MySQL":
+ return self::fetch("DESC $table", null, 0);
+ break;
+ }
+ }
}
\ No newline at end of file
diff --git a/system/vendor/StackTracePrint.php b/system/vendor/StackTracePrint.php
index f576bc0..08d49b5 100644
--- a/system/vendor/StackTracePrint.php
+++ b/system/vendor/StackTracePrint.php
@@ -1,69 +1,69 @@
-";
-
- $ret .- "".htmlspecialchars(trim($code[$backtrace[0]['line']-1]))."\n";
-
- $ret .= "\n";
-
- ob_start();
-
- foreach ($args as $arg)
- var_dump($arg);
-
- var_dump($_SERVER);
- var_dump($_COOKIE);
-
- $str = ob_get_contents();
-
- ob_end_clean();
-
- $str = preg_replace('/=>(\s+)/', ' => ', $str);
- $str = preg_replace('/ => NULL/', ' → NULL', $str);
- $str = preg_replace('/}\n(\s+)\[/', "}\n\n".'$1[', $str);
- $str = preg_replace('/ (float|int)\((\-?[\d\.]+)\)/', " $1 $2", $str);
-
- $str = preg_replace('/array\((\d+)\) {\s+}\n/', "array•$1 []", $str);
- $str = preg_replace('/ string\((\d+)\) \"(.*)\"/', " str•$1 '$2'", $str);
- $str = preg_replace('/\[\"(.+)\"\] => /', "'$1' → ", $str);
- $str = preg_replace('/object\((\S+)\)#(\d+) \((\d+)\) {/', "obj•$2 $1[$3] {", $str);
- $str = str_replace("bool(false)", "bool•false", $str);
- $str = str_replace("bool(true)", "bool•true", $str);
-
- $ret .= $str;
-
-
-
- $ret .= "";
-
- return $ret;
-
-
-
-}
-
-// Original - http://www.php.net/manual/en/function.debug-print-backtrace.php#86932
-function debug_string_backtrace() {
- ob_start();
- debug_print_backtrace();
- $trace = ob_get_contents();
- ob_end_clean();
-
- // Remove first item from backtrace as it's this function which
- // is redundant.
- $trace = preg_replace ('/^#0\s+' . __FUNCTION__ . "[^\n]*\n/", '', $trace, 1);
-
- // Renumber backtrace items.
- $trace = preg_replace ('/^#(\d+)/me', '\'#\' . ($1 - 1)', $trace);
-
- $trace = wordwrap($trace, 123, "
");
- return $trace;
+";
+
+ $ret .= "".htmlspecialchars(trim($code[$backtrace[0]['line']-1]))."\n";
+
+ $ret .= "\n";
+
+ ob_start();
+
+ foreach ($args as $arg)
+ var_dump($arg);
+
+ var_dump($_SERVER);
+ var_dump($_COOKIE);
+
+ $str = ob_get_contents();
+
+ ob_end_clean();
+
+ $str = preg_replace('/=>(\s+)/', ' => ', $str);
+ $str = preg_replace('/ => NULL/', ' → NULL', $str);
+ $str = preg_replace('/}\n(\s+)\[/', "}\n\n".'$1[', $str);
+ $str = preg_replace('/ (float|int)\((\-?[\d\.]+)\)/', " $1 $2", $str);
+
+ $str = preg_replace('/array\((\d+)\) {\s+}\n/', "array•$1 []", $str);
+ $str = preg_replace('/ string\((\d+)\) \"(.*)\"/', " str•$1 '$2'", $str);
+ $str = preg_replace('/\[\"(.+)\"\] => /', "'$1' → ", $str);
+ $str = preg_replace('/object\((\S+)\)#(\d+) \((\d+)\) {/', "obj•$2 $1[$3] {", $str);
+ $str = str_replace("bool(false)", "bool•false", $str);
+ $str = str_replace("bool(true)", "bool•true", $str);
+
+ $ret .= $str;
+
+
+
+ $ret .= "";
+
+ return $ret;
+
+
+
+}
+
+// Original - http://www.php.net/manual/en/function.debug-print-backtrace.php#86932
+function debug_string_backtrace() {
+ ob_start();
+ debug_print_backtrace();
+ $trace = ob_get_contents();
+ ob_end_clean();
+
+ // Remove first item from backtrace as it's this function which
+ // is redundant.
+ $trace = preg_replace ('/^#0\s+' . __FUNCTION__ . "[^\n]*\n/", '', $trace, 1);
+
+ // Renumber backtrace items.
+ $trace = preg_replace ('/^#(\d+)/me', '\'#\' . ($1 - 1)', $trace);
+
+ $trace = wordwrap($trace, 123, "
");
+ return $trace;
}
\ No newline at end of file
diff --git a/system/vendor/aes.php b/system/vendor/aes.php
new file mode 100644
index 0000000..f7b6be2
--- /dev/null
+++ b/system/vendor/aes.php
@@ -0,0 +1,27 @@
+ 32) {
+ throw new \Exception("Key is too long");
+ } else {
+ $realKey = $key;
+ }
+
+ return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $realKey, $text, MCRYPT_MODE_ECB));
+}
+
+function aes_decrypt($key, $cipherText) {
+ $realKey = "";
+ if (count($key) < 32) { //if it's less than 32 bits - pad it
+ $realKey = str_pad($key, 32 - count($key) + 1);
+ } else if (count($key) > 32) {
+ throw new \Exception("Key is too long");
+ } else {
+ $realKey = $key;
+ }
+ return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $realKey, base64_decode($cipherText), MCRYPT_MODE_ECB);
+}
\ No newline at end of file
diff --git a/system/vendor/h2o.php b/system/vendor/h2o.php
index 25f7ac0..c264b81 100644
--- a/system/vendor/h2o.php
+++ b/system/vendor/h2o.php
@@ -1,266 +1,268 @@
-'file'));
- *
- *
- * $h2o = new H2O('template.html', array("loader"=>'hash'));
- */
-class H2o {
- var $searchpath;
- var $context;
- var $loader = false;
-
- static $tags = array();
- static $filters = array();
- static $extensions = array();
-
- static function getOptions($options = array()) {
- return array_merge(array(
- 'loader' => 'file',
- 'cache' => 'file', // file | apc | memcache
- 'cache_prefix' => 'h2o_',
- 'cache_ttl' => 3600, // file | apc | memcache
- 'searchpath' => false,
- 'autoescape' => true,
-
- // Enviroment setting
- 'BLOCK_START' => '{%',
- 'BLOCK_END' => '%}',
- 'VARIABLE_START' => '{{',
- 'VARIABLE_END' => '}}',
- 'COMMENT_START' => '{*',
- 'COMMENT_END' => '*}',
- 'TRIM_TAGS' => true
- ), $options);
- }
-
- function __construct($file = null, $options = array()) {
- # Init a environment
- $this->options = $this->getOptions($options);
- $loader = $this->options['loader'];
-
- if (!$loader)
- return true;
-
- if (is_object($loader)) {
- $this->loader = $loader;
- $this->loader->setOptions($this->options);
- } else {
- $loader = "H2o_{$loader}_Loader";
- if (!class_exists($loader, false))
- throw new Exception('Invalid template loader');
-
- if (isset($options['searchpath'])){
- $this->searchpath = $options['searchpath'];
- } else if ($file) {
- $this->searchpath = dirname(realpath($file)).DS;
- } else {
- $this->searchpath = getcwd().DS;
- }
-
- $loader_searchpath = is_array($this->searchpath) ? $this->searchpath : array($this->searchpath);
- $this->loader = new $loader($loader_searchpath, $this->options);
- }
- $this->loader->runtime = $this;
-
- if (isset($options['i18n'])) {
- h2o::load('i18n');
- $this->i18n = new H2o_I18n($this->searchpath, $options['i18n']);
- }
-
- if ($file) {
- $this->nodelist = $this->loadTemplate($file);
- }
- }
-
- function loadTemplate($file) {
- return $this->nodelist = $this->loader->read_cache($file);
- }
-
- function loadSubTemplate($file) {
- return $this->loader->read($file);
- }
-
- # Build a finalized nodelist from template ready to be cached
- function parse($source, $filename = '', $env = null) {
- if (!$env)
- $env = $this->options;
-
- if (!class_exists('H2o_Parser', false))
- require H2O_ROOT.'h2o/parser.php';
-
- $parser = new H2o_Parser($source, $filename, $this, $env);
- $nodelist = $parser->parse();
- return $nodelist;
- }
-
- function set($context, $value = null) {
- # replace with new context object
- if (is_object($context) && $context instanceof H2o_Context) {
- return $this->context = $context;
- }
-
- # Init context
- if (!$this->context) {
- $this->context = new H2o_Context($this->defaultContext(), $this->options);
- }
-
- # Extend or set value
- if (is_array($context)) {
- return $this->context->extend($context);
- }
- elseif (is_string($context)) {
- return $this->context[$context] = $value;
- }
- return false;
- }
-
- # Render the nodelist
- function render($context = array()) {
- $this->set($context);
-
- $this->stream = new StreamWriter;
- $this->nodelist->render($this->context, $this->stream);
- return $this->stream->close();
- }
-
- static function parseString($source, $options = array()) {
- $instance = new H2o(null, array_merge($options, array('loader' => false)));
- $instance->nodelist = $instance->parse($source);
- return $instance;
- }
-
- static function &createTag($tag, $args = null, $parser, $position = 0) {
- if (!isset(self::$tags[$tag])) {
- throw new H2o_Error($tag . " tag doesn't exist");
- }
- $tagClass = self::$tags[$tag];
- $tag = new $tagClass($args, $parser, $position);
- return $tag;
- }
-
- /**
- * Register a new tag
- *
- *
- * h2o::addTag('tag_name', 'ClassName');
- *
- * h2o::addTag(array(
- * 'tag_name' => 'MagClass',
- * 'tag_name2' => 'TagClass2'
- * ));
- *
- * h2o::addTag('tag_name'); // Tag_name_Tag
- *
- * h2o::addTag(array('tag_name',
- * @param unknown_type $tag
- * @param unknown_type $class
- */
- static function addTag($tag, $class = null) {
- $tags = array();
- if (is_string($tag)) {
- if (is_null($class))
- $class = ucwords("{$tag}_Tag");
- $tags[$tag] = $class;
- } elseif (is_array($tag)) {
- $tags = $tag;
- }
-
- foreach ($tags as $tag => $tagClass) {
- if (is_integer($tag)) {
- unset($tags[$tag]);
- $tag = $tagClass;
- $tagClass = ucwords("{$tagClass}_Tag");
- }
- if (!class_exists($tagClass, false)) {
- throw new H2o_Error("{$tagClass} tag is not found");
- }
- $tags[$tag] = $tagClass;
- }
- self::$tags = array_merge(self::$tags, $tags);
- }
-
- /**
- * Register a new filter to h2o runtime
- *
- * @param unknown_type $filter
- * @param unknown_type $callback
- * @return unknown
- */
- static function addFilter($filter, $callback = null) {
- if (is_array($filter)) {
- $filters = $filter;
- foreach($filters as $key => $filter) {
- if (is_numeric($key))
- $key = $filter;
- self::addFilter($key, $filter);
- }
- return true;
- } elseif (is_string($filter) && class_exists($filter, false) && is_subclass_of($filter, 'FilterCollection')) {
- foreach (get_class_methods($filter) as $f) {
- if (is_callable(array($filter, $f)))
- self::$filters[$f] = array($filter, $f);
- }
- return true;
- }
- if (is_null($callback))
- $callback = $filter;
-
- if (!is_callable($callback)) {
- return false;
- }
- self::$filters[$filter] = $callback;
- }
-
- static function addLookup($callback) {
- if (is_callable($callback)) {
- H2o_Context::$lookupTable[] = $callback;
- } else die('damm it');
- }
-
- static function load($extension, $file = null) {
- if (!$file) {
- $file = H2O_ROOT.'ext'.DS.$extension.'.php';
- }
- if (is_file($file)) {
- include_once ($file);
- self::$extensions[$extension] = $file;
- }
- }
-
- function defaultContext() {
- return array('h2o' => new H2o_Info);
- }
-}
-
-/**
- * Convenient wrapper for loading template file or string
- * @param $name
- * @param $options - H2o options
- * @return Instance of H2o Template
- */
-function h2o($name, $options = array()) {
- $is_file = '/([^\s]*?)(\.[^.\s]*$)/';
-
- if (!preg_match($is_file, $name)) {
- return H2o::parseString($name, $options);
- }
-
- $instance = new H2o($name, $options);
- return $instance;
-}
-
-?>
+'file'));
+ *
+ *
+ * $h2o = new H2O('template.html', array("loader"=>'hash'));
+ */
+class H2o {
+ var $searchpath;
+ var $context;
+ var $loader = false;
+
+ static $tags = array();
+ static $filters = array();
+ static $extensions = array();
+
+ static function getOptions($options = array()) {
+ return array_merge(array(
+ 'loader' => 'file',
+ 'cache' => 'file', // file | apc | memcache
+ 'cache_prefix' => 'h2o_',
+ 'cache_ttl' => 3600, // file | apc | memcache
+ 'searchpath' => false,
+ 'autoescape' => true,
+
+ // Enviroment setting
+ 'BLOCK_START' => '{%',
+ 'BLOCK_END' => '%}',
+ 'VARIABLE_START' => '{{',
+ 'VARIABLE_END' => '}}',
+ 'COMMENT_START' => '{*',
+ 'COMMENT_END' => '*}',
+ 'TRIM_TAGS' => true
+ ), $options);
+ }
+
+ function __construct($file = null, $options = array()) {
+ # Init a environment
+ $this->options = $this->getOptions($options);
+ $loader = $this->options['loader'];
+
+ if (!$loader)
+ return true;
+
+ if (is_object($loader)) {
+ $this->loader = $loader;
+ $this->loader->setOptions($this->options);
+ } else {
+ $loader = "H2o_{$loader}_Loader";
+ if (!class_exists($loader, false))
+ throw new Exception('Invalid template loader');
+
+ if (isset($options['searchpath'])){
+ $this->searchpath = $options['searchpath'];
+ } else if ($file) {
+ $this->searchpath = dirname(realpath($file)).DS;
+ } else {
+ $this->searchpath = getcwd().DS;
+ }
+
+ $loader_searchpath = is_array($this->searchpath) ? $this->searchpath : array($this->searchpath);
+ $this->loader = new $loader($loader_searchpath, $this->options);
+ }
+ $this->loader->runtime = $this;
+
+ if (isset($options['i18n'])) {
+ h2o::load('i18n');
+ $this->i18n = new H2o_I18n($this->searchpath, $options['i18n']);
+ }
+
+ if ($file) {
+ $this->nodelist = $this->loadTemplate($file);
+ }
+ }
+
+ function loadTemplate($file) {
+ return $this->nodelist = $this->loader->read_cache($file);
+ }
+
+ function loadSubTemplate($file) {
+ return $this->loader->read($file);
+ }
+
+ # Build a finalized nodelist from template ready to be cached
+ function parse($source, $filename = '', $env = null) {
+ if (!$env)
+ $env = $this->options;
+
+ if (!class_exists('H2o_Parser', false))
+ require H2O_ROOT.'h2o/parser.php';
+
+ $parser = new H2o_Parser($source, $filename, $this, $env);
+ $nodelist = $parser->parse();
+ return $nodelist;
+ }
+
+ function set($context, $value = null) {
+ # replace with new context object
+ if (is_object($context) && $context instanceof H2o_Context) {
+ return $this->context = $context;
+ }
+
+ # Init context
+ if (!$this->context) {
+ $this->context = new H2o_Context($this->defaultContext(), $this->options);
+ }
+
+ # Extend or set value
+ if (is_array($context)) {
+ return $this->context->extend($context);
+ }
+ elseif (is_string($context)) {
+ return $this->context[$context] = $value;
+ }
+ return false;
+ }
+
+ # Render the nodelist
+ function render($context = array()) {
+ $this->set($context);
+
+ $this->stream = new StreamWriter;
+ $this->nodelist->render($this->context, $this->stream);
+ return $this->stream->close();
+ }
+
+ static function parseString($source, $options = array()) {
+ $instance = new H2o(null, array_merge($options, array('loader' => false)));
+ $instance->nodelist = $instance->parse($source);
+ return $instance;
+ }
+
+ static function &createTag($tag, $args = null, $parser, $position = 0) {
+ if (!isset(self::$tags[$tag])) {
+ throw new H2o_Error($tag . " tag doesn't exist");
+ }
+ $tagClass = self::$tags[$tag];
+ $tag = new $tagClass($args, $parser, $position);
+ return $tag;
+ }
+
+ /**
+ * Register a new tag
+ *
+ *
+ * h2o::addTag('tag_name', 'ClassName');
+ *
+ * h2o::addTag(array(
+ * 'tag_name' => 'MagClass',
+ * 'tag_name2' => 'TagClass2'
+ * ));
+ *
+ * h2o::addTag('tag_name'); // Tag_name_Tag
+ *
+ * h2o::addTag(array('tag_name',
+ * @param unknown_type $tag
+ * @param unknown_type $class
+ */
+ static function addTag($tag, $class = null) {
+ $tags = array();
+ if (is_string($tag)) {
+ if (is_null($class))
+ $class = ucwords("{$tag}_Tag");
+ $tags[$tag] = $class;
+ } elseif (is_array($tag)) {
+ $tags = $tag;
+ }
+
+ foreach ($tags as $tag => $tagClass) {
+ if (is_integer($tag)) {
+ unset($tags[$tag]);
+ $tag = $tagClass;
+ $tagClass = ucwords("{$tagClass}_Tag");
+ }
+ if (!class_exists($tagClass, false)) {
+ throw new H2o_Error("{$tagClass} tag is not found");
+ }
+ $tags[$tag] = $tagClass;
+ }
+ self::$tags = array_merge(self::$tags, $tags);
+ }
+
+ /**
+ * Register a new filter to h2o runtime
+ *
+ * @param unknown_type $filter
+ * @param unknown_type $callback
+ * @return unknown
+ */
+ static function addFilter($filter, $callback = null) {
+ if (is_array($filter)) {
+ $filters = $filter;
+ foreach($filters as $key => $filter) {
+ if (is_numeric($key))
+ $key = $filter;
+ self::addFilter($key, $filter);
+ }
+ return true;
+ } elseif (is_string($filter) && class_exists($filter, false) && is_subclass_of($filter, 'FilterCollection')) {
+ foreach (get_class_methods($filter) as $f) {
+ if (is_callable(array($filter, $f)))
+ self::$filters[$f] = array($filter, $f);
+ }
+ return true;
+ }
+ if (is_null($callback))
+ $callback = $filter;
+
+ if (!is_callable($callback)) {
+ return false;
+ }
+ self::$filters[$filter] = $callback;
+ }
+
+ static function addLookup($callback) {
+ if (is_callable($callback)) {
+ H2o_Context::$lookupTable[] = $callback;
+ } else die('damm it');
+ }
+
+ static function load($extension, $file = null) {
+ if (!$file) {
+ $file = H2O_ROOT.'ext'.DS.$extension.'.php';
+ }
+ if (is_file($file)) {
+ include_once ($file);
+ self::$extensions[$extension] = $file;
+ }
+ }
+
+ function defaultContext() {
+ return array('h2o' => new H2o_Info);
+ }
+}
+
+/**
+ * Convenient wrapper for loading template file or string
+ * @param $name
+ * @param $options - H2o options
+ * @return Instance of H2o Template
+ */
+function h2o($name, $options = array()) {
+ $is_file = '/([^\s]*?)(\.[^.\s]*$)/';
+
+ if (!preg_match($is_file, $name)) {
+ return H2o::parseString($name, $options);
+ }
+
+ $instance = new H2o($name, $options);
+ return $instance;
+}
+
+?>
diff --git a/system/vendor/h2o/context.php b/system/vendor/h2o/context.php
index 20ab752..ab09dbc 100644
--- a/system/vendor/h2o/context.php
+++ b/system/vendor/h2o/context.php
@@ -1,266 +1,266 @@
- 0, 'last'=> 1, 'length'=> 2, 'size'=> 3);
- static $lookupTable = array();
-
- function __construct($context = array(), $options = array()){
- if (is_object($context))
- $context = get_object_vars($context);
- $this->scopes = array($context);
-
- if (isset($options['safeClass']))
- $this->safeClass = array_merge($this->safeClass, $options['safeClass']);
-
- if (isset($options['autoescape']))
- $this->autoescape = $options['autoescape'];
-
- $this->options = $options;
- }
-
- function push($layer = array()){
- return array_unshift($this->scopes, $layer);
- }
-
- /**
- * pop the most recent layer
- */
- function pop() {
- if (!isset($this->scopes[1]))
- throw new Exception('cannnot pop from empty stack');
- return array_shift($this->scopes);
- }
-
- function offsetExists($offset) {
- foreach ($this->scopes as $layer) {
- if (isset($layer[$offset])) return true;
- }
- return false;
- }
-
- function offsetGet($key) {
- foreach ($this->scopes as $layer) {
- if (isset($layer[$key]))
- return $layer[$key];
- }
- return;
- }
-
- function offsetSet($key, $value) {
- if (strpos($key, '.') > -1)
- throw new Exception('cannot set non local variable');
- return $this->scopes[0][$key] = $value;
- }
-
- function offsetUnset($key) {
- foreach ($this->scopes as $layer) {
- if (isset($layer[$key])) unset($layer[$key]);
- }
- }
-
- function extend($context) {
- $this->scopes[0] = array_merge($this->scopes[0], $context);
- }
-
- function set($key, $value) {
- return $this->offsetSet($key, $value);
- }
-
- function get($key) {
- return $this->offsetGet($key);
- }
-
- function isDefined($key) {
- return $this->offsetExists($key);
- }
- /**
- *
- *
- *
- * Variable name
- *
- * @param $var variable name or array(0 => variable name, 'filters' => filters array)
- * @return unknown_type
- */
- function resolve($var) {
-
- # if $var is array - it contains filters to apply
- $filters = array();
- if ( is_array($var) ) {
-
- $name = array_shift($var);
- $filters = isset($var['filters'])? $var['filters'] : array();
-
- }
- else $name = $var;
-
- $result = null;
-
- # Lookup basic types, null, boolean, numeric and string
- # Variable starts with : (:users.name) to short-circuit lookup
- if ($name[0] === ':') {
- $object = $this->getVariable(substr($name, 1));
- if (!is_null($object)) $result = $object;
- } else {
- if ($name === 'true') {
- $result = true;
- }
- elseif ($name === 'false') {
- $result = false;
- }
- elseif (preg_match('/^-?\d+(\.\d+)?$/', $name, $matches)) {
- $result = isset($matches[1])? floatval($name) : intval($name);
- }
- elseif (preg_match('/^"([^"\\\\]*(?:\\.[^"\\\\]*)*)"|' .
- '\'([^\'\\\\]*(?:\\.[^\'\\\\]*)*)\'$/', $name)) {
- $result = stripcslashes(substr($name, 1, -1));
- }
- }
- if (!empty(self::$lookupTable) && $result == Null) {
- $result = $this->externalLookup($name);
- }
- $result = $this->applyFilters($result,$filters);
- return $result;
- }
-
- function getVariable($name) {
- # Local variables. this gives as a bit of performance improvement
- if (!strpos($name, '.'))
- return $this[$name];
-
- # Prepare for Big lookup
- $parts = explode('.', $name);
- $object = $this[array_shift($parts)];
-
- # Lookup context
- foreach ($parts as $part) {
- if (is_array($object) or $object instanceof ArrayAccess) {
- if (isset($object[$part])) {
- $object = $object[$part];
- } elseif ($part === 'first') {
- $object = isset($object[0])?$object[0]:null;
- } elseif ($part === 'last') {
- $last = count($object)-1;
- $object = isset($object[$last])?$object[$last]:null;
- } elseif ($part === 'size' or $part === 'length') {
- return count($object);
- } else {
- return null;
- }
- }
- elseif (is_object($object)) {
- if (isset($object->$part))
- $object = $object->$part;
- elseif (is_callable(array($object, $part))) {
- $methodAllowed = in_array(get_class($object), $this->safeClass) ||
- (isset($object->h2o_safe) && (
- $object->h2o_safe === true || in_array($part, $object->h2o_safe)
- )
- );
- $object = $methodAllowed ? $object->$part() : null;
- }
- else return null;
- }
- else return null;
- }
- return $object;
- }
-
- function applyFilters($object, $filters) {
-
- foreach ($filters as $filter) {
- $name = substr(array_shift($filter), 1);
- $args = $filter;
-
- if (isset(h2o::$filters[$name])) {
- foreach ($args as $i => $argument) {
- # name args
- if (is_array($argument)) {
- foreach ($argument as $n => $arg) {
- $args[$i][$n] = $this->resolve($arg);
- }
- } else {
- # resolve argument values
- $args[$i] = $this->resolve($argument);
- }
- }
- array_unshift($args, $object);
- $object = call_user_func_array(h2o::$filters[$name], $args);
- }
- }
- return $object;
- }
-
- function escape($value, $var) {
-
- $safe = false;
- $filters = (is_array($var) && isset($var['filters']))? $var['filters'] : array();
-
- foreach ( $filters as $filter ) {
-
- $name = substr(array_shift($filter), 1);
- $safe = !$safe && ($name === 'safe');
-
- $escaped = $name === 'escape';
- }
-
- $should_escape = $this->autoescape || isset($escaped) && $escaped;
-
- if ( ($should_escape && !$safe)) {
- $value = htmlspecialchars($value);
- }
-
- return $value;
- }
-
- function externalLookup($name) {
- if (!empty(self::$lookupTable)) {
- foreach (self::$lookupTable as $lookup) {
- $tmp = call_user_func_array($lookup, array($name, $this));
- if ($tmp !== null)
- return $tmp;
- }
- }
- return null;
- }
-}
-
-class BlockContext {
- var $h2o_safe = array('name', 'depth', 'super');
- var $block, $index;
- private $context;
-
- function __construct($block, $context, $index) {
- $this->block =& $block;
- $this->context = $context;
- $this->index = $index;
- }
-
- function name() {
- return $this->block->name;
- }
-
- function depth() {
- return $this->index;
- }
-
- function super() {
- $stream = new StreamWriter;
- $this->block->parent->render($this->context, $stream, $this->index+1);
- return $stream->close();
- }
-
- function __toString() {
- return "[BlockContext : {$this->block->name}, {$this->block->filename}]";
- }
-}
-?>
+ 0, 'last'=> 1, 'length'=> 2, 'size'=> 3);
+ static $lookupTable = array();
+
+ function __construct($context = array(), $options = array()){
+ if (is_object($context))
+ $context = get_object_vars($context);
+ $this->scopes = array($context);
+
+ if (isset($options['safeClass']))
+ $this->safeClass = array_merge($this->safeClass, $options['safeClass']);
+
+ if (isset($options['autoescape']))
+ $this->autoescape = $options['autoescape'];
+
+ $this->options = $options;
+ }
+
+ function push($layer = array()){
+ return array_unshift($this->scopes, $layer);
+ }
+
+ /**
+ * pop the most recent layer
+ */
+ function pop() {
+ if (!isset($this->scopes[1]))
+ throw new Exception('cannnot pop from empty stack');
+ return array_shift($this->scopes);
+ }
+
+ function offsetExists($offset) {
+ foreach ($this->scopes as $layer) {
+ if (isset($layer[$offset])) return true;
+ }
+ return false;
+ }
+
+ function offsetGet($key) {
+ foreach ($this->scopes as $layer) {
+ if (isset($layer[$key]))
+ return $layer[$key];
+ }
+ return;
+ }
+
+ function offsetSet($key, $value) {
+ if (strpos($key, '.') > -1)
+ throw new Exception('cannot set non local variable');
+ return $this->scopes[0][$key] = $value;
+ }
+
+ function offsetUnset($key) {
+ foreach ($this->scopes as $layer) {
+ if (isset($layer[$key])) unset($layer[$key]);
+ }
+ }
+
+ function extend($context) {
+ $this->scopes[0] = array_merge($this->scopes[0], $context);
+ }
+
+ function set($key, $value) {
+ return $this->offsetSet($key, $value);
+ }
+
+ function get($key) {
+ return $this->offsetGet($key);
+ }
+
+ function isDefined($key) {
+ return $this->offsetExists($key);
+ }
+ /**
+ *
+ *
+ *
+ * Variable name
+ *
+ * @param $var variable name or array(0 => variable name, 'filters' => filters array)
+ * @return unknown_type
+ */
+ function resolve($var) {
+
+ # if $var is array - it contains filters to apply
+ $filters = array();
+ if ( is_array($var) ) {
+
+ $name = array_shift($var);
+ $filters = isset($var['filters'])? $var['filters'] : array();
+
+ }
+ else $name = $var;
+
+ $result = null;
+
+ # Lookup basic types, null, boolean, numeric and string
+ # Variable starts with : (:users.name) to short-circuit lookup
+ if ($name[0] === ':') {
+ $object = $this->getVariable(substr($name, 1));
+ if (!is_null($object)) $result = $object;
+ } else {
+ if ($name === 'true') {
+ $result = true;
+ }
+ elseif ($name === 'false') {
+ $result = false;
+ }
+ elseif (preg_match('/^-?\d+(\.\d+)?$/', $name, $matches)) {
+ $result = isset($matches[1])? floatval($name) : intval($name);
+ }
+ elseif (preg_match('/^"([^"\\\\]*(?:\\.[^"\\\\]*)*)"|' .
+ '\'([^\'\\\\]*(?:\\.[^\'\\\\]*)*)\'$/', $name)) {
+ $result = stripcslashes(substr($name, 1, -1));
+ }
+ }
+ if (!empty(self::$lookupTable) && $result == Null) {
+ $result = $this->externalLookup($name);
+ }
+ $result = $this->applyFilters($result,$filters);
+ return $result;
+ }
+
+ function getVariable($name) {
+ # Local variables. this gives as a bit of performance improvement
+ if (!strpos($name, '.'))
+ return $this[$name];
+
+ # Prepare for Big lookup
+ $parts = explode('.', $name);
+ $object = $this[array_shift($parts)];
+
+ # Lookup context
+ foreach ($parts as $part) {
+ if (is_array($object) or $object instanceof ArrayAccess) {
+ if (isset($object[$part])) {
+ $object = $object[$part];
+ } elseif ($part === 'first') {
+ $object = isset($object[0])?$object[0]:null;
+ } elseif ($part === 'last') {
+ $last = count($object)-1;
+ $object = isset($object[$last])?$object[$last]:null;
+ } elseif ($part === 'size' or $part === 'length') {
+ return count($object);
+ } else {
+ return null;
+ }
+ }
+ elseif (is_object($object)) {
+ if (isset($object->$part))
+ $object = $object->$part;
+ elseif (is_callable(array($object, $part))) {
+ $methodAllowed = in_array(get_class($object), $this->safeClass) ||
+ (isset($object->h2o_safe) && (
+ $object->h2o_safe === true || in_array($part, $object->h2o_safe)
+ )
+ );
+ $object = $methodAllowed ? $object->$part() : null;
+ }
+ else return null;
+ }
+ else return null;
+ }
+ return $object;
+ }
+
+ function applyFilters($object, $filters) {
+
+ foreach ($filters as $filter) {
+ $name = substr(array_shift($filter), 1);
+ $args = $filter;
+
+ if (isset(h2o::$filters[$name])) {
+ foreach ($args as $i => $argument) {
+ # name args
+ if (is_array($argument)) {
+ foreach ($argument as $n => $arg) {
+ $args[$i][$n] = $this->resolve($arg);
+ }
+ } else {
+ # resolve argument values
+ $args[$i] = $this->resolve($argument);
+ }
+ }
+ array_unshift($args, $object);
+ $object = call_user_func_array(h2o::$filters[$name], $args);
+ }
+ }
+ return $object;
+ }
+
+ function escape($value, $var) {
+
+ $safe = false;
+ $filters = (is_array($var) && isset($var['filters']))? $var['filters'] : array();
+
+ foreach ( $filters as $filter ) {
+
+ $name = substr(array_shift($filter), 1);
+ $safe = !$safe && ($name === 'safe');
+
+ $escaped = $name === 'escape';
+ }
+
+ $should_escape = $this->autoescape || isset($escaped) && $escaped;
+
+ if ( ($should_escape && !$safe)) {
+ $value = htmlspecialchars($value);
+ }
+
+ return $value;
+ }
+
+ function externalLookup($name) {
+ if (!empty(self::$lookupTable)) {
+ foreach (self::$lookupTable as $lookup) {
+ $tmp = call_user_func_array($lookup, array($name, $this));
+ if ($tmp !== null)
+ return $tmp;
+ }
+ }
+ return null;
+ }
+}
+
+class BlockContext {
+ var $h2o_safe = array('name', 'depth', 'super');
+ var $block, $index;
+ private $context;
+
+ function __construct($block, $context, $index) {
+ $this->block =& $block;
+ $this->context = $context;
+ $this->index = $index;
+ }
+
+ function name() {
+ return $this->block->name;
+ }
+
+ function depth() {
+ return $this->index;
+ }
+
+ function super() {
+ $stream = new StreamWriter;
+ $this->block->parent->render($this->context, $stream, $this->index+1);
+ return $stream->close();
+ }
+
+ function __toString() {
+ return "[BlockContext : {$this->block->name}, {$this->block->filename}]";
+ }
+}
+?>
diff --git a/system/vendor/h2o/datatype.php b/system/vendor/h2o/datatype.php
index da174af..0495f4a 100644
--- a/system/vendor/h2o/datatype.php
+++ b/system/vendor/h2o/datatype.php
@@ -1,173 +1,173 @@
-close = false;
- }
-
- function write($data) {
- if ($this->close)
- new Exception('tried to write to closed stream');
- $this->buffer[] = $data;
- }
-
- function close() {
- $this->close = true;
- return implode('', $this->buffer);
- }
-}
-
-class Evaluator {
- static function gt($l, $r) { return $l > $r; }
- static function ge($l, $r) { return $l >= $r; }
-
- static function lt($l, $r) { return $l < $r; }
- static function le($l, $r) { return $l <= $r; }
-
- static function eq($l, $r) { return $l == $r; }
- static function ne($l, $r) { return $l != $r; }
-
- static function not_($bool) { return !$bool; }
- static function and_($l, $r) { return ($l && $r); }
- static function or_($l, $r) { return ($l && $r); }
-
- # Currently only support single expression with no preceddence ,no boolean expression
- # [expression] = [optional binary] ? operant [ optional compare operant]
- # [operant] = variable|string|numeric|boolean
- # [compare] = > | < | == | >= | <=
- # [binary] = not | !
- static function exec($args, $context) {
- $argc = count($args);
- $first = array_shift($args);
- $first = $context->resolve($first);
- switch ($argc) {
- case 1 :
- return $first;
- case 2 :
- if (is_array($first) && isset($first['operator']) && $first['operator'] == 'not') {
- $operant = array_shift($args);
- $operant = $context->resolve($operant);
- return !($operant);
- }
- case 3 :
- list($op, $right) = $args;
- $right = $context->resolve($right);
- return call_user_func(array("Evaluator", $op['operator']), $first, $right);
- default:
- return false;
- }
- }
-}
-
-/**
- * $type of token, Block | Variable
- */
-class H2o_Token {
- function __construct ($type, $content, $position) {
- $this->type = $type;
- $this->content = $content;
- $this->result='';
- $this->position = $position;
- }
-
- function write($content){
- $this->result= $content;
- }
-}
-
-/**
- * a token stream
- */
-class TokenStream {
- var $pushed;
- var $stream;
- var $closed;
- var $c;
-
- function __construct() {
- $this->pushed = array();
- $this->stream = array();
- $this->closed = false;
- }
-
- function pop() {
- if (count($this->pushed))
- return array_pop($this->pushed);
- return array_pop($this->stream);
- }
-
- function feed($type, $contents, $position) {
- if ($this->closed)
- throw new Exception('cannot feed closed stream');
- $this->stream[] = new H2o_Token($type, $contents, $position);
- }
-
- function push($token) {
- if (is_null($token))
- throw new Exception('cannot push NULL');
- if ($this->closed)
- $this->pushed[] = $token;
- else
- $this->stream[] = $token;
- }
-
- function close() {
- if ($this->closed)
- new Exception('cannot close already closed stream');
- $this->closed = true;
- $this->stream = array_reverse($this->stream);
- }
-
- function isClosed() {
- return $this->closed;
- }
-
- function current() {
- return $this->c ;
- }
-
- function next() {
- return $this->c = $this->pop();
- }
-}
-
-class H2o_Info {
- var $h2o_safe = array('filters', 'extensions', 'tags');
- var $name = 'H2o Template engine';
- var $description = "Django inspired template system";
- var $version = H2O_VERSION;
-
- function filters() {
- return array_keys(h2o::$filters);
- }
-
- function tags() {
- return array_keys(h2o::$tags);
- }
-
- function extensions() {
- return array_keys(h2o::$extensions);
- }
-}
-
-/**
- * Functions
- */
-function sym_to_str($string) {
- return substr($string, 1);
-}
-
-function is_sym($string) {
- return isset($string[0]) && $string[0] === ':';
-}
-
-function symbol($string) {
- return ':'.$string;
-}
-
-function strip_regex($regex, $delimiter = '/') {
- return substr($regex, 1, strrpos($regex, $delimiter)-1);
-}
-?>
+close = false;
+ }
+
+ function write($data) {
+ if ($this->close)
+ new Exception('tried to write to closed stream');
+ $this->buffer[] = $data;
+ }
+
+ function close() {
+ $this->close = true;
+ return implode('', $this->buffer);
+ }
+}
+
+class Evaluator {
+ static function gt($l, $r) { return $l > $r; }
+ static function ge($l, $r) { return $l >= $r; }
+
+ static function lt($l, $r) { return $l < $r; }
+ static function le($l, $r) { return $l <= $r; }
+
+ static function eq($l, $r) { return $l == $r; }
+ static function ne($l, $r) { return $l != $r; }
+
+ static function not_($bool) { return !$bool; }
+ static function and_($l, $r) { return ($l && $r); }
+ static function or_($l, $r) { return ($l && $r); }
+
+ # Currently only support single expression with no preceddence ,no boolean expression
+ # [expression] = [optional binary] ? operant [ optional compare operant]
+ # [operant] = variable|string|numeric|boolean
+ # [compare] = > | < | == | >= | <=
+ # [binary] = not | !
+ static function exec($args, $context) {
+ $argc = count($args);
+ $first = array_shift($args);
+ $first = $context->resolve($first);
+ switch ($argc) {
+ case 1 :
+ return $first;
+ case 2 :
+ if (is_array($first) && isset($first['operator']) && $first['operator'] == 'not') {
+ $operant = array_shift($args);
+ $operant = $context->resolve($operant);
+ return !($operant);
+ }
+ case 3 :
+ list($op, $right) = $args;
+ $right = $context->resolve($right);
+ return call_user_func(array("Evaluator", $op['operator']), $first, $right);
+ default:
+ return false;
+ }
+ }
+}
+
+/**
+ * $type of token, Block | Variable
+ */
+class H2o_Token {
+ function __construct ($type, $content, $position) {
+ $this->type = $type;
+ $this->content = $content;
+ $this->result='';
+ $this->position = $position;
+ }
+
+ function write($content){
+ $this->result= $content;
+ }
+}
+
+/**
+ * a token stream
+ */
+class TokenStream {
+ var $pushed;
+ var $stream;
+ var $closed;
+ var $c;
+
+ function __construct() {
+ $this->pushed = array();
+ $this->stream = array();
+ $this->closed = false;
+ }
+
+ function pop() {
+ if (count($this->pushed))
+ return array_pop($this->pushed);
+ return array_pop($this->stream);
+ }
+
+ function feed($type, $contents, $position) {
+ if ($this->closed)
+ throw new Exception('cannot feed closed stream');
+ $this->stream[] = new H2o_Token($type, $contents, $position);
+ }
+
+ function push($token) {
+ if (is_null($token))
+ throw new Exception('cannot push NULL');
+ if ($this->closed)
+ $this->pushed[] = $token;
+ else
+ $this->stream[] = $token;
+ }
+
+ function close() {
+ if ($this->closed)
+ new Exception('cannot close already closed stream');
+ $this->closed = true;
+ $this->stream = array_reverse($this->stream);
+ }
+
+ function isClosed() {
+ return $this->closed;
+ }
+
+ function current() {
+ return $this->c ;
+ }
+
+ function next() {
+ return $this->c = $this->pop();
+ }
+}
+
+class H2o_Info {
+ var $h2o_safe = array('filters', 'extensions', 'tags');
+ var $name = 'H2o Template engine';
+ var $description = "Django inspired template system";
+ var $version = H2O_VERSION;
+
+ function filters() {
+ return array_keys(h2o::$filters);
+ }
+
+ function tags() {
+ return array_keys(h2o::$tags);
+ }
+
+ function extensions() {
+ return array_keys(h2o::$extensions);
+ }
+}
+
+/**
+ * Functions
+ */
+function sym_to_str($string) {
+ return substr($string, 1);
+}
+
+function is_sym($string) {
+ return isset($string[0]) && $string[0] === ':';
+}
+
+function symbol($string) {
+ return ':'.$string;
+}
+
+function strip_regex($regex, $delimiter = '/') {
+ return substr($regex, 1, strrpos($regex, $delimiter)-1);
+}
+?>
diff --git a/system/vendor/h2o/errors.php b/system/vendor/h2o/errors.php
index 7959c2f..4f214e9 100644
--- a/system/vendor/h2o/errors.php
+++ b/system/vendor/h2o/errors.php
@@ -1,10 +1,10 @@
-
\ No newline at end of file
diff --git a/system/vendor/h2o/filters.php b/system/vendor/h2o/filters.php
index a8cf3d3..2e72e9a 100644
--- a/system/vendor/h2o/filters.php
+++ b/system/vendor/h2o/filters.php
@@ -1,369 +1,369 @@
- $value) {
- $result .= $name.'='.urlencode($value).'&'.$querystring;
- }
- $querystring = substr($result, 0, strlen($result)-1);
- return htmlspecialchars($result);
- } else {
- return urlencode($data);
- }
- }
-
- static function hyphenize ($string) {
- $rules = array('/[^\w\s-]+/'=>'','/\s+/'=>'-', '/-{2,}/'=>'-');
- $string = preg_replace(array_keys($rules), $rules, trim($string));
- return $string = trim(strtolower($string));
- }
-
- static function urlize( $string, $truncate = false ) {
- $reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
- preg_match_all($reg_exUrl, $string, $matches);
- $usedPatterns = array();
- foreach($matches[0] as $pattern){
- if(!array_key_exists($pattern, $usedPatterns)){
- $usedPatterns[$pattern]=true;
- $string = str_replace($pattern, "{$pattern}", $string);
- }
- }
-
- $reg_exEmail = "/[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/";
- preg_match_all($reg_exEmail, $string, $matches);
- $usedPatterns = array();
- foreach($matches[0] as $pattern){
- if(!array_key_exists($pattern, $usedPatterns)){
- $usedPatterns[$pattern]=true;
- $string = str_replace($pattern, "{$pattern}", $string);
- }
- }
- return $string;
- }
-
- static function set_default($object, $default) {
- return !$object ? $default : $object;
- }
-}
-
-class StringFilters extends FilterCollection {
-
- static function humanize($string) {
- $string = preg_replace('/\s+/', ' ', trim(preg_replace('/[^A-Za-z0-9()!,?$]+/', ' ', $string)));
- return capfirst($string);
- }
-
- static function capitalize($string) {
- return ucwords(strtolower($string)) ;
- }
-
- static function titlize($string) {
- return self::capitalize($string);
- }
-
- static function capfirst($string) {
- $string = strtolower($string);
- return strtoupper($string{0}). substr($string, 1, strlen($string));
- }
-
- static function tighten_space($value) {
- return preg_replace("/\s{2,}/", ' ', $value);
- }
-
- static function escape($value, $attribute = false) {
- return htmlspecialchars($value, $attribute ? ENT_QUOTES : ENT_NOQUOTES);
- }
-
- static function escapejson($value) {
- // The standard django escapejs converts all non-ascii characters into hex codes.
- // This function encodes the entire data structure, and strings get quotes around them.
- return json_encode($value);
- }
-
- static function force_escape($value, $attribute = false) {
- return self::escape($value, $attribute);
- }
-
- static function e($value, $attribute = false) {
- return self::escape($value, $attribute);
- }
-
- static function safe($value) {
- return $value;
- }
-
- static function truncate ($string, $max = 50, $ends = '...') {
- return (strlen($string) > $max ? substr($string, 0, $max).$ends : $string);
- }
-
- static function limitwords($text, $limit = 50, $ends = '...') {
- if (strlen($text) > $limit) {
- $words = str_word_count($text, 2);
- $pos = array_keys($words);
-
- if (isset($pos[$limit])) {
- $text = substr($text, 0, $pos[$limit]) . $ends;
- }
- }
- return $text;
- }
-}
-
-class NumberFilters extends FilterCollection {
- static function filesize ($bytes, $round = 1) {
- if ($bytes === 0)
- return '0 bytes';
- elseif ($bytes === 1)
- return '1 byte';
-
- $units = array(
- 'bytes' => pow(2, 0), 'kB' => pow(2, 10),
- 'BM' => pow(2, 20), 'GB' => pow(2, 30),
- 'TB' => pow(2, 40), 'PB' => pow(2, 50),
- 'EB' => pow(2, 60), 'ZB' => pow(2, 70)
- );
-
- $lastUnit = 'bytes';
- foreach ($units as $unitName => $unitFactor) {
- if ($bytes >= $unitFactor) {
- $lastUnit = $unitName;
- } else {
- $number = round( $bytes / $units[$lastUnit], $round );
- return number_format($number) . ' ' . $lastUnit;
- }
- }
- }
-
- static function currency($amount, $currency = 'USD', $precision = 2, $negateWithParentheses = false) {
- $definition = array(
- 'EUR' => array('�','.',','), 'GBP' => '�', 'JPY' => '�',
- 'USD'=>'$', 'AU' => '$', 'CAN' => '$'
- );
- $negative = false;
- $separator = ',';
- $decimals = '.';
- $currency = strtoupper($currency);
-
- // Is negative
- if (strpos('-', $amount) !== false) {
- $negative = true;
- $amount = str_replace("-","",$amount);
- }
- $amount = (float) $amount;
-
- if (!$negative) {
- $negative = $amount < 0;
- }
- if ($negateWithParentheses) {
- $amount = abs($amount);
- }
-
- // Get rid of negative zero
- $zero = round(0, $precision);
- if (round($amount, $precision) === $zero) {
- $amount = $zero;
- }
-
- if (isset($definition[$currency])) {
- $symbol = $definition[$currency];
- if (is_array($symbol))
- @list($symbol, $separator, $decimals) = $symbol;
- } else {
- $symbol = $currency;
- }
- $amount = number_format($amount, $precision, $decimals, $separator);
-
- return $negateWithParentheses ? "({$symbol}{$amount})" : "{$symbol}{$amount}";
- }
-}
-
-class HtmlFilters extends FilterCollection {
- static function base_url($url, $options = array()) {
- return $url;
- }
-
- static function asset_url($url, $options = array()) {
- return self::base_url($url, $options);
- }
-
- static function image_tag($url, $options = array()) {
- $attr = self::htmlAttribute(array('alt','width','height','border'), $options);
- return sprintf('', $url, $attr);
- }
-
- static function css_tag($url, $options = array()) {
- $attr = self::htmlAttribute(array('media'), $options);
- return sprintf('', $url, $attr);
- }
-
- static function script_tag($url, $options = array()) {
- return sprintf('', $url);
- }
-
- static function links_to($text, $url, $options = array()) {
- $attrs = self::htmlAttribute(array('ref'), $options);
- $url = self::base_url($url, $options);
- return sprintf('%s', $url, $attrs, $text);
- }
-
- static function links_with ($url, $text, $options = array()) {
- return self::links_to($text, $url, $options);
- }
-
- static function strip_tags($text) {
- $text = preg_replace(array('/', '/>/'), array(' <', '> '),$text);
- return strip_tags($text);
- }
-
- static function linebreaks($value, $format = 'p') {
- if ($format === 'br')
- return HtmlFilters::nl2br($value);
- return HtmlFilters::nl2pbr($value);
- }
-
- static function nl2br($value) {
- return str_replace("\n", "
\n", $value);
- }
-
- static function nl2pbr($value) {
- $result = array();
- $parts = preg_split('/(\r?\n){2,}/m', $value);
- foreach ($parts as $part) {
- array_push($result, '
' . HtmlFilters::nl2br($part) . '
'); - } - return implode("\n", $result); - } - - protected static function htmlAttribute($attrs = array(), $data = array()) { - $attrs = self::extract(array_merge(array('id', 'class', 'title', "style"), $attrs), $data); - - $result = array(); - foreach ($attrs as $name => $value) { - $result[] = "{$name}=\"{$value}\""; - } - return join(' ', $result); - } - - protected static function extract($attrs = array(), $data=array()) { - $result = array(); - if (empty($data)) return array(); - foreach($data as $k => $e) { - if (in_array($k, $attrs)) $result[$k] = $e; - } - return $result; - } -} - -class DatetimeFilters extends FilterCollection { - static function date($time, $format = 'jS F Y H:i') { - if ($time instanceof DateTime) - $time = (int) $time->format('U'); - if (!is_numeric($time)) - $time = strtotime($time); - - return date($format, $time); - } - - static function relative_time($timestamp, $format = 'g:iA') { - if ($timestamp instanceof DateTime) - $timestamp = (int) $timestamp->format('U'); - - $timestamp = is_numeric($timestamp) ? $timestamp: strtotime($timestamp); - - $time = mktime(0, 0, 0); - $delta = time() - $timestamp; - $string = ''; - - if ($timestamp < $time - 86400) { - return date("F j, Y, g:i a", $timestamp); - } - if ($delta > 86400 && $timestamp < $time) { - return "Yesterday at " . date("g:i a", $timestamp); - } - - if ($delta > 7200) - $string .= floor($delta / 3600) . " hours, "; - else if ($delta > 3660) - $string .= "1 hour, "; - else if ($delta >= 3600) - $string .= "1 hour "; - $delta %= 3600; - - if ($delta > 60) - $string .= floor($delta / 60) . " minutes "; - else - $string .= $delta . " seconds "; - return "$string ago"; - } - - static function relative_date($time) { - if ($time instanceof DateTime) - $time = (int) $time->format('U'); - - $time = is_numeric($time) ? $time: strtotime($time); - $today = strtotime(date('M j, Y')); - $reldays = ($time - $today)/86400; - - if ($reldays >= 0 && $reldays < 1) - return 'today'; - else if ($reldays >= 1 && $reldays < 2) - return 'tomorrow'; - else if ($reldays >= -1 && $reldays < 0) - return 'yesterday'; - - if (abs($reldays) < 7) { - if ($reldays > 0) { - $reldays = floor($reldays); - return 'in ' . $reldays . ' day' . ($reldays != 1 ? 's' : ''); - } else { - $reldays = abs(floor($reldays)); - return $reldays . ' day' . ($reldays != 1 ? 's' : '') . ' ago'; - } - } - if (abs($reldays) < 182) - return date('l, F j',$time ? $time : time()); - else - return date('l, F j, Y',$time ? $time : time()); - } - - static function relative_datetime($time) { - $date = self::relative_date($time); - - if ($date === 'today') - return self::relative_time($time); - - return $date; - } -} - -/* Ultizie php funciton as Filters */ -h2o::addFilter(array('md5', 'sha1', 'numberformat'=>'number_format', 'wordwrap', 'trim', 'upper' => 'strtoupper', 'lower' => 'strtolower')); - -/* Add filter collections */ -h2o::addFilter(array('CoreFilters', 'StringFilters', 'NumberFilters', 'DatetimeFilters', 'HtmlFilters')); - -/* Alias default to set_default */ -h2o::addFilter('default', array('CoreFilters', 'set_default')); - -?> + $value) { + $result .= $name.'='.urlencode($value).'&'.$querystring; + } + $querystring = substr($result, 0, strlen($result)-1); + return htmlspecialchars($result); + } else { + return urlencode($data); + } + } + + static function hyphenize ($string) { + $rules = array('/[^\w\s-]+/'=>'','/\s+/'=>'-', '/-{2,}/'=>'-'); + $string = preg_replace(array_keys($rules), $rules, trim($string)); + return $string = trim(strtolower($string)); + } + + static function urlize( $string, $truncate = false ) { + $reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/"; + preg_match_all($reg_exUrl, $string, $matches); + $usedPatterns = array(); + foreach($matches[0] as $pattern){ + if(!array_key_exists($pattern, $usedPatterns)){ + $usedPatterns[$pattern]=true; + $string = str_replace($pattern, "{$pattern}", $string); + } + } + + $reg_exEmail = "/[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/"; + preg_match_all($reg_exEmail, $string, $matches); + $usedPatterns = array(); + foreach($matches[0] as $pattern){ + if(!array_key_exists($pattern, $usedPatterns)){ + $usedPatterns[$pattern]=true; + $string = str_replace($pattern, "{$pattern}", $string); + } + } + return $string; + } + + static function set_default($object, $default) { + return !$object ? $default : $object; + } +} + +class StringFilters extends FilterCollection { + + static function humanize($string) { + $string = preg_replace('/\s+/', ' ', trim(preg_replace('/[^A-Za-z0-9()!,?$]+/', ' ', $string))); + return capfirst($string); + } + + static function capitalize($string) { + return ucwords(strtolower($string)) ; + } + + static function titlize($string) { + return self::capitalize($string); + } + + static function capfirst($string) { + $string = strtolower($string); + return strtoupper($string{0}). substr($string, 1, strlen($string)); + } + + static function tighten_space($value) { + return preg_replace("/\s{2,}/", ' ', $value); + } + + static function escape($value, $attribute = false) { + return htmlspecialchars($value, $attribute ? ENT_QUOTES : ENT_NOQUOTES); + } + + static function escapejson($value) { + // The standard django escapejs converts all non-ascii characters into hex codes. + // This function encodes the entire data structure, and strings get quotes around them. + return json_encode($value); + } + + static function force_escape($value, $attribute = false) { + return self::escape($value, $attribute); + } + + static function e($value, $attribute = false) { + return self::escape($value, $attribute); + } + + static function safe($value) { + return $value; + } + + static function truncate ($string, $max = 50, $ends = '...') { + return (strlen($string) > $max ? substr($string, 0, $max).$ends : $string); + } + + static function limitwords($text, $limit = 50, $ends = '...') { + if (strlen($text) > $limit) { + $words = str_word_count($text, 2); + $pos = array_keys($words); + + if (isset($pos[$limit])) { + $text = substr($text, 0, $pos[$limit]) . $ends; + } + } + return $text; + } +} + +class NumberFilters extends FilterCollection { + static function filesize ($bytes, $round = 1) { + if ($bytes === 0) + return '0 bytes'; + elseif ($bytes === 1) + return '1 byte'; + + $units = array( + 'bytes' => pow(2, 0), 'kB' => pow(2, 10), + 'BM' => pow(2, 20), 'GB' => pow(2, 30), + 'TB' => pow(2, 40), 'PB' => pow(2, 50), + 'EB' => pow(2, 60), 'ZB' => pow(2, 70) + ); + + $lastUnit = 'bytes'; + foreach ($units as $unitName => $unitFactor) { + if ($bytes >= $unitFactor) { + $lastUnit = $unitName; + } else { + $number = round( $bytes / $units[$lastUnit], $round ); + return number_format($number) . ' ' . $lastUnit; + } + } + } + + static function currency($amount, $currency = 'USD', $precision = 2, $negateWithParentheses = false) { + $definition = array( + 'EUR' => array('�','.',','), 'GBP' => '�', 'JPY' => '�', + 'USD'=>'$', 'AU' => '$', 'CAN' => '$' + ); + $negative = false; + $separator = ','; + $decimals = '.'; + $currency = strtoupper($currency); + + // Is negative + if (strpos('-', $amount) !== false) { + $negative = true; + $amount = str_replace("-","",$amount); + } + $amount = (float) $amount; + + if (!$negative) { + $negative = $amount < 0; + } + if ($negateWithParentheses) { + $amount = abs($amount); + } + + // Get rid of negative zero + $zero = round(0, $precision); + if (round($amount, $precision) === $zero) { + $amount = $zero; + } + + if (isset($definition[$currency])) { + $symbol = $definition[$currency]; + if (is_array($symbol)) + @list($symbol, $separator, $decimals) = $symbol; + } else { + $symbol = $currency; + } + $amount = number_format($amount, $precision, $decimals, $separator); + + return $negateWithParentheses ? "({$symbol}{$amount})" : "{$symbol}{$amount}"; + } +} + +class HtmlFilters extends FilterCollection { + static function base_url($url, $options = array()) { + return $url; + } + + static function asset_url($url, $options = array()) { + return self::base_url($url, $options); + } + + static function image_tag($url, $options = array()) { + $attr = self::htmlAttribute(array('alt','width','height','border'), $options); + return sprintf('', $url, $attr); + } + + static function css_tag($url, $options = array()) { + $attr = self::htmlAttribute(array('media'), $options); + return sprintf('', $url, $attr); + } + + static function script_tag($url, $options = array()) { + return sprintf('', $url); + } + + static function links_to($text, $url, $options = array()) { + $attrs = self::htmlAttribute(array('ref'), $options); + $url = self::base_url($url, $options); + return sprintf('%s', $url, $attrs, $text); + } + + static function links_with ($url, $text, $options = array()) { + return self::links_to($text, $url, $options); + } + + static function strip_tags($text) { + $text = preg_replace(array('/', '/>/'), array(' <', '> '),$text); + return strip_tags($text); + } + + static function linebreaks($value, $format = 'p') { + if ($format === 'br') + return HtmlFilters::nl2br($value); + return HtmlFilters::nl2pbr($value); + } + + static function nl2br($value) { + return str_replace("\n", "' . HtmlFilters::nl2br($part) . '
'); + } + return implode("\n", $result); + } + + protected static function htmlAttribute($attrs = array(), $data = array()) { + $attrs = self::extract(array_merge(array('id', 'class', 'title', "style"), $attrs), $data); + + $result = array(); + foreach ($attrs as $name => $value) { + $result[] = "{$name}=\"{$value}\""; + } + return join(' ', $result); + } + + protected static function extract($attrs = array(), $data=array()) { + $result = array(); + if (empty($data)) return array(); + foreach($data as $k => $e) { + if (in_array($k, $attrs)) $result[$k] = $e; + } + return $result; + } +} + +class DatetimeFilters extends FilterCollection { + static function date($time, $format = 'jS F Y H:i') { + if ($time instanceof DateTime) + $time = (int) $time->format('U'); + if (!is_numeric($time)) + $time = strtotime($time); + + return date($format, $time); + } + + static function relative_time($timestamp, $format = 'g:iA') { + if ($timestamp instanceof DateTime) + $timestamp = (int) $timestamp->format('U'); + + $timestamp = is_numeric($timestamp) ? $timestamp: strtotime($timestamp); + + $time = mktime(0, 0, 0); + $delta = time() - $timestamp; + $string = ''; + + if ($timestamp < $time - 86400) { + return date("F j, Y, g:i a", $timestamp); + } + if ($delta > 86400 && $timestamp < $time) { + return "Yesterday at " . date("g:i a", $timestamp); + } + + if ($delta > 7200) + $string .= floor($delta / 3600) . " hours, "; + else if ($delta > 3660) + $string .= "1 hour, "; + else if ($delta >= 3600) + $string .= "1 hour "; + $delta %= 3600; + + if ($delta > 60) + $string .= floor($delta / 60) . " minutes "; + else + $string .= $delta . " seconds "; + return "$string ago"; + } + + static function relative_date($time) { + if ($time instanceof DateTime) + $time = (int) $time->format('U'); + + $time = is_numeric($time) ? $time: strtotime($time); + $today = strtotime(date('M j, Y')); + $reldays = ($time - $today)/86400; + + if ($reldays >= 0 && $reldays < 1) + return 'today'; + else if ($reldays >= 1 && $reldays < 2) + return 'tomorrow'; + else if ($reldays >= -1 && $reldays < 0) + return 'yesterday'; + + if (abs($reldays) < 7) { + if ($reldays > 0) { + $reldays = floor($reldays); + return 'in ' . $reldays . ' day' . ($reldays != 1 ? 's' : ''); + } else { + $reldays = abs(floor($reldays)); + return $reldays . ' day' . ($reldays != 1 ? 's' : '') . ' ago'; + } + } + if (abs($reldays) < 182) + return date('l, F j',$time ? $time : time()); + else + return date('l, F j, Y',$time ? $time : time()); + } + + static function relative_datetime($time) { + $date = self::relative_date($time); + + if ($date === 'today') + return self::relative_time($time); + + return $date; + } +} + +/* Ultizie php funciton as Filters */ +h2o::addFilter(array('md5', 'sha1', 'numberformat'=>'number_format', 'wordwrap', 'trim', 'upper' => 'strtoupper', 'lower' => 'strtolower')); + +/* Add filter collections */ +h2o::addFilter(array('CoreFilters', 'StringFilters', 'NumberFilters', 'DatetimeFilters', 'HtmlFilters')); + +/* Alias default to set_default */ +h2o::addFilter('default', array('CoreFilters', 'set_default')); + +?> diff --git a/system/vendor/h2o/loaders.php b/system/vendor/h2o/loaders.php index 1a5975a..91a392f 100644 --- a/system/vendor/h2o/loaders.php +++ b/system/vendor/h2o/loaders.php @@ -1,290 +1,290 @@ -searchpath = (array) $searchpath; - $this->setOptions($options); - } - - function setOptions($options = array()) { - if (isset($options['cache']) && $options['cache']) { - $this->cache = h2o_cache($options); - } - } - - function read($filename) { - - if (!is_file($filename)) - $filename = $this->get_template_path($this->searchpath,$filename); - - if (is_file($filename)) { - $source = file_get_contents($filename); - return $this->runtime->parse($source); - } else { - throw new TemplateNotFound($filename); - } - } - - function get_template_path($search_path, $filename){ - - - for ($i=0 ; $i < count($search_path) ; $i++) - { - - if(file_exists($search_path[$i] . $filename)) { - $filename = $search_path[$i] . $filename; - return $filename; - break; - } else { - continue; - } - - } - - throw new Exception('TemplateNotFound - Looked for template: ' . $filename); - - - - } - - function read_cache($filename) { - if (!$this->cache){ - $filename = $this->get_template_path($this->searchpath,$filename); - return $this->read($filename); - } - - if (!is_file($filename)){ - $filename = $this->get_template_path($this->searchpath,$filename); - } - - $filename = realpath($filename); - - $cache = md5($filename); - $object = $this->cache->read($cache); - $this->cached = $object && !$this->expired($object); - - if (!$this->cached) { - $nodelist = $this->read($filename); - $object = (object) array( - 'filename' => $filename, - 'content' => serialize($nodelist), - 'created' => time(), - 'templates' => $nodelist->parser->storage['templates'], - 'included' => $nodelist->parser->storage['included'] + array_values(h2o::$extensions) - ); - $this->cache->write($cache, $object); - } else { - foreach($object->included as $ext => $file) { - include_once (h2o::$extensions[$ext] = $file); - } - } - return unserialize($object->content); - } - - function flush_cache() { - $this->cache->flush(); - } - - function expired($object) { - if (!$object) return false; - - $files = array_merge(array($object->filename), $object->templates); - foreach ($files as $file) { - if (!is_file($file)) - $file = $this->get_template_path($this->searchpath, $file); - - if ($object->created < filemtime($file)) - return true; - } - return false; - } -} - -function file_loader($file) { - return new H2o_File_Loader($file); -} - -class H2o_Hash_Loader { - - function __construct($scope, $options = array()) { - $this->scope = $scope; - } - - function setOptions() {} - - function read($file) { - if (!isset($this->scope[$file])) - throw new TemplateNotFound; - return $this->runtime->parse($this->scope[$file], $file); - } - - function read_cache($file) { - return $this->read($file); - } -} - -function hash_loader($hash = array()) { - return new H2o_Hash_Loader($hash); -} - -/** - * Cache subsystem - * - */ -function h2o_cache($options = array()) { - $type = $options['cache']; - $className = "H2o_".ucwords($type)."_Cache"; - - if (class_exists($className, false)) { - return new $className($options); - } - return false; -} - -class H2o_File_Cache { - var $ttl = 3600; - var $prefix = 'h2o_'; - - function __construct($options = array()) { - if (isset($options['cache_dir']) && is_writable($options['cache_dir'])) { - $path = $options['cache_dir']; - } else { - $path = dirname($tmp = tempnam(uniqid(rand(), true), '')); - - if (file_exists($tmp)) unlink($tmp); - } - if (isset($options['cache_ttl'])) { - $this->ttl = $options['cache_ttl']; - } - if(isset($options['cache_prefix'])) { - $this->prefix = $options['cache_prefix']; - } - - $this->path = realpath($path). DS; - } - - function read($filename) { - if (!file_exists($this->path . $this->prefix. $filename)) - return false; - - $content = file_get_contents($this->path . $this->prefix. $filename); - $expires = (int)substr($content, 0, 10); - - if (time() >= $expires) - return false; - return unserialize(trim(substr($content, 10))); - } - - function write($filename, &$object) { - $expires = time() + $this->ttl; - $content = $expires . serialize($object); - return file_put_contents($this->path . $this->prefix. $filename, $content); - } - - function flush() { - foreach (glob($this->path. $this->prefix. '*') as $file) { - @unlink($file); - } - } -} - -class H2o_Apc_Cache { - var $ttl = 3600; - var $prefix = 'h2o_'; - - function __construct($options = array()) { - if (!function_exists('apc_add')) - throw new Exception('APC extension needs to be loaded to use APC cache'); - - if (isset($options['cache_ttl'])) { - $this->ttl = $options['cache_ttl']; - } - if(isset($options['cache_prefix'])) { - $this->prefix = $options['cache_prefix']; - } - } - - function read($filename) { - return apc_fetch($this->prefix.$filename); - } - - function write($filename, $object) { - return apc_store($this->prefix.$filename, $object, $this->ttl); - } - - function flush() { - return apc_clear_cache('user'); - } -} - - -class H2o_Memcache_Cache { - var $ttl = 3600; - var $prefix = 'h2o_'; - /** - * @var host default is file socket - */ - var $host = 'unix:///tmp/memcached.sock'; - var $port = 0; - var $object; - function __construct( $scope, $options = array() ) { - if ( !function_exists( 'memcache_set' ) ) - throw new Exception( 'Memcache extension needs to be loaded to use memcache' ); - - if ( isset( $options['cache_ttl'] ) ) { - $this->ttl = $options['cache_ttl']; - } - if( isset( $options['cache_prefix'] ) ) { - $this->prefix = $options['cache_prefix']; - } - - if( isset( $options['host'] ) ) { - $this->host = $options['host']; - } - - if( isset( $options['port'] ) ) { - $this->port = $options['port']; - } - - $this->object = memcache_connect( $this->host, $this->port ); - } - - function read( $filename ){ - return memcache_get( $this->object, $this->prefix.$filename ); - } - - function write( $filename, $content ) { - return memcache_set( $this->object,$this->prefix.$filename,$content , MEMCACHE_COMPRESSED,$this->ttl ); - } - - function flush(){ - return memcache_flush( $this->object ); - } +searchpath = (array) $searchpath; + $this->setOptions($options); + } + + function setOptions($options = array()) { + if (isset($options['cache']) && $options['cache']) { + $this->cache = h2o_cache($options); + } + } + + function read($filename) { + + if (!is_file($filename)) + $filename = $this->get_template_path($this->searchpath,$filename); + + if (is_file($filename)) { + $source = file_get_contents($filename); + return $this->runtime->parse($source); + } else { + throw new TemplateNotFound($filename); + } + } + + function get_template_path($search_path, $filename){ + + + for ($i=0 ; $i < count($search_path) ; $i++) + { + + if(file_exists($search_path[$i] . $filename)) { + $filename = $search_path[$i] . $filename; + return $filename; + break; + } else { + continue; + } + + } + + throw new Exception('TemplateNotFound - Looked for template: ' . $filename); + + + + } + + function read_cache($filename) { + if (!$this->cache){ + $filename = $this->get_template_path($this->searchpath,$filename); + return $this->read($filename); + } + + if (!is_file($filename)){ + $filename = $this->get_template_path($this->searchpath,$filename); + } + + $filename = realpath($filename); + + $cache = md5($filename); + $object = $this->cache->read($cache); + $this->cached = $object && !$this->expired($object); + + if (!$this->cached) { + $nodelist = $this->read($filename); + $object = (object) array( + 'filename' => $filename, + 'content' => serialize($nodelist), + 'created' => time(), + 'templates' => $nodelist->parser->storage['templates'], + 'included' => $nodelist->parser->storage['included'] + array_values(h2o::$extensions) + ); + $this->cache->write($cache, $object); + } else { + foreach($object->included as $ext => $file) { + include_once (h2o::$extensions[$ext] = $file); + } + } + return unserialize($object->content); + } + + function flush_cache() { + $this->cache->flush(); + } + + function expired($object) { + if (!$object) return false; + + $files = array_merge(array($object->filename), $object->templates); + foreach ($files as $file) { + if (!is_file($file)) + $file = $this->get_template_path($this->searchpath, $file); + + if ($object->created < filemtime($file)) + return true; + } + return false; + } +} + +function file_loader($file) { + return new H2o_File_Loader($file); +} + +class H2o_Hash_Loader { + + function __construct($scope, $options = array()) { + $this->scope = $scope; + } + + function setOptions() {} + + function read($file) { + if (!isset($this->scope[$file])) + throw new TemplateNotFound; + return $this->runtime->parse($this->scope[$file], $file); + } + + function read_cache($file) { + return $this->read($file); + } +} + +function hash_loader($hash = array()) { + return new H2o_Hash_Loader($hash); +} + +/** + * Cache subsystem + * + */ +function h2o_cache($options = array()) { + $type = $options['cache']; + $className = "H2o_".ucwords($type)."_Cache"; + + if (class_exists($className, false)) { + return new $className($options); + } + return false; +} + +class H2o_File_Cache { + var $ttl = 3600; + var $prefix = 'h2o_'; + + function __construct($options = array()) { + if (isset($options['cache_dir']) && is_writable($options['cache_dir'])) { + $path = $options['cache_dir']; + } else { + $path = dirname($tmp = tempnam(uniqid(rand(), true), '')); + + if (file_exists($tmp)) unlink($tmp); + } + if (isset($options['cache_ttl'])) { + $this->ttl = $options['cache_ttl']; + } + if(isset($options['cache_prefix'])) { + $this->prefix = $options['cache_prefix']; + } + + $this->path = realpath($path). DS; + } + + function read($filename) { + if (!file_exists($this->path . $this->prefix. $filename)) + return false; + + $content = file_get_contents($this->path . $this->prefix. $filename); + $expires = (int)substr($content, 0, 10); + + if (time() >= $expires) + return false; + return unserialize(trim(substr($content, 10))); + } + + function write($filename, &$object) { + $expires = time() + $this->ttl; + $content = $expires . serialize($object); + return file_put_contents($this->path . $this->prefix. $filename, $content); + } + + function flush() { + foreach (glob($this->path. $this->prefix. '*') as $file) { + @unlink($file); + } + } +} + +class H2o_Apc_Cache { + var $ttl = 3600; + var $prefix = 'h2o_'; + + function __construct($options = array()) { + if (!function_exists('apc_add')) + throw new Exception('APC extension needs to be loaded to use APC cache'); + + if (isset($options['cache_ttl'])) { + $this->ttl = $options['cache_ttl']; + } + if(isset($options['cache_prefix'])) { + $this->prefix = $options['cache_prefix']; + } + } + + function read($filename) { + return apc_fetch($this->prefix.$filename); + } + + function write($filename, $object) { + return apc_store($this->prefix.$filename, $object, $this->ttl); + } + + function flush() { + return apc_clear_cache('user'); + } +} + + +class H2o_Memcache_Cache { + var $ttl = 3600; + var $prefix = 'h2o_'; + /** + * @var host default is file socket + */ + var $host = 'unix:///tmp/memcached.sock'; + var $port = 0; + var $object; + function __construct( $scope, $options = array() ) { + if ( !function_exists( 'memcache_set' ) ) + throw new Exception( 'Memcache extension needs to be loaded to use memcache' ); + + if ( isset( $options['cache_ttl'] ) ) { + $this->ttl = $options['cache_ttl']; + } + if( isset( $options['cache_prefix'] ) ) { + $this->prefix = $options['cache_prefix']; + } + + if( isset( $options['host'] ) ) { + $this->host = $options['host']; + } + + if( isset( $options['port'] ) ) { + $this->port = $options['port']; + } + + $this->object = memcache_connect( $this->host, $this->port ); + } + + function read( $filename ){ + return memcache_get( $this->object, $this->prefix.$filename ); + } + + function write( $filename, $content ) { + return memcache_set( $this->object,$this->prefix.$filename,$content , MEMCACHE_COMPRESSED,$this->ttl ); + } + + function flush(){ + return memcache_flush( $this->object ); + } } \ No newline at end of file diff --git a/system/vendor/h2o/nodes.php b/system/vendor/h2o/nodes.php index 9368ea6..11dad3f 100644 --- a/system/vendor/h2o/nodes.php +++ b/system/vendor/h2o/nodes.php @@ -1,84 +1,84 @@ -parser = $parser; - if (is_null($initial)) - $initial = array(); - $this->list = $initial; - $this->position = $position; - } - - function render($context, $stream) { - foreach($this->list as $node) { - $node->render($context, $stream); - } - } - - function append($node) { - array_push($this->list, $node); - } - - function extend($nodes) { - array_merge($this->list, $nodes); - } - - function getLength() { - return count($this->list); - } - - function getIterator() { - return new ArrayIterator( $this->list ); - } -} - -class VariableNode extends H2o_Node { - private $filters = array(); - var $variable; - - function __construct($variable, $filters, $position = 0) { - if (!empty($filters)) - $this->filters = $filters; - $this->variable = $variable; - } - - function render($context, $stream) { - $value = $context->resolve($this->variable); - $value = $context->escape($value, $this->variable); - $stream->write($value); - } -} - -class CommentNode extends H2o_Node {} - -class TextNode extends H2o_Node { - var $content; - function __construct($content, $position = 0) { - $this->content = $content; - $this->position = $position; - } - - function render($context, $stream) { - $stream->write($this->content); - } - - function is_blank() { - return strlen(trim($this->content)); - } -} - - +parser = $parser; + if (is_null($initial)) + $initial = array(); + $this->list = $initial; + $this->position = $position; + } + + function render($context, $stream) { + foreach($this->list as $node) { + $node->render($context, $stream); + } + } + + function append($node) { + array_push($this->list, $node); + } + + function extend($nodes) { + array_merge($this->list, $nodes); + } + + function getLength() { + return count($this->list); + } + + function getIterator() { + return new ArrayIterator( $this->list ); + } +} + +class VariableNode extends H2o_Node { + private $filters = array(); + var $variable; + + function __construct($variable, $filters, $position = 0) { + if (!empty($filters)) + $this->filters = $filters; + $this->variable = $variable; + } + + function render($context, $stream) { + $value = $context->resolve($this->variable); + $value = $context->escape($value, $this->variable); + $stream->write($value); + } +} + +class CommentNode extends H2o_Node {} + +class TextNode extends H2o_Node { + var $content; + function __construct($content, $position = 0) { + $this->content = $content; + $this->position = $position; + } + + function render($context, $stream) { + $stream->write($this->content); + } + + function is_blank() { + return strlen(trim($this->content)); + } +} + + ?> \ No newline at end of file diff --git a/system/vendor/h2o/parser.php b/system/vendor/h2o/parser.php index 530d00f..a805243 100644 --- a/system/vendor/h2o/parser.php +++ b/system/vendor/h2o/parser.php @@ -1,290 +1,290 @@ -options = $options; - - $trim = ''; - if ($this->options['TRIM_TAGS']) - $trim = '(?:\r?\n)?'; - - $this->pattern = ('/\G(.*?)(?:' . - preg_quote($this->options['BLOCK_START']). '(.*?)' .preg_quote($this->options['BLOCK_END']) . $trim . '|' . - preg_quote($this->options['VARIABLE_START']). '(.*?)' .preg_quote($this->options['VARIABLE_END']) . '|' . - preg_quote($this->options['COMMENT_START']). '(.*?)' .preg_quote($this->options['COMMENT_END']) . $trim . ')/sm' - ); - } - - function tokenize($source) { - $result = new TokenStream; - $pos = 0; - $matches = array(); - preg_match_all($this->pattern, $source, $matches, PREG_SET_ORDER); - - foreach ($matches as $match) { - if ($match[1]) - $result->feed('text', $match[1], $pos); - $tagpos = $pos + strlen($match[1]); - if ($match[2]) - $result->feed('block', trim($match[2]), $tagpos); - elseif ($match[3]) - $result->feed('variable', trim($match[3]), $tagpos); - elseif ($match[4]) - $result->feed('comment', trim($match[4]), $tagpos); - $pos += strlen($match[0]); - } - if ($pos < strlen($source)){ - $result->feed('text', substr($source, $pos), $pos); - } - $result->close(); - return $result; - } -} - -class H2o_Parser { - var $first; - var $storage = array(); - var $filename; - var $runtime; - - function __construct($source, $filename, $runtime, $options) { - $this->options = $options; - //$this->source = $source; - $this->runtime = $runtime; - $this->filename = $filename; - $this->first = true; - - $this->lexer = new H2o_Lexer($options); - $this->tokenstream = $this->lexer->tokenize($source); - $this->storage = array( - 'blocks' => array(), - 'templates' => array(), - 'included' => array() - ); - } - - function &parse() { - $until = func_get_args(); - $nodelist = new NodeList($this); - while($token = $this->tokenstream->next()) { - //$token = $this->tokenstream->current(); - switch($token->type) { - case 'text' : - $node = new TextNode($token->content, $token->position); - break; - case 'variable' : - $args = H2o_Parser::parseArguments($token->content, $token->position); - $variable = array_shift($args); - $filters = $args; - $node = new VariableNode($variable, $filters, $token->position); - break; - case 'comment' : - $node = new CommentNode($token->content); - break; - case 'block' : - if (in_array($token->content, $until)) { - $this->token = $token; - return $nodelist; - } - $temp = preg_split('/\s+/',$token->content, 2); - $name = $temp[0]; - $args = (count($temp) > 1 ? $temp[1] : null); - $node = H2o::createTag($name, $args, $this, $token->position); - $this->token = $token; - } - $this->searching = join(',',$until); - $this->first = false; - $nodelist->append($node); - } - - if ($until) { - throw new TemplateSyntaxError('Unclose tag, expecting '. $until[0]); - } - return $nodelist; - } - - function skipTo($until) { - $this->parse($until); - return null; - } - - # Parse arguments - static function parseArguments($source = null, $fpos = 0){ - $parser = new ArgumentLexer($source, $fpos); - $result = array(); - $current_buffer = &$result; - $filter_buffer = array(); - $tokens = $parser->parse(); - foreach ($tokens as $token) { - list($token, $data) = $token; - if ($token == 'filter_start') { - $filter_buffer = array(); - $current_buffer = &$filter_buffer; - } - elseif ($token == 'filter_end') { - if (count($filter_buffer)) { - - $i = count($result)-1; - if ( is_array($result[$i]) ) $result[$i]['filters'][] = $filter_buffer; - else $result[$i] = array(0 => $result[$i], 'filters' => array($filter_buffer)); - } - $current_buffer = &$result; - } - elseif ($token == 'boolean') { - $current_buffer[] = ($data === 'true'? true : false); - } - elseif ($token == 'name') { - $current_buffer[] = symbol($data); - } - elseif ($token == 'number' || $token == 'string') { - $current_buffer[] = $data; - } - elseif ($token == 'named_argument') { - $last = $current_buffer[count($current_buffer) - 1]; - if (!is_array($last)) - $current_buffer[] = array(); - - $namedArgs =& $current_buffer[count($current_buffer) - 1]; - list($name,$value) = array_map('trim', explode(':', $data, 2)); - - # if argument value is variable mark it - $value = self::parseArguments($value); - $namedArgs[$name] = $value[0]; - } - elseif( $token == 'operator') { - $current_buffer[] = array('operator'=>$data); - } - } - return $result; - } -} - -class H2O_RE { - static $whitespace, $seperator, $parentheses, $pipe, $filter_end, $operator, $boolean, $number, $string, $i18n_string, $name, $named_args; - - static function init() { - $r = 'strip_regex'; - - self::$whitespace = '/\s+/m'; - self::$parentheses = '/\(|\)/m'; - self::$filter_end = '/;/'; - self::$boolean = '/true|false/'; - self::$seperator = '/,/'; - self::$pipe = '/\|/'; - self::$operator = '/\s?(>|<|>=|<=|!=|==|!|and |not |or )\s?/i'; - self::$number = '/\d+(\.\d*)?/'; - self::$name = '/[a-zA-Z][a-zA-Z0-9-_]*(?:\.[a-zA-Z_0-9][a-zA-Z0-9_-]*)*/'; - - self::$string = '/(?: - "([^"\\\\]*(?:\\\\.[^"\\\\]*)*)" | # Double Quote string - \'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\' # Single Quote String - )/xsm'; - self::$i18n_string = "/_\({$r(self::$string)}\) | {$r(self::$string)}/xsm"; - - self::$named_args = "{ - ({$r(self::$name)})(?:{$r(self::$whitespace)})? - : - (?:{$r(self::$whitespace)})?({$r(self::$i18n_string)}|{$r(self::$number)}|{$r(self::$name)}) - }x"; - } -} -H2O_RE::init(); - -class ArgumentLexer { - private $source; - private $match; - private $pos = 0, $fpos, $eos; - private $operator_map = array( - '!' => 'not', '!='=> 'ne', '==' => 'eq', '>' => 'gt', '<' => 'lt', '<=' => 'le', '>=' => 'ge' - ); - - function __construct($source, $fpos = 0){ - if (!is_null($source)) - $this->source = $source; - $this->fpos=$fpos; - } - - function parse(){ - $result = array(); - $filtering = false; - while (!$this->eos()) { - $this->scan(H2O_RE::$whitespace); - if (!$filtering) { - if ($this->scan(H2O_RE::$operator)){ - $operator = trim($this->match); - if(isset($this->operator_map[$operator])) - $operator = $this->operator_map[$operator]; - $result[] = array('operator', $operator); - } - elseif ($this->scan(H2O_RE::$boolean)) - $result[] = array('boolean', $this->match); - elseif ($this->scan(H2O_RE::$named_args)) - $result[] = array('named_argument', $this->match); - elseif ($this->scan(H2O_RE::$name)) - $result[] = array('name', $this->match); - elseif ($this->scan(H2O_RE::$pipe)) { - $filtering = true; - $result[] = array('filter_start', $this->match); - } - elseif ($this->scan(H2O_RE::$seperator)) - $result[] = array('separator', null); - elseif ($this->scan(H2O_RE::$i18n_string)) - $result[] = array('string', $this->match); - elseif ($this->scan(H2O_RE::$number)) - $result[] = array('number', $this->match); - else - throw new TemplateSyntaxError('unexpected character in filters : "'. $this->source[$this->pos]. '" at '.$this->getPosition()); - } - else { - // parse filters, with chaining and ";" as filter end character - if ($this->scan(H2O_RE::$pipe)) { - $result[] = array('filter_end', null); - $result[] = array('filter_start', null); - } - elseif ($this->scan(H2O_RE::$seperator)) - $result[] = array('separator', null); - elseif ($this->scan(H2O_RE::$filter_end)) { - $result[] = array('filter_end', null); - $filtering = false; - } - elseif ($this->scan(H2O_RE::$boolean)) - $result[] = array('boolean', $this->match); - elseif ($this->scan(H2O_RE::$named_args)) - $result[] = array('named_argument', $this->match); - elseif ($this->scan(H2O_RE::$name)) - $result[] = array('name', $this->match); - elseif ($this->scan(H2O_RE::$i18n_string)) - $result[] = array('string', $this->match); - elseif ($this->scan(H2O_RE::$number)) - $result[] = array('number', $this->match); - else - throw new TemplateSyntaxError('unexpected character in filters : "'. $this->source[$this->pos]. '" at '.$this->getPosition()); - } - } - // if we are still in the filter state, we add a filter_end token. - if ($filtering) - $result[] = array('filter_end', null); - return $result; - } - - # String scanner - function scan($regexp) { - if (preg_match($regexp . 'A', $this->source, $match, null, $this->pos)) { - $this->match = $match[0]; - $this->pos += strlen($this->match); - return true; - } - return false; - } - - function eos() { - return $this->pos >= strlen($this->source); - } - - /** - * return the position in the template - */ - function getPosition() { - return $this->fpos + $this->pos; - } -} -?> +options = $options; + + $trim = ''; + if ($this->options['TRIM_TAGS']) + $trim = '(?:\r?\n)?'; + + $this->pattern = ('/\G(.*?)(?:' . + preg_quote($this->options['BLOCK_START']). '(.*?)' .preg_quote($this->options['BLOCK_END']) . $trim . '|' . + preg_quote($this->options['VARIABLE_START']). '(.*?)' .preg_quote($this->options['VARIABLE_END']) . '|' . + preg_quote($this->options['COMMENT_START']). '(.*?)' .preg_quote($this->options['COMMENT_END']) . $trim . ')/sm' + ); + } + + function tokenize($source) { + $result = new TokenStream; + $pos = 0; + $matches = array(); + preg_match_all($this->pattern, $source, $matches, PREG_SET_ORDER); + + foreach ($matches as $match) { + if ($match[1]) + $result->feed('text', $match[1], $pos); + $tagpos = $pos + strlen($match[1]); + if ($match[2]) + $result->feed('block', trim($match[2]), $tagpos); + elseif ($match[3]) + $result->feed('variable', trim($match[3]), $tagpos); + elseif ($match[4]) + $result->feed('comment', trim($match[4]), $tagpos); + $pos += strlen($match[0]); + } + if ($pos < strlen($source)){ + $result->feed('text', substr($source, $pos), $pos); + } + $result->close(); + return $result; + } +} + +class H2o_Parser { + var $first; + var $storage = array(); + var $filename; + var $runtime; + + function __construct($source, $filename, $runtime, $options) { + $this->options = $options; + //$this->source = $source; + $this->runtime = $runtime; + $this->filename = $filename; + $this->first = true; + + $this->lexer = new H2o_Lexer($options); + $this->tokenstream = $this->lexer->tokenize($source); + $this->storage = array( + 'blocks' => array(), + 'templates' => array(), + 'included' => array() + ); + } + + function &parse() { + $until = func_get_args(); + $nodelist = new NodeList($this); + while($token = $this->tokenstream->next()) { + //$token = $this->tokenstream->current(); + switch($token->type) { + case 'text' : + $node = new TextNode($token->content, $token->position); + break; + case 'variable' : + $args = H2o_Parser::parseArguments($token->content, $token->position); + $variable = array_shift($args); + $filters = $args; + $node = new VariableNode($variable, $filters, $token->position); + break; + case 'comment' : + $node = new CommentNode($token->content); + break; + case 'block' : + if (in_array($token->content, $until)) { + $this->token = $token; + return $nodelist; + } + $temp = preg_split('/\s+/',$token->content, 2); + $name = $temp[0]; + $args = (count($temp) > 1 ? $temp[1] : null); + $node = H2o::createTag($name, $args, $this, $token->position); + $this->token = $token; + } + $this->searching = join(',',$until); + $this->first = false; + $nodelist->append($node); + } + + if ($until) { + throw new TemplateSyntaxError('Unclose tag, expecting '. $until[0]); + } + return $nodelist; + } + + function skipTo($until) { + $this->parse($until); + return null; + } + + # Parse arguments + static function parseArguments($source = null, $fpos = 0){ + $parser = new ArgumentLexer($source, $fpos); + $result = array(); + $current_buffer = &$result; + $filter_buffer = array(); + $tokens = $parser->parse(); + foreach ($tokens as $token) { + list($token, $data) = $token; + if ($token == 'filter_start') { + $filter_buffer = array(); + $current_buffer = &$filter_buffer; + } + elseif ($token == 'filter_end') { + if (count($filter_buffer)) { + + $i = count($result)-1; + if ( is_array($result[$i]) ) $result[$i]['filters'][] = $filter_buffer; + else $result[$i] = array(0 => $result[$i], 'filters' => array($filter_buffer)); + } + $current_buffer = &$result; + } + elseif ($token == 'boolean') { + $current_buffer[] = ($data === 'true'? true : false); + } + elseif ($token == 'name') { + $current_buffer[] = symbol($data); + } + elseif ($token == 'number' || $token == 'string') { + $current_buffer[] = $data; + } + elseif ($token == 'named_argument') { + $last = $current_buffer[count($current_buffer) - 1]; + if (!is_array($last)) + $current_buffer[] = array(); + + $namedArgs =& $current_buffer[count($current_buffer) - 1]; + list($name,$value) = array_map('trim', explode(':', $data, 2)); + + # if argument value is variable mark it + $value = self::parseArguments($value); + $namedArgs[$name] = $value[0]; + } + elseif( $token == 'operator') { + $current_buffer[] = array('operator'=>$data); + } + } + return $result; + } +} + +class H2O_RE { + static $whitespace, $seperator, $parentheses, $pipe, $filter_end, $operator, $boolean, $number, $string, $i18n_string, $name, $named_args; + + static function init() { + $r = 'strip_regex'; + + self::$whitespace = '/\s+/m'; + self::$parentheses = '/\(|\)/m'; + self::$filter_end = '/;/'; + self::$boolean = '/true|false/'; + self::$seperator = '/,/'; + self::$pipe = '/\|/'; + self::$operator = '/\s?(>|<|>=|<=|!=|==|!|and |not |or )\s?/i'; + self::$number = '/\d+(\.\d*)?/'; + self::$name = '/[a-zA-Z][a-zA-Z0-9-_]*(?:\.[a-zA-Z_0-9][a-zA-Z0-9_-]*)*/'; + + self::$string = '/(?: + "([^"\\\\]*(?:\\\\.[^"\\\\]*)*)" | # Double Quote string + \'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\' # Single Quote String + )/xsm'; + self::$i18n_string = "/_\({$r(self::$string)}\) | {$r(self::$string)}/xsm"; + + self::$named_args = "{ + ({$r(self::$name)})(?:{$r(self::$whitespace)})? + : + (?:{$r(self::$whitespace)})?({$r(self::$i18n_string)}|{$r(self::$number)}|{$r(self::$name)}) + }x"; + } +} +H2O_RE::init(); + +class ArgumentLexer { + private $source; + private $match; + private $pos = 0, $fpos, $eos; + private $operator_map = array( + '!' => 'not', '!='=> 'ne', '==' => 'eq', '>' => 'gt', '<' => 'lt', '<=' => 'le', '>=' => 'ge' + ); + + function __construct($source, $fpos = 0){ + if (!is_null($source)) + $this->source = $source; + $this->fpos=$fpos; + } + + function parse(){ + $result = array(); + $filtering = false; + while (!$this->eos()) { + $this->scan(H2O_RE::$whitespace); + if (!$filtering) { + if ($this->scan(H2O_RE::$operator)){ + $operator = trim($this->match); + if(isset($this->operator_map[$operator])) + $operator = $this->operator_map[$operator]; + $result[] = array('operator', $operator); + } + elseif ($this->scan(H2O_RE::$boolean)) + $result[] = array('boolean', $this->match); + elseif ($this->scan(H2O_RE::$named_args)) + $result[] = array('named_argument', $this->match); + elseif ($this->scan(H2O_RE::$name)) + $result[] = array('name', $this->match); + elseif ($this->scan(H2O_RE::$pipe)) { + $filtering = true; + $result[] = array('filter_start', $this->match); + } + elseif ($this->scan(H2O_RE::$seperator)) + $result[] = array('separator', null); + elseif ($this->scan(H2O_RE::$i18n_string)) + $result[] = array('string', $this->match); + elseif ($this->scan(H2O_RE::$number)) + $result[] = array('number', $this->match); + else + throw new TemplateSyntaxError('unexpected character in filters : "'. $this->source[$this->pos]. '" at '.$this->getPosition()); + } + else { + // parse filters, with chaining and ";" as filter end character + if ($this->scan(H2O_RE::$pipe)) { + $result[] = array('filter_end', null); + $result[] = array('filter_start', null); + } + elseif ($this->scan(H2O_RE::$seperator)) + $result[] = array('separator', null); + elseif ($this->scan(H2O_RE::$filter_end)) { + $result[] = array('filter_end', null); + $filtering = false; + } + elseif ($this->scan(H2O_RE::$boolean)) + $result[] = array('boolean', $this->match); + elseif ($this->scan(H2O_RE::$named_args)) + $result[] = array('named_argument', $this->match); + elseif ($this->scan(H2O_RE::$name)) + $result[] = array('name', $this->match); + elseif ($this->scan(H2O_RE::$i18n_string)) + $result[] = array('string', $this->match); + elseif ($this->scan(H2O_RE::$number)) + $result[] = array('number', $this->match); + else + throw new TemplateSyntaxError('unexpected character in filters : "'. $this->source[$this->pos]. '" at '.$this->getPosition()); + } + } + // if we are still in the filter state, we add a filter_end token. + if ($filtering) + $result[] = array('filter_end', null); + return $result; + } + + # String scanner + function scan($regexp) { + if (preg_match($regexp . 'A', $this->source, $match, null, $this->pos)) { + $this->match = $match[0]; + $this->pos += strlen($this->match); + return true; + } + return false; + } + + function eos() { + return $this->pos >= strlen($this->source); + } + + /** + * return the position in the template + */ + function getPosition() { + return $this->fpos + $this->pos; + } +} +?> diff --git a/system/vendor/is_cli.php b/system/vendor/is_cli.php new file mode 100644 index 0000000..abb9488 --- /dev/null +++ b/system/vendor/is_cli.php @@ -0,0 +1,17 @@ + 0) + { + return true; + } + + return false; +} \ No newline at end of file diff --git a/system/vendor/isvarset.php b/system/vendor/isvarset.php index 27f1a65..ab68f38 100644 --- a/system/vendor/isvarset.php +++ b/system/vendor/isvarset.php @@ -1,6 +1,6 @@ - + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/system/vendor/phpoauthlib2/ccurl.php b/system/vendor/phpoauthlib2/ccurl.php new file mode 100644 index 0000000..d66ec60 --- /dev/null +++ b/system/vendor/phpoauthlib2/ccurl.php @@ -0,0 +1,149 @@ +authentication = 0; + if($use == true) $this->authentication = 1; + } + + public function setName($name){ + $this->auth_name = $name; + } + public function setPass($pass){ + $this->auth_pass = $pass; + } + + public function addHeader($head) + { + $this->_header[] = $head; + } + + public function __construct($url,$followlocation = true,$timeOut = 30,$maxRedirecs = 4,$binaryTransfer = false,$includeHeader = false,$noBody = false) + { + $this->_url = $url; + $this->_followlocation = $followlocation; + $this->_timeout = $timeOut; + $this->_maxRedirects = $maxRedirecs; + $this->_noBody = $noBody; + $this->_includeHeader = $includeHeader; + $this->_binaryTransfer = $binaryTransfer; + + $this->_cookieFileLocation = dirname(__FILE__).'/cookie.txt'; + + } + + public function setReferer($referer){ + $this->_referer = $referer; + } + + public function setCookiFileLocation($path) + { + $this->_cookieFileLocation = $path; + } + + public function setPost ($postFields) + { + $this->_post = true; + $this->_postFields = $postFields; + } + + public function setUserAgent($userAgent) + { + $this->_useragent = $userAgent; + } + + public function createCurl($url = 'nul') + { + if($url != 'nul'){ + $this->_url = $url; + } + + $s = curl_init(); + + curl_setopt($s,CURLOPT_URL,$this->_url); + + // I understand the implications here - but this isn't a client application + // if my ISP is performing MITM sniffing I have bigger fish to fry + // also the security of a CA signed certificate is questionable at best + // https://www.schneier.com/blog/archives/2012/02/verisign_hacked.html + // Email me if you want to discus this adamsna@datanethost.net + // NA - 12/10/2014 + curl_setopt($s, CURLOPT_SSL_VERIFYPEER, false); + + curl_setopt($s,CURLOPT_HTTPHEADER,$this->_header); + curl_setopt($s,CURLOPT_TIMEOUT,$this->_timeout); + curl_setopt($s,CURLOPT_MAXREDIRS,$this->_maxRedirects); + curl_setopt($s,CURLOPT_RETURNTRANSFER,true); + curl_setopt($s,CURLOPT_FOLLOWLOCATION,$this->_followlocation); + curl_setopt($s,CURLOPT_COOKIEJAR,$this->_cookieFileLocation); + curl_setopt($s,CURLOPT_COOKIEFILE,$this->_cookieFileLocation); + + if($this->authentication == 1){ + curl_setopt($s, CURLOPT_USERPWD, $this->auth_name.':'.$this->auth_pass); + } + if($this->_post) + { + //curl_setopt($s,CURLOPT_POST,true); + curl_setopt($s, CURLOPT_CUSTOMREQUEST, "POST"); + curl_setopt($s,CURLOPT_POSTFIELDS,$this->_postFields); + + } + + if($this->_includeHeader) + { + curl_setopt($s,CURLOPT_HEADER,true); + } + + if($this->_noBody) + { + curl_setopt($s,CURLOPT_NOBODY,true); + } + + curl_setopt($s,CURLOPT_USERAGENT,$this->_useragent); + curl_setopt($s,CURLOPT_REFERER,$this->_referer); + + $this->_webpage = curl_exec($s); + $this->_status = curl_getinfo($s,CURLINFO_HTTP_CODE); + curl_close($s); + + } + + public function getHttpStatus() + { + return $this->_status; + } + + public function __tostring(){ + return $this->_webpage; + } +} \ No newline at end of file diff --git a/system/vendor/phpoauthlib2/cookie.txt b/system/vendor/phpoauthlib2/cookie.txt new file mode 100644 index 0000000..04cd5d3 --- /dev/null +++ b/system/vendor/phpoauthlib2/cookie.txt @@ -0,0 +1,5 @@ +# Netscape HTTP Cookie File +# http://curl.haxx.se/docs/http-cookies.html +# This file was generated by libcurl! Edit at your own risk. + +#HttpOnly_.google.com TRUE / FALSE 1463331114 NID 73=wOGSMwy8vYCu7qJjpMYLVMQ_gYCNZXru2x8g0p5InvQIpj8X4P2uiXE8QdX50ZcpHvxCXo35XdDS8P5trQSsI0s3UmQ-tmG_01TTIVil6YeJIzFKqoGmKAdWo_0o8MOQ diff --git a/system/vendor/phpoauthlib2/example.php b/system/vendor/phpoauthlib2/example.php new file mode 100644 index 0000000..5a4813f --- /dev/null +++ b/system/vendor/phpoauthlib2/example.php @@ -0,0 +1,24 @@ + "apps.googleusercontent.com", + "client_secret" => "