| | |
| | | | program/include/html.php | |
| | | | | |
| | | | This file is part of the Roundcube Webmail client | |
| | | | Copyright (C) 2005-2010, The Roundcube Dev Team | |
| | | | Licensed under the GNU GPL | |
| | | | Copyright (C) 2005-2011, The Roundcube Dev Team | |
| | | | | |
| | | | Licensed under the GNU General Public License version 3 or | |
| | | | any later version with exceptions for skins & plugins. | |
| | | | See the README file for a full license statement. | |
| | | | | |
| | | | PURPOSE: | |
| | | | Helper class to create valid XHTML code | |
| | |
| | | +-----------------------------------------------------------------------+ |
| | | | Author: Thomas Bruederli <roundcube@gmail.com> | |
| | | +-----------------------------------------------------------------------+ |
| | | |
| | | $Id$ |
| | | |
| | | */ |
| | | */ |
| | | |
| | | |
| | | /** |
| | |
| | | |
| | | $tagname = self::$lc_tags ? strtolower($tagname) : $tagname; |
| | | if (isset($content) || in_array($tagname, self::$containers)) { |
| | | $templ = $attrib['noclose'] ? "<%s%s>%s" : "<%s%s>%s</%s>%s"; |
| | | unset($attrib['noclose']); |
| | | return sprintf($templ, $tagname, self::attrib_string($attrib, $allowed_attrib), $content, $tagname, $suffix); |
| | | $suffix = $attrib['noclose'] ? $suffix : '</' . $tagname . '>' . $suffix; |
| | | unset($attrib['noclose'], $attrib['nl']); |
| | | return '<' . $tagname . self::attrib_string($attrib, $allowed_attrib) . '>' . $content . $suffix; |
| | | } |
| | | else { |
| | | return sprintf("<%s%s />%s", $tagname, self::attrib_string($attrib, $allowed_attrib), $suffix); |
| | | return '<' . $tagname . self::attrib_string($attrib, $allowed_attrib) . '>' . $suffix; |
| | | } |
| | | } |
| | | |
| | |
| | | $attr = array('src' => $attr); |
| | | } |
| | | return self::tag('img', $attr + array('alt' => ''), null, array_merge(self::$common_attrib, |
| | | array('src','alt','width','height','border','usemap'))); |
| | | array('src','alt','width','height','border','usemap','onclick'))); |
| | | } |
| | | |
| | | /** |
| | |
| | | $attr = array('href' => $attr); |
| | | } |
| | | return self::tag('a', $attr, $cont, array_merge(self::$common_attrib, |
| | | array('href','target','name','rel','onclick','onmouseover','onmouseout','onmousedown','onmouseup'))); |
| | | array('href','target','name','rel','onclick','onmouseover','onmouseout','onmousedown','onmouseup'))); |
| | | } |
| | | |
| | | /** |
| | |
| | | $attr = array('src' => $attr); |
| | | } |
| | | return self::tag('iframe', $attr, $cont, array_merge(self::$common_attrib, |
| | | array('src','name','width','height','border','frameborder'))); |
| | | array('src','name','width','height','border','frameborder'))); |
| | | } |
| | | |
| | | /** |
| | | * Derrived method to create <script> tags |
| | | * |
| | | * @param mixed $attr Hash array with tag attributes or string with script source (src) |
| | | * @param string $cont Javascript code to be placed as tag content |
| | | * @return string HTML code |
| | | * @see html::tag() |
| | | */ |
| | | public static function script($attr, $cont = null) |
| | | { |
| | | if (is_string($attr)) { |
| | | $attr = array('src' => $attr); |
| | | } |
| | | if ($cont) { |
| | | if (self::$doctype == 'xhtml') |
| | | $cont = "\n/* <![CDATA[ */\n" . $cont . "\n/* ]]> */\n"; |
| | | else |
| | | $cont = "\n" . $cont . "\n"; |
| | | } |
| | | |
| | | return self::tag('script', $attr + array('type' => 'text/javascript', 'nl' => true), |
| | | $cont, array_merge(self::$common_attrib, array('src','type','charset'))); |
| | | } |
| | | |
| | | /** |
| | |
| | | $attrib_arr = array(); |
| | | foreach ($attrib as $key => $value) { |
| | | // skip size if not numeric |
| | | if (($key=='size' && !is_numeric($value))) { |
| | | if ($key == 'size' && !is_numeric($value)) { |
| | | continue; |
| | | } |
| | | |
| | |
| | | // attributes with no value |
| | | if (in_array($key, array('checked', 'multiple', 'disabled', 'selected'))) { |
| | | if ($value) { |
| | | $attrib_arr[] = sprintf('%s="%s"', $key, $key); |
| | | $attrib_arr[] = $key . '="' . $key . '"'; |
| | | } |
| | | } |
| | | else if ($key=='value') { |
| | | $attrib_arr[] = sprintf('%s="%s"', $key, Q($value, 'strict', false)); |
| | | } |
| | | else { |
| | | $attrib_arr[] = sprintf('%s="%s"', $key, Q($value)); |
| | | $attrib_arr[] = $key . '="' . self::quote($value) . '"'; |
| | | } |
| | | } |
| | | |
| | | return count($attrib_arr) ? ' '.implode(' ', $attrib_arr) : ''; |
| | | } |
| | | |
| | | /** |
| | | * Convert a HTML attribute string attributes to an associative array (name => value) |
| | | * |
| | | * @param string Input string |
| | | * @return array Key-value pairs of parsed attributes |
| | | */ |
| | | public static function parse_attrib_string($str) |
| | | { |
| | | $attrib = array(); |
| | | $regexp = '/\s*([-_a-z]+)=(["\'])??(?(2)([^\2]*)\2|(\S+?))/Ui'; |
| | | |
| | | preg_match_all($regexp, stripslashes($str), $regs, PREG_SET_ORDER); |
| | | |
| | | // convert attributes to an associative array (name => value) |
| | | if ($regs) { |
| | | foreach ($regs as $attr) { |
| | | $attrib[strtolower($attr[1])] = html_entity_decode($attr[3] . $attr[4]); |
| | | } |
| | | } |
| | | |
| | | return $attrib; |
| | | } |
| | | |
| | | /** |
| | | * Replacing specials characters in html attribute value |
| | | * |
| | | * @param string $str Input string |
| | | * |
| | | * @return string The quoted string |
| | | */ |
| | | public static function quote($str) |
| | | { |
| | | return @htmlspecialchars($str, ENT_COMPAT, RCMAIL_CHARSET); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Class to create an HTML input field |
| | |
| | | { |
| | | protected $tagname = 'input'; |
| | | protected $type = 'text'; |
| | | protected $allowed = array('type','name','value','size','tabindex', |
| | | 'autocomplete','checked','onchange','onclick','disabled','readonly', |
| | | 'spellcheck','results','maxlength','src','multiple'); |
| | | protected $allowed = array( |
| | | 'type','name','value','size','tabindex','autocapitalize', |
| | | 'autocomplete','checked','onchange','onclick','disabled','readonly', |
| | | 'spellcheck','results','maxlength','src','multiple','placeholder', |
| | | ); |
| | | |
| | | /** |
| | | * Object constructor |
| | |
| | | |
| | | if ($attrib['type']) { |
| | | $this->type = $attrib['type']; |
| | | } |
| | | |
| | | if ($attrib['newline']) { |
| | | $this->newline = true; |
| | | } |
| | | } |
| | | |
| | |
| | | * @package HTML |
| | | */ |
| | | |
| | | class html_hiddenfield extends html_inputfield |
| | | class html_hiddenfield extends html |
| | | { |
| | | protected $tagname = 'input'; |
| | | protected $type = 'hidden'; |
| | | protected $fields_arr = array(); |
| | | protected $newline = true; |
| | | protected $allowed = array('type','name','value','onchange','disabled','readonly'); |
| | | |
| | | /** |
| | | * Constructor |
| | |
| | | { |
| | | protected $tagname = 'textarea'; |
| | | protected $allowed = array('name','rows','cols','wrap','tabindex', |
| | | 'onchange','disabled','readonly','spellcheck'); |
| | | 'onchange','disabled','readonly','spellcheck'); |
| | | |
| | | /** |
| | | * Get HTML code for this object |
| | |
| | | unset($this->attrib['value']); |
| | | } |
| | | |
| | | if (!empty($value) && !preg_match('/mce_editor/', $this->attrib['class'])) { |
| | | $value = Q($value, 'strict', false); |
| | | if (!empty($value) && empty($this->attrib['is_escaped'])) { |
| | | $value = self::quote($value); |
| | | } |
| | | |
| | | return self::tag($this->tagname, $this->attrib, $value, |
| | | array_merge(self::$common_attrib, $this->allowed)); |
| | | array_merge(self::$common_attrib, $this->allowed)); |
| | | } |
| | | } |
| | | |
| | |
| | | protected $tagname = 'select'; |
| | | protected $options = array(); |
| | | protected $allowed = array('name','size','tabindex','autocomplete', |
| | | 'multiple','onchange','disabled','rel'); |
| | | |
| | | 'multiple','onchange','disabled','rel'); |
| | | |
| | | /** |
| | | * Add a new option to this drop-down |
| | | * |
| | |
| | | 'selected' => (in_array($option['value'], $select, true) || |
| | | in_array($option['text'], $select, true)) ? 1 : null); |
| | | |
| | | $this->content .= self::tag('option', $attr, Q($option['text'])); |
| | | $option_content = $option['text']; |
| | | if (empty($this->attrib['is_escaped'])) { |
| | | $option_content = self::quote($option_content); |
| | | } |
| | | |
| | | $this->content .= self::tag('option', $attr, $option_content); |
| | | } |
| | | |
| | | return parent::show(); |
| | | } |
| | | } |
| | |
| | | { |
| | | protected $tagname = 'table'; |
| | | protected $allowed = array('id','class','style','width','summary', |
| | | 'cellpadding','cellspacing','border'); |
| | | 'cellpadding','cellspacing','border'); |
| | | |
| | | private $header = array(); |
| | | private $rows = array(); |
| | |
| | | $cell->content = $cont; |
| | | |
| | | $this->rows[$this->rowindex]->cells[$this->colindex] = $cell; |
| | | $this->colindex++; |
| | | $this->colindex += max(1, intval($attr['colspan'])); |
| | | |
| | | if ($this->attrib['cols'] && $this->colindex == $this->attrib['cols']) { |
| | | if ($this->attrib['cols'] && $this->colindex >= $this->attrib['cols']) { |
| | | $this->add_row(); |
| | | } |
| | | } |
| | |
| | | */ |
| | | public function add_header($attr, $cont) |
| | | { |
| | | if (is_string($attr)) |
| | | $attr = array('class' => $attr); |
| | | if (is_string($attr)) { |
| | | $attr = array('class' => $attr); |
| | | } |
| | | |
| | | $cell = new stdClass; |
| | | $cell->attrib = $attr; |
| | |
| | | */ |
| | | public function set_row_attribs($attr = array(), $index = null) |
| | | { |
| | | if (is_string($attr)) |
| | | $attr = array('class' => $attr); |
| | | if (is_string($attr)) { |
| | | $attr = array('class' => $attr); |
| | | } |
| | | |
| | | if ($index === null) |
| | | if ($index === null) { |
| | | $index = $this->rowindex; |
| | | } |
| | | |
| | | $this->rows[$index]->attrib = $attr; |
| | | } |
| | |
| | | */ |
| | | public function get_row_attribs($index = null) |
| | | { |
| | | if ($index === null) |
| | | if ($index === null) { |
| | | $index = $this->rowindex; |
| | | } |
| | | |
| | | return $this->rows[$index] ? $this->rows[$index]->attrib : null; |
| | | } |
| | |
| | | } |
| | | |
| | | } |
| | | |