/[cvs]/nfo/php/libs/com.newsblob.phphtmllib/widgets/HTMLPageClass.inc
ViewVC logotype

Contents of /nfo/php/libs/com.newsblob.phphtmllib/widgets/HTMLPageClass.inc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (show annotations)
Thu May 6 16:27:41 2004 UTC (20 years, 2 months ago) by jonen
Branch: MAIN
CVS Tags: HEAD
Changes since 1.3: +61 -7 lines
 updated all to v2.4.1 - Apr 01, 2004

1 <?php
2
3 /**
4 * This contains the HTMLPageClass widget
5 *
6 * $Id: HTMLPageClass.inc,v 1.29 2003/09/30 00:41:40 hemna Exp $
7 *
8 * @author Walter A. Boring IV <waboring@buildabetterweb.com>
9 * @package phpHtmlLib
10 *
11 */
12
13 /**
14 * Get all the required files for this class
15 */
16 require_once($phphtmllib."/HTMLTagClass.inc");
17
18
19 /**
20 * class the constructs and renders an entire
21 * HTML/XHTML document.
22 *
23 * @author Walter A. Boring IV <waboring@buildabetterweb.com>
24 * @package phpHtmlLib
25 */
26 class HTMLPageClass {
27
28 /**
29 * HEADtag object that holds all content
30 * for the head.
31 * @var object
32 * @access private
33 */
34 var $_head = NULL;
35
36 /**
37 * TITLEtag object that holds the title
38 * of the page.
39 * @var object
40 * @access private
41 */
42 var $_title = NULL;
43
44 /**
45 * SCRIPTtag object that holds javascript
46 * code for the head tag.
47 * @var object
48 * @access private
49 */
50 var $_head_js = NULL;
51
52 /**
53 * STYLEtag object that holds css code
54 * for the head.
55 * @var object
56 * @access private
57 */
58 var $_head_style = NULL;
59
60 /**
61 * holds an array of LINKtag objects
62 * in the head tag that reference an
63 * external stylesheet file.
64 * @var array.
65 * @access private
66 */
67 var $_head_css_link_arr = array();
68
69 /**
70 * holds an array of SCRIPTtag objects
71 * in the head tag that reference an
72 * an extern javascript file.
73 * @var array
74 * @access private
75 */
76 var $_head_js_link_arr = array();
77
78 /**
79 * character set to be used in this
80 * page. This gets automatically
81 * placed in the Content-Type
82 * META tag.
83 * @var string
84 * @access private
85 */
86 var $_charset = "iso-8859-1";
87
88
89 /**
90 * The encoding of the XHTML
91 * XML tag
92 */
93 var $_xml_encoding = "UTF-8";
94
95 /**
96 * BODYtag object that holds all content
97 * for the body tag.
98 * @var object
99 * @access private
100 */
101 var $_body = NULL;
102
103 /**
104 * DOCTYPEag object that sets the document
105 * type. This gets rendered prior to <html>
106 * @var object
107 * @access private
108 */
109 var $_doctype = NULL;
110
111 /**
112 * flag to tell the class to try and
113 * change the http headers to output
114 * document of type text, instead of
115 * html. This is helpfull for debugging.
116 * @var boolean
117 * @access private
118 */
119 var $_text_debug = FALSE;
120
121 /**
122 * This holds a FRAMESETtag object.
123 * This is used if the person is trying
124 * to render a frameset page.
125 *
126 * @var FRAMESETtag object.
127 * @access private
128 */
129 var $_frameset = NULL;
130
131
132 /**
133 * This holds the text used to display
134 * a body content when a browser doesn't
135 * support framesets
136 *
137 * @var string
138 * @access private
139 */
140 var $_noframes_text = "Sorry, your browser does not support frames";
141
142
143 /**
144 * This holds the attributes for the
145 * <html> tag.
146 *
147 * @var array
148 */
149 var $_html_attributes = array();
150
151 /**
152 * keeps track of which widgets we have
153 * automatically pulled in css for
154 *
155 * @var array
156 */
157 var $_widget_css_auto = array();
158
159 /**
160 * keeps track of which widgets we have
161 * automatically pulled in js for
162 *
163 * @var array
164 */
165 var $_widget_js_auto = array();
166
167
168 /**
169 * Holds the value of the indent
170 * style the user wants to render
171 * the page w/
172 *
173 * @var int
174 */
175 var $_indent_style = 0;
176
177 /**
178 * keeps track of the html
179 * render type.
180 *
181 * @var string
182 */
183 var $_html_render_type = HTML;
184
185 /**
186 * The favicon params
187 * @var array
188 */
189 var $_favicon = array("href" => "/favicon.ico",
190 "type" => "images/x-ico",
191 "enabled" => FALSE);
192
193
194
195 /**
196 * Class Constructor
197 * @param mixed - $title Title string or TITLEtag object for the page.
198 * @param string - one of 3 types of html to render. Setting this will
199 * make the object declare the gobal define which tells
200 * all of the tag objects what type of html tags to render.
201 * some tags support special features. such as the <IMG>
202 * tag. If xhtml is selected, the the IMGtag object and all
203 * utility functions will not render "border=0" as a default
204 * attribute, since this is not proper xhtml.
205 * "html" - HTML 4.0 (default)
206 * "xhtml_transitional" - render xhtml instead of html
207 * - doctype is XHTML transitional.
208 * "xhtml_strict" - render xhtml instead of html 4.0.
209 * - doctype is XHTML strict.
210 * @param int - one of 2 types. INDENT_NICE or INDENT_LEFT_JUSTIFY
211 * This tells the page how to render the indenting of the
212 * output. By default it is set to INDENT_NICE, which nicely
213 * indents each nested tag. You can have all tags rendered
214 * left justified (smaller size in output) by using
215 * INDENT_LEFT_JUSTIFY
216 *
217 * @access public
218 */
219 function HTMLPageClass($title=NULL, $html_type=HTML, $indent_style=INDENT_NICE) {
220
221 switch ($html_type) {
222 case HTML:
223 default:
224 $this->build_doctype("-//W3C//DTD HTML 4.01 Transitional//EN",
225 "http://www.w3.org/TR/html4/loose.dtd");
226 $this->_html_render_type = $GLOBALS["HTML_RENDER_TYPE"] = HTML;
227 break;
228
229 case XHTML_STRICT:
230 $this->build_doctype("-//W3C//DTD XHTML 1.0 Strict//EN",
231 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd");
232 $this->_html_render_type = $GLOBALS["HTML_RENDER_TYPE"] = XHTML_STRICT;
233 $this->set_html_attributes( array( "xmlns" => "http://www.w3.org/1999/xhtml",
234 "xml:lang" => "en",
235 "lang" => "en") );
236 break;
237
238 case XHTML:
239 case XHTML_TRANSITIONAL:
240 $this->build_doctype("-//W3C//DTD XHTML 1.0 Transitional//EN",
241 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd");
242 $this->_html_render_type = $GLOBALS["HTML_RENDER_TYPE"] = XHTML;
243 $this->set_html_attributes( array( "xmlns" => "http://www.w3.org/1999/xhtml",
244 "xml:lang" => "en",
245 "lang" => "en") );
246 break;
247
248 //What else needs to be done to properly support
249 //XHTML frameset? TODO LIST for 1.1
250 case XHTML_FRAMESET:
251 $this->build_doctype("-//W3C//DTD XHTML 1.0 Frameset//EN",
252 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd");
253 $this->_html_render_type = $GLOBALS["HTML_RENDER_TYPE"] = XHTML_FRAMESET;
254 break;
255 }
256
257 $this->_head = new HEADtag;
258 $this->_head_js = html_script();
259 $this->_head_style = html_style();
260 $this->_create_body();
261 if ($title != NULL) {
262 $this->set_title( $title );
263 }
264
265 $this->_indent_style = $indent_style;
266 }
267
268 //**************************************************
269 //* HEAD tag related functions
270 //**************************************************
271
272
273 /**
274 * this adds content to the head tag
275 * of the page
276 *
277 * @param mixed - any content to add
278 */
279 function add_head_content( ) {
280 $num_args = func_num_args();
281 for ($i=0;$i<$num_args;$i++) {
282 $this->_head->add(func_get_arg($i));
283 }
284 }
285
286 /**
287 * Same ass add_head_content()
288 *
289 * @deprecated - use add_head_content();
290 */
291 function push_head_content( ) {
292 $args = func_get_args();
293 call_user_func_array( array(&$this, "add_head_content"), $args);
294 }
295
296
297 /**
298 * adds raw javascript to the head which
299 * will automatically get wrapped in a
300 * <script language="JavaScript"> tag.
301 * @param mixed $content - raw javascript code to add to the head
302 */
303 function add_head_js( $content ) {
304 $this->_head_js->push( $content );
305 }
306
307 /**
308 * Same ass add_head_js()
309 *
310 * @deprecated - use add_head_js();
311 */
312 function push_head_js( $content ) {
313 $this->add_head_js( $content );
314 }
315
316 /**
317 * this function adds raw css to the
318 * <head> tag. It will automatically
319 * be wrapped in a <style type="text/css">
320 *
321 * @param string - the raw css
322 */
323 function add_head_css( $css ) {
324 $this->_head_style->push( $css );
325 }
326
327 /**
328 * set the title of the page output.
329 * @param mixed $title - the title of the html page
330 * can be TITLEtag object.
331 *
332 */
333 function set_title( $title ) {
334 if (is_object($title)) {
335 if ($title->_tag == "title") {
336 $this->_title = $title;
337 } else {
338 //they did something funky here.
339 return -1;
340 }
341 } else {
342 $this->_title = html_title( $title );
343 }
344 }
345
346 /**
347 * pushes a css external reference to the head area
348 * @param mixed $link - link tag object or $url for a css.
349 */
350 function add_css_link( $link ) {
351 if (is_object($link)) {
352 $css = $link;
353 } else {
354 $css = html_link($link, "stylesheet", "text/css");
355 }
356 $this->_head_css_link_arr[] = $css;
357 }
358
359 /**
360 * Same ass add_css_link()
361 *
362 * @deprecated - use add_css_link();
363 */
364 function push_css_link( $link ) {
365 $this->add_css_link( $link );
366
367 }
368
369 /**
370 * This adds a link to an external Javascript
371 * file, which will get rendered in the head.
372 *
373 * @param mixed $link - script tag object or $url of .js file.
374 */
375 function add_js_link( $link ) {
376 if (is_object($link)) {
377 $js = $link;
378 } else {
379 $js = html_script($link);
380 }
381 $this->_head_js_link_arr[] = $js;
382 }
383
384 /**
385 * same as add_js_link()
386 *
387 * @deprecated
388 */
389 function push_js_link( $link ) {
390 $this->add_js_link( $link );
391 }
392
393 /**
394 * Automatically set a page meta tag refresh
395 * @param int $time - time in seconds to refresh
396 * @param string $url - the url to go to.
397 */
398 function set_refresh( $time, $url=NULL ) {
399 if ($url) {
400 $time .= ";url=$url";
401 }
402 $this->push_head_content( html_meta($time, "refresh") );
403 }
404
405 /**
406 * set the character set
407 * @param string $charset - the charset for the meta tag
408 *
409 */
410 function set_charset( $charset ) {
411 $this->_charset = $charset;
412 }
413
414 /**
415 * This sets the encoding type for
416 * XHTML documents
417 *
418 * @param string - the encoding parameter
419 */
420 function set_encoding( $encoding ) {
421 $this->_xml_encoding = $encoding;
422 }
423
424 /**
425 * This method sets the lang, and xml:lang
426 * setting in the HTML tag.
427 *
428 * @param string - the language
429 */
430 function set_language( $language ) {
431 $this->_html_attributes["xml:lang"] = $language;
432 $this->_html_attributes["lang"] = $language;
433 }
434
435 /**
436 * This function is used to set the FRAMSETtag
437 * object for this page. This automatically
438 * sets the output for this page object to
439 * be a frameset.
440 *
441 * @param FRAMESETtag object - $frameset
442 */
443 function set_frameset( $frameset ) {
444 if (is_object($frameset)) {
445 if ($frameset->get_tag() == "frameset") {
446 $this->_frameset = $frameset;
447 }
448 }
449 }
450
451
452 /**
453 * This function returns the
454 * attributes to be used for the
455 * <html> tag.
456 *
457 * @return array();
458 */
459 function get_html_attributes() {
460 return $this->_html_attributes;
461 }
462
463 /**
464 * This function sets the attributes
465 * for the <html> tag
466 *
467 * @param array - the name=>value
468 * pair for the
469 * attributes
470 */
471 function set_html_attributes( $attributes ) {
472 $this->_html_attributes = $attributes;
473 }
474
475
476 /**
477 * this builds the content type meta tag.
478 *
479 */
480 function _build_content_type_tag() {
481 $content_type = "text/html; charset=" . $this->_charset;
482 return html_meta($content_type, "Content-Type");
483 }
484
485 /**
486 * This is used to enable the ability to add the
487 * favicon link in the head of the document.
488 * By default it is off.
489 *
490 * @param boolean TRUE = enable
491 */
492 function set_favicon_flag($flag=TRUE) {
493 $this->_favicon["enabled"] = $flag;
494 }
495
496 /**
497 * This allows you to change the default url/path
498 * for where the favicon.ico lives.
499 * NOTE: calling this method automatically enables the
500 * link in the head to be created.
501 *
502 * @param string the url to the favicon.ico file
503 * @param string the type of the image.
504 * NOTE: Default is image/x-ico
505 */
506 function set_favicon($path, $type="image/x-ico") {
507 $this->_favicon["href"] = $path;
508 $this->_favicon["type"] = $type;
509 $this->set_favicon_flag( TRUE );
510 }
511
512 //**************************************************
513 //* BODY tag related functions
514 //**************************************************
515
516
517 /**
518 * This function adds content to the <body>
519 * area of the page.
520 *
521 * @param mixed - any # of parameters
522 */
523 function add() {
524 $num_args = func_num_args();
525 for ($i=0;$i<$num_args;$i++) {
526 $arg = func_get_arg($i);
527 //see if the arg is an object
528 //and a child of BaseWidget.
529 if (is_object($arg) && is_subclass_of( $arg, "basewidget")) {
530 //see if they have an js they need to include
531 $js = "";
532 $js = $arg->get_javascript();
533 $class_name = get_class($arg);
534 if ($js != "" && !isset($this->_widget_js_auto[$class_name])) {
535 $this->add_head_js( str_replace(chr(9),'', $js) );
536 $this->_widget_js_auto[$class_name] = TRUE;
537 }
538 }
539 $this->_body->add(func_get_arg($i));
540 }
541 }
542
543 /**
544 * Same as add()
545 *
546 * @deprecated - use add()
547 *
548 */
549 function push( ) {
550 $args = func_get_args();
551 call_user_func_array( array(&$this, "add"), $args);
552 }
553
554 /**
555 * Adds the content reference to the <body>
556 * tag for later use.
557 *
558 * @param mixed $content - content to add
559 */
560 function add_reference( &$content ) {
561 $this->_body->push_reference( $content );
562 }
563
564 /**
565 * Same as add()
566 *
567 * @deprecated - use add()
568 *
569 */
570 function push_reference( &$content ) {
571 $this->add_reference( $content );
572 }
573
574 /**
575 * This is responsible for creating the
576 * BODYtag object. We only will
577 * create a new $this->_body if it doesn't
578 * already exist.
579 *
580 */
581 function _create_body() {
582 if ($this->_body == NULL) {
583 $this->_body = new BODYtag;
584 //$this->_body->add( " " );
585 }
586 }
587
588 /**
589 * set attributes of body tag
590 * @param array $attributes the name=>value pairs
591 *
592 */
593 function set_body_attributes( $attributes ) {
594 if (!is_object( $this->_body )) {
595 $this->_create_body();
596 }
597 $this->_body->set_tag_attributes( $attributes );
598 }
599
600 /**
601 * This function is used to build the DOCTYPE
602 * tag for the page. It will automatically
603 * create a DOCTYPE with a document_element of "html"
604 * and a source of "PUBLIC"
605 *
606 * @param string - link1
607 * @param string - link2
608 */
609 function build_doctype($link1, $link2=NULL) {
610 $this->_doctype = xml_doctype("html", "PUBLIC", $link1, $link2);
611 }
612
613 //**************************************************
614 //* General functions
615 //**************************************************
616
617 /**
618 * set the $_text_debug flag
619 * @param $flag - boolean.
620 */
621 function set_text_debug( $flag ) {
622 $this->_text_debug = $flag;
623 }
624
625
626 //**************************************************
627 //* RENDERING of content related functions
628 //**************************************************
629
630 /**
631 * builds the head object and its content.
632 *
633 */
634 function _build_head() {
635
636 $this->_head->add( $this->_build_content_type_tag() );
637
638 if ($this->_title) {
639 $this->_head->add( $this->_title );
640 }
641
642 if ($this->_favicon["enabled"]) {
643 $this->_head->add( html_link($this->_favicon["href"],
644 "shortcut icon",
645 $this->_favicon["type"]));
646 }
647
648 if ( $this->_head_style->count_content() ) {
649 $this->_head->add( $this->_head_style );
650 }
651 if ( $this->_head_js->count_content() ) {
652 $this->_head->add( $this->_head_js );
653 }
654
655 if (count($this->_head_css_link_arr)) {
656 foreach( $this->_head_css_link_arr as $css) {
657 $this->_head->add( $css );
658 }
659 }
660
661 if (count($this->_head_js_link_arr)) {
662 foreach( $this->_head_js_link_arr as $js) {
663 $this->_head->add( $js );
664 }
665 }
666 }
667
668 /**
669 * This builds a frameset body tag
670 * wrapped in a <noframes> tag.
671 *
672 * @return NOFRAMEStag object.
673 */
674 function _frameset_wrap_body() {
675 $noframes = new NOFRAMEStag;
676 $body = new BODYtag;
677 $body->add( $this->_noframes_text );
678 $noframes->add( $body );
679 return $noframes;
680 }
681
682 /**
683 * render the page.
684 *
685 *
686 * @return string the raw html output.
687 */
688 function render() {
689
690 //make sure the render type is correctly
691 //set
692 $GLOBALS["HTML_RENDER_TYPE"] = $this->_html_render_type;
693
694 //lets use ourself to render the debug page!
695 if ($this->_text_debug) {
696 $page = new HTMLPageClass;
697 $page->add_css_link("/phphtmllib/css/HTMLPageClass.css");
698 }
699
700 $newline = " ";
701 $attributes = $this->get_html_attributes();
702 $html = new HTMLtag( $attributes );
703 $html->add( $newline );
704 $this->_build_head();
705 $html->add( $this->_head );
706
707 //Check to see if we are rendering
708 //a frameset page.
709 if ($this->_frameset != NULL) {
710 //Looks like they have set the frameset
711 //member, so we are rendering a frameset
712 //we will automatically wrap the <body>
713 $html->add( $newline );
714 $html->add( $this->_frameset );
715 $html->add( $newline );
716 $html->add( $this->_frameset_wrap_body() );
717 } else {
718 $html->add( $newline );
719 //$this->_body->add( $newline );
720 $html->add( $this->_body );
721 }
722
723 $html-> add( $newline );
724
725 if ($this->_text_debug) {
726 if ($GLOBALS["HTML_RENDER_TYPE"] == XHTML_STRICT) {
727 $xml = new XMLtag(array("version" => "1.0",
728 "encoding"=>$this->_xml_encoding));
729 $page->add( $xml->render(0,1) );
730 }
731 $page->add( $this->_doctype->render(0,1) );
732 $page->add( $html->render($this->_indent_style,1) );
733 return $page->render();
734 } else {
735 $output = '';
736 if ($GLOBALS["HTML_RENDER_TYPE"] == XHTML_STRICT) {
737 $xml = new XMLtag(array("version" => "1.0",
738 "encoding"=>$this->_xml_encoding));
739 $output = $xml->render(0);
740 }
741 $output .= $this->_doctype->render();
742 $output .= $html->render($this->_indent_style);
743 return $output;
744 }
745 }
746 }
747
748
749 ?>

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed