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

Signed-off-by: Marcel Korpel <[email protected]>
---
 web/lib/aur.inc.php | 49 +++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 39 insertions(+), 10 deletions(-)

diff --git a/web/lib/aur.inc.php b/web/lib/aur.inc.php
index 411d5ee..4b1850f 100644
--- a/web/lib/aur.inc.php
+++ b/web/lib/aur.inc.php
@@ -596,7 +596,8 @@ function comment_by_id($comment_id) {
 }
 
 /**
- * Process submitted comments so any links can be followed
+ * Process submitted comments so any links can be followed and
+ * parse markdown code blocks (within ```<newline>)
  *
  * @param string $comment Raw user submitted package comment
  *
@@ -605,23 +606,51 @@ function comment_by_id($comment_id) {
 function parse_comment($comment) {
        $url_pattern = '/(\b(?:https?|ftp):\/\/[\w\/\#~:.?+=&%@!\-;,]+?' .
                '(?=[.:?\-;,]*(?:[^\w\/\#~:.?+=&%@!\-;,]|$)))/iS';
+       $md_codeblock_delimiter = '/(```)\R/';
+       $md_codeblock_active = false;
 
-       $matches = preg_split($url_pattern, $comment, -1,
+       $blocks = preg_split($md_codeblock_delimiter, $comment, -1,
                PREG_SPLIT_DELIM_CAPTURE);
 
        $html = '';
-       for ($i = 0; $i < count($matches); $i++) {
+       for ($i = 0; $i < count($blocks); $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]));
+                       // add start/end of code block
+                       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) {
+                               // do not convert code blocks (white-space and 
newlines are
+                               // preserved)
+                               $html .= htmlspecialchars($blocks[$i]);
+                       } else {
+                               $matches = preg_split($url_pattern, 
$blocks[$i], -1,
+                                       PREG_SPLIT_DELIM_CAPTURE);
+
+                               for ($j = 0; $j < count($matches); $j++) {
+                                       if ($j % 2) {
+                                               // convert links
+                                               $html .= '<a href="' . 
htmlspecialchars($matches[$j]) .
+                                                       '">' .  
htmlspecialchars($matches[$j]) . '</a>';
+                                       } else {
+                                               // convert everything else
+                                               $html .= 
nl2br(htmlspecialchars($matches[$j]));
+                                       }
+                               }
+                       }
                }
        }
 
+       // close possible open code block
+       if ($md_codeblock_active) {
+               $html .= '</code></pre><p>';
+       }
+
        return $html;
 }
 
-- 
2.4.5

Reply via email to