%PDF- %PDF-
| Direktori : /www/varak.net/wiki.varak.net/vendor/wikimedia/remex-html/RemexHtml/TreeBuilder/ |
| Current File : /www/varak.net/wiki.varak.net/vendor/wikimedia/remex-html/RemexHtml/TreeBuilder/Element.php |
<?php
namespace RemexHtml\TreeBuilder;
use RemexHtml\HTMLData;
use RemexHtml\PropGuard;
use RemexHtml\Tokenizer\Attributes;
/**
* Storage for all the state that TreeBuilder needs to associate with each
* element. These objects should be freed once they fall out of TreeBuilder's
* data structures (the stack etc.).
*
* These objects are also used to communicate information about elements with
* downstream clients.
*/
class Element implements FormattingElement {
use PropGuard;
/**
* The namespace. This will be the HTML namespace for elements that are not
* in foreign content, even if there is a prefix.
* @var string
*/
public $namespace;
/**
* The tag name, usually exactly as it appeared in the source document.
* This is not strictly a local name, since it still contains a colon for
* prefixed elements. In foreign content, it is effectively a local name.
* It is suitable for use as a serialized tag name.
* @var string
*/
public $name;
/**
* This is an internal designation of the type of the element, which is
* equal to the tag name when the element is in the HTML namespace, and is
* some other string when the element is not in the HTML namespace.
* @var string
*/
public $htmlName;
/**
* @var Attributes
*/
public $attrs;
/**
* This is true if the element was created by the TreeBuilder either as a
* fragment context node, or as a synthetic <html> element to be used as
* the top-level element in fragment parsing.
* @var bool
*/
public $isVirtual;
/**
* Internal to CachingStack. A link in the scope list.
*/
public $nextEltInScope;
/**
* Internal to CachingStack and SimpleStack. The current stack index, or
* null if the element is not in the stack.
*/
public $stackIndex;
/**
* Internal to ActiveFormattingElements.
*/
public $prevAFE, $nextAFE, $nextNoah;
/**
* The cache for getNoahKey()
*/
private $noahKey;
/**
* This member variable can be written to by the TreeHandler, to store any
* state associated with the element (such as a DOM node). It is not used
* by TreeBuilder.
*/
public $userData;
/**
* A unique ID which identifies the element
* @var int
*/
public $uid;
/**
* The next unique ID to be used
*/
private static $nextUid = 1;
/**
* The element types in the MathML namespace which are MathML text
* integration points.
* @var string[bool]
*/
private static $mathmlIntegration = [
'mi' => true,
'mo' => true,
'mn' => true,
'ms' => true,
'mtext' => true
];
/**
* The element types in the SVG namespace which are SVG text integration
* points.
* @var string[bool]
*/
private static $svgHtmlIntegration = [
'foreignObject' => true,
'desc' => true,
'title' => true
];
/**
* Constructor.
*
* @param string $namespace
* @param string $name
* @param Attributes $attrs
*/
public function __construct( $namespace, $name, Attributes $attrs ) {
$this->namespace = $namespace;
$this->name = $name;
if ( $namespace === HTMLData::NS_HTML ) {
$this->htmlName = $name;
} elseif ( $namespace === HTMLData::NS_MATHML ) {
$this->htmlName = "mathml $name";
} elseif ( $namespace === HTMLData::NS_SVG ) {
$this->htmlName = "svg $name";
} else {
$this->htmlName = "$namespace $name";
}
$this->attrs = $attrs;
$this->uid = self::$nextUid++;
}
/**
* Is the element a MathML text integration point?
*
* @return bool
*/
public function isMathmlTextIntegration() {
return $this->namespace === HTMLData::NS_MATHML
&& isset( self::$mathmlIntegration[$this->name] );
}
/**
* Is the element an HTML integration point?
* @return bool
*/
public function isHtmlIntegration() {
if ( $this->namespace === HTMLData::NS_MATHML ) {
if ( isset( $this->attrs['encoding'] ) ) {
$encoding = strtolower( $this->attrs['encoding'] );
return $encoding === 'text/html' || $encoding === 'application/xhtml+xml';
} else {
return false;
}
} elseif ( $this->namespace === HTMLData::NS_SVG ) {
return isset( self::$svgHtmlIntegration[$this->name] );
} else {
return false;
}
}
/**
* Get a string key for the Noah's Ark algorithm
*
* @return string
*/
public function getNoahKey() {
if ( $this->noahKey === null ) {
$attrs = $this->attrs->getValues();
ksort( $attrs );
$this->noahKey = serialize( [ $this->htmlName, $attrs ] );
}
return $this->noahKey;
}
/**
* Get a string identifying the element, for use in debugging.
* @return string
*/
public function getDebugTag() {
return $this->htmlName . '#' . $this->uid;
}
}