Fixed `useText` reversal inside source bbcodes
authorAlexander Ebert <ebert@woltlab.com>
Mon, 18 Sep 2017 10:26:58 +0000 (12:26 +0200)
committerAlexander Ebert <ebert@woltlab.com>
Mon, 18 Sep 2017 10:27:05 +0000 (12:27 +0200)
wcfsetup/install/files/lib/system/bbcode/HtmlBBCodeParser.class.php
wcfsetup/install/files/lib/system/html/input/filter/MessageHtmlInputFilter.class.php
wcfsetup/install/files/lib/system/html/input/node/HtmlInputNodeWoltlabMetacodeMarker.class.php

index a04f1224b456a1edeb0c28eade98095cb1241c0b..4904ea631f03c2ebee4d06f56a9427da92174ddf 100644 (file)
@@ -235,6 +235,7 @@ class HtmlBBCodeParser extends BBCodeParser {
                                                foreach ($this->bbcodes[$tag['name']]->getAttributes() as $attribute) {
                                                        if ($attribute->useText && !isset($openingTag['attributes'][$attribute->attributeNo])) {
                                                                $openingTag['attributes'][$attribute->attributeNo] = $buffer;
+                                                               $openingTag['useText'] = $attribute->attributeNo;
                                                                $hideBuffer = true;
                                                                break;
                                                        }
@@ -428,6 +429,10 @@ class HtmlBBCodeParser extends BBCodeParser {
                        
                        // uses base64 encoding to avoid an "escape" nightmare
                        $attributes = ' data-attributes="' . base64_encode(JSON::encode($tag['attributes'])) . '"';
+                       
+                       if (isset($tag['useText'])) {
+                               $attributes .= ' data-use-text="' . $tag['useText'] . '"';
+                       }
                }
                
                return '<woltlab-metacode-marker data-name="' . $name . '" data-uuid="' . $uuid . '" data-source="' . base64_encode($tag['source']) . '"' . $attributes . ' />';
index ee50531390f46c42d69b5cf0a7157c6a5c713b25..86334d9fd486f7bde91c4d860134ae8fcf5c79fb 100644 (file)
@@ -108,6 +108,7 @@ class MessageHtmlInputFilter implements IHtmlInputFilter {
                        'data-attributes' => 'Text',
                        'data-name' => 'Text',
                        'data-source' => 'Text',
+                       'data-use-text' => 'Text',
                        'data-uuid' => 'Text'
                ]);
                
index 75704dd3bee4dcfa2cd9f2202557af0d3a71ca47..f76dd3c59f44d68e3ae6e72c6d80b38ba4b2cefa 100644 (file)
@@ -195,6 +195,7 @@ class HtmlInputNodeWoltlabMetacodeMarker extends AbstractHtmlInputNode {
                                $pairs[$uuid]['name'] = $name;
                                $pairs[$uuid]['open'] = $element;
                                $pairs[$uuid]['openSource'] = $source;
+                               $pairs[$uuid]['useText'] = ($element->hasAttribute('data-use-text')) ? $element->getAttribute('data-use-text') : false;
                        }
                        else {
                                $pairs[$uuid]['close'] = $element;
@@ -249,7 +250,8 @@ class HtmlInputNodeWoltlabMetacodeMarker extends AbstractHtmlInputNode {
                                'close' => $data['close'],
                                'closeSource' => $data['closeSource'],
                                'open' => $data['open'],
-                               'openSource' => $data['openSource']
+                               'openSource' => $data['openSource'],
+                               'useText' => $data['useText']
                        ];
                }
                
@@ -526,8 +528,13 @@ class HtmlInputNodeWoltlabMetacodeMarker extends AbstractHtmlInputNode {
                /** @var \DOMElement $end */
                $end = $pair['close'];
                
-               $attributes = isset($pair['attributes']) ? $pair['attributes'] : '';
-               $textNode = $start->ownerDocument->createTextNode($pair['openSource'] ?: HtmlBBCodeParser::getInstance()->buildBBCodeTag($name, $attributes, true));
+               $attributes = isset($pair['attributes']) ? $pair['attributes'] : [];
+               $content = '';
+               if (isset($pair['useText']) && isset($attributes[$pair['useText']])) {
+                       $content = array_splice($attributes, $pair['useText'])[0];
+               }
+               
+               $textNode = $start->ownerDocument->createTextNode(($pair['openSource'] ?: HtmlBBCodeParser::getInstance()->buildBBCodeTag($name, $attributes, true)) . $content);
                DOMUtil::insertBefore($textNode, $start);
                DOMUtil::removeNode($start);