Add unfurl url output classes
authorjoshuaruesweg <ruesweg@woltlab.com>
Fri, 26 Feb 2021 15:16:03 +0000 (16:16 +0100)
committerjoshuaruesweg <ruesweg@woltlab.com>
Tue, 16 Mar 2021 15:19:12 +0000 (16:19 +0100)
wcfsetup/install/files/lib/system/html/output/node/HtmlOutputNodeProcessor.class.php
wcfsetup/install/files/lib/system/html/output/node/HtmlOutputUnfurlUrlNode.class.php [new file with mode: 0644]

index 80254761888ac8a09185975f75586c5134efbf30..e8c13dc5ea82a4d5388fd145058b86d8a515e98d 100644 (file)
@@ -94,6 +94,8 @@ class HtmlOutputNodeProcessor extends AbstractHtmlNodeProcessor
 
         $this->invokeHtmlNode(new HtmlOutputNodeWoltlabMetacode());
 
+        $this->invokeHtmlNode(new HtmlOutputUnfurlUrlNode());
+
         // dynamic node handlers
         $this->invokeNodeHandlers('wcf\system\html\output\node\HtmlOutputNode', ['woltlab-metacode']);
 
diff --git a/wcfsetup/install/files/lib/system/html/output/node/HtmlOutputUnfurlUrlNode.class.php b/wcfsetup/install/files/lib/system/html/output/node/HtmlOutputUnfurlUrlNode.class.php
new file mode 100644 (file)
index 0000000..4a82c63
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+
+namespace wcf\system\html\output\node;
+
+use wcf\system\html\node\AbstractHtmlNodeProcessor;
+use wcf\system\html\node\HtmlNodeUnfurlLink;
+use wcf\system\message\embedded\object\MessageEmbeddedObjectManager;
+use wcf\util\StringUtil;
+
+/**
+ * Node class to replace unfurled urls in the output.
+ *
+ * @author      Joshua Ruesweg
+ * @copyright   2001-2021 WoltLab GmbH
+ * @license     GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package     WoltLabSuite\Core\System\Html\Output\Node
+ * @since       5.4
+ */
+class HtmlOutputUnfurlUrlNode extends AbstractHtmlOutputNode
+{
+    /**
+     * @inheritDoc
+     */
+    protected $tagName = 'a';
+    
+    /**
+     * @inheritDoc
+     */
+    public function process(array $elements, AbstractHtmlNodeProcessor $htmlNodeProcessor)
+    {
+        /** @var \DOMElement $element */
+        foreach ($elements as $element) {
+            $attribute = $element->getAttribute(HtmlNodeUnfurlLink::UNFURL_URL_ID_ATTRIBUTE_NAME);
+            if ($this->outputType === 'text/html'
+                && !empty($attribute)
+                && MessageEmbeddedObjectManager::getInstance()->getObject('com.woltlab.wcf.unfurlUrl', $attribute) !== null) {
+                $nodeIdentifier = StringUtil::getRandomID();
+                $htmlNodeProcessor->addNodeData($this, $nodeIdentifier, ['urlId' => $attribute]);
+                
+                $htmlNodeProcessor->renameTag($element, 'wcfNode-' . $nodeIdentifier);
+            }
+        }
+    }
+    
+    /**
+     * @inheritDoc
+     */
+    public function replaceTag(array $data)
+    {
+        return MessageEmbeddedObjectManager::getInstance()->getObject('com.woltlab.wcf.unfurlUrl', $data['urlId'])->render();
+    }
+}