summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDerek Jones <derek.jones@ellislab.com>2008-11-14 17:53:34 +0100
committerDerek Jones <derek.jones@ellislab.com>2008-11-14 17:53:34 +0100
commitd5738d9fcafa831be8a1e709e42fdafb70d4330f (patch)
treeed817c24178f45c8a7d10313573707d5832a21f7
parent9babd66d3f0a115ce2113ca9ed6f4ab10af090e9 (diff)
added some block level tag tracking so we can add inner block level elements when required
-rw-r--r--system/libraries/Typography.php82
1 files changed, 25 insertions, 57 deletions
diff --git a/system/libraries/Typography.php b/system/libraries/Typography.php
index 29b871e23..0502eef1e 100644
--- a/system/libraries/Typography.php
+++ b/system/libraries/Typography.php
@@ -34,7 +34,13 @@ class CI_Typography {
// Tags we want the parser to completely ignore when splitting the string.
var $inline_elements = 'a|abbr|acronym|b|bdo|big|br|button|cite|code|del|dfn|em|i|img|ins|input|label|map|kbd|q|samp|select|small|span|strong|sub|sup|textarea|tt|var';
-
+
+ // array of block level elements that require inner content to be within another block level element
+ var $inner_block_required = array('blockquote');
+
+ // the last block element parsed
+ var $last_block_element = '';
+
// whether or not to protect quotes within { curly braces }
var $protect_braced_quotes = FALSE;
@@ -80,7 +86,7 @@ class CI_Typography {
if ($reduce_linebreaks === TRUE)
{
$str = preg_replace("/\n\n+/", "\n\n", $str);
- }
+ }
// Convert quotes within tags to temporary markers. We don't want quotes converted
// within tags so we'll temporarily convert them to {@DQ} and {@SQ}
@@ -133,37 +139,30 @@ class CI_Typography {
{
// Are we dealing with a tag? If so, we'll skip the processing for this cycle.
// Well also set the "process" flag which allows us to skip <pre> tags and a few other things.
- if (preg_match("#<(/*)(".$this->block_elements.").*?>#", $chunk, $match))
+ if (preg_match("#<(/*)(".$this->block_elements.").*?\>#", $chunk, $match))
{
if (preg_match("#".$this->skip_elements."#", $match[2]))
{
$process = ($match[1] == '/') ? TRUE : FALSE;
}
- $str .= $chunk;
- continue;
- }
- elseif (preg_match('/<(\/?)([a-z]*).*?>/s', $chunk, $tagmatch))
- {
- if ($tagmatch[1] == '/' && $tagmatch[2] == $this->last_tag)
+ if ($match[1] == '')
{
- $process = FALSE;
+ $this->last_block_element = $match[2];
}
- else
- {
- $process = TRUE;
- $this->last_tag = $tagmatch[2];
- }
- }
+ $str .= $chunk;
+ continue;
+ }
+
if ($process == FALSE)
{
$str .= $chunk;
continue;
}
-
+
// Convert Newlines into <p> and <br /> tags
- $str .= $this->format_characters($this->_format_newlines($chunk));
+ $str .= $this->_format_newlines($chunk);
}
// is the whole of the content inside a block level element?
@@ -171,20 +170,16 @@ class CI_Typography {
{
$str = "<p>{$str}</p>";
}
-
-
- // some special linebreak cleanup
- $str = preg_replace_callback('#<(?!/|'.$this->block_elements.')([^>]*)><p>(.*?)</p><(\w*)#si', array($this, '_linebreak_cleanup'), $str);
-
- // and cleanup empty paragraph tags sitting between two closing tags
- $str = preg_replace('#(</\w+>)<p>(\s*)</p>(</\w+>)#si', '$1$2$3', $str);
+ // Convert quotes, elipsis, and em-dashes
+ $str = $this->format_characters($str);
+
// Final clean up
$table = array(
// If the user submitted their own paragraph tags within the text
// we will retain them instead of using our tags.
- '/(<p[^>*?]>)<p>/' => '$1', // <?php BBEdit syntax coloring bug fix
+ '/(<p[^>*?]>)<p>/' => '$1', // <?php BBEdit syntax coloring bug fix
// Reduce multiple instances of opening/closing paragraph tags to a single one
'#(</p>)+#' => '</p>',
@@ -192,13 +187,10 @@ class CI_Typography {
// Clean up stray paragraph tags that appear before block level elements
'#<p></p><('.$this->block_elements.')#' => '<$1',
-
- // Clean up open paragraph tags that appear before block level elements
- '#<p>(\W)<('.$this->block_elements.')#' => '<p></p>$1<$2',
// Clean up stray non-breaking spaces preceeding block elements
'#[&nbsp; ]+<('.$this->block_elements.')#' => ' <$1',
-
+
// Replace the temporary markers we added earlier
'/\{@TAG\}/' => '<',
'/\{@DQ\}/' => '"',
@@ -207,7 +199,7 @@ class CI_Typography {
'/\{@NBS\}/' => ' '
);
-
+
// Do we need to reduce empty lines?
if ($reduce_linebreaks === TRUE)
{
@@ -227,30 +219,6 @@ class CI_Typography {
// --------------------------------------------------------------------
/**
- * Linebreak Cleanup
- *
- * Removes paragraph and line break tags inserted inbetween
- * inline content and a new opening block level element
- *
- * @access private
- * @param array
- * @return string
- */
- function _linebreak_cleanup($match)
- {
- if (in_array($match[3], explode('|', $this->block_elements)))
- {
- return "<{$match[1]}>".str_replace('<br />', '', $match[2])."<{$match[3]}";
- }
- else
- {
- return $match[0];
- }
- }
-
- // --------------------------------------------------------------------
-
- /**
* Format Characters
*
* This function mainly converts double and single quotes
@@ -320,8 +288,8 @@ class CI_Typography {
{
return $str;
}
-
- if (strpos($str, "\n") === FALSE)
+
+ if (strpos($str, "\n") === FALSE && ! in_array($this->last_block_element, $this->inner_block_required))
{
return $str;
}