diff options
Diffstat (limited to 'system/libraries/Typography.php')
-rw-r--r-- | system/libraries/Typography.php | 59 |
1 files changed, 35 insertions, 24 deletions
diff --git a/system/libraries/Typography.php b/system/libraries/Typography.php index fa1ec1999..0c4a978aa 100644 --- a/system/libraries/Typography.php +++ b/system/libraries/Typography.php @@ -101,32 +101,21 @@ class CI_Typography { } } } - - // 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} - // and we don't want double dashes converted to emdash entities, so they are marked with {@DD} - // likewise double spaces are converted to {@NBS} to prevent entity conversion - if (preg_match_all("#<.+?>#si", $str, $matches)) + + // match and yank <pre> tags if they exist. It's cheaper to do this separately since most content will + // not contain <pre> tags, and it keeps the PCRE patterns below simpler and faster + if (strpos($str, '<pre') !== FALSE) { - for ($i = 0, $total = count($matches[0]); $i < $total; $i++) - { - $str = str_replace($matches[0][$i], - str_replace(array("'",'"','--',' '), array('{@SQ}', '{@DQ}', '{@DD}', '{@NBS}'), $matches[0][$i]), - $str); - } + $str = preg_replace_callback("#<pre.*?>.*?</pre>#si", array($this, '_protect_characters'), $str); } + // Convert quotes within tags to temporary markers. + $str = preg_replace_callback("#<.+?>#si", array($this, '_protect_characters'), $str); + + // Do the same with braces if necessary if ($this->protect_braced_quotes === TRUE) { - if (preg_match_all("#\{.+?\}#si", $str, $matches)) - { - for ($i = 0, $total = count($matches[0]); $i < $total; $i++) - { - $str = str_replace($matches[0][$i], - str_replace(array("'",'"'), array('{@SQ}', '{@DQ}'), $matches[0][$i]), - $str); - } - } + $str = preg_replace_callback("#\{.+?\}#si", array($this, '_protect_characters'), $str); } // Convert "ignore" tags to temporary marker. The parser splits out the string at every tag @@ -153,7 +142,7 @@ 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.")[\s.]*?>#", $chunk, $match)) + if (preg_match("#<(/*)(".$this->block_elements.").*?>#", $chunk, $match)) { if (preg_match("#".$this->skip_elements."#", $match[2])) { @@ -171,12 +160,12 @@ class CI_Typography { if ($process == FALSE) { - $str .= ($this->last_block_element == 'pre') ? $chunk : $this->format_characters($chunk); + $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? @@ -185,6 +174,9 @@ class CI_Typography { $str = "<p>{$str}</p>"; } + // Convert quotes, elipsis, em-dashes, non-breaking spaces, and ampersands + $str = $this->format_characters($str); + // restore HTML comments for ($i = 0, $total = count($html_comments); $i < $total; $i++) { @@ -344,6 +336,25 @@ class CI_Typography { // ------------------------------------------------------------------------ /** + * Protect Characters + * + * Protects special characters from being formatted later + * We don't want quotes converted within tags so we'll temporarily convert them to {@DQ} and {@SQ} + * and we don't want double dashes converted to emdash entities, so they are marked with {@DD} + * likewise double spaces are converted to {@NBS} to prevent entity conversion + * + * @access public + * @param array + * @return string + */ + function _protect_characters($match) + { + return str_replace(array("'",'"','--',' '), array('{@SQ}', '{@DQ}', '{@DD}', '{@NBS}'), $match[0]); + } + + // -------------------------------------------------------------------- + + /** * Convert newlines to HTML line breaks except within PRE tags * * @access public |