| 
<?php#############################################################
 #
 # HTML X LITE - generate HTML (and XML) code programatically
 #
 # Copyright © Bánó Gábor - 2014
 # Email: [email protected]
 # Version 4.3
 #
 # All rights reserved. No part of this publication may be
 # reproduced, stored in a retrieval system, or transmitted
 # in any form or by any means without the prior written
 # permission of the copyright owner and must contain the
 # avove copyright notice.
 #
 #############################################################
 define ("DEVELOP_MODE",true);
 define ("DOCTYPE","<!DOCTYPE html>");
 class html {
 static $STACK = array();
 static $JSMSG = NULL;
 static $ACTIVE_ELEMENTS = array("button","checkbox","file","hidden","image","password","radio","reset","submit","text","date","number","range","slider");
 static $NOTCLOSABLE = array("img","input","br","hr","param","meta","link","base","frame","embed","area");
 # Close all opened tags
 function finish()  {self::closetag(-1);if (self::$JSMSG) self::script(sprintf("txt=alert('%s');",self::$JSMSG));}
 # Onerow
 function srow($ONEPARAM = NULL) {
 if (!$ONEPARAM) return;
 $PARAMS = explode("|",$ONEPARAM);
 return(self::tag($PARAMS));
 }
 #--------------- HTML row generator ----------------
 function tag()  {
 $RET = $ARGS = $TXT = NULL;
 $PARAMS = func_get_args();
 if (is_array($PARAMS[0])) $PARAMS = $PARAMS[0];
 if (!$PARAMS) return; # No params, end
 else if (in_array($PARAMS[0],self::$ACTIVE_ELEMENTS)) {$PARAMS[] = 'type='.$PARAMS[0];$PARAMS[0] = 'input';} # Check if tag is an active element
 $CLBS = in_array($PARAMS[0],self::$NOTCLOSABLE) ? " /" : NULL; # Check if tag is not closable
 # Prepare tag params
 for ($I = 1 ; $I < count($PARAMS) ; $I++) {
 if (!$PARAMS[$I]) continue;
 $ONEATTR = @explode("=",$PARAMS[$I],2);
 if ($ONEATTR['0'] == "txt") $TXT = sprintf("%s</%s>",$ONEATTR['1'],$PARAMS[0]);
 else if ($ONEATTR['0'] == "noclose") $CLBS = " /";
 else if ($ONEATTR['0'] == "ret") $RET = true;
 else $ARGS .= sprintf(' %s="%s"',$ONEATTR[0],$ONEATTR[1]);
 }
 # Generate front spaces in develop mode and EOL
 $FSS = ((DEVELOP_MODE == true) && !$RET) ? str_repeat(" ",count(self::$STACK)) : NULL;
 $EOL = ((DEVELOP_MODE == true) && !$RET) ? "\n" : NULL;
 $HTML = sprintf("%s<%s%s%s>%s%s",$FSS,$PARAMS[0],$ARGS,$CLBS,$TXT,$EOL); # Assembly generated HTML row
 # Register current tag into stack if closable and if txt not present
 if (!$CLBS && !$TXT) self::$STACK[count(self::$STACK)] = $PARAMS[0];
 # Display or return generated HTML row
 if (!$RET) echo $HTML; else return $HTML;
 }
 #------------------ Tag closer --------------------
 function closetag($NUM = 1,$RET = false) {
 $HTML = NULL;
 $EOL = ((DEVELOP_MODE == true) && !$RET) ? "\n" : NULL;
 $INDEX = count(self::$STACK);
 while ($NUM-- && $INDEX--) {
 $FSS = ((DEVELOP_MODE == true) && !$RET) ? str_repeat(" ",$INDEX) : NULL;
 if (self::$STACK[$INDEX] != "stpt") $HTML .= sprintf("%s</%s>%s",$FSS,self::$STACK[$INDEX],$EOL);
 unset (self::$STACK[$INDEX]);
 }
 if (!$RET) echo $HTML; else return $HTML;
 }
 #------------------- Start block ------------------------
 function start_block() {self::$STACK[count(self::$STACK)] = "stpt";}
 #------------------ End block --------------------------
 function end_block() {
 $STPT = array_keys(self::$STACK,"stpt");
 self::closetag(count(self::$STACK)-$STPT[count($STPT)-1]);
 }
 #------------------ Display header --------------------
 function display_header() {self::set_header("display");}
 #------------------ Header preset ---------------------
 function set_header() {
 $ARGS = func_get_args();
 static $HEADER =  NULL;
 foreach ($ARGS as $ONE) {
 $EXP = explode("=",$ONE,2);
 if ( (defined("DEVELOP") && (DEVELOP == true) ) && ($EXP['0'] != "display") ) { $HEADER .= "  ";$EOL = "\n"; } else $EOL = NULL;
 if (!$EXP['0']) return;
 else if ($EXP['0'] == "charset") $HEADER .= self::meta("http-equiv=Content-Type","content=text/html; charset=".$EXP['1'],"ret").$EOL;
 else if ($EXP['0'] == "description") $HEADER .= self::meta("name=Description","content=".$EXP['1'],"ret").$EOL;
 else if ($EXP['0'] == "keywords") $HEADER .= self::meta("name=keywords","content=".$EXP['1'],"ret").$EOL;
 else if ($EXP['0'] == "refresh") $HEADER .= self::meta("http-equiv=refresh","content=".$EXP['1'],"ret").$EOL;
 else if ($EXP['0'] == "language") $HEADER .= self::meta("http-equiv=language","content=".$EXP['1'],"ret").$EOL;
 else if ($EXP['0'] == "nocache") $HEADER .= self::meta("http-equiv=cache-control","content=no-cache","ret").$EOL;
 else if ($EXP['0'] == "title") $HEADER .= self::title("txt=". $EXP['1'],"ret").$EOL;
 else if ($EXP['0'] == "css") $HEADER .= self::link("rel=stylesheet","type=text/css","href=".$EXP['1'],"ret").$EOL;
 else if ($EXP['0'] == "script") $HEADER .= self::script("type=text/javascript","txt=".$EXP['1'],"ret").$EOL;
 else if ($EXP['0'] == "icon") $HEADER .= self::link("rel=shortcut icon","href=".$EXP['1'],"ret").$EOL;
 else if ($EXP['0'] == "link") $HEADER .= self::srow("link|".$EXP['1']."|ret").$EOL; # (ie.: link=name=content|href=2|param2=3)
 else if ($EXP['0'] == "meta") $HEADER .= self::srow("meta|".$EXP['1']."|ret").$EOL; # (ie.: meta=name=content|param=2|param2=3)
 else if ($EXP['0'] == "js") $HEADER .= self::script("type=text/javascript","src=".$EXP['1'],"txt=","ret").$EOL;
 else if ($EXP['0'] == "display") {print DOCTYPE."\n"; self::html();self::head(); print $HEADER;self::closetag();}
 else {$HEADER .= self::tag(array_merge(func_get_args(),array("ret"))).$EOL;break;}
 }
 }
 #---------------- Addional elements -------------------
 function write($TXT) {print (str_repeat(" ",count(self::$STACK)).$TXT."\n");}
 function remark($TXT) { if (DEVELOP_MODE == true) self::write("<!--".$TXT."-->"); }
 function message($TXT) { self::$JSMSG .= $TXT; }
 #--------------- Create any other tag -----------------
 static function __callStatic($name, $arguments) {return(self::tag(array_merge(array($name),$arguments)));}
 }
 ?>
 
 |