304 lines
6.1 KiB
PHP
304 lines
6.1 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* @package Joomla.Platform
|
||
|
* @subpackage Document
|
||
|
*
|
||
|
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
|
||
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||
|
*/
|
||
|
|
||
|
defined('JPATH_PLATFORM') or die;
|
||
|
|
||
|
/**
|
||
|
* OpenSearch class, provides an easy interface to display an OpenSearch document
|
||
|
*
|
||
|
* @package Joomla.Platform
|
||
|
* @subpackage Document
|
||
|
* @see http://www.opensearch.org/
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
class JDocumentOpensearch extends JDocument
|
||
|
{
|
||
|
/**
|
||
|
* ShortName element
|
||
|
*
|
||
|
* required
|
||
|
*
|
||
|
* @var string
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
private $_shortName = "";
|
||
|
|
||
|
/**
|
||
|
* Images collection
|
||
|
*
|
||
|
* optional
|
||
|
*
|
||
|
* @var object
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
private $_images = array();
|
||
|
|
||
|
/**
|
||
|
* The url collection
|
||
|
*
|
||
|
* @var array
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
private $_urls = array();
|
||
|
|
||
|
/**
|
||
|
* Class constructor
|
||
|
*
|
||
|
* @param array $options Associative array of options
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public function __construct($options = array())
|
||
|
{
|
||
|
parent::__construct($options);
|
||
|
|
||
|
// Set document type
|
||
|
$this->_type = 'opensearch';
|
||
|
|
||
|
// Set mime type
|
||
|
$this->_mime = 'application/opensearchdescription+xml';
|
||
|
|
||
|
// Add the URL for self updating
|
||
|
$update = new JOpenSearchUrl;
|
||
|
$update->type = 'application/opensearchdescription+xml';
|
||
|
$update->rel = 'self';
|
||
|
$update->template = JRoute::_(JUri::getInstance());
|
||
|
$this->addUrl($update);
|
||
|
|
||
|
// Add the favicon as the default image
|
||
|
// Try to find a favicon by checking the template and root folder
|
||
|
$app = JFactory::getApplication();
|
||
|
$dirs = array(JPATH_THEMES . '/' . $app->getTemplate(), JPATH_BASE);
|
||
|
|
||
|
foreach ($dirs as $dir)
|
||
|
{
|
||
|
if (file_exists($dir . '/favicon.ico'))
|
||
|
{
|
||
|
|
||
|
$path = str_replace(JPATH_BASE . '/', '', $dir);
|
||
|
$path = str_replace('\\', '/', $path);
|
||
|
|
||
|
$favicon = new JOpenSearchImage;
|
||
|
$favicon->data = JUri::base() . $path . '/favicon.ico';
|
||
|
$favicon->height = '16';
|
||
|
$favicon->width = '16';
|
||
|
$favicon->type = 'image/vnd.microsoft.icon';
|
||
|
|
||
|
$this->addImage($favicon);
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Render the document
|
||
|
*
|
||
|
* @param boolean $cache If true, cache the output
|
||
|
* @param array $params Associative array of attributes
|
||
|
*
|
||
|
* @return The rendered data
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public function render($cache = false, $params = array())
|
||
|
{
|
||
|
$xml = new DOMDocument('1.0', 'utf-8');
|
||
|
if (defined('JDEBUG') && JDEBUG)
|
||
|
{
|
||
|
$xml->formatOutput = true;
|
||
|
}
|
||
|
|
||
|
// The OpenSearch Namespace
|
||
|
$osns = 'http://a9.com/-/spec/opensearch/1.1/';
|
||
|
|
||
|
// Create the root element
|
||
|
$elOs = $xml->createElementNS($osns, 'OpenSearchDescription');
|
||
|
|
||
|
$elShortName = $xml->createElementNS($osns, 'ShortName');
|
||
|
$elShortName->appendChild($xml->createTextNode(htmlspecialchars($this->_shortName)));
|
||
|
$elOs->appendChild($elShortName);
|
||
|
|
||
|
$elDescription = $xml->createElementNS($osns, 'Description');
|
||
|
$elDescription->appendChild($xml->createTextNode(htmlspecialchars($this->description)));
|
||
|
$elOs->appendChild($elDescription);
|
||
|
|
||
|
// Always set the accepted input encoding to UTF-8
|
||
|
$elInputEncoding = $xml->createElementNS($osns, 'InputEncoding');
|
||
|
$elInputEncoding->appendChild($xml->createTextNode('UTF-8'));
|
||
|
$elOs->appendChild($elInputEncoding);
|
||
|
|
||
|
foreach ($this->_images as $image)
|
||
|
{
|
||
|
$elImage = $xml->createElementNS($osns, 'Image');
|
||
|
$elImage->setAttribute('type', $image->type);
|
||
|
$elImage->setAttribute('width', $image->width);
|
||
|
$elImage->setAttribute('height', $image->height);
|
||
|
$elImage->appendChild($xml->createTextNode(htmlspecialchars($image->data)));
|
||
|
$elOs->appendChild($elImage);
|
||
|
}
|
||
|
|
||
|
foreach ($this->_urls as $url)
|
||
|
{
|
||
|
$elUrl = $xml->createElementNS($osns, 'Url');
|
||
|
$elUrl->setAttribute('type', $url->type);
|
||
|
|
||
|
// Results is the default value so we don't need to add it
|
||
|
if ($url->rel != 'results')
|
||
|
{
|
||
|
$elUrl->setAttribute('rel', $url->rel);
|
||
|
}
|
||
|
$elUrl->setAttribute('template', $url->template);
|
||
|
$elOs->appendChild($elUrl);
|
||
|
}
|
||
|
|
||
|
$xml->appendChild($elOs);
|
||
|
parent::render();
|
||
|
return $xml->saveXML();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the short name
|
||
|
*
|
||
|
* @param string $name The name.
|
||
|
*
|
||
|
* @return JDocumentOpensearch instance of $this to allow chaining
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public function setShortName($name)
|
||
|
{
|
||
|
$this->_shortName = $name;
|
||
|
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds an URL to the OpenSearch description.
|
||
|
*
|
||
|
* @param JOpenSearchUrl $url The url to add to the description.
|
||
|
*
|
||
|
* @return JDocumentOpensearch instance of $this to allow chaining
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public function addUrl(JOpenSearchUrl $url)
|
||
|
{
|
||
|
$this->_urls[] = $url;
|
||
|
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds an image to the OpenSearch description.
|
||
|
*
|
||
|
* @param JOpenSearchImage $image The image to add to the description.
|
||
|
*
|
||
|
* @return JDocumentOpensearch instance of $this to allow chaining
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public function addImage(JOpenSearchImage $image)
|
||
|
{
|
||
|
$this->_images[] = $image;
|
||
|
|
||
|
return $this;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* JOpenSearchUrl is an internal class that stores the search URLs for the OpenSearch description
|
||
|
*
|
||
|
* @package Joomla.Platform
|
||
|
* @subpackage Document
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
class JOpenSearchUrl
|
||
|
{
|
||
|
/**
|
||
|
* Type item element
|
||
|
*
|
||
|
* required
|
||
|
*
|
||
|
* @var string
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public $type = 'text/html';
|
||
|
|
||
|
/**
|
||
|
* Rel item element
|
||
|
*
|
||
|
* required
|
||
|
*
|
||
|
* @var string
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public $rel = 'results';
|
||
|
|
||
|
/**
|
||
|
* Template item element. Has to contain the {searchTerms} parameter to work.
|
||
|
*
|
||
|
* required
|
||
|
*
|
||
|
* @var string
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public $template;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* JOpenSearchImage is an internal class that stores Images for the OpenSearch Description
|
||
|
*
|
||
|
* @package Joomla.Platform
|
||
|
* @subpackage Document
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
class JOpenSearchImage
|
||
|
{
|
||
|
/**
|
||
|
* The images MIME type
|
||
|
*
|
||
|
* required
|
||
|
*
|
||
|
* @var string
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public $type = "";
|
||
|
|
||
|
/**
|
||
|
* URL of the image or the image as base64 encoded value
|
||
|
*
|
||
|
* required
|
||
|
*
|
||
|
* @var string
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public $data = "";
|
||
|
|
||
|
/**
|
||
|
* The image's width
|
||
|
*
|
||
|
* required
|
||
|
*
|
||
|
* @var string
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public $width;
|
||
|
|
||
|
/**
|
||
|
* The image's height
|
||
|
*
|
||
|
* required
|
||
|
*
|
||
|
* @var string
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public $height;
|
||
|
}
|