From: Alexander Ebert
Date: Sun, 10 Jul 2016 20:39:35 +0000 (+0200)
Subject: Work-around to convert bbcode only to HTML
X-Git-Tag: 3.0.0_Beta_1~1210
X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=dbcc2bde0e02a446592be280425b0ce9f37854d6;p=GitHub%2FWoltLab%2FWCF.git
Work-around to convert bbcode only to HTML
---
diff --git a/wcfsetup/install/files/lib/system/html/input/HtmlInputProcessor.class.php b/wcfsetup/install/files/lib/system/html/input/HtmlInputProcessor.class.php
index 997f90dd76..ee16635d1d 100644
--- a/wcfsetup/install/files/lib/system/html/input/HtmlInputProcessor.class.php
+++ b/wcfsetup/install/files/lib/system/html/input/HtmlInputProcessor.class.php
@@ -44,7 +44,10 @@ class HtmlInputProcessor extends AbstractHtmlProcessor {
$this->setContext($objectType, $objectID);
// enforce consistent newlines
- $html = StringUtil::unifyNewlines($html);
+ $html = StringUtil::trim(StringUtil::unifyNewlines($html));
+
+ // check if this is true HTML or just a bbcode string
+ $html = $this->convertToHtml($html);
// transform bbcodes into metacode markers
$html = HtmlBBCodeParser::getInstance()->parse($html);
@@ -131,4 +134,55 @@ class HtmlInputProcessor extends AbstractHtmlProcessor {
return $this->htmlInputFilter;
}
+
+ /**
+ * Converts bbcodes using newlines into valid HTML.
+ *
+ * @param string $html html string
+ * @return string parsed html string
+ */
+ protected function convertToHtml($html) {
+ if (!preg_match('~^<[a-zA-Z\-]+~', $html) || !preg_match('~[a-zA-Z\-]>$~', $html)) {
+ $parts = preg_split('~(\n+)~', $html, null, PREG_SPLIT_DELIM_CAPTURE);
+
+ $openParagraph = false;
+ $html = '';
+ for ($i = 0, $length = count($parts); $i < $length; $i++) {
+ $part = $parts[$i];
+ if (strpos($part, "\n") !== false) {
+ $newlines = substr_count($part, "\n");
+ if ($newlines === 1) {
+ $html .= '
';
+ }
+ else {
+ if ($openParagraph) {
+ $html .= '
';
+ $openParagraph = false;
+ }
+
+ // ignore two newline because a new paragraph with bbcodes is created
+ // using two subsequent newlines
+ $newlines -= 2;
+ if ($newlines === 0) {
+ continue;
+ }
+
+ $html .= str_repeat('
', $newlines);
+ }
+ }
+ else {
+ if (!$openParagraph) {
+ $html .= '';
+ }
+
+ $html .= $part;
+ $openParagraph = true;
+ }
+ }
+
+ $html .= '
';
+ }
+
+ return $html;
+ }
}