<?PHP
//
// File: class.arbplate.php
// Ver: 0.8a
// Desc: Main class file for arbplate
// Auth: Paul Arbogast
// *******************
// Latest version is available at http://arbplate.sourceforge.net
// Send Questions or comments to arbo@att.net
//
/* Copyright (C) 2001 Paul Arbogast
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
// to do:
//
//
// {if] tagset ? dunno if this is needed
// make arbdb - db abstraction routines for use by arbplate - mysql done
// make arbthenticate - user tracking/authentication
//
$ARB_CONFIG = parse_ini_file( "arbplate.ini" ); // read config file
if ( ! is_array( $ARB_CONFIG ) ) {
trigger_error( "[Could Not Read INI file!]" , E_USER_ERROR );
}
include( "arberr.php" ); // include error handling routines
if ( ! defined( "INCLUDED_ARBDB" ) ) {
include( "class.arbdb.php" ) ; // include database class
}
$ADB = new arbdb();
// main class
class arbplate {
var $VERSION = "0.8a";
var $TEMP_NAME = ""; // Name of root template being parsed
var $ROOT_DIR = ""; // Contains root directory to Templates
var $SKIN = ""; // Contains directory to current Theme
// Array of template variables
var $VAR_STATIC = array ();
// Array of link values
var $VAR_LINKS = array ( array () );
// Array of tags & assosicated functions
var $TAG_MATRIX = array ();
// -------- Methods ----------
// --------------------
// arbplate: The main class constructor
// useage: $arb->arbplate( );
//
// You can send TemplatePath, changing the default path to the template files
// and/or you can send Theme_Skin to define an other than default theme.
//
// By default your templates will be in templatepath/themeskin. So you can
// set up a multi-theme system because it will simply be in a different directory.
//
function arbplate ( $TemplatePath = "" , $Theme_Skin = "" )
{
global $ARB_CONFIG;
if ( ! empty( $Theme_Skin ) )
{
$this -> SKIN = $Theme_Skin;
}
else
{
$this -> SKIN = $ARB_CONFIG['DEF_SKIN'];
}
if ( !empty( $TemplatePath ) )
{
$this -> set_base( $TemplatePath );
}
else
{
$this -> set_base( $ARB_CONFIG['DEF_ROOT'] );
}
$this -> def_tags ( array ( "func" => "replace_functions" ,
"inc" => "replace_includes" ,
"var" => "replace_variables" ,
"rep" => "replace_repeats" ,
"link" => "replace_link" ,
"query" => "replace_query" ));
// load up variables and links from database
$this -> load_to_static();
$this -> load_to_links();
return;
}
// --------------------
// set_base: Sets root directory for templates
// useage: used by arbplate constructor
//
function set_base ( $Root_Dir )
{
if ( substr( $Root_Dir , -1 ) != 47 )
{
$Root_Dir = $Root_Dir . chr(47);
}
$Root_Dir = $Root_Dir . $this -> SKIN . chr(47) ;
if ( is_dir( $Root_Dir ) )
{
$this -> ROOT_DIR = $Root_Dir;
}
else
{
$this -> ROOT_DIR = "";
trigger_error ( "Specified ROOT directory incorrect: [$Root_Dir]" , E_USER_NOTICE ) ;
}
}
// --------------------
// def_tags: Set up Tag to Function matrix
// useage: used by arbplate constructor
//
function def_tags ( $VarList )
{
while ( list ( $VarName , $VarVal ) = each ( $VarList ) )
{
$this -> TAG_MATRIX[ "$VarName" ] = $VarVal;
}
return;
}
// --------------------
// def_static:
//
function def_static ( $VarList )
{
while ( list ( $VarName , $VarVal ) = each ( $VarList ) )
{
$this -> VAR_STATIC[ "$VarName" ] = $VarVal;
}
return;
}
// --------------------
// load_to_static: Loads all variables from database to memory
// for quicker access.
//
//
function load_to_static ( )
{
global $ADB;
$ADB -> arbdb_query( "SELECT * FROM varis" );
while ( $row = $ADB -> arbdb_next() )
{
$this -> def_static( array( $row["var_name"] => $row["var_val"] ) );
}
}
// --------------------
// def_links:
//
function def_links ( $VarList )
{
while ( list ( $VarName ) = each ( $VarList ) )
{
while ( list ( $Key , $Var2 ) = each ( $VarList["$VarName"] ) )
{
$this -> VAR_LINKS[ $VarName ][ $Key ] = $Var2 ;
}
}
return;
}
// --------------------
// load_to_links: Loads all link info from database to memory for
// quicker access.
//
function load_to_links ( )
{
global $ADB;
$ADB -> arbdb_query( "SELECT * FROM links" );
while ( $row = $ADB -> arbdb_next() )
{
$this -> def_links( array( $row["l_name"] => array ( $row["l_desc"] , $row["l_link"] ) ) );
}
}
// --------------------
// parse: Read in template, replace everything, print result
// useage: $arb->parse( "templatename.arb" );
//
// Templates can be named any legal file extension.
//
function parse ( $TemplateName )
{
$filename = $this -> ROOT_DIR . $TemplateName ;
$contents = fread( $fp = fopen( $filename , 'r' ), filesize( $filename ) );
fclose($fp);
$this -> TEMP_NAME = $TemplateName;
// replace all tags
$contents = $this -> rep_func ( $contents );
print $contents;
}
// --------------------
// rep_func: takes input and replaces all tagsets of type $type
//
function rep_func ( $line )
{
$nv = 0;
$line = " " . $line . " ";
while ( preg_match( "/^(.*)\{(inc|var|rep|func|link|query)\}(.+)$/sU", $line, $arr))
{
$blah[$nv] = array ( $arr[1], " ", $arr[2], $arr[3] );
$line = $arr[3];
$repnum = 0;
while ( preg_match( "/^(.*)\{([\/]*)(inc|var|rep|func|link|query)\}(.+)$/sU", $line, $arrsub))
{
$nv++;
$blah[$nv] = array ( $arrsub[1], $arrsub[2], $arrsub[3], $arrsub[4]);
if ($arrsub[2] =="")
{
$line = $arrsub[4];
}
else
{
if ($blah[$nv][2] == $blah[$nv-1][2])
{
$repnum++;
$thefunc = $this->TAG_MATRIX[ $blah[$nv][2] ];
$repl = $this->$thefunc( $blah[$nv][0] );
$line = $blah[$nv-1][0] . $repl . $blah[$nv][3];
if ($nv>1)
{
$blah[$nv-2][3] = $tnts;
}
$nv--;$nv--;
if ($nv<0)
{
$nv = 0;
if (!(substr($line,0,1)==" "))
$line = " " . $line;
break;
}
}
}
}
}
return $line;
}
// --------------------
// replace_count: used by replace_repeats to replace @@@@ tag with repetition number
//
function replace_count ( $line, $count )
{
$line = preg_replace( "|\@{4}|sU" , "$count" , $line ) ;
// add another tok to replace count+1?
return $line;
}
// --------------------
// replace_repeats: {rep}X:string to repeat{/rep}
//
// returns X copies of 'string to repeat'.
// you can use @@@@ in string, which will be replaces
// with the iteration number of that loop.
//
function replace_repeats ( $line )
{
$reparr = preg_split ("|:|sU", $line, 2 );
$rtn = "";
$times = $reparr[0];
settype( $times , "integer" );
for ( $x = 0 ; $x < $times ; $x++ )
{
$rtn = $rtn . $this -> replace_count( $reparr[1] , $x ); // $reparr[2];
}
return $rtn;
}
// --------------------
// replace_includes: {inc}filename.ext{/inc}
//
// Returns the contents of filename.ext, then will parse through that
// template as well.
//
function replace_includes ( $incfile )
{
$filename = $this -> ROOT_DIR . $incfile ;
if ( ! is_file( $filename ) )
{
trigger_error( "Not a good inc file: $filename" , E_USER_ERROR );
}
else
{
$rtn = fread( $fp = fopen( $filename , 'r' ), filesize( $filename ) );
fclose( $fp );
}
return $rtn;
}
// --------------------
// replace_functions: replaces all {func}...{/func} tagsets
//
// NOTE: don't let unchecked user input go here!!!!
//
function replace_functions ( $funcname )
{
//echo "[".$funcname."]<br/>";
ob_start();
eval( $funcname );
$rtn = ob_get_contents();
ob_end_clean();
return $rtn;
}
// --------------------
// replace_variables: {var}varname{/var}
//
// Returns value of variable. Not only can you use the ones
// defined in the varis table of your database, but you can
// class variables (like ROOT_DIR), and PHP system variables.
//
function replace_variables ( $varname )
{
$rtn = "";
// need a way to prevent system vars (aka vars that aren't valid indexes
// for below line, from being checked below.. it causes a warning that is
// logged, and that could make for a big log file.
// doing an each(VAR_STATIC) would slow things down.. find another way.
$rtn = $this -> VAR_STATIC[ $varname ];
if ($rtn == "")
{
// add ability to return system variables (php system that is)
$varname = "print \$this -> " . $varname . ";" ;
$rtn = $this -> replace_functions( $varname );
}
return $rtn;
}
// --------------------
// replace_link: {link}A:name{/link}
//
// Returns actual link (i.e. http://some.link.here) if A is l.
// Returns description of link if A is d.
//
// example:
//
// <a href="{link}l:email{/link}">{link}d:email{/link}</a>
//
// this allows you to change links and their descriptions
// from one spot (database) rather than searching all your
// template files.
//
function replace_link ( $linkname )
{
$reparr = preg_split ("|:|sU", $linkname, 2 );
if ( $reparr[0] == "l" )
{
$rtn = $this -> VAR_LINKS[ $reparr[ 1 ] ][1];
}
if ( $reparr[0] == "d" )
{
$rtn = $this -> VAR_LINKS[ $reparr[ 1 ] ][0];
}
return $rtn;
}
// --------------------
// replace_query: {query}qstring:template{/query}
//
// run query with qstring, fill in returned row values into template
// (i.e. %1 is first field, $2 second, etc..)
//
// example:
//
// <table>
// {query}select username,email from users:<tr><td>%1</td><td>%2</td></tr>{/query}
// </table>
//
// this outputs a table of users names and email addresses
//
function replace_query ( $query )
{
global $ADB;
$rtn = "";
$reparr = preg_split ("|:|sU", $query, 2 );
$ADB -> arbdb_query( $reparr[0] );
while ( $row = $ADB -> arbdb_next( "n" ) )
{
$xs = $reparr[1];
for ( $x = 0; $x < count( $row ); $x++ )
{
$xs = preg_replace( "|\%".($x + 1)."|sU" , $row[ $x ] , $xs ) ;
}
$rtn = $rtn . $xs;
}
return $rtn;
}
} // end of arbplate class definition
?> |