OSDN Git Service

初回コミット(v2.6.17.1)
[magic3/magic3.git] / include / lib / patTemplate / patTemplate / Dump / Html.php
1 <?PHP
2 /**
3  * Dumps templates as HTML
4  *
5  * $Id: Html.php 440 2008-03-30 09:00:16Z fishbone $
6  *
7  * @package             patTemplate
8  * @subpackage  Dump
9  * @author              Sebastian Mordziol <argh@php-tools.net>
10  * @author              Stephan Schmidt <schst@php.net>
11  */
12
13 /**
14  * Dumps templates as HTML
15  *
16  * @package             patTemplate
17  * @subpackage  Dump
18  * @author              Sebastian Mordziol <argh@php-tools.net>
19  * @author              Stephan Schmidt <schst@php.net>
20  *
21  * @todo                move this into patTemplate_Dump_Dhtml and keep it free from javascript
22  */
23 class patTemplate_Dump_Html extends patTemplate_Dump
24 {
25         var $colors     =       array(
26                 'borders'                       =>      'C8D3DA',
27                 'headerFills'           =>      'E1E7EB',
28                 'subHeaderFills'        =>      'F0F2F4',
29                 'source'                        =>      'F5F7F8',
30                 'linkNormal'            =>      '8CA0B4',
31                 'linkHover'                     =>      '8BC3E0',
32         );
33         
34         var $_useBorders        =       false;
35
36    /**
37         * display the header
38         *
39         * @access       public
40         */
41         function displayHeader()
42         {
43                 echo '<html>';
44                 echo ' <head>';
45                 echo '  <style type="text/css">';
46                 echo '   BODY,TD{';
47                 echo '          font-family: Arial, Tahoma, sans-serif;';
48                 echo '          font-size: 12px;';
49                 echo '   }';
50                 echo '   TABLE.patTemplate{';
51                 echo '      border-collapse:collapse;';
52                 echo '   }';
53                 echo '   A.patTemplate{';
54                 echo '          color:#'.$this->colors['linkNormal'].';';
55                 echo '   }';
56                 echo '   A.patTemplate:hover{';
57                 echo '          color:#'.$this->colors['linkHover'].';';
58                 echo '   }';
59                 echo '   H1.patTemplate{';
60                 echo '          margin: 0px;';
61                 echo '          padding: 4px;';
62                 echo '          font-size: 18px;';
63                 echo '   }';
64                 echo '   I.patTemplate{';
65                 echo '          font-style:italic;';
66                 echo '          color:#777777;';
67                 echo '   }';
68                 echo '   H2.patTemplate{';
69                 echo '          background-color: #'.$this->colors['headerFills'].';';
70                 echo '          margin: 0px;';
71                 echo '          margin-bottom: 15px;';
72                 echo '          padding: 4px;';
73                 echo '          border-bottom: 1px dashed #'.$this->colors['borders'].';';
74                 echo '          border-top: 1px dashed #'.$this->colors['borders'].';';
75                 echo '          font-size: 14px;';
76                 echo '   }';
77                 echo '   H3.patTemplate,H3.patTemplateSub{';
78                 echo '          background-color: #'.$this->colors['headerFills'].';';
79                 echo '          margin: 0px;';
80                 echo '          padding: 4px;';
81                 echo '          border-bottom: 1px dashed #'.$this->colors['borders'].';';
82                 echo '          border-top: 1px dashed #'.$this->colors['borders'].';';
83                 echo '          font-size: 12px;';
84                 echo '          font-weight: bold;';
85                 echo '   }';
86                 echo '   H3.patTemplateSub{';
87                 echo '          background-color: #'.$this->colors['subHeaderFills'].';';
88                 echo '          border:1px dashed #'.$this->colors['borders'].';';
89                 echo '          font-weight:normal;';
90                 echo '          margin-bottom:3px;';
91                 echo '   }';
92                 echo '   #patTemplateContent{';
93                 echo '          width: 100%;';
94                 echo '          background-color:#ffffff;';
95                 echo '          border:dashed 1px #'.$this->colors['borders'].';';
96                 echo '          padding:0px;';
97                 echo '   }';
98                 echo '   .patTemplateSection{';
99                 echo '      margin-bottom:20px;';
100                 echo '   }';
101                 echo '   .patTemplateSubSection{';
102                 echo '      margin-bottom:3px;';
103                 echo '   }';
104                 echo '   .patTemplateData{';
105                 echo '      display:none;';
106                 echo '   }';
107                 echo '   .patTemplatePropBorder{';
108                 echo '      white-space:nowrap;';
109                 echo '          font-weight:bold;';
110                 echo '      color:#333333;';
111                 echo '      border:solid 1px #C8D3DA;';
112                 echo '   }';
113                 echo '   .patTemplateProp{';
114                 echo '      white-space:nowrap;';
115                 echo '          font-weight:bold;';
116                 echo '      color:#333333;';
117                 echo '   }';
118                 echo '   .patTemplateSign{';
119                 echo '      font-family:monospace;';
120                 echo '   }';
121                 echo '   .patTemplateClick{';
122                 echo '      cursor:pointer;';
123                 echo '   }';
124                 echo '   .patTemplateCol{';
125                 echo '      margin-bottom:8px;';
126                 echo '      font-weight:bold;';
127                 echo '   }';
128                 echo '   .patTemplateTblCol{';
129                 echo '      padding:8px;';
130                 echo '      padding-right:15px;';
131                 echo '      border-right:dashed 1px #'.$this->colors['borders'].';';
132                 echo '   }';
133                 echo '   .patTemplateTmplContent{';
134                 echo '      padding:8px;';
135                 echo '      border-top:dashed 1px #'.$this->colors['borders'].';';
136                 echo '   }';
137                 echo '   .patTemplateSource{';
138                 echo '      padding:5px;';
139                 echo '      font-family:monospace;';
140                 echo '      background-color:#'.$this->colors['source'].';';
141                 echo '      margin-bottom:8px;';
142                 echo '   }';
143                 echo '   .patTemplateVar{';
144                 echo '          color: #009900;';
145                 echo '      font-weight:bold;';
146                 echo '   }';
147                 echo '   .patTemplateVarBorder{';
148                 echo '          color: #009900;';
149                 echo '      font-weight:bold;';
150                 echo '      border:solid 1px #C8D3DA;';
151                 echo '   }';
152                 echo '   .patTemplateVal{';
153                 echo '          color:#333333;';
154                 echo '   }';
155                 echo '   .patTemplateValBorder{';
156                 echo '          color: #333333;';
157                 echo '      border:solid 1px #C8D3DA;';
158                 echo '   }';
159                 echo '   .patTemplateTmpl {';
160                 echo '          color: #990000;';
161                 echo '      font-weight:bold;';
162                 echo '      cursor:pointer;';
163                 echo '   }';
164                 echo '  </style>';
165                 echo ' <script language="JavaScript1.2" type="text/javascript">';
166                 echo '   var tmpls = new Array();';
167                 echo '   function patTemplateToggle( tmplName )';
168                 echo '   {';
169                 echo '      var el = document.getElementById( \'tmpl-\' + tmplName );';
170                 echo '      if( el.style.display == \'block\' )';
171                 echo '        patTemplateCollapse( tmplName );';
172                 echo '      else';
173                 echo '        patTemplateExpand( tmplName );';
174                 echo '   }';
175                 echo '   function jump( tmplName )';
176                 echo '   {';
177                 echo '      tmplName = tmplName.toLowerCase();';
178                 echo '      patTemplateExpand( tmplName );';
179                 echo '      document.location = \'#\' + tmplName';
180                 echo '   }';
181                 echo '   function patTemplateExpandAll()';
182                 echo '   {';
183                 echo '          for( var i = 0; i < tmpls.length; i++ )';
184                 echo '        patTemplateExpand( tmpls[i] );';
185                 echo '   }';
186                 echo '   function patTemplateCollapseAll()';
187                 echo '   {';
188                 echo '          for( var i = 0; i < tmpls.length; i++ )';
189                 echo '        patTemplateCollapse( tmpls[i] );';
190                 echo '   }';
191                 echo '   function patTemplateExpand( tmplName )';
192                 echo '   {';
193                 echo '      var el1 = document.getElementById( \'tmpl-\' + tmplName );';
194                 echo '      var el2 = document.getElementById( \'tmpl-\' + tmplName + \'-sign\' );';
195                 echo '      el1.style.display = \'block\';';
196                 echo '      el2.innerHTML = \'[-]\';';
197                 echo '   }';
198                 echo '   function patTemplateCollapse( tmplName )';
199                 echo '   {';
200                 echo '      var el1 = document.getElementById( \'tmpl-\' + tmplName );';
201                 echo '      var el2 = document.getElementById( \'tmpl-\' + tmplName + \'-sign\' );';
202                 echo '      el1.style.display = \'none\';';
203                 echo '      el2.innerHTML = \'[+]\';';
204                 echo '   }';
205                 echo '   function patTemplateAddTmpl( tmplName )';
206                 echo '   {';
207                 echo '      tmpls.push( tmplName );';
208                 echo '   }';
209                 echo ' </script>';
210                 echo ' </head>';
211                 echo '<body>';
212                 echo ' <div id="patTemplateContent">';
213                 echo ' <h1 class="patTemplate">patTemplate Dump</h1>';
214         }
215
216    /**
217         * dump the global variables
218         *
219         * @access       public
220         * @param        array           array containing all global variables
221         */
222         function dumpGlobals( $globals )
223         {
224                 echo '<div class="patTemplateSection"><h2 class="patTemplate">Global template variables ('.count( $globals ).')</h2>';
225                 if( !empty( $globals ) )
226                 {
227                         echo '<div class="patTemplateSubSection" style="padding:5px;">';
228                         echo '  <table border="0" cellpadding="0" cellpadding="0" class="patTemplate">';
229                         foreach( $globals as $key => $value )
230                         {
231                                 $this->_displayLine( $key, $value );
232                         }
233                         echo '  </table>';
234                         echo '</div></div>';
235                 }
236         }
237
238    /**
239         * dump the templates
240         *
241         * @access       public
242         * @param        array   templates
243         */
244         function dumpTemplates( $templates, $vars )
245         {
246                 $templates = array_reverse( $templates );
247
248                 echo '<div class="patTemplateSection"><h2 class="patTemplate">Templates ('.count( $templates ).') &nbsp; <span style="font-size:12px;font-weight:normal;"><a href="javascript:patTemplateExpandAll();" class="patTemplate">Expand all</a> | <a href="javascript:patTemplateCollapseAll();" class="patTemplate">Collapse all</a></span></h2>';
249                 echo '<div class="patTemplateData">Dumping selected templates...</div>';
250                 
251                 foreach( $templates as $name => $tmpl )
252                 {
253                         if( !isset( $vars[$name] ) )
254                                 $vars[$name] = array();
255
256                         $vars[$name] = $this->_flattenVars( $vars[$name] );
257
258                         echo '<div class="patTemplateSubSection">';
259                         echo '  <h3 class="patTemplate" onclick="patTemplateToggle(\''.$name.'\');" style="cursor:pointer;"><span id="tmpl-'.$name.'-sign" class="patTemplateSign">[+]</span> Template <a name="'.$name.'">"'.$name.'"</a></h3>';
260                         echo '  <div class="patTemplateData" id="tmpl-'.$name.'">';
261                         echo '    <script language="JavaScript1.2" type="text/javascript">';
262                         echo '      patTemplateAddTmpl( \''.$name.'\' );';
263                         echo '    </script>';
264                         echo '    <table cellpadding="0" cellspacing="0" border="0">';
265                         echo '      <tr valign="top">';
266                         echo '        <td style="width:200px;" class="patTemplateTblCol">';
267
268                                                         $this->_displayAttributes( $tmpl, $name );
269
270                         echo '        </td>';
271                         echo '        <td class="patTemplateTblCol" style="width:130px;">';
272
273                                                         $this->_displayTemplateState( $tmpl );                  
274
275                         echo '        </td>';
276                         echo '        <td class="patTemplateTblCol" style="width:130px;">';
277                         echo '          <div class="patTemplateCol">Dependencies</div>';
278
279                                                         if( !empty( $tmpl['dependencies'] ) )
280                                                         {
281                                                                 $dependencies = array();
282                                                                 foreach( $tmpl['dependencies'] as $dependency )
283                                                                         array_push( $dependencies, '<a href="javascript:jump( \''.$dependency.'\' );" class="patTemplate">'.$dependency.'</a>' );
284                                         
285                                                                 echo implode( '<br>', $dependencies );
286                                                         }
287                                                         else
288                                                         {
289                                                                 echo '<i class="patTemplate">[none]</i>';
290                                                         }
291
292                         echo '        </td>';
293                         echo '      </tr>';
294                         echo '    </table>';
295
296                         
297                         /**
298                          * ------------------------------------------------------------------
299                          * display variables
300                          */
301                         $nestedTypes = array(
302                                 'condition',
303                                 'modulo',
304                         );
305                         
306                         if( in_array( $tmpl['attributes']['type'], $nestedTypes ) )
307                         {
308                                 $content = '';
309                                 
310                                 foreach( $tmpl['subtemplates'] as $subName => $subDetails )
311                                 {
312                                         $content .= $subDetails['data'];
313                                 }
314                         }
315                         else
316                         {
317                                 $content = $tmpl['content'];
318                         }
319                         
320                         $setVars = $this->_extractVars( $content );
321
322                         echo '<div class="patTemplateTmplContent">';
323                         echo '  <div class="patTemplateCol">Variables</div>';
324                                         $this->_displayVariables( $tmpl, $name, $setVars, $vars );
325                         echo '</div>';
326
327                         if( !empty( $tmpl['comments'] ) )
328                         {
329                                 echo '    <div class="patTemplateTmplContent">';
330                                 echo '      <div class="patTemplateCol">Comments</div>';
331                                 echo '      <div style="margin-bottom:7px;">';
332                                                           echo implode( '<br>', $tmpl['comments'] );
333                                 echo '      </div>';
334                                 echo '    </div>';
335                         }
336                         
337                         /**
338                          * ------------------------------------------------------------------
339                          * display template content
340                          */
341                         echo '    <div class="patTemplateTmplContent">';
342                         switch( $tmpl['attributes']['type'] )
343                         {
344                                 case 'condition':
345                                 case 'modulo':
346                                         $this->_displayConditions( $tmpl, $name, $vars );
347                                         break;
348
349                                 default:
350                                         echo '      <div class="patTemplateCol">Content</div>';
351                                         echo '      <div class="patTemplateSource"><pre>'.$this->_highlightVars( htmlspecialchars( $tmpl['content'] ), $vars[$name] ).'</pre></div>';
352                                         break;
353                         }
354
355                         echo '    </div>';
356                         echo '  </div>';
357                         echo '</div>';
358                 }
359                 
360                 echo '</div>';
361         }
362         
363         function _displayVariables( $tmpl, $tmplName, $setVars, $vars )
364         {
365                 if( empty( $setVars ) )
366                 {
367                         echo '<i class="patTemplate">[none]</i>';
368                         return true;
369                 }
370                 
371                 echo '<table border="0" cellpadding="3" cellpadding="0" class="patTemplate">';
372                 $this->_useBorders( true );
373                 $this->_displayHead( 'Name', 'Assigned value', 'Modifier' );
374
375                 foreach( $setVars as $var )
376                 {
377                         if( isset( $vars[$tmplName][$var] ) )
378                                 $value = $vars[$tmplName][$var];
379                         else
380                                 $value = '<i class="patTemplate">[no value set]</i>';
381
382                         if( isset( $tmpl['modifyVars'][$var] ) )
383                         {
384                                 $params =       array();
385                                 foreach( $tmpl['modifyVars'][$var]['params'] as $n => $val )
386                                 {
387                                         array_push( $params, $n.'="'.$val.'"' );
388                                 }
389                                 $modifier = sprintf( '%s( %s )', $tmpl['modifyVars'][$var]['mod'], implode( ', ', $params ) );
390                         }
391                         else
392                         {
393                                 $modifier = '<i class="patTemplate">[none]</i>';
394                         }
395                                 
396                         $this->_displayLine( $var, $value, $modifier );
397                 }
398                 echo '</table>';
399
400                 $this->_useBorders( false );
401         }
402         
403         function _displayConditions( $tmpl, $tmplName, $vars )
404         {
405                 foreach( $tmpl['subtemplates'] as $cond => $spec )
406                 {
407                         echo '  <h3 class="patTemplateSub" onclick="patTemplateToggle(\'Cond'.$cond.'\');" style="cursor:pointer;"><span id="tmpl-Cond'.$cond.'-sign" class="patTemplateSign">[+]</span> Subtemplate <a name="Cond'.$cond.'">"'.$cond.'"</a></h3>';
408                         echo '  <div class="patTemplateData" id="tmpl-Cond'.$cond.'" style="margin-bottom:15px;">';
409                         echo '    <script language="JavaScript1.2" type="text/javascript">';
410                         echo '      patTemplateAddTmpl( \'Cond'.$cond.'\' );';
411                         echo '    </script>';
412                         
413                         if( !empty( $spec['comments'] ) )
414                         {
415                                 echo '    <div class="patTemplateCol">Comments</div>';
416                                 echo '    <div style="margin-bottom:7px;">';
417                                                         echo implode( '<br>', $spec['comments'] );
418                                 echo '    </div>';
419                         }
420
421                                 echo '    <div class="patTemplateCol">Dependencies</div>';
422                                 echo '    <div style="margin-bottom:7px;">';
423                         if( !empty( $spec['dependencies'] ) )
424                         {
425                                 $dependencies = array();
426                                 foreach( $spec['dependencies'] as $dependency )
427                                         array_push( $dependencies, '<a href="javascript:jump( \''.$dependency.'\' );" class="patTemplate">'.$dependency.'</a>' );
428         
429                                 echo implode( ', ', $dependencies );
430                         }
431                         else
432                         {
433                                 echo '<i class="patTemplate">[none]</i>';
434                         }
435                                 echo '    </div>';
436                         
437                         echo '    <div class="patTemplateCol">Content</div>';
438                         echo '    <div class="patTemplateSource"><pre>'.$this->_highlightVars( htmlspecialchars( $spec['data'] ), $vars[$tmplName] ).'</pre></div>';
439                         echo '  </div>';
440                 }
441         }
442         
443    /**
444     * display the attributes of a template
445     *
446     * @access   private
447     * @param    array       template data
448     * @param    string      name of the template
449     */
450         function _displayAttributes( $tmpl, $tmplName = null )
451         {
452                 echo '<div class="patTemplateCol">Attributes</div>';
453                 echo '<table border="0" cellpadding="0" cellpadding="0">';
454                 
455                 /**
456                  * type
457                  */
458                 switch( $tmpl['attributes']['type'] )
459                 {
460                         case 'modulo':
461                                 if( $tmpl['attributes']['modulo'] == 2 )
462                                         $type = 'OddEven';
463                                 else
464                                         $type = 'modulo (' . $tmpl['attributes']['modulo'] . ')';
465                         case 'condition':
466                                 if( !isset( $type ) )
467                                         $type   =       'condition';
468
469                                 $this->_displayLine( 'Type', $tmpl['attributes']['type'] );
470                                 /**
471                                  * condition variable, only used in condition templates
472                                  */
473                                 if( isset( $tmpl['attributes']['conditionvar'] ) )
474                                 {
475                                         if( isset( $tmpl['attributes']['conditiontmpl'] ) )
476                                                 $this->_displayLine( 'ConditionVar', $tmpl['attributes']['conditiontmpl'].'.'.$tmpl['attributes']['conditionvar'] );
477                                         elseif( isset( $tmpl['attributes']['useglobals'] ) && $tmpl['attributes']['useglobals'] == 'yes' )
478                                                 $this->_displayLine( 'ConditionVar', '__globals.'.$tmpl['attributes']['conditionvar'] );
479                                         else
480                                                 $this->_displayLine( 'ConditionVar', $tmpl['attributes']['conditionvar'] );
481                                 }
482                                 break;
483
484                         case 'simplecondition':
485                                 $this->_displayLine( 'Type', 'simplecondition' );
486                                 $requiredvars = array();
487                                 foreach ($tmpl['attributes']['requiredvars'] as $tmp) {
488                                     if ($tmp[0] !== $tmplName) {
489                                         $var = $tmp[0] . '.' . $tmp[1];
490                                     } else {
491                                         $var = $tmp[1];
492                                     }
493                                     if ($tmp[2] !== null) {
494                                         $var = $var . '='.$tmp[2];
495                                     }
496                                     array_push($requiredvars, $var);
497                                 }
498                                 
499                                 $this->_displayLine( 'RequiredVars', implode( ', ', $requiredvars ) );
500
501                                 break;
502                         default:
503                                 $this->_displayLine( 'Type', $tmpl['attributes']['type'] );
504                 }
505
506                 /**
507                  * standard attributes
508                  */
509                 $this->_displayLine( 'Visibility', $tmpl['attributes']['visibility'] );
510                 $this->_displayLine( 'WhiteSpace', $tmpl['attributes']['whitespace'] );
511                 $this->_displayLine( 'AddSystemVars', $tmpl['attributes']['addsystemvars'] );
512                 $this->_displayLine( 'UnusedVars', $tmpl['attributes']['unusedvars'] );
513
514                 /**
515                  * external source
516                  */
517                 if( isset( $tmpl['attributes']['src'] ) )
518                         $this->_displayLine( 'External Src', $tmpl['attributes']['src'] );
519                 /**
520                  * varscope
521                  */
522                 if (isset($tmpl['attributes']['varscope'])) {
523             if (is_array($tmpl['attributes']['varscope'])) {
524                 $this->_displayLine( 'Varscope', implode(', ', $tmpl['attributes']['varscope'] ) );     
525             } else {
526                 $this->_displayLine( 'Varscope', $tmpl['attributes']['varscope'] );     
527             }
528                 }
529
530                 echo '          </table>';
531         }
532         
533         function _displayTemplateState( $tmpl )
534         {
535                         echo '          <div class="patTemplateCol">States</div>';
536                         echo '          <table border="0" cellpadding="0" cellpadding="0">';
537                                                         $this->_displayLine( 'Loaded', $tmpl['loaded'] );
538                                                         $this->_displayLine( 'Parsed', $tmpl['parsed'] );
539                         echo '          </table>';
540         }
541
542    /**
543         * hilight variables in a template
544         *
545         * @access       private
546         * @param        string          template content
547         * @return       string          template content
548         */
549         function _highlightVars( $template, $vars )
550         {
551                 $pattern  = '/('.$this->_tmpl->getStartTag().'TMPL\:([^a-z]+)'.$this->_tmpl->getEndTag().')/U';
552                 $template = preg_replace( $pattern, '<span class="patTemplateTmpl" onclick="jump(\'\2\')" title="Click to view the dependency \'\2\'.">\1</span>', $template );
553                 
554                 $pattern = '/('.$this->_tmpl->getStartTag().'([^a-z:]+)'.$this->_tmpl->getEndTag().')/U';
555                 $matches = array();
556                 preg_match_all( $pattern, $template, $matches );
557                 for( $i = 0; $i < count( $matches[1] ); $i++ )
558                 {
559                         if( isset( $vars[$matches[2][$i]] ) )
560                         {
561                                 $value = $vars[$matches[2][$i]];
562                         }
563                         else
564                         {
565                                 $value = '[No value set]';
566                         }
567                         $replace  = '<span class="patTemplateVar" title="'.$value.'">'.$matches[1][$i].'</span>';
568                         $template = str_replace( $matches[1][$i], $replace, $template );
569                 }
570                 return $template;
571         }
572         
573    /**
574         * display a table header
575         *
576         * @access       private
577         * @param        string          property
578         * @param        mixed           value, you may pass more than one value
579         */
580         function _displayHead()
581         {
582                 $args           =       func_get_args();
583
584                 echo '  <tr valign="top">';
585                 foreach( $args as $head )
586                 {
587                         printf( '   <td class="'.$this->_getClassName( 'patTemplateProp' ).'">%s</td>', $head );
588                 }
589                 echo '  </tr>';
590         }
591         
592         function _getClassName( $class )
593         {
594                 if( !$this->_useBorders )
595                         return $class;
596                         
597                 return $class .= 'Border';
598         }
599         
600    /**
601         * sets whether to draw borders in the tables generated via the
602         * {@link _displayHead()} and {@link _displayLine()} methods.
603         *
604         * @access       private
605         * @param        bool            $state  Whether to draw the borders. true=draw, false=don't draw
606         */
607         function _useBorders( $state )
608         {
609                 $this->_useBorders = $state;
610         }
611         
612    /**
613         * display a line in a table
614         *
615         * @access       private
616         * @param        string          property
617         * @param        mixed           value, you may pass more than one value
618         */
619         function _displayLine( $prop, $value )
620         {
621                 $args   =       func_get_args();
622                 $prop   =       array_shift( $args );
623
624                 echo '  <tr valign="top">';
625                 printf( '   <td class="'.$this->_getClassName( 'patTemplateProp' ).'">%s</td>', $prop );
626                 if( count( $args ) == 1 )
627                 {
628                         echo '   <td class="'.$this->_getClassName( 'patTemplateVal' ).'">&nbsp;:&nbsp;</td>';
629                 }
630                 
631                 foreach( $args as $value )
632                 {
633                         if( is_bool( $value ) )
634                         {
635                                 $value = ( $value === true ) ? 'yes' : 'no';
636                         }
637                         
638                         printf( '   <td class="'.$this->_getClassName( 'patTemplateVal' ).'">%s</td>', $value );
639                 }
640                 echo '  </tr>';
641         }
642         
643    /**
644         * display the footer
645         *
646         * @access       public
647         */
648         function displayFooter()
649         {
650                 echo ' </div>';
651                 echo ' </body>';
652                 echo '</html>';
653         }
654 }
655 ?>