first commit
This commit is contained in:
38
engine/lib/Cache.class.php
Executable file
38
engine/lib/Cache.class.php
Executable file
@ -0,0 +1,38 @@
|
||||
<?php
|
||||
Class Cache{
|
||||
const CACHEDB = 'SaeMemcache';
|
||||
private static $mmc = false;
|
||||
private static $cacheGet = array();
|
||||
private static function init(){
|
||||
if( self::$mmc === false ){
|
||||
self::$mmc = memcache_init();
|
||||
}
|
||||
}
|
||||
public static function get($key){
|
||||
if( !self::$cacheGet[$key] ){
|
||||
self::init();
|
||||
if( self::$mmc === false ){
|
||||
return;
|
||||
}
|
||||
self::$cacheGet[$key] = memcache_get(self::$mmc,$key);
|
||||
}
|
||||
return self::$cacheGet[$key];
|
||||
}
|
||||
public static function set( $key , $value , $time = 18000 ){
|
||||
if( !self::$cacheGet[$key] ){
|
||||
self::$cacheGet[$key] = $value;
|
||||
}
|
||||
self::init();
|
||||
if( self::$mmc === false ){
|
||||
return;
|
||||
}
|
||||
memcache_set( self::$mmc , $key ,$value , false , $time );
|
||||
}
|
||||
public static function increment( $key , $value = 1 ){
|
||||
if( !self::$cacheGet[$key] ){
|
||||
self::$cacheGet[$key] += $value;
|
||||
}
|
||||
self::init();
|
||||
return memcache_increment( self::$mmc , $key ,$value );
|
||||
}
|
||||
}
|
41
engine/lib/Cdn.class.php
Normal file
41
engine/lib/Cdn.class.php
Normal file
@ -0,0 +1,41 @@
|
||||
<?php
|
||||
class Cdn{
|
||||
public static $cdnHost = false;
|
||||
public static function init( $cdnHost ){
|
||||
self::$cdnHost = $cdnHost;
|
||||
ob_start();
|
||||
}
|
||||
public static function flush(){
|
||||
$html = ob_get_clean();
|
||||
$regs['linkReg']['reg'] = '/<link\s*([^\r\n]+?)href=[\'\"](?!http:\/\/|https:\/\/)\/?(.+?)[\'\"]/is';
|
||||
$regs['linkReg']['replace'] = '<link ${1}href="http://'.self::$cdnHost.'/$2"';
|
||||
|
||||
$regs['scriptReg']['reg'] = '/<script\s*([^\r\n]+?)src=[\'\"](?!http:\/\/|https:\/\/)\/?(.+?)[\'\"]/is';
|
||||
$regs['scriptReg']['replace'] = '<script $1src="http://'.self::$cdnHost.'/$2"';
|
||||
|
||||
$regs['imgReg1']['reg'] = '/<img([^\r\n]+?)src=\'(?!http:\/\/|https:\/\/)\/?(.+?)\'/is';
|
||||
$regs['imgReg1']['replace'] = '<img${1}src=\'http://'.self::$cdnHost.'/$2\'';
|
||||
|
||||
$regs['imgReg2']['reg'] = '/<img([^\r\n]+?)src="(?!http:\/\/|https:\/\/)\/?(.+?)"/is';
|
||||
$regs['imgReg2']['replace'] = '<img${1}src="http://'.self::$cdnHost.'/$2"';
|
||||
|
||||
|
||||
$regs['bgReg']['reg'] = '/background-image:(\s*?)url\([\'\"]?(?!http:\/\/|https:\/\/)\/?(.+?)[\'\"]?\)/is';
|
||||
$regs['bgReg']['replace'] = 'background-image:url( http://'.self::$cdnHost.'/$2 )';
|
||||
|
||||
$regs['aReg1']['reg'] = '/<a[\s\r\n]*([^\r\n]*?)href=\'(?!http:\/\/|https:\/\/)\/?([^\r\n]+?)(\.jpg\'|\.png\'|\.gif\')/is';
|
||||
$regs['aReg1']['replace'] = '<a $1href=\'http://'.self::$cdnHost.'/$2';
|
||||
|
||||
$regs['aReg2']['reg'] = '/<a[\s\r\n]*([^\r\n]*?)href="(?!http:\/\/|https:\/\/)\/?([^\r\n]+?)(\.jpg"|\.png"|\.gif")/is';
|
||||
$regs['aReg2']['replace'] = '<a $1href="http://'.self::$cdnHost.'/$2$3';
|
||||
|
||||
foreach ($regs as $key => $value) {
|
||||
$html = preg_replace($value['reg'], $value['replace'], $html);
|
||||
}
|
||||
echo $html;
|
||||
}
|
||||
}
|
||||
function cdnFlush(){
|
||||
Cdn::flush();
|
||||
}
|
||||
register_shutdown_function( 'cdnFlush' );
|
444
engine/lib/Db.class.php
Normal file
444
engine/lib/Db.class.php
Normal file
@ -0,0 +1,444 @@
|
||||
<?php
|
||||
class Db{
|
||||
public $ar_sql = NULL;
|
||||
private $ar_select = array();
|
||||
private $ar_from = array();
|
||||
private $ar_where = array();
|
||||
private $ar_like = array();
|
||||
private $ar_set = array();
|
||||
private $ar_offset = FALSE;
|
||||
//private $ar_groupby = array();
|
||||
private $ar_limit = FALSE;
|
||||
private $ar_orderby = array();
|
||||
private $mysql = false;
|
||||
|
||||
public function __construct(){
|
||||
if( defined( 'ISSAE' ) && ISSAE ){
|
||||
$master['host'] = SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT;
|
||||
$master['user'] = SAE_MYSQL_USER;
|
||||
$master['passwd'] =SAE_MYSQL_PASS;
|
||||
$master['dbname'] = SAE_MYSQL_DB;
|
||||
$slave['host'] = SAE_MYSQL_HOST_S.':'.SAE_MYSQL_PORT;
|
||||
}else{
|
||||
include_once( ROOT.'config/db.config.php' );
|
||||
}
|
||||
$this->mysql = new Mysql( $master );
|
||||
if( isset( $slave ) && $slave ){
|
||||
$this->mysql->setSlave( $slave );
|
||||
}
|
||||
}
|
||||
public function __set( $key , $value ){
|
||||
if( $key == 'do_replication' ){
|
||||
$this->mysql->$key = $value;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public function __get( $key ){
|
||||
if( $key == 'sql' ){
|
||||
return $this->getSql();
|
||||
}
|
||||
}
|
||||
public function escape( $str ){
|
||||
return $this->mysql->escape( $str );
|
||||
}
|
||||
private function getSql(){
|
||||
if( $this->ar_from ){
|
||||
$this->ar_sql = $this->_compile_select();
|
||||
$this->_resetCache();
|
||||
}
|
||||
if( $this->ar_sql ){
|
||||
return $this->ar_sql;
|
||||
}else{
|
||||
die('can not make sql...');
|
||||
}
|
||||
}
|
||||
public function getData( $sql = NULL , $key = NULL ){
|
||||
if( $sql == NULL ){
|
||||
$sql = $this->getSql();
|
||||
}else{
|
||||
$this->_resetCache();
|
||||
$this->ar_sql = $sql;
|
||||
}
|
||||
return $this->mysql->getData($sql , $key );
|
||||
}
|
||||
public function getLine( $sql = NULL ){
|
||||
if( $sql == NULL ){
|
||||
$sql = $this->getSql();
|
||||
}else{
|
||||
$this->_resetCache();
|
||||
$this->ar_sql = $sql;
|
||||
}
|
||||
return $this->mysql->getLine($sql);
|
||||
}
|
||||
public function getVar( $sql = NULL ){
|
||||
if( $sql == NULL ){
|
||||
$sql = $this->getSql();
|
||||
}else{
|
||||
$this->_resetCache();
|
||||
$this->ar_sql = $sql;
|
||||
}
|
||||
return $this->mysql->getVar($sql);
|
||||
}
|
||||
public function runSql( $sql = NULL ){
|
||||
if( $sql == NULL ){
|
||||
$sql = $this->getSql();
|
||||
}else{
|
||||
$this->_resetCache();
|
||||
$this->ar_sql = $sql;
|
||||
}
|
||||
return $this->mysql->runSql($sql);
|
||||
}
|
||||
public function lastId(){
|
||||
return $this->mysql->lastId();
|
||||
}
|
||||
public function error(){
|
||||
return $this->mysql->error();
|
||||
}
|
||||
public function delete($table = '', $where = '', $limit = NULL, $reset_data = TRUE){
|
||||
if ($table == ''){
|
||||
if ( ! isset($this->ar_from[0])){
|
||||
die('can not delete error no params...');
|
||||
}
|
||||
|
||||
$table = $this->ar_from[0];
|
||||
}elseif (is_array($table)){
|
||||
foreach ($table as $single_table){
|
||||
$this->delete($single_table, $where, $limit, FALSE);
|
||||
}
|
||||
$this->_resetCache();
|
||||
return;
|
||||
}
|
||||
if ($where != ''){
|
||||
$this->where($where);
|
||||
}
|
||||
if ($limit != NULL){
|
||||
$this->limit($limit);
|
||||
}
|
||||
if (count($this->ar_where) == 0 && count($this->ar_like) == 0){
|
||||
die('db_del_must_use_where...');
|
||||
}
|
||||
$sql = $this->_delete($table, $this->ar_where, $this->ar_like, $this->ar_limit);
|
||||
|
||||
if ($reset_data){
|
||||
$this->ar_sql = $sql;
|
||||
$this->_resetCache();
|
||||
}
|
||||
return $this->runSql($sql);
|
||||
}
|
||||
public function replace($table = '', $set = NULL){
|
||||
if ( ! is_null($set)){
|
||||
$this->set($set);
|
||||
}
|
||||
if (count($this->ar_set) == 0){
|
||||
die('can not replace error no params...');
|
||||
}
|
||||
if ($table == ''){
|
||||
if ( ! isset($this->ar_from[0])){
|
||||
die('can not replace error no table to use...');
|
||||
}
|
||||
$table = $this->ar_from[0];
|
||||
}
|
||||
$sql = $this->_replace($table, array_keys($this->ar_set), array_values($this->ar_set));
|
||||
$this->ar_sql = $sql;
|
||||
$this->_resetCache();
|
||||
return $this->runSql($sql);
|
||||
}
|
||||
public function update($table = '', $set = NULL, $where = NULL, $limit = NULL , $escape = true ){
|
||||
|
||||
if ( ! is_null($set)){
|
||||
$this->set($set);
|
||||
}
|
||||
|
||||
if (count($this->ar_set) == 0){
|
||||
die('can not update error no params...');
|
||||
}
|
||||
|
||||
if ($table == ''){
|
||||
if ( ! isset($this->ar_from[0])){
|
||||
die('can not update error no table to use...');
|
||||
}
|
||||
$table = $this->ar_from[0];
|
||||
}
|
||||
if ($where != NULL){
|
||||
$this->where($where);
|
||||
}
|
||||
|
||||
if ($limit != NULL){
|
||||
$this->limit($limit);
|
||||
}
|
||||
if ( $escape && !preg_match("/(`)/i", trim($table))){
|
||||
$table = '`'.trim($table).'`';
|
||||
}
|
||||
|
||||
$sql = $this->_update($table, $this->ar_set, $this->ar_where, $this->ar_orderby, $this->ar_limit);
|
||||
$this->ar_sql = $sql;
|
||||
$this->_resetCache();
|
||||
return $this->runSql($sql);
|
||||
}
|
||||
public function insert($table = '', $set = NULL){
|
||||
if ( ! is_null($set)){
|
||||
$this->set($set);
|
||||
}
|
||||
if (count($this->ar_set) == 0){
|
||||
die('can not insert error no params...');
|
||||
}
|
||||
if ($table == ''){
|
||||
if ( ! isset($this->ar_from[0])){
|
||||
die('can not insert error no table to use...');
|
||||
}
|
||||
$table = $this->ar_from[0];
|
||||
}
|
||||
$sql = $this->_insert($table, array_keys($this->ar_set), array_values($this->ar_set));
|
||||
$this->ar_sql = $sql;
|
||||
$this->_resetCache();
|
||||
return $this->runSql($sql);
|
||||
}
|
||||
public function select($select = '*'){
|
||||
if (is_string($select)){
|
||||
$select = explode(',', $select);
|
||||
}
|
||||
foreach ($select as $val){
|
||||
$val = trim($val);
|
||||
if ($val != ''){
|
||||
$this->ar_select[] = $val;
|
||||
|
||||
}
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
public function from($from , $escape = true ){
|
||||
foreach ((array)$from as $val){
|
||||
if (strpos($val, ',') !== FALSE){
|
||||
foreach (explode(',', $val) as $v){
|
||||
$v = trim($v);
|
||||
if ($escape && !preg_match("/(`)/i", $v )){
|
||||
$v = '`'.trim($v).'`';
|
||||
}
|
||||
$this->ar_from[] = $v;
|
||||
}
|
||||
}else{
|
||||
$val = trim($val);
|
||||
if ($escape && !preg_match("/(`)/i", $val )){
|
||||
$val = '`'.trim($val).'`';
|
||||
}
|
||||
$this->ar_from[] = $val;
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
function like($field, $match = ''){
|
||||
return $this->_like($field, $match, 'AND ');
|
||||
}
|
||||
function notLike($field, $match = '', $side = 'both'){
|
||||
return $this->_like($field, $match, 'AND ', 'NOT');
|
||||
}
|
||||
function orLike($field, $match = ''){
|
||||
return $this->_like($field, $match, 'OR ');
|
||||
}
|
||||
function orNotLike($field, $match = ''){
|
||||
return $this->_like($field, $match, 'OR ', 'NOT');
|
||||
}
|
||||
public function where($key, $value = NULL){
|
||||
return $this->_where($key, $value, 'AND ');
|
||||
}
|
||||
public function orWhere($key, $value = NULL, $escape = TRUE){
|
||||
return $this->_where($key, $value, 'OR ', $escape);
|
||||
}
|
||||
public function orderBy($orderby, $direction = '' , $escape = true ){
|
||||
if (trim($direction) != ''){
|
||||
$direction = (in_array(strtoupper(trim($direction)), array('ASC', 'DESC'), TRUE)) ? ' '.$direction : ' ASC';
|
||||
}
|
||||
if ( $escape && strpos($orderby, ',') !== FALSE){
|
||||
$temp = array();
|
||||
foreach (explode(',', $orderby) as $part)
|
||||
{
|
||||
$part = trim($part);
|
||||
$temp[] = '`'.$part.'`';
|
||||
}
|
||||
$orderby = implode(', ', $temp);
|
||||
}elseif($escape == true ){
|
||||
$orderby ='`'.$orderby.'`';
|
||||
}
|
||||
$orderby_statement = $orderby.$direction;
|
||||
$this->ar_orderby[] = $orderby_statement;
|
||||
return $this;
|
||||
}
|
||||
public function limit($value , $offset = NULL){
|
||||
$this->ar_limit = $value;
|
||||
if ($offset != ''){
|
||||
$this->ar_offset = $offset;
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
public function set($key, $value = NULL , $escape = true ){
|
||||
if ( ! is_array($key)){
|
||||
if(is_null($value) && $this->_has_operator($key) ){
|
||||
$key = array( $key );
|
||||
}else{
|
||||
$key = array($key => $value);
|
||||
}
|
||||
}
|
||||
foreach ($key as $k => $v){
|
||||
if( is_numeric($k) && strpos( $v , '=' ) !== false ){
|
||||
list( $k , $v ) = explode( '=' , $v , 2 );
|
||||
$k = trim($k);
|
||||
$v = trim($v);
|
||||
if( $escape ){
|
||||
if ( !preg_match("/(`)/i", trim($k))){
|
||||
$k = '`'.trim($k).'`';
|
||||
}
|
||||
if ( !preg_match("/(\-|\+)/i", $v)){
|
||||
$v = '`'.trim($v).'`';
|
||||
}
|
||||
}
|
||||
|
||||
}else{
|
||||
if ( $escape ){
|
||||
$k = '`'.$k.'`';
|
||||
$v = "'".$this->escape($v)."'";
|
||||
}
|
||||
}
|
||||
|
||||
$this->ar_set[$k] = $v;
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
private function _resetCache(){
|
||||
$this->ar_select = array();
|
||||
$this->ar_from = array();
|
||||
$this->ar_where = array();
|
||||
$this->ar_like = array();
|
||||
$this->ar_offset = FALSE;
|
||||
$this->ar_limit = FALSE;
|
||||
$this->ar_orderby = array();
|
||||
$this->ar_set = array();
|
||||
}
|
||||
private function _like($field, $match = '', $type = 'AND ', $not = ''){
|
||||
if ( ! is_array($field)){
|
||||
$field = array($field => $match);
|
||||
}
|
||||
foreach ($field as $k => $v){
|
||||
$prefix = (count($this->ar_like) == 0) ? '' : $type;
|
||||
$v = $this->escape($v);
|
||||
$like_statement = $prefix." `$k` $not LIKE '%{$v}%'";
|
||||
$this->ar_like[] = $like_statement;
|
||||
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
private function _where($key, $value = NULL, $type = 'AND ', $escape = NULL){
|
||||
if ( ! is_array($key)){
|
||||
$key = array($key => $value);
|
||||
}
|
||||
|
||||
// If the escape value was not set will will base it on the global setting
|
||||
if ( ! is_bool($escape)){
|
||||
//$escape = $this->_protect_identifiers;
|
||||
}
|
||||
|
||||
foreach ($key as $k => $v){
|
||||
$prefix = (count($this->ar_where) == 0 ) ? '' : $type;
|
||||
if( !is_numeric($k) ){
|
||||
|
||||
if (is_null($v) && ! $this->_has_operator($k)){
|
||||
// value appears not to have been set, assign the test to IS NULL
|
||||
$k = '`'.$k.'`'.' IS NULL';
|
||||
//$v = "'".$this->escape($v)."'";
|
||||
}
|
||||
|
||||
if ( ! is_null($v)){
|
||||
if ( ! $this->_has_operator($k)){
|
||||
$k = '`'.$k.'` =';
|
||||
}
|
||||
$v = "'".$this->escape($v)."'";
|
||||
}
|
||||
}else{
|
||||
$k = NULL;
|
||||
}
|
||||
$this->ar_where[] = $prefix.$k.$v;
|
||||
|
||||
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
private function _has_operator($str){
|
||||
$str = trim($str);
|
||||
if ( ! preg_match("/(\s|<|>|!|=|is null|is not null)/i", $str)){
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
private function _compile_select(){
|
||||
|
||||
$sql = 'SELECT ' ;
|
||||
|
||||
if (count($this->ar_select) == 0){
|
||||
$sql .= '*';
|
||||
}else{
|
||||
$sql .= implode(', ', $this->ar_select);
|
||||
}
|
||||
|
||||
if (count($this->ar_from) > 0){
|
||||
$sql .= "\nFROM ";
|
||||
$sql .= implode("\n", $this->ar_from);
|
||||
}
|
||||
if (count($this->ar_where) > 0 OR count($this->ar_like) > 0){
|
||||
$sql .= "\n";
|
||||
$sql .= "WHERE ";
|
||||
}
|
||||
$sql .= implode("\n", $this->ar_where);
|
||||
if (count($this->ar_like) > 0){
|
||||
if (count($this->ar_where) > 0){
|
||||
$sql .= "\nAND ";
|
||||
}
|
||||
$sql .= implode("\n", $this->ar_like);
|
||||
}
|
||||
if (count($this->ar_orderby) > 0){
|
||||
$sql .= "\nORDER BY ";
|
||||
$sql .= implode(', ', $this->ar_orderby);
|
||||
}
|
||||
if (is_numeric($this->ar_limit)){
|
||||
$sql .= "\nLIMIT ";
|
||||
$sql .= $this->ar_limit;
|
||||
if( intval( $this->ar_offset ) ){
|
||||
$sql .= ','.intval( $this->ar_offset );
|
||||
}
|
||||
}
|
||||
return $sql;
|
||||
}
|
||||
private function _insert($table , $keys , $values ){
|
||||
$sql = "INSERT INTO $table (".join(',',$keys).")VALUES(".join(",",$values).")";
|
||||
return $sql;
|
||||
}
|
||||
private function _update($table, $values, $where, $orderby = array(), $limit = FALSE){
|
||||
foreach ($values as $key => $val){
|
||||
$valstr[] = $key . ' = ' . $val;
|
||||
}
|
||||
$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
|
||||
$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
|
||||
$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
|
||||
$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
|
||||
$sql .= $orderby.$limit;
|
||||
|
||||
return $sql;
|
||||
}
|
||||
private function _replace($table, $keys, $values){
|
||||
return "REPLACE INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
|
||||
}
|
||||
private function _delete($table, $where = array(), $like = array(), $limit = FALSE){
|
||||
$conditions = '';
|
||||
if (count($where) > 0 OR count($like) > 0){
|
||||
$conditions = "\nWHERE ";
|
||||
$conditions .= implode("\n", $where);
|
||||
if (count($like) > 0){
|
||||
$conditions .= " AND ";
|
||||
$conditions .= implode("\n", $like);
|
||||
}
|
||||
}
|
||||
$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
|
||||
|
||||
return "DELETE FROM ".$table.$conditions.$limit;
|
||||
}
|
||||
}
|
19
engine/lib/IFCookie.class.php
Normal file
19
engine/lib/IFCookie.class.php
Normal file
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
class IFCookie{
|
||||
const SESSIONSTR = 'SID';
|
||||
public static function isNeedFix(){
|
||||
$agent = $_SERVER['HTTP_USER_AGENT'];
|
||||
if( strpos($agent,"iPhone") || strpos($agent,"Safari") ){
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public static function fix(){
|
||||
$pre = $_REQUEST[Url::SHORT_CLASS_TAG] == 'callback'?'state':self::SESSIONSTR;
|
||||
if( isset( $_REQUEST[$pre] ) && $_REQUEST[$pre] && self::isNeedFix() ){
|
||||
$sid = $_REQUEST[$pre];
|
||||
session_id( $sid );
|
||||
Url::$custom[self::SESSIONSTR] = $sid;
|
||||
}
|
||||
}
|
||||
}
|
117
engine/lib/Icon.class.php
Executable file
117
engine/lib/Icon.class.php
Executable file
@ -0,0 +1,117 @@
|
||||
<?php
|
||||
class Icon{
|
||||
|
||||
function createIcon(){
|
||||
$this->getImgSize();
|
||||
//print_r( $this->img_info );
|
||||
if( !$this->img_info ) return false;
|
||||
$this->getNewSize();
|
||||
$this->makeIcon();
|
||||
}
|
||||
function getImgSize(){
|
||||
$this->img_info = @getImagesize( $this->path );
|
||||
$this->w = $this->img_info[0];
|
||||
$this->h = $this->img_info[1];
|
||||
|
||||
switch ( $this->img_info[2] ){
|
||||
case 1:
|
||||
$this->t = 'gif';
|
||||
break;
|
||||
case 2:
|
||||
$this->t = 'jpg';
|
||||
break;
|
||||
case 3:
|
||||
$this->t = 'png';
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function getNewSize(){
|
||||
if( $this->w > $this->h ){
|
||||
$this->nh = $this->size;
|
||||
$this->nw = ($this->size/$this->h) * $this->w;
|
||||
$this->type = 1;
|
||||
}else{
|
||||
$this->nw = $this->size;
|
||||
$this->nh = ($this->size/$this->w) * $this->h;
|
||||
$this->type = 0;
|
||||
}
|
||||
}
|
||||
|
||||
function makeIcon(){
|
||||
$type = $this->type;
|
||||
//$img_des = ImageCreateTrueColor ( $this->size, $this->size );
|
||||
$img_des = ImageCreateTrueColor ( $this->size , $this->size );
|
||||
|
||||
$background = imagecolorallocate( $img_des , 255 , 255 , 255 );
|
||||
imagefill( $img_des , 0 , 0 , $background );
|
||||
|
||||
switch ( $this->t ){
|
||||
case 'gif':
|
||||
$img_src = ImageCreateFromGIF ( $this->path );
|
||||
break;
|
||||
|
||||
case 'jpg':
|
||||
$img_src = ImageCreateFromJPEG ( $this->path );
|
||||
break;
|
||||
|
||||
case 'png':
|
||||
$img_src = ImageCreateFromPNG ( $this->path );
|
||||
break;
|
||||
}
|
||||
if( $type === 1 ){
|
||||
imagecopyresampled( $img_des, $img_src, 0, 0, ($this->w-$this->h)/2 , 0, $this->nw , $this->nh, $this->w, $this->h );
|
||||
}elseif( $type === 0 ){
|
||||
imagecopyresampled( $img_des, $img_src, 0, 0, 0 , ($this->h-$this->w)/2, $this->nw , $this->nh, $this->w, $this->h );
|
||||
}else{
|
||||
imagecopyresampled( $img_des, $img_src, 0, 0, 0 , 0 , $this->size, $this->size , $this->w, $this->h );
|
||||
}
|
||||
|
||||
imageline( $img_des , 0 , 0 , 0 , ($this->size-1) , imagecolorallocate( $img_des , 220 , 220 , 220 ) );
|
||||
imageline( $img_des , 0 , ($this->size-1) , ($this->size-1) , ($this->size-1) , imagecolorallocate( $img_des , 220 , 220 , 220 ) );
|
||||
imageline( $img_des , ($this->size-1) , ($this->size-1) , ($this->size-1) , 0 , imagecolorallocate( $img_des , 220 , 220 , 220 ) );
|
||||
imageline( $img_des , ($this->size-1) , 0 , 0 , 0 , imagecolorallocate( $img_des , 220 , 220 , 220 ) );
|
||||
|
||||
//echo $this->dest ;
|
||||
|
||||
switch ( $this->t ){
|
||||
case 'gif':
|
||||
if ( empty( $this->dest ) ){
|
||||
header( "Content-type: image/gif" );
|
||||
return ImageGIF( $img_des );
|
||||
}else{
|
||||
return ImageGIF( $img_des, $this->dest );
|
||||
}
|
||||
break;
|
||||
|
||||
case 'jpg':
|
||||
if ( empty( $this->dest ) ){
|
||||
header ( "Content-type: image/jpeg" );
|
||||
return ImageJPEG( $img_des );
|
||||
}else{
|
||||
return ImageJPEG( $img_des, $this->dest );
|
||||
}
|
||||
break;
|
||||
|
||||
case 'png':
|
||||
if ( empty( $this->dest ) ){
|
||||
header ( "Content-type: image/png" );
|
||||
return ImagePNG( $img_des );
|
||||
}else{
|
||||
return ImagePNG( $img_des, $this->dest );
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
/*
|
||||
$icon = new Icon();
|
||||
$icon->path = 'a.gif';
|
||||
$icon->size = 64;
|
||||
$icon->dest = 'b.gif';
|
||||
$icon->createIcon();
|
||||
*/
|
||||
?>
|
51
engine/lib/Lock.class.php
Executable file
51
engine/lib/Lock.class.php
Executable file
@ -0,0 +1,51 @@
|
||||
<?php
|
||||
class Lock{
|
||||
const LOCKTIME = 3;
|
||||
private static $locked = array();
|
||||
private static $memcache = false;
|
||||
private static function init(){
|
||||
if( self::$memcache == false ){
|
||||
self::$memcache = memcache_init();
|
||||
}
|
||||
}
|
||||
public static function add( $key ){
|
||||
self::init();
|
||||
if( self::$memcache !== false ){
|
||||
$time = self::LOCKTIME;
|
||||
while( $time > 0 ){
|
||||
if( memcache_add( self::$memcache , $key , 'Locking' ,false , self::LOCKTIME ) ){
|
||||
self::$locked[$key] = 1;
|
||||
return;
|
||||
}else{
|
||||
$time--;
|
||||
sleep(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public static function del( $key ){
|
||||
if( self::$locked[$key] ){
|
||||
self::init();
|
||||
if( self::$memcache !== false ){
|
||||
if( memcache_delete( self::$memcache , $key ) ){
|
||||
unset( self::$locked[$key] );
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
public static function delAll(){
|
||||
if( self::$locked && self::$memcache ){
|
||||
foreach( self::$locked as $k => $v ){
|
||||
if( memcache_delete( self::$memcache , $k ) ){
|
||||
unset( self::$locked[$k] );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
function autounLock(){
|
||||
Lock::delAll();
|
||||
}
|
||||
register_shutdown_function( 'autounLock' );
|
137
engine/lib/Mysql.class.php
Normal file
137
engine/lib/Mysql.class.php
Normal file
@ -0,0 +1,137 @@
|
||||
<?php
|
||||
class Mysql{
|
||||
private $master;
|
||||
private $slave;
|
||||
public $do_replication = false;
|
||||
function __construct( $master ){
|
||||
$this->master = $master;
|
||||
}
|
||||
private function connect( $is_master = true ){
|
||||
if( $is_master ) $dbInfo = $this->master;
|
||||
else $dbInfo = $this->slave;
|
||||
if( !$db = mysql_connect( $dbInfo['host'] , $dbInfo['user'] , $dbInfo['passwd'] ) ){
|
||||
die('can\'t connect to mysql ' . $ $dbInfo['host'] );
|
||||
}else{
|
||||
// mysql_query( "set names 'utf8'" , $db );
|
||||
mysql_query( "set names 'utf8mb4'" , $db );
|
||||
}
|
||||
//echo 'connect to: '. $dbInfo['host'].'at db:'.$dbInfo['dbname'].'<br>';
|
||||
mysql_select_db( $dbInfo['dbname'] , $db );
|
||||
|
||||
return $db;
|
||||
}
|
||||
private function dbRead(){
|
||||
if( isset( $this->dbRead ) ){
|
||||
mysql_ping( $this->dbRead );
|
||||
return $this->dbRead;
|
||||
}else{
|
||||
if( !$this->do_replication ) return $this->dbWrite();
|
||||
else {
|
||||
$this->dbRead = $this->connect( false );
|
||||
return $this->dbRead;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function dbWrite(){
|
||||
if( isset( $this->dbWrite ) ){
|
||||
mysql_ping( $this->dbWrite );
|
||||
return $this->dbWrite;
|
||||
}else{
|
||||
$this->dbWrite = $this->connect( true );
|
||||
return $this->dbWrite;
|
||||
}
|
||||
}
|
||||
public function setSlave( $slave ){
|
||||
|
||||
$this->slave['host'] = $slave['host'];
|
||||
$this->slave['user'] = isset($slave['user']) ? $slave['user'] : $this->master['user'];
|
||||
$this->slave['passwd'] = isset($slave['passwd']) ? $slave['passwd'] : $this->master['passwd'];
|
||||
$this->slave['dbname'] = isset($slave['dbname']) ? $slave['dbname'] : $this->master['dbname'];
|
||||
$this->do_replication = true;
|
||||
}
|
||||
public function saveError() {
|
||||
//$GLOBALS['MYSQL_LAST_ERROR'] = mysql_error();
|
||||
//$GLOBALS['MYSQL_LAST_ERRNO'] = mysql_errno();
|
||||
if( mysql_errno() ){
|
||||
print_r( mysql_error() );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function runSql( $sql ) {
|
||||
$ret = mysql_query( $sql , $this->dbWrite() );
|
||||
$this->saveError();
|
||||
return $ret;
|
||||
}
|
||||
public function getData( $sql , $key = NULL ){
|
||||
$GLOBALS['MYSQL_LAST_SQL'] = $sql;
|
||||
$data = Array();
|
||||
$i = 0;
|
||||
$result = mysql_query( $sql , $this->do_replication ? $this->dbRead() : $this->dbWrite() );
|
||||
|
||||
$this->saveError();
|
||||
|
||||
while( $Array = mysql_fetch_array($result, MYSQL_ASSOC ) ){
|
||||
if( $key && isset( $Array[$key] ) ){
|
||||
$data[$Array[$key]] = $Array;
|
||||
}else{
|
||||
$data[$i++] = $Array;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
if( mysql_errno() != 0 )
|
||||
echo mysql_error() .' ' . $sql;
|
||||
*/
|
||||
|
||||
mysql_free_result($result);
|
||||
|
||||
if( count( $data ) > 0 )
|
||||
return $data;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
public function getLine( $sql ){
|
||||
$data = $this->getData( $sql );
|
||||
return @reset($data);
|
||||
}
|
||||
|
||||
public function getVar( $sql ){
|
||||
$data = $this->getLine( $sql );
|
||||
return $data[ @reset(@array_keys( $data )) ];
|
||||
}
|
||||
|
||||
public function lastId(){
|
||||
$result = mysql_query( "SELECT LAST_INSERT_ID()" , $this->dbWrite() );
|
||||
return reset( mysql_fetch_array( $result, MYSQL_ASSOC ) );
|
||||
}
|
||||
|
||||
public function closeDb(){
|
||||
if( isset( $this->dbRead ) ){
|
||||
@mysql_close( $this->dbRead );
|
||||
unset( $this->dbRead );
|
||||
}
|
||||
if( isset( $this->dbWrite ) ){
|
||||
@mysql_close( $this->dbWrite );
|
||||
unset( $this->dbWrite );
|
||||
}
|
||||
}
|
||||
|
||||
public function escape( $str ){
|
||||
if( isset($this->dbRead)) $db = $this->dbRead ;
|
||||
elseif( isset($this->dbWrite) ) $db = $this->dbWrite;
|
||||
else $db = $this->dbRead();
|
||||
|
||||
return mysql_real_escape_string( $str , $db );
|
||||
}
|
||||
|
||||
public function errno(){
|
||||
return $GLOBALS['MYSQL_LAST_ERRNO'];
|
||||
}
|
||||
|
||||
public function error(){
|
||||
return $GLOBALS['MYSQL_LAST_ERROR'];
|
||||
}
|
||||
}
|
676
engine/lib/SafeHtml.class.php
Executable file
676
engine/lib/SafeHtml.class.php
Executable file
@ -0,0 +1,676 @@
|
||||
<?php
|
||||
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
|
||||
|
||||
/**
|
||||
* HTML_Safe Parser
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
*
|
||||
* @category HTML
|
||||
* @package HTML_Safe
|
||||
* @author Roman Ivanov <thingol@mail.ru>
|
||||
* @copyright 2004-2005 Roman Ivanov
|
||||
* @license http://www.debian.org/misc/bsd.license BSD License (3 Clause)
|
||||
* @version CVS: $Id:$
|
||||
* @link http://pear.php.net/package/HTML_Safe
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* This package requires HTMLSax3 package
|
||||
*/
|
||||
require_once __DIR__.'/XML/HTMLSax3.php';
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* HTML_Safe Parser
|
||||
*
|
||||
* This parser strips down all potentially dangerous content within HTML:
|
||||
* <ul>
|
||||
* <li>opening tag without its closing tag</li>
|
||||
* <li>closing tag without its opening tag</li>
|
||||
* <li>any of these tags: "base", "basefont", "head", "html", "body", "applet",
|
||||
* "object", "iframe", "frame", "frameset", "script", "layer", "ilayer", "embed",
|
||||
* "bgsound", "link", "meta", "style", "title", "blink", "xml" etc.</li>
|
||||
* <li>any of these attributes: on*, data*, dynsrc</li>
|
||||
* <li>javascript:/vbscript:/about: etc. protocols</li>
|
||||
* <li>expression/behavior etc. in styles</li>
|
||||
* <li>any other active content</li>
|
||||
* </ul>
|
||||
* It also tries to convert code to XHTML valid, but htmltidy is far better
|
||||
* solution for this task.
|
||||
*
|
||||
* <b>Example:</b>
|
||||
* <pre>
|
||||
* $parser =new HTML_Safe();
|
||||
* $result = $parser->parse($doc);
|
||||
* </pre>
|
||||
*
|
||||
* @category HTML
|
||||
* @package HTML_Safe
|
||||
* @author Roman Ivanov <thingol@mail.ru>
|
||||
* @copyright 1997-2005 Roman Ivanov
|
||||
* @license http://www.debian.org/misc/bsd.license BSD License (3 Clause)
|
||||
* @version Release: @package_version@
|
||||
* @link http://pear.php.net/package/HTML_Safe
|
||||
*/
|
||||
class SafeHtml
|
||||
{
|
||||
/**
|
||||
* Storage for resulting HTML output
|
||||
*
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $_xhtml = '';
|
||||
|
||||
/**
|
||||
* Array of counters for each tag
|
||||
*
|
||||
* @var array
|
||||
* @access private
|
||||
*/
|
||||
var $_counter = array();
|
||||
|
||||
/**
|
||||
* Stack of unclosed tags
|
||||
*
|
||||
* @var array
|
||||
* @access private
|
||||
*/
|
||||
var $_stack = array();
|
||||
|
||||
/**
|
||||
* Array of counters for tags that must be deleted with all content
|
||||
*
|
||||
* @var array
|
||||
* @access private
|
||||
*/
|
||||
var $_dcCounter = array();
|
||||
|
||||
/**
|
||||
* Stack of unclosed tags that must be deleted with all content
|
||||
*
|
||||
* @var array
|
||||
* @access private
|
||||
*/
|
||||
var $_dcStack = array();
|
||||
|
||||
/**
|
||||
* Stores level of list (ol/ul) nesting
|
||||
*
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
var $_listScope = 0;
|
||||
|
||||
/**
|
||||
* Stack of unclosed list tags
|
||||
*
|
||||
* @var array
|
||||
* @access private
|
||||
*/
|
||||
var $_liStack = array();
|
||||
|
||||
/**
|
||||
* Array of prepared regular expressions for protocols (schemas) matching
|
||||
*
|
||||
* @var array
|
||||
* @access private
|
||||
*/
|
||||
var $_protoRegexps = array();
|
||||
|
||||
/**
|
||||
* Array of prepared regular expressions for CSS matching
|
||||
*
|
||||
* @var array
|
||||
* @access private
|
||||
*/
|
||||
var $_cssRegexps = array();
|
||||
|
||||
/**
|
||||
* List of single tags ("<tag />")
|
||||
*
|
||||
* @var array
|
||||
* @access public
|
||||
*/
|
||||
var $singleTags = array('area', 'br', 'img', 'input', 'hr', 'wbr', );
|
||||
|
||||
/**
|
||||
* List of dangerous tags (such tags will be deleted)
|
||||
*
|
||||
* @var array
|
||||
* @access public
|
||||
*/
|
||||
var $deleteTags = array(
|
||||
'applet', 'base', 'basefont', 'bgsound', 'blink', 'body',
|
||||
'embed', 'frame', 'frameset', 'head', 'html', 'ilayer',
|
||||
'iframe', 'layer', 'link', 'meta', 'object', 'style',
|
||||
'title', 'script',
|
||||
);
|
||||
|
||||
/**
|
||||
* List of dangerous tags (such tags will be deleted, and all content
|
||||
* inside this tags will be also removed)
|
||||
*
|
||||
* @var array
|
||||
* @access public
|
||||
*/
|
||||
var $deleteTagsContent = array('script', 'style', 'title', 'xml', );
|
||||
|
||||
/**
|
||||
* Type of protocols filtering ('white' or 'black')
|
||||
*
|
||||
* @var string
|
||||
* @access public
|
||||
*/
|
||||
var $protocolFiltering = 'white';
|
||||
|
||||
/**
|
||||
* List of "dangerous" protocols (used for blacklist-filtering)
|
||||
*
|
||||
* @var array
|
||||
* @access public
|
||||
*/
|
||||
var $blackProtocols = array(
|
||||
'about', 'chrome', 'data', 'disk', 'hcp',
|
||||
'help', 'javascript', 'livescript', 'lynxcgi', 'lynxexec',
|
||||
'ms-help', 'ms-its', 'mhtml', 'mocha', 'opera',
|
||||
'res', 'resource', 'shell', 'vbscript', 'view-source',
|
||||
'vnd.ms.radio', 'wysiwyg',
|
||||
);
|
||||
|
||||
/**
|
||||
* List of "safe" protocols (used for whitelist-filtering)
|
||||
*
|
||||
* @var array
|
||||
* @access public
|
||||
*/
|
||||
var $whiteProtocols = array(
|
||||
'ed2k', 'file', 'ftp', 'gopher', 'http', 'https',
|
||||
'irc', 'mailto', 'news', 'nntp', 'telnet', 'webcal',
|
||||
'xmpp', 'callto',
|
||||
);
|
||||
|
||||
/**
|
||||
* List of attributes that can contain protocols
|
||||
*
|
||||
* @var array
|
||||
* @access public
|
||||
*/
|
||||
var $protocolAttributes = array(
|
||||
'action', 'background', 'codebase', 'dynsrc', 'href', 'lowsrc', 'src',
|
||||
);
|
||||
|
||||
/**
|
||||
* List of dangerous CSS keywords
|
||||
*
|
||||
* Whole style="" attribute will be removed, if parser will find one of
|
||||
* these keywords
|
||||
*
|
||||
* @var array
|
||||
* @access public
|
||||
*/
|
||||
var $cssKeywords = array(
|
||||
'absolute', 'behavior', 'behaviour', 'content', 'expression',
|
||||
'fixed', 'include-source', 'moz-binding',
|
||||
);
|
||||
|
||||
/**
|
||||
* List of tags that can have no "closing tag"
|
||||
*
|
||||
* @var array
|
||||
* @access public
|
||||
* @deprecated XHTML does not allow such tags
|
||||
*/
|
||||
var $noClose = array();
|
||||
|
||||
/**
|
||||
* List of block-level tags that terminates paragraph
|
||||
*
|
||||
* Paragraph will be closed when this tags opened
|
||||
*
|
||||
* @var array
|
||||
* @access public
|
||||
*/
|
||||
var $closeParagraph = array(
|
||||
'address', 'blockquote', 'center', 'dd', 'dir', 'div',
|
||||
'dl', 'dt', 'h1', 'h2', 'h3', 'h4',
|
||||
'h5', 'h6', 'hr', 'isindex', 'listing', 'marquee',
|
||||
'menu', 'multicol', 'ol', 'p', 'plaintext', 'pre',
|
||||
'table', 'ul', 'xmp',
|
||||
);
|
||||
|
||||
/**
|
||||
* List of table tags, all table tags outside a table will be removed
|
||||
*
|
||||
* @var array
|
||||
* @access public
|
||||
*/
|
||||
var $tableTags = array(
|
||||
'caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th',
|
||||
'thead', 'tr',
|
||||
);
|
||||
|
||||
/**
|
||||
* List of list tags
|
||||
*
|
||||
* @var array
|
||||
* @access public
|
||||
*/
|
||||
var $listTags = array('dir', 'menu', 'ol', 'ul', 'dl', );
|
||||
|
||||
/**
|
||||
* List of dangerous attributes
|
||||
*
|
||||
* @var array
|
||||
* @access public
|
||||
*/
|
||||
var $attributes = array('dynsrc', 'name', );
|
||||
/**
|
||||
* List of delete attributes
|
||||
*
|
||||
* @var array
|
||||
* @access public
|
||||
*/
|
||||
var $deleteAttrs = array( 'id', 'class', 'urltoajax', 'action-data', 'action-type', 'confirm', 'hovertip', 'textcount',);
|
||||
/**
|
||||
* List of allowed "namespaced" attributes
|
||||
*
|
||||
* @var array
|
||||
* @access public
|
||||
*/
|
||||
var $attributesNS = array('xml:lang', );
|
||||
|
||||
/**
|
||||
* Constructs class
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
function HTML_Safe()
|
||||
{
|
||||
//making regular expressions based on Proto & CSS arrays
|
||||
foreach ($this->blackProtocols as $proto) {
|
||||
$preg = "/[\s\x01-\x1F]*";
|
||||
for ($i=0; $i<strlen($proto); $i++) {
|
||||
$preg .= $proto{$i} . "[\s\x01-\x1F]*";
|
||||
}
|
||||
$preg .= ":/i";
|
||||
$this->_protoRegexps[] = $preg;
|
||||
}
|
||||
|
||||
foreach ($this->cssKeywords as $css) {
|
||||
$this->_cssRegexps[] = '/' . $css . '/i';
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the writing of attributes - called from $this->_openHandler()
|
||||
*
|
||||
* @param array $attrs array of attributes $name => $value
|
||||
* @return boolean
|
||||
* @access private
|
||||
*/
|
||||
function _writeAttrs ($attrs)
|
||||
{
|
||||
if (is_array($attrs) ) {
|
||||
foreach ($attrs as $name => $value) {
|
||||
$name = strtolower($name);
|
||||
if(in_array( $name , $this->deleteAttrs )){
|
||||
continue;
|
||||
}
|
||||
if (strpos($name, 'on') === 0) {
|
||||
continue;
|
||||
}
|
||||
if (strpos($name, 'data') === 0) {
|
||||
continue;
|
||||
}
|
||||
if (in_array($name, $this->attributes)) {
|
||||
continue;
|
||||
}
|
||||
if (!preg_match("/^[a-z0-9]+$/i", $name)) {
|
||||
if (!in_array($name, $this->attributesNS)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (($value === TRUE) || (is_null($value))) {
|
||||
$value = $name;
|
||||
}
|
||||
|
||||
if ($name == 'style') {
|
||||
|
||||
// removes insignificant backslahes
|
||||
$value = str_replace("\\", '', $value);
|
||||
|
||||
// removes CSS comments
|
||||
while (1)
|
||||
{
|
||||
$_value = preg_replace("!/\*.*?\*/!s", '', $value);
|
||||
if ($_value == $value) break;
|
||||
$value = $_value;
|
||||
}
|
||||
|
||||
// replace all & to &
|
||||
$value = str_replace('&', '&', $value);
|
||||
$value = str_replace('&', '&', $value);
|
||||
|
||||
foreach ($this->_cssRegexps as $css) {
|
||||
if (preg_match($css, $value)) {
|
||||
continue 2;
|
||||
}
|
||||
}
|
||||
foreach ($this->_protoRegexps as $proto) {
|
||||
if (preg_match($proto, $value)) {
|
||||
continue 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$tempval = preg_replace('/&#(\d+);?/me', "chr('\\1')", $value); //"'
|
||||
$tempval = preg_replace('/&#x([0-9a-f]+);?/mei', "chr(hexdec('\\1'))", $tempval);
|
||||
|
||||
if ((in_array($name, $this->protocolAttributes)) &&
|
||||
(strpos($tempval, ':') !== false))
|
||||
{
|
||||
if ($this->protocolFiltering == 'black') {
|
||||
foreach ($this->_protoRegexps as $proto) {
|
||||
if (preg_match($proto, $tempval)) continue 2;
|
||||
}
|
||||
} else {
|
||||
$_tempval = explode(':', $tempval);
|
||||
$proto = $_tempval[0];
|
||||
if (!in_array($proto, $this->whiteProtocols)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$value = str_replace("\"", """, $value);
|
||||
$this->_xhtml .= ' ' . $name . '="' . $value . '"';
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Opening tag handler - called from HTMLSax
|
||||
*
|
||||
* @param object $parser HTML Parser
|
||||
* @param string $name tag name
|
||||
* @param array $attrs tag attributes
|
||||
* @return boolean
|
||||
* @access private
|
||||
*/
|
||||
function _openHandler(&$parser, $name, $attrs)
|
||||
{
|
||||
$name = strtolower($name);
|
||||
|
||||
if (in_array($name, $this->deleteTagsContent)) {
|
||||
array_push($this->_dcStack, $name);
|
||||
$this->_dcCounter[$name] = isset($this->_dcCounter[$name]) ? $this->_dcCounter[$name]+1 : 1;
|
||||
}
|
||||
if (count($this->_dcStack) != 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (in_array($name, $this->deleteTags)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!preg_match("/^[a-z0-9]+$/i", $name)) {
|
||||
if (preg_match("!(?:\@|://)!i", $name)) {
|
||||
$this->_xhtml .= '<' . $name . '>';
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
if (in_array($name, $this->singleTags)) {
|
||||
$this->_xhtml .= '<' . $name;
|
||||
$this->_writeAttrs($attrs);
|
||||
$this->_xhtml .= ' />';
|
||||
return true;
|
||||
}
|
||||
|
||||
// TABLES: cannot open table elements when we are not inside table
|
||||
if ((isset($this->_counter['table'])) && ($this->_counter['table'] <= 0)
|
||||
&& (in_array($name, $this->tableTags)))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// PARAGRAPHS: close paragraph when closeParagraph tags opening
|
||||
if ((in_array($name, $this->closeParagraph)) && (in_array('p', $this->_stack))) {
|
||||
$this->_closeHandler($parser, 'p');
|
||||
}
|
||||
|
||||
// LISTS: we should close <li> if <li> of the same level opening
|
||||
if ($name == 'li' && count($this->_liStack) &&
|
||||
$this->_listScope == $this->_liStack[count($this->_liStack)-1])
|
||||
{
|
||||
$this->_closeHandler($parser, 'li');
|
||||
}
|
||||
|
||||
// LISTS: we want to know on what nesting level of lists we are
|
||||
if (in_array($name, $this->listTags)) {
|
||||
$this->_listScope++;
|
||||
}
|
||||
if ($name == 'li') {
|
||||
array_push($this->_liStack, $this->_listScope);
|
||||
}
|
||||
|
||||
$this->_xhtml .= '<' . $name;
|
||||
$this->_writeAttrs($attrs);
|
||||
$this->_xhtml .= '>';
|
||||
array_push($this->_stack,$name);
|
||||
$this->_counter[$name] = isset($this->_counter[$name]) ? $this->_counter[$name]+1 : 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closing tag handler - called from HTMLSax
|
||||
*
|
||||
* @param object $parsers HTML parser
|
||||
* @param string $name tag name
|
||||
* @return boolean
|
||||
* @access private
|
||||
*/
|
||||
function _closeHandler(&$parser, $name)
|
||||
{
|
||||
|
||||
$name = strtolower($name);
|
||||
|
||||
if (isset($this->_dcCounter[$name]) && ($this->_dcCounter[$name] > 0) &&
|
||||
(in_array($name, $this->deleteTagsContent)))
|
||||
{
|
||||
while ($name != ($tag = array_pop($this->_dcStack))) {
|
||||
$this->_dcCounter[$tag]--;
|
||||
}
|
||||
|
||||
$this->_dcCounter[$name]--;
|
||||
}
|
||||
|
||||
if (count($this->_dcStack) != 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((isset($this->_counter[$name])) && ($this->_counter[$name] > 0)) {
|
||||
while ($name != ($tag = array_pop($this->_stack))) {
|
||||
$this->_closeTag($tag);
|
||||
}
|
||||
|
||||
$this->_closeTag($name);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes tag
|
||||
*
|
||||
* @param string $tag tag name
|
||||
* @return boolean
|
||||
* @access private
|
||||
*/
|
||||
function _closeTag($tag)
|
||||
{
|
||||
if (!in_array($tag, $this->noClose)) {
|
||||
$this->_xhtml .= '</' . $tag . '>';
|
||||
}
|
||||
|
||||
$this->_counter[$tag]--;
|
||||
|
||||
if (in_array($tag, $this->listTags)) {
|
||||
$this->_listScope--;
|
||||
}
|
||||
|
||||
if ($tag == 'li') {
|
||||
array_pop($this->_liStack);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Character data handler - called from HTMLSax
|
||||
*
|
||||
* @param object $parser HTML parser
|
||||
* @param string $data textual data
|
||||
* @return boolean
|
||||
* @access private
|
||||
*/
|
||||
function _dataHandler(&$parser, $data)
|
||||
{
|
||||
if (count($this->_dcStack) == 0) {
|
||||
$this->_xhtml .= $data;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Escape handler - called from HTMLSax
|
||||
*
|
||||
* @param object $parser HTML parser
|
||||
* @param string $data comments or other type of data
|
||||
* @return boolean
|
||||
* @access private
|
||||
*/
|
||||
function _escapeHandler(&$parser, $data)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the XHTML document
|
||||
*
|
||||
* @return string Processed (X)HTML document
|
||||
* @access public
|
||||
*/
|
||||
function getXHTML ()
|
||||
{
|
||||
while ($tag = array_pop($this->_stack)) {
|
||||
$this->_closeTag($tag);
|
||||
}
|
||||
|
||||
return $this->_xhtml;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears current document data
|
||||
*
|
||||
* @return boolean
|
||||
* @access public
|
||||
*/
|
||||
function clear()
|
||||
{
|
||||
$this->_xhtml = '';
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Main parsing fuction
|
||||
*
|
||||
* @param string $doc HTML document for processing
|
||||
* @return string Processed (X)HTML document
|
||||
* @access public
|
||||
*/
|
||||
function parse($doc)
|
||||
{
|
||||
|
||||
// Save all '<' symbols
|
||||
$doc = preg_replace("/<(?=[^a-zA-Z\/\!\?\%])/", '<', $doc);
|
||||
|
||||
// Web documents shouldn't contains \x00 symbol
|
||||
$doc = str_replace("\x00", '', $doc);
|
||||
|
||||
// Opera6 bug workaround
|
||||
$doc = str_replace("\xC0\xBC", '<', $doc);
|
||||
|
||||
// UTF-7 encoding ASCII decode
|
||||
$doc = $this->repackUTF7($doc);
|
||||
|
||||
// Instantiate the parser
|
||||
$parser=new XML_HTMLSax3();
|
||||
|
||||
// Set up the parser
|
||||
$parser->set_object($this);
|
||||
|
||||
$parser->set_element_handler('_openHandler','_closeHandler');
|
||||
$parser->set_data_handler('_dataHandler');
|
||||
$parser->set_escape_handler('_escapeHandler');
|
||||
|
||||
$parser->parse($doc);
|
||||
|
||||
return $this->getXHTML();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* UTF-7 decoding fuction
|
||||
*
|
||||
* @param string $str HTML document for recode ASCII part of UTF-7 back to ASCII
|
||||
* @return string Decoded document
|
||||
* @access private
|
||||
*/
|
||||
function repackUTF7($str)
|
||||
{
|
||||
return preg_replace_callback('!\+([0-9a-zA-Z/]+)\-!', array($this, 'repackUTF7Callback'), $str);
|
||||
}
|
||||
|
||||
/**
|
||||
* Additional UTF-7 decoding fuction
|
||||
*
|
||||
* @param string $str String for recode ASCII part of UTF-7 back to ASCII
|
||||
* @return string Recoded string
|
||||
* @access private
|
||||
*/
|
||||
function repackUTF7Callback($str)
|
||||
{
|
||||
$str = base64_decode($str[1]);
|
||||
$str = preg_replace_callback('/^((?:\x00.)*)((?:[^\x00].)+)/', array($this, 'repackUTF7Back'), $str);
|
||||
return preg_replace('/\x00(.)/', '$1', $str);
|
||||
}
|
||||
|
||||
/**
|
||||
* Additional UTF-7 encoding fuction
|
||||
*
|
||||
* @param string $str String for recode ASCII part of UTF-7 back to ASCII
|
||||
* @return string Recoded string
|
||||
* @access private
|
||||
*/
|
||||
function repackUTF7Back($str)
|
||||
{
|
||||
return $str[1].'+'.rtrim(base64_encode($str[2]), '=').'-';
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* tab-width: 4
|
||||
* c-basic-offset: 4
|
||||
* c-hanging-comment-ender-p: nil
|
||||
* End:
|
||||
*/
|
||||
|
||||
?>
|
167
engine/lib/Thumbnail.class.php
Executable file
167
engine/lib/Thumbnail.class.php
Executable file
@ -0,0 +1,167 @@
|
||||
<?php
|
||||
/*
|
||||
Author: Blaz Grapar, blaz.grapar@email.si
|
||||
|
||||
Please don't delete my name in the script. Thanks.
|
||||
|
||||
This simple class creates a thumbnail of an image. Size of thumbnail is determined with maximum width and height of an thumbnail.
|
||||
|
||||
|
||||
EXAMPLE:
|
||||
$myThumb = new Thumbnail; // Start using a class
|
||||
$myThumb->setMaxSize( 200, 200 ); // Specify maximum size (width, height)
|
||||
$myThumb->setImgSource( 'image_original.jpg' ); // Specify original image filename
|
||||
$myThumb->Create( 'image_thumbnail.jpg' ); // Specify destination image filename or leave empty to output directly
|
||||
|
||||
You can also get additional info about original image or thumbnail...
|
||||
|
||||
$myThumb = new Thumbnail; // Start using a class
|
||||
$myThumb->setImgSource( 'image_original.jpg' ); // Specify original image filename
|
||||
$myThumb->getImageData( 'width' ) // This will get you pixel width of original image. getImageData arguments are width|height|type
|
||||
|
||||
You can also use getThumbData to see the size of thumbnail that will be created.
|
||||
$myThumb = new Thumbnail; // Start using a class
|
||||
$myThumb->setMaxSize( 200, 200 ); // Specify maximum size (width, height)
|
||||
$myThumb->getThumbData( 'width' ) // This will get you pixel width of thumbnail image. getImageData arguments are width|height|type
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
class Thumbnail
|
||||
{
|
||||
|
||||
// Set destination filename
|
||||
function setImgSource( $source )
|
||||
{
|
||||
$this->source = $source;
|
||||
}
|
||||
|
||||
// Set maximum size of thumbnail
|
||||
function setMaxSize ( $max_width = 100, $max_height = 100 )
|
||||
{
|
||||
$this->max_width = $max_width;
|
||||
$this->max_height = $max_height;
|
||||
}
|
||||
|
||||
|
||||
// Get info about original image
|
||||
function getImageData( $data )
|
||||
{
|
||||
$size = getimagesize( $this->source );
|
||||
|
||||
switch ( $data )
|
||||
{
|
||||
case 'width':
|
||||
return $size[0];
|
||||
break;
|
||||
case 'height':
|
||||
return $size[1];
|
||||
break;
|
||||
case 'type':
|
||||
switch ( $size[2] )
|
||||
{
|
||||
case 1:
|
||||
return 'gif';
|
||||
break;
|
||||
case 2:
|
||||
return 'jpg';
|
||||
break;
|
||||
case 3:
|
||||
return 'png';
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Get info about thumbnail
|
||||
function getThumbData( $data ){
|
||||
$w_ratio = $this->max_width / $this->GetImageData('width');
|
||||
$h_ratio = $this->max_height / $this->GetImageData('height');
|
||||
|
||||
if ( $h_ratio < $w_ratio ){
|
||||
$height = $this->max_height;
|
||||
$width = round( $this->GetImageData('width') * $h_ratio, 0);
|
||||
}else{
|
||||
$width = $this->max_width;
|
||||
$height = round( $this->GetImageData('height') * $w_ratio, 0);
|
||||
}
|
||||
|
||||
switch ( $data ){
|
||||
case 'width':
|
||||
return $width;
|
||||
break;
|
||||
case 'height':
|
||||
return $height;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Creating a thumbnail
|
||||
function Create( $dest = NULL ){
|
||||
$img_des = imagecreatetruecolor( $this->GetThumbData('width'), $this->GetThumbData('height') );
|
||||
|
||||
$background = imagecolorallocate( $img_des , 255 , 255 , 255 );
|
||||
imagefill( $img_des , 0 , 0 , $background );
|
||||
|
||||
switch ( $this->GetImageData('type') ){
|
||||
case 'gif':
|
||||
$img_src = imagecreatefromgif( $this->source );
|
||||
break;
|
||||
|
||||
case 'jpg':
|
||||
$img_src = imagecreatefromjpeg( $this->source );
|
||||
break;
|
||||
|
||||
case 'png':
|
||||
$img_src = imagecreatefrompng( $this->source );
|
||||
break;
|
||||
}
|
||||
|
||||
// GD 1.0
|
||||
//ImageCopyResized( $img_des, $img_src, 0, 0, 0, 0, $this->GetThumbData('width'), $this->GetThumbData('height'), $this->GetImageData('width'), $this->GetImageData('height') );
|
||||
// GD 2.0
|
||||
imagecopyresampled( $img_des, $img_src, 0, 0, 0, 0, $this->GetThumbData('width'), $this->GetThumbData('height'), $this->GetImageData('width'), $this->GetImageData('height') );
|
||||
|
||||
switch ( $this->GetImageData('type') ){
|
||||
case 'gif':
|
||||
if ( empty( $dest ) ){
|
||||
ob_start();
|
||||
//header( "Content-type: image/gif" );
|
||||
imagegif( $img_des );
|
||||
$return = ob_get_clean();
|
||||
return $return;
|
||||
}else{
|
||||
return imagegif( $img_des, $dest );
|
||||
}
|
||||
break;
|
||||
|
||||
case 'jpg':
|
||||
if ( empty( $dest ) ){
|
||||
ob_start();
|
||||
//header ( "Content-type: image/jpeg" );
|
||||
imagejpeg( $img_des );
|
||||
$return = ob_get_clean();
|
||||
return $return;
|
||||
}else{
|
||||
return imagejpeg( $img_des, $dest );
|
||||
}
|
||||
break;
|
||||
|
||||
case 'png':
|
||||
if ( empty( $dest ) ){
|
||||
ob_start();
|
||||
//header ( "Content-type: image/png" );
|
||||
imagepng( $img_des );
|
||||
$return = ob_get_clean();
|
||||
return $return;
|
||||
}else{
|
||||
return imagepng( $img_des, $dest );
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
147
engine/lib/Url.class.php
Executable file
147
engine/lib/Url.class.php
Executable file
@ -0,0 +1,147 @@
|
||||
<?php
|
||||
class Url{
|
||||
const SHORT_CLASS_TAG = 'c';
|
||||
const SHORT_METHOD_TAG = 'm';
|
||||
const URLBASE = '/';
|
||||
public static $enter = array();
|
||||
public static $params = array();
|
||||
public static $custom = array();
|
||||
public static $url = false;
|
||||
|
||||
public static function setUrl( $url ){
|
||||
self::$enter = self::$params = array();
|
||||
self::$url = $url;
|
||||
self::initParams();
|
||||
}
|
||||
public static function getUrl(){
|
||||
self::initParams();
|
||||
return self::$url;
|
||||
}
|
||||
public static function get( $str ){
|
||||
self::initParams();
|
||||
return isset( self::$params[$str] )?self::$params[$str]:false ;
|
||||
}
|
||||
public static function getClass(){
|
||||
self::initParams();
|
||||
return self::$enter['class'];
|
||||
}
|
||||
public static function getMethod(){
|
||||
self::initParams();
|
||||
return self::$enter['method'];
|
||||
}
|
||||
public static function make( $custom = array() , $old = array() ){
|
||||
self::initParams();
|
||||
|
||||
$base = array();
|
||||
|
||||
self::formatUrlParams( $base , $custom , $old );
|
||||
|
||||
//$base[self::SHORT_CLASS_TAG] = $base[self::SHORT_CLASS_TAG]?:self::getClass();
|
||||
//$base[self::SHORT_METHOD_TAG] = $base[self::SHORT_METHOD_TAG]?:c('default_method');
|
||||
|
||||
if( !$base[self::SHORT_CLASS_TAG] ){
|
||||
$base[self::SHORT_CLASS_TAG] = self::getClass();
|
||||
if( !$base[self::SHORT_METHOD_TAG] ){
|
||||
$base[self::SHORT_METHOD_TAG] = self::getMethod();
|
||||
}
|
||||
}
|
||||
if( !$base[self::SHORT_METHOD_TAG] ){
|
||||
$base[self::SHORT_METHOD_TAG] = c('default_method');
|
||||
}
|
||||
|
||||
if( $base[self::SHORT_METHOD_TAG]== c('default_method') ){
|
||||
unset( $base[self::SHORT_METHOD_TAG] );
|
||||
if( !$custom && !$old && $base[self::SHORT_CLASS_TAG]== c('default_class') ){
|
||||
unset( $base[self::SHORT_CLASS_TAG] );
|
||||
}
|
||||
}
|
||||
//start to make url
|
||||
$url = c('url_base')?c('url_base'):self::URLBASE;
|
||||
if( c('static_url') ){
|
||||
if( $base )
|
||||
$url .= join('/',$base).'/';
|
||||
|
||||
if( $custom ){
|
||||
foreach( $custom as $k => $v ){
|
||||
if( $v ){
|
||||
$url .= $k.'/'.$v.'/';
|
||||
}
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if( $base )
|
||||
$custom += $base;
|
||||
|
||||
if( $custom )
|
||||
$url .= '?'.http_build_query($custom);
|
||||
}
|
||||
|
||||
return $url;
|
||||
}
|
||||
public static function initParams(){
|
||||
if( !self::$enter ){
|
||||
$custom = array();
|
||||
if( !self::$url ){
|
||||
if( c('static_url') ){
|
||||
self::$url = isset($_SERVER['REDIRECT_URL'])&&$_SERVER['REDIRECT_URL']?$_SERVER['REDIRECT_URL']:$_SERVER['PATH_INFO'];
|
||||
}else{
|
||||
self::$url = $_GET;
|
||||
}
|
||||
}
|
||||
if( c('static_url') ){
|
||||
$tempArray = explode( '/' , trim(self::$url , '/' ) );
|
||||
if( $tempArray ){
|
||||
if( count( $tempArray )%2 == 0 ){
|
||||
$custom['class'] = safeUrlString(array_shift( $tempArray ));
|
||||
$custom['method'] = safeUrlString(array_shift( $tempArray ));
|
||||
}else{
|
||||
$custom['class'] = safeUrlString(array_shift( $tempArray ));
|
||||
$custom['method'] = c('default_method');
|
||||
}
|
||||
}
|
||||
if( $tempArray ){
|
||||
foreach( array_chunk($tempArray, 2) as $v ){
|
||||
list( $key , $value ) = $v;
|
||||
$custom[$key] = $value;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
$custom = self::$url;
|
||||
}
|
||||
$base = array();
|
||||
self::formatUrlParams( $base , $custom );
|
||||
self::$enter['class'] = $base[self::SHORT_CLASS_TAG]?:c('default_class');
|
||||
self::$enter['method'] = $base[self::SHORT_METHOD_TAG]?:c('default_method');
|
||||
self::$params = $custom;
|
||||
if( c('static_url') ){
|
||||
$_REQUEST += $base + $custom;
|
||||
$_GET += $base + $custom;
|
||||
}
|
||||
}
|
||||
}
|
||||
private static function formatUrlParams( &$base , &$custom , $old = array() ){
|
||||
// init url params
|
||||
if( !is_array( $custom ) ){
|
||||
parse_str( ltrim( $custom , '?' ) , $custom);
|
||||
}
|
||||
$custom += self::$custom;
|
||||
if( $old ){
|
||||
foreach( $old as $v ){
|
||||
if( $v && self::$params[$v] ){
|
||||
$custom[$v] = self::$params[$v];
|
||||
}
|
||||
}
|
||||
}
|
||||
//init custom params
|
||||
$needFix = array( 'class' , 'method' , self::SHORT_CLASS_TAG , self::SHORT_CLASS_TAG );
|
||||
foreach( $needFix as $v ){
|
||||
$custom[$v] = $custom[$v]?:NULL;
|
||||
}
|
||||
|
||||
$class = $custom[self::SHORT_CLASS_TAG]?:$custom['class'];
|
||||
$method = $custom[self::SHORT_METHOD_TAG]?:$custom['method'];
|
||||
unset( $custom['class'], $custom[self::SHORT_CLASS_TAG] , $custom['method'] ,$custom[self::SHORT_METHOD_TAG] );
|
||||
$base[self::SHORT_CLASS_TAG] = $class;
|
||||
$base[self::SHORT_METHOD_TAG] = $method;
|
||||
}
|
||||
}
|
64
engine/lib/Weibo.class.php
Executable file
64
engine/lib/Weibo.class.php
Executable file
@ -0,0 +1,64 @@
|
||||
<?php
|
||||
Class Weibo{
|
||||
private static $weiboClient,$weiboOAuth;
|
||||
private static $akey,$skey,$access_token,$refresh_token;
|
||||
private static $ip;
|
||||
public static function init( $akey, $skey, $access_token = NULL , $refresh_token = NULL ){
|
||||
self::$akey = $akey; self::$skey = $skey; self::$access_token = $access_token; self::$refresh_token = $refresh_token;
|
||||
}
|
||||
|
||||
public static function setIp( $ip ){
|
||||
self::$ip = $ip;
|
||||
}
|
||||
|
||||
public static function __callStatic($funcName, $args){
|
||||
if( !self::$akey && !self::$skey ){
|
||||
die( 'Weibo Class is not init.' );
|
||||
}
|
||||
self::initWeiboClient();
|
||||
if( self::$weiboClient ){
|
||||
if( method_exists(self::$weiboClient ,$funcName ) ){
|
||||
$res = call_user_func_array(array(self::$weiboClient , $funcName) , $args );
|
||||
if( $fun = c('after_weibo') ){
|
||||
if( function_exists( $fun ) ){
|
||||
$fun( $res );
|
||||
}
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
self::initWeiboOAuth();
|
||||
if( self::$weiboOAuth ){
|
||||
if( method_exists(self::$weiboOAuth ,$funcName ) ){
|
||||
if( $funcName == 'getAccessToken' ){
|
||||
$token = call_user_func_array( array(self::$weiboOAuth ,$funcName ), $args );
|
||||
if( !self::$weiboClient && $token['access_token'] ){
|
||||
self::$access_token = $token['access_token'];
|
||||
self::initWeiboClient();
|
||||
}
|
||||
return $token;
|
||||
}
|
||||
return call_user_func_array( array(self::$weiboOAuth ,$funcName ), $args );
|
||||
}
|
||||
}
|
||||
die( 'Function '.$funcName.' is not find in Weibo Class' );
|
||||
}
|
||||
private static function initWeiboClient(){
|
||||
if( !self::$weiboClient && self::$access_token ){
|
||||
include_once( "saetv2.ex.class.php" );
|
||||
self::$weiboClient = new SaeTClientV2( self::$akey, self::$skey, self::$access_token, self::$refresh_token );
|
||||
if( self::$ip ){
|
||||
self::$weiboClient->set_remote_ip( self::$ip );
|
||||
}
|
||||
}
|
||||
}
|
||||
private static function initWeiboOAuth(){
|
||||
if( !self::$weiboOAuth ){
|
||||
include_once( "saetv2.ex.class.php" );
|
||||
self::$weiboOAuth = new SaeTOAuthV2( self::$akey, self::$skey, self::$access_token, self::$refresh_token );
|
||||
if( self::$ip ){
|
||||
self::$weiboOAuth->remote_ip = self::$ip;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
688
engine/lib/XML/HTMLSax3.php
Normal file
688
engine/lib/XML/HTMLSax3.php
Normal file
@ -0,0 +1,688 @@
|
||||
<?php
|
||||
/* vim: set expandtab tabstop=4 shiftwidth=4: */
|
||||
//
|
||||
// +----------------------------------------------------------------------+
|
||||
// | PHP Version 4 |
|
||||
// +----------------------------------------------------------------------+
|
||||
// | Copyright (c) 1997-2002 The PHP Group |
|
||||
// +----------------------------------------------------------------------+
|
||||
// | This source file is subject toversion 3.0 of the PHP license, |
|
||||
// | that is bundled with this package in the file LICENSE, and is |
|
||||
// | available at through the world-wide-web at |
|
||||
// | http://www.php.net/license/3_0.txt. |
|
||||
// | If you did not receive a copy of the PHP license and are unable to |
|
||||
// | obtain it through the world-wide-web, please send a note to |
|
||||
// | license@php.net so we can mail you a copy immediately. |
|
||||
// +----------------------------------------------------------------------+
|
||||
// | Authors: Alexander Zhukov <alex@veresk.ru> Original port from Python |
|
||||
// | Authors: Harry Fuecks <hfuecks@phppatterns.com> Port to PEAR + more |
|
||||
// | Authors: Many @ Sitepointforums Advanced PHP Forums |
|
||||
// +----------------------------------------------------------------------+
|
||||
//
|
||||
// $Id: HTMLSax3.php,v 1.2 2007/10/29 21:41:34 hfuecks Exp $
|
||||
//
|
||||
/**
|
||||
* Main parser components
|
||||
* @package XML_HTMLSax3
|
||||
* @version $Id: HTMLSax3.php,v 1.2 2007/10/29 21:41:34 hfuecks Exp $
|
||||
*/
|
||||
/**
|
||||
* Required classes
|
||||
*/
|
||||
define('XML_HTMLSAX3', 'XML/');
|
||||
if (!defined('XML_HTMLSAX3')) {
|
||||
define('XML_HTMLSAX3', 'XML/');
|
||||
}
|
||||
require_once(__DIR__ . '/HTMLSax3/States.php');
|
||||
require_once(__DIR__ . '/HTMLSax3/Decorators.php');
|
||||
|
||||
/**
|
||||
* Base State Parser
|
||||
* @package XML_HTMLSax3
|
||||
* @access protected
|
||||
* @abstract
|
||||
*/
|
||||
class XML_HTMLSax3_StateParser {
|
||||
/**
|
||||
* Instance of user front end class to be passed to callbacks
|
||||
* @var XML_HTMLSax3
|
||||
* @access private
|
||||
*/
|
||||
var $htmlsax;
|
||||
/**
|
||||
* User defined object for handling elements
|
||||
* @var object
|
||||
* @access private
|
||||
*/
|
||||
var $handler_object_element;
|
||||
/**
|
||||
* User defined open tag handler method
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $handler_method_opening;
|
||||
/**
|
||||
* User defined close tag handler method
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $handler_method_closing;
|
||||
/**
|
||||
* User defined object for handling data in elements
|
||||
* @var object
|
||||
* @access private
|
||||
*/
|
||||
var $handler_object_data;
|
||||
/**
|
||||
* User defined data handler method
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $handler_method_data;
|
||||
/**
|
||||
* User defined object for handling processing instructions
|
||||
* @var object
|
||||
* @access private
|
||||
*/
|
||||
var $handler_object_pi;
|
||||
/**
|
||||
* User defined processing instruction handler method
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $handler_method_pi;
|
||||
/**
|
||||
* User defined object for handling JSP/ASP tags
|
||||
* @var object
|
||||
* @access private
|
||||
*/
|
||||
var $handler_object_jasp;
|
||||
/**
|
||||
* User defined JSP/ASP handler method
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $handler_method_jasp;
|
||||
/**
|
||||
* User defined object for handling XML escapes
|
||||
* @var object
|
||||
* @access private
|
||||
*/
|
||||
var $handler_object_escape;
|
||||
/**
|
||||
* User defined XML escape handler method
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $handler_method_escape;
|
||||
/**
|
||||
* User defined handler object or NullHandler
|
||||
* @var object
|
||||
* @access private
|
||||
*/
|
||||
var $handler_default;
|
||||
/**
|
||||
* Parser options determining parsing behavior
|
||||
* @var array
|
||||
* @access private
|
||||
*/
|
||||
var $parser_options = array();
|
||||
/**
|
||||
* XML document being parsed
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $rawtext;
|
||||
/**
|
||||
* Position in XML document relative to start (0)
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
var $position;
|
||||
/**
|
||||
* Length of the XML document in characters
|
||||
* @var int
|
||||
* @access private
|
||||
*/
|
||||
var $length;
|
||||
/**
|
||||
* Array of state objects
|
||||
* @var array
|
||||
* @access private
|
||||
*/
|
||||
var $State = array();
|
||||
|
||||
/**
|
||||
* Constructs XML_HTMLSax3_StateParser setting up states
|
||||
* @var XML_HTMLSax3 instance of user front end class
|
||||
* @access protected
|
||||
*/
|
||||
function XML_HTMLSax3_StateParser (& $htmlsax) {
|
||||
$this->htmlsax = & $htmlsax;
|
||||
$this->State[XML_HTMLSAX3_STATE_START] =new XML_HTMLSax3_StartingState();
|
||||
|
||||
$this->State[XML_HTMLSAX3_STATE_CLOSING_TAG] =new XML_HTMLSax3_ClosingTagState();
|
||||
$this->State[XML_HTMLSAX3_STATE_TAG] =new XML_HTMLSax3_TagState();
|
||||
$this->State[XML_HTMLSAX3_STATE_OPENING_TAG] =new XML_HTMLSax3_OpeningTagState();
|
||||
|
||||
$this->State[XML_HTMLSAX3_STATE_PI] =new XML_HTMLSax3_PiState();
|
||||
$this->State[XML_HTMLSAX3_STATE_JASP] =new XML_HTMLSax3_JaspState();
|
||||
$this->State[XML_HTMLSAX3_STATE_ESCAPE] =new XML_HTMLSax3_EscapeState();
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves the position back one character
|
||||
* @access protected
|
||||
* @return void
|
||||
*/
|
||||
function unscanCharacter() {
|
||||
$this->position -= 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves the position forward one character
|
||||
* @access protected
|
||||
* @return void
|
||||
*/
|
||||
function ignoreCharacter() {
|
||||
$this->position += 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the next character from the XML document or void if at end
|
||||
* @access protected
|
||||
* @return mixed
|
||||
*/
|
||||
function scanCharacter() {
|
||||
if ($this->position < $this->length) {
|
||||
return $this->rawtext{$this->position++};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string from the current position to the next occurance
|
||||
* of the supplied string
|
||||
* @param string string to search until
|
||||
* @access protected
|
||||
* @return string
|
||||
*/
|
||||
function scanUntilString($string) {
|
||||
$start = $this->position;
|
||||
$this->position = strpos($this->rawtext, $string, $start);
|
||||
if ($this->position === FALSE) {
|
||||
$this->position = $this->length;
|
||||
}
|
||||
return substr($this->rawtext, $start, $this->position - $start);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string from the current position until the first instance of
|
||||
* one of the characters in the supplied string argument
|
||||
* @param string string to search until
|
||||
* @access protected
|
||||
* @return string
|
||||
* @abstract
|
||||
*/
|
||||
function scanUntilCharacters($string) {}
|
||||
|
||||
/**
|
||||
* Moves the position forward past any whitespace characters
|
||||
* @access protected
|
||||
* @return void
|
||||
* @abstract
|
||||
*/
|
||||
function ignoreWhitespace() {}
|
||||
|
||||
/**
|
||||
* Begins the parsing operation, setting up any decorators, depending on
|
||||
* parse options invoking _parse() to execute parsing
|
||||
* @param string XML document to parse
|
||||
* @access protected
|
||||
* @return void
|
||||
*/
|
||||
function parse($data) {
|
||||
if ($this->parser_options['XML_OPTION_TRIM_DATA_NODES']==1) {
|
||||
$decorator =new XML_HTMLSax3_Trim(
|
||||
$this->handler_object_data,
|
||||
$this->handler_method_data);
|
||||
$this->handler_object_data =& $decorator;
|
||||
$this->handler_method_data = 'trimData';
|
||||
}
|
||||
if ($this->parser_options['XML_OPTION_CASE_FOLDING']==1) {
|
||||
$open_decor =new XML_HTMLSax3_CaseFolding(
|
||||
$this->handler_object_element,
|
||||
$this->handler_method_opening,
|
||||
$this->handler_method_closing);
|
||||
$this->handler_object_element =& $open_decor;
|
||||
$this->handler_method_opening ='foldOpen';
|
||||
$this->handler_method_closing ='foldClose';
|
||||
}
|
||||
if ($this->parser_options['XML_OPTION_LINEFEED_BREAK']==1) {
|
||||
$decorator =new XML_HTMLSax3_Linefeed(
|
||||
$this->handler_object_data,
|
||||
$this->handler_method_data);
|
||||
$this->handler_object_data =& $decorator;
|
||||
$this->handler_method_data = 'breakData';
|
||||
}
|
||||
if ($this->parser_options['XML_OPTION_TAB_BREAK']==1) {
|
||||
$decorator =new XML_HTMLSax3_Tab(
|
||||
$this->handler_object_data,
|
||||
$this->handler_method_data);
|
||||
$this->handler_object_data =& $decorator;
|
||||
$this->handler_method_data = 'breakData';
|
||||
}
|
||||
if ($this->parser_options['XML_OPTION_ENTITIES_UNPARSED']==1) {
|
||||
$decorator =new XML_HTMLSax3_Entities_Unparsed(
|
||||
$this->handler_object_data,
|
||||
$this->handler_method_data);
|
||||
$this->handler_object_data =& $decorator;
|
||||
$this->handler_method_data = 'breakData';
|
||||
}
|
||||
if ($this->parser_options['XML_OPTION_ENTITIES_PARSED']==1) {
|
||||
$decorator =new XML_HTMLSax3_Entities_Parsed(
|
||||
$this->handler_object_data,
|
||||
$this->handler_method_data);
|
||||
$this->handler_object_data =& $decorator;
|
||||
$this->handler_method_data = 'breakData';
|
||||
}
|
||||
// Note switched on by default
|
||||
if ($this->parser_options['XML_OPTION_STRIP_ESCAPES']==1) {
|
||||
$decorator =new XML_HTMLSax3_Escape_Stripper(
|
||||
$this->handler_object_escape,
|
||||
$this->handler_method_escape);
|
||||
$this->handler_object_escape =& $decorator;
|
||||
$this->handler_method_escape = 'strip';
|
||||
}
|
||||
$this->rawtext = $data;
|
||||
$this->length = strlen($data);
|
||||
$this->position = 0;
|
||||
$this->_parse();
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs the parsing itself, delegating calls to a specific parser
|
||||
* state
|
||||
* @param constant state object to parse with
|
||||
* @access protected
|
||||
* @return void
|
||||
*/
|
||||
function _parse($state = XML_HTMLSAX3_STATE_START) {
|
||||
do {
|
||||
$state = $this->State[$state]->parse($this);
|
||||
} while ($state != XML_HTMLSAX3_STATE_STOP &&
|
||||
$this->position < $this->length);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parser for PHP Versions below 4.3.0. Uses a slower parsing mechanism than
|
||||
* the equivalent PHP 4.3.0+ subclass of StateParser
|
||||
* @package XML_HTMLSax3
|
||||
* @access protected
|
||||
* @see XML_HTMLSax3_StateParser_Gtet430
|
||||
*/
|
||||
class XML_HTMLSax3_StateParser_Lt430 extends XML_HTMLSax3_StateParser {
|
||||
/**
|
||||
* Constructs XML_HTMLSax3_StateParser_Lt430 defining available
|
||||
* parser options
|
||||
* @var XML_HTMLSax3 instance of user front end class
|
||||
* @access protected
|
||||
*/
|
||||
function XML_HTMLSax3_StateParser_Lt430(& $htmlsax) {
|
||||
parent::XML_HTMLSax3_StateParser($htmlsax);
|
||||
$this->parser_options['XML_OPTION_TRIM_DATA_NODES'] = 0;
|
||||
$this->parser_options['XML_OPTION_CASE_FOLDING'] = 0;
|
||||
$this->parser_options['XML_OPTION_LINEFEED_BREAK'] = 0;
|
||||
$this->parser_options['XML_OPTION_TAB_BREAK'] = 0;
|
||||
$this->parser_options['XML_OPTION_ENTITIES_PARSED'] = 0;
|
||||
$this->parser_options['XML_OPTION_ENTITIES_UNPARSED'] = 0;
|
||||
$this->parser_options['XML_OPTION_STRIP_ESCAPES'] = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string from the current position until the first instance of
|
||||
* one of the characters in the supplied string argument
|
||||
* @param string string to search until
|
||||
* @access protected
|
||||
* @return string
|
||||
*/
|
||||
function scanUntilCharacters($string) {
|
||||
$startpos = $this->position;
|
||||
while ($this->position < $this->length && strpos($string, $this->rawtext{$this->position}) === FALSE) {
|
||||
$this->position++;
|
||||
}
|
||||
return substr($this->rawtext, $startpos, $this->position - $startpos);
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves the position forward past any whitespace characters
|
||||
* @access protected
|
||||
* @return void
|
||||
*/
|
||||
function ignoreWhitespace() {
|
||||
while ($this->position < $this->length &&
|
||||
strpos(" \n\r\t", $this->rawtext{$this->position}) !== FALSE) {
|
||||
$this->position++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Begins the parsing operation, setting up the unparsed XML entities
|
||||
* decorator if necessary then delegating further work to parent
|
||||
* @param string XML document to parse
|
||||
* @access protected
|
||||
* @return void
|
||||
*/
|
||||
function parse($data) {
|
||||
parent::parse($data);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parser for PHP Versions equal to or greater than 4.3.0. Uses a faster
|
||||
* parsing mechanism than the equivalent PHP < 4.3.0 subclass of StateParser
|
||||
* @package XML_HTMLSax3
|
||||
* @access protected
|
||||
* @see XML_HTMLSax3_StateParser_Lt430
|
||||
*/
|
||||
class XML_HTMLSax3_StateParser_Gtet430 extends XML_HTMLSax3_StateParser {
|
||||
/**
|
||||
* Constructs XML_HTMLSax3_StateParser_Gtet430 defining available
|
||||
* parser options
|
||||
* @var XML_HTMLSax3 instance of user front end class
|
||||
* @access protected
|
||||
*/
|
||||
function XML_HTMLSax3_StateParser_Gtet430(& $htmlsax) {
|
||||
parent::XML_HTMLSax3_StateParser($htmlsax);
|
||||
$this->parser_options['XML_OPTION_TRIM_DATA_NODES'] = 0;
|
||||
$this->parser_options['XML_OPTION_CASE_FOLDING'] = 0;
|
||||
$this->parser_options['XML_OPTION_LINEFEED_BREAK'] = 0;
|
||||
$this->parser_options['XML_OPTION_TAB_BREAK'] = 0;
|
||||
$this->parser_options['XML_OPTION_ENTITIES_PARSED'] = 0;
|
||||
$this->parser_options['XML_OPTION_ENTITIES_UNPARSED'] = 0;
|
||||
$this->parser_options['XML_OPTION_STRIP_ESCAPES'] = 0;
|
||||
}
|
||||
/**
|
||||
* Returns a string from the current position until the first instance of
|
||||
* one of the characters in the supplied string argument.
|
||||
* @param string string to search until
|
||||
* @access protected
|
||||
* @return string
|
||||
*/
|
||||
function scanUntilCharacters($string) {
|
||||
$startpos = $this->position;
|
||||
$length = strcspn($this->rawtext, $string, $startpos);
|
||||
$this->position += $length;
|
||||
return substr($this->rawtext, $startpos, $length);
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves the position forward past any whitespace characters
|
||||
* @access protected
|
||||
* @return void
|
||||
*/
|
||||
function ignoreWhitespace() {
|
||||
$this->position += strspn($this->rawtext, " \n\r\t", $this->position);
|
||||
}
|
||||
|
||||
/**
|
||||
* Begins the parsing operation, setting up the parsed and unparsed
|
||||
* XML entity decorators if necessary then delegating further work
|
||||
* to parent
|
||||
* @param string XML document to parse
|
||||
* @access protected
|
||||
* @return void
|
||||
*/
|
||||
function parse($data) {
|
||||
parent::parse($data);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Default NullHandler for methods which were not set by user
|
||||
* @package XML_HTMLSax3
|
||||
* @access protected
|
||||
*/
|
||||
class XML_HTMLSax3_NullHandler {
|
||||
/**
|
||||
* Generic handler method which does nothing
|
||||
* @access protected
|
||||
* @return void
|
||||
*/
|
||||
function DoNothing() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* User interface class. All user calls should only be made to this class
|
||||
* @package XML_HTMLSax3
|
||||
* @access public
|
||||
*/
|
||||
class XML_HTMLSax3 {
|
||||
/**
|
||||
* Instance of concrete subclass of XML_HTMLSax3_StateParser
|
||||
* @var XML_HTMLSax3_StateParser
|
||||
* @access private
|
||||
*/
|
||||
var $state_parser;
|
||||
|
||||
/**
|
||||
* Constructs XML_HTMLSax3 selecting concrete StateParser subclass
|
||||
* depending on PHP version being used as well as setting the default
|
||||
* NullHandler for all callbacks<br />
|
||||
* <b>Example:</b>
|
||||
* <pre>
|
||||
* $myHandler = new MyHandler();
|
||||
* $parser = new XML_HTMLSax3();
|
||||
* $parser->set_object($myHandler);
|
||||
* $parser->set_option('XML_OPTION_CASE_FOLDING');
|
||||
* $parser->set_element_handler('myOpenHandler','myCloseHandler');
|
||||
* $parser->set_data_handler('myDataHandler');
|
||||
* $parser->parser($xml);
|
||||
* </pre>
|
||||
* @access public
|
||||
*/
|
||||
function XML_HTMLSax3() {
|
||||
if (version_compare(phpversion(), '4.3', 'ge')) {
|
||||
$this->state_parser =new XML_HTMLSax3_StateParser_Gtet430($this);
|
||||
} else {
|
||||
$this->state_parser =new XML_HTMLSax3_StateParser_Lt430($this);
|
||||
}
|
||||
$nullhandler =new XML_HTMLSax3_NullHandler();
|
||||
$this->set_object($nullhandler);
|
||||
$this->set_element_handler('DoNothing', 'DoNothing');
|
||||
$this->set_data_handler('DoNothing');
|
||||
$this->set_pi_handler('DoNothing');
|
||||
$this->set_jasp_handler('DoNothing');
|
||||
$this->set_escape_handler('DoNothing');
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the user defined handler object. Returns a PEAR Error
|
||||
* if supplied argument is not an object.
|
||||
* @param object handler object containing SAX callback methods
|
||||
* @access public
|
||||
* @return mixed
|
||||
*/
|
||||
function set_object(&$object) {
|
||||
if ( is_object($object) ) {
|
||||
$this->state_parser->handler_default =& $object;
|
||||
return true;
|
||||
} else {
|
||||
require_once('PEAR.php');
|
||||
PEAR::raiseError('XML_HTMLSax3::set_object requires '.
|
||||
'an object instance');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a parser option. By default all options are switched off.
|
||||
* Returns a PEAR Error if option is invalid<br />
|
||||
* <b>Available options:</b>
|
||||
* <ul>
|
||||
* <li>XML_OPTION_TRIM_DATA_NODES: trim whitespace off the beginning
|
||||
* and end of data passed to the data handler</li>
|
||||
* <li>XML_OPTION_LINEFEED_BREAK: linefeeds result in additional data
|
||||
* handler calls</li>
|
||||
* <li>XML_OPTION_TAB_BREAK: tabs result in additional data handler
|
||||
* calls</li>
|
||||
* <li>XML_OPTION_ENTITIES_UNPARSED: XML entities are returned as
|
||||
* seperate data handler calls in unparsed form</li>
|
||||
* <li>XML_OPTION_ENTITIES_PARSED: (PHP 4.3.0+ only) XML entities are
|
||||
* returned as seperate data handler calls and are parsed with
|
||||
* PHP's html_entity_decode() function</li>
|
||||
* <li>XML_OPTION_STRIP_ESCAPES: strips out the -- -- comment markers
|
||||
* or CDATA markup inside an XML escape, if found.</li>
|
||||
* </ul>
|
||||
* To get HTMLSax to behave in the same way as the native PHP SAX parser,
|
||||
* using it's default state, you need to switch on XML_OPTION_LINEFEED_BREAK,
|
||||
* XML_OPTION_ENTITIES_PARSED and XML_OPTION_CASE_FOLDING
|
||||
* @param string name of parser option
|
||||
* @param int (optional) 1 to switch on, 0 for off
|
||||
* @access public
|
||||
* @return boolean
|
||||
*/
|
||||
function set_option($name, $value=1) {
|
||||
if ( array_key_exists($name,$this->state_parser->parser_options) ) {
|
||||
$this->state_parser->parser_options[$name] = $value;
|
||||
return true;
|
||||
} else {
|
||||
require_once('PEAR.php');
|
||||
PEAR::raiseError('XML_HTMLSax3::set_option('.$name.') illegal');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the data handler method which deals with the contents of XML
|
||||
* elements.<br />
|
||||
* The handler method must accept two arguments, the first being an
|
||||
* instance of XML_HTMLSax3 and the second being the contents of an
|
||||
* XML element e.g.
|
||||
* <pre>
|
||||
* function myDataHander(& $parser,$data){}
|
||||
* </pre>
|
||||
* @param string name of method
|
||||
* @access public
|
||||
* @return void
|
||||
* @see set_object
|
||||
*/
|
||||
function set_data_handler($data_method) {
|
||||
$this->state_parser->handler_object_data =& $this->state_parser->handler_default;
|
||||
$this->state_parser->handler_method_data = $data_method;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the open and close tag handlers
|
||||
* <br />The open handler method must accept three arguments; the parser,
|
||||
* the tag name and an array of attributes e.g.
|
||||
* <pre>
|
||||
* function myOpenHander(& $parser,$tagname,$attrs=array()){}
|
||||
* </pre>
|
||||
* The close handler method must accept two arguments; the parser and
|
||||
* the tag name e.g.
|
||||
* <pre>
|
||||
* function myCloseHander(& $parser,$tagname){}
|
||||
* </pre>
|
||||
* @param string name of open method
|
||||
* @param string name of close method
|
||||
* @access public
|
||||
* @return void
|
||||
* @see set_object
|
||||
*/
|
||||
function set_element_handler($opening_method, $closing_method) {
|
||||
$this->state_parser->handler_object_element =& $this->state_parser->handler_default;
|
||||
$this->state_parser->handler_method_opening = $opening_method;
|
||||
$this->state_parser->handler_method_closing = $closing_method;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the processing instruction handler method e.g. for PHP open
|
||||
* and close tags<br />
|
||||
* The handler method must accept three arguments; the parser, the
|
||||
* PI target and data inside the PI
|
||||
* <pre>
|
||||
* function myPIHander(& $parser,$target, $data){}
|
||||
* </pre>
|
||||
* @param string name of method
|
||||
* @access public
|
||||
* @return void
|
||||
* @see set_object
|
||||
*/
|
||||
function set_pi_handler($pi_method) {
|
||||
$this->state_parser->handler_object_pi =& $this->state_parser->handler_default;
|
||||
$this->state_parser->handler_method_pi = $pi_method;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the XML escape handler method e.g. for comments and doctype
|
||||
* declarations<br />
|
||||
* The handler method must accept two arguments; the parser and the
|
||||
* contents of the escaped section
|
||||
* <pre>
|
||||
* function myEscapeHander(& $parser, $data){}
|
||||
* </pre>
|
||||
* @param string name of method
|
||||
* @access public
|
||||
* @return void
|
||||
* @see set_object
|
||||
*/
|
||||
function set_escape_handler($escape_method) {
|
||||
$this->state_parser->handler_object_escape =& $this->state_parser->handler_default;
|
||||
$this->state_parser->handler_method_escape = $escape_method;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the JSP/ASP markup handler<br />
|
||||
* The handler method must accept two arguments; the parser and
|
||||
* body of the JASP tag
|
||||
* <pre>
|
||||
* function myJaspHander(& $parser, $data){}
|
||||
* </pre>
|
||||
* @param string name of method
|
||||
* @access public
|
||||
* @return void
|
||||
* @see set_object
|
||||
*/
|
||||
function set_jasp_handler ($jasp_method) {
|
||||
$this->state_parser->handler_object_jasp =& $this->state_parser->handler_default;
|
||||
$this->state_parser->handler_method_jasp = $jasp_method;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current string position of the "cursor" inside the XML
|
||||
* document
|
||||
* <br />Intended for use from within a user defined handler called
|
||||
* via the $parser reference e.g.
|
||||
* <pre>
|
||||
* function myDataHandler(& $parser,$data) {
|
||||
* echo( 'Current position: '.$parser->get_current_position() );
|
||||
* }
|
||||
* </pre>
|
||||
* @access public
|
||||
* @return int
|
||||
* @see get_length
|
||||
*/
|
||||
function get_current_position() {
|
||||
return $this->state_parser->position;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the string length of the XML document being parsed
|
||||
* @access public
|
||||
* @return int
|
||||
*/
|
||||
function get_length() {
|
||||
return $this->state_parser->length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Start parsing some XML
|
||||
* @param string XML document
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function parse($data) {
|
||||
$this->state_parser->parse($data);
|
||||
}
|
||||
}
|
||||
?>
|
363
engine/lib/XML/HTMLSax3/Decorators.php
Normal file
363
engine/lib/XML/HTMLSax3/Decorators.php
Normal file
@ -0,0 +1,363 @@
|
||||
<?php
|
||||
/* vim: set expandtab tabstop=4 shiftwidth=4: */
|
||||
//
|
||||
// +----------------------------------------------------------------------+
|
||||
// | PHP Version 4 |
|
||||
// +----------------------------------------------------------------------+
|
||||
// | Copyright (c) 1997-2002 The PHP Group |
|
||||
// +----------------------------------------------------------------------+
|
||||
// | This source file is subject toversion 3.0 of the PHP license, |
|
||||
// | that is bundled with this package in the file LICENSE, and is |
|
||||
// | available at through the world-wide-web at |
|
||||
// | http://www.php.net/license/3_0.txt. |
|
||||
// | If you did not receive a copy of the PHP license and are unable to |
|
||||
// | obtain it through the world-wide-web, please send a note to |
|
||||
// | license@php.net so we can mail you a copy immediately. |
|
||||
// +----------------------------------------------------------------------+
|
||||
// | Authors: Alexander Zhukov <alex@veresk.ru> Original port from Python |
|
||||
// | Authors: Harry Fuecks <hfuecks@phppatterns.com> Port to PEAR + more |
|
||||
// | Authors: Many @ Sitepointforums Advanced PHP Forums |
|
||||
// +----------------------------------------------------------------------+
|
||||
//
|
||||
// $Id: Decorators.php,v 1.2 2007/10/29 21:41:35 hfuecks Exp $
|
||||
//
|
||||
/**
|
||||
* Decorators for dealing with parser options
|
||||
* @package XML_HTMLSax3
|
||||
* @version $Id: Decorators.php,v 1.2 2007/10/29 21:41:35 hfuecks Exp $
|
||||
* @see XML_HTMLSax3::set_option
|
||||
*/
|
||||
/**
|
||||
* Trims the contents of element data from whitespace at start and end
|
||||
* @package XML_HTMLSax3
|
||||
* @access protected
|
||||
*/
|
||||
class XML_HTMLSax3_Trim {
|
||||
/**
|
||||
* Original handler object
|
||||
* @var object
|
||||
* @access private
|
||||
*/
|
||||
var $orig_obj;
|
||||
/**
|
||||
* Original handler method
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $orig_method;
|
||||
/**
|
||||
* Constructs XML_HTMLSax3_Trim
|
||||
* @param object handler object being decorated
|
||||
* @param string original handler method
|
||||
* @access protected
|
||||
*/
|
||||
function XML_HTMLSax3_Trim(&$orig_obj, $orig_method) {
|
||||
$this->orig_obj =& $orig_obj;
|
||||
$this->orig_method = $orig_method;
|
||||
}
|
||||
/**
|
||||
* Trims the data
|
||||
* @param XML_HTMLSax3
|
||||
* @param string element data
|
||||
* @access protected
|
||||
*/
|
||||
function trimData(&$parser, $data) {
|
||||
$data = trim($data);
|
||||
if ($data != '') {
|
||||
$this->orig_obj->{$this->orig_method}($parser, $data);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Coverts tag names to upper case
|
||||
* @package XML_HTMLSax3
|
||||
* @access protected
|
||||
*/
|
||||
class XML_HTMLSax3_CaseFolding {
|
||||
/**
|
||||
* Original handler object
|
||||
* @var object
|
||||
* @access private
|
||||
*/
|
||||
var $orig_obj;
|
||||
/**
|
||||
* Original open handler method
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $orig_open_method;
|
||||
/**
|
||||
* Original close handler method
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $orig_close_method;
|
||||
/**
|
||||
* Constructs XML_HTMLSax3_CaseFolding
|
||||
* @param object handler object being decorated
|
||||
* @param string original open handler method
|
||||
* @param string original close handler method
|
||||
* @access protected
|
||||
*/
|
||||
function XML_HTMLSax3_CaseFolding(&$orig_obj, $orig_open_method, $orig_close_method) {
|
||||
$this->orig_obj =& $orig_obj;
|
||||
$this->orig_open_method = $orig_open_method;
|
||||
$this->orig_close_method = $orig_close_method;
|
||||
}
|
||||
/**
|
||||
* Folds up open tag callbacks
|
||||
* @param XML_HTMLSax3
|
||||
* @param string tag name
|
||||
* @param array tag attributes
|
||||
* @access protected
|
||||
*/
|
||||
function foldOpen(&$parser, $tag, $attrs=array(), $empty = FALSE) {
|
||||
$this->orig_obj->{$this->orig_open_method}($parser, strtoupper($tag), $attrs, $empty);
|
||||
}
|
||||
/**
|
||||
* Folds up close tag callbacks
|
||||
* @param XML_HTMLSax3
|
||||
* @param string tag name
|
||||
* @access protected
|
||||
*/
|
||||
function foldClose(&$parser, $tag, $empty = FALSE) {
|
||||
$this->orig_obj->{$this->orig_close_method}($parser, strtoupper($tag), $empty);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Breaks up data by linefeed characters, resulting in additional
|
||||
* calls to the data handler
|
||||
* @package XML_HTMLSax3
|
||||
* @access protected
|
||||
*/
|
||||
class XML_HTMLSax3_Linefeed {
|
||||
/**
|
||||
* Original handler object
|
||||
* @var object
|
||||
* @access private
|
||||
*/
|
||||
var $orig_obj;
|
||||
/**
|
||||
* Original handler method
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $orig_method;
|
||||
/**
|
||||
* Constructs XML_HTMLSax3_LineFeed
|
||||
* @param object handler object being decorated
|
||||
* @param string original handler method
|
||||
* @access protected
|
||||
*/
|
||||
function XML_HTMLSax3_LineFeed(&$orig_obj, $orig_method) {
|
||||
$this->orig_obj =& $orig_obj;
|
||||
$this->orig_method = $orig_method;
|
||||
}
|
||||
/**
|
||||
* Breaks the data up by linefeeds
|
||||
* @param XML_HTMLSax3
|
||||
* @param string element data
|
||||
* @access protected
|
||||
*/
|
||||
function breakData(&$parser, $data) {
|
||||
$data = explode("\n",$data);
|
||||
foreach ( $data as $chunk ) {
|
||||
$this->orig_obj->{$this->orig_method}($parser, $chunk);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Breaks up data by tab characters, resulting in additional
|
||||
* calls to the data handler
|
||||
* @package XML_HTMLSax3
|
||||
* @access protected
|
||||
*/
|
||||
class XML_HTMLSax3_Tab {
|
||||
/**
|
||||
* Original handler object
|
||||
* @var object
|
||||
* @access private
|
||||
*/
|
||||
var $orig_obj;
|
||||
/**
|
||||
* Original handler method
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $orig_method;
|
||||
/**
|
||||
* Constructs XML_HTMLSax3_Tab
|
||||
* @param object handler object being decorated
|
||||
* @param string original handler method
|
||||
* @access protected
|
||||
*/
|
||||
function XML_HTMLSax3_Tab(&$orig_obj, $orig_method) {
|
||||
$this->orig_obj =& $orig_obj;
|
||||
$this->orig_method = $orig_method;
|
||||
}
|
||||
/**
|
||||
* Breaks the data up by linefeeds
|
||||
* @param XML_HTMLSax3
|
||||
* @param string element data
|
||||
* @access protected
|
||||
*/
|
||||
function breakData(&$parser, $data) {
|
||||
$data = explode("\t",$data);
|
||||
foreach ( $data as $chunk ) {
|
||||
$this->orig_obj->{$this->orig_method}($this, $chunk);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Breaks up data by XML entities and parses them with html_entity_decode(),
|
||||
* resulting in additional calls to the data handler<br />
|
||||
* Requires PHP 4.3.0+
|
||||
* @package XML_HTMLSax3
|
||||
* @access protected
|
||||
*/
|
||||
class XML_HTMLSax3_Entities_Parsed {
|
||||
/**
|
||||
* Original handler object
|
||||
* @var object
|
||||
* @access private
|
||||
*/
|
||||
var $orig_obj;
|
||||
/**
|
||||
* Original handler method
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $orig_method;
|
||||
/**
|
||||
* Constructs XML_HTMLSax3_Entities_Parsed
|
||||
* @param object handler object being decorated
|
||||
* @param string original handler method
|
||||
* @access protected
|
||||
*/
|
||||
function XML_HTMLSax3_Entities_Parsed(&$orig_obj, $orig_method) {
|
||||
$this->orig_obj =& $orig_obj;
|
||||
$this->orig_method = $orig_method;
|
||||
}
|
||||
/**
|
||||
* Breaks the data up by XML entities
|
||||
* @param XML_HTMLSax3
|
||||
* @param string element data
|
||||
* @access protected
|
||||
*/
|
||||
function breakData(&$parser, $data) {
|
||||
$data = preg_split('/(&.+?;)/',$data,-1,PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
|
||||
foreach ( $data as $chunk ) {
|
||||
$chunk = html_entity_decode($chunk,ENT_NOQUOTES);
|
||||
$this->orig_obj->{$this->orig_method}($this, $chunk);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Compatibility with older PHP versions
|
||||
*/
|
||||
if (version_compare(phpversion(), '4.3', '<') && !function_exists('html_entity_decode') ) {
|
||||
function html_entity_decode($str, $style=ENT_NOQUOTES) {
|
||||
return strtr($str,
|
||||
array_flip(get_html_translation_table(HTML_ENTITIES,$style)));
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Breaks up data by XML entities but leaves them unparsed,
|
||||
* resulting in additional calls to the data handler<br />
|
||||
* @package XML_HTMLSax3
|
||||
* @access protected
|
||||
*/
|
||||
class XML_HTMLSax3_Entities_Unparsed {
|
||||
/**
|
||||
* Original handler object
|
||||
* @var object
|
||||
* @access private
|
||||
*/
|
||||
var $orig_obj;
|
||||
/**
|
||||
* Original handler method
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $orig_method;
|
||||
/**
|
||||
* Constructs XML_HTMLSax3_Entities_Unparsed
|
||||
* @param object handler object being decorated
|
||||
* @param string original handler method
|
||||
* @access protected
|
||||
*/
|
||||
function XML_HTMLSax3_Entities_Unparsed(&$orig_obj, $orig_method) {
|
||||
$this->orig_obj =& $orig_obj;
|
||||
$this->orig_method = $orig_method;
|
||||
}
|
||||
/**
|
||||
* Breaks the data up by XML entities
|
||||
* @param XML_HTMLSax3
|
||||
* @param string element data
|
||||
* @access protected
|
||||
*/
|
||||
function breakData(&$parser, $data) {
|
||||
$data = preg_split('/(&.+?;)/',$data,-1,PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
|
||||
foreach ( $data as $chunk ) {
|
||||
$this->orig_obj->{$this->orig_method}($this, $chunk);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Strips the HTML comment markers or CDATA sections from an escape.
|
||||
* If XML_OPTIONS_FULL_ESCAPES is on, this decorator is not used.<br />
|
||||
* @package XML_HTMLSax3
|
||||
* @access protected
|
||||
*/
|
||||
class XML_HTMLSax3_Escape_Stripper {
|
||||
/**
|
||||
* Original handler object
|
||||
* @var object
|
||||
* @access private
|
||||
*/
|
||||
var $orig_obj;
|
||||
/**
|
||||
* Original handler method
|
||||
* @var string
|
||||
* @access private
|
||||
*/
|
||||
var $orig_method;
|
||||
/**
|
||||
* Constructs XML_HTMLSax3_Entities_Unparsed
|
||||
* @param object handler object being decorated
|
||||
* @param string original handler method
|
||||
* @access protected
|
||||
*/
|
||||
function XML_HTMLSax3_Escape_Stripper(&$orig_obj, $orig_method) {
|
||||
$this->orig_obj =& $orig_obj;
|
||||
$this->orig_method = $orig_method;
|
||||
}
|
||||
/**
|
||||
* Breaks the data up by XML entities
|
||||
* @param XML_HTMLSax3
|
||||
* @param string element data
|
||||
* @access protected
|
||||
*/
|
||||
function strip(&$parser, $data) {
|
||||
// Check for HTML comments first
|
||||
if ( substr($data,0,2) == '--' ) {
|
||||
$patterns = array(
|
||||
'/^\-\-/', // Opening comment: --
|
||||
'/\-\-$/', // Closing comment: --
|
||||
);
|
||||
$data = preg_replace($patterns,'',$data);
|
||||
|
||||
// Check for XML CDATA sections (note: don't do both!)
|
||||
} else if ( substr($data,0,1) == '[' ) {
|
||||
$patterns = array(
|
||||
'/^\[.*CDATA.*\[/s', // Opening CDATA
|
||||
'/\].*\]$/s', // Closing CDATA
|
||||
);
|
||||
$data = preg_replace($patterns,'',$data);
|
||||
}
|
||||
|
||||
$this->orig_obj->{$this->orig_method}($this, $data);
|
||||
}
|
||||
}
|
||||
?>
|
287
engine/lib/XML/HTMLSax3/States.php
Normal file
287
engine/lib/XML/HTMLSax3/States.php
Normal file
@ -0,0 +1,287 @@
|
||||
<?php
|
||||
/* vim: set expandtab tabstop=4 shiftwidth=4: */
|
||||
//
|
||||
// +----------------------------------------------------------------------+
|
||||
// | PHP Version 4 |
|
||||
// +----------------------------------------------------------------------+
|
||||
// | Copyright (c) 1997-2002 The PHP Group |
|
||||
// +----------------------------------------------------------------------+
|
||||
// | This source file is subject toversion 3.0 of the PHP license, |
|
||||
// | that is bundled with this package in the file LICENSE, and is |
|
||||
// | available at through the world-wide-web at |
|
||||
// | http://www.php.net/license/3_0.txt. |
|
||||
// | If you did not receive a copy of the PHP license and are unable to |
|
||||
// | obtain it through the world-wide-web, please send a note to |
|
||||
// | license@php.net so we can mail you a copy immediately. |
|
||||
// +----------------------------------------------------------------------+
|
||||
// | Authors: Alexander Zhukov <alex@veresk.ru> Original port from Python |
|
||||
// | Authors: Harry Fuecks <hfuecks@phppatterns.com> Port to PEAR + more |
|
||||
// | Authors: Many @ Sitepointforums Advanced PHP Forums |
|
||||
// +----------------------------------------------------------------------+
|
||||
//
|
||||
// $Id: States.php,v 1.3 2007/10/29 21:41:35 hfuecks Exp $
|
||||
//
|
||||
/**
|
||||
* Parsing states.
|
||||
* @package XML_HTMLSax3
|
||||
* @version $Id: States.php,v 1.3 2007/10/29 21:41:35 hfuecks Exp $
|
||||
*/
|
||||
/**
|
||||
* Define parser states
|
||||
*/
|
||||
define('XML_HTMLSAX3_STATE_STOP', 0);
|
||||
define('XML_HTMLSAX3_STATE_START', 1);
|
||||
define('XML_HTMLSAX3_STATE_TAG', 2);
|
||||
define('XML_HTMLSAX3_STATE_OPENING_TAG', 3);
|
||||
define('XML_HTMLSAX3_STATE_CLOSING_TAG', 4);
|
||||
define('XML_HTMLSAX3_STATE_ESCAPE', 6);
|
||||
define('XML_HTMLSAX3_STATE_JASP', 7);
|
||||
define('XML_HTMLSAX3_STATE_PI', 8);
|
||||
/**
|
||||
* StartingState searches for the start of any XML tag
|
||||
* @package XML_HTMLSax3
|
||||
* @access protected
|
||||
*/
|
||||
class XML_HTMLSax3_StartingState {
|
||||
/**
|
||||
* @param XML_HTMLSax3_StateParser subclass
|
||||
* @return constant XML_HTMLSAX3_STATE_TAG
|
||||
* @access protected
|
||||
*/
|
||||
function parse(&$context) {
|
||||
$data = $context->scanUntilString('<');
|
||||
if ($data != '') {
|
||||
$context->handler_object_data->
|
||||
{$context->handler_method_data}($context->htmlsax, $data);
|
||||
}
|
||||
$context->IgnoreCharacter();
|
||||
return XML_HTMLSAX3_STATE_TAG;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Decides which state to move one from after StartingState
|
||||
* @package XML_HTMLSax3
|
||||
* @access protected
|
||||
*/
|
||||
class XML_HTMLSax3_TagState {
|
||||
/**
|
||||
* @param XML_HTMLSax3_StateParser subclass
|
||||
* @return constant the next state to move into
|
||||
* @access protected
|
||||
*/
|
||||
function parse(&$context) {
|
||||
switch($context->ScanCharacter()) {
|
||||
case '/':
|
||||
return XML_HTMLSAX3_STATE_CLOSING_TAG;
|
||||
break;
|
||||
case '?':
|
||||
return XML_HTMLSAX3_STATE_PI;
|
||||
break;
|
||||
case '%':
|
||||
return XML_HTMLSAX3_STATE_JASP;
|
||||
break;
|
||||
case '!':
|
||||
return XML_HTMLSAX3_STATE_ESCAPE;
|
||||
break;
|
||||
default:
|
||||
$context->unscanCharacter();
|
||||
return XML_HTMLSAX3_STATE_OPENING_TAG;
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Dealing with closing XML tags
|
||||
* @package XML_HTMLSax3
|
||||
* @access protected
|
||||
*/
|
||||
class XML_HTMLSax3_ClosingTagState {
|
||||
/**
|
||||
* @param XML_HTMLSax3_StateParser subclass
|
||||
* @return constant XML_HTMLSAX3_STATE_START
|
||||
* @access protected
|
||||
*/
|
||||
function parse(&$context) {
|
||||
$tag = $context->scanUntilCharacters('/>');
|
||||
if ($tag != '') {
|
||||
$char = $context->scanCharacter();
|
||||
if ($char == '/') {
|
||||
$char = $context->scanCharacter();
|
||||
if ($char != '>') {
|
||||
$context->unscanCharacter();
|
||||
}
|
||||
}
|
||||
$context->handler_object_element->
|
||||
{$context->handler_method_closing}($context->htmlsax, $tag, FALSE);
|
||||
}
|
||||
return XML_HTMLSAX3_STATE_START;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Dealing with opening XML tags
|
||||
* @package XML_HTMLSax3
|
||||
* @access protected
|
||||
*/
|
||||
class XML_HTMLSax3_OpeningTagState {
|
||||
/**
|
||||
* Handles attributes
|
||||
* @param string attribute name
|
||||
* @param string attribute value
|
||||
* @return void
|
||||
* @access protected
|
||||
* @see XML_HTMLSax3_AttributeStartState
|
||||
*/
|
||||
function parseAttributes(&$context) {
|
||||
$Attributes = array();
|
||||
|
||||
$context->ignoreWhitespace();
|
||||
$attributename = $context->scanUntilCharacters("=/> \n\r\t");
|
||||
while ($attributename != '') {
|
||||
$attributevalue = NULL;
|
||||
$context->ignoreWhitespace();
|
||||
$char = $context->scanCharacter();
|
||||
if ($char == '=') {
|
||||
$context->ignoreWhitespace();
|
||||
$char = $context->ScanCharacter();
|
||||
if ($char == '"') {
|
||||
$attributevalue= $context->scanUntilString('"');
|
||||
$context->IgnoreCharacter();
|
||||
} else if ($char == "'") {
|
||||
$attributevalue = $context->scanUntilString("'");
|
||||
$context->IgnoreCharacter();
|
||||
} else {
|
||||
$context->unscanCharacter();
|
||||
$attributevalue =
|
||||
$context->scanUntilCharacters("> \n\r\t");
|
||||
}
|
||||
} else if ($char !== NULL) {
|
||||
$attributevalue = NULL;
|
||||
$context->unscanCharacter();
|
||||
}
|
||||
$Attributes[$attributename] = $attributevalue;
|
||||
|
||||
$context->ignoreWhitespace();
|
||||
$attributename = $context->scanUntilCharacters("=/> \n\r\t");
|
||||
}
|
||||
return $Attributes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param XML_HTMLSax3_StateParser subclass
|
||||
* @return constant XML_HTMLSAX3_STATE_START
|
||||
* @access protected
|
||||
*/
|
||||
function parse(&$context) {
|
||||
$tag = $context->scanUntilCharacters("/> \n\r\t");
|
||||
if ($tag != '') {
|
||||
$this->attrs = array();
|
||||
$Attributes = $this->parseAttributes($context);
|
||||
$char = $context->scanCharacter();
|
||||
if ($char == '/') {
|
||||
$char = $context->scanCharacter();
|
||||
if ($char != '>') {
|
||||
$context->unscanCharacter();
|
||||
}
|
||||
$context->handler_object_element->
|
||||
{$context->handler_method_opening}($context->htmlsax, $tag,
|
||||
$Attributes, TRUE);
|
||||
$context->handler_object_element->
|
||||
{$context->handler_method_closing}($context->htmlsax, $tag,
|
||||
TRUE);
|
||||
} else {
|
||||
$context->handler_object_element->
|
||||
{$context->handler_method_opening}($context->htmlsax, $tag,
|
||||
$Attributes, FALSE);
|
||||
}
|
||||
}
|
||||
return XML_HTMLSAX3_STATE_START;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Deals with XML escapes handling comments and CDATA correctly
|
||||
* @package XML_HTMLSax3
|
||||
* @access protected
|
||||
*/
|
||||
class XML_HTMLSax3_EscapeState {
|
||||
/**
|
||||
* @param XML_HTMLSax3_StateParser subclass
|
||||
* @return constant XML_HTMLSAX3_STATE_START
|
||||
* @access protected
|
||||
*/
|
||||
function parse(&$context) {
|
||||
$char = $context->ScanCharacter();
|
||||
if ($char == '-') {
|
||||
$char = $context->ScanCharacter();
|
||||
if ($char == '-') {
|
||||
$context->unscanCharacter();
|
||||
$context->unscanCharacter();
|
||||
$text = $context->scanUntilString('-->');
|
||||
$text .= $context->scanCharacter();
|
||||
$text .= $context->scanCharacter();
|
||||
} else {
|
||||
$context->unscanCharacter();
|
||||
$text = $context->scanUntilString('>');
|
||||
}
|
||||
} else if ( $char == '[') {
|
||||
$context->unscanCharacter();
|
||||
$text = $context->scanUntilString(']>');
|
||||
$text.= $context->scanCharacter();
|
||||
} else {
|
||||
$context->unscanCharacter();
|
||||
$text = $context->scanUntilString('>');
|
||||
}
|
||||
|
||||
$context->IgnoreCharacter();
|
||||
if ($text != '') {
|
||||
$context->handler_object_escape->
|
||||
{$context->handler_method_escape}($context->htmlsax, $text);
|
||||
}
|
||||
return XML_HTMLSAX3_STATE_START;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Deals with JASP/ASP markup
|
||||
* @package XML_HTMLSax3
|
||||
* @access protected
|
||||
*/
|
||||
class XML_HTMLSax3_JaspState {
|
||||
/**
|
||||
* @param XML_HTMLSax3_StateParser subclass
|
||||
* @return constant XML_HTMLSAX3_STATE_START
|
||||
* @access protected
|
||||
*/
|
||||
function parse(&$context) {
|
||||
$text = $context->scanUntilString('%>');
|
||||
if ($text != '') {
|
||||
$context->handler_object_jasp->
|
||||
{$context->handler_method_jasp}($context->htmlsax, $text);
|
||||
}
|
||||
$context->IgnoreCharacter();
|
||||
$context->IgnoreCharacter();
|
||||
return XML_HTMLSAX3_STATE_START;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Deals with XML processing instructions
|
||||
* @package XML_HTMLSax3
|
||||
* @access protected
|
||||
*/
|
||||
class XML_HTMLSax3_PiState {
|
||||
/**
|
||||
* @param XML_HTMLSax3_StateParser subclass
|
||||
* @return constant XML_HTMLSAX3_STATE_START
|
||||
* @access protected
|
||||
*/
|
||||
function parse(&$context) {
|
||||
$target = $context->scanUntilCharacters(" \n\r\t");
|
||||
$data = $context->scanUntilString('?>');
|
||||
if ($data != '') {
|
||||
$context->handler_object_pi->
|
||||
{$context->handler_method_pi}($context->htmlsax, $target, $data);
|
||||
}
|
||||
$context->IgnoreCharacter();
|
||||
$context->IgnoreCharacter();
|
||||
return XML_HTMLSAX3_STATE_START;
|
||||
}
|
||||
}
|
||||
?>
|
140
engine/lib/core.function.php
Executable file
140
engine/lib/core.function.php
Executable file
@ -0,0 +1,140 @@
|
||||
<?php
|
||||
/*文件扩展名说明
|
||||
*7173 gif *255216 jpg *13780 png *6677 bmp *239187 txt,aspx,asp,sql *208207 xls.doc.ppt *6063 xml *6033 htm,html *4742 js
|
||||
*8075 xlsx,zip,pptx,mmap,zip *8297 rar *01 accdb,mdb *7790 exe,dll *5666 psd *255254 rdp *10056 bt种子 *64101 bat
|
||||
*/
|
||||
function getFileType( $file ){
|
||||
$fp = fopen($file, "rb");
|
||||
$bin = fread($fp, 2); //只读2字节
|
||||
fclose($fp);
|
||||
$str_info = @unpack("C2chars", $bin);
|
||||
$type_code = intval($str_info['chars1'].$str_info['chars2']);
|
||||
$file_type = '';
|
||||
switch ($type_code) {
|
||||
case 239187:
|
||||
$file_type = 'txt';
|
||||
break;
|
||||
case 7784:
|
||||
$file_type = 'midi';
|
||||
break;
|
||||
case 8075:
|
||||
$file_type = 'zip';
|
||||
break;
|
||||
case 8297:
|
||||
$file_type = 'rar';
|
||||
break;
|
||||
case 255216:
|
||||
$file_type = 'jpg';
|
||||
break;
|
||||
case 7173:
|
||||
$file_type = 'gif';
|
||||
break;
|
||||
case 6677:
|
||||
$file_type = 'bmp';
|
||||
break;
|
||||
case 13780:
|
||||
$file_type = 'png';
|
||||
break;
|
||||
default:
|
||||
$file_type = 'unknown';
|
||||
break;
|
||||
}
|
||||
return $file_type;
|
||||
}
|
||||
function isAjax(){
|
||||
if( isset( $GLOBALS['__isAjax'] ) ){
|
||||
return $GLOBALS['__isAjax'];
|
||||
}
|
||||
$headers = apache_request_headers();
|
||||
$GLOBALS['__isAjax'] = (isset( $headers['X-Requested-With'] ) && ( $headers['X-Requested-With'] == 'XMLHttpRequest' )) || (isset( $headers['x-requested-with'] ) && ($headers['x-requested-with'] == 'XMLHttpRequest' ));
|
||||
return $GLOBALS['__isAjax'];
|
||||
}
|
||||
function c( $name ){
|
||||
if( !isset( $GLOBALS['__config'] ) ){
|
||||
$__config = NULL;
|
||||
include( ENGINE.'config/core.config.php' );
|
||||
include( ROOT.'config/app.config.php' );
|
||||
$GLOBALS['__config'] = $__config;
|
||||
}
|
||||
if( isset( $GLOBALS['__config'][$name] ) ){
|
||||
return $GLOBALS['__config'][$name];
|
||||
}
|
||||
else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
function db(){
|
||||
if( !$GLOBALS['__db'] ){
|
||||
$GLOBALS['__db'] = new Db();
|
||||
}
|
||||
return $GLOBALS['__db'];
|
||||
}
|
||||
function get_ip() {
|
||||
if (isSet($_SERVER)) {
|
||||
if (isSet($_SERVER["HTTP_X_FORWARDED_FOR"])) {
|
||||
$realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
|
||||
} elseif (isSet($_SERVER["HTTP_CLIENT_IP"])) {
|
||||
$realip = $_SERVER["HTTP_CLIENT_IP"];
|
||||
} else {
|
||||
$realip = $_SERVER["REMOTE_ADDR"];
|
||||
}
|
||||
} else {
|
||||
if ( getenv( 'HTTP_X_FORWARDED_FOR' ) ) {
|
||||
$realip = getenv( 'HTTP_X_FORWARDED_FOR' );
|
||||
} elseif ( getenv( 'HTTP_CLIENT_IP' ) ) {
|
||||
$realip = getenv( 'HTTP_CLIENT_IP' );
|
||||
} else {
|
||||
$realip = getenv( 'REMOTE_ADDR' );
|
||||
}
|
||||
}
|
||||
return current( explode(',' , $realip ) );
|
||||
}
|
||||
function v( $str ){
|
||||
return getDataFromArray( $str , $_REQUEST );
|
||||
}
|
||||
function p( $str ){
|
||||
return getDataFromArray( $str , $_POST );
|
||||
}
|
||||
function getDataFromArray( $array , $data ){
|
||||
if( is_array( $array ) ){
|
||||
$return = array();
|
||||
foreach( $array as $v ){
|
||||
if( isset( $data[$v] ) && $data[$v] !== '' ){
|
||||
$return[trim($v)] = $data[$v];
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
return isset( $data[$array] )?$data[$array]:false;
|
||||
}
|
||||
function render( $data , $__showPage = NULL , $layout = NULL , $layoutTpl = true ){
|
||||
$__showPage = strtolower( $__showPage);
|
||||
if( $layout == NULL ){
|
||||
$layout = 'default';
|
||||
}
|
||||
if( isAjax() ){
|
||||
$requiteFile = ROOT.'themes/'.$layout.'/ajax/'.$__showPage.'.tpl.html';
|
||||
}else{
|
||||
$requiteFile = ROOT.'themes/'.$layout.'/'.($layoutTpl?'layout':$__showPage).'.tpl.html';
|
||||
}
|
||||
if( !is_file( $requiteFile ) ){
|
||||
die('can\'t load themes '.$__showPage.' files ');
|
||||
}
|
||||
@extract( $data );
|
||||
require( $requiteFile );
|
||||
}
|
||||
if(!function_exists('apache_request_headers')) {
|
||||
function apache_request_headers(){
|
||||
foreach($_SERVER as $key=>$value){
|
||||
if (substr($key,0,5)=="HTTP_") {
|
||||
$key=str_replace(" ","-",ucwords(strtolower(str_replace("_"," ",substr($key,5)))));
|
||||
$out[$key]=$value;
|
||||
}
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
}
|
||||
function safeUrlString( $str ){
|
||||
$str = urldecode($str);
|
||||
return str_replace( array( '.' , '/' ) , array() , $str );
|
||||
}
|
Reference in New Issue
Block a user