extract render() HTML formatting method.

This commit is contained in:
Won-Kyu Park 2014-02-19 15:03:18 +09:00
parent 7a20a9fb60
commit b06c15a793

View File

@ -764,6 +764,7 @@ class Parsedown
# ~ # ~
$markups = array();
$markup = ''; $markup = '';
while ($markers) while ($markers)
@ -795,13 +796,19 @@ class Parsedown
if ($closest_marker === null or isset($text[$closest_marker_position + 1]) === false) if ($closest_marker === null or isset($text[$closest_marker_position + 1]) === false)
{ {
$markup .= $text; if (isset($text[0]))
{
$markups[] = $text;
}
break; break;
} }
else else
{ {
$markup .= substr($text, 0, $closest_marker_position); if ($closest_marker_position > 0)
{
$markups[] = substr($text, 0, $closest_marker_position);
}
} }
$text = substr($text, $closest_marker_position); $text = substr($text, $closest_marker_position);
@ -816,7 +823,7 @@ class Parsedown
{ {
case " \n": case " \n":
$markup .= '<br />'."\n"; $markup = array('tag' => 'br');
$offset = 3; $offset = 3;
@ -892,34 +899,30 @@ class Parsedown
if ($element['!']) if ($element['!'])
{ {
$markup .= '<img alt="'.$element['text'].'" src="'.$element['link'].'"'; $markup = array('tag' => 'img', 'src' => $element['link'], 'alt' => $element['text']);
if (isset($element['title'])) if (isset($element['title']))
{ {
$markup .= ' title="'.$element['title'].'"'; $markup['title'] = $element['title'];
} }
$markup .= ' />';
} }
else else
{ {
$element['text'] = $this->parse_span_elements($element['text'], $markers); $element['text'] = $this->parse_span_elements($element['text'], $markers);
$markup .= '<a href="'.$element['link'].'"'; $markup = array('tag' => 'a', 'href' => $element['link'], 'text' => $element['text']);
if (isset($element['title'])) if (isset($element['title']))
{ {
$markup .= ' title="'.$element['title'].'"'; $markup['title'] = $element['title'];
} }
$markup .= '>'.$element['text'].'</a>';
} }
unset($element); unset($element);
} }
else else
{ {
$markup .= $closest_marker; $markup = $closest_marker;
$offset = $closest_marker === '![' ? 2 : 1; $offset = $closest_marker === '![' ? 2 : 1;
} }
@ -930,13 +933,13 @@ class Parsedown
if (preg_match('/^&#?\w+;/', $text, $matches)) if (preg_match('/^&#?\w+;/', $text, $matches))
{ {
$markup .= $matches[0]; $markup = $matches[0];
$offset = strlen($matches[0]); $offset = strlen($matches[0]);
} }
else else
{ {
$markup .= '&amp;'; $markup = '&amp;';
$offset = 1; $offset = 1;
} }
@ -951,14 +954,14 @@ class Parsedown
$markers[] = $closest_marker; $markers[] = $closest_marker;
$matches[1] = $this->parse_span_elements($matches[1], $markers); $matches[1] = $this->parse_span_elements($matches[1], $markers);
$markup .= '<strong>'.$matches[1].'</strong>'; $markup = array('tag' => 'strong', 'text' => $matches[1]);
} }
elseif (preg_match(self::$em_regex[$closest_marker], $text, $matches)) elseif (preg_match(self::$em_regex[$closest_marker], $text, $matches))
{ {
$markers[] = $closest_marker; $markers[] = $closest_marker;
$matches[1] = $this->parse_span_elements($matches[1], $markers); $matches[1] = $this->parse_span_elements($matches[1], $markers);
$markup .= '<em>'.$matches[1].'</em>'; $markup = array('tag' => 'em', 'text' => $matches[1]);
} }
if (isset($matches) and $matches) if (isset($matches) and $matches)
@ -967,7 +970,7 @@ class Parsedown
} }
else else
{ {
$markup .= $closest_marker; $markup = $closest_marker;
$offset = 1; $offset = 1;
} }
@ -984,32 +987,32 @@ class Parsedown
$element_url = str_replace('&', '&amp;', $element_url); $element_url = str_replace('&', '&amp;', $element_url);
$element_url = str_replace('<', '&lt;', $element_url); $element_url = str_replace('<', '&lt;', $element_url);
$markup .= '<a href="'.$element_url.'">'.$element_url.'</a>'; $markup = array('tag' => 'a', 'href' => $element_url, 'text' => $element_url);
$offset = strlen($matches[0]); $offset = strlen($matches[0]);
} }
elseif (strpos($text, '@') > 1 and preg_match('/<(\S+?@\S+?)>/', $text, $matches)) elseif (strpos($text, '@') > 1 and preg_match('/<(\S+?@\S+?)>/', $text, $matches))
{ {
$markup .= '<a href="mailto:'.$matches[1].'">'.$matches[1].'</a>'; $markup = array('tag' => 'a', 'href' => 'mailto:'.$matches[1], 'text' => $matches[1]);
$offset = strlen($matches[0]); $offset = strlen($matches[0]);
} }
elseif (preg_match('/^<\/?\w.*?>/', $text, $matches)) elseif (preg_match('/^<\/?\w.*?>/', $text, $matches))
{ {
$markup .= $matches[0]; $markup = $matches[0];
$offset = strlen($matches[0]); $offset = strlen($matches[0]);
} }
else else
{ {
$markup .= '&lt;'; $markup = '&lt;';
$offset = 1; $offset = 1;
} }
} }
else else
{ {
$markup .= '&lt;'; $markup = '&lt;';
$offset = 1; $offset = 1;
} }
@ -1020,13 +1023,13 @@ class Parsedown
if (in_array($text[1], self::$special_characters)) if (in_array($text[1], self::$special_characters))
{ {
$markup .= $text[1]; $markup = $text[1];
$offset = 2; $offset = 2;
} }
else else
{ {
$markup .= '\\'; $markup = '\\';
$offset = 1; $offset = 1;
} }
@ -1040,13 +1043,13 @@ class Parsedown
$element_text = $matches[2]; $element_text = $matches[2];
$element_text = htmlspecialchars($element_text, ENT_NOQUOTES, 'UTF-8'); $element_text = htmlspecialchars($element_text, ENT_NOQUOTES, 'UTF-8');
$markup .= '<code>'.$element_text.'</code>'; $markup = array('tag' => 'code', 'text' => $element_text);
$offset = strlen($matches[0]); $offset = strlen($matches[0]);
} }
else else
{ {
$markup .= '`'; $markup = '`';
$offset = 1; $offset = 1;
} }
@ -1061,13 +1064,13 @@ class Parsedown
$element_url = str_replace('&', '&amp;', $element_url); $element_url = str_replace('&', '&amp;', $element_url);
$element_url = str_replace('<', '&lt;', $element_url); $element_url = str_replace('<', '&lt;', $element_url);
$markup .= '<a href="'.$element_url.'">'.$element_url.'</a>'; $markup = array('tag' => 'a', 'href' => $element_url, 'text' => $element_url);
$offset = strlen($matches[0]); $offset = strlen($matches[0]);
} }
else else
{ {
$markup .= 'http'; $markup = 'http';
$offset = 4; $offset = 4;
} }
@ -1080,13 +1083,13 @@ class Parsedown
{ {
$matches[1] = $this->parse_span_elements($matches[1], $markers); $matches[1] = $this->parse_span_elements($matches[1], $markers);
$markup .= '<del>'.$matches[1].'</del>'; $markup = array('tag' => 'del', 'text' => $matches[1]);
$offset = strlen($matches[0]); $offset = strlen($matches[0]);
} }
else else
{ {
$markup .= '~~'; $markup = '~~';
$offset = 2; $offset = 2;
} }
@ -1099,9 +1102,82 @@ class Parsedown
$text = substr($text, $offset); $text = substr($text, $offset);
} }
$markups[] = $markup;
$markers[$closest_marker_index] = $closest_marker; $markers[$closest_marker_index] = $closest_marker;
} }
return $this->render($markups);
}
function render($elements)
{
$markup = '';
$buffer = '';
foreach ($elements as $element)
{
if (is_string($element))
{
# concat string elements
$buffer .= $element;
continue;
}
if (isset($buffer[0]))
{
# append string buffer
$markup.= $buffer;
$buffer = '';
}
switch ($element['tag'])
{
case 'a':
$markup .= '<a href="'.$element['href'].'"';
if (isset($element['title']))
{
$markup .= ' title="'. $element['title']. '"';
}
$markup .= '>'.$element['text'].'</a>';
break;
case 'img':
$markup .= '<img';
if (isset($element['alt']))
{
$markup .= ' alt="'. $element['alt']. '"';
}
$markup .= ' src="'.$element['src'].'"';
if (isset($element['title']))
{
$markup .= ' title="'. $element['title']. '"';
}
$markup .= ' />';
break;
case 'br':
$markup .= '<br />'."\n";
break;
default:
$markup .= '<'.$element['tag'].'>'.$element['text'].'</'.$element['tag'].'>';
break;
}
}
# append remaining string
if (isset($buffer[0]))
{
$markup.= $buffer;
}
return $markup; return $markup;
} }