/vendor/joomla/libraries/joomla/document/document.php
PHP | 782 lines | 271 code | 82 blank | 429 comment | 38 complexity | 8d5946b3dd4dfb03c833424f87419587 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1
- <?php
- /**
- * @version $Id: document.php 14401 2010-01-26 14:10:00Z louis $
- * @package Joomla.Framework
- * @subpackage Document
- * @copyright Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
- * @license GNU/GPL, see LICENSE.php
- * Joomla! is free software. This version may have been modified pursuant
- * to the GNU General Public License, and as distributed it includes or
- * is derivative of works licensed under the GNU General Public License or
- * other free or open source software licenses.
- * See COPYRIGHT.php for copyright notices and details.
- */
- // Check to ensure this file is within the rest of the framework
- defined('JPATH_BASE') or die();
- //Register the renderer class with the loader
- JLoader::register('JDocumentRenderer', dirname(__FILE__).DS.'renderer.php');
- /**
- * Document class, provides an easy interface to parse and display a document
- *
- * @abstract
- * @package Joomla.Framework
- * @subpackage Document
- * @since 1.5
- */
- class JDocument extends JObject
- {
- /**
- * Document title
- *
- * @var string
- * @access public
- */
- var $title = '';
- /**
- * Document description
- *
- * @var string
- * @access public
- */
- var $description = '';
- /**
- * Document full URL
- *
- * @var string
- * @access public
- */
- var $link = '';
- /**
- * Document base URL
- *
- * @var string
- * @access public
- */
- var $base = '';
- /**
- * Contains the document language setting
- *
- * @var string
- * @access public
- */
- var $language = 'en-gb';
- /**
- * Contains the document direction setting
- *
- * @var string
- * @access public
- */
- var $direction = 'ltr';
- /**
- * Document generator
- *
- * @var string
- * @access public
- */
- var $_generator = 'Anahita 3.0 - Open Source Social Networking Platform And Framework';
- /**
- * Document modified date
- *
- * @var string
- * @access private
- */
- var $_mdate = '';
- /**
- * Tab string
- *
- * @var string
- * @access private
- */
- var $_tab = "\11";
- /**
- * Contains the line end string
- *
- * @var string
- * @access private
- */
- var $_lineEnd = "\12";
- /**
- * Contains the character encoding string
- *
- * @var string
- * @access private
- */
- var $_charset = 'utf-8';
- /**
- * Document mime type
- *
- * @var string
- * @access private
- */
- var $_mime = '';
- /**
- * Document namespace
- *
- * @var string
- * @access private
- */
- var $_namespace = '';
- /**
- * Document profile
- *
- * @var string
- * @access private
- */
- var $_profile = '';
- /**
- * Array of linked scripts
- *
- * @var array
- * @access private
- */
- var $_scripts = array();
- /**
- * Array of scripts placed in the header
- *
- * @var array
- * @access private
- */
- var $_script = array();
- /**
- * Array of linked style sheets
- *
- * @var array
- * @access private
- */
- var $_styleSheets = array();
- /**
- * Array of included style declarations
- *
- * @var array
- * @access private
- */
- var $_style = array();
- /**
- * Array of meta tags
- *
- * @var array
- * @access private
- */
- var $_metaTags = array();
- /**
- * The rendering engine
- *
- * @var object
- * @access private
- */
- var $_engine = null;
- /**
- * The document type
- *
- * @var string
- * @access private
- */
- var $_type = null;
- /**
- * Array of buffered output
- *
- * @var mixed (depends on the renderer)
- * @access private
- */
- var $_buffer = null;
- /**
- * Class constructor
- *
- * @access protected
- * @param array $options Associative array of options
- */
- function __construct( $options = array())
- {
- parent::__construct();
- if (array_key_exists('lineend', $options)) {
- $this->setLineEnd($options['lineend']);
- }
- if (array_key_exists('charset', $options)) {
- $this->setCharset($options['charset']);
- }
- if (array_key_exists('language', $options)) {
- $this->setLanguage($options['language']);
- }
- if (array_key_exists('direction', $options)) {
- $this->setDirection($options['direction']);
- }
- if (array_key_exists('tab', $options)) {
- $this->setTab($options['tab']);
- }
- if (array_key_exists('link', $options)) {
- $this->setLink($options['link']);
- }
- if (array_key_exists('base', $options)) {
- $this->setBase($options['base']);
- }
- }
- /**
- * Returns a reference to the global JDocument object, only creating it
- * if it doesn't already exist.
- *
- * This method must be invoked as:
- * <pre> $document = &JDocument::getInstance();</pre>
- *
- * @access public
- * @param type $type The document type to instantiate
- * @return object The document object.
- */
- function &getInstance($type = 'html', $attributes = array())
- {
- static $instances;
- if (!isset( $instances )) {
- $instances = array();
- }
- $signature = serialize(array($type, $attributes));
- if (empty($instances[$signature]))
- {
- $type = preg_replace('/[^A-Z0-9_\.-]/i', '', $type);
- $path = dirname(__FILE__).DS.$type.DS.$type.'.php';
- $ntype = null;
- // Check if the document type exists
- if ( ! file_exists($path))
- {
- // Default to the raw format
- $ntype = $type;
- $type = 'raw';
- }
- // Determine the path and class
- $class = 'JDocument'.$type;
- if(!class_exists($class))
- {
- $path = dirname(__FILE__).DS.$type.DS.$type.'.php';
- if (file_exists($path)) {
- require_once($path);
- } else {
- JError::raiseError(500,JText::_('Unable to load document class'));
- }
- }
- $instance = new $class($attributes);
- $instances[$signature] =& $instance;
- if ( !is_null($ntype) )
- {
- // Set the type to the Document type originally requested
- $instance->setType($ntype);
- }
- }
- return $instances[$signature];
- }
- /**
- * Set the document type
- *
- * @access public
- * @param string $type
- */
- function setType($type) {
- $this->_type = $type;
- }
- /**
- * Returns the document type
- *
- * @access public
- * @return string
- */
- function getType() {
- return $this->_type;
- }
- /**
- * Get the document head data
- *
- * @access public
- * @return array The document head data in array form
- */
- function getHeadData() {
- // Impelemented in child classes
- }
- /**
- * Set the document head data
- *
- * @access public
- * @param array $data The document head data in array form
- */
- function setHeadData($data) {
- // Impelemented in child classes
- }
- /**
- * Get the contents of the document buffer
- *
- * @access public
- * @return The contents of the document buffer
- */
- function getBuffer() {
- return $this->_buffer;
- }
- /**
- * Set the contents of the document buffer
- *
- * @access public
- * @param string $content The content to be set in the buffer
- */
- function setBuffer($content) {
- $this->_buffer = $content;
- }
- /**
- * Gets a meta tag.
- *
- * @param string $name Value of name or http-equiv tag
- * @param bool $http_equiv META type "http-equiv" defaults to null
- * @return string
- * @access public
- */
- function getMetaData($name, $http_equiv = false)
- {
- $result = '';
- $name = strtolower($name);
- if($name == 'generator') {
- $result = $this->getGenerator();
- } elseif($name == 'description') {
- $result = $this->getDescription();
- } else {
- if ($http_equiv == true) {
- $result = @$this->_metaTags['http-equiv'][$name];
- } else {
- $result = @$this->_metaTags['standard'][$name];
- }
- }
- return $result;
- }
- /**
- * Sets or alters a meta tag.
- *
- * @param string $name Value of name or http-equiv tag
- * @param string $content Value of the content tag
- * @param bool $http_equiv META type "http-equiv" defaults to null
- * @return void
- * @access public
- */
- function setMetaData($name, $content, $http_equiv = false)
- {
- $name = strtolower($name);
- if($name == 'generator') {
- $this->setGenerator($content);
- } elseif($name == 'description') {
- $this->setDescription($content);
- } else {
- if ($http_equiv == true) {
- $this->_metaTags['http-equiv'][$name] = $content;
- } else {
- $this->_metaTags['standard'][$name] = $content;
- }
- }
- }
- /**
- * Adds a linked script to the page
- *
- * @param string $url URL to the linked script
- * @param string $type Type of script. Defaults to 'text/javascript'
- * @access public
- */
- function addScript($url, $type="text/javascript") {
- $this->_scripts[$url] = $type;
- }
- /**
- * Adds a script to the page
- *
- * @access public
- * @param string $content Script
- * @param string $type Scripting mime (defaults to 'text/javascript')
- * @return void
- */
- function addScriptDeclaration($content, $type = 'text/javascript')
- {
- if (!isset($this->_script[strtolower($type)])) {
- $this->_script[strtolower($type)] = $content;
- } else {
- $this->_script[strtolower($type)] .= chr(13).$content;
- }
- }
- /**
- * Adds a linked stylesheet to the page
- *
- * @param string $url URL to the linked style sheet
- * @param string $type Mime encoding type
- * @param string $media Media type that this stylesheet applies to
- * @access public
- */
- function addStyleSheet($url, $type = 'text/css', $media = null, $attribs = array())
- {
- $this->_styleSheets[$url]['mime'] = $type;
- $this->_styleSheets[$url]['media'] = $media;
- $this->_styleSheets[$url]['attribs'] = $attribs;
- }
- /**
- * Adds a stylesheet declaration to the page
- *
- * @param string $content Style declarations
- * @param string $type Type of stylesheet (defaults to 'text/css')
- * @access public
- * @return void
- */
- function addStyleDeclaration($content, $type = 'text/css')
- {
- if (!isset($this->_style[strtolower($type)])) {
- $this->_style[strtolower($type)] = $content;
- } else {
- $this->_style[strtolower($type)] .= chr(13).$content;
- }
- }
- /**
- * Sets the document charset
- *
- * @param string $type Charset encoding string
- * @access public
- * @return void
- */
- function setCharset($type = 'utf-8') {
- $this->_charset = $type;
- }
- /**
- * Returns the document charset encoding.
- *
- * @access public
- * @return string
- */
- function getCharset() {
- return $this->_charset;
- }
- /**
- * Sets the global document language declaration. Default is English (en-gb).
- *
- * @access public
- * @param string $lang
- */
- function setLanguage($lang = "en-gb") {
- $this->language = strtolower($lang);
- }
- /**
- * Returns the document language.
- *
- * @return string
- * @access public
- */
- function getLanguage() {
- return $this->language;
- }
- /**
- * Sets the global document direction declaration. Default is left-to-right (ltr).
- *
- * @access public
- * @param string $lang
- */
- function setDirection($dir = "ltr") {
- $this->direction = strtolower($dir);
- }
- /**
- * Returns the document language.
- *
- * @return string
- * @access public
- */
- function getDirection() {
- return $this->direction;
- }
- /**
- * Sets the title of the document
- *
- * @param string $title
- * @access public
- */
- function setTitle($title) {
- $this->title = $title;
- }
- /**
- * Return the title of the document.
- *
- * @return string
- * @access public
- */
- function getTitle() {
- return $this->title;
- }
- /**
- * Sets the base URI of the document
- *
- * @param string $base
- * @access public
- */
- function setBase($base) {
- $this->base = $base;
- }
- /**
- * Return the base URI of the document.
- *
- * @return string
- * @access public
- */
- function getBase() {
- return $this->base;
- }
- /**
- * Sets the description of the document
- *
- * @param string $title
- * @access public
- */
- function setDescription($description) {
- $this->description = $description;
- }
- /**
- * Return the title of the page.
- *
- * @return string
- * @access public
- */
- function getDescription() {
- return $this->description;
- }
- /**
- * Sets the document link
- *
- * @param string $url A url
- * @access public
- * @return void
- */
- function setLink($url) {
- $this->link = $url;
- }
- /**
- * Returns the document base url
- *
- * @access public
- * @return string
- */
- function getLink() {
- return $this->link;
- }
- /**
- * Sets the document generator
- *
- * @param string
- * @access public
- * @return void
- */
- function setGenerator($generator) {
- $this->_generator = $generator;
- }
- /**
- * Returns the document generator
- *
- * @access public
- * @return string
- */
- function getGenerator() {
- return $this->_generator;
- }
- /**
- * Sets the document modified date
- *
- * @param string
- * @access public
- * @return void
- */
- function setModifiedDate($date) {
- $this->_mdate = $date;
- }
- /**
- * Returns the document modified date
- *
- * @access public
- * @return string
- */
- function getModifiedDate() {
- return $this->_mdate;
- }
- /**
- * Sets the document MIME encoding that is sent to the browser.
- *
- * <p>This usually will be text/html because most browsers cannot yet
- * accept the proper mime settings for XHTML: application/xhtml+xml
- * and to a lesser extent application/xml and text/xml. See the W3C note
- * ({@link http://www.w3.org/TR/xhtml-media-types/
- * http://www.w3.org/TR/xhtml-media-types/}) for more details.</p>
- *
- * @param string $type
- * @access public
- * @return void
- */
- function setMimeEncoding($type = 'text/html') {
- $this->_mime = strtolower($type);
- }
- /**
- * Sets the line end style to Windows, Mac, Unix or a custom string.
- *
- * @param string $style "win", "mac", "unix" or custom string.
- * @access public
- * @return void
- */
- function setLineEnd($style)
- {
- switch ($style) {
- case 'win':
- $this->_lineEnd = "\15\12";
- break;
- case 'unix':
- $this->_lineEnd = "\12";
- break;
- case 'mac':
- $this->_lineEnd = "\15";
- break;
- default:
- $this->_lineEnd = $style;
- }
- }
- /**
- * Returns the lineEnd
- *
- * @access private
- * @return string
- */
- function _getLineEnd() {
- return $this->_lineEnd;
- }
- /**
- * Sets the string used to indent HTML
- *
- * @param string $string String used to indent ("\11", "\t", ' ', etc.).
- * @access public
- * @return void
- */
- function setTab($string) {
- $this->_tab = $string;
- }
- /**
- * Returns a string containing the unit for indenting HTML
- *
- * @access private
- * @return string
- */
- function _getTab() {
- return $this->_tab;
- }
- /**
- * Load a renderer
- *
- * @access public
- * @param string The renderer type
- * @return object
- * @since 1.5
- */
- function &loadRenderer( $type )
- {
- $null = null;
- $class = 'JDocumentRenderer'.$type;
- if( !class_exists( $class ) )
- {
- $path = dirname(__FILE__).DS.$this->_type.DS.'renderer'.DS.$type.'.php';
- if(file_exists($path)) {
- require_once($path);
- } else {
- JError::raiseError(500,JText::_('Unable to load renderer class'));
- }
- }
- if ( !class_exists( $class ) ) {
- return $null;
- }
- $instance = new $class($this);
- return $instance;
- }
- /**
- * Outputs the document
- *
- * @access public
- * @param boolean $cache If true, cache the output
- * @param boolean $compress If true, compress the output
- * @param array $params Associative array of attributes
- * @return The rendered data
- */
- function render( $cache = false, $params = array())
- {
- JResponse::setHeader( 'Expires', gmdate( 'D, d M Y H:i:s', time() + 900 ) . ' GMT' );
- if ($mdate = $this->getModifiedDate()) {
- JResponse::setHeader( 'Last-Modified', $mdate /* gmdate( 'D, d M Y H:i:s', time() + 900 ) . ' GMT' */ );
- }
- JResponse::setHeader( 'Content-Type', $this->_mime . '; charset=' . $this->_charset);
- }
- }