'HTML::div(...)')) */ if (!class_exists("XmlElement")) require_once(dirname(__FILE__) . "/XmlElement.php"); if (class_exists("HtmlElement")) return; /** * An XML element. */ //apd_set_session_trace(35); class HtmlElement extends XmlElement { function __construct($tagname /* , $attr_or_content , ...*/) { $this->_init(func_get_args()); $this->_properties = HTML::getTagProperties($tagname); } function _init($args) { if (!is_array($args)) $args = func_get_args(); assert(count($args) >= 1); assert(is_string($args[0])); $this->_tag = array_shift($args); if ($args && is_array($args[0])) $this->_attr = array_shift($args); else { $this->_attr = array(); if ($args && $args[0] === false) array_shift($args); } $this->setContent($args); $this->_properties = HTML::getTagProperties($this->_tag); } /** * @access protected * This is used by the static factory methods is class HTML. */ function _init2($args) { if ($args) { if (is_array($args[0])) $this->_attr = array_shift($args); elseif ($args[0] === false) array_shift($args); } if (count($args) == 1 && is_array($args[0])) $args = $args[0]; $this->_content = $args; return $this; } /** Add a "tooltip" to an element. * * @param $tooltip_text string The tooltip text. */ function addTooltip($tooltip_text, $accesskey = null) { $this->setAttr('title', $tooltip_text); if ($accesskey) $this->setAccesskey($accesskey); // FIXME: this should be initialized from title by an onLoad() function. // (though, that may not be possible.) $qtooltip = str_replace("'", "\\'", $tooltip_text); $this->setAttr('onmouseover', sprintf('window.status="%s"; return true;', addslashes($tooltip_text))); $this->setAttr('onmouseout', "window.status='';return true;"); } function setAccesskey($key) { global $WikiTheme; if (strlen($key) != 1) return; $this->setAttr("accesskey", $key); if (!empty($this->_attr['title'])) { if (preg_match("/\[(alt-)?(.)\]$/", $this->_attr['title'], $m)) { $this->_attr['title'] = preg_replace ("/\[(alt-)?(.)\]$/", "[" . $WikiTheme->tooltipAccessKeyPrefix() . "-\\2]", $this->_attr['title']); } else { $this->_attr['title'] .= " [" . $WikiTheme->tooltipAccessKeyPrefix() . "-$key]"; } } else { $this->_attr['title'] = "[" . $WikiTheme->tooltipAccessKeyPrefix() . "-$key]"; } } function emptyTag() { if (($this->_properties & HTMLTAG_EMPTY) == 0) return $this->startTag() . "_tag>"; return substr($this->startTag(), 0, -1) . " />"; } function hasInlineContent() { return ($this->_properties & HTMLTAG_ACCEPTS_INLINE) != 0; } function isInlineElement() { return ($this->_properties & HTMLTAG_INLINE) != 0; } } function HTML( /* $content, ... */) { return new XmlContent(func_get_args()); } class HTML extends HtmlElement { public static function raw($html_text) { return new RawXml($html_text); } public static function getTagProperties($tag) { $props = &$GLOBALS['HTML_TagProperties']; return isset($props[$tag]) ? $props[$tag] : 0; } public static function _setTagProperty($prop_flag, $tags) { $props = &$GLOBALS['HTML_TagProperties']; if (is_string($tags)) $tags = preg_split('/\s+/', $tags); foreach ($tags as $tag) { $tag = trim($tag); if ($tag) if (isset($props[$tag])) $props[$tag] |= $prop_flag; else $props[$tag] = $prop_flag; } } // See admin/mkfuncs shell script to generate the following static methods public static function link( /*...*/) { $el = new HtmlElement('link'); return $el->_init2(func_get_args()); } public static function meta( /*...*/) { $el = new HtmlElement('meta'); return $el->_init2(func_get_args()); } public static function style( /*...*/) { $el = new HtmlElement('style'); return $el->_init2(func_get_args()); } public static function script( /*...*/) { $el = new HtmlElement('script'); return $el->_init2(func_get_args()); } public static function noscript( /*...*/) { $el = new HtmlElement('noscript'); return $el->_init2(func_get_args()); } /****************************************/ public static function a( /*...*/) { $el = new HtmlElement('a'); return $el->_init2(func_get_args()); } public static function img( /*...*/) { $el = new HtmlElement('img'); return $el->_init2(func_get_args()); } public static function br( /*...*/) { $el = new HtmlElement('br'); return $el->_init2(func_get_args()); } public static function span( /*...*/) { $el = new HtmlElement('span'); return $el->_init2(func_get_args()); } /****************************************/ public static function h1( /*...*/) { $el = new HtmlElement('h1'); return $el->_init2(func_get_args()); } public static function h2( /*...*/) { $el = new HtmlElement('h2'); return $el->_init2(func_get_args()); } public static function h3( /*...*/) { $el = new HtmlElement('h3'); return $el->_init2(func_get_args()); } public static function h4( /*...*/) { $el = new HtmlElement('h4'); return $el->_init2(func_get_args()); } public static function h5( /*...*/) { $el = new HtmlElement('h5'); return $el->_init2(func_get_args()); } public static function h6( /*...*/) { $el = new HtmlElement('h6'); return $el->_init2(func_get_args()); } /****************************************/ public static function hr( /*...*/) { $el = new HtmlElement('hr'); return $el->_init2(func_get_args()); } public static function div( /*...*/) { $el = new HtmlElement('div'); return $el->_init2(func_get_args()); } public static function p( /*...*/) { $el = new HtmlElement('p'); return $el->_init2(func_get_args()); } public static function pre( /*...*/) { $el = new HtmlElement('pre'); return $el->_init2(func_get_args()); } public static function blockquote( /*...*/) { $el = new HtmlElement('blockquote'); return $el->_init2(func_get_args()); } /****************************************/ public static function em( /*...*/) { $el = new HtmlElement('em'); return $el->_init2(func_get_args()); } public static function strong( /*...*/) { $el = new HtmlElement('strong'); return $el->_init2(func_get_args()); } public static function small( /*...*/) { $el = new HtmlElement('small'); return $el->_init2(func_get_args()); } /****************************************/ public static function tt( /*...*/) { $el = new HtmlElement('tt'); return $el->_init2(func_get_args()); } public static function u( /*...*/) { $el = new HtmlElement('u'); return $el->_init2(func_get_args()); } public static function sup( /*...*/) { $el = new HtmlElement('sup'); return $el->_init2(func_get_args()); } public static function sub( /*...*/) { $el = new HtmlElement('sub'); return $el->_init2(func_get_args()); } /****************************************/ public static function ul( /*...*/) { $el = new HtmlElement('ul'); return $el->_init2(func_get_args()); } public static function ol( /*...*/) { $el = new HtmlElement('ol'); return $el->_init2(func_get_args()); } public static function dl( /*...*/) { $el = new HtmlElement('dl'); return $el->_init2(func_get_args()); } public static function li( /*...*/) { $el = new HtmlElement('li'); return $el->_init2(func_get_args()); } public static function dt( /*...*/) { $el = new HtmlElement('dt'); return $el->_init2(func_get_args()); } public static function dd( /*...*/) { $el = new HtmlElement('dd'); return $el->_init2(func_get_args()); } /****************************************/ public static function table( /*...*/) { $el = new HtmlElement('table'); return $el->_init2(func_get_args()); } public static function caption( /*...*/) { $el = new HtmlElement('caption'); return $el->_init2(func_get_args()); } public static function thead( /*...*/) { $el = new HtmlElement('thead'); return $el->_init2(func_get_args()); } public static function tbody( /*...*/) { $el = new HtmlElement('tbody'); return $el->_init2(func_get_args()); } public static function tfoot( /*...*/) { $el = new HtmlElement('tfoot'); return $el->_init2(func_get_args()); } public static function tr( /*...*/) { $el = new HtmlElement('tr'); return $el->_init2(func_get_args()); } public static function td( /*...*/) { $el = new HtmlElement('td'); return $el->_init2(func_get_args()); } public static function th( /*...*/) { $el = new HtmlElement('th'); return $el->_init2(func_get_args()); } public static function colgroup( /*...*/) { $el = new HtmlElement('colgroup'); return $el->_init2(func_get_args()); } public static function col( /*...*/) { $el = new HtmlElement('col'); return $el->_init2(func_get_args()); } /****************************************/ public static function form( /*...*/) { $el = new HtmlElement('form'); return $el->_init2(func_get_args()); } public static function input( /*...*/) { $el = new HtmlElement('input'); return $el->_init2(func_get_args()); } public static function button( /*...*/) { $el = new HtmlElement('button'); return $el->_init2(func_get_args()); } public static function option( /*...*/) { $el = new HtmlElement('option'); return $el->_init2(func_get_args()); } public static function select( /*...*/) { $el = new HtmlElement('select'); return $el->_init2(func_get_args()); } public static function textarea( /*...*/) { $el = new HtmlElement('textarea'); return $el->_init2(func_get_args()); } public static function label( /*...*/) { $el = new HtmlElement('label'); return $el->_init2(func_get_args()); } /****************************************/ public static function area( /*...*/) { $el = new HtmlElement('area'); return $el->_init2(func_get_args()); } public static function map( /*...*/) { $el = new HtmlElement('map'); return $el->_init2(func_get_args()); } public static function frame( /*...*/) { $el = new HtmlElement('frame'); return $el->_init2(func_get_args()); } public static function frameset( /*...*/) { $el = new HtmlElement('frameset'); return $el->_init2(func_get_args()); } public static function iframe( /*...*/) { $el = new HtmlElement('iframe'); return $el->_init2(func_get_args()); } public static function nobody( /*...*/) { $el = new HtmlElement('nobody'); return $el->_init2(func_get_args()); } public static function object( /*...*/) { $el = new HtmlElement('object'); return $el->_init2(func_get_args()); } public static function embed( /*...*/) { $el = new HtmlElement('embed'); return $el->_init2(func_get_args()); } public static function param( /*...*/) { $el = new HtmlElement('param'); return $el->_init2(func_get_args()); } public static function fieldset( /*...*/) { $el = new HtmlElement('fieldset'); return $el->_init2(func_get_args()); } public static function legend( /*...*/) { $el = new HtmlElement('legend'); return $el->_init2(func_get_args()); } /****************************************/ public static function video( /*...*/) { $el = new HtmlElement('video'); return $el->_init2(func_get_args()); } } define('HTMLTAG_EMPTY', 1); define('HTMLTAG_INLINE', 2); define('HTMLTAG_ACCEPTS_INLINE', 4); HTML::_setTagProperty(HTMLTAG_EMPTY, 'area base basefont br col embed frame hr img input isindex link meta param'); HTML::_setTagProperty(HTMLTAG_ACCEPTS_INLINE, // %inline elements: 'b big i small tt ' // %fontstyle . 's strike u ' // (deprecated) . 'abbr acronym cite code dfn em kbd samp strong var ' //%phrase . 'a img object embed br script map q sub sup span bdo ' //%special . 'button input label option select textarea label ' //%formctl // %block elements which contain inline content . 'address h1 h2 h3 h4 h5 h6 p pre ' // %block elements which contain either block or inline content . 'div fieldset frameset' // other with inline content . 'caption dt label legend video ' // other with either inline or block . 'dd del ins li td th colgroup'); HTML::_setTagProperty(HTMLTAG_INLINE, // %inline elements: 'b big i small tt ' // %fontstyle . 's strike u ' // (deprecated) . 'abbr acronym cite code dfn em kbd samp strong var ' //%phrase . 'a img object br script map q sub sup span bdo ' //%special . 'button input label option select textarea ' //%formctl . 'nobody iframe' ); /** * Generate hidden form input fields. * * @param $query_args hash A hash mapping names to values for the hidden inputs. * Values in the hash can themselves be hashes. The will result in hidden inputs * which will reconstruct the nested structure in the resulting query args as * processed by PHP. * * Example: * * $args = array('x' => '2', * 'y' => array('a' => 'aval', 'b' => 'bval')); * $inputs = HiddenInputs($args); * * Will result in: * * * * * * @return object An XmlContent object containing the inputs. */ function HiddenInputs($query_args, $pfx = false, $exclude = array()) { $inputs = HTML(); foreach ($query_args as $key => $val) { if (in_array($key, $exclude)) continue; $name = $pfx ? $pfx . "[$key]" : $key; if (is_array($val)) $inputs->pushContent(HiddenInputs($val, $name)); else $inputs->pushContent(HTML::input(array('type' => 'hidden', 'name' => $name, 'value' => $val))); } return $inputs; } /** Generate a