From 3673daaa3c538149c0da347e599d402433f97434 Mon Sep 17 00:00:00 2001 From: Thomas Gelf Date: Wed, 23 May 2018 08:30:37 +0200 Subject: [PATCH] Html: allow to wrap elements, needed for forms --- library/vendor/ipl/Html/BaseHtmlElement.php | 36 ++++--- library/vendor/ipl/Html/HtmlDocument.php | 104 +++++++++++++++++++- 2 files changed, 124 insertions(+), 16 deletions(-) diff --git a/library/vendor/ipl/Html/BaseHtmlElement.php b/library/vendor/ipl/Html/BaseHtmlElement.php index 7fcb7f07..bd565815 100644 --- a/library/vendor/ipl/Html/BaseHtmlElement.php +++ b/library/vendor/ipl/Html/BaseHtmlElement.php @@ -61,6 +61,7 @@ abstract class BaseHtmlElement extends HtmlDocument public function setAttributes($attributes) { $this->attributes = Attributes::wantAttributes($attributes); + return $this; } @@ -74,6 +75,7 @@ abstract class BaseHtmlElement extends HtmlDocument public function setAttribute($key, $value) { $this->getAttributes()->set($key, $value); + return $this; } @@ -81,10 +83,12 @@ abstract class BaseHtmlElement extends HtmlDocument * @param Attributes|array|null $attributes * @return $this * @throws \Icinga\Exception\ProgrammingError + * @throws \Icinga\Exception\IcingaException */ public function addAttributes($attributes) { $this->getAttributes()->add($attributes); + return $this; } @@ -99,6 +103,7 @@ abstract class BaseHtmlElement extends HtmlDocument public function setTag($tag) { $this->tag = $tag; + return $this; } @@ -109,11 +114,7 @@ abstract class BaseHtmlElement extends HtmlDocument public function renderContent() { - return parent::render(); - } - - protected function assemble() - { + return parent::renderUnwrapped(); } /** @@ -123,10 +124,7 @@ abstract class BaseHtmlElement extends HtmlDocument */ public function add($content) { - if (! $this->hasBeenAssembled) { - $this->hasBeenAssembled = true; - $this->assemble(); - } + $this->ensureAssembled(); parent::add($content); @@ -136,14 +134,12 @@ abstract class BaseHtmlElement extends HtmlDocument /** * @return string * @throws \Icinga\Exception\ProgrammingError + * @throws \Icinga\Exception\IcingaException */ - public function render() + public function renderUnwrapped() { + $this->ensureAssembled(); $tag = $this->getTag(); - if (! $this->hasBeenAssembled) { - $this->hasBeenAssembled = true; - $this->assemble(); - } $content = $this->renderContent(); if (strlen($content) || $this->wantsClosingTag()) { @@ -166,6 +162,7 @@ abstract class BaseHtmlElement extends HtmlDocument /** * @return string * @throws \Icinga\Exception\ProgrammingError + * @throws \Icinga\Exception\IcingaException */ public function renderAttributes() { @@ -176,6 +173,17 @@ abstract class BaseHtmlElement extends HtmlDocument } } + /** + * @param HtmlDocument $document + * @return $this + */ + public function wrap(HtmlDocument $document) + { + $document->addWrapper($this); + + return $this; + } + public function wantsClosingTag() { // TODO: There is more. SVG and MathML namespaces diff --git a/library/vendor/ipl/Html/HtmlDocument.php b/library/vendor/ipl/Html/HtmlDocument.php index 9c3421c9..7cfa04bc 100644 --- a/library/vendor/ipl/Html/HtmlDocument.php +++ b/library/vendor/ipl/Html/HtmlDocument.php @@ -14,6 +14,9 @@ class HtmlDocument implements ValidHtml, Countable { protected $contentSeparator = ''; + /** @var BaseHtmlElement */ + protected $wrapper; + /** @var ValidHtml[] */ private $content = []; @@ -40,6 +43,40 @@ class HtmlDocument implements ValidHtml, Countable return $this; } + /** + * @param BaseHtmlElement $wrapper + * @return $this + */ + public function setWrapper(BaseHtmlElement $wrapper) + { + $this->wrapper = $wrapper; + + return $this; + } + + /** + * @param BaseHtmlElement $wrapper + * @return $this + */ + public function addWrapper(BaseHtmlElement $wrapper) + { + if ($this->wrapper === null) { + $this->setWrapper($wrapper); + } else { + $this->setWrapper($wrapper->wrap($this->wrapper)); + } + + return $this; + } + + /** + * @return HtmlDocument|null + */ + public function getWrapper() + { + return $this->wrapper; + } + /** * @return bool */ @@ -152,16 +189,70 @@ class HtmlDocument implements ValidHtml, Countable } /** - * @inheritdoc + * @return string + * @throws ProgrammingError + * @throws \Icinga\Exception\IcingaException */ public function render() { - $html = []; + if ($this->wrapper === null) { + return $this->renderUnwrapped(); + } else { + return $this->renderWrapped(); + } + } + + /** + * @return string + * @throws ProgrammingError + * @throws \Icinga\Exception\IcingaException + */ + protected function renderWrapped() + { + // TODO: we don't like this, but have no better solution right now. + // However, it works as expected, tests are green + $wrapper = $this->wrapper; + $this->wrapper = null; + $result = $wrapper->renderWrappedDocument($this); + $this->wrapper = $wrapper; + + return $result; + } + + /** + * @param HtmlDocument $document + * @return string + * @throws ProgrammingError + * @throws \Icinga\Exception\IcingaException + */ + protected function renderWrappedDocument(HtmlDocument $document) + { + $wrapper = clone($this); + $wrapper->add($document); + return $wrapper->render(); + } + + /** + * @return $this + */ + public function ensureAssembled() + { if (! $this->hasBeenAssembled) { $this->hasBeenAssembled = true; $this->assemble(); } + return $this; + } + + /** + * @return string + */ + public function renderUnwrapped() + { + $this->ensureAssembled(); + $html = []; + foreach ($this->content as $element) { if (is_string($element)) { var_dump($this->content); @@ -227,4 +318,13 @@ class HtmlDocument implements ValidHtml, Countable { return $this->content; } + + public function __clone() + { + foreach ($this->content as $key => $element) { + $this->content[$key] = clone($element); + } + + $this->reIndexContent(); + } }