diff options
author | Christian Schneider | 2006-10-26 13:35:12 +0000 |
---|---|---|
committer | Christian Schneider | 2006-10-26 13:35:12 +0000 |
commit | a5a19fd672bc0b8113d620669b557f17dccd343a (patch) | |
tree | 876ba4fec8362ac2e9374f61b9b7f67fcd2b8e59 /html_page.class | |
download | itools-a5a19fd672bc0b8113d620669b557f17dccd343a.tar.gz itools-a5a19fd672bc0b8113d620669b557f17dccd343a.tar.bz2 itools-a5a19fd672bc0b8113d620669b557f17dccd343a.zip |
Moved itools to live branch
Diffstat (limited to 'html_page.class')
-rw-r--r-- | html_page.class | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/html_page.class b/html_page.class new file mode 100644 index 0000000..88191d9 --- /dev/null +++ b/html_page.class @@ -0,0 +1,214 @@ +<?php +/* +** $Id$ +** +** ITools - the Internet Tools Library +** +** Copyright (C) 1995-2003 by the ITools Authors. +** This program is free software; you can redistribute it and/or +** modify it under the terms of either the GNU General Public License +** or the GNU Lesser General Public License, as published by the Free +** Software Foundation. See http://www.gnu.org/licenses/ for details. +** +** class it_html_page - Fairly generic HTML page Class +*/ + +class it_html_page +{ + /* Public read-only */ + var $title; /* <title> of this page */ + var $doctype; /* Document type, will be reasonably initialized */ + var $encoding; /* If set, generate Content-Type HTTP/meta headers */ + + var $url; /* Site-relative URL of this page, without GET args */ + var $remote_host; /* IP address of caller (can deal with most proxies) */ + + /* Private */ + var $headers; /* Header lines to output in <head> context */ + var $meta_headers = array(); /* <meta name=.. content=..> tags in <head> context */ + var $body_tags = array(); /* array of tags in <body statement */ + var $body_start = ""; /* This is output immediately after <body> */ + var $body_end = ""; /* Output immediately before </body> */ + var $head_sent = 0; /* 1 if <head> area already sent to client */ + var $in_body = 0; /* false=in header, true=in body */ + var $in_input_tr = 0; /* For input_text() */ + + + +/** + * Constructor + * @param $tags optional array of key => value pairs: title, doctype, encoding + */ +function it_html_page($tags='') +{ + /* Set defaults */ + $this->doctype = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">'; + + /* Determine the relative URL of this page for self-reference */ + if (isset($_SERVER['SCRIPT_URL'])) + $this->url = $_SERVER['SCRIPT_URL']; + else + { + list($this->url) = explode("?", $_SERVER['REQUEST_URI']); + $this->url = substr(strrchr($this->url, "/"), 1); /* $$$ what's this?? */ + } + + /* This is needed for POST requests to oneself */ + if ($this->url == "") + $this->url = "./"; + + /* Determine IP address of caller */ + if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && ereg('^([0-9.]{7,15})', $_SERVER['HTTP_X_FORWARDED_FOR'], $regs)) + $this->remote_host = trim($regs[1]); + else + $this->remote_host = $_SERVER['REMOTE_ADDR']; + + /* Is this a good idea? */ + $this->add_meta_header('generator', '$Id$'); + + /* Override defaults with user tags */ + if (is_array($tags)) + foreach($tags as $key => $value) + $this->$key = $value; + + if (isset($this->encoding)) + { + $ct = 'text/html; charset='.$this->encoding; + header('Content-Type: '.$ct); + $this->add_header('<meta http-equiv="Content-Type" content="'.$ct.'">'); + } +} + + +/** + * Set the title of the page + */ +function set_title($title) +{ + $this->title = $title; +} + + +/** + * Add a line to the header area and trim it + */ +function add_header($header) +{ + $this->headers .= trim($header)."\n"; +} + + +/** + * Add a meta header. + * If a header with the same name exists, overwrite it. + */ +function add_meta_header($name, $value) +{ + $this->meta_headers[strtolower($name)] = $value; +} + + +/** + * Add a tag=value pair in <body context. + * If a header with the same name exists, overwrite it. + */ +function add_body_tag($name, $value) +{ + $this->body_tags[strtolower($name)] = $value; +} + + +/** + * Add a line to the body area after other lines that were added + */ +function add_body_start($html) +{ + $this->body_start .= $html; +} + + +/** + * Add a line to the body end area before other lines that were added + */ +function add_body_end($html) +{ + $this->body_end = $html . $this->body_end; +} + + +/** + * Write out HTML <head> section, if not already done. + */ +function head() +{ + /* This function can be called multiple times, no harm is done. */ + if (!$this->head_sent) + { + $lang = $this->language ? " lang='$this->language'" : ""; + + if (!$GLOBALS['SENT_PREAMBLE']) /* RELOAD_MAGIC already sent <html><head> */ + echo $this->doctype, "\n<html$lang>\n<head>\n"; + + if ($this->title) + echo '<title>'.$this->title."</title>\n"; + + echo $this->headers; + + while (list($name, $content) = each($this->meta_headers)) + echo "<meta name=\"$name\" content=\"$content\">\n"; + + echo "</head>\n"; + $this->head_sent = 1; + } +} + + +/** + * Write out HTML <head> section and body start, if not already done. + * @param ... If parameters are present, output them and call end() + */ +function body() +{ + /* Write out header part */ + $this->head(); + + /* This function can be called multiple times, no harm is done. */ + if (!$this->in_body) + { + echo '<body'; + + while (list($tag, $value) = each($this->body_tags)) + echo " $tag=\"$value\""; + + echo ">\n".$this->body_start; + $this->in_body = 1; + + if ($args = func_get_args()) + { + foreach($args as $arg) + echo $arg; + $this->end(); + } + } +} + + +/** + * End a HTML page. + */ +function end() +{ + $this->head(); + + if ($this->in_body) + { + echo $this->body_end."</body>\n"; + $this->in_body = 0; + } + + echo "</html>\n"; +} + + +} /* End class it_html_page */ +?> |