summaryrefslogtreecommitdiffstats
path: root/vendor/ipl/web/src/Style.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/ipl/web/src/Style.php')
-rw-r--r--vendor/ipl/web/src/Style.php123
1 files changed, 123 insertions, 0 deletions
diff --git a/vendor/ipl/web/src/Style.php b/vendor/ipl/web/src/Style.php
new file mode 100644
index 0000000..56479d0
--- /dev/null
+++ b/vendor/ipl/web/src/Style.php
@@ -0,0 +1,123 @@
+<?php
+
+namespace ipl\Web;
+
+use ipl\Html\Attribute;
+use ipl\Html\Attributes;
+use ipl\Html\BaseHtmlElement;
+use ipl\Html\HtmlElement;
+use ipl\Html\HtmlString;
+use ipl\Html\ValidHtml;
+use Throwable;
+
+class Style extends LessRuleset implements ValidHtml
+{
+ /** @var ?string */
+ protected $module;
+
+ /** @var ?string */
+ protected $nonce;
+
+ /**
+ * Get the used CSP nonce
+ *
+ * @return ?string
+ */
+ public function getNonce(): ?string
+ {
+ return $this->nonce;
+ }
+
+ /**
+ * Set the CSP nonce to use
+ *
+ * @param ?string $nonce
+ *
+ * @return $this
+ */
+ public function setNonce(?string $nonce): self
+ {
+ $this->nonce = $nonce;
+
+ return $this;
+ }
+
+ /**
+ * Get the Icinga module name the ruleset is scoped to
+ *
+ * @return ?string
+ */
+ public function getModule(): ?string
+ {
+ return $this->module;
+ }
+
+ /**
+ * Set the Icinga module name to use as scope for the ruleset
+ *
+ * @param ?string $name
+ *
+ * @return $this
+ */
+ public function setModule(?string $name): self
+ {
+ $this->module = $name;
+
+ return $this;
+ }
+
+ /**
+ * Add CSS properties for the given element
+ *
+ * The created ruleset will be applied by an `#ID` selector. If the given
+ * element does not have an ID set yet, one is automatically set.
+ *
+ * @param BaseHtmlElement $element Element to apply the properties to
+ * @param array<string, string> $properties CSS properties
+ *
+ * @return $this
+ */
+ public function addFor(BaseHtmlElement $element, array $properties): self
+ {
+ /** @var ?string $id */
+ $id = $element->getAttribute('id')->getValue();
+
+ if ($id === null) {
+ $id = uniqid('csp-style', false);
+ $element->setAttribute('id', $id);
+ }
+
+ return $this->add('#' . $id, $properties);
+ }
+
+ public function render(): string
+ {
+ if ($this->module !== null) {
+ $ruleset = (new static())
+ ->setSelector(".icinga-module.module-$this->module")
+ ->addRuleset($this);
+ } else {
+ $ruleset = $this;
+ }
+
+ return (new HtmlElement(
+ 'style',
+ (new Attributes())->addAttribute(new Attribute('nonce', $this->getNonce())),
+ HtmlString::create($ruleset->renderCss())
+ ))->render();
+ }
+
+ /**
+ * Render to HTML
+ *
+ * @return string
+ */
+ public function __toString(): string
+ {
+ try {
+ return $this->render();
+ } catch (Throwable $e) {
+ return sprintf('<!-- Failed to render style: %s -->', $e->getMessage());
+ }
+ }
+}