diff --git a/Parsedown.php b/Parsedown.php index 67eec34..3e2286e 100755 --- a/Parsedown.php +++ b/Parsedown.php @@ -217,56 +217,14 @@ class Parsedown # Quick Paragraph - if ($line[0] >= 'A' and $line['0'] !== '_') + if ($line[0] >= 'A' and $line[0] !== '_') { goto paragraph; # trust me } - # Setext Header (---) - - if ($element['type'] === 'p' and ! isset($element['interrupted']) and preg_match('/^[-]+[ ]*$/', $line)) - { - $element['type'] = 'h.'; - $element['level'] = 2; - - continue; - } - - # Horizontal Rule - - if (preg_match('/^[ ]{0,3}([-*_])([ ]{0,2}\1){2,}[ ]*$/', $line)) - { - $elements []= $element; - - $element = array( - 'type' => 'hr', - ); - - continue; - } - - # List Item - - if (preg_match('/^([ ]{0,3})(\d+[.]|[*+-])[ ](.*)/', $line, $matches)) - { - $elements []= $element; - - $element = array( - 'type' => 'li', - 'ordered' => isset($matches[2][1]), - 'indentation' => $matches[1], - 'last' => true, - 'lines' => array( - preg_replace('/^[ ]{0,4}/', '', $matches[3]), - ), - ); - - continue; - } - # Code - if (preg_match('/^[ ]{4}(.*)/', $line, $matches)) + if ($line[0] === ' ' and preg_match('/^[ ]{4}(.*)/', $line, $matches)) { if ($element['type'] === 'code') { @@ -279,10 +237,20 @@ class Parsedown $elements []= $element; $element = array( - 'type' => 'code', + 'type' => 'code', 'text' => $matches[1], ); } + + continue; + } + + # Setext Header (---) + + if ($line[0] === '-' and $element['type'] === 'p' and ! isset($element['interrupted']) and preg_match('/^[-]+[ ]*$/', $line)) + { + $element['type'] = 'h.'; + $element['level'] = 2; continue; } @@ -296,17 +264,31 @@ class Parsedown $level = strlen($matches[1]); $element = array( - 'type' => 'h.', - 'text' => $matches[2], + 'type' => 'h.', + 'text' => $matches[2], 'level' => $level, ); continue; } + # Setext Header (===) + + if ($line[0] === '=' and $element['type'] === 'p' and ! isset($element['interrupted']) and preg_match('/^[=]+[ ]*$/', $line)) + { + $element['type'] = 'h.'; + $element['level'] = 1; + + continue; + } + + # ~ + + $pure_line = ltrim($line); + # Blockquote - if (preg_match('/^[ ]*>[ ]?(.*)/', $line, $matches)) + if ($pure_line[0] === '>' and preg_match('/^>[ ]?(.*)/', $pure_line, $matches)) { if ($element['type'] === 'blockquote') { @@ -334,45 +316,72 @@ class Parsedown continue; } - # Setext Header (===) + # HTML - if ($element['type'] === 'p' and ! isset($element['interrupted']) and preg_match('/^[=]+[ ]*$/', $line)) + if ($pure_line[0] === '<') { - $element['type'] = 'h.'; - $element['level'] = 1; - - continue; - } + # Block-Level HTML - # Block-Level HTML + if (preg_match('{^<.+?/>$}', $pure_line)) + { + $elements []= $element; + + $element = array( + 'type' => '', + 'text' => $pure_line, + ); + + continue; + } + + # Block-Level HTML + + if (preg_match('{^<(\w+)(?:[ ].*?)?>}', $pure_line, $matches)) + { + $elements []= $element; + + $element = array( + 'type' => 'block', + 'subtype' => strtolower($matches[1]), + 'text' => $pure_line, + 'depth' => 0, + ); + + preg_match('{\s*$}', $pure_line) and $element['closed'] = true; + + continue; + } + } - if (preg_match('{^<.+?/>$}', $line)) + # Horizontal Rule + + if (preg_match('/^([-*_])([ ]{0,2}\1){2,}[ ]*$/', $pure_line)) { $elements []= $element; $element = array( - 'type' => '', - 'text' => $line, + 'type' => 'hr', ); continue; } - # Block-Level HTML + # List Item - if (preg_match('{^<(\w+)(?:[ ].*?)?>}', $line, $matches)) + if (preg_match('/^([ ]*)(\d+[.]|[*+-])[ ](.*)/', $line, $matches)) { $elements []= $element; $element = array( - 'type' => 'block', - 'subtype' => strtolower($matches[1]), - 'text' => $line, - 'depth' => 0, + 'type' => 'li', + 'ordered' => isset($matches[2][1]), + 'indentation' => $matches[1], + 'last' => true, + 'lines' => array( + preg_replace('/^[ ]{0,4}/', '', $matches[3]), + ), ); - preg_match('{\s*$}', $line) and $element['closed'] = true; - continue; } diff --git a/tests/data/sparse_list.html b/tests/data/sparse_list.html index e83f2dc..2b6bf1d 100644 --- a/tests/data/sparse_list.html +++ b/tests/data/sparse_list.html @@ -1,14 +1,16 @@ -

Here's a list where items are separated by empty lines:

-
    -
  • -

    list item

    -
  • -
  • another list item
  • -
-

Here's an ordered one:

-
    -
  1. -

    item one

    -
  2. -
  3. item two
  4. -
\ No newline at end of file +

Here's a sparse list:

+
    +
  • +

    list item

    +
  • +
  • another list item
  • +
+

Here's one with an indented list item:

+
    +
  • +

    li

    +
      +
    • li
    • +
    +
  • +
\ No newline at end of file diff --git a/tests/data/sparse_list.md b/tests/data/sparse_list.md index b7f3ea6..5bad1bd 100644 --- a/tests/data/sparse_list.md +++ b/tests/data/sparse_list.md @@ -1,11 +1,11 @@ -Here's a list where items are separated by empty lines: - -- list item - -- another list item - -Here's an ordered one: - -1. item one - -2. item two \ No newline at end of file +Here's a sparse list: + +- list item + +- another list item + +Here's one with an indented list item: + +- li + + - li \ No newline at end of file