aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/league/html-to-markdown/src/Element.php
diff options
context:
space:
mode:
authorMario Vavti <mario@mariovavti.com>2017-08-16 10:32:35 +0200
committerMario Vavti <mario@mariovavti.com>2017-08-16 10:32:35 +0200
commit4a7384bc0ce1893a432bf4b7d67bca23796fe9db (patch)
tree5623c66a3f66445284529d6207e4ab4a2edb2810 /vendor/league/html-to-markdown/src/Element.php
parentc664a4bdcd1bd578f5ec3c2884f7c97e9f68d2d7 (diff)
parent90bc21f2d560d879d7eaf05a85af6d6dca53ebac (diff)
downloadvolse-hubzilla-2.6.tar.gz
volse-hubzilla-2.6.tar.bz2
volse-hubzilla-2.6.zip
Merge branch '2.6RC'2.6
Diffstat (limited to 'vendor/league/html-to-markdown/src/Element.php')
-rw-r--r--vendor/league/html-to-markdown/src/Element.php257
1 files changed, 257 insertions, 0 deletions
diff --git a/vendor/league/html-to-markdown/src/Element.php b/vendor/league/html-to-markdown/src/Element.php
new file mode 100644
index 000000000..e1e9d1a09
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Element.php
@@ -0,0 +1,257 @@
+<?php
+
+namespace League\HTMLToMarkdown;
+
+class Element implements ElementInterface
+{
+ /**
+ * @var \DOMNode
+ */
+ protected $node;
+
+ /**
+ * @var ElementInterface|null
+ */
+ private $nextCached;
+
+ public function __construct(\DOMNode $node)
+ {
+ $this->node = $node;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isBlock()
+ {
+ switch ($this->getTagName()) {
+ case 'blockquote':
+ case 'body':
+ case 'code':
+ case 'div':
+ case 'h1':
+ case 'h2':
+ case 'h3':
+ case 'h4':
+ case 'h5':
+ case 'h6':
+ case 'hr':
+ case 'html':
+ case 'li':
+ case 'p':
+ case 'ol':
+ case 'ul':
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * @return bool
+ */
+ public function isText()
+ {
+ return $this->getTagName() === '#text';
+ }
+
+ /**
+ * @return bool
+ */
+ public function isWhitespace()
+ {
+ return $this->getTagName() === '#text' && trim($this->getValue()) === '';
+ }
+
+ /**
+ * @return string
+ */
+ public function getTagName()
+ {
+ return $this->node->nodeName;
+ }
+
+ /**
+ * @return string
+ */
+ public function getValue()
+ {
+ return $this->node->nodeValue;
+ }
+
+ /**
+ * @return ElementInterface|null
+ */
+ public function getParent()
+ {
+ return new static($this->node->parentNode) ?: null;
+ }
+
+ /**
+ * @return bool
+ */
+ public function hasChildren()
+ {
+ return $this->node->hasChildNodes();
+ }
+
+ /**
+ * @return ElementInterface[]
+ */
+ public function getChildren()
+ {
+ $ret = array();
+ /** @var \DOMNode $node */
+ foreach ($this->node->childNodes as $node) {
+ $ret[] = new static($node);
+ }
+
+ return $ret;
+ }
+
+ /**
+ * @return ElementInterface|null
+ */
+ public function getNext()
+ {
+ if ($this->nextCached === null) {
+ $nextNode = $this->getNextNode($this->node);
+ if ($nextNode !== null) {
+ $this->nextCached = new static($nextNode);
+ }
+ }
+
+ return $this->nextCached;
+ }
+
+ /**
+ * @param \DomNode $node
+ * @param bool $checkChildren
+ *
+ * @return \DomNode|null
+ */
+ private function getNextNode($node, $checkChildren = true)
+ {
+ if ($checkChildren && $node->firstChild) {
+ return $node->firstChild;
+ }
+
+ if ($node->nextSibling) {
+ return $node->nextSibling;
+ }
+
+ if ($node->parentNode) {
+ return $this->getNextNode($node->parentNode, false);
+ }
+ }
+
+ /**
+ * @param string[]|string $tagNames
+ *
+ * @return bool
+ */
+ public function isDescendantOf($tagNames)
+ {
+ if (!is_array($tagNames)) {
+ $tagNames = array($tagNames);
+ }
+
+ for ($p = $this->node->parentNode; $p !== false; $p = $p->parentNode) {
+ if (is_null($p)) {
+ return false;
+ }
+
+ if (in_array($p->nodeName, $tagNames)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @param string $markdown
+ */
+ public function setFinalMarkdown($markdown)
+ {
+ $markdown_node = $this->node->ownerDocument->createTextNode($markdown);
+ $this->node->parentNode->replaceChild($markdown_node, $this->node);
+ }
+
+ /**
+ * @return string
+ */
+ public function getChildrenAsString()
+ {
+ return $this->node->C14N();
+ }
+
+ /**
+ * @return int
+ */
+ public function getSiblingPosition()
+ {
+ $position = 0;
+
+ // Loop through all nodes and find the given $node
+ foreach ($this->getParent()->getChildren() as $current_node) {
+ if (!$current_node->isWhitespace()) {
+ $position++;
+ }
+
+ // TODO: Need a less-buggy way of comparing these
+ // Perhaps we can somehow ensure that we always have the exact same object and use === instead?
+ if ($this->equals($current_node)) {
+ break;
+ }
+ }
+
+ return $position;
+ }
+
+ /**
+ * @return int
+ */
+ public function getListItemLevel()
+ {
+ $level = 0;
+ $parent = $this->getParent();
+
+ while ($parent !== null && $parent->node->parentNode) {
+ if ($parent->getTagName() === 'li') {
+ $level++;
+ }
+ $parent = $parent->getParent();
+ }
+
+ return $level;
+ }
+
+ /**
+ * @param string $name
+ *
+ * @return string
+ */
+ public function getAttribute($name)
+ {
+ if ($this->node instanceof \DOMElement) {
+ return $this->node->getAttribute($name);
+ }
+
+ return '';
+ }
+
+ /**
+ * @param ElementInterface $element
+ *
+ * @return bool
+ */
+ public function equals(ElementInterface $element)
+ {
+ if ($element instanceof self) {
+ return $element->node === $this->node;
+ }
+
+ return $element === $this;
+ }
+}