From 689ef24cc5bce9287340d29eebbc871e1103f870 Mon Sep 17 00:00:00 2001 From: Emanuil Rusev Date: Fri, 8 Nov 2013 23:40:00 +0200 Subject: [PATCH] strip trailing spaces --- Parsedown.php | 480 +++++++++++++++++++++++++------------------------- 1 file changed, 240 insertions(+), 240 deletions(-) diff --git a/Parsedown.php b/Parsedown.php index 413f27c..d979fa1 100755 --- a/Parsedown.php +++ b/Parsedown.php @@ -1,172 +1,172 @@ -', '\#', '\+', '\-', '\.', '\!'); - + foreach ($escape_sequences as $index => $escape_sequence) { if (strpos($text, $escape_sequence) !== FALSE) { $code = "\x1A".'\\'.$index; - + $text = str_replace($escape_sequence, $code, $text); - + $this->escape_sequence_map[$code] = $escape_sequence; } } } - - # ~ - + + # ~ + $text = preg_replace('/\n\s*\n/', "\n\n", $text); $text = trim($text, "\n "); - + $lines = explode("\n", $text); - + $text = $this->parse_block_elements($lines); - + # Decodes escape sequences (leaves out backslashes). - + foreach ($this->escape_sequence_map as $code => $escape_sequence) { $text = str_replace($code, $escape_sequence[1], $text); } - + $text = rtrim($text, "\n"); - + return $text; } - - # - # Private Methods - # - + + # + # Private Methods + # + private function parse_block_elements(array $lines, $context = '') { $elements = array(); - + $element = array( 'type' => '', ); - + foreach ($lines as $line) { - # Block-Level HTML - + # Block-Level HTML + if ($element['type'] === 'block' and ! isset($element['closed'])) { if (preg_match('{<'.$element['subtype'].'>$}', $line)) # { $element['depth']++; } - + if (preg_match('{$}', $line)) # { - $element['depth'] > 0 - ? $element['depth']-- + $element['depth'] > 0 + ? $element['depth']-- : $element['closed'] = true; } - + $element['text'] .= "\n".$line; continue; } - - # Empty - + + # Empty + if ($line === '') { $element['interrupted'] = true; - + continue; } - - # Lazy Blockquote - + + # Lazy Blockquote + if ($element['type'] === 'blockquote' and ! isset($element['interrupted'])) { $line = preg_replace('/^[ ]*>[ ]?/', '', $line); - + $element['lines'] []= $line; - + continue; } - - # Lazy List Item - + + # Lazy List Item + if ($element['type'] === 'li') { if (preg_match('/^([ ]{0,3})(\d+[.]|[*+-])[ ](.*)/', $line, $matches)) { - if ($element['indentation'] !== $matches[1]) + if ($element['indentation'] !== $matches[1]) { $element['lines'] []= $line; } - else + else { unset($element['last']); - + $elements []= $element; - + $element = array( 'type' => 'li', 'indentation' => $matches[1], @@ -176,42 +176,42 @@ class Parsedown ), ); } - + continue; } - + if (isset($element['interrupted'])) { if ($line[0] === ' ') { $element['lines'] []= ''; - + $line = preg_replace('/^[ ]{0,4}/', '', $line);; - + $element['lines'] []= $line; - + continue; } } else { $line = preg_replace('/^[ ]{0,4}/', '', $line);; - + $element['lines'] []= $line; - + continue; } } - - # Quick Paragraph - + + # Quick Paragraph + if ($line[0] >= 'a' or $line[0] >= 'A' and $line[0] <= 'Z') { - goto paragraph; # trust me + goto paragraph; # trust me } - - # Code - + + # Code + if ($line[0] === ' ' and preg_match('/^[ ]{4}(.*)/', $line, $matches)) { if ($element['type'] === 'code') @@ -219,16 +219,16 @@ class Parsedown if (isset($element['interrupted'])) { $element['text'] .= "\n"; - + unset ($element['interrupted']); } - + $element['text'] .= "\n".$matches[1]; } else { $elements []= $element; - + $element = array( 'type' => 'code', 'text' => $matches[1], @@ -237,62 +237,62 @@ class Parsedown continue; } - - # Setext Header (---) - + + # Setext Header (---) + if ($line[0] === '-' and $element['type'] === 'p' and ! isset($element['interrupted']) and preg_match('/^[-]+[ ]*$/', $line)) { $element['type'] = 'h.'; $element['level'] = 2; - + continue; } - + # Atx Header (#) - + if ($line[0] === '#' and preg_match('/^(#{1,6})[ ]*(.+?)[ ]*#*$/', $line, $matches)) { $elements []= $element; - + $level = strlen($matches[1]); - + $element = array( 'type' => 'h.', 'text' => $matches[2], 'level' => $level, ); - + continue; } - - # Setext Header (===) - + + # 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 = $line[0] !== ' ' ? $line : ltrim($line); - - # Link Reference - + + # Link Reference + if ($pure_line[0] === '[' and preg_match('/^\[(.+?)\]:[ ]*([^ ]+)/', $pure_line, $matches)) { $label = strtolower($matches[1]); $url = trim($matches[2], '<>'); - + $this->reference_map[$label] = $url; - + continue; } - - # Blockquote - + + # Blockquote + if ($pure_line[0] === '>' and preg_match('/^>[ ]?(.*)/', $pure_line, $matches)) { if ($element['type'] === 'blockquote') @@ -300,16 +300,16 @@ class Parsedown if (isset($element['interrupted'])) { $element['lines'] []= ''; - + unset($element['interrupted']); } - + $element['lines'] []= $matches[1]; } else { $elements []= $element; - + $element = array( 'type' => 'blockquote', 'lines' => array( @@ -317,12 +317,12 @@ class Parsedown ), ); } - + continue; } - - # HTML - + + # HTML + if ($pure_line[0] === '<') { # Block-Level HTML @@ -338,7 +338,7 @@ class Parsedown continue; } - + # Block-Level HTML if (preg_match('{^<(\w+)(?:[ ].*?)?>}', $pure_line, $matches)) @@ -351,32 +351,32 @@ class Parsedown 'text' => $pure_line, 'depth' => 0, ); - + preg_match('{\s*$}', $pure_line) and $element['closed'] = true; continue; } } - - # Horizontal Rule - + + # Horizontal Rule + if (preg_match('/^([-*_])([ ]{0,2}\1){2,}[ ]*$/', $pure_line)) { $elements []= $element; - + $element = array( 'type' => 'hr', ); - + continue; } - - # List Item - + + # List Item + if (preg_match('/^([ ]*)(\d+[.]|[*+-])[ ](.*)/', $line, $matches)) { $elements []= $element; - + $element = array( 'type' => 'li', 'ordered' => isset($matches[2][1]), @@ -386,22 +386,22 @@ class Parsedown preg_replace('/^[ ]{0,4}/', '', $matches[3]), ), ); - + continue; } - - # ~ - + + # ~ + paragraph: - + if ($element['type'] === 'p') { if (isset($element['interrupted'])) { $elements []= $element; - + $element['text'] = $line; - + unset($element['interrupted']); } else @@ -412,215 +412,215 @@ class Parsedown else { $elements []= $element; - + $element = array( - 'type' => 'p', + 'type' => 'p', 'text' => $line, ); } } - + $elements []= $element; - + array_shift($elements); - - # - # ~ - # - + + # + # ~ + # + $markup = ''; - + foreach ($elements as $index => $element) { switch ($element['type']) { case 'li': - + if (isset($element['ordered'])) # first { $list_type = $element['ordered'] ? 'ol' : 'ul'; - + $markup .= '<'.$list_type.'>'."\n"; } - + if (isset($element['interrupted']) and ! isset($element['last'])) { $element['lines'] []= ''; } - + $text = $this->parse_block_elements($element['lines'], 'li'); - + $markup .= '
  • '.$text.'
  • '."\n"; - + isset($element['last']) and $markup .= ''."\n"; - + break; - + case 'p': - + $text = $this->parse_inline_elements($element['text']); - + $text = preg_replace('/[ ]{2}\n/', '
    '."\n", $text); - + if ($context === 'li' and $index === 0) { if (isset($element['interrupted'])) { $markup .= "\n".'

    '.$text.'

    '."\n"; } - else + else { $markup .= $text; } } - else + else { $markup .= '

    '.$text.'

    '."\n"; } - + break; - + case 'code': - + $text = htmlentities($element['text'], ENT_NOQUOTES); - + strpos($text, "\x1A\\") !== FALSE and $text = strtr($text, $this->escape_sequence_map); - + $markup .= '
    '.$text.'
    '."\n"; - + break; - + case 'blockquote': - + $text = $this->parse_block_elements($element['lines']); - + $markup .= '
    '."\n".$text.'
    '."\n"; - + break; - + case 'h.': - + $text = $this->parse_inline_elements($element['text']); - + $markup .= ''.$text.''."\n"; - + break; - + case 'hr': - + $markup .= '
    '."\n"; - + break; default: - + $markup .= $element['text']."\n"; } } - + return $markup; } - + private function parse_inline_elements($text) { $map = array(); - + $index = 0; - - # Code Span - - if (strpos($text, '`') !== FALSE and preg_match_all('/`(.+?)`/', $text, $matches, PREG_SET_ORDER)) + + # Code Span + + if (strpos($text, '`') !== FALSE and preg_match_all('/`(.+?)`/', $text, $matches, PREG_SET_ORDER)) { foreach ($matches as $matches) { $element_text = $matches[1]; $element_text = htmlentities($element_text, ENT_NOQUOTES); - + # Decodes escape sequences. - - $this->escape_sequence_map - and strpos($element_text, "\x1A") !== FALSE + + $this->escape_sequence_map + and strpos($element_text, "\x1A") !== FALSE and $element_text = strtr($element_text, $this->escape_sequence_map); - + # Composes element. - + $element = ''.$element_text.''; - + # Encodes element. - + $code = "\x1A".'$'.$index; - + $text = str_replace($matches[0], $code, $text); - + $map[$code] = $element; - + $index ++; } } - - # Inline Link / Image - - if (strpos($text, '](') !== FALSE and preg_match_all('/(!?)(\[((?:[^\[\]]|(?2))*)\])\((.*?)\)/', $text, $matches, PREG_SET_ORDER)) # inline + + # Inline Link / Image + + if (strpos($text, '](') !== FALSE and preg_match_all('/(!?)(\[((?:[^\[\]]|(?2))*)\])\((.*?)\)/', $text, $matches, PREG_SET_ORDER)) # inline { foreach ($matches as $matches) { $url = $matches[4]; - + strpos($url, '&') !== FALSE and $url = preg_replace('/&(?!#?\w+;)/', '&', $url); - - if ($matches[1]) # image + + if ($matches[1]) # image { $element = ''.$matches[3].''; } else { $element_text = $this->parse_inline_elements($matches[3]); - + $element = ''.$element_text.''; } - - # ~ + + # ~ $code = "\x1A".'$'.$index; $text = str_replace($matches[0], $code, $text); $map[$code] = $element; - + $index ++; } } - - # Reference(d) Link / Image - + + # Reference(d) Link / Image + if ($this->reference_map and strpos($text, '[') !== FALSE and preg_match_all('/(!?)\[(.+?)\](?:\n?[ ]?\[(.*?)\])?/ms', $text, $matches, PREG_SET_ORDER)) { foreach ($matches as $matches) { $link_definition = isset($matches[3]) && $matches[3] ? $matches[3] - : $matches[2]; # implicit - + : $matches[2]; # implicit + $link_definition = strtolower($link_definition); - + if (isset($this->reference_map[$link_definition])) { $url = $this->reference_map[$link_definition]; - + strpos($url, '&') !== FALSE and $url = preg_replace('/&(?!#?\w+;)/', '&', $url); - - if ($matches[1]) # image + + if ($matches[1]) # image { $element = ''.$matches[2].''; } - else # anchor + else # anchor { $element_text = $this->parse_inline_elements($matches[2]); $element = ''.$element_text.''; } - # ~ + # ~ $code = "\x1A".'$'.$index; @@ -632,54 +632,54 @@ class Parsedown } } } - - # Automatic Links - + + # Automatic Links + if (strpos($text, '<') !== FALSE and preg_match_all('/<((https?|ftp|dict):[^\^\s]+?)>/i', $text, $matches, PREG_SET_ORDER)) { foreach ($matches as $matches) { $url = $matches[1]; - + strpos($url, '&') !== FALSE and $url = preg_replace('/&(?!#?\w+;)/', '&', $url); - + $element = ':text'; $element = str_replace(':text', $url, $element); $element = str_replace(':href', $url, $element); - - # ~ - + + # ~ + $code = "\x1A".'$'.$index; - + $text = str_replace($matches[0], $code, $text); - + $map[$code] = $element; - + $index ++; } } - - # ~ - + + # ~ + strpos($text, '&') !== FALSE and $text = preg_replace('/&(?!#?\w+;)/', '&', $text); strpos($text, '<') !== FALSE and $text = preg_replace('/<(?!\/?\w.*?>)/', '<', $text); - - # ~ - + + # ~ + if (strpos($text, '_') !== FALSE) { $text = preg_replace('/__(?=\S)(.+?)(?<=\S)__/', '$1', $text); $text = preg_replace('/_(?=\S)(.+?)(?<=\S)_/', '$1', $text); } - + if (strpos($text, '*') !== FALSE) { $text = preg_replace('/\*\*(?=\S)(.+?)(?<=\S)\*\*/', '$1', $text); $text = preg_replace('/\*(?=\S)(.+?)(?<=\S)\*/', '$1', $text); } - + $text = strtr($text, $map); - + return $text; } } \ No newline at end of file