From d6adcb973401982e76035ca000130a347391a2be Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 16 Sep 2018 09:04:25 -0400 Subject: [PATCH] Remove text highlighting from BBCode::convert - Move code blocks escaping from BBCode::toMarkdown to BBCode::convert - Use "language-" class prefix for expected syntax highlighting --- src/Content/Text/BBCode.php | 62 ++++++++++++++++------------------- src/Content/Text/HTML.php | 2 +- src/Content/Text/Markdown.php | 1 + 3 files changed, 30 insertions(+), 35 deletions(-) diff --git a/src/Content/Text/BBCode.php b/src/Content/Text/BBCode.php index 2dc13ae5e0..ef527f802c 100644 --- a/src/Content/Text/BBCode.php +++ b/src/Content/Text/BBCode.php @@ -1227,6 +1227,22 @@ class BBCode extends BaseObject return $return; }; + // Extracting multi-line code blocks before the whitespace processing + $codeblocks = []; + + $text = preg_replace_callback("#\[code(?:=([^\]]*))?\](.*?)\[\/code\]#is", + function ($matches) use (&$codeblocks) { + $return = $matches[0]; + if (strpos($matches[2], "\n") !== false) { + $return = '#codeblock-' . count($codeblocks) . '#'; + + $codeblocks[] = '
' . trim($matches[2], "\n\r") . '
'; + } + return $return; + }, + $text + ); + // Hide all [noparse] contained bbtags by spacefying them // POSSIBLE BUG --> Will the 'preg' functions crash if there's an embedded image? @@ -1273,11 +1289,6 @@ class BBCode extends BaseObject $text = preg_replace("/\[share(.*?)avatar\s?=\s?'.*?'\s?(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism", "\n[share$1$2]$3[/share]", $text); } - // Check for [code] text here, before the linefeeds are messed with. - // The highlighter will unescape and re-escape the content. - if (strpos($text, '[code=') !== false) { - $text = preg_replace_callback("/\[code=(.*?)\](.*?)\[\/code\]/ism", 'self::textHighlightCallback', $text); - } // Convert new line chars to html
tags // nlbr seems to be hopelessly messed up @@ -1771,6 +1782,18 @@ class BBCode extends BaseObject $text = self::interpolateSavedImagesIntoItemBody($text, $saved_image); } + // Restore code blocks + $text = preg_replace_callback('/#codeblock-([0-9]+)#/iU', + function ($matches) use ($codeblocks) { + $return = $matches[0]; + if (isset($codeblocks[intval($matches[1])])) { + $return = $codeblocks[$matches[1]]; + } + return $return; + }, + $text + ); + // Clean up the HTML by loading and saving the HTML with the DOM. // Bad structured html can break a whole page. // For performance reasons do it only with ativated item cache or at export. @@ -1905,23 +1928,6 @@ class BBCode extends BaseObject // Converting images with size parameters to simple images. Markdown doesn't know it. $text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $text); - // Extracting multi-line code blocks before the whitespace processing/code highlighter in self::convert() - $codeblocks = []; - - $text = preg_replace_callback("#\[code(?:=([^\]]*))?\](.*?)\[\/code\]#is", - function ($matches) use (&$codeblocks) { - $return = $matches[0]; - if (strpos($matches[2], "\n") !== false) { - $return = '#codeblock-' . count($codeblocks) . '#'; - - $prefix = '````' . $matches[1] . PHP_EOL; - $codeblocks[] = $prefix . trim($matches[2]) . PHP_EOL . '````'; - } - return $return; - }, - $text - ); - // Convert it to HTML - don't try oembed if ($for_diaspora) { $text = self::convert($text, false, 3); @@ -1975,18 +1981,6 @@ class BBCode extends BaseObject ); } - // Restore code blocks - $text = preg_replace_callback('/#codeblock-([0-9]+)#/iU', - function ($matches) use ($codeblocks) { - $return = ''; - if (isset($codeblocks[intval($matches[1])])) { - $return = $codeblocks[$matches[1]]; - } - return $return; - }, - $text - ); - Addon::callHooks('bb2diaspora', $text); return $text; diff --git a/src/Content/Text/HTML.php b/src/Content/Text/HTML.php index 4ec85b046b..844b111ca1 100644 --- a/src/Content/Text/HTML.php +++ b/src/Content/Text/HTML.php @@ -122,7 +122,7 @@ class HTML // Removing code blocks before the whitespace removal processing below $codeblocks = []; $message = preg_replace_callback( - '#
(.*)
#iUs', + '#
(.*)
#iUs', function ($matches) use (&$codeblocks) { $return = '[codeblock-' . count($codeblocks) . ']'; diff --git a/src/Content/Text/Markdown.php b/src/Content/Text/Markdown.php index 71d1a7b849..5450f8aa9d 100644 --- a/src/Content/Text/Markdown.php +++ b/src/Content/Text/Markdown.php @@ -32,6 +32,7 @@ class Markdown extends BaseObject $MarkdownParser = new MarkdownExtra(); $MarkdownParser->hard_wrap = $hardwrap; + $MarkdownParser->code_class_prefix = 'language-'; $html = $MarkdownParser->transform($text); self::getApp()->save_timestamp($stamp1, "parser");