| # Markdown Extra  -  A text-to-HTML conversion tool for web writers␊ | 
| #␊ | 
| # PHP Markdown & Extra␊ | 
| # Copyright (c) 2004-2009 Michel Fortin  ␊ | 
| # Copyright (c) 2004-2012 Michel Fortin  ␊ | 
| # <http://michelf.com/projects/php-markdown/>␊ | 
| #␊ | 
| # Original Markdown␊ | 
|  | 
| #␊ | 
| ␊ | 
| ␊ | 
| define( 'MARKDOWN_VERSION',  "1.0.1n" ); # Sat 10 Oct 2009␊ | 
| define( 'MARKDOWNEXTRA_VERSION',  "1.2.4" ); # Sat 10 Oct 2009␊ | 
| define( 'MARKDOWN_VERSION',  "1.0.1o" ); # Sun 8 Jan 2012␊ | 
| define( 'MARKDOWNEXTRA_VERSION',  "1.2.5" ); # Sun 8 Jan 2012␊ | 
| ␊ | 
| ␊ | 
| #␊ | 
|  | 
| return Markdown($text);␊ | 
| }␊ | 
| ␊ | 
| ␊ | 
| #␊ | 
| # Markdown Parser Class␊ | 
| #␊ | 
|  | 
| ␊ | 
| ␉␉# Re-usable patterns to match list item bullets and number markers:␊ | 
| ␉␉$marker_ul_re  = '[*+-]';␊ | 
| ␉␉$marker_ol_re  = '\d+[.]';␊ | 
| ␉␉$marker_ol_re  = '\d+[\.]';␊ | 
| ␉␉$marker_any_re = "(?:$marker_ul_re|$marker_ol_re)";␊ | 
| ␊ | 
| ␉␉$markers_relist = array(␊ | 
|  | 
| ␉function _doLists_callback($matches) {␊ | 
| ␉␉# Re-usable patterns to match list item bullets and number markers:␊ | 
| ␉␉$marker_ul_re  = '[*+-]';␊ | 
| ␉␉$marker_ol_re  = '\d+[.]';␊ | 
| ␉␉$marker_ol_re  = '\d+[\.]';␊ | 
| ␉␉$marker_any_re = "(?:$marker_ul_re|$marker_ol_re)";␊ | 
| ␉␉␊ | 
| ␉␉$list = $matches[1];␊ | 
|  | 
| ␊ | 
| ␊ | 
| ␉var $em_relist = array(␊ | 
| ␉␉''  => '(?:(?<!\*)\*(?!\*)|(?<!_)_(?!_))(?=\S|$)(?![.,:;]\s)',␊ | 
| ␉␉''  => '(?:(?<!\*)\*(?!\*)|(?<!_)_(?!_))(?=\S|$)(?![\.,:;]\s)',␊ | 
| ␉␉'*' => '(?<=\S|^)(?<!\*)\*(?!\*)',␊ | 
| ␉␉'_' => '(?<=\S|^)(?<!_)_(?!_)',␊ | 
| ␉␉);␊ | 
| ␉var $strong_relist = array(␊ | 
| ␉␉''   => '(?:(?<!\*)\*\*(?!\*)|(?<!_)__(?!_))(?=\S|$)(?![.,:;]\s)',␊ | 
| ␉␉''   => '(?:(?<!\*)\*\*(?!\*)|(?<!_)__(?!_))(?=\S|$)(?![\.,:;]\s)',␊ | 
| ␉␉'**' => '(?<=\S|^)(?<!\*)\*\*(?!\*)',␊ | 
| ␉␉'__' => '(?<=\S|^)(?<!_)__(?!_)',␊ | 
| ␉␉);␊ | 
| ␉var $em_strong_relist = array(␊ | 
| ␉␉''    => '(?:(?<!\*)\*\*\*(?!\*)|(?<!_)___(?!_))(?=\S|$)(?![.,:;]\s)',␊ | 
| ␉␉''    => '(?:(?<!\*)\*\*\*(?!\*)|(?<!_)___(?!_))(?=\S|$)(?![\.,:;]\s)',␊ | 
| ␉␉'***' => '(?<=\S|^)(?<!\*)\*\*\*(?!\*)',␊ | 
| ␉␉'___' => '(?<=\S|^)(?<!_)___(?!_)',␊ | 
| ␉␉);␊ | 
|  | 
| ␉␉␉␉|␊ | 
| ␉␉␉␉␉# Fenced code block marker␊ | 
| ␉␉␉␉␉(?> ^ | \n )␊ | 
| ␉␉␉␉␉[ ]{'.($indent).'}~~~+[ ]*\n␊ | 
| ␉␉␉␉␉[ ]{0,'.($indent).'}~~~+[ ]*\n␊ | 
| ␉␉␉␉' : '' ). ' # End (if not is span).␊ | 
| ␉␉␉␉)␊ | 
| ␉␉␉}xs';␊ | 
|  | 
| ␉␉␉␉}␊ | 
| ␉␉␉}␊ | 
| ␉␉␉#␊ | 
| ␉␉␉# Check for: Indented code block.␊ | 
| ␉␉␉#␊ | 
| ␉␉␉else if ($tag{0} == "\n" || $tag{0} == " ") {␊ | 
| ␉␉␉␉# Indented code block: pass it unchanged, will be handled ␊ | 
| ␉␉␉␉# later.␊ | 
| ␉␉␉␉$parsed .= $tag;␊ | 
| ␉␉␉}␊ | 
| ␉␉␉#␊ | 
| ␉␉␉# Check for: Fenced code block marker.␊ | 
| ␉␉␉#␊ | 
| ␉␉␉else if ($tag{0} == "~") {␊ | 
| ␉␉␉else if (preg_match('{^\n?[ ]{0,'.($indent+3).'}~}', $tag)) {␊ | 
| ␉␉␉␉# Fenced code block marker: find matching end marker.␊ | 
| ␉␉␉␉$tag_re = preg_quote(trim($tag));␊ | 
| ␉␉␉␉if (preg_match('{^(?>.*\n)+?'.$tag_re.' *\n}', $text, ␊ | 
| ␉␉␉␉if (preg_match('{^(?>.*\n)+?[ ]{0,'.($indent).'}'.$tag_re.'[ ]*\n}', $text, ␊ | 
| ␉␉␉␉␉$matches)) ␊ | 
| ␉␉␉␉{␊ | 
| ␉␉␉␉␉# End marker found: pass text unchanged until marker.␊ | 
|  | 
| ␉␉␉␉}␊ | 
| ␉␉␉}␊ | 
| ␉␉␉#␊ | 
| ␉␉␉# Check for: Indented code block.␊ | 
| ␉␉␉#␊ | 
| ␉␉␉else if ($tag{0} == "\n" || $tag{0} == " ") {␊ | 
| ␉␉␉␉# Indented code block: pass it unchanged, will be handled ␊ | 
| ␉␉␉␉# later.␊ | 
| ␉␉␉␉$parsed .= $tag;␊ | 
| ␉␉␉}␊ | 
| ␉␉␉#␊ | 
| ␉␉␉# Check for: Opening Block level tag or␊ | 
| ␉␉␉#            Opening Context Block tag (like ins and del) ␊ | 
| ␉␉␉#               used as a block tag (tag is alone on it's line).␊ | 
|  | 
| ␉# work in the middle of a word.␊ | 
| ␉#␊ | 
| ␉var $em_relist = array(␊ | 
| ␉␉''  => '(?:(?<!\*)\*(?!\*)|(?<![a-zA-Z0-9_])_(?!_))(?=\S|$)(?![.,:;]\s)',␊ | 
| ␉␉''  => '(?:(?<!\*)\*(?!\*)|(?<![a-zA-Z0-9_])_(?!_))(?=\S|$)(?![\.,:;]\s)',␊ | 
| ␉␉'*' => '(?<=\S|^)(?<!\*)\*(?!\*)',␊ | 
| ␉␉'_' => '(?<=\S|^)(?<!_)_(?![a-zA-Z0-9_])',␊ | 
| ␉␉);␊ | 
| ␉var $strong_relist = array(␊ | 
| ␉␉''   => '(?:(?<!\*)\*\*(?!\*)|(?<![a-zA-Z0-9_])__(?!_))(?=\S|$)(?![.,:;]\s)',␊ | 
| ␉␉''   => '(?:(?<!\*)\*\*(?!\*)|(?<![a-zA-Z0-9_])__(?!_))(?=\S|$)(?![\.,:;]\s)',␊ | 
| ␉␉'**' => '(?<=\S|^)(?<!\*)\*\*(?!\*)',␊ | 
| ␉␉'__' => '(?<=\S|^)(?<!_)__(?![a-zA-Z0-9_])',␊ | 
| ␉␉);␊ | 
| ␉var $em_strong_relist = array(␊ | 
| ␉␉''    => '(?:(?<!\*)\*\*\*(?!\*)|(?<![a-zA-Z0-9_])___(?!_))(?=\S|$)(?![.,:;]\s)',␊ | 
| ␉␉''    => '(?:(?<!\*)\*\*\*(?!\*)|(?<![a-zA-Z0-9_])___(?!_))(?=\S|$)(?![\.,:;]\s)',␊ | 
| ␉␉'***' => '(?<=\S|^)(?<!\*)\*\*\*(?!\*)',␊ | 
| ␉␉'___' => '(?<=\S|^)(?<!_)___(?![a-zA-Z0-9_])',␊ | 
| ␉␉);␊ |