From b0accf4d4c674799ae210fce012dd0f31834717e Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Thu, 6 Apr 2017 23:49:56 -0400 Subject: [PATCH] Fix code blocks to Diaspora - Extracts code blocks before BBCode conversion to prevent code highlighting and whitespace meddling - Use the improved HTLM To Markdown library - Use instead of for Diaspora inline code blocks --- include/bb2diaspora.php | 40 +++++++++++++++++++++++++++++++--- include/bbcode.php | 48 ++++++++++++++++++++++++++++++----------- 2 files changed, 73 insertions(+), 15 deletions(-) diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php index 5a60cd945a..cef293c766 100644 --- a/include/bb2diaspora.php +++ b/include/bb2diaspora.php @@ -105,8 +105,18 @@ function diaspora_mentions($match) { return $mention; } -function bb2diaspora($Text,$preserve_nl = false, $fordiaspora = true) { - +/** + * @brief Converts a BBCode text into Markdown + * + * This function converts a BBCode item body to be sent to Markdown-enabled + * systems like Diaspora and Libertree + * + * @param string $Text + * @param bool $preserve_nl Effects unclear, unused in Friendica + * @param bool $fordiaspora Diaspora requires more changes than Libertree + * @return string + */ +function bb2diaspora($Text, $preserve_nl = false, $fordiaspora = true) { $a = get_app(); $OriginalText = $Text; @@ -129,6 +139,18 @@ function bb2diaspora($Text,$preserve_nl = false, $fordiaspora = true) { // 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 bbcode() + $codeblocks = []; + $Text = preg_replace_callback('#\[code(?:=([^\]]*))?\](?=\n)(.*?)\[\/code\]#is', + function ($matches) use (&$codeblocks) { + $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 ($fordiaspora) { $Text = bbcode($Text, $preserve_nl, false, 3); @@ -158,7 +180,8 @@ function bb2diaspora($Text,$preserve_nl = false, $fordiaspora = true) { $stamp1 = microtime(true); // Now convert HTML to Markdown - $Text = new HTML_To_Markdown($Text); + $converter = new HtmlConverter(); + $Text = $converter->convert($Text); // unmask the special chars back to HTML $Text = str_replace(array('&_lt_;', '&_gt_;', '&_amp_;'), array('<', '>', '&'), $Text); @@ -177,6 +200,17 @@ function bb2diaspora($Text,$preserve_nl = false, $fordiaspora = true) { $Text = preg_replace_callback("/([@]\[(.*?)\])\(([$URLSearchString]*?)\)/ism", 'diaspora_mentions', $Text); } + // 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); + call_hooks('bb2diaspora',$Text); return $Text; diff --git a/include/bbcode.php b/include/bbcode.php index f73f586d34..fd380edc99 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -159,13 +159,6 @@ function stripcode_br_cb($s) { return '[code]' . str_replace('
', '', $s[1]) . '[/code]'; } -function bb_onelinecode_cb($match) { - if (strpos($match[1],"
")===false){ - return "".$match[1].""; - } - return "".$match[1].""; -} - function tryoembed($match) { $url = $match[1]; @@ -729,9 +722,31 @@ function bb_highlight($match) { return $match[0]; } - // BBcode 2 HTML was written by WAY2WEB.net - // extended to work with Mistpark/Friendica - Mike Macgirvin - +/** + * @brief Converts a BBCode message to HTML message + * + * BBcode 2 HTML was written by WAY2WEB.net + * extended to work with Mistpark/Friendica - Mike Macgirvin + * + * Simple HTML values meaning: + * - 0: Friendica display + * - 1: Unused + * - 2: Used for Facebook, Google+, Windows Phone push, Friendica API + * - 3: Used before converting to Markdown in bb2diaspora.php + * - 4: Used for WordPress, Libertree (before Markdown), pump.io and tumblr + * - 5: Unused + * - 6: Used for Appnet + * - 7: Used for dfrn, OStatus + * - 8: Used for WP backlink text setting + * + * @staticvar array $allowed_src_protocols + * @param string $Text + * @param bool $preserve_nl + * @param bool $tryoembed + * @param int $simplehtml + * @param bool $forplaintext + * @return string + */ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = false, $forplaintext = false) { $a = get_app(); @@ -1158,8 +1173,17 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa } - //replace oneliner with - $Text = preg_replace_callback("|(?!]*>)([^<]*)(?!]*>)|ism", 'bb_onelinecode_cb', $Text); + // Replace inline code blocks + $Text = preg_replace_callback("|(?!]*>)([^<]*)(?!]*>)|ism", + function ($match) use ($simplehtml) { + $return = '' . $match[1] . ''; + // Use for Diaspora inline code blocks + if ($simplehtml === 3) { + $return = '' . $match[1] . ''; + } + return $return; + } + , $Text); // Unhide all [noparse] contained bbtags unspacefying them // and triming the [noparse] tag.