Version: 1.0
Type: Function
Category: HTML
License: GNU Library Public License
Description: Set of functions to generate HTML Tags such as
Table, tr, html, body, etc through easy interface like
Start_Table, End_Table, Start_Td, End_Td. Main
advantage of this is, it can be EASILY EXPANDABLE to support any tag.
/** VPK * HTML Writer 1.0 * Author: S.Murali Krishnan <[email protected]> * Copyright (C) 2001-2002 S.Murali Krishnan * * Usage and Documentation for this file would be present in "htmlwriter.txt" * which would be come along with this file. * * Report any Bugs or queries regarding usage and code logic * to <[email protected]>, I will try my best to answer them. * * Though I cannot upload this file as tgz or zip. I'm providing the * documentation file as comment at the bottom of this file. * To EXTRACT The documentation , comment out the TEST CODE at the bottom, * and run this program using PHP so that documentation alone could be * extracted as output. */ <?php /* Html Tags Configurations */ $HtmlEndl = "<br/>" ; // HTML Newline Tag $endl = "n" ; // Your System's Newline character $Body = array( "start_tag" => "<body>", "end_tag" => "</body>", "background" => "", "bgcolor" => "#A8AAF7", "text" => "", "link" => "", "alink" => "", "vlink" => "", "style" => "", "lang" => "" ); $Center = array( "start_tag" => "<center>", "end_tag" => "</center>" ); $Img = array( "start_tag" => "<img>", "src" => "", "height" => "", "width" => "", "alt" => "image", "align" => "center", "border" => 0, "supress" => "false", "hspace" => "", "vspace" => "" ); $Hr = array( "start_tag" => "<hr>", "align" => "center", "width" => "100%", "size" => "3", "others" => "noshade" ); $A = array( "start_tag" => "<a>", "end_tag" => "</a>", "name" => "", "href" => "", "target" => "_self" ); $Table = array( "start_tag" => "<table>", "end_tag" => "</table>", "width" => "100%", "height" => "", "border" => $border, "bgcolor" => "#f1daba", "style" => "", "class" => "", "cellpadding" => "0", "cellspacing" => "0", "align" => "center", "valign" => "middle", "others" => "" ); $Tr = array( "start_tag" => "<tr>", "end_tag" => "</tr>", "width" => "", "height" => "", "bgcolor" => "#f1daba", "style" => "", "align" => "", "valign" => "", "others" => "", "border" => $border ); $Td = array( "start_tag" => "<td>", "end_tag" => "</td>", "width" => "", "height" => "", "bgcolor" => "#f1daba", "style" => "", "align" => "", "valign" => "", "colspan" => "", "others" => "" ); $Font = array( "start_tag" => "<font>", "end_tag" => "</font>", "style" => "", "weight" => "", "size" => "3pt", "border" => "", "color" => "darkred", "others" => "", "text" => "", "face" => "helvetica" ); $Link = array( "rel" => "stylesheet", "type" => "text/css", "src" => "" ); $Frame = array( "start_tag" => "<frame>", "end_tag" => "</frame>", "bordercolor" => "color", "frameborder" => "yes", "marginheight" => "5", "marginwidth" => "5", "name" => "framename", "scrolling" => "yes", "src" => "index.php", "others" => "noresize" ); $Frameset = array( "start_tag" => "<frameset>", "end_tag" => "</frameset>", "cols" => "", "rows" => "100%", "border" => "2", "bordercolor" => "", "frameborder" => "yes" ); $Layer = array( "start_tag" => "<layer>", "end_tag" => "</layer>", "id" => "layername", "left" => "", "top" => "", "pagex" => "", "page" => "", "src" => "file", "z-index" => "0", "above" => "", "below" => "", "width" => "", "height" => "", "clip" => "", "visibility" => "", "bgcolor" => "", "background" => "" ); /* End Html Tags Configurations */ /* Form related Tags Configuration */ $Form = array( "start_tag" => "<form>", "end_tag" => "</form> ", "name" => "some", "action" => "something.php", "method" => "post", "target" => "_self", "others" => "" ); // common for text, password, file $TxtBox = array( "start_tag" => "<input>", "type" => "text", "name" => "", "value" => "", "size" => 10, "maxlength" => "", "others" => "" ); // common for reset, submit, hidden, image, button, checkbox, radio. $Button = array( "start_tag" => "<input>", "type" => "submit", "name" => "compname", "value" => "object", "others" => "" ); $SelectBox = array( "start_tag" => "<select>", "name" => "", "end_tag" => "</select>", "height" => "1", "width" => "", "others" => "" ); $Soption = array( "start_tag" => "<option>", "end_tag" => "</option>", "value" => "", "text" => "" ); $TextArea = array( "start_tag" => "<textarea>", "end_tag" => "</textarea>", "name" => "", "wrap" => "hard", "cols" => "50", "rows" => "7", "value" => "" ); /* End Form Tags Configurations */ /** function to build the tag with its attributes * This function is called for every tag function to Build the tag. * It expects three arguments. * SrcArray : Array in which each key and value indicate the * attribute key and value of the tag. * Funcname : Callback function to call for each key value. * Tag_Var : reference string variable in which tag have to be built. */ function make_tag($SrcArray, $Funcname, $Tag_Var) { if (!is_array($SrcArray)) { print "Error: First Argument to make_tag is not an arrayn" ; return false ; } if (!function_exists($Funcname)) { print "Error: Function $Funcname doesn't existsn"; return false ; } $Tag_Var .= $SrcArray['start_tag'] ; unset($SrcArray['start_tag']); while (list($key, $value) = each($SrcArray)) { call_user_func($Funcname, $value, $key, &$Tag_Var); } return true ; } /** * Function to build single attribute and append to the tag. * it is internally called by make_tag for each attribute. */ function BuildAttribs($val, $key, &$Tag_Var) { if ($val != "") { if ($key == "end_tag") { return $Tag_Var ; } else if ($key == "others") { $Attribute = " $val" ; $Tag_Var = substr_replace($Tag_Var, $val, -1, 0); } else { $Attribute = " $key='$val'" ; $Tag_Var = substr_replace($Tag_Var, $Attribute, -1, 0) ; } } return $Tag_Var ; // Though its not necessary. } /* Tag Specific function */ /* Functions necessary to output most of the HTML Tags */ function Start_Html() { global $endl ; print "<html>" . $endl; return ; } function Start_Head() { global $endl ; print "<head>" . $endl ; return ; } function End_Head() { global $endl ; print "</head>" . $endl ; return ; } function Start_Script($lang = "javascript", $src) { global $endl ; print "<script language='$lang' " ; if ($src != "") { print "src='$src' ></script>" . $endl ; } else { print ">n<!--n" . $endl ; } return true ; } function End_Script() { global $endl ; print "// -->n</script>" . $endl ; return ; } function Start_Style($type = "text/css") { global $endl ; print "<style type='$type' >" . $endl ; return ; } function End_Style() { global $endl ; print "</style>" . $endl ; return ; } function Out_Link($link) { // possible attribs : rel, type, src // <LINK REL=STYLESHEET TYPE="text/css" SRC="styles/style1.htm"> if (!is_array($link)){ return false ; } $Link_Tag = "<link>"; make_tag($link, "BuildAttribs", &$Link_Tag); print $Link_Tag . $endl; print "</link>" . $endl; return ; } function Out_Base($basehref) { global $endl; print "<base href='$basehref'>". $endl ; return ; } function Out_title($titlestr = "title of this page") { global $endl; print "<title>$titlestr</title>" .$endl ; return ; } function End_Html() { global $endl ; print "</html>" . $endl ; } function Start_Body($LBody = array()) { global $endl, $Body ; $Body_Tag = ""; $LBody = array_merge($Body, $LBody); make_tag($LBody, "BuildAttribs", &$Body_Tag); print $Body_Tag . $endl ; return true ; } function End_Body() { global $endl, $Body ; print $Body["end_tag"] . $endl ; return ; } function Start_Table($LTable = array()) { global $endl, $Table ; $Table_Tag = "" ; $LTable = array_merge($Table, $LTable); make_tag($LTable, "BuildAttribs", &$Table_Tag); print $Table_Tag . $endl ; return true ; } function End_Table() { global $endl, $Table ; print $Table["end_tag"] . $endl ; return true ; } function Start_Tr($LTr = array()) { global $endl, $Tr ; $Tr_Tag = "" ; $LTr = array_merge($Tr, $LTr); make_tag($LTr, "BuildAttribs", &$Tr_Tag); print $Tr_Tag . $endl ; return true; } function End_Tr() { global $endl, $Tr ; print $Tr["end_tag"] . $endl ; return ; } function Start_Td($LTd = array()) { global $endl, $Td ; $Td_Tag = "" ; $LTd = array_merge($Td, $LTd); make_tag($LTd, "BuildAttribs", &$Td_Tag); print $Td_Tag . $endl ; } function End_Td() { global $endl, $Td ; print $Td["end_tag"] . $endl ; return ; } function Draw_Line($LHr = array()) { global $endl, $Hr ; $Line_Tag = ""; $LHr = array_merge($Hr, $LHr); make_tag($LHr, "BuildAttribs", &$Line_Tag); print $Line_Tag . $endl ; return ; } function Out_Tag($LTag = array()) { global $endl ; $Tag = "" ; if (!is_array($LTag)) { print $LTag . $endl ; return true ; } make_tag($LTag, "BuildAttribs", &$Tag); print $Tag . $endl ; } function Start_Form($LForm = array()) { global $Form, $endl ; $FormTag = ""; $LForm = array_merge($Form, $LForm) ; make_tag($LForm, "BuildAttribs", &$FormTag); print $FormTag . $endl ; } function End_Form() { global $Form, $endl ; print $Form["end_tag"] . $endl ; return ; } function Draw_Input($LText = array()) { global $TxtBox, $endl ; $TextTag = ""; $LText = array_merge($TxtBox, $LText); make_tag($LText, "BuildAttribs", &$TextTag); print $TextTag . $endl ; } function Start_Txtarea($LTxtArea = array()) { global $TextArea, $endl ; $TextAreaTag = "" ; $LTxtArea = array_merge($TextArea, $LTxtArea); make_tag($LTxtArea, "BuildAttribs", &$TextAreaTag); print $TextAreaTag . $endl ; return ; } function End_TxtArea() { global $TextArea, $endl ; print $TextArea["end_tag"] . $endl ; return ; } function Start_SelectBox($LSelect = array()) { global $SelectBox, $endl ; $SelectTag = "" ; $LSelect = array_merge($SelectBox, $LSelect); make_tag($LSelect, "BuildAttribs", &$SelectTag); print $SelectTag . $endl ; return ; } function Draw_Option($Opt = array(), $sel = 0) { global $Soption, $endl ; $Otext = ""; $Oetag = "" ; $OptTag = ""; $Loption = array_merge($Soption, $Opt); $Otext = $Loption['text'] ; $Loption['text'] ='' ; make_tag($Loption, "BuildAttribs", &$OptTag); $OptTag .= $Otext ; $OptTag .= $Soption['end_tag'] ; print $OptTag . $endl ; // printing <option value='xxx' ...>text</option> return ; } function Draw_SelOptions($KeyVal = array(), $SelVal = "") { while (list($key, $val) = each($KeyVal)) { $Opt = array( 'text' => $val, 'value' => $key ); if ($SelVal == $key) { $Opt['others'] = 'selected' ; } Draw_Option($Opt); } return true ; } function End_SelectBox() { global $SelectBox, $endl ; print $SelectBox["end_tag"] . $endl ; return ; } function Draw_Radio($Lradio = array()) { global $Button, $endl ; $RadioTag = ""; $LRadio = array_merge($Button, $LRadio); make_tag($LRadio, "BuildAttribs", &$RadioTag); print $RadioTag . $endl ; return ; } function Draw_Button($LButton = array()) { global $Button, $endl ; $ButtonTag = ""; $LButton = array_merge($Button, $LButton); make_tag($LButton, "BuildAttribs", &$ButtonTag); print $ButtonTag . $endl ; return ; } function Draw_Img($LImg = array()) { global $endl, $Img ; $Img_Tag = "" ; $LImg = array_merge($Img, $LImg); make_tag($LImg, "BuildAttribs", &$Img_Tag); print $Img_Tag . $endl ; return; } function Start_A($LA = array(), $Hargs = array()) { global $endl, $A ; $A_Tag = "" ; $LA = array_merge($A, $LA); // If any GET values to be encoded in Url. if (($cnt = count($Hargs))) { $LA['href'] .= "?" ; while (list($key, $value) = each($Hargs)) { $i++ ; $LA['href'] .= "$key=" . urlencode($value); if ($i < $cnt) $LA['href'] .= "&" ; } } make_tag($LA, "BuildAttribs", &$A_Tag); print $A_Tag . $endl ; return true ; } function End_A() { global $A, $endl ; print $A['end_tag'] . $endl ; return ; } /** make font is similar to Draw_Label function, but instead of * printing the font tag it will return the tag after making */ function Make_Font($LFont = "") { global $Font, $endl ; $FontTag = "" ; if (!is_array($LFont)) { print "<font>$LFont</font>" . $endl ; return ; } $LFont = array_merge($Font, $LFont); $LText = $LFont["text"] ; $LFont["text"] = "" ; make_tag($LFont, "BuildAttribs", &$FontTag); $FontTag .= $LText . $Font['end_tag'] ; return $FontTag ; } function Start_Frame($LFrame = "") { global $Frame, $endl ; $Frame_Tag = "" ; $LFrame = array_merge($Frame, $LFrame); make_tag($LFrame, "BuildAttribs", &$Frame_Tag); print $Frame_Tag . $endl ; return true ; } function End_Frame() { global $Frame, $endl ; print $Frame['end_tag'] . $endl ; return true ; } function Start_Layer($LLayer = "") { global $Layer, $endl ; $Layer_Tag = "" ; $LLayer = array_merge($Layer, $LLayer); make_tag($LLayer, "BuildAttribs", &$Layer_Tag); print $Layer_Tag . $endl ; return true ; } function End_Layer() { global $Layer, $endl ; print $Layer['end_tag'] . $endl ; return true ; } function Start_Frameset($LFrmset) { global $Frameset, $endl ; $Frameset_Tag = "" ; $LFrameset = array_merge($Frameset, $LFrameset); make_tag($LFrameset, "BuildAttribs", &$Frameset_Tag); print $Frameset_Tag . $endl ; return true ; } function End_Frameset() { global $Frameset, $endl ; print $Frameset['end_tag'] . $endl ; return true; } function Draw_Label($LLabel = "") { global $Font, $endl ; $LabelTag = "" ; if (!is_array($LLabel) ) { print "$LLabel" . $endl ; return ; } $LLabel = array_merge($Font, $LLabel); $LText = $LLabel["text"] ; $LLabel["text"] = "" ; make_tag($LLabel, "BuildAttribs", &$LabelTag); $LabelTag .= $LText . $Font['end_tag'] ; print $LabelTag . $endl ; } /** common function for <nolayer>, <noframe>, <noembed>, <noscript> * usage: Out_No("Your browser has no support for layers", "layer"); */ function NoTag($nomsg = "", $tagtype) { global $endl ; if ($tagtype == "") { return false ; } print "<no$tagtype>" . $endl ; print "$nomsg" . $endl ; print "</no$tagtype>" . $endl ; return true ; } function TextTag($Text = "", $tagtype="B") { global $endl ; print "<$tagtype>" . "$Text" . "</$tagtype>" . $endl ; return true ; } function MkSpace($count = 1) { $Space = "" ; for($i=0;$i<$count;$i++) $Space .= " " ; return $Space ; } /*TEST CODE */ start_html(); start_head(); out_title("list"); out_base("http://larry.bks/~escms"); end_head(); start_body(); $Href = array('href' => 'listview.php', 'text' => 'List View Link' ); $Label = array('size' =>'3pt', 'text' =>'Click Here to see ', 'color' => 'darkblue' ); Draw_Label($Label); Start_SelectBox(array('name' => 'ddd')); Draw_SelOptions(array('yah' => 'yahoo.com', 'red' => 'rediff.com', 'alt' => 'altavista.com' ), 'yah' ); End_SelectBox(); Start_A(array('href' => 'htmldoc.php'), array('key'=>'value', 'man'=>'woman')); Draw_Img(array('src' =>'html.gif', 'alt' => 'HTML Documentation')); End_A(); Draw_Button(array('type' => "image", "name" => "merapyar", "src" => 'pyari.gif')); NoTag("This Browser has no support for Script", "script"); NoTag("This Browser has no support for Frames", "frame"); TextTag("This is BOLD Text", "B"); TextTag("This is STRONG Text", "STRONG"); TextTag("This is Italic Text", "ITALIC"); TextTag("This is Underlined Text", "UL"); TextTag("This is Subscript Text", "SUB"); TextTag("This is Superscript Text", "SUP"); end_body(); end_html(); ?> This is Documentation for functions in htmlwriter.php ------------------------------------------------------ HTML Writer 1.0 Author: S.Murali Krishnan <[email protected]> Though there exists many HTML Writers in many sites the reason Iam presenting same stuff is two things. When I use such HTML writers I have to go through the code to understand its working and also if I want to extend them, I have to understand and track the code to find suitable place to add anything. This documentation not only describes, usage of htmlwriter but also the working of the same. This documentation seems to be too Technical way, anyway better documentaion could be made if this is not sufficient. If you find this documentaion awkward, mail to me any queries regarding the code and usage, I will try my possible to solve any problems. E-Mail: [email protected] Let me present a test code using this library of functions so that further reading may not be necessary for most of the users unless they want to know the working of the code. See the EXTENDING HTML WRITER below to add new functions. /*-------- Test code ------------*/ start_html(); start_head(); out_title("list"); out_base("http://larry.bks/~escms"); end_head(); start_body(); $Href = array('href' => 'listview.php', 'text' => 'List View Link' ); $Label = array('size' =>'3pt', 'text' =>'Click Here to see ' , 'color' => 'darkblue' ); Draw_Label($Label); Start_SelectBox(array('name' => 'ddd')); Draw_SelOptions(array('yah' => 'yahoo.com', 'red' => 'rediff.com', 'alt' => 'altavista.com' ), 'yah' ); End_SelectBox(); Start_A(array('href' => 'htmldoc.php'), array('key'=>'value','man'=>'woman')); Draw_Img(array('src' =>'html.gif','alt' => 'HTML Documentation')); End_A(); Draw_Button(array('type' => "image", "name" => "merapyar", "src" => 'pyari.gif' )); NoTag("This Browser has no support for Script","script"); NoTag("This Browser has no support for Frames","frame"); TextTag("This is Bold Text", "B"); TextTag("This is superscript Text", "SUP"); TextTag("This is Subscript Text", "SUB"); TextTag("This is ITALIC Text", "I"); TextTag("This is STRONG Text", "STRONG"); TextTag("This is Underlined Text", "UL"); Out_Tag("<table color='blue'>"); // accept string or array Out_Tag(array('start_tag' => "<newtag>", 'end_tag' => "</newtag>" , 'color' => 'blue' ) ); end_body(); end_html(); /*---------------------- END TEST CODE ----------------------------*/ Documentation ------------- "htmlwriter.inc" includes functions necessary for drawing html tags and form element tags. This documentation describes the way in which HTML tags were builded and printed. Attributes Data Structure -------------------------- For every HTML Tag there would be one or more attributes. If we are designing similar pages, most of this attributes remains same for each occurance of every particular tag. The data struture for storing tag attibutes using php associative array is as follows. $Tagname = array( 'start_tag' => '<Tagname>', 'end_tag' => '</Tagname>', 'attribute1' => 'value1', 'attribute2' => 'value2', 'attribute3' => 'value3' 'others' => '' ............. ..... .... ) For example Structure for TABLE tag would be as follows. $Table = array ( 'start_tag' => '<table>', 'end_tag' => '</table>' 'color' => 'darkred', 'bgcolor' => 'white', 'cellpadding' => '0', 'cellspacing' => '0', 'border' => '1', 'others' => '' ... .... ); In the above structure for Table tag, 'start_tag' key defines the starting tag for TABLE tag. 'end_tag' key defines the ending closing tag for the TABLE tag. All the other keys, form each attribute for <TABLE> tag. 'others' this key would be normally empty, but this could be used in two situations. 1. In some tags the attribute would be simple string rather than 'key=value' pair. example: <option value='xxxx' selected> text </option> <select name='xx' multiple > ... </select> <input type="checkbox" checked> In the above tags 'selected' and 'multiple' attributes are simple strings which were not accompanied by any keys. 2. Different tags may have different javascript events like 'onSubmit' , 'onClick', 'onChange' , 'onSelect' . It is unlikely to hardcode all the possible events for all the tags in this array. To overcome this problem this 'others' key is used. That is whenever we want to add anything other than 'key=value' attributes to tags, we can pass those string in this 'others' key. ( It would be more clear when we go through the tag building algorithm ). For some attributes like 'bgcolor', 'color', etc the value on the right side would form the default value when the user haven't supplied those attribute values. ( because for a particular page mostly this attributes are going to be same for all the tags. ). Like this we can define for all the Possible or most frequently used tags which we are going to use. ( BODY, TABLE, TD, TR, TH, FONT, FORM, SELECT, INPUT, TEXTAREA, LINK, BUTTON, RADIO ). lets see another example ( FORM tag ) $Form = array ( 'start_tag' => '<form>', 'end_tag' => '</form>', 'action' => 'http://....', 'name' => 'form_name', 'method' => 'post', 'others' => '' ); This attribute definition for all the tags would be placed in top of all the functions. Functions and Output --------------------- if we want to print a '<table>' tag with few attributes we can call the function 'Start_Table' as follows. <?php $table = array( 'bgcolor' => '#333122', 'color' => '#222212', 'height' => '100%', 'width' => '50%', 'border' => '0' ); Start_Table($table); ?> After this call 'Start_Table' would Output the following tag. "<table cellpadding='0' cellspacing='0' bgcolor='#333122' color='#222212' height='100%' width='50%' border='0' >" For closing the <table> tag we can call the function 'End_Table' which would output the following. End_Table(); "</table>" Like this we could do for all the possible tags. Function names are case insensitive in php, we can call all the start functions by simply prepending 'Start_' to the actual tag, and end functions by adding 'End_' to the actual tag function names for calling some of the tags are given below. Tagname | Start function | End Function ---------------------------------------------- TD Start_Td End_Td TR Start_Tr End_Tr BODY Start_Body End_Body SELECT Start_Select End_Select HTML Start_Html End_Html A Start_A End_A ..... .... Tag Building ------------- Algorithm for building attributes and priting the tag is as follows. Example for Printing "<TABLE>" Tag is shown below, this steps would be same for most of the tags. Status of the tag at each step is also shown. PROCEDURE: Start_Table Args: $LTable ( Associative array of Attributes ) BEGIN: Step 1: global $Table ; // Get copy of Already defined TABLE attributes. Table_Tag = "" ; // Make new Empty variable. Tag Status : '' Step 2: Merge the Global attributes and Passed attributes for table. $Attrib = array_merge($Table,$LTable); While merging, the order of arguments should be maintained in array_merge, because array_merge would overwrite the key's value if the same is found in the second array. By merging we would get a new array with following properties. 1. All the Global attributes for the tag are available. 2. Any key=value in global Array ( $Table ) would be overwritten by the same key in Passed argument Array. See the documentation for array_merge for further details Step 3: Append all the attributes (key=value of $Attrib ) to the Table Tag. Our Requirement is: ------------------ 1. If the key is 'end_tag' it should be skipped. 2. If key is 'others' or 'start_tag' , its value alone should be appended to the tag, without key. ( for 'multiple','selected', 'checked', <table> ) 3. If the value of the attribute is null, then it should be skipped. 4. All other 'key values' should be appended as "key='value' " format to the tag. For this we will use 'make_tag' on $Attrib as follows. ( see below for make_tag procedure ) make_tag($Attrib,'BuildAttribs','Table_Tag'); Arguments --------- $Attrib -- Array of attributes BuildAttribs -- Function name to invoke for each key value pair. ( Procedure for BuildAttrs is explained below ) Table_Tag -- Argument to BuildAttribs ( to which attribs are appended ) make_tag ---------- Applies the user-defined function named by second argument to each element of array. BuildAttribs will be passed array value as the first parameter and array key as the second parameter. If userdata is supplied, it will be passed as the third parameter to the BuildAttribs function. Our $Table_Tag variable should be updated by each call of 'BuildAttribs' function so we will pass '$Table_Tag' by reference so that all the appended attributes would be available at the end. Tag Status : "<table cellpadding='0' cellspacing='0' bgcolor='#333122' color='#222212' height='100%' width='50%' border='0'>" Step 4: Print the Table Tag. Tag Status : "<table cellpadding='0' cellspacing='0' bgcolor='#333122' color='#222212' height='100%' width='50%' border='0' >n" Step 5: Return END END PROCEDURE At the end of this steps we builded a <TABLE> Tag with attributes of our interest. status of $Table_Tag after each step is shown below. ----------------------------------------------------- Step 1: "" Step 2: "" Step 3: ( Inside array_walk ) $Table_Tag = "<table>" ; i) "<table cellpadding='0'>" ii) "<table cellpadding='0' cellspacing='0' >" ii) "<table cellpadding='0' cellspacing='0' bgcolor='#333122' >" iii) "<table cellpadding='0' cellspacing='0' bgcolor='#333122' color='#222212' >" iv) "<table cellpadding='0' cellspacing='0' bgcolor='#333122' color='#222212' height='100%' >" v) "<table cellpadding='0' cellspacing='0' bgcolor='#333122' color='#222212' height='100%' width='50%' >" vi) "<table cellpadding='0' cellspacing='0' bgcolor='#333122' color='#222212' height='100%' width='50%' border='0' " Step 4: "<table cellpadding='0' cellspacing='0' bgcolor='#333122' color='#222212' height='100%' width='50%' border='0' >" Step 5: "<table cellpadding='0' cellspacing='0' bgcolor='#333122' color='#222212' height='100%' width='50%' border='0' >n" Make_Tag --------- The main function in building tag is Make_Tag. This function build the tag by appending attributes to the tag. since the third argument is passed by reference its value would be retained outside of this function (ie . in Start_Table also ) PROCEDURE: Make_Tag Args: $Attr, "BuildAttribs" , $Tag_Var $Attr - array of attributes to the tag. "BuildAttribs" - function to build each attribute. "Tag_Var" - The Tag string which attributes to be appended. BEGIN: 1. Append value of 'start_tag' key of $Tag_Var 2. Unset 'start_tag' element of array, so that it would not be visible in further attributes. 3. append all the 'key=value' of $Attrib as attribute to the tag. for each $attr in $Attrib build attrib append attrib endfor 4. return tag. END END PROCEDURE BuildAttribs ------------ This is the function invoked by array_walk in Tag building functions. This function will get a key , value and a variable as arguments. Procedure for this function is shown below. PROCEDURE: BuildAttribs Args: key, value , Tag_variable (Tag_Variable is by reference so any change to Tag_Variable would be visible in the calling function ) BEGIN: IF value != "" begin: IF key == 'end_tag' RETURN ELSE IF key == 'others' attrib = value insert attrib before close angle bracket ( substr_replace) of Tag_Variable ELSE attrib = key + "=" + "'value'" insert attrib before close angle bracket of Tag_Variable ENDIF end return Tag_Variable ENDIF END Tag Closing Function -------------------- Any 'Start_' type function also has its corresponding 'End_' function. For our Start_Table function there is a corresponding End_Table function, in which we would print "</table>" tag. Procedure for End_Table Function is as follows. -------------------------------------------------- PROCEDURE: End_Table Args: Nothing BEGIN: Get copy of $Table array. print value of 'end_tag' key in $Table print "n" END PHP code for these three functions ( Start_Table, End_Table, BuildAttribs ) is shown below. ------------------------------------------------------------------------------- function End_Table() { global $endl,$Table ; print $Table["end_tag"] . $endl ; // print </table> return ; } Generic Tag Printing function ----------------------------- In case we want to print a new tag that is not defined before, we can use the function Out_Tag to print that. This Out_Tag doesn't refer any global variable for merging as in start_table it only build the attributes with the passed array. This requires that we have to pass start_tag and end_tag too. for example building <img> tag we have to call the function in the following way. <?php $img = array( 'start_tag' => '<img>', 'src' => 'cool.jpg', 'border' => '0', 'height' => 200, 'width' => 100 ); Out_Tag($img); ?> This above code would output the following. <img src='cool.jpg' border='0' height='200' width='100'> We can also call Out_Tag to output a string of tag as follows. Out_Tag("<body color='#212111' bgcolor='#291929'>"); EXTENDING HTML WRITER --------------------- If you want to add any new HTML Tag functions, simply define the necessary tag array at the start of this file, then define two functions as follows. function Start_TAGNAME ($Tagarray) { global $TAGARRAY ..... See other function definitions for what to do here. } function End_TAGNAME () { .... } Then call the functions as others. Start_Tagname(array(....)); End_Tagname(); TODO ---- * Tags array can be placed in a seperate file called "tags.inc" * In each tag array "end_tag" key is not necessary if we do apply some logic to make_tag() function. * Instead of declaring each function for every tag, a workaround has to be done using OOPs to minimize no. of functions Probably you may expect all these things in next release. Mail to me if any new TODOs needs to be done. -------------------------------------------------------------------------------