[ Index ] |
|
Code source de Horde 3.1.3 |
1 <?php 2 /** 3 * Horde_Mobile_Renderer:: output module for simple HTML and 4 * Imode/Avantgo/similar devices. 5 * 6 * $Horde: framework/Mobile/Mobile/Renderer/html.php,v 1.28.10.6 2006/01/01 21:28:26 jan Exp $ 7 * 8 * Copyright 2002-2006 Chuck Hagenbuch <chuck@horde.org> 9 * 10 * See the enclosed file COPYING for license information (LGPL). If you 11 * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html. 12 * 13 * @author Chuck Hagenbuch <chuck@horde.org> 14 * @since Horde 3.0 15 * @package Horde_Mobile 16 */ 17 class Horde_Mobile_Renderer_html extends Horde_Mobile_Renderer { 18 19 /** 20 * Properly encode characters for output to an HTML browser. 21 * 22 * @param string $input Characters to encode. 23 * 24 * @return string The encoded text. 25 */ 26 function escape($input) 27 { 28 return @htmlspecialchars($input, ENT_COMPAT, NLS::getCharset()); 29 } 30 31 /** 32 * Creates the page in the appropriate markup. Depending on the 33 * clients browser type pure HTML, handheldfriendly AvantGo HTML, 34 * i-mode cHTML, or MML is created. 35 * 36 * @param Horde_Mobile $deck The deck to render. 37 */ 38 function render(&$deck) 39 { 40 if ($deck->_debug) { 41 header('Content-Type: text/plain; charset=' . NLS::getCharset()); 42 } else { 43 header('Content-Type: text/html; charset=' . NLS::getCharset()); 44 } 45 header('Vary: Accept-Language'); 46 47 if (!$this->isBrowser('mml')) { 48 echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"; 49 } 50 51 echo !empty($GLOBALS['language']) ? '<html lang="' . strtr($GLOBALS['language'], '_', '-') . '">' : '<html>'; 52 echo '<head>'; 53 54 if ($this->isBrowser('avantgo')) { 55 echo '<meta name="HandheldFriendly" content="True">'; 56 } 57 58 printf("<title>%s</title>\n", $this->escape($deck->get('title'))); 59 60 if ($deck->_simulator) { 61 // Use simulator (mobile theme) stylesheet. 62 echo Horde::stylesheetLink('horde', 'mobile'); 63 } 64 65 echo '</head><body>'; 66 67 if ($deck->_simulator) { 68 echo "<center><br />\n"; 69 // Create default device simulator table layout with 70 // central CSS layout. 71 echo "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n"; 72 echo "<tr><td colspan=\"3\" class=\"top\"> </td></tr>\n"; 73 echo "<tr><td valign=\"top\" class=\"left\"> </td>\n"; 74 echo "<td valign=\"top\" class=\"display\">\n"; 75 } 76 77 $divstyle = ''; 78 if ($this->hasQuirk('scroll_tds') && $deck->_simulator) { 79 // Make content of table element scrollable (Horde_Mobile 80 // simulator). 81 $divstyle = ' class="simdev"'; 82 } 83 echo '<div' . $divstyle . '>'; 84 85 if (($cnt = count($deck->_cards)) !== 0) { 86 $i = 0; 87 foreach ($deck->_cards as $card) { 88 if ($i != 0) { 89 echo '<hr />'; 90 } 91 $this->_renderCard($card); 92 $i++; 93 } 94 } else { 95 foreach ($deck->_elements as $page_element) { 96 $this->renderElement($page_element); 97 } 98 } 99 100 echo '</div>'; 101 102 if ($deck->_simulator) { 103 // Display lower part of Horde_Mobile default device 104 // simulator. 105 echo '</td><td valign="top" class="right"> </td></tr><tr><td colspan="3" class="bottom"> </td></tr></table></center>'; 106 } 107 108 echo '</body></html>'; 109 } 110 111 function _renderCard(&$card) 112 { 113 $name = $card->get('name') ? ' name="' . $this->escape($card->get('name')) . '"' : ''; 114 printf('<a%s>%s</a>', $name, $card->get('title')); 115 116 if (count($card->_softkeys)) { 117 foreach ($card->_softkeys as $key) { 118 echo ' | <a href="' . $key['url'] . '">' . $this->escape($key['label']) . '</a>'; 119 } 120 } 121 122 // Render all tags. 123 foreach ($card->_elements as $page_element) { 124 $this->renderElement($page_element); 125 } 126 } 127 128 function _renderLink(&$link) 129 { 130 if ($link->get('title') && 131 !$this->isBrowser('avantgo') && 132 !$this->isBrowser('imode') && 133 !$this->isBrowser('mml')) { 134 $title_option = sprintf(' onmouseover="self.status=\'%s\';return true;"', 135 $this->escape($link->get('title'))); 136 } else { 137 $title_option = ''; 138 } 139 140 $accesskey_option = ''; 141 if ($link->get('accesskey')) { 142 if ($this->isBrowser('imode')) { 143 $accesskey_option = sprintf(' accesskey="%d"', $link->get('accesskey')); 144 } elseif ($this->isBrowser('mml')) { 145 $accesskey_option = sprintf(' directkey="%d"', $link->get('accesskey')); 146 } 147 } 148 149 printf('<a href="%s"%s%s>%s</a>', 150 str_replace('&amp;', '&', $this->escape($link->get('url'))), 151 $title_option, $accesskey_option, 152 $this->escape($link->get('label'))); 153 } 154 155 function _renderLinkset(&$linkset) 156 { 157 if (count($linkset->_elements)) { 158 echo '<ol>'; 159 foreach ($linkset->_elements as $val) { 160 echo '<li>'; 161 $this->_renderLink($val); 162 echo '</li>'; 163 } 164 echo '</ol>'; 165 } 166 } 167 168 function _renderText(&$element) 169 { 170 foreach ($element->_attributes as $attribute) { 171 echo '<' . $attribute . '>'; 172 } 173 174 if ($element->get('linebreaks')) { 175 echo nl2br($this->escape($element->get('text'))); 176 } else { 177 echo $this->escape($element->get('text')); 178 } 179 180 $attributes = array_reverse($element->_attributes); 181 foreach ($attributes as $attribute) { 182 echo '</' . $attribute . '>'; 183 } 184 } 185 186 function _renderImage(&$image) 187 { 188 $attributes = ''; 189 foreach ($image->_attributes as $attribute => $value) { 190 $attributes .= sprintf(' %s="%s"', $attribute, $value); 191 } 192 printf('<img src="%s.png"%s />', $image->_src, $attributes); 193 } 194 195 function _renderForm(&$form) 196 { 197 printf('<form action="%s" method="%s">', $form->get('url'), $form->get('method')); 198 parent::_renderForm($form); 199 echo '</form>'; 200 } 201 202 function _renderInput(&$input) 203 { 204 $type = 'type="' . $input->get('type') . '"'; 205 $size = $input->get('size') ? sprintf('size="%d"', $input->get('size')) : ''; 206 $maxlength = $input->get('maxlength') ? sprintf('maxlength="%d"', $input->get('maxlength')) : ''; 207 208 if ($this->isBrowser('imode')) { 209 $mode = sprintf(' istyle="%d"', $input->get('mode')); 210 } elseif ($this->isBrowser('mml')) { 211 $mode = $this->_getMode($input->get('mode')); 212 } else { 213 $mode = ''; 214 } 215 216 // Create HTML input. 217 printf('%s <input %s name="%s" value="%s"%s%s%s/>', 218 $this->escape($input->get('label')), $type, 219 $this->escape($input->get('name')), $this->escape($input->get('value')), $size, $maxlength, $mode); 220 } 221 222 function _renderTextarea(&$textarea) 223 { 224 if ($this->isBrowser('imode')) { 225 $mode = sprintf(' istyle="%d"', $this->mode); 226 } elseif ($this->isBrowser('mml')) { 227 $mode = $this->_getMode($this->mode); 228 } else { 229 $mode = ''; 230 } 231 232 $wrap = ''; 233 if (!$this->isBrowser('imode') && !$this->isBrowser('mml')) { 234 $wrap = ' wrap="virtual"'; 235 } 236 237 printf('%s<br /><textarea name="%s" rows="%s" cols="%s"%s%s>%s</textarea>', 238 $this->escape($textarea->get('label')), $textarea->get('name'), $textarea->get('rows'), 239 $textarea->get('cols'), $mode, $wrap, $textarea->get('value')); 240 } 241 242 function _renderSelect(&$select) 243 { 244 echo '<select name="' . $select->get('name') . '" size="1">'; 245 foreach ($select->_options as $val) { 246 if ($val['value'] == $select->_value) { 247 $sel = ' selected="selected"'; 248 } else { 249 $sel = ''; 250 } 251 echo '<option' . $sel . ' value="' . $val['value'] . '">' . $this->escape($val['label']) . '</option>'; 252 } 253 echo '</select>'; 254 } 255 256 function _renderRadio(&$radio) 257 { 258 foreach ($radio->_buttons as $val) { 259 $sel = ($val['value'] == $radio->_value) ? ' checked="checked"' : ''; 260 printf('<input type="radio" name="%s"%s value="%s" /> %s<br />', 261 $radio->get('name'), $sel, $val['value'], 262 $this->escape($val['label'])); 263 } 264 } 265 266 function _renderCheckbox(&$checkbox) 267 { 268 $state = $checkbox->isChecked() ? ' checked="checked"' : ''; 269 printf('<input type="checkbox" name="%s"%s value="%s" /> %s<br />', 270 $checkbox->get('name'), $state, $checkbox->get('value'), 271 $this->escape($checkbox->get('label'))); 272 } 273 274 function _renderSubmit(&$submit) 275 { 276 $name = !empty($submit->_name) ? ' name="' . $submit->_name . '"' : ''; 277 printf('<input type="submit"%s value="%s" /><br />', 278 $name, $this->escape($submit->_label)); 279 } 280 281 function _renderHidden(&$hidden) 282 { 283 printf('<input type="hidden" name="%s" value="%s" />', 284 $hidden->get('name'), $hidden->get('value')); 285 } 286 287 function _renderTable(&$table) 288 { 289 $border = $table->get('border'); 290 $padding = $table->get('padding'); 291 $spacing = $table->get('spacing'); 292 293 echo '<table'; 294 if (!is_null($border)) { 295 echo ' border="' . $border . '"'; 296 } 297 if (!is_null($padding)) { 298 echo ' cellpadding="' . $padding . '"'; 299 } 300 if (!is_null($spacing)) { 301 echo ' cellspacing="' . $spacing . '"'; 302 } 303 echo '>'; 304 305 parent::_renderTable($table); 306 307 // Terminate table. 308 if ($this->isBrowser('mml')) { 309 echo '</table><br />'; 310 } else { 311 // MML has problems with the clear attribute. 312 echo '</table><br clear="all">'; 313 } 314 } 315 316 function _renderPhone(&$phone) 317 { 318 if ($this->isBrowser('imode')) { 319 // Create phoneto: link for i-Mode. 320 printf('<p><a href="phoneto:%s">%s</a></p>', 321 $phone->get('number'), $phone->get('label')); 322 } elseif ($this->isBrowser('mml')) { 323 // Create tel: link for MML. 324 printf('<p><a href="tel:%s">%s</a></p>', 325 $phone->get('number'), $phone->get('label')); 326 } else { 327 // Display phone number as plain text. 328 printf('<p><big>%s</big></p>', $phone->get('label')); 329 } 330 } 331 332 function _renderRule(&$rule) 333 { 334 $width = $rule->get('width'); 335 $size = $rule->get('size'); 336 337 echo '<hr' . ($width ? ' width="' . $width . '"' : '') . ($size ? ' size="' . $size . '"' : '') . " />\n"; 338 } 339 340 function _getMode($mode) 341 { 342 switch ($mode) { 343 case 'katakana': 344 return ' mode="katakana"'; 345 346 case 'hiragana': 347 return ' mode="hiragana"'; 348 349 case 'numeric': 350 return ' mode="numeric"'; 351 352 case 'alpha': 353 default: 354 return ' mode="alphabet"'; 355 } 356 } 357 358 }
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sun Feb 25 18:01:28 2007 | par Balluche grâce à PHPXref 0.7 |