* @author Kornel LesiĆski
* @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License
* @version SVN: $Id: XmlnsState.php 865 2010-05-25 22:16:24Z kornel $
* @link http://phptal.org/
*/
/**
* Stores XMLNS aliases fluctuation in the xml flow.
*
* This class is used to bind a PHPTAL namespace to an alias, for example using
* xmlns:t="http://xml.zope.org/namespaces/tal" and later use t:repeat instead
* of tal:repeat.
*
* @package PHPTAL
* @subpackage Dom
* @author Laurent Bedubourg
*/
class PHPTAL_Dom_XmlnsState
{
/** Create a new XMLNS state inheriting provided aliases. */
public function __construct(array $prefix_to_uri, $current_default)
{
$this->prefix_to_uri = $prefix_to_uri;
$this->current_default = $current_default;
}
public function prefixToNamespaceURI($prefix)
{
if ($prefix === 'xmlns') return 'http://www.w3.org/2000/xmlns/';
if ($prefix === 'xml') return 'http://www.w3.org/XML/1998/namespace';
// domdefs provides fallback for all known phptal ns
if (isset($this->prefix_to_uri[$prefix])) {
return $this->prefix_to_uri[$prefix];
} else {
return PHPTAL_Dom_Defs::getInstance()->prefixToNamespaceURI($prefix);
}
}
/** Returns true if $attName is a valid attribute name, false otherwise. */
public function isValidAttributeNS($namespace_uri, $local_name)
{
return PHPTAL_Dom_Defs::getInstance()->isValidAttributeNS($namespace_uri, $local_name);
}
public function isHandledNamespace($namespace_uri)
{
return PHPTAL_Dom_Defs::getInstance()->isHandledNamespace($namespace_uri);
}
/**
* Returns a new XmlnsState inheriting of $this if $nodeAttributes contains
* xmlns attributes, returns $this otherwise.
*
* This method is used by the PHPTAL parser to keep track of xmlns fluctuation for
* each encountered node.
*/
public function newElement(array $nodeAttributes)
{
$prefix_to_uri = $this->prefix_to_uri;
$current_default = $this->current_default;
$changed = false;
foreach ($nodeAttributes as $qname => $value) {
if (preg_match('/^xmlns:(.+)$/', $qname, $m)) {
$changed = true;
list(, $prefix) = $m;
$prefix_to_uri[$prefix] = $value;
}
if ($qname == 'xmlns') {$changed=true;$current_default = $value;}
}
if ($changed) {
return new PHPTAL_Dom_XmlnsState($prefix_to_uri, $current_default);
} else {
return $this;
}
}
function getCurrentDefaultNamespaceURI()
{
return $this->current_default;
}
private $prefix_to_uri, $current_default;
}