--- /dev/null
+<?php
+
+namespace Caxy\HtmlDiff\Table;
+
+/**
+ * Class AbstractTableElement.
+ */
+abstract class AbstractTableElement
+{
+ /**
+ * @var \DOMElement
+ */
+ protected $domNode;
+
+ /**
+ * AbstractTableElement constructor.
+ *
+ * @param \DOMElement|null $domNode
+ */
+ public function __construct(\DOMElement $domNode = null)
+ {
+ $this->domNode = $domNode;
+ }
+
+ /**
+ * @return \DOMElement
+ */
+ public function getDomNode()
+ {
+ return $this->domNode;
+ }
+
+ /**
+ * @param \DOMElement $domNode
+ *
+ * @return $this
+ */
+ public function setDomNode(\DOMElement $domNode)
+ {
+ $this->domNode = $domNode;
+
+ return $this;
+ }
+
+ /**
+ * @return string
+ */
+ public function getInnerHtml()
+ {
+ $innerHtml = '';
+
+ if ($this->domNode) {
+ foreach ($this->domNode->childNodes as $child) {
+ $innerHtml .= static::htmlFromNode($child);
+ }
+ }
+
+ return $innerHtml;
+ }
+
+ /**
+ * @param string $name
+ *
+ * @return string
+ */
+ public function getAttribute($name)
+ {
+ return $this->domNode->getAttribute($name);
+ }
+
+ /**
+ * @param \DOMDocument $domDocument
+ *
+ * @return \DOMElement
+ */
+ public function cloneNode(\DOMDocument $domDocument)
+ {
+ return $domDocument->importNode($this->getDomNode()->cloneNode(false), false);
+ }
+
+ /**
+ * @param \DOMElement $node
+ *
+ * @return string
+ */
+ public static function htmlFromNode($node)
+ {
+ $domDocument = new \DOMDocument();
+ $newNode = $domDocument->importNode($node, true);
+ $domDocument->appendChild($newNode);
+
+ return trim($domDocument->saveHTML());
+ }
+}