various typography bugs, HTML comment parsing, <pre> parsing, more accurate block matching, etc.
diff --git a/system/libraries/Typography.php b/system/libraries/Typography.php
index 27fa421..fa1ec19 100644
--- a/system/libraries/Typography.php
+++ b/system/libraries/Typography.php
@@ -88,11 +88,25 @@
 			$str = preg_replace("/\n\n+/", "\n\n", $str);
 		}   
 
+		// HTML comment tags don't conform to patterns of normal tags, so pull them out separately, only if needed
+		$html_comments = array();
+		if (strpos($str, '<!--') !== FALSE)
+		{
+			if (preg_match_all("#(<!\-\-.*?\-\->)#s", $str, $matches))
+			{
+				for ($i = 0, $total = count($matches[0]); $i < $total; $i++)
+				{
+					$html_comments[] = $matches[0][$i];
+					$str = str_replace($matches[0][$i], '{@HC'.$i.'}', $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}
 		// 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))
+		if (preg_match_all("#<.+?>#si", $str, $matches))
 		{
 			for ($i = 0, $total = count($matches[0]); $i < $total; $i++)
 			{
@@ -104,7 +118,7 @@
 		
 		if ($this->protect_braced_quotes === TRUE)
 		{
-			if (preg_match_all("#\{.+?}#si", $str, $matches))
+			if (preg_match_all("#\{.+?\}#si", $str, $matches))
 			{
 				for ($i = 0, $total = count($matches[0]); $i < $total; $i++)
 				{
@@ -114,7 +128,7 @@
 				}
 			}			
 		}
-		
+				
 		// Convert "ignore" tags to temporary marker.  The parser splits out the string at every tag 
 		// it encounters.  Certain inline tags, like image tags, links, span tags, etc. will be 
 		// adversely affected if they are split out so we'll convert the opening bracket < temporarily to: {@TAG}
@@ -139,7 +153,7 @@
 		{
 			// 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.")[\s.]*?>#", $chunk, $match))
 			{
 				if (preg_match("#".$this->skip_elements."#", $match[2]))
 				{
@@ -157,23 +171,26 @@
 			
 			if ($process == FALSE)
 			{
-				$str .= $chunk;
+				$str .= ($this->last_block_element == 'pre') ? $chunk : $this->format_characters($chunk);
 				continue;
 			}
 
 			//  Convert Newlines into <p> and <br /> tags
-			$str .= $this->_format_newlines($chunk);
+			$str .= $this->format_characters($this->_format_newlines($chunk));
 		}
 
 		// is the whole of the content inside a block level element?
-		if ( ! preg_match("/^<(?:".$this->block_elements.")/i", $str, $match))
+		if ( ! preg_match("/^\s*<(?:".$this->block_elements.")/i", $str, $match))
 		{
 			$str = "<p>{$str}</p>";
 		}
-		
-		// Convert quotes, elipsis, and em-dashes
-		$str = $this->format_characters($str);
-	
+
+		// restore HTML comments
+		for ($i = 0, $total = count($html_comments); $i < $total; $i++)
+		{
+			$str = preg_replace('#(?:<p>)?{@HC'.$i.'}(?:\s*</p>)?#s', $html_comments[$i], $str);
+		}
+				
 		// Final clean up
 		$table = array(
 		
@@ -199,7 +216,7 @@
 						'/\{@NBS\}/'		=> '  '
 
 						);
-	
+		
 		// Do we need to reduce empty lines?
 		if ($reduce_linebreaks === TRUE)
 		{