first commit

This commit is contained in:
2014-03-26 14:18:20 +08:00
commit 41681f1f18
31 changed files with 4496 additions and 0 deletions

38
engine/lib/Cache.class.php Executable file
View 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
View 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
View 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;
}
}

View 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
View 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
View 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
View 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
View 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 &amp;
$value = str_replace('&amp;', '&', $value);
$value = str_replace('&', '&amp;', $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("\"", "&quot;", $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 .= '&lt;' . $name . '&gt;';
}
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\/\!\?\%])/", '&lt;', $doc);
// Web documents shouldn't contains \x00 symbol
$doc = str_replace("\x00", '', $doc);
// Opera6 bug workaround
$doc = str_replace("\xC0\xBC", '&lt;', $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
View 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
View 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
View 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
View 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);
}
}
?>

View 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);
}
}
?>

View 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
View 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 );
}