| Current Path : /home/digilove/public_html/41423/ |
| Current File : //home/digilove/public_html/41423/Document.php.tar |
home/digilove/public_html/libraries/src/Document/Document.php 0000644 00000063761 15234471750 0020435 0 ustar 00 <?php
/**
* Joomla! Content Management System
*
* @copyright (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\CMS\Document;
defined('JPATH_PLATFORM') or die;
use Joomla\CMS\Date\Date;
/**
* Document class, provides an easy interface to parse and display a document
*
* @since 1.7.0
*/
class Document
{
/**
* Document title
*
* @var string
* @since 1.7.0
*/
public $title = '';
/**
* Document description
*
* @var string
* @since 1.7.0
*/
public $description = '';
/**
* Document full URL
*
* @var string
* @since 1.7.0
*/
public $link = '';
/**
* Document base URL
*
* @var string
* @since 1.7.0
*/
public $base = '';
/**
* Contains the document language setting
*
* @var string
* @since 1.7.0
*/
public $language = 'en-gb';
/**
* Contains the document direction setting
*
* @var string
* @since 1.7.0
*/
public $direction = 'ltr';
/**
* Document generator
*
* @var string
* @since 1.7.0
*/
public $_generator = 'Joomla! - Open Source Content Management';
/**
* Document modified date
*
* @var string|Date
* @since 1.7.0
*/
public $_mdate = '';
/**
* Tab string
*
* @var string
* @since 1.7.0
*/
public $_tab = "\11";
/**
* Contains the line end string
*
* @var string
* @since 1.7.0
*/
public $_lineEnd = "\12";
/**
* Contains the character encoding string
*
* @var string
* @since 1.7.0
*/
public $_charset = 'utf-8';
/**
* Document mime type
*
* @var string
* @since 1.7.0
*/
public $_mime = '';
/**
* Document namespace
*
* @var string
* @since 1.7.0
*/
public $_namespace = '';
/**
* Document profile
*
* @var string
* @since 1.7.0
*/
public $_profile = '';
/**
* Array of linked scripts
*
* @var array
* @since 1.7.0
*/
public $_scripts = array();
/**
* Array of scripts placed in the header
*
* @var array
* @since 1.7.0
*/
public $_script = array();
/**
* Array of scripts options
*
* @var array
*/
protected $scriptOptions = array();
/**
* Array of linked style sheets
*
* @var array
* @since 1.7.0
*/
public $_styleSheets = array();
/**
* Array of included style declarations
*
* @var array
* @since 1.7.0
*/
public $_style = array();
/**
* Array of meta tags
*
* @var array
* @since 1.7.0
*/
public $_metaTags = array();
/**
* The rendering engine
*
* @var object
* @since 1.7.0
*/
public $_engine = null;
/**
* The document type
*
* @var string
* @since 1.7.0
*/
public $_type = null;
/**
* Array of buffered output
*
* @var mixed (depends on the renderer)
* @since 1.7.0
*/
public static $_buffer = null;
/**
* Document instances container.
*
* @var array
* @since 1.7.3
*/
protected static $instances = array();
/**
* Media version added to assets
*
* @var string
* @since 3.2
*/
protected $mediaVersion = null;
/**
* Class constructor.
*
* @param array $options Associative array of options
*
* @since 1.7.0
*/
public function __construct($options = array())
{
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']);
}
if (array_key_exists('mediaversion', $options))
{
$this->setMediaVersion($options['mediaversion']);
}
}
/**
* Returns the global Document object, only creating it
* if it doesn't already exist.
*
* @param string $type The document type to instantiate
* @param array $attributes Array of attributes
*
* @return object The document object.
*
* @since 1.7.0
*/
public static function getInstance($type = 'html', $attributes = array())
{
$signature = serialize(array($type, $attributes));
if (empty(self::$instances[$signature]))
{
$type = preg_replace('/[^A-Z0-9_\.-]/i', '', $type);
$ntype = null;
// Determine the path and class
$class = __NAMESPACE__ . '\\' . ucfirst($type) . 'Document';
if (!class_exists($class))
{
$class = 'JDocument' . ucfirst($type);
}
if (!class_exists($class))
{
// @deprecated 4.0 - Document objects should be autoloaded instead
$path = __DIR__ . '/' . $type . '/' . $type . '.php';
\JLoader::register($class, $path);
if (class_exists($class))
{
\JLog::add('Non-autoloadable Document subclasses are deprecated, support will be removed in 4.0.', \JLog::WARNING, 'deprecated');
}
// Default to the raw format
else
{
$ntype = $type;
$class = 'JDocumentRaw';
}
}
$instance = new $class($attributes);
self::$instances[$signature] = $instance;
if (!is_null($ntype))
{
// Set the type to the Document type originally requested
$instance->setType($ntype);
}
}
return self::$instances[$signature];
}
/**
* Set the document type
*
* @param string $type Type document is to set to
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setType($type)
{
$this->_type = $type;
return $this;
}
/**
* Returns the document type
*
* @return string
*
* @since 1.7.0
*/
public function getType()
{
return $this->_type;
}
/**
* Get the contents of the document buffer
*
* @return mixed
*
* @since 1.7.0
*/
public function getBuffer()
{
return self::$_buffer;
}
/**
* Set the contents of the document buffer
*
* @param string $content The content to be set in the buffer.
* @param array $options Array of optional elements.
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setBuffer($content, $options = array())
{
self::$_buffer = $content;
return $this;
}
/**
* Gets a meta tag.
*
* @param string $name Name of the meta HTML tag
* @param string $attribute Attribute to use in the meta HTML tag
*
* @return string
*
* @since 1.7.0
*/
public function getMetaData($name, $attribute = 'name')
{
// B/C old http_equiv parameter.
if (!is_string($attribute))
{
$attribute = $attribute == true ? 'http-equiv' : 'name';
}
if ($name == 'generator')
{
$result = $this->getGenerator();
}
elseif ($name == 'description')
{
$result = $this->getDescription();
}
else
{
$result = isset($this->_metaTags[$attribute]) && isset($this->_metaTags[$attribute][$name]) ? $this->_metaTags[$attribute][$name] : '';
}
return $result;
}
/**
* Sets or alters a meta tag.
*
* @param string $name Name of the meta HTML tag
* @param mixed $content Value of the meta HTML tag as array or string
* @param string $attribute Attribute to use in the meta HTML tag
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setMetaData($name, $content, $attribute = 'name')
{
// Pop the element off the end of array if target function expects a string or this http_equiv parameter.
if (is_array($content) && (in_array($name, array('generator', 'description')) || !is_string($attribute)))
{
$content = array_pop($content);
}
// B/C old http_equiv parameter.
if (!is_string($attribute))
{
$attribute = $attribute == true ? 'http-equiv' : 'name';
}
if ($name == 'generator')
{
$this->setGenerator($content);
}
elseif ($name == 'description')
{
$this->setDescription($content);
}
else
{
$this->_metaTags[$attribute][$name] = $content;
}
return $this;
}
/**
* Adds a linked script to the page
*
* @param string $url URL to the linked script.
* @param array $options Array of options. Example: array('version' => 'auto', 'conditional' => 'lt IE 9')
* @param array $attribs Array of attributes. Example: array('id' => 'scriptid', 'async' => 'async', 'data-test' => 1)
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
* @deprecated 4.0 The (url, mime, defer, async) method signature is deprecated, use (url, options, attributes) instead.
*/
public function addScript($url, $options = array(), $attribs = array())
{
// B/C before 3.7.0
if (!is_array($options) && (!is_array($attribs) || $attribs === array()))
{
\JLog::add('The addScript method signature used has changed, use (url, options, attributes) instead.', \JLog::WARNING, 'deprecated');
$argList = func_get_args();
$options = array();
$attribs = array();
// Old mime type parameter.
if (!empty($argList[1]))
{
$attribs['mime'] = $argList[1];
}
// Old defer parameter.
if (isset($argList[2]) && $argList[2])
{
$attribs['defer'] = true;
}
// Old async parameter.
if (isset($argList[3]) && $argList[3])
{
$attribs['async'] = true;
}
}
// Default value for type.
if (!isset($attribs['type']) && !isset($attribs['mime']))
{
$attribs['type'] = 'text/javascript';
}
$this->_scripts[$url] = isset($this->_scripts[$url]) ? array_replace($this->_scripts[$url], $attribs) : $attribs;
$this->_scripts[$url]['options'] = isset($this->_scripts[$url]['options']) ? array_replace($this->_scripts[$url]['options'], $options) : $options;
return $this;
}
/**
* Adds a linked script to the page with a version to allow to flush it. Ex: myscript.js?54771616b5bceae9df03c6173babf11d
* If not specified Joomla! automatically handles versioning
*
* @param string $url URL to the linked script.
* @param array $options Array of options. Example: array('version' => 'auto', 'conditional' => 'lt IE 9')
* @param array $attribs Array of attributes. Example: array('id' => 'scriptid', 'async' => 'async', 'data-test' => 1)
*
* @return Document instance of $this to allow chaining
*
* @since 3.2
* @deprecated 4.0 This method is deprecated, use addScript(url, options, attributes) instead.
*/
public function addScriptVersion($url, $options = array(), $attribs = array())
{
\JLog::add('The method is deprecated, use addScript(url, attributes, options) instead.', \JLog::WARNING, 'deprecated');
// B/C before 3.7.0
if (!is_array($options) && (!is_array($attribs) || $attribs === array()))
{
$argList = func_get_args();
$options = array();
$attribs = array();
// Old version parameter.
$options['version'] = isset($argList[1]) && !is_null($argList[1]) ? $argList[1] : 'auto';
// Old mime type parameter.
if (!empty($argList[2]))
{
$attribs['mime'] = $argList[2];
}
// Old defer parameter.
if (isset($argList[3]) && $argList[3])
{
$attribs['defer'] = true;
}
// Old async parameter.
if (isset($argList[4]) && $argList[4])
{
$attribs['async'] = true;
}
}
// Default value for version.
else
{
$options['version'] = 'auto';
}
return $this->addScript($url, $options, $attribs);
}
/**
* Adds a script to the page
*
* @param string $content Script
* @param string $type Scripting mime (defaults to 'text/javascript')
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public 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;
}
return $this;
}
/**
* Add option for script
*
* @param string $key Name in Storage
* @param mixed $options Scrip options as array or string
* @param bool $merge Whether merge with existing (true) or replace (false)
*
* @return Document instance of $this to allow chaining
*
* @since 3.5
*/
public function addScriptOptions($key, $options, $merge = true)
{
if (empty($this->scriptOptions[$key]))
{
$this->scriptOptions[$key] = array();
}
if ($merge && is_array($options))
{
$this->scriptOptions[$key] = array_replace_recursive($this->scriptOptions[$key], $options);
}
else
{
$this->scriptOptions[$key] = $options;
}
return $this;
}
/**
* Get script(s) options
*
* @param string $key Name in Storage
*
* @return array Options for given $key, or all script options
*
* @since 3.5
*/
public function getScriptOptions($key = null)
{
if ($key)
{
return (empty($this->scriptOptions[$key])) ? array() : $this->scriptOptions[$key];
}
else
{
return $this->scriptOptions;
}
}
/**
* Adds a linked stylesheet to the page
*
* @param string $url URL to the linked style sheet
* @param array $options Array of options. Example: array('version' => 'auto', 'conditional' => 'lt IE 9')
* @param array $attribs Array of attributes. Example: array('id' => 'stylesheet', 'data-test' => 1)
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
* @deprecated 4.0 The (url, mime, media, attribs) method signature is deprecated, use (url, options, attributes) instead.
*/
public function addStyleSheet($url, $options = array(), $attribs = array())
{
// B/C before 3.7.0
if (is_string($options))
{
\JLog::add('The addStyleSheet method signature used has changed, use (url, options, attributes) instead.', \JLog::WARNING, 'deprecated');
$argList = func_get_args();
$options = array();
$attribs = array();
// Old mime type parameter.
if (!empty($argList[1]))
{
$attribs['type'] = $argList[1];
}
// Old media parameter.
if (isset($argList[2]) && $argList[2])
{
$attribs['media'] = $argList[2];
}
// Old attribs parameter.
if (isset($argList[3]) && $argList[3])
{
$attribs = array_replace($attribs, $argList[3]);
}
}
// Default value for type.
if (!isset($attribs['type']) && !isset($attribs['mime']))
{
$attribs['type'] = 'text/css';
}
$this->_styleSheets[$url] = isset($this->_styleSheets[$url]) ? array_replace($this->_styleSheets[$url], $attribs) : $attribs;
if (isset($this->_styleSheets[$url]['options']))
{
$this->_styleSheets[$url]['options'] = array_replace($this->_styleSheets[$url]['options'], $options);
}
else
{
$this->_styleSheets[$url]['options'] = $options;
}
return $this;
}
/**
* Adds a linked stylesheet version to the page. Ex: template.css?54771616b5bceae9df03c6173babf11d
* If not specified Joomla! automatically handles versioning
*
* @param string $url URL to the linked style sheet
* @param array $options Array of options. Example: array('version' => 'auto', 'conditional' => 'lt IE 9')
* @param array $attribs Array of attributes. Example: array('id' => 'stylesheet', 'data-test' => 1)
*
* @return Document instance of $this to allow chaining
*
* @since 3.2
* @deprecated 4.0 This method is deprecated, use addStyleSheet(url, options, attributes) instead.
*/
public function addStyleSheetVersion($url, $options = array(), $attribs = array())
{
\JLog::add('The method is deprecated, use addStyleSheet(url, attributes, options) instead.', \JLog::WARNING, 'deprecated');
// B/C before 3.7.0
if (!is_array($options) && (!is_array($attribs) || $attribs === array()))
{
$argList = func_get_args();
$options = array();
$attribs = array();
// Old version parameter.
$options['version'] = isset($argList[1]) && !is_null($argList[1]) ? $argList[1] : 'auto';
// Old mime type parameter.
if (!empty($argList[2]))
{
$attribs['mime'] = $argList[2];
}
// Old media parameter.
if (isset($argList[3]) && $argList[3])
{
$attribs['media'] = $argList[3];
}
// Old attribs parameter.
if (isset($argList[4]) && $argList[4])
{
$attribs = array_replace($attribs, $argList[4]);
}
}
// Default value for version.
else
{
$options['version'] = 'auto';
}
return $this->addStyleSheet($url, $options, $attribs);
}
/**
* Adds a stylesheet declaration to the page
*
* @param string $content Style declarations
* @param string $type Type of stylesheet (defaults to 'text/css')
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public 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;
}
return $this;
}
/**
* Sets the document charset
*
* @param string $type Charset encoding string
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setCharset($type = 'utf-8')
{
$this->_charset = $type;
return $this;
}
/**
* Returns the document charset encoding.
*
* @return string
*
* @since 1.7.0
*/
public function getCharset()
{
return $this->_charset;
}
/**
* Sets the global document language declaration. Default is English (en-gb).
*
* @param string $lang The language to be set
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setLanguage($lang = 'en-gb')
{
$this->language = strtolower($lang);
return $this;
}
/**
* Returns the document language.
*
* @return string
*
* @since 1.7.0
*/
public function getLanguage()
{
return $this->language;
}
/**
* Sets the global document direction declaration. Default is left-to-right (ltr).
*
* @param string $dir The language direction to be set
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setDirection($dir = 'ltr')
{
$this->direction = strtolower($dir);
return $this;
}
/**
* Returns the document direction declaration.
*
* @return string
*
* @since 1.7.0
*/
public function getDirection()
{
return $this->direction;
}
/**
* Sets the title of the document
*
* @param string $title The title to be set
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setTitle($title)
{
$this->title = $title;
return $this;
}
/**
* Return the title of the document.
*
* @return string
*
* @since 1.7.0
*/
public function getTitle()
{
return $this->title;
}
/**
* Set the assets version
*
* @param string $mediaVersion Media version to use
*
* @return Document instance of $this to allow chaining
*
* @since 3.2
*/
public function setMediaVersion($mediaVersion)
{
$this->mediaVersion = strtolower($mediaVersion);
return $this;
}
/**
* Return the media version
*
* @return string
*
* @since 3.2
*/
public function getMediaVersion()
{
return $this->mediaVersion;
}
/**
* Sets the base URI of the document
*
* @param string $base The base URI to be set
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setBase($base)
{
$this->base = $base;
return $this;
}
/**
* Return the base URI of the document.
*
* @return string
*
* @since 1.7.0
*/
public function getBase()
{
return $this->base;
}
/**
* Sets the description of the document
*
* @param string $description The description to set
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setDescription($description)
{
$this->description = $description;
return $this;
}
/**
* Return the description of the document.
*
* @return string
*
* @since 1.7.0
*/
public function getDescription()
{
return $this->description;
}
/**
* Sets the document link
*
* @param string $url A url
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setLink($url)
{
$this->link = $url;
return $this;
}
/**
* Returns the document base url
*
* @return string
*
* @since 1.7.0
*/
public function getLink()
{
return $this->link;
}
/**
* Sets the document generator
*
* @param string $generator The generator to be set
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setGenerator($generator)
{
$this->_generator = $generator;
return $this;
}
/**
* Returns the document generator
*
* @return string
*
* @since 1.7.0
*/
public function getGenerator()
{
return $this->_generator;
}
/**
* Sets the document modified date
*
* @param string|Date $date The date to be set
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
* @throws \InvalidArgumentException
*/
public function setModifiedDate($date)
{
if (!is_string($date) && !($date instanceof Date))
{
throw new \InvalidArgumentException(
sprintf(
'The $date parameter of %1$s must be a string or a %2$s instance, a %3$s was given.',
__METHOD__ . '()',
'Joomla\\CMS\\Date\\Date',
gettype($date) === 'object' ? (get_class($date) . ' instance') : gettype($date)
)
);
}
$this->_mdate = $date;
return $this;
}
/**
* Returns the document modified date
*
* @return string|Date
*
* @since 1.7.0
*/
public function getModifiedDate()
{
return $this->_mdate;
}
/**
* Sets the document MIME encoding that is sent to the browser.
*
* 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.
*
* @param string $type The document type to be sent
* @param boolean $sync Should the type be synced with HTML?
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*
* @link http://www.w3.org/TR/xhtml-media-types
*/
public function setMimeEncoding($type = 'text/html', $sync = true)
{
$this->_mime = strtolower($type);
// Syncing with metadata
if ($sync)
{
$this->setMetaData('content-type', $type . '; charset=' . $this->_charset, true);
}
return $this;
}
/**
* Return the document MIME encoding that is sent to the browser.
*
* @return string
*
* @since 1.7.0
*/
public function getMimeEncoding()
{
return $this->_mime;
}
/**
* Sets the line end style to Windows, Mac, Unix or a custom string.
*
* @param string $style "win", "mac", "unix" or custom string.
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public 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;
}
return $this;
}
/**
* Returns the lineEnd
*
* @return string
*
* @since 1.7.0
*/
public function _getLineEnd()
{
return $this->_lineEnd;
}
/**
* Sets the string used to indent HTML
*
* @param string $string String used to indent ("\11", "\t", ' ', etc.).
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setTab($string)
{
$this->_tab = $string;
return $this;
}
/**
* Returns a string containing the unit for indenting HTML
*
* @return string
*
* @since 1.7.0
*/
public function _getTab()
{
return $this->_tab;
}
/**
* Load a renderer
*
* @param string $type The renderer type
*
* @return DocumentRenderer
*
* @since 1.7.0
* @throws \RuntimeException
*/
public function loadRenderer($type)
{
// Determine the path and class
$class = __NAMESPACE__ . '\\Renderer\\' . ucfirst($this->getType()) . '\\' . ucfirst($type) . 'Renderer';
if (!class_exists($class))
{
$class = 'JDocumentRenderer' . ucfirst($this->getType()) . ucfirst($type);
}
if (!class_exists($class))
{
// "Legacy" class name structure
$class = 'JDocumentRenderer' . $type;
if (!class_exists($class))
{
// @deprecated 4.0 - Non-autoloadable class support is deprecated, only log a message though if a file is found
$path = __DIR__ . '/' . $this->getType() . '/renderer/' . $type . '.php';
if (!file_exists($path))
{
throw new \RuntimeException('Unable to load renderer class', 500);
}
\JLoader::register($class, $path);
\JLog::add('Non-autoloadable JDocumentRenderer subclasses are deprecated, support will be removed in 4.0.', \JLog::WARNING, 'deprecated');
// If the class still doesn't exist after including the path, we've got issues
if (!class_exists($class))
{
throw new \RuntimeException('Unable to load renderer class', 500);
}
}
}
return new $class($this);
}
/**
* Parses the document and prepares the buffers
*
* @param array $params The array of parameters
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function parse($params = array())
{
return $this;
}
/**
* Outputs the document
*
* @param boolean $cache If true, cache the output
* @param array $params Associative array of attributes
*
* @return void The rendered data
*
* @since 1.7.0
*/
public function render($cache = false, $params = array())
{
$app = \JFactory::getApplication();
if ($mdate = $this->getModifiedDate())
{
if (!($mdate instanceof Date))
{
$mdate = new Date($mdate);
}
$app->modifiedDate = $mdate;
}
$app->mimeType = $this->_mime;
$app->charSet = $this->_charset;
}
}
home/digilove/public_html/libraries/regularlabs/src/Document.php 0000644 00000041660 15234577276 0021166 0 ustar 00 <?php
/**
* @package Regular Labs Library
* @version 23.7.24631
*
* @author Peter van Westen <info@regularlabs.com>
* @link https://regularlabs.com
* @copyright Copyright © 2023 Regular Labs All Rights Reserved
* @license GNU General Public License version 2 or later
*/
namespace RegularLabs\Library;
defined('_JEXEC') or die;
use Joomla\CMS\Document\Document as JDocument;
use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\HTML\HTMLHelper as JHtml;
use Joomla\CMS\Language\Text as JText;
use RegularLabs\Library\CacheNew as Cache;
/**
* Class Document
* @package RegularLabs\Library
*/
class Document
{
/**
* Enqueues an admin error
*
* @param string $message
*/
public static function adminError($message)
{
self::adminMessage($message, 'error');
}
/**
* Enqueues an admin message
*
* @param string $message
* @param string $type
*/
public static function adminMessage($message, $type = 'message')
{
if ( ! self::isAdmin())
{
return;
}
self::message($message, $type);
}
/**
* Enqueues an error
*
* @param string $message
*/
public static function error($message)
{
self::message($message, 'error');
}
/**
* @return JDocument The document object
*/
public static function get()
{
$document = JFactory::getApplication()->getDocument();
if ( ! is_null($document))
{
return $document;
}
JFactory::getApplication()->loadDocument();
return JFactory::getApplication()->getDocument();
}
/**
* @return null|string
*
* @depecated Use getComponentBuffer
*/
public static function getBuffer()
{
return self::getComponentBuffer();
}
/**
* @return null|string
*/
public static function getComponentBuffer()
{
$buffer = self::get()->getBuffer('component');
if (empty($buffer) || ! is_string($buffer))
{
return null;
}
$buffer = trim($buffer);
if (empty($buffer))
{
return null;
}
return $buffer;
}
/**
* Check if page is an admin page
*
* @param bool $exclude_login
*
* @return bool
*/
public static function isAdmin($exclude_login = false)
{
$cache = new Cache([__METHOD__, $exclude_login]);
if ($cache->exists())
{
return $cache->get();
}
$input = JFactory::getApplication()->input;
$user = JFactory::getApplication()->getIdentity() ?: JFactory::getUser();
$is_admin = (
self::isClient('administrator')
&& ( ! $exclude_login || ! $user->get('guest'))
&& $input->get('task') != 'preview'
&& ! (
$input->get('option') == 'com_finder'
&& $input->get('format') == 'json'
)
);
return $cache->set($is_admin);
}
/**
* Checks if context/page is a category list
*
* @param string $context
*
* @return bool
*/
public static function isCategoryList($context)
{
$cache = new Cache([__METHOD__, $context]);
if ($cache->exists())
{
return $cache->get();
}
$app = JFactory::getApplication();
$input = $app->input;
// Return false if it is not a category page
if ($context != 'com_content.category' || $input->get('view') != 'category')
{
return $cache->set(false);
}
// Return false if layout is set and it is not a list layout
if ($input->get('layout') && $input->get('layout') != 'list')
{
return $cache->set(false);
}
// Return false if default layout is set to blog
if ($app->getParams()->get('category_layout') == '_:blog')
{
return $cache->set(false);
}
// Return true if it IS a list layout
return $cache->set(true);
}
/**
* Check if page is an edit page
*
* @return bool
*/
public static function isClient($identifier)
{
$identifier = $identifier == 'admin' ? 'administrator' : $identifier;
$cache = new Cache([__METHOD__, $identifier]);
if ($cache->exists())
{
return $cache->get();
}
return $cache->set(JFactory::getApplication()->isClient($identifier));
}
/**
* Check if page is an edit page
*
* @return bool
*/
public static function isEditPage()
{
$cache = new Cache(__METHOD__);
if ($cache->exists())
{
return $cache->get();
}
$input = JFactory::getApplication()->input;
$option = $input->get('option');
// always return false for these components
if (in_array($option, ['com_rsevents', 'com_rseventspro']))
{
return $cache->set(false);
}
$task = $input->get('task');
if (strpos($task, '.') !== false)
{
$task = explode('.', $task);
$task = array_pop($task);
}
$view = $input->get('view');
if (strpos($view, '.') !== false)
{
$view = explode('.', $view);
$view = array_pop($view);
}
$is_edit_page = (
in_array($option, ['com_config', 'com_contentsubmit', 'com_cckjseblod'])
|| ($option == 'com_comprofiler' && in_array($task, ['', 'userdetails']))
|| in_array($task, ['edit', 'form', 'submission'])
|| in_array($view, ['edit', 'form'])
|| in_array($input->get('do'), ['edit', 'form'])
|| in_array($input->get('layout'), ['edit', 'form', 'write'])
|| self::isAdmin()
);
return $cache->set($is_edit_page);
}
/**
* Checks if current page is a feed
*
* @return bool
*/
public static function isFeed()
{
$cache = new Cache(__METHOD__);
if ($cache->exists())
{
return $cache->get();
}
$input = JFactory::getApplication()->input;
$is_feed = (
self::get()->getType() == 'feed'
|| in_array($input->getWord('format'), ['feed', 'xml'])
|| in_array($input->getWord('type'), ['rss', 'atom'])
);
return $cache->set($is_feed);
}
/**
* Checks if current page is a html page
*
* @return bool
*/
public static function isHtml()
{
$cache = new Cache(__METHOD__);
if ($cache->exists())
{
return $cache->get();
}
$is_html = (self::get()->getType() == 'html');
return $cache->set($is_html);
}
/**
* Checks if current page is a https (ssl) page
*
* @return bool
*/
public static function isHttps()
{
$cache = new Cache(__METHOD__);
if ($cache->exists())
{
return $cache->get();
}
$is_https = (
( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != 'off')
|| (isset($_SERVER['SSL_PROTOCOL']))
|| (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443)
|| (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https')
);
return $cache->set($is_https);
}
/**
* Checks if current page is a JSON format fle
*
* @return bool
*/
public static function isJSON()
{
$cache = new Cache(__METHOD__);
if ($cache->exists())
{
return $cache->get();
}
$is_json = JFactory::getApplication()->input->get('format') == 'json';
return $cache->set($is_json);
}
/**
* Check if the current setup matches the given main version number
*
* @param int $version
* @param string $title
*
* @return bool
*/
public static function isJoomlaVersion($version, $title = '')
{
if ((int) JVERSION == $version)
{
return true;
}
if ($title && self::isAdmin())
{
Language::load('plg_system_regularlabs');
JFactory::getApplication()->enqueueMessage(
JText::sprintf('RL_NOT_COMPATIBLE_WITH_JOOMLA_VERSION', JText::_($title), (int) JVERSION),
'error'
);
}
return false;
}
/**
* Checks if current page is a pdf
*
* @return bool
*/
public static function isPDF()
{
$cache = new Cache(__METHOD__);
if ($cache->exists())
{
return $cache->get();
}
$input = JFactory::getApplication()->input;
$is_pdf = (
self::get()->getType() == 'pdf'
|| $input->getWord('format') == 'pdf'
|| $input->getWord('cAction') == 'pdf'
);
return $cache->set($is_pdf);
}
/**
* Loads the required scripts and styles used in forms
*/
public static function loadEditorButtonDependencies()
{
self::loadMainDependencies();
JHtml::_('bootstrap.popover');
}
/**
* Loads the required scripts and styles used in forms
*/
public static function loadFormDependencies()
{
if ((int) JVERSION != 3)
{
return;
}
JHtml::_('jquery.framework');
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidator');
JHtml::_('behavior.combobox');
JHtml::_('behavior.keepalive');
JHtml::_('behavior.tabstate');
JHtml::_('formbehavior.chosen', '#jform_position', null, ['disable_search_threshold' => 0]);
JHtml::_('formbehavior.chosen', '.multipleCategories', null, ['placeholder_text_multiple' => JText::_('JOPTION_SELECT_CATEGORY')]);
JHtml::_('formbehavior.chosen', '.multipleTags', null, ['placeholder_text_multiple' => JText::_('JOPTION_SELECT_TAG')]);
JHtml::_('formbehavior.chosen', 'select');
self::script('regularlabs/form.min.js');
self::style('regularlabs/form.min.css');
}
/**
* Loads the required scripts and styles used in forms
*/
public static function loadMainDependencies()
{
JHtml::_('jquery.framework');
self::script('regularlabs/script.min.js');
self::style('regularlabs/style.min.css');
}
public static function loadPopupDependencies()
{
self::loadMainDependencies();
self::loadFormDependencies();
self::style('regularlabs/popup.min.css');
}
/**
* Enqueues a message
*
* @param string $message
* @param string $type
*/
public static function message($message, $type = 'message')
{
Language::load('plg_system_regularlabs');
JFactory::getApplication()->enqueueMessage($message, $type);
}
/**
* Minify the given string
*
* @param string $string
*
* @return string
*/
public static function minify($string)
{
// place new lines around string to make regex searching easier
$string = "\n" . $string . "\n";
// Remove comment lines
$string = RegEx::replace('\n\s*//.*?\n', '', $string);
// Remove comment blocks
$string = RegEx::replace('/\*.*?\*/', '', $string);
// Remove enters
$string = RegEx::replace('\n\s*', ' ', $string);
// Remove surrounding whitespace
$string = trim($string);
return $string;
}
/**
* Remove joomla script options
*
* @param string $string
* @param string $name
* @param string $alias
*/
public static function removeScriptsOptions(&$string, $name, $alias = '')
{
RegEx::match(
'(<script type="application/json" class="joomla-script-options new">)(.*?)(</script>)',
$string,
$match
);
if (empty($match))
{
return;
}
$alias = $alias ?: Extension::getAliasByName($name);
$scripts = json_decode($match[2]);
if ( ! isset($scripts->{'rl_' . $alias}))
{
return;
}
unset($scripts->{'rl_' . $alias});
$string = str_replace(
$match[0],
$match[1] . json_encode($scripts) . $match[3],
$string
);
}
/**
* Remove style/css blocks from html string
*
* @param string $string
* @param string $name
* @param string $alias
*/
public static function removeScriptsStyles(&$string, $name, $alias = '')
{
[$start, $end] = Protect::getInlineCommentTags($name, null, true);
$alias = $alias ?: Extension::getAliasByName($name);
$string = RegEx::replace('((?:;\s*)?)(;?)' . $start . '.*?' . $end . '\s*', '\1', $string);
$string = RegEx::replace('\s*<link [^>]*href="[^"]*/(' . $alias . '/css|css/' . $alias . ')/[^"]*\.css[^"]*"[^>]*( /)?>', '', $string);
$string = RegEx::replace('\s*<script [^>]*src="[^"]*/(' . $alias . '/js|js/' . $alias . ')/[^"]*\.js[^"]*"[^>]*></script>', '', $string);
}
/**
* Adds a script file to the page (with optional versioning)
*
* @param string $file
* @param string $version
* @param array $options
* @param array $attribs
* @param bool $load_jquery
*/
public static function script($file, $version = '', $options = [], $attribs = [], $load_jquery = true)
{
if ( ! $url = File::getMediaFile('js', $file))
{
return;
}
if ($load_jquery)
{
JHtml::_('jquery.framework');
}
if (strpos($file, 'regularlabs/') !== false
&& strpos($file, 'regular.') === false
)
{
JHtml::_('behavior.core');
JHtml::_('script', 'jui/cms.js', ['version' => 'auto', 'relative' => true]);
$version = '23.7.24631';
}
if ( ! empty($version))
{
$url .= '?v=' . $version;
}
self::get()->addScript($url, $options, $attribs);
}
/**
* Adds a javascript declaration to the page
*
* @param string $content
* @param string $name
* @param bool $minify
* @param string $type
*/
public static function scriptDeclaration($content = '', $name = '', $minify = true, $type = 'text/javascript')
{
if ($minify)
{
$content = self::minify($content);
}
if ( ! empty($name))
{
$content = Protect::wrapScriptDeclaration($content, $name, $minify);
}
self::get()->addScriptDeclaration($content, $type);
}
/**
* Adds extension options to the page
*
* @param array $options
* @param string $name
*/
public static function scriptOptions($options = [], $name = '')
{
$key = 'rl_' . Extension::getAliasByName($name);
JHtml::_('behavior.core');
self::get()->addScriptOptions($key, $options);
}
/**
* @param string $buffer
*
* @depecated Use setComponentBuffer
*/
public static function setBuffer($buffer = '')
{
self::setComponentBuffer($buffer);
}
/**
* @param string $buffer
*/
public static function setComponentBuffer($buffer = '')
{
self::get()->setBuffer($buffer, 'component');
}
/**
* Adds a stylesheet file to the page(with optional versioning)
*
* @param string $file
* @param string $version
* @param array $options
* @param array $attribs
*/
public static function style($file, $version = '', $options = [], $attribs = [])
{
if (strpos($file, 'regularlabs/') === 0)
{
$version = '23.7.24631';
}
$file = File::getMediaFile('css', $file);
if ( ! $file)
{
return;
}
if ( ! empty($version))
{
$file .= '?v=' . $version;
}
self::get()->addStylesheet($file, $options, $attribs);
}
/**
* Adds a stylesheet declaration to the page
*
* @param string $content
* @param string $name
* @param bool $minify
* @param string $type
*/
public static function styleDeclaration($content = '', $name = '', $minify = true, $type = 'text/css')
{
if ($minify)
{
$content = self::minify($content);
}
if ( ! empty($name))
{
$content = Protect::wrapStyleDeclaration($content, $name, $minify);
}
self::get()->addStyleDeclaration($content, $type);
}
/**
* Alias of \RegularLabs\Library\Document::style()
*
* @param string $file
* @param string $version
*/
public static function stylesheet($file, $version = '')
{
self::style($file, $version);
}
}
home/digilove/public_html/plugins/system/advancedmodules/src/Document.php 0000644 00000010412 15235511452 0023022 0 ustar 00 <?php
/**
* @package Advanced Module Manager
* @version 9.8.0PRO
*
* @author Peter van Westen <info@regularlabs.com>
* @link https://regularlabs.com
* @copyright Copyright © 2023 Regular Labs All Rights Reserved
* @license GNU General Public License version 2 or later
*/
namespace RegularLabs\Plugin\System\AdvancedModules;
defined('_JEXEC') or die;
use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\HTML\HTMLHelper as JHtml;
use Joomla\CMS\Language\Text as JText;
use Joomla\CMS\Router\Route as JRoute;
use RegularLabs\Library\Document as RL_Document;
use RegularLabs\Library\Language as RL_Language;
use RegularLabs\Library\RegEx as RL_RegEx;
class Document
{
public static function loadFrontEditScript()
{
$user = JFactory::getApplication()->getIdentity() ?: JFactory::getUser();
if ( ! $user->authorise('core.edit', 'com_menus')
|| ! JFactory::getApplication()->get('frontediting', 1) == 2
)
{
return;
}
JHtml::_('jquery.framework');
RL_Document::script('advancedmodules/frontediting.min.js', '9.8.0.p');
}
/**
* Replace links to com_modules with com_advancedmodules
*/
public static function replaceLinks(&$string)
{
if (RL_Document::isClient('administrator') && JFactory::getApplication()->input->get('option') == 'com_modules')
{
self::replaceLinksInCoreModuleManager();
return;
}
$params = Params::get();
// Replace in link specifically in frontend
if (RL_Document::isClient('site') && $params->replace_urls_frontend)
{
self::replaceLinksInFrontend($string);
}
// Replace remaining links in modules in admin and frontend
if ( ! RL_Document::isClient('site') || $params->replace_urls_frontend)
{
self::replaceLinksModules($string);
}
}
private static function replaceLinksInCoreModuleManager()
{
RL_Language::load('com_advancedmodules');
$body = JFactory::getApplication()->getBody();
$url = 'index.php?option=com_advancedmodules';
if (JFactory::getApplication()->input->get('view') == 'module')
{
$url .= '&task=module.edit&id=' . (int) JFactory::getApplication()->input->get('id');
}
$link = '<a style="float:right;" href="' . JRoute::_($url) . '">' . JText::_('AMM_SWITCH_TO_ADVANCED_MODULE_MANAGER') . '</a><div style="clear:both;"></div>';
$body = RL_RegEx::replace('(</div>\s*</form>\s*(<\!--.*?-->\s*)*</div>)', $link . '\1', $body);
JFactory::getApplication()->setBody($body);
}
private static function replaceLinksInFrontend(&$string)
{
if (strpos($string, 'jmodediturl=') === false)
{
return;
}
$user = JFactory::getApplication()->getIdentity() ?: JFactory::getUser();
$params = Params::get();
$url = 'index.php?option=com_advancedmodules&view=edit&task=edit';
if ($user->authorise('core.manage', 'com_modules') && $params->use_admin_from_frontend)
{
$url = 'administrator/index.php?option=com_advancedmodules&task=module.edit';
}
$frontend_urls = [
'index.php?option=com_config&controller=config.display.modules',
'administrator/index.php?option=com_modules&view=module&layout=edit',
];
array_walk($frontend_urls, function (&$value) {
$value = RL_RegEx::quote($value);
});
$string = RL_RegEx::replace(
'(jmodediturl="[^"]*)(' . implode('|', $frontend_urls) . ')',
'\1' . $url,
$string
);
}
private static function replaceLinksModules(&$string)
{
if (strpos($string, 'com_modules') === false)
{
return;
}
$string = RL_RegEx::replace(
'((["\'])[^\s"\'%]*\?option=com_)(modules(\2|[^a-z-].*?\2))',
'\1advanced\3',
$string
);
$string = str_replace(
[
'?option=com_advancedmodules&force=1',
'?option=com_advancedmodules&force=1',
],
'?option=com_modules',
$string
);
}
}
home/digilove/public_html/110/libraries/fof30/Hal/Document.php 0000644 00000012555 15235524661 0020006 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Hal;
use FOF30\Hal\Exception\InvalidRenderFormat;
use FOF30\Hal\Render\RenderInterface;
defined('_JEXEC') or die;
/**
* Implementation of the Hypertext Application Language document in PHP. It can
* be used to provide hypermedia in a web service context.
*
* @see http://stateless.co/hal_specification.html
*/
class Document
{
/**
* The collection of links of this document
*
* @var \FOF30\Hal\Links
*/
private $_links = null;
/**
* The data (resource state or collection of resource state objects) of the
* document.
*
* @var array
*/
private $_data = null;
/**
* Embedded documents. This is an array of FOFHalDocument instances.
*
* @var array
*/
private $_embedded = array();
/**
* When $_data is an array we'll output the list of data under this key
* (JSON) or tag (XML)
*
* @var string
*/
private $_dataKey = '_list';
/**
* Public constructor
*
* @param mixed $data The data of the document (usually, the resource state)
*/
public function __construct($data = null)
{
$this->_data = $data;
$this->_links = new Links;
}
/**
* Add a link to the document
*
* @param string $rel The relation of the link to the document.
* See RFC 5988 http://tools.ietf.org/html/rfc5988#section-6.2.2 A document MUST always have
* a "self" link.
* @param Link $link The actual link object
* @param boolean $overwrite When false and a link of $rel relation exists, an array of links is created. Otherwise the
* existing link is overwriten with the new one
*
* @see Links::addLink
*
* @return boolean True if the link was added to the collection
*/
public function addLink($rel, Link $link, $overwrite = true)
{
return $this->_links->addLink($rel, $link, $overwrite);
}
/**
* Add links to the document
*
* @param string $rel The relation of the link to the document. See RFC 5988
* @param array $links An array of FOFHalLink objects
* @param boolean $overwrite When false and a link of $rel relation exists, an array of
* links is created. Otherwise the existing link is overwriten
* with the new one
*
* @see Links::addLinks
*
* @return boolean
*/
public function addLinks($rel, array $links, $overwrite = true)
{
return $this->_links->addLinks($rel, $links, $overwrite);
}
/**
* Add data to the document
*
* @param \stdClass $data The data to add
* @param boolean $overwrite Should I overwrite existing data?
*
* @return void
*/
public function addData($data, $overwrite = true)
{
if (is_array($data))
{
$data = (object) $data;
}
if ($overwrite)
{
$this->_data = $data;
}
else
{
if (!is_array($this->_data))
{
$this->_data = array($this->_data);
}
$this->_data[] = $data;
}
}
/**
* Add an embedded document
*
* @param string $rel The relation of the embedded document to its container document
* @param Document $document The document to add
* @param boolean $overwrite Should I overwrite existing data with the same relation?
*
* @return boolean
*/
public function addEmbedded($rel, Document $document, $overwrite = true)
{
if (!array_key_exists($rel, $this->_embedded) || $overwrite)
{
$this->_embedded[$rel] = $document;
return true;
}
elseif (array_key_exists($rel, $this->_embedded) && !$overwrite)
{
if (!is_array($this->_embedded[$rel]))
{
$this->_embedded[$rel] = array($this->_embedded[$rel]);
}
$this->_embedded[$rel][] = $document;
return true;
}
else
{
return false;
}
}
/**
* Returns the collection of links of this document
*
* @param string $rel The relation of the links to fetch. Skip to get all links.
*
* @return array
*/
public function getLinks($rel = null)
{
return $this->_links->getLinks($rel);
}
/**
* Returns the collection of embedded documents
*
* @param string $rel Optional; the relation to return the embedded documents for
*
* @return array|Document
*/
public function getEmbedded($rel = null)
{
if (empty($rel))
{
return $this->_embedded;
}
elseif (isset($this->_embedded[$rel]))
{
return $this->_embedded[$rel];
}
else
{
return array();
}
}
/**
* Return the data attached to this document
*
* @return array|\stdClass
*/
public function getData()
{
return $this->_data;
}
/**
* Instantiate and call a suitable renderer class to render this document
* into the specified format.
*
* @param string $format The format to render the document into, e.g. 'json'
*
* @return string The rendered document
*
* @throws \LogicException If the format is unknown, i.e. there is no suitable renderer
*/
public function render($format = 'json')
{
$class_name = '\\FOF30\\Hal\\Render\\' . ucfirst($format);
if (!class_exists($class_name, true))
{
throw new InvalidRenderFormat($format);
}
/** @var RenderInterface $renderer */
$renderer = new $class_name($this);
return $renderer->render(
array(
'data_key' => $this->_dataKey
)
);
}
}
home/digilove/public_html/110/libraries/src/Document/Document.php 0000644 00000063761 15235562134 0020734 0 ustar 00 <?php
/**
* Joomla! Content Management System
*
* @copyright (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\CMS\Document;
defined('JPATH_PLATFORM') or die;
use Joomla\CMS\Date\Date;
/**
* Document class, provides an easy interface to parse and display a document
*
* @since 1.7.0
*/
class Document
{
/**
* Document title
*
* @var string
* @since 1.7.0
*/
public $title = '';
/**
* Document description
*
* @var string
* @since 1.7.0
*/
public $description = '';
/**
* Document full URL
*
* @var string
* @since 1.7.0
*/
public $link = '';
/**
* Document base URL
*
* @var string
* @since 1.7.0
*/
public $base = '';
/**
* Contains the document language setting
*
* @var string
* @since 1.7.0
*/
public $language = 'en-gb';
/**
* Contains the document direction setting
*
* @var string
* @since 1.7.0
*/
public $direction = 'ltr';
/**
* Document generator
*
* @var string
* @since 1.7.0
*/
public $_generator = 'Joomla! - Open Source Content Management';
/**
* Document modified date
*
* @var string|Date
* @since 1.7.0
*/
public $_mdate = '';
/**
* Tab string
*
* @var string
* @since 1.7.0
*/
public $_tab = "\11";
/**
* Contains the line end string
*
* @var string
* @since 1.7.0
*/
public $_lineEnd = "\12";
/**
* Contains the character encoding string
*
* @var string
* @since 1.7.0
*/
public $_charset = 'utf-8';
/**
* Document mime type
*
* @var string
* @since 1.7.0
*/
public $_mime = '';
/**
* Document namespace
*
* @var string
* @since 1.7.0
*/
public $_namespace = '';
/**
* Document profile
*
* @var string
* @since 1.7.0
*/
public $_profile = '';
/**
* Array of linked scripts
*
* @var array
* @since 1.7.0
*/
public $_scripts = array();
/**
* Array of scripts placed in the header
*
* @var array
* @since 1.7.0
*/
public $_script = array();
/**
* Array of scripts options
*
* @var array
*/
protected $scriptOptions = array();
/**
* Array of linked style sheets
*
* @var array
* @since 1.7.0
*/
public $_styleSheets = array();
/**
* Array of included style declarations
*
* @var array
* @since 1.7.0
*/
public $_style = array();
/**
* Array of meta tags
*
* @var array
* @since 1.7.0
*/
public $_metaTags = array();
/**
* The rendering engine
*
* @var object
* @since 1.7.0
*/
public $_engine = null;
/**
* The document type
*
* @var string
* @since 1.7.0
*/
public $_type = null;
/**
* Array of buffered output
*
* @var mixed (depends on the renderer)
* @since 1.7.0
*/
public static $_buffer = null;
/**
* Document instances container.
*
* @var array
* @since 1.7.3
*/
protected static $instances = array();
/**
* Media version added to assets
*
* @var string
* @since 3.2
*/
protected $mediaVersion = null;
/**
* Class constructor.
*
* @param array $options Associative array of options
*
* @since 1.7.0
*/
public function __construct($options = array())
{
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']);
}
if (array_key_exists('mediaversion', $options))
{
$this->setMediaVersion($options['mediaversion']);
}
}
/**
* Returns the global Document object, only creating it
* if it doesn't already exist.
*
* @param string $type The document type to instantiate
* @param array $attributes Array of attributes
*
* @return object The document object.
*
* @since 1.7.0
*/
public static function getInstance($type = 'html', $attributes = array())
{
$signature = serialize(array($type, $attributes));
if (empty(self::$instances[$signature]))
{
$type = preg_replace('/[^A-Z0-9_\.-]/i', '', $type);
$ntype = null;
// Determine the path and class
$class = __NAMESPACE__ . '\\' . ucfirst($type) . 'Document';
if (!class_exists($class))
{
$class = 'JDocument' . ucfirst($type);
}
if (!class_exists($class))
{
// @deprecated 4.0 - Document objects should be autoloaded instead
$path = __DIR__ . '/' . $type . '/' . $type . '.php';
\JLoader::register($class, $path);
if (class_exists($class))
{
\JLog::add('Non-autoloadable Document subclasses are deprecated, support will be removed in 4.0.', \JLog::WARNING, 'deprecated');
}
// Default to the raw format
else
{
$ntype = $type;
$class = 'JDocumentRaw';
}
}
$instance = new $class($attributes);
self::$instances[$signature] = $instance;
if (!is_null($ntype))
{
// Set the type to the Document type originally requested
$instance->setType($ntype);
}
}
return self::$instances[$signature];
}
/**
* Set the document type
*
* @param string $type Type document is to set to
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setType($type)
{
$this->_type = $type;
return $this;
}
/**
* Returns the document type
*
* @return string
*
* @since 1.7.0
*/
public function getType()
{
return $this->_type;
}
/**
* Get the contents of the document buffer
*
* @return mixed
*
* @since 1.7.0
*/
public function getBuffer()
{
return self::$_buffer;
}
/**
* Set the contents of the document buffer
*
* @param string $content The content to be set in the buffer.
* @param array $options Array of optional elements.
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setBuffer($content, $options = array())
{
self::$_buffer = $content;
return $this;
}
/**
* Gets a meta tag.
*
* @param string $name Name of the meta HTML tag
* @param string $attribute Attribute to use in the meta HTML tag
*
* @return string
*
* @since 1.7.0
*/
public function getMetaData($name, $attribute = 'name')
{
// B/C old http_equiv parameter.
if (!is_string($attribute))
{
$attribute = $attribute == true ? 'http-equiv' : 'name';
}
if ($name == 'generator')
{
$result = $this->getGenerator();
}
elseif ($name == 'description')
{
$result = $this->getDescription();
}
else
{
$result = isset($this->_metaTags[$attribute]) && isset($this->_metaTags[$attribute][$name]) ? $this->_metaTags[$attribute][$name] : '';
}
return $result;
}
/**
* Sets or alters a meta tag.
*
* @param string $name Name of the meta HTML tag
* @param mixed $content Value of the meta HTML tag as array or string
* @param string $attribute Attribute to use in the meta HTML tag
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setMetaData($name, $content, $attribute = 'name')
{
// Pop the element off the end of array if target function expects a string or this http_equiv parameter.
if (is_array($content) && (in_array($name, array('generator', 'description')) || !is_string($attribute)))
{
$content = array_pop($content);
}
// B/C old http_equiv parameter.
if (!is_string($attribute))
{
$attribute = $attribute == true ? 'http-equiv' : 'name';
}
if ($name == 'generator')
{
$this->setGenerator($content);
}
elseif ($name == 'description')
{
$this->setDescription($content);
}
else
{
$this->_metaTags[$attribute][$name] = $content;
}
return $this;
}
/**
* Adds a linked script to the page
*
* @param string $url URL to the linked script.
* @param array $options Array of options. Example: array('version' => 'auto', 'conditional' => 'lt IE 9')
* @param array $attribs Array of attributes. Example: array('id' => 'scriptid', 'async' => 'async', 'data-test' => 1)
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
* @deprecated 4.0 The (url, mime, defer, async) method signature is deprecated, use (url, options, attributes) instead.
*/
public function addScript($url, $options = array(), $attribs = array())
{
// B/C before 3.7.0
if (!is_array($options) && (!is_array($attribs) || $attribs === array()))
{
\JLog::add('The addScript method signature used has changed, use (url, options, attributes) instead.', \JLog::WARNING, 'deprecated');
$argList = func_get_args();
$options = array();
$attribs = array();
// Old mime type parameter.
if (!empty($argList[1]))
{
$attribs['mime'] = $argList[1];
}
// Old defer parameter.
if (isset($argList[2]) && $argList[2])
{
$attribs['defer'] = true;
}
// Old async parameter.
if (isset($argList[3]) && $argList[3])
{
$attribs['async'] = true;
}
}
// Default value for type.
if (!isset($attribs['type']) && !isset($attribs['mime']))
{
$attribs['type'] = 'text/javascript';
}
$this->_scripts[$url] = isset($this->_scripts[$url]) ? array_replace($this->_scripts[$url], $attribs) : $attribs;
$this->_scripts[$url]['options'] = isset($this->_scripts[$url]['options']) ? array_replace($this->_scripts[$url]['options'], $options) : $options;
return $this;
}
/**
* Adds a linked script to the page with a version to allow to flush it. Ex: myscript.js?54771616b5bceae9df03c6173babf11d
* If not specified Joomla! automatically handles versioning
*
* @param string $url URL to the linked script.
* @param array $options Array of options. Example: array('version' => 'auto', 'conditional' => 'lt IE 9')
* @param array $attribs Array of attributes. Example: array('id' => 'scriptid', 'async' => 'async', 'data-test' => 1)
*
* @return Document instance of $this to allow chaining
*
* @since 3.2
* @deprecated 4.0 This method is deprecated, use addScript(url, options, attributes) instead.
*/
public function addScriptVersion($url, $options = array(), $attribs = array())
{
\JLog::add('The method is deprecated, use addScript(url, attributes, options) instead.', \JLog::WARNING, 'deprecated');
// B/C before 3.7.0
if (!is_array($options) && (!is_array($attribs) || $attribs === array()))
{
$argList = func_get_args();
$options = array();
$attribs = array();
// Old version parameter.
$options['version'] = isset($argList[1]) && !is_null($argList[1]) ? $argList[1] : 'auto';
// Old mime type parameter.
if (!empty($argList[2]))
{
$attribs['mime'] = $argList[2];
}
// Old defer parameter.
if (isset($argList[3]) && $argList[3])
{
$attribs['defer'] = true;
}
// Old async parameter.
if (isset($argList[4]) && $argList[4])
{
$attribs['async'] = true;
}
}
// Default value for version.
else
{
$options['version'] = 'auto';
}
return $this->addScript($url, $options, $attribs);
}
/**
* Adds a script to the page
*
* @param string $content Script
* @param string $type Scripting mime (defaults to 'text/javascript')
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public 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;
}
return $this;
}
/**
* Add option for script
*
* @param string $key Name in Storage
* @param mixed $options Scrip options as array or string
* @param bool $merge Whether merge with existing (true) or replace (false)
*
* @return Document instance of $this to allow chaining
*
* @since 3.5
*/
public function addScriptOptions($key, $options, $merge = true)
{
if (empty($this->scriptOptions[$key]))
{
$this->scriptOptions[$key] = array();
}
if ($merge && is_array($options))
{
$this->scriptOptions[$key] = array_replace_recursive($this->scriptOptions[$key], $options);
}
else
{
$this->scriptOptions[$key] = $options;
}
return $this;
}
/**
* Get script(s) options
*
* @param string $key Name in Storage
*
* @return array Options for given $key, or all script options
*
* @since 3.5
*/
public function getScriptOptions($key = null)
{
if ($key)
{
return (empty($this->scriptOptions[$key])) ? array() : $this->scriptOptions[$key];
}
else
{
return $this->scriptOptions;
}
}
/**
* Adds a linked stylesheet to the page
*
* @param string $url URL to the linked style sheet
* @param array $options Array of options. Example: array('version' => 'auto', 'conditional' => 'lt IE 9')
* @param array $attribs Array of attributes. Example: array('id' => 'stylesheet', 'data-test' => 1)
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
* @deprecated 4.0 The (url, mime, media, attribs) method signature is deprecated, use (url, options, attributes) instead.
*/
public function addStyleSheet($url, $options = array(), $attribs = array())
{
// B/C before 3.7.0
if (is_string($options))
{
\JLog::add('The addStyleSheet method signature used has changed, use (url, options, attributes) instead.', \JLog::WARNING, 'deprecated');
$argList = func_get_args();
$options = array();
$attribs = array();
// Old mime type parameter.
if (!empty($argList[1]))
{
$attribs['type'] = $argList[1];
}
// Old media parameter.
if (isset($argList[2]) && $argList[2])
{
$attribs['media'] = $argList[2];
}
// Old attribs parameter.
if (isset($argList[3]) && $argList[3])
{
$attribs = array_replace($attribs, $argList[3]);
}
}
// Default value for type.
if (!isset($attribs['type']) && !isset($attribs['mime']))
{
$attribs['type'] = 'text/css';
}
$this->_styleSheets[$url] = isset($this->_styleSheets[$url]) ? array_replace($this->_styleSheets[$url], $attribs) : $attribs;
if (isset($this->_styleSheets[$url]['options']))
{
$this->_styleSheets[$url]['options'] = array_replace($this->_styleSheets[$url]['options'], $options);
}
else
{
$this->_styleSheets[$url]['options'] = $options;
}
return $this;
}
/**
* Adds a linked stylesheet version to the page. Ex: template.css?54771616b5bceae9df03c6173babf11d
* If not specified Joomla! automatically handles versioning
*
* @param string $url URL to the linked style sheet
* @param array $options Array of options. Example: array('version' => 'auto', 'conditional' => 'lt IE 9')
* @param array $attribs Array of attributes. Example: array('id' => 'stylesheet', 'data-test' => 1)
*
* @return Document instance of $this to allow chaining
*
* @since 3.2
* @deprecated 4.0 This method is deprecated, use addStyleSheet(url, options, attributes) instead.
*/
public function addStyleSheetVersion($url, $options = array(), $attribs = array())
{
\JLog::add('The method is deprecated, use addStyleSheet(url, attributes, options) instead.', \JLog::WARNING, 'deprecated');
// B/C before 3.7.0
if (!is_array($options) && (!is_array($attribs) || $attribs === array()))
{
$argList = func_get_args();
$options = array();
$attribs = array();
// Old version parameter.
$options['version'] = isset($argList[1]) && !is_null($argList[1]) ? $argList[1] : 'auto';
// Old mime type parameter.
if (!empty($argList[2]))
{
$attribs['mime'] = $argList[2];
}
// Old media parameter.
if (isset($argList[3]) && $argList[3])
{
$attribs['media'] = $argList[3];
}
// Old attribs parameter.
if (isset($argList[4]) && $argList[4])
{
$attribs = array_replace($attribs, $argList[4]);
}
}
// Default value for version.
else
{
$options['version'] = 'auto';
}
return $this->addStyleSheet($url, $options, $attribs);
}
/**
* Adds a stylesheet declaration to the page
*
* @param string $content Style declarations
* @param string $type Type of stylesheet (defaults to 'text/css')
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public 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;
}
return $this;
}
/**
* Sets the document charset
*
* @param string $type Charset encoding string
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setCharset($type = 'utf-8')
{
$this->_charset = $type;
return $this;
}
/**
* Returns the document charset encoding.
*
* @return string
*
* @since 1.7.0
*/
public function getCharset()
{
return $this->_charset;
}
/**
* Sets the global document language declaration. Default is English (en-gb).
*
* @param string $lang The language to be set
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setLanguage($lang = 'en-gb')
{
$this->language = strtolower($lang);
return $this;
}
/**
* Returns the document language.
*
* @return string
*
* @since 1.7.0
*/
public function getLanguage()
{
return $this->language;
}
/**
* Sets the global document direction declaration. Default is left-to-right (ltr).
*
* @param string $dir The language direction to be set
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setDirection($dir = 'ltr')
{
$this->direction = strtolower($dir);
return $this;
}
/**
* Returns the document direction declaration.
*
* @return string
*
* @since 1.7.0
*/
public function getDirection()
{
return $this->direction;
}
/**
* Sets the title of the document
*
* @param string $title The title to be set
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setTitle($title)
{
$this->title = $title;
return $this;
}
/**
* Return the title of the document.
*
* @return string
*
* @since 1.7.0
*/
public function getTitle()
{
return $this->title;
}
/**
* Set the assets version
*
* @param string $mediaVersion Media version to use
*
* @return Document instance of $this to allow chaining
*
* @since 3.2
*/
public function setMediaVersion($mediaVersion)
{
$this->mediaVersion = strtolower($mediaVersion);
return $this;
}
/**
* Return the media version
*
* @return string
*
* @since 3.2
*/
public function getMediaVersion()
{
return $this->mediaVersion;
}
/**
* Sets the base URI of the document
*
* @param string $base The base URI to be set
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setBase($base)
{
$this->base = $base;
return $this;
}
/**
* Return the base URI of the document.
*
* @return string
*
* @since 1.7.0
*/
public function getBase()
{
return $this->base;
}
/**
* Sets the description of the document
*
* @param string $description The description to set
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setDescription($description)
{
$this->description = $description;
return $this;
}
/**
* Return the description of the document.
*
* @return string
*
* @since 1.7.0
*/
public function getDescription()
{
return $this->description;
}
/**
* Sets the document link
*
* @param string $url A url
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setLink($url)
{
$this->link = $url;
return $this;
}
/**
* Returns the document base url
*
* @return string
*
* @since 1.7.0
*/
public function getLink()
{
return $this->link;
}
/**
* Sets the document generator
*
* @param string $generator The generator to be set
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setGenerator($generator)
{
$this->_generator = $generator;
return $this;
}
/**
* Returns the document generator
*
* @return string
*
* @since 1.7.0
*/
public function getGenerator()
{
return $this->_generator;
}
/**
* Sets the document modified date
*
* @param string|Date $date The date to be set
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
* @throws \InvalidArgumentException
*/
public function setModifiedDate($date)
{
if (!is_string($date) && !($date instanceof Date))
{
throw new \InvalidArgumentException(
sprintf(
'The $date parameter of %1$s must be a string or a %2$s instance, a %3$s was given.',
__METHOD__ . '()',
'Joomla\\CMS\\Date\\Date',
gettype($date) === 'object' ? (get_class($date) . ' instance') : gettype($date)
)
);
}
$this->_mdate = $date;
return $this;
}
/**
* Returns the document modified date
*
* @return string|Date
*
* @since 1.7.0
*/
public function getModifiedDate()
{
return $this->_mdate;
}
/**
* Sets the document MIME encoding that is sent to the browser.
*
* 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.
*
* @param string $type The document type to be sent
* @param boolean $sync Should the type be synced with HTML?
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*
* @link http://www.w3.org/TR/xhtml-media-types
*/
public function setMimeEncoding($type = 'text/html', $sync = true)
{
$this->_mime = strtolower($type);
// Syncing with metadata
if ($sync)
{
$this->setMetaData('content-type', $type . '; charset=' . $this->_charset, true);
}
return $this;
}
/**
* Return the document MIME encoding that is sent to the browser.
*
* @return string
*
* @since 1.7.0
*/
public function getMimeEncoding()
{
return $this->_mime;
}
/**
* Sets the line end style to Windows, Mac, Unix or a custom string.
*
* @param string $style "win", "mac", "unix" or custom string.
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public 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;
}
return $this;
}
/**
* Returns the lineEnd
*
* @return string
*
* @since 1.7.0
*/
public function _getLineEnd()
{
return $this->_lineEnd;
}
/**
* Sets the string used to indent HTML
*
* @param string $string String used to indent ("\11", "\t", ' ', etc.).
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function setTab($string)
{
$this->_tab = $string;
return $this;
}
/**
* Returns a string containing the unit for indenting HTML
*
* @return string
*
* @since 1.7.0
*/
public function _getTab()
{
return $this->_tab;
}
/**
* Load a renderer
*
* @param string $type The renderer type
*
* @return DocumentRenderer
*
* @since 1.7.0
* @throws \RuntimeException
*/
public function loadRenderer($type)
{
// Determine the path and class
$class = __NAMESPACE__ . '\\Renderer\\' . ucfirst($this->getType()) . '\\' . ucfirst($type) . 'Renderer';
if (!class_exists($class))
{
$class = 'JDocumentRenderer' . ucfirst($this->getType()) . ucfirst($type);
}
if (!class_exists($class))
{
// "Legacy" class name structure
$class = 'JDocumentRenderer' . $type;
if (!class_exists($class))
{
// @deprecated 4.0 - Non-autoloadable class support is deprecated, only log a message though if a file is found
$path = __DIR__ . '/' . $this->getType() . '/renderer/' . $type . '.php';
if (!file_exists($path))
{
throw new \RuntimeException('Unable to load renderer class', 500);
}
\JLoader::register($class, $path);
\JLog::add('Non-autoloadable JDocumentRenderer subclasses are deprecated, support will be removed in 4.0.', \JLog::WARNING, 'deprecated');
// If the class still doesn't exist after including the path, we've got issues
if (!class_exists($class))
{
throw new \RuntimeException('Unable to load renderer class', 500);
}
}
}
return new $class($this);
}
/**
* Parses the document and prepares the buffers
*
* @param array $params The array of parameters
*
* @return Document instance of $this to allow chaining
*
* @since 1.7.0
*/
public function parse($params = array())
{
return $this;
}
/**
* Outputs the document
*
* @param boolean $cache If true, cache the output
* @param array $params Associative array of attributes
*
* @return void The rendered data
*
* @since 1.7.0
*/
public function render($cache = false, $params = array())
{
$app = \JFactory::getApplication();
if ($mdate = $this->getModifiedDate())
{
if (!($mdate instanceof Date))
{
$mdate = new Date($mdate);
}
$app->modifiedDate = $mdate;
}
$app->mimeType = $this->_mime;
$app->charSet = $this->_charset;
}
}
home/digilove/public_html/libraries/fof30/Hal/Document.php 0000644 00000012555 15235575251 0017506 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Hal;
use FOF30\Hal\Exception\InvalidRenderFormat;
use FOF30\Hal\Render\RenderInterface;
defined('_JEXEC') or die;
/**
* Implementation of the Hypertext Application Language document in PHP. It can
* be used to provide hypermedia in a web service context.
*
* @see http://stateless.co/hal_specification.html
*/
class Document
{
/**
* The collection of links of this document
*
* @var \FOF30\Hal\Links
*/
private $_links = null;
/**
* The data (resource state or collection of resource state objects) of the
* document.
*
* @var array
*/
private $_data = null;
/**
* Embedded documents. This is an array of FOFHalDocument instances.
*
* @var array
*/
private $_embedded = array();
/**
* When $_data is an array we'll output the list of data under this key
* (JSON) or tag (XML)
*
* @var string
*/
private $_dataKey = '_list';
/**
* Public constructor
*
* @param mixed $data The data of the document (usually, the resource state)
*/
public function __construct($data = null)
{
$this->_data = $data;
$this->_links = new Links;
}
/**
* Add a link to the document
*
* @param string $rel The relation of the link to the document.
* See RFC 5988 http://tools.ietf.org/html/rfc5988#section-6.2.2 A document MUST always have
* a "self" link.
* @param Link $link The actual link object
* @param boolean $overwrite When false and a link of $rel relation exists, an array of links is created. Otherwise the
* existing link is overwriten with the new one
*
* @see Links::addLink
*
* @return boolean True if the link was added to the collection
*/
public function addLink($rel, Link $link, $overwrite = true)
{
return $this->_links->addLink($rel, $link, $overwrite);
}
/**
* Add links to the document
*
* @param string $rel The relation of the link to the document. See RFC 5988
* @param array $links An array of FOFHalLink objects
* @param boolean $overwrite When false and a link of $rel relation exists, an array of
* links is created. Otherwise the existing link is overwriten
* with the new one
*
* @see Links::addLinks
*
* @return boolean
*/
public function addLinks($rel, array $links, $overwrite = true)
{
return $this->_links->addLinks($rel, $links, $overwrite);
}
/**
* Add data to the document
*
* @param \stdClass $data The data to add
* @param boolean $overwrite Should I overwrite existing data?
*
* @return void
*/
public function addData($data, $overwrite = true)
{
if (is_array($data))
{
$data = (object) $data;
}
if ($overwrite)
{
$this->_data = $data;
}
else
{
if (!is_array($this->_data))
{
$this->_data = array($this->_data);
}
$this->_data[] = $data;
}
}
/**
* Add an embedded document
*
* @param string $rel The relation of the embedded document to its container document
* @param Document $document The document to add
* @param boolean $overwrite Should I overwrite existing data with the same relation?
*
* @return boolean
*/
public function addEmbedded($rel, Document $document, $overwrite = true)
{
if (!array_key_exists($rel, $this->_embedded) || $overwrite)
{
$this->_embedded[$rel] = $document;
return true;
}
elseif (array_key_exists($rel, $this->_embedded) && !$overwrite)
{
if (!is_array($this->_embedded[$rel]))
{
$this->_embedded[$rel] = array($this->_embedded[$rel]);
}
$this->_embedded[$rel][] = $document;
return true;
}
else
{
return false;
}
}
/**
* Returns the collection of links of this document
*
* @param string $rel The relation of the links to fetch. Skip to get all links.
*
* @return array
*/
public function getLinks($rel = null)
{
return $this->_links->getLinks($rel);
}
/**
* Returns the collection of embedded documents
*
* @param string $rel Optional; the relation to return the embedded documents for
*
* @return array|Document
*/
public function getEmbedded($rel = null)
{
if (empty($rel))
{
return $this->_embedded;
}
elseif (isset($this->_embedded[$rel]))
{
return $this->_embedded[$rel];
}
else
{
return array();
}
}
/**
* Return the data attached to this document
*
* @return array|\stdClass
*/
public function getData()
{
return $this->_data;
}
/**
* Instantiate and call a suitable renderer class to render this document
* into the specified format.
*
* @param string $format The format to render the document into, e.g. 'json'
*
* @return string The rendered document
*
* @throws \LogicException If the format is unknown, i.e. there is no suitable renderer
*/
public function render($format = 'json')
{
$class_name = '\\FOF30\\Hal\\Render\\' . ucfirst($format);
if (!class_exists($class_name, true))
{
throw new InvalidRenderFormat($format);
}
/** @var RenderInterface $renderer */
$renderer = new $class_name($this);
return $renderer->render(
array(
'data_key' => $this->_dataKey
)
);
}
}