[aur-dev] [PATCH v2 3/3] Convert markdown codeblocks and inline code to HTML

Marcel Korpel marcel.korpel at gmail.com
Sat Jul 11 20:49:49 UTC 2015


Only codeblocks delimited with ```<newline> are supported.

Signed-off-by: Marcel Korpel <marcel.korpel at gmail.com>
---
Changes from v1:
* Convert one line at a time
* Use preg_replace_callback to convert inline code and URLs
* Now URLs within inline code are also converted, unwanted behaviour?
* Introduces a global ($md_inline_code_active), unwanted?

 web/lib/aur.inc.php | 74 +++++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 60 insertions(+), 14 deletions(-)

diff --git a/web/lib/aur.inc.php b/web/lib/aur.inc.php
index 411d5ee..d370788 100644
--- a/web/lib/aur.inc.php
+++ b/web/lib/aur.inc.php
@@ -603,25 +603,71 @@ function comment_by_id($comment_id) {
  * @return string User comment with links printed in HTML
  */
 function parse_comment($comment) {
-	$url_pattern = '/(\b(?:https?|ftp):\/\/[\w\/\#~:.?+=&%@!\-;,]+?' .
-		'(?=[.:?\-;,]*(?:[^\w\/\#~:.?+=&%@!\-;,]|$)))/iS';
-
-	$matches = preg_split($url_pattern, $comment, -1,
-		PREG_SPLIT_DELIM_CAPTURE);
+	$url_pattern = '/\b(?:https?|ftp):\/\/[\w\/\#~:.?+=&%@!\-;,]+?' .
+		'(?=[.:?\-;,]*(?:[^\w\/\#~:.?+=&%@!\-;,]|$))/iS';
+	$md_codeblock_delimiter = '```';
+	$md_codeblock_active = false;
+	$md_inline_code_delimiter = '/`/';
+	$md_inline_code_active = false;
 
 	$html = '';
-	for ($i = 0; $i < count($matches); $i++) {
-		if ($i % 2) {
-			# convert links
-			$html .= '<a href="' . htmlspecialchars($matches[$i]) .
-				'">' .	htmlspecialchars($matches[$i]) . '</a>';
-		}
-		else {
-			# convert everything else
-			$html .= nl2br(htmlspecialchars($matches[$i]));
+	$lines = preg_split('/\R/', $comment);
+
+	foreach ($lines as $line) {
+		if ($line == $md_codeblock_delimiter) {
+			if ($md_codeblock_active) {
+				$html .= '</code></pre><p>';
+				$md_codeblock_active = false;
+			} else {
+				$html .= '</p><pre><code>';
+				$md_codeblock_active = true;
+			}
+		} else {
+			if ($md_codeblock_active) {
+				$html .= htmlspecialchars($line) . "\n";
+			} else {
+				global $md_inline_code_active;
+
+				$line = htmlspecialchars($line);
+				$line = preg_replace_callback(
+					$md_inline_code_delimiter,
+					function ($matches) {
+						global $md_inline_code_active;
+
+						if ($md_inline_code_active) {
+							$md_inline_code_active = false;
+							return '</code>';
+						} else {
+							$md_inline_code_active = true;
+							return '<code>';
+						}
+					},
+					$line);
+
+				$line = preg_replace_callback(
+					$url_pattern,
+					function ($matches) {
+						return '<a href="' . $matches[0] .
+							'">' . $matches[0] . '</a>';
+					},
+					$line);
+
+				$html .= $line . "<br />\n";
+			}
 		}
 	}
 
+	// close possible open inline code
+	if ($md_inline_code_active) {
+		$html .= '</code>';
+		$md_inline_code_active = false;
+	}
+
+	// close possible open code block
+	if ($md_codeblock_active) {
+		$html .= '</code></pre><p>';
+	}
+
 	return $html;
 }
 
-- 
2.4.5


More information about the aur-dev mailing list