<?php
#
# Markdown Extra  -  A text-to-HTML conversion tool for web writers
#
# PHP Markdown & Extra
# Copyright (c) 2004-2008 Michel Fortin
# <http://www.michelf.com/projects/php-markdown/>
#
# Original Markdown
# Copyright (c) 2004-2006 John Gruber
# <http://daringfireball.net/projects/markdown/>
#


define( 'MARKDOWN_VERSION',  "1.0.1m" ); # Sat 21 Jun 2008
define( 'MARKDOWNEXTRA_VERSION',  "1.2.3" ); # Wed 31 Dec 2008


#
# Global default settings:
#

# Change to ">" for HTML output
@define( 'MARKDOWN_EMPTY_ELEMENT_SUFFIX',  " />");

# Define the width of a tab for code blocks.
@define( 'MARKDOWN_TAB_WIDTH',     4 );

# Optional title attribute for footnote links and backlinks.
@define( 'MARKDOWN_FN_LINK_TITLE',         "" );
@define( 'MARKDOWN_FN_BACKLINK_TITLE',     "" );

# Optional class attribute for footnote links and backlinks.
@define( 'MARKDOWN_FN_LINK_CLASS',         "" );
@define( 'MARKDOWN_FN_BACKLINK_CLASS',     "" );


#
# WordPress settings:
#

# Change to false to remove Markdown from posts and/or comments.
@define( 'MARKDOWN_WP_POSTS',      true );
@define( 'MARKDOWN_WP_COMMENTS',   true );



### Standard Function Interface ###

@define( 'MARKDOWN_PARSER_CLASS',  'MarkdownExtra_Parser' );

function Markdown($text) {
#
# Initialize the parser and return the result of its transform method.
#
    # Setup static parser variable.
    static $parser;
    if (!isset($parser)) {
        $parser_class = MARKDOWN_PARSER_CLASS;
        $parser = new $parser_class;
    }

    # Transform text using parser.
    return $parser->transform($text);
}


### WordPress Plugin Interface ###

/*
Plugin Name: Markdown Extra
Plugin URI: http://www.michelf.com/projects/php-markdown/
Description: <a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a> allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by <a href="http://daringfireball.net/">John Gruber</a>. <a href="http://www.michelf.com/projects/php-markdown/">More...</a>
Version: 1.2.2
Author: Michel Fortin
Author URI: http://www.michelf.com/
*/

if (isset($wp_version)) {
    # More details about how it works here:
    # <http://www.michelf.com/weblog/2005/wordpress-text-flow-vs-markdown/>

    # Post content and excerpts
    # - Remove WordPress paragraph generator.
    # - Run Markdown on excerpt, then remove all tags.
    # - Add paragraph tag around the excerpt, but remove it for the excerpt rss.
    if (MARKDOWN_WP_POSTS) {
        remove_filter('the_content',     'wpautop');
        remove_filter('the_content_rss', 'wpautop');
        remove_filter('the_excerpt',     'wpautop');
        add_filter('the_content',     'mdwp_MarkdownPost', 6);
        add_filter('the_content_rss', 'mdwp_MarkdownPost', 6);
        add_filter('get_the_excerpt', 'mdwp_MarkdownPost', 6);
        add_filter('get_the_excerpt', 'trim', 7);
        add_filter('the_excerpt',     'mdwp_add_p');
        add_filter('the_excerpt_rss', 'mdwp_strip_p');

        remove_filter('content_save_pre',  'balanceTags', 50);
        remove_filter('excerpt_save_pre',  'balanceTags', 50);
        add_filter('the_content',     'balanceTags', 50);
        add_filter('get_the_excerpt', 'balanceTags', 9);
    }

    # Add a footnote id prefix to posts when inside a loop.
    function mdwp_MarkdownPost($text) {
        static $parser;
        if (!$parser) {
            $parser_class = MARKDOWN_PARSER_CLASS;
            $parser = new $parser_class;
        }
        if (is_single() || is_page() || is_feed()) {
            $parser->fn_id_prefix = "";
        } else {
            $parser->fn_id_prefix = get_the_ID() . ".";
        }
        return $parser->transform($text);
    }

    # Comments
    # - Remove WordPress paragraph generator.
    # - Remove WordPress auto-link generator.
    # - Scramble important tags before passing them to the kses filter.
    # - Run Markdown on excerpt then remove paragraph tags.
    if (MARKDOWN_WP_COMMENTS) {
        remove_filter('comment_text', 'wpautop', 30);
        remove_filter('comment_text', 'make_clickable');
        add_filter('pre_comment_content', 'Markdown', 6);
        add_filter('pre_comment_content', 'mdwp_hide_tags', 8);
        add_filter('pre_comment_content', 'mdwp_show_tags', 12);
        add_filter('get_comment_text',    'Markdown', 6);
        add_filter('get_comment_excerpt', 'Markdown', 6);
        add_filter('get_comment_excerpt', 'mdwp_strip_p', 7);

        global $mdwp_hidden_tags, $mdwp_placeholders;
        $mdwp_hidden_tags = explode(' ',
            '<p> </p> <pre> </pre> <ol> </ol> <ul> </ul> <li> </li>');
        $mdwp_placeholders = explode(' ', str_rot13(
            'pEj07ZbbBZ U1kqgh4w4p pre2zmeN6K QTi31t9pre ol0MP1jzJR '.
            'ML5IjmbRol ulANi1NsGY J7zRLJqPul liA8ctl16T K9nhooUHli'));
    }

    function mdwp_add_p($text) {
        if (!preg_match('{^$|^<(p|ul|ol|dl|pre|blockquote)>}i', $text)) {
            $text = '<p>'.$text.'</p>';
            $text = preg_replace('{\n{2,}}', "</p>\n\n<p>", $text);
        }
        return $text;
    }

    function mdwp_strip_p($t) { return preg_replace('{</?p>}i', '', $t); }

    function mdwp_hide_tags($text) {
        global $mdwp_hidden_tags, $mdwp_placeholders;
        return str_replace($mdwp_hidden_tags, $mdwp_placeholders, $text);
    }
    function mdwp_show_tags($text) {
        global $mdwp_hidden_tags, $mdwp_placeholders;
        return str_replace($mdwp_placeholders, $mdwp_hidden_tags, $text);
    }
}


### bBlog Plugin Info ###

function identify_modifier_markdown() {
    return array(
        'name' => 'markdown',
        'type' => 'modifier',
        'nicename' => 'PHP Markdown Extra',
        'description' => 'A text-to-HTML conversion tool for web writers',
        'authors' => 'Michel Fortin and John Gruber',
        'licence' => 'GPL',
        'version' => MARKDOWNEXTRA_VERSION,
        'help' => '<a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a> allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by <a href="http://daringfireball.net/">John Gruber</a>. <a href="http://www.michelf.com/projects/php-markdown/">More...</a>',
        );
}


### Smarty Modifier Interface ###

function smarty_modifier_markdown($text) {
    return Markdown($text);
}


### Textile Compatibility Mode ###

# Rename this file to "classTextile.php" and it can replace Textile everywhere.

if (strcasecmp(substr(__FILE__, -16), "classTextile.php") == 0) {
    # Try to include PHP SmartyPants. Should be in the same directory.
    @include_once 'smartypants.php';
    # Fake Textile class. It calls Markdown instead.
    class Textile {
        function TextileThis($text, $lite='', $encode='') {
            if ($lite == '' && $encode == '')    $text = Markdown($text);
            if (function_exists('SmartyPants'))  $text = SmartyPants($text);
            return $text;
        }
        # Fake restricted version: restrictions are not supported for now.
        function TextileRestricted($text, $lite='', $noimage='') {
            return $this->TextileThis($text, $lite);
        }
        # Workaround to ensure compatibility with TextPattern 4.0.3.
        function blockLite($text) { return $text; }
    }
}



#
# Markdown Parser Class
#

class Markdown_Parser {

    # Regex to match balanced [brackets].
    # Needed to insert a maximum bracked depth while converting to PHP.
    var $nested_brackets_depth = 6;
    var $nested_brackets_re;

    var $nested_url_parenthesis_depth = 4;
    var $nested_url_parenthesis_re;

    # Table of hash values for escaped characters:
    var $escape_chars = '\`*_{}[]()>#+-.!';
    var $escape_chars_re;

    # Change to ">" for HTML output.
    var $empty_element_suffix = MARKDOWN_EMPTY_ELEMENT_SUFFIX;
    var $tab_width = MARKDOWN_TAB_WIDTH;

    # Change to `true` to disallow markup or entities.
    var $no_markup = false;
    var $no_entities = false;

    # Predefined urls and titles for reference links and images.
    var $predef_urls = array();
    var $predef_titles = array();


    function Markdown_Parser() {
    #
    # Constructor function. Initialize appropriate member variables.
    #
        $this->_initDetab();
        $this->prepareItalicsAndBold();

        $this->nested_brackets_re =
            str_repeat('(?>[^\[\]]+|\[', $this->nested_brackets_depth).
            str_repeat('\])*', $this->nested_brackets_depth);

        $this->nested_url_parenthesis_re =
            str_repeat('(?>[^()\s]+|\(', $this->nested_url_parenthesis_depth).
            str_repeat('(?>\)))*', $this->nested_url_parenthesis_depth);

        $this->escape_chars_re = '['.preg_quote($this->escape_chars).']';

        # Sort document, block, and span gamut in ascendent priority order.
        asort($this->document_gamut);
        asort($this->block_gamut);
        asort($this->span_gamut);
    }


    # Internal hashes used during transformation.
    var $urls = array();
    var $titles = array();
    var $html_hashes = array();

    # Status flag to avoid invalid nesting.
    var $in_anchor = false;


    function setup() {
    #
    # Called before the transformation process starts to setup parser
    # states.
    #
        # Clear global hashes.
        $this->urls = $this->predef_urls;
        $this->titles = $this->predef_titles;
        $this->html_hashes = array();

        $in_anchor = false;
    }

    function teardown() {
    #
    # Called after the transformation process to clear any variable
    # which may be taking up memory unnecessarly.
    #
        $this->urls = array();
        $this->titles = array();
        $this->html_hashes = array();
    }


    function transform($text) {
    #
    # Main function. Performs some preprocessing on the input text
    # and pass it through the document gamut.
    #
        $this->setup();

        # Remove UTF-8 BOM and marker character in input, if present.
        $text = preg_replace('{^\xEF\xBB\xBF|\x1A}', '', $text);

        # Standardize line endings:
        #   DOS to Unix and Mac to Unix
        $text = preg_replace('{\r\n?}', "\n", $text);

        # Make sure $text ends with a couple of newlines:
        $text .= "\n\n";

        # Convert all tabs to spaces.
        $text = $this->detab($text);

        # Turn block-level HTML blocks into hash entries
        $text = $this->hashHTMLBlocks($text);

        # Strip any lines consisting only of spaces and tabs.
        # This makes subsequent regexen easier to write, because we can
        # match consecutive blank lines with /\n+/ instead of something
        # contorted like /[ ]*\n+/ .
        $text = preg_replace('/^[ ]+$/m', '', $text);

        # Run document gamut methods.
        foreach ($this->document_gamut as $method => $priority) {
            $text = $this->$method($text);
        }

        $this->teardown();

        return $text . "\n";
    }

    var $document_gamut = array(
        # Strip link definitions, store in hashes.
        "stripLinkDefinitions" => 20,

        "runBasicBlockGamut"   => 30,
        );


    function stripLinkDefinitions($text) {
    #
    # Strips link definitions from text, stores the URLs and titles in
    # hash references.
    #
        $less_than_tab = $this->tab_width - 1;

        # Link defs are in the form: ^[id]: url "optional title"
        $text = preg_replace_callback('{
                            ^[ ]{0,'.$less_than_tab.'}\[(.+)\][ ]?: # id = $1
                              [ ]*
                              \n?               # maybe *one* newline
                              [ ]*
                            <?(\S+?)>?          # url = $2
                              [ ]*
                              \n?               # maybe one newline
                              [ ]*
                            (?:
                                (?<=\s)         # lookbehind for whitespace
                                ["(]
                                (.*?)           # title = $3
                                [")]
                                [ ]*
                            )?  # title is optional
                            (?:\n+|\Z)
            }xm',
            array(&$this, '_stripLinkDefinitions_callback'),
            $text);
        return $text;
    }
    function _stripLinkDefinitions_callback($matches) {
        $link_id = strtolower($matches[1]);
        $this->urls[$link_id] = $matches[2];
        $this->titles[$link_id] =& $matches[3];
        return ''; # String that will replace the block
    }


    function hashHTMLBlocks($text) {
        if ($this->no_markup)  return $text;

        $less_than_tab = $this->tab_width - 1;

        # Hashify HTML blocks:
        # We only want to do this for block-level HTML tags, such as headers,
        # lists, and tables. That's because we still want to wrap <p>s around
        # "paragraphs" that are wrapped in non-block-level tags, such as anchors,
        # phrase emphasis, and spans. The list of tags we're looking for is
        # hard-coded:
        #
        # *  List "a" is made of tags which can be both inline or block-level.
        #    These will be treated block-level when the start tag is alone on
        #    its line, otherwise they're not matched here and will be taken as
        #    inline later.
        # *  List "b" is made of tags which are always block-level;
        #
        $block_tags_a_re = 'ins|del';
        $block_tags_b_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|'.
                           'script|noscript|form|fieldset|iframe|math';

        # Regular expression for the content of a block tag.
        $nested_tags_level = 4;
        $attr = '
            (?>             # optional tag attributes
              \s            # starts with whitespace
              (?>
                [^>"/]+     # text outside quotes
              |
                /+(?!>)     # slash not followed by ">"
              |
                "[^"]*"     # text inside double quotes (tolerate ">")
              |
                \'[^\']*\'  # text inside single quotes (tolerate ">")
              )*
            )?
            ';
        $content =
            str_repeat('
                (?>
                  [^<]+         # content without tag
                |
                  <\2           # nested opening tag
                    '.$attr.'   # attributes
                    (?>
                      />
                    |
                      >', $nested_tags_level).  # end of opening tag
                      '.*?'.                    # last level nested tag content
            str_repeat('
                      </\2\s*>  # closing nested tag
                    )
                  |
                    <(?!/\2\s*> # other tags with a different name
                  )
                )*',
                $nested_tags_level);
        $content2 = str_replace('\2', '\3', $content);

        # First, look for nested blocks, e.g.:
        #   <div>
        #       <div>
        #       tags for inner block must be indented.
        #       </div>
        #   </div>
        #
        # The outermost tags must start at the left margin for this to match, and
        # the inner nested divs must be indented.
        # We need to do this before the next, more liberal match, because the next
        # match will start at the first `<div>` and stop at the first `</div>`.
        $text = preg_replace_callback('{(?>
            (?>
                (?<=\n\n)       # Starting after a blank line
                |               # or
                \A\n?           # the beginning of the doc
            )
            (                       # save in $1

              # Match from `\n<tag>` to `</tag>\n`, handling nested tags
              # in between.

                        [ ]{0,'.$less_than_tab.'}
                        <('.$block_tags_b_re.')# start tag = $2
                        '.$attr.'>          # attributes followed by > and \n
                        '.$content.'        # content, support nesting
                        </\2>               # the matching end tag
                        [ ]*                # trailing spaces/tabs
                        (?=\n+|\Z)  # followed by a newline or end of document

            | # Special version for tags of group a.

                        [ ]{0,'.$less_than_tab.'}
                        <('.$block_tags_a_re.')# start tag = $3
                        '.$attr.'>[ ]*\n    # attributes followed by >
                        '.$content2.'       # content, support nesting
                        </\3>               # the matching end tag
                        [ ]*                # trailing spaces/tabs
                        (?=\n+|\Z)  # followed by a newline or end of document

            | # Special case just for <hr />. It was easier to make a special
              # case than to make the other regex more complicated.

                        [ ]{0,'.$less_than_tab.'}
                        <(hr)               # start tag = $2
                        '.$attr.'           # attributes
                        /?>                 # the matching end tag
                        [ ]*
                        (?=\n{2,}|\Z)       # followed by a blank line or end of document

            | # Special case for standalone HTML comments:

                    [ ]{0,'.$less_than_tab.'}
                    (?s:
                        <!-- .*? -->
                    )
                    [ ]*
                    (?=\n{2,}|\Z)       # followed by a blank line or end of document

            | # PHP and ASP-style processor instructions (<? and <%)

                    [ ]{0,'.$less_than_tab.'}
                    (?s:
                        <([?%])         # $2
                        .*?
                        \2>
                    )
                    [ ]*
                    (?=\n{2,}|\Z)       # followed by a blank line or end of document

            )
            )}Sxmi',
            array(&$this, '_hashHTMLBlocks_callback'),
            $text);

        return $text;
    }
    function _hashHTMLBlocks_callback($matches) {
        $text = $matches[1];
        $key  = $this->hashBlock($text);
        return "\n\n$key\n\n";
    }


    function hashPart($text, $boundary = 'X') {
    #
    # Called whenever a tag must be hashed when a function insert an atomic
    # element in the text stream. Passing $text to through this function gives
    # a unique text-token which will be reverted back when calling unhash.
    #
    # The $boundary argument specify what character should be used to surround
    # the token. By convension, "B" is used for block elements that needs not
    # to be wrapped into paragraph tags at the end, ":" is used for elements
    # that are word separators and "X" is used in the general case.
    #
        # Swap back any tag hash found in $text so we do not have to `unhash`
        # multiple times at the end.
        $text = $this->unhash($text);

        # Then hash the block.
        static $i = 0;
        $key = "$boundary\x1A" . ++$i . $boundary;
        $this->html_hashes[$key] = $text;
        return $key; # String that will replace the tag.
    }


    function hashBlock($text) {
    #
    # Shortcut function for hashPart with block-level boundaries.
    #
        return $this->hashPart($text, 'B');
    }


    var $block_gamut = array(
    #
    # These are all the transformations that form block-level
    # tags like paragraphs, headers, and list items.
    #
        "doHeaders"         => 10,
        "doHorizontalRules" => 20,

        "doLists"           => 40,
        "doCodeBlocks"      => 50,
        "doBlockQuotes"     => 60,
        );

    function runBlockGamut($text) {
    #
    # Run block gamut tranformations.
    #
        # We need to escape raw HTML in Markdown source before doing anything
        # else. This need to be done for each block, and not only at the
        # begining in the Markdown function since hashed blocks can be part of
        # list items and could have been indented. Indented blocks would have
        # been seen as a code block in a previous pass of hashHTMLBlocks.
        $text = $this->hashHTMLBlocks($text);

        return $this->runBasicBlockGamut($text);
    }

    function runBasicBlockGamut($text) {
    #
    # Run block gamut tranformations, without hashing HTML blocks. This is
    # useful when HTML blocks are known to be already hashed, like in the first
    # whole-document pass.
    #
        foreach ($this->block_gamut as $method => $priority) {
            $text = $this->$method($text);
        }

        # Finally form paragraph and restore hashed blocks.
        $text = $this->formParagraphs($text);

        return $text;
    }


    function doHorizontalRules($text) {
        # Do Horizontal Rules:
        return preg_replace(
            '{
                ^[ ]{0,3}   # Leading space
                ([-*_])     # $1: First marker
                (?>         # Repeated marker group
                    [ ]{0,2}    # Zero, one, or two spaces.
                    \1          # Marker character
                ){2,}       # Group repeated at least twice
                [ ]*        # Tailing spaces
                $           # End of line.
            }mx',
            "\n".$this->hashBlock("<hr$this->empty_element_suffix")."\n",
            $text);
    }


    var $span_gamut = array(
    #
    # These are all the transformations that occur *within* block-level
    # tags like paragraphs, headers, and list items.
    #
        # Process character escapes, code spans, and inline HTML
        # in one shot.
        "parseSpan"           => -30,

        # Process anchor and image tags. Images must come first,
        # because ![foo][f] looks like an anchor.
        "doImages"            =>  10,
        "doAnchors"           =>  20,

        # Make links out of things like `<http://example.com/>`
        # Must come after doAnchors, because you can use < and >
        # delimiters in inline links like [this](<url>).
        "doAutoLinks"         =>  30,
        "encodeAmpsAndAngles" =>  40,

        "doItalicsAndBold"    =>  50,
        "doHardBreaks"        =>  60,
        );

    function runSpanGamut($text) {
    #
    # Run span gamut tranformations.
    #
        foreach ($this->span_gamut as $method => $priority) {
            $text = $this->$method($text);
        }

        return $text;
    }


    function doHardBreaks($text) {
        # Do hard breaks:
        return preg_replace_callback('/ {2,}\n/',
            array(&$this, '_doHardBreaks_callback'), $text);
    }
    function _doHardBreaks_callback($matches) {
        return $this->hashPart("<br$this->empty_element_suffix\n");
    }


    function doAnchors($text) {
    #
    # Turn Markdown link shortcuts into XHTML <a> tags.
    #
        if ($this->in_anchor) return $text;
        $this->in_anchor = true;

        #
        # First, handle reference-style links: [link text] [id]
        #
        $text = preg_replace_callback('{
            (                   # wrap whole match in $1
              \[
                ('.$this->nested_brackets_re.') # link text = $2
              \]

              [ ]?              # one optional space
              (?:\n[ ]*)?       # one optional newline followed by spaces

              \[
                (.*?)       # id = $3
              \]
            )
            }xs',
            array(&$this, '_doAnchors_reference_callback'), $text);

        #
        # Next, inline-style links: [link text](url "optional title")
        #
        $text = preg_replace_callback('{
            (               # wrap whole match in $1
              \[
                ('.$this->nested_brackets_re.') # link text = $2
              \]
              \(            # literal paren
                [ ]*
                (?:
                    <(\S*)> # href = $3
                |
                    ('.$this->nested_url_parenthesis_re.')  # href = $4
                )
                [ ]*
                (           # $5
                  ([\'"])   # quote char = $6
                  (.*?)     # Title = $7
                  \6        # matching quote
                  [ ]*  # ignore any spaces/tabs between closing quote and )
                )?          # title is optional
              \)
            )
            }xs',
            array(&$this, '_DoAnchors_inline_callback'), $text);

        #
        # Last, handle reference-style shortcuts: [link text]
        # These must come last in case you've also got [link test][1]
        # or [link test](/foo)
        #
//      $text = preg_replace_callback('{
//          (                   # wrap whole match in $1
//            \[
//              ([^\[\]]+)      # link text = $2; can\'t contain [ or ]
//            \]
//          )
//          }xs',
//          array(&$this, '_doAnchors_reference_callback'), $text);

        $this->in_anchor = false;
        return $text;
    }
    function _doAnchors_reference_callback($matches) {
        $whole_match =  $matches[1];
        $link_text   =  $matches[2];
        $link_id     =& $matches[3];

        if ($link_id == "") {
            # for shortcut links like [this][] or [this].
            $link_id = $link_text;
        }

        # lower-case and turn embedded newlines into spaces
        $link_id = strtolower($link_id);
        $link_id = preg_replace('{[ ]?\n}', ' ', $link_id);

        if (isset($this->urls[$link_id])) {
            $url = $this->urls[$link_id];
            $url = $this->encodeAttribute($url);

            $result = "<a href=\"$url\"";
            if ( isset( $this->titles[$link_id] ) ) {
                $title = $this->titles[$link_id];
                $title = $this->encodeAttribute($title);
                $result .=  " title=\"$title\"";
            }

            $link_text = $this->runSpanGamut($link_text);
            $result .= ">$link_text</a>";
            $result = $this->hashPart($result);
        }
        else {
            $result = $whole_match;
        }
        return $result;
    }
    function _doAnchors_inline_callback($matches) {
        $whole_match    =  $matches[1];
        $link_text      =  $this->runSpanGamut($matches[2]);
        $url            =  $matches[3] == '' ? $matches[4] : $matches[3];
        $title          =& $matches[7];

        $url = $this->encodeAttribute($url);

        $result = "<a href=\"$url\"";
        if (isset($title)) {
            $title = $this->encodeAttribute($title);
            $result .=  " title=\"$title\"";
        }

        $link_text = $this->runSpanGamut($link_text);
        $result .= ">$link_text</a>";

        return $this->hashPart($result);
    }


    function doImages($text) {
    #
    # Turn Markdown image shortcuts into <img> tags.
    #
        #
        # First, handle reference-style labeled images: ![alt text][id]
        #
        $text = preg_replace_callback('{
            (               # wrap whole match in $1
              !\[
                ('.$this->nested_brackets_re.')     # alt text = $2
              \]

              [ ]?              # one optional space
              (?:\n[ ]*)?       # one optional newline followed by spaces

              \[
                (.*?)       # id = $3
              \]

            )
            }xs',
            array(&$this, '_doImages_reference_callback'), $text);

        #
        # Next, handle inline images:  ![alt text](url "optional title")
        # Don't forget: encode * and _
        #
        $text = preg_replace_callback('{
            (               # wrap whole match in $1
              !\[
                ('.$this->nested_brackets_re.')     # alt text = $2
              \]
              \s?           # One optional whitespace character
              \(            # literal paren
                [ ]*
                (?:
                    <(\S*)> # src url = $3
                |
                    ('.$this->nested_url_parenthesis_re.')  # src url = $4
                )
                [ ]*
                (           # $5
                  ([\'"])   # quote char = $6
                  (.*?)     # title = $7
                  \6        # matching quote
                  [ ]*
                )?          # title is optional
              \)
            )
            }xs',
            array(&$this, '_doImages_inline_callback'), $text);

        return $text;
    }
    function _doImages_reference_callback($matches) {
        $whole_match = $matches[1];
        $alt_text    = $matches[2];
        $link_id     = strtolower($matches[3]);

        if ($link_id == "") {
            $link_id = strtolower($alt_text); # for shortcut links like ![this][].
        }

        $alt_text = $this->encodeAttribute($alt_text);
        if (isset($this->urls[$link_id])) {
            $url = $this->encodeAttribute($this->urls[$link_id]);
            $result = "<img src=\"$url\" alt=\"$alt_text\"";
            if (isset($this->titles[$link_id])) {
                $title = $this->titles[$link_id];
                $title = $this->encodeAttribute($title);
                $result .=  " title=\"$title\"";
            }
            $result .= $this->empty_element_suffix;
            $result = $this->hashPart($result);
        }
        else {
            # If there's no such link ID, leave intact:
            $result = $whole_match;
        }

        return $result;
    }
    function _doImages_inline_callback($matches) {
        $whole_match    = $matches[1];
        $alt_text       = $matches[2];
        $url            = $matches[3] == '' ? $matches[4] : $matches[3];
        $title          =& $matches[7];

        $alt_text = $this->encodeAttribute($alt_text);
        $url = $this->encodeAttribute($url);
        $result = "<img src=\"$url\" alt=\"$alt_text\"";
        if (isset($title)) {
            $title = $this->encodeAttribute($title);
            $result .=  " title=\"$title\""; # $title already quoted
        }
        $result .= $this->empty_element_suffix;

        return $this->hashPart($result);
    }


    function doHeaders($text) {
        # Setext-style headers:
        #     Header 1
        #     ========
        #
        #     Header 2
        #     --------
        #
        $text = preg_replace_callback('{ ^(.+?)[ ]*\n(=+|-+)[ ]*\n+ }mx',
            array(&$this, '_doHeaders_callback_setext'), $text);

        # atx-style headers:
        #   # Header 1
        #   ## Header 2
        #   ## Header 2 with closing hashes ##
        #   ...
        #   ###### Header 6
        #
        $text = preg_replace_callback('{
                ^(\#{1,6})  # $1 = string of #\'s
                [ ]*
                (.+?)       # $2 = Header text
                [ ]*
                \#*         # optional closing #\'s (not counted)
                \n+
            }xm',
            array(&$this, '_doHeaders_callback_atx'), $text);

        return $text;
    }
    function _doHeaders_callback_setext($matches) {
        # Terrible hack to check we haven't found an empty list item.
        if ($matches[2] == '-' && preg_match('{^-(?: |$)}', $matches[1]))
            return $matches[0];

        $level = $matches[2]{0} == '=' ? 1 : 2;
        $block = "<h$level>".$this->runSpanGamut($matches[1])."</h$level>";
        return "\n" . $this->hashBlock($block) . "\n\n";
    }
    function _doHeaders_callback_atx($matches) {
        $level = strlen($matches[1]);
        $block = "<h$level>".$this->runSpanGamut($matches[2])."</h$level>";
        return "\n" . $this->hashBlock($block) . "\n\n";
    }


    function doLists($text) {
    #
    # Form HTML ordered (numbered) and unordered (bulleted) lists.
    #
        $less_than_tab = $this->tab_width - 1;

        # Re-usable patterns to match list item bullets and number markers:
        $marker_ul_re  = '[*+-]';
        $marker_ol_re  = '\d+[.]';
        $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)";

        $markers_relist = array($marker_ul_re, $marker_ol_re);

        foreach ($markers_relist as $marker_re) {
            # Re-usable pattern to match any entirel ul or ol list:
            $whole_list_re = '
                (                               # $1 = whole list
                  (                             # $2
                    [ ]{0,'.$less_than_tab.'}
                    ('.$marker_re.')            # $3 = first list item marker
                    [ ]+
                  )
                  (?s:.+?)
                  (                             # $4
                      \z
                    |
                      \n{2,}
                      (?=\S)
                      (?!                       # Negative lookahead for another list item marker
                        [ ]*
                        '.$marker_re.'[ ]+
                      )
                  )
                )
            '; // mx

            # We use a different prefix before nested lists than top-level lists.
            # See extended comment in _ProcessListItems().

            if ($this->list_level) {
                $text = preg_replace_callback('{
                        ^
                        '.$whole_list_re.'
                    }mx',
                    array(&$this, '_doLists_callback'), $text);
            }
            else {
                $text = preg_replace_callback('{
                        (?:(?<=\n)\n|\A\n?) # Must eat the newline
                        '.$whole_list_re.'
                    }mx',
                    array(&$this, '_doLists_callback'), $text);
            }
        }

        return $text;
    }
    function _doLists_callback($matches) {
        # Re-usable patterns to match list item bullets and number markers:
        $marker_ul_re  = '[*+-]';
        $marker_ol_re  = '\d+[.]';
        $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)";

        $list = $matches[1];
        $list_type = preg_match("/$marker_ul_re/", $matches[3]) ? "ul" : "ol";

        $marker_any_re = ( $list_type == "ul" ? $marker_ul_re : $marker_ol_re );

        $list .= "\n";
        $result = $this->processListItems($list, $marker_any_re);

        $result = $this->hashBlock("<$list_type>\n" . $result . "</$list_type>");
        return "\n". $result ."\n\n";
    }

    var $list_level = 0;

    function processListItems($list_str, $marker_any_re) {
    #
    #   Process the contents of a single ordered or unordered list, splitting it
    #   into individual list items.
    #
        # The $this->list_level global keeps track of when we're inside a list.
        # Each time we enter a list, we increment it; when we leave a list,
        # we decrement. If it's zero, we're not in a list anymore.
        #
        # We do this because when we're not inside a list, we want to treat
        # something like this:
        #
        #       I recommend upgrading to version
        #       8. Oops, now this line is treated
        #       as a sub-list.
        #
        # As a single paragraph, despite the fact that the second line starts
        # with a digit-period-space sequence.
        #
        # Whereas when we're inside a list (or sub-list), that line will be
        # treated as the start of a sub-list. What a kludge, huh? This is
        # an aspect of Markdown's syntax that's hard to parse perfectly
        # without resorting to mind-reading. Perhaps the solution is to
        # change the syntax rules such that sub-lists must start with a
        # starting cardinal number; e.g. "1." or "a.".

        $this->list_level++;

        # trim trailing blank lines:
        $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str);

        $list_str = preg_replace_callback('{
            (\n)?                           # leading line = $1
            (^[ ]*)                         # leading whitespace = $2
            ('.$marker_any_re.'             # list marker and space = $3
                (?:[ ]+|(?=\n)) # space only required if item is not empty
            )
            ((?s:.*?))                      # list item text   = $4
            (?:(\n+(?=\n))|\n)              # tailing blank line = $5
            (?= \n* (\z | \2 ('.$marker_any_re.') (?:[ ]+|(?=\n))))
            }xm',
            array(&$this, '_processListItems_callback'), $list_str);

        $this->list_level--;
        return $list_str;
    }
    function _processListItems_callback($matches) {
        $item = $matches[4];
        $leading_line =& $matches[1];
        $leading_space =& $matches[2];
        $marker_space = $matches[3];
        $tailing_blank_line =& $matches[5];

        if ($leading_line || $tailing_blank_line ||
            preg_match('/\n{2,}/', $item))
        {
            # Replace marker with the appropriate whitespace indentation
            $item = $leading_space . str_repeat(' ', strlen($marker_space)) . $item;
            $item = $this->runBlockGamut($this->outdent($item)."\n");
        }
        else {
            # Recursion for sub-lists:
            $item = $this->doLists($this->outdent($item));
            $item = preg_replace('/\n+$/', '', $item);
            $item = $this->runSpanGamut($item);
        }

        return "<li>" . $item . "</li>\n";
    }


    function doCodeBlocks($text) {
    #
    #   Process Markdown `<pre><code>` blocks.
    #
        $text = preg_replace_callback('{
                (?:\n\n|\A\n?)
                (               # $1 = the code block -- one or more lines, starting with a space/tab
                  (?>
                    [ ]{'.$this->tab_width.'}  # Lines must start with a tab or a tab-width of spaces
                    .*\n+
                  )+
                )
                ((?=^[ ]{0,'.$this->tab_width.'}\S)|\Z) # Lookahead for non-space at line-start, or end of doc
            }xm',
            array(&$this, '_doCodeBlocks_callback'), $text);

        return $text;
    }
    function _doCodeBlocks_callback($matches) {
        $codeblock = $matches[1];

        $codeblock = $this->outdent($codeblock);
        $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);

        # trim leading newlines and trailing newlines
        $codeblock = preg_replace('/\A\n+|\n+\z/', '', $codeblock);

        $codeblock = "<pre><code>$codeblock\n</code></pre>";
        return "\n\n".$this->hashBlock($codeblock)."\n\n";
    }


    function makeCodeSpan($code) {
    #
    # Create a code span markup for $code. Called from handleSpanToken.
    #
        $code = htmlspecialchars(trim($code), ENT_NOQUOTES);
        return $this->hashPart("<code>$code</code>");
    }


    var $em_relist = array(
        ''  => '(?:(?<!\*)\*(?!\*)|(?<!_)_(?!_))(?=\S)(?![.,:;]\s)',
        '*' => '(?<=\S)(?<!\*)\*(?!\*)',
        '_' => '(?<=\S)(?<!_)_(?!_)',
        );
    var $strong_relist = array(
        ''   => '(?:(?<!\*)\*\*(?!\*)|(?<!_)__(?!_))(?=\S)(?![.,:;]\s)',
        '**' => '(?<=\S)(?<!\*)\*\*(?!\*)',
        '__' => '(?<=\S)(?<!_)__(?!_)',
        );
    var $em_strong_relist = array(
        ''    => '(?:(?<!\*)\*\*\*(?!\*)|(?<!_)___(?!_))(?=\S)(?![.,:;]\s)',
        '***' => '(?<=\S)(?<!\*)\*\*\*(?!\*)',
        '___' => '(?<=\S)(?<!_)___(?!_)',
        );
    var $em_strong_prepared_relist;

    function prepareItalicsAndBold() {
    #
    # Prepare regular expressions for seraching emphasis tokens in any
    # context.
    #
        foreach ($this->em_relist as $em => $em_re) {
            foreach ($this->strong_relist as $strong => $strong_re) {
                # Construct list of allowed token expressions.
                $token_relist = array();
                if (isset($this->em_strong_relist["$em$strong"])) {
                    $token_relist[] = $this->em_strong_relist["$em$strong"];
                }
                $token_relist[] = $em_re;
                $token_relist[] = $strong_re;

                # Construct master expression from list.
                $token_re = '{('. implode('|', $token_relist) .')}';
                $this->em_strong_prepared_relist["$em$strong"] = $token_re;
            }
        }
    }

    function doItalicsAndBold($text) {
        $token_stack = array('');
        $text_stack = array('');
        $em = '';
        $strong = '';
        $tree_char_em = false;

        while (1) {
            #
            # Get prepared regular expression for seraching emphasis tokens
            # in current context.
            #
            $token_re = $this->em_strong_prepared_relist["$em$strong"];

            #
            # Each loop iteration seach for the next emphasis token.
            # Each token is then passed to handleSpanToken.
            #
            $parts = preg_split($token_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE);
            $text_stack[0] .= $parts[0];
            $token =& $parts[1];
            $text =& $parts[2];

            if (empty($token)) {
                # Reached end of text span: empty stack without emitting.
                # any more emphasis.
                while ($token_stack[0]) {
                    $text_stack[1] .= array_shift($token_stack);
                    $text_stack[0] .= array_shift($text_stack);
                }
                break;
            }

            $token_len = strlen($token);
            if ($tree_char_em) {
                # Reached closing marker while inside a three-char emphasis.
                if ($token_len == 3) {
                    # Three-char closing marker, close em and strong.
                    array_shift($token_stack);
                    $span = array_shift($text_stack);
                    $span = $this->runSpanGamut($span);
                    $span = "<strong><em>$span</em></strong>";
                    $text_stack[0] .= $this->hashPart($span);
                    $em = '';
                    $strong = '';
                } else {
                    # Other closing marker: close one em or strong and
                    # change current token state to match the other
                    $token_stack[0] = str_repeat($token{0}, 3-$token_len);
                    $tag = $token_len == 2 ? "strong" : "em";
                    $span = $text_stack[0];
                    $span = $this->runSpanGamut($span);
                    $span = "<$tag>$span</$tag>";
                    $text_stack[0] = $this->hashPart($span);
                    $$tag = ''; # $$tag stands for $em or $strong
                }
                $tree_char_em = false;
            } else if ($token_len == 3) {
                if ($em) {
                    # Reached closing marker for both em and strong.
                    # Closing strong marker:
                    for ($i = 0; $i < 2; ++$i) {
                        $shifted_token = array_shift($token_stack);
                        $tag = strlen($shifted_token) == 2 ? "strong" : "em";
                        $span = array_shift($text_stack);
                        $span = $this->runSpanGamut($span);
                        $span = "<$tag>$span</$tag>";
                        $text_stack[0] .= $this->hashPart($span);
                        $$tag = ''; # $$tag stands for $em or $strong
                    }
                } else {
                    # Reached opening three-char emphasis marker. Push on token
                    # stack; will be handled by the special condition above.
                    $em = $token{0};
                    $strong = "$em$em";
                    array_unshift($token_stack, $token);
                    array_unshift($text_stack, '');
                    $tree_char_em = true;
                }
            } else if ($token_len == 2) {
                if ($strong) {
                    # Unwind any dangling emphasis marker:
                    if (strlen($token_stack[0]) == 1) {
                        $text_stack[1] .= array_shift($token_stack);
                        $text_stack[0] .= array_shift($text_stack);
                    }
                    # Closing strong marker:
                    array_shift($token_stack);
                    $span = array_shift($text_stack);
                    $span = $this->runSpanGamut($span);
                    $span = "<strong>$span</strong>";
                    $text_stack[0] .= $this->hashPart($span);
                    $strong = '';
                } else {
                    array_unshift($token_stack, $token);
                    array_unshift($text_stack, '');
                    $strong = $token;
                }
            } else {
                # Here $token_len == 1
                if ($em) {
                    if (strlen($token_stack[0]) == 1) {
                        # Closing emphasis marker:
                        array_shift($token_stack);
                        $span = array_shift($text_stack);
                        $span = $this->runSpanGamut($span);
                        $span = "<em>$span</em>";
                        $text_stack[0] .= $this->hashPart($span);
                        $em = '';
                    } else {
                        $text_stack[0] .= $token;
                    }
                } else {
                    array_unshift($token_stack, $token);
                    array_unshift($text_stack, '');
                    $em = $token;
                }
            }
        }
        return $text_stack[0];
    }


    function doBlockQuotes($text) {
        $text = preg_replace_callback('/
              (                             # Wrap whole match in $1
                (?>
                  ^[ ]*>[ ]?            # ">" at the start of a line
                    .+\n                    # rest of the first line
                  (.+\n)*                   # subsequent consecutive lines
                  \n*                       # blanks
                )+
              )
            /xm',
            array(&$this, '_doBlockQuotes_callback'), $text);

        return $text;
    }
    function _doBlockQuotes_callback($matches) {
        $bq = $matches[1];
        # trim one level of quoting - trim whitespace-only lines
        $bq = preg_replace('/^[ ]*>[ ]?|^[ ]+$/m', '', $bq);
        $bq = $this->runBlockGamut($bq);        # recurse

        $bq = preg_replace('/^/m', "  ", $bq);
        # These leading spaces cause problem with <pre> content,
        # so we need to fix that:
        $bq = preg_replace_callback('{(\s*<pre>.+?</pre>)}sx',
            array(&$this, '_DoBlockQuotes_callback2'), $bq);

        return "\n". $this->hashBlock("<blockquote>\n$bq\n</blockquote>")."\n\n";
    }
    function _doBlockQuotes_callback2($matches) {
        $pre = $matches[1];
        $pre = preg_replace('/^  /m', '', $pre);
        return $pre;
    }


    function formParagraphs($text) {
    #
    #   Params:
    #       $text - string to process with html <p> tags
    #
        # Strip leading and trailing lines:
        $text = preg_replace('/\A\n+|\n+\z/', '', $text);

        $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY);

        #
        # Wrap <p> tags and unhashify HTML blocks
        #
        foreach ($grafs as $key => $value) {
            if (!preg_match('/^B\x1A[0-9]+B$/', $value)) {
                # Is a paragraph.
                $value = $this->runSpanGamut($value);
                $value = preg_replace('/^([ ]*)/', "<p>", $value);
                $value .= "</p>";
                $grafs[$key] = $this->unhash($value);
            }
            else {
                # Is a block.
                # Modify elements of @grafs in-place...
                $graf = $value;
                $block = $this->html_hashes[$graf];
                $graf = $block;
//              if (preg_match('{
//                  \A
//                  (                           # $1 = <div> tag
//                    <div  \s+
//                    [^>]*
//                    \b
//                    markdown\s*=\s*  ([\'"])  #   $2 = attr quote char
//                    1
//                    \2
//                    [^>]*
//                    >
//                  )
//                  (                           # $3 = contents
//                  .*
//                  )
//                  (</div>)                    # $4 = closing tag
//                  \z
//                  }xs', $block, $matches))
//              {
//                  list(, $div_open, , $div_content, $div_close) = $matches;
//
//                  # We can't call Markdown(), because that resets the hash;
//                  # that initialization code should be pulled into its own sub, though.
//                  $div_content = $this->hashHTMLBlocks($div_content);
//
//                  # Run document gamut methods on the content.
//                  foreach ($this->document_gamut as $method => $priority) {
//                      $div_content = $this->$method($div_content);
//                  }
//
//                  $div_open = preg_replace(
//                      '{\smarkdown\s*=\s*([\'"]).+?\1}', '', $div_open);
//
//                  $graf = $div_open . "\n" . $div_content . "\n" . $div_close;
//              }
                $grafs[$key] = $graf;
            }
        }

        return implode("\n\n", $grafs);
    }


    function encodeAttribute($text) {
    #
    # Encode text for a double-quoted HTML attribute. This function
    # is *not* suitable for attributes enclosed in single quotes.
    #
        $text = $this->encodeAmpsAndAngles($text);
        $text = str_replace('"', '&quot;', $text);
        return $text;
    }


    function encodeAmpsAndAngles($text) {
    #
    # Smart processing for ampersands and angle brackets that need to
    # be encoded. Valid character entities are left alone unless the
    # no-entities mode is set.
    #
        if ($this->no_entities) {
            $text = str_replace('&', '&amp;', $text);
        } else {
            # Ampersand-encoding based entirely on Nat Irons's Amputator
            # MT plugin: <http://bumppo.net/projects/amputator/>
            $text = preg_replace('/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/',
                                '&amp;', $text);;
        }
        # Encode remaining <'s
        $text = str_replace('<', '&lt;', $text);

        return $text;
    }


    function doAutoLinks($text) {
        $text = preg_replace_callback('{<((https?|ftp|dict):[^\'">\s]+)>}i',
            array(&$this, '_doAutoLinks_url_callback'), $text);

        # Email addresses: <address@domain.foo>
        $text = preg_replace_callback('{
            <
            (?:mailto:)?
            (
                [-.\w\x80-\xFF]+
                \@
                [-a-z0-9\x80-\xFF]+(\.[-a-z0-9\x80-\xFF]+)*\.[a-z]+
            )
            >
            }xi',
            array(&$this, '_doAutoLinks_email_callback'), $text);

        return $text;
    }
    function _doAutoLinks_url_callback($matches) {
        $url = $this->encodeAttribute($matches[1]);
        $link = "<a href=\"$url\">$url</a>";
        return $this->hashPart($link);
    }
    function _doAutoLinks_email_callback($matches) {
        $address = $matches[1];
        $link = $this->encodeEmailAddress($address);
        return $this->hashPart($link);
    }


    function encodeEmailAddress($addr) {
    #
    #   Input: an email address, e.g. "foo@example.com"
    #
    #   Output: the email address as a mailto link, with each character
    #       of the address encoded as either a decimal or hex entity, in
    #       the hopes of foiling most address harvesting spam bots. E.g.:
    #
    #     <p><a href="&#109;&#x61;&#105;&#x6c;&#116;&#x6f;&#58;&#x66;o&#111;
    #        &#x40;&#101;&#x78;&#97;&#x6d;&#112;&#x6c;&#101;&#46;&#x63;&#111;
    #        &#x6d;">&#x66;o&#111;&#x40;&#101;&#x78;&#97;&#x6d;&#112;&#x6c;
    #        &#101;&#46;&#x63;&#111;&#x6d;</a></p>
    #
    #   Based by a filter by Matthew Wickline, posted to BBEdit-Talk.
    #   With some optimizations by Milian Wolff.
    #
        $addr = "mailto:" . $addr;
        $chars = preg_split('/(?<!^)(?!$)/', $addr);
        $seed = (int)abs(crc32($addr) / strlen($addr)); # Deterministic seed.

        foreach ($chars as $key => $char) {
            $ord = ord($char);
            # Ignore non-ascii chars.
            if ($ord < 128) {
                $r = ($seed * (1 + $key)) % 100; # Pseudo-random function.
                # roughly 10% raw, 45% hex, 45% dec
                # '@' *must* be encoded. I insist.
                if ($r > 90 && $char != '@') /* do nothing */;
                else if ($r < 45) $chars[$key] = '&#x'.dechex($ord).';';
                else              $chars[$key] = '&#'.$ord.';';
            }
        }

        $addr = implode('', $chars);
        $text = implode('', array_slice($chars, 7)); # text without `mailto:`
        $addr = "<a href=\"$addr\">$text</a>";

        return $addr;
    }


    function parseSpan($str) {
    #
    # Take the string $str and parse it into tokens, hashing embeded HTML,
    # escaped characters and handling code spans.
    #
        $output = '';

        $span_re = '{
                (
                    \\\\'.$this->escape_chars_re.'
                |
                    (?<![`\\\\])
                    `+                      # code span marker
            '.( $this->no_markup ? '' : '
                |
                    <!--    .*?     -->     # comment
                |
                    <\?.*?\?> | <%.*?%>     # processing instruction
                |
                    <[/!$]?[-a-zA-Z0-9:]+   # regular tags
                    (?>
                        \s
                        (?>[^"\'>]+|"[^"]*"|\'[^\']*\')*
                    )?
                    >
            ').'
                )
                }xs';

        while (1) {
            #
            # Each loop iteration seach for either the next tag, the next
            # openning code span marker, or the next escaped character.
            # Each token is then passed to handleSpanToken.
            #
            $parts = preg_split($span_re, $str, 2, PREG_SPLIT_DELIM_CAPTURE);

            # Create token from text preceding tag.
            if ($parts[0] != "") {
                $output .= $parts[0];
            }

            # Check if we reach the end.
            if (isset($parts[1])) {
                $output .= $this->handleSpanToken($parts[1], $parts[2]);
                $str = $parts[2];
            }
            else {
                break;
            }
        }

        return $output;
    }


    function handleSpanToken($token, &$str) {
    #
    # Handle $token provided by parseSpan by determining its nature and
    # returning the corresponding value that should replace it.
    #
        switch ($token{0}) {
            case "\\":
                return $this->hashPart("&#". ord($token{1}). ";");
            case "`":
                # Search for end marker in remaining text.
                if (preg_match('/^(.*?[^`])'.preg_quote($token).'(?!`)(.*)$/sm',
                    $str, $matches))
                {
                    $str = $matches[2];
                    $codespan = $this->makeCodeSpan($matches[1]);
                    return $this->hashPart($codespan);
                }
                return $token; // return as text since no ending marker found.
            default:
                return $this->hashPart($token);
        }
    }


    function outdent($text) {
    #
    # Remove one level of line-leading tabs or spaces
    #
        return preg_replace('/^(\t|[ ]{1,'.$this->tab_width.'})/m', '', $text);
    }


    # String length function for detab. `_initDetab` will create a function to
    # hanlde UTF-8 if the default function does not exist.
    var $utf8_strlen = 'mb_strlen';

    function detab($text) {
    #
    # Replace tabs with the appropriate amount of space.
    #
        # For each line we separate the line in blocks delemited by
        # tab characters. Then we reconstruct every line by adding the
        # appropriate number of space between each blocks.

        $text = preg_replace_callback('/^.*\t.*$/m',
            array(&$this, '_detab_callback'), $text);

        return $text;
    }
    function _detab_callback($matches) {
        $line = $matches[0];
        $strlen = $this->utf8_strlen; # strlen function for UTF-8.

        # Split in blocks.
        $blocks = explode("\t", $line);
        # Add each blocks to the line.
        $line = $blocks[0];
        unset($blocks[0]); # Do not add first block twice.
        foreach ($blocks as $block) {
            # Calculate amount of space, insert spaces, insert block.
            $amount = $this->tab_width -
                $strlen($line, 'UTF-8') % $this->tab_width;
            $line .= str_repeat(" ", $amount) . $block;
        }
        return $line;
    }
    function _initDetab() {
    #
    # Check for the availability of the function in the `utf8_strlen` property
    # (initially `mb_strlen`). If the function is not available, create a
    # function that will loosely count the number of UTF-8 characters with a
    # regular expression.
    #
        if (function_exists($this->utf8_strlen)) return;
        $this->utf8_strlen = create_function('$text', 'return preg_match_all(
            "/[\\\\x00-\\\\xBF]|[\\\\xC0-\\\\xFF][\\\\x80-\\\\xBF]*/",
            $text, $m);');
    }


    function unhash($text) {
    #
    # Swap back in all the tags hashed by _HashHTMLBlocks.
    #
        return preg_replace_callback('/(.)\x1A[0-9]+\1/',
            array(&$this, '_unhash_callback'), $text);
    }
    function _unhash_callback($matches) {
        return $this->html_hashes[$matches[0]];
    }

}


#
# Markdown Extra Parser Class
#

class MarkdownExtra_Parser extends Markdown_Parser {

    # Prefix for footnote ids.
    var $fn_id_prefix = "";

    # Optional title attribute for footnote links and backlinks.
    var $fn_link_title = MARKDOWN_FN_LINK_TITLE;
    var $fn_backlink_title = MARKDOWN_FN_BACKLINK_TITLE;

    # Optional class attribute for footnote links and backlinks.
    var $fn_link_class = MARKDOWN_FN_LINK_CLASS;
    var $fn_backlink_class = MARKDOWN_FN_BACKLINK_CLASS;

    # Predefined abbreviations.
    var $predef_abbr = array();


    function MarkdownExtra_Parser() {
    #
    # Constructor function. Initialize the parser object.
    #
        # Add extra escapable characters before parent constructor
        # initialize the table.
        $this->escape_chars .= ':|';

        # Insert extra document, block, and span transformations.
        # Parent constructor will do the sorting.
        $this->document_gamut += array(
            "doFencedCodeBlocks" => 5,
            "stripFootnotes"     => 15,
            "stripAbbreviations" => 25,
            "appendFootnotes"    => 50,
            );
        $this->block_gamut += array(
            "doFencedCodeBlocks" => 5,
            "doTables"           => 15,
            "doDefLists"         => 45,
            );
        $this->span_gamut += array(
            "doFootnotes"        => 5,
            "doAbbreviations"    => 70,
            );

        parent::Markdown_Parser();
    }


    # Extra variables used during extra transformations.
    var $footnotes = array();
    var $footnotes_ordered = array();
    var $abbr_desciptions = array();
    var $abbr_word_re = '';

    # Give the current footnote number.
    var $footnote_counter = 1;


    function setup() {
    #
    # Setting up Extra-specific variables.
    #
        parent::setup();

        $this->footnotes = array();
        $this->footnotes_ordered = array();
        $this->abbr_desciptions = array();
        $this->abbr_word_re = '';
        $this->footnote_counter = 1;

        foreach ($this->predef_abbr as $abbr_word => $abbr_desc) {
            if ($this->abbr_word_re)
                $this->abbr_word_re .= '|';
            $this->abbr_word_re .= preg_quote($abbr_word);
            $this->abbr_desciptions[$abbr_word] = trim($abbr_desc);
        }
    }

    function teardown() {
    #
    # Clearing Extra-specific variables.
    #
        $this->footnotes = array();
        $this->footnotes_ordered = array();
        $this->abbr_desciptions = array();
        $this->abbr_word_re = '';

        parent::teardown();
    }


    ### HTML Block Parser ###

    # Tags that are always treated as block tags:
    var $block_tags_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|form|fieldset|iframe|hr|legend';

    # Tags treated as block tags only if the opening tag is alone on it's line:
    var $context_block_tags_re = 'script|noscript|math|ins|del';

    # Tags where markdown="1" default to span mode:
    var $contain_span_tags_re = 'p|h[1-6]|li|dd|dt|td|th|legend|address';

    # Tags which must not have their contents modified, no matter where
    # they appear:
    var $clean_tags_re = 'script|math';

    # Tags that do not need to be closed.
    var $auto_close_tags_re = 'hr|img';


    function hashHTMLBlocks($text) {
    #
    # Hashify HTML Blocks and "clean tags".
    #
    # We only want to do this for block-level HTML tags, such as headers,
    # lists, and tables. That's because we still want to wrap <p>s around
    # "paragraphs" that are wrapped in non-block-level tags, such as anchors,
    # phrase emphasis, and spans. The list of tags we're looking for is
    # hard-coded.
    #
    # This works by calling _HashHTMLBlocks_InMarkdown, which then calls
    # _HashHTMLBlocks_InHTML when it encounter block tags. When the markdown="1"
    # attribute is found whitin a tag, _HashHTMLBlocks_InHTML calls back
    #  _HashHTMLBlocks_InMarkdown to handle the Markdown syntax within the tag.
    # These two functions are calling each other. It's recursive!
    #
        #
        # Call the HTML-in-Markdown hasher.
        #
        list($text, ) = $this->_hashHTMLBlocks_inMarkdown($text);

        return $text;
    }
    function _hashHTMLBlocks_inMarkdown($text, $indent = 0,
                                        $enclosing_tag_re = '', $span = false)
    {
    #
    # Parse markdown text, calling _HashHTMLBlocks_InHTML for block tags.
    #
    # *   $indent is the number of space to be ignored when checking for code
    #     blocks. This is important because if we don't take the indent into
    #     account, something like this (which looks right) won't work as expected:
    #
    #     <div>
    #         <div markdown="1">
    #         Hello World.  <-- Is this a Markdown code block or text?
    #         </div>  <-- Is this a Markdown code block or a real tag?
    #     <div>
    #
    #     If you don't like this, just don't indent the tag on which
    #     you apply the markdown="1" attribute.
    #
    # *   If $enclosing_tag_re is not empty, stops at the first unmatched closing
    #     tag with that name. Nested tags supported.
    #
    # *   If $span is true, text inside must treated as span. So any double
    #     newline will be replaced by a single newline so that it does not create
    #     paragraphs.
    #
    # Returns an array of that form: ( processed text , remaining text )
    #
        if ($text === '') return array('', '');

        # Regex to check for the presense of newlines around a block tag.
        $newline_before_re = '/(?:^\n?|\n\n)*$/';
        $newline_after_re =
            '{
                ^                       # Start of text following the tag.
                (?>[ ]*<!--.*?-->)?     # Optional comment.
                [ ]*\n                  # Must be followed by newline.
            }xs';

        # Regex to match any tag.
        $block_tag_re =
            '{
                (                   # $2: Capture hole tag.
                    </?                 # Any opening or closing tag.
                        (?>             # Tag name.
                            '.$this->block_tags_re.'            |
                            '.$this->context_block_tags_re.'    |
                            '.$this->clean_tags_re.'            |
                            (?!\s)'.$enclosing_tag_re.'
                        )
                        (?:
                            (?=[\s"\'/a-zA-Z0-9])   # Allowed characters after tag name.
                            (?>
                                ".*?"       |   # Double quotes (can contain `>`)
                                \'.*?\'     |   # Single quotes (can contain `>`)
                                .+?             # Anything but quotes and `>`.
                            )*?
                        )?
                    >                   # End of tag.
                |
                    <!--    .*?     --> # HTML Comment
                |
                    <\?.*?\?> | <%.*?%> # Processing instruction
                |
                    <!\[CDATA\[.*?\]\]> # CData Block
                |
                    # Code span marker
                    `+
                '. ( !$span ? ' # If not in span.
                |
                    # Indented code block
                    (?> ^[ ]*\n? | \n[ ]*\n )
                    [ ]{'.($indent+4).'}[^\n]* \n
                    (?>
                        (?: [ ]{'.($indent+4).'}[^\n]* | [ ]* ) \n
                    )*
                |
                    # Fenced code block marker
                    (?> ^ | \n )
                    [ ]{'.($indent).'}~~~+[ ]*\n
                ' : '' ). ' # End (if not is span).
                )
            }xs';


        $depth = 0;     # Current depth inside the tag tree.
        $parsed = "";   # Parsed text that will be returned.

        #
        # Loop through every tag until we find the closing tag of the parent
        # or loop until reaching the end of text if no parent tag specified.
        #
        do {
            #
            # Split the text using the first $tag_match pattern found.
            # Text before  pattern will be first in the array, text after
            # pattern will be at the end, and between will be any catches made
            # by the pattern.
            #
            $parts = preg_split($block_tag_re, $text, 2,
                                PREG_SPLIT_DELIM_CAPTURE);

            # If in Markdown span mode, add a empty-string span-level hash
            # after each newline to prevent triggering any block element.
            if ($span) {
                $void = $this->hashPart("", ':');
                $newline = "$void\n";
                $parts[0] = $void . str_replace("\n", $newline, $parts[0]) . $void;
            }

            $parsed .= $parts[0]; # Text before current tag.

            # If end of $text has been reached. Stop loop.
            if (count($parts) < 3) {
                $text = "";
                break;
            }

            $tag  = $parts[1]; # Tag to handle.
            $text = $parts[2]; # Remaining text after current tag.
            $tag_re = preg_quote($tag); # For use in a regular expression.

            #
            # Check for: Code span marker
            #
            if ($tag{0} == "`") {
                # Find corresponding end marker.
                $tag_re = preg_quote($tag);
                if (preg_match('{^(?>.+?|\n(?!\n))*?(?<!`)'.$tag_re.'(?!`)}',
                    $text, $matches))
                {
                    # End marker found: pass text unchanged until marker.
                    $parsed .= $tag . $matches[0];
                    $text = substr($text, strlen($matches[0]));
                }
                else {
                    # Unmatched marker: just skip it.
                    $parsed .= $tag;
                }
            }
            #
            # Check for: Indented code block or fenced code block marker.
            #
            else if ($tag{0} == "\n" || $tag{0} == "~") {
                if ($tag{1} == "\n" || $tag{1} == " ") {
                    # Indented code block: pass it unchanged, will be handled
                    # later.
                    $parsed .= $tag;
                }
                else {
                    # Fenced code block marker: find matching end marker.
                    $tag_re = preg_quote(trim($tag));
                    if (preg_match('{^(?>.*\n)+?'.$tag_re.' *\n}', $text,
                        $matches))
                    {
                        # End marker found: pass text unchanged until marker.
                        $parsed .= $tag . $matches[0];
                        $text = substr($text, strlen($matches[0]));
                    }
                    else {
                        # No end marker: just skip it.
                        $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).
            #
            else if (preg_match('{^<(?:'.$this->block_tags_re.')\b}', $tag) ||
                (   preg_match('{^<(?:'.$this->context_block_tags_re.')\b}', $tag) &&
                    preg_match($newline_before_re, $parsed) &&
                    preg_match($newline_after_re, $text)    )
                )
            {
                # Need to parse tag and following text using the HTML parser.
                list($block_text, $text) =
                    $this->_hashHTMLBlocks_inHTML($tag . $text, "hashBlock", true);

                # Make sure it stays outside of any paragraph by adding newlines.
                $parsed .= "\n\n$block_text\n\n";
            }
            #
            # Check for: Clean tag (like script, math)
            #            HTML Comments, processing instructions.
            #
            else if (preg_match('{^<(?:'.$this->clean_tags_re.')\b}', $tag) ||
                $tag{1} == '!' || $tag{1} == '?')
            {
                # Need to parse tag and following text using the HTML parser.
                # (don't check for markdown attribute)
                list($block_text, $text) =
                    $this->_hashHTMLBlocks_inHTML($tag . $text, "hashClean", false);

                $parsed .= $block_text;
            }
            #
            # Check for: Tag with same name as enclosing tag.
            #
            else if ($enclosing_tag_re !== '' &&
                # Same name as enclosing tag.
                preg_match('{^</?(?:'.$enclosing_tag_re.')\b}', $tag))
            {
                #
                # Increase/decrease nested tag count.
                #
                if ($tag{1} == '/')                     $depth--;
                else if ($tag{strlen($tag)-2} != '/')   $depth++;

                if ($depth < 0) {
                    #
                    # Going out of parent element. Clean up and break so we
                    # return to the calling function.
                    #
                    $text = $tag . $text;
                    break;
                }

                $parsed .= $tag;
            }
            else {
                $parsed .= $tag;
            }
        } while ($depth >= 0);

        return array($parsed, $text);
    }
    function _hashHTMLBlocks_inHTML($text, $hash_method, $md_attr) {
    #
    # Parse HTML, calling _HashHTMLBlocks_InMarkdown for block tags.
    #
    # *   Calls $hash_method to convert any blocks.
    # *   Stops when the first opening tag closes.
    # *   $md_attr indicate if the use of the `markdown="1"` attribute is allowed.
    #     (it is not inside clean tags)
    #
    # Returns an array of that form: ( processed text , remaining text )
    #
        if ($text === '') return array('', '');

        # Regex to match `markdown` attribute inside of a tag.
        $markdown_attr_re = '
            {
                \s*         # Eat whitespace before the `markdown` attribute
                markdown
                \s*=\s*
                (?>
                    (["\'])     # $1: quote delimiter
                    (.*?)       # $2: attribute value
                    \1          # matching delimiter
                |
                    ([^\s>]*)   # $3: unquoted attribute value
                )
                ()              # $4: make $3 always defined (avoid warnings)
            }xs';

        # Regex to match any tag.
        $tag_re = '{
                (                   # $2: Capture hole tag.
                    </?                 # Any opening or closing tag.
                        [\w:$]+         # Tag name.
                        (?:
                            (?=[\s"\'/a-zA-Z0-9])   # Allowed characters after tag name.
                            (?>
                                ".*?"       |   # Double quotes (can contain `>`)
                                \'.*?\'     |   # Single quotes (can contain `>`)
                                .+?             # Anything but quotes and `>`.
                            )*?
                        )?
                    >                   # End of tag.
                |
                    <!--    .*?     --> # HTML Comment
                |
                    <\?.*?\?> | <%.*?%> # Processing instruction
                |
                    <!\[CDATA\[.*?\]\]> # CData Block
                )
            }xs';

        $original_text = $text;     # Save original text in case of faliure.

        $depth      = 0;    # Current depth inside the tag tree.
        $block_text = "";   # Temporary text holder for current text.
        $parsed     = "";   # Parsed text that will be returned.

        #
        # Get the name of the starting tag.
        # (This pattern makes $base_tag_name_re safe without quoting.)
        #
        if (preg_match('/^<([\w:$]*)\b/', $text, $matches))
            $base_tag_name_re = $matches[1];

        #
        # Loop through every tag until we find the corresponding closing tag.
        #
        do {
            #
            # Split the text using the first $tag_match pattern found.
            # Text before  pattern will be first in the array, text after
            # pattern will be at the end, and between will be any catches made
            # by the pattern.
            #
            $parts = preg_split($tag_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE);

            if (count($parts) < 3) {
                #
                # End of $text reached with unbalenced tag(s).
                # In that case, we return original text unchanged and pass the
                # first character as filtered to prevent an infinite loop in the
                # parent function.
                #
                return array($original_text{0}, substr($original_text, 1));
            }

            $block_text .= $parts[0]; # Text before current tag.
            $tag         = $parts[1]; # Tag to handle.
            $text        = $parts[2]; # Remaining text after current tag.

            #
            # Check for: Auto-close tag (like <hr/>)
            #            Comments and Processing Instructions.
            #
            if (preg_match('{^</?(?:'.$this->auto_close_tags_re.')\b}', $tag) ||
                $tag{1} == '!' || $tag{1} == '?')
            {
                # Just add the tag to the block as if it was text.
                $block_text .= $tag;
            }
            else {
                #
                # Increase/decrease nested tag count. Only do so if
                # the tag's name match base tag's.
                #
                if (preg_match('{^</?'.$base_tag_name_re.'\b}', $tag)) {
                    if ($tag{1} == '/')                     $depth--;
                    else if ($tag{strlen($tag)-2} != '/')   $depth++;
                }

                #
                # Check for `markdown="1"` attribute and handle it.
                #
                if ($md_attr &&
                    preg_match($markdown_attr_re, $tag, $attr_m) &&
                    preg_match('/^1|block|span$/', $attr_m[2] . $attr_m[3]))
                {
                    # Remove `markdown` attribute from opening tag.
                    $tag = preg_replace($markdown_attr_re, '', $tag);

                    # Check if text inside this tag must be parsed in span mode.
                    $this->mode = $attr_m[2] . $attr_m[3];
                    $span_mode = $this->mode == 'span' || $this->mode != 'block' &&
                        preg_match('{^<(?:'.$this->contain_span_tags_re.')\b}', $tag);

                    # Calculate indent before tag.
                    if (preg_match('/(?:^|\n)( *?)(?! ).*?$/', $block_text, $matches)) {
                        $strlen = $this->utf8_strlen;
                        $indent = $strlen($matches[1], 'UTF-8');
                    } else {
                        $indent = 0;
                    }

                    # End preceding block with this tag.
                    $block_text .= $tag;
                    $parsed .= $this->$hash_method($block_text);

                    # Get enclosing tag name for the ParseMarkdown function.
                    # (This pattern makes $tag_name_re safe without quoting.)
                    preg_match('/^<([\w:$]*)\b/', $tag, $matches);
                    $tag_name_re = $matches[1];

                    # Parse the content using the HTML-in-Markdown parser.
                    list ($block_text, $text)
                        = $this->_hashHTMLBlocks_inMarkdown($text, $indent,
                            $tag_name_re, $span_mode);

                    # Outdent markdown text.
                    if ($indent > 0) {
                        $block_text = preg_replace("/^[ ]{1,$indent}/m", "",
                                                    $block_text);
                    }

                    # Append tag content to parsed text.
                    if (!$span_mode)    $parsed .= "\n\n$block_text\n\n";
                    else                $parsed .= "$block_text";

                    # Start over a new block.
                    $block_text = "";
                }
                else $block_text .= $tag;
            }

        } while ($depth > 0);

        #
        # Hash last block text that wasn't processed inside the loop.
        #
        $parsed .= $this->$hash_method($block_text);

        return array($parsed, $text);
    }


    function hashClean($text) {
    #
    # Called whenever a tag must be hashed when a function insert a "clean" tag
    # in $text, it pass through this function and is automaticaly escaped,
    # blocking invalid nested overlap.
    #
        return $this->hashPart($text, 'C');
    }


    function doHeaders($text) {
    #
    # Redefined to add id attribute support.
    #
        # Setext-style headers:
        #     Header 1  {#header1}
        #     ========
        #
        #     Header 2  {#header2}
        #     --------
        #
        $text = preg_replace_callback(
            '{
                (^.+?)                              # $1: Header text
                (?:[ ]+\{\#([-_:a-zA-Z0-9]+)\})?    # $2: Id attribute
                [ ]*\n(=+|-+)[ ]*\n+                # $3: Header footer
            }mx',
            array(&$this, '_doHeaders_callback_setext'), $text);

        # atx-style headers:
        #   # Header 1        {#header1}
        #   ## Header 2       {#header2}
        #   ## Header 2 with closing hashes ##  {#header3}
        #   ...
        #   ###### Header 6   {#header2}
        #
        $text = preg_replace_callback('{
                ^(\#{1,6})  # $1 = string of #\'s
                [ ]*
                (.+?)       # $2 = Header text
                [ ]*
                \#*         # optional closing #\'s (not counted)
                (?:[ ]+\{\#([-_:a-zA-Z0-9]+)\})? # id attribute
                [ ]*
                \n+
            }xm',
            array(&$this, '_doHeaders_callback_atx'), $text);

        return $text;
    }
    function _doHeaders_attr($attr) {
        if (empty($attr))  return "";
        return " id=\"$attr\"";
    }
    function _doHeaders_callback_setext($matches) {
        if ($matches[3] == '-' && preg_match('{^- }', $matches[1]))
            return $matches[0];
        $level = $matches[3]{0} == '=' ? 1 : 2;
        $attr  = $this->_doHeaders_attr($id =& $matches[2]);
        $block = "<h$level$attr>".$this->runSpanGamut($matches[1])."</h$level>";
        return "\n" . $this->hashBlock($block) . "\n\n";
    }
    function _doHeaders_callback_atx($matches) {
        $level = strlen($matches[1]);
        $attr  = $this->_doHeaders_attr($id =& $matches[3]);
        $block = "<h$level$attr>".$this->runSpanGamut($matches[2])."</h$level>";
        return "\n" . $this->hashBlock($block) . "\n\n";
    }


    function doTables($text) {
    #
    # Form HTML tables.
    #
        $less_than_tab = $this->tab_width - 1;
        #
        # Find tables with leading pipe.
        #
        #   | Header 1 | Header 2
        #   | -------- | --------
        #   | Cell 1   | Cell 2
        #   | Cell 3   | Cell 4
        #
        $text = preg_replace_callback('
            {
                ^                           # Start of a line
                [ ]{0,'.$less_than_tab.'}   # Allowed whitespace.
                [|]                         # Optional leading pipe (present)
                (.+) \n                     # $1: Header row (at least one pipe)

                [ ]{0,'.$less_than_tab.'}   # Allowed whitespace.
                [|] ([ ]*[-:]+[-| :]*) \n   # $2: Header underline

                (                           # $3: Cells
                    (?>
                        [ ]*                # Allowed whitespace.
                        [|] .* \n           # Row content.
                    )*
                )
                (?=\n|\Z)                   # Stop at final double newline.
            }xm',
            array(&$this, '_doTable_leadingPipe_callback'), $text);

        #
        # Find tables without leading pipe.
        #
        #   Header 1 | Header 2
        #   -------- | --------
        #   Cell 1   | Cell 2
        #   Cell 3   | Cell 4
        #
        $text = preg_replace_callback('
            {
                ^                           # Start of a line
                [ ]{0,'.$less_than_tab.'}   # Allowed whitespace.
                (\S.*[|].*) \n              # $1: Header row (at least one pipe)

                [ ]{0,'.$less_than_tab.'}   # Allowed whitespace.
                ([-:]+[ ]*[|][-| :]*) \n    # $2: Header underline

                (                           # $3: Cells
                    (?>
                        .* [|] .* \n        # Row content
                    )*
                )
                (?=\n|\Z)                   # Stop at final double newline.
            }xm',
            array(&$this, '_DoTable_callback'), $text);

        return $text;
    }
    function _doTable_leadingPipe_callback($matches) {
        $head       = $matches[1];
        $underline  = $matches[2];
        $content    = $matches[3];

        # Remove leading pipe for each row.
        $content    = preg_replace('/^ *[|]/m', '', $content);

        return $this->_doTable_callback(array($matches[0], $head, $underline, $content));
    }
    function _doTable_callback($matches) {
        $head       = $matches[1];
        $underline  = $matches[2];
        $content    = $matches[3];

        # Remove any tailing pipes for each line.
        $head       = preg_replace('/[|] *$/m', '', $head);
        $underline  = preg_replace('/[|] *$/m', '', $underline);
        $content    = preg_replace('/[|] *$/m', '', $content);

        # Reading alignement from header underline.
        $separators = preg_split('/ *[|] */', $underline);
        foreach ($separators as $n => $s) {
            if (preg_match('/^ *-+: *$/', $s))      $attr[$n] = ' align="right"';
            else if (preg_match('/^ *:-+: *$/', $s))$attr[$n] = ' align="center"';
            else if (preg_match('/^ *:-+ *$/', $s)) $attr[$n] = ' align="left"';
            else                                    $attr[$n] = '';
        }

        # Parsing span elements, including code spans, character escapes,
        # and inline HTML tags, so that pipes inside those gets ignored.
        $head       = $this->parseSpan($head);
        $headers    = preg_split('/ *[|] */', $head);
        $col_count  = count($headers);

        # Write column headers.
        $text = "<table>\n";
        $text .= "<thead>\n";
        $text .= "<tr>\n";
        foreach ($headers as $n => $header)
            $text .= "  <th$attr[$n]>".$this->runSpanGamut(trim($header))."</th>\n";
        $text .= "</tr>\n";
        $text .= "</thead>\n";

        # Split content by row.
        $rows = explode("\n", trim($content, "\n"));

        $text .= "<tbody>\n";
        foreach ($rows as $row) {
            # Parsing span elements, including code spans, character escapes,
            # and inline HTML tags, so that pipes inside those gets ignored.
            $row = $this->parseSpan($row);

            # Split row by cell.
            $row_cells = preg_split('/ *[|] */', $row, $col_count);
            $row_cells = array_pad($row_cells, $col_count, '');

            $text .= "<tr>\n";
            foreach ($row_cells as $n => $cell)
                $text .= "  <td$attr[$n]>".$this->runSpanGamut(trim($cell))."</td>\n";
            $text .= "</tr>\n";
        }
        $text .= "</tbody>\n";
        $text .= "</table>";

        return $this->hashBlock($text) . "\n";
    }


    function doDefLists($text) {
    #
    # Form HTML definition lists.
    #
        $less_than_tab = $this->tab_width - 1;

        # Re-usable pattern to match any entire dl list:
        $whole_list_re = '(?>
            (                               # $1 = whole list
              (                             # $2
                [ ]{0,'.$less_than_tab.'}
                ((?>.*\S.*\n)+)             # $3 = defined term
                \n?
                [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition
              )
              (?s:.+?)
              (                             # $4
                  \z
                |
                  \n{2,}
                  (?=\S)
                  (?!                       # Negative lookahead for another term
                    [ ]{0,'.$less_than_tab.'}
                    (?: \S.*\n )+?          # defined term
                    \n?
                    [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition
                  )
                  (?!                       # Negative lookahead for another definition
                    [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition
                  )
              )
            )
        )'; // mx

        $text = preg_replace_callback('{
                (?>\A\n?|(?<=\n\n))
                '.$whole_list_re.'
            }mx',
            array(&$this, '_doDefLists_callback'), $text);

        return $text;
    }
    function _doDefLists_callback($matches) {
        # Re-usable patterns to match list item bullets and number markers:
        $list = $matches[1];

        # Turn double returns into triple returns, so that we can make a
        # paragraph for the last item in a list, if necessary:
        $result = trim($this->processDefListItems($list));
        $result = "<dl>\n" . $result . "\n</dl>";
        return $this->hashBlock($result) . "\n\n";
    }


    function processDefListItems($list_str) {
    #
    #   Process the contents of a single definition list, splitting it
    #   into individual term and definition list items.
    #
        $less_than_tab = $this->tab_width - 1;

        # trim trailing blank lines:
        $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str);

        # Process definition terms.
        $list_str = preg_replace_callback('{
            (?>\A\n?|\n\n+)                 # leading line
            (                               # definition terms = $1
                [ ]{0,'.$less_than_tab.'}   # leading whitespace
                (?![:][ ]|[ ])              # negative lookahead for a definition
                                            #   mark (colon) or more whitespace.
                (?> \S.* \n)+?              # actual term (not whitespace).
            )
            (?=\n?[ ]{0,3}:[ ])             # lookahead for following line feed
                                            #   with a definition mark.
            }xm',
            array(&$this, '_processDefListItems_callback_dt'), $list_str);

        # Process actual definitions.
        $list_str = preg_replace_callback('{
            \n(\n+)?                        # leading line = $1
            (                               # marker space = $2
                [ ]{0,'.$less_than_tab.'}   # whitespace before colon
                [:][ ]+                     # definition mark (colon)
            )
            ((?s:.+?))                      # definition text = $3
            (?= \n+                         # stop at next definition mark,
                (?:                         # next term or end of text
                    [ ]{0,'.$less_than_tab.'} [:][ ]    |
                    <dt> | \z
                )
            )
            }xm',
            array(&$this, '_processDefListItems_callback_dd'), $list_str);

        return $list_str;
    }
    function _processDefListItems_callback_dt($matches) {
        $terms = explode("\n", trim($matches[1]));
        $text = '';
        foreach ($terms as $term) {
            $term = $this->runSpanGamut(trim($term));
            $text .= "\n<dt>" . $term . "</dt>";
        }
        return $text . "\n";
    }
    function _processDefListItems_callback_dd($matches) {
        $leading_line   = $matches[1];
        $marker_space   = $matches[2];
        $def            = $matches[3];

        if ($leading_line || preg_match('/\n{2,}/', $def)) {
            # Replace marker with the appropriate whitespace indentation
            $def = str_repeat(' ', strlen($marker_space)) . $def;
            $def = $this->runBlockGamut($this->outdent($def . "\n\n"));
            $def = "\n". $def ."\n";
        }
        else {
            $def = rtrim($def);
            $def = $this->runSpanGamut($this->outdent($def));
        }

        return "\n<dd>" . $def . "</dd>\n";
    }


    function doFencedCodeBlocks($text) {
    #
    # Adding the fenced code block syntax to regular Markdown:
    #
    # ~~~
    # Code block
    # ~~~
    #
        $less_than_tab = $this->tab_width;

        $text = preg_replace_callback('{
                (?:\n|\A)
                # 1: Opening marker
                (
                    ~{3,} # Marker: three tilde or more.
                )
                [ ]* \n # Whitespace and newline following marker.

                # 2: Content
                (
                    (?>
                        (?!\1 [ ]* \n)  # Not a closing marker.
                        .*\n+
                    )+
                )

                # Closing marker.
                \1 [ ]* \n
            }xm',
            array(&$this, '_doFencedCodeBlocks_callback'), $text);

        return $text;
    }
    function _doFencedCodeBlocks_callback($matches) {
        $codeblock = $matches[2];
        $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);
        $codeblock = preg_replace_callback('/^\n+/',
            array(&$this, '_doFencedCodeBlocks_newlines'), $codeblock);
        $codeblock = "<pre><code>$codeblock</code></pre>";
        return "\n\n".$this->hashBlock($codeblock)."\n\n";
    }
    function _doFencedCodeBlocks_newlines($matches) {
        return str_repeat("<br$this->empty_element_suffix",
            strlen($matches[0]));
    }


    #
    # Redefining emphasis markers so that emphasis by underscore does not
    # work in the middle of a word.
    #
    var $em_relist = array(
        ''  => '(?:(?<!\*)\*(?!\*)|(?<![a-zA-Z0-9_])_(?!_))(?=\S)(?![.,:;]\s)',
        '*' => '(?<=\S)(?<!\*)\*(?!\*)',
        '_' => '(?<=\S)(?<!_)_(?![a-zA-Z0-9_])',
        );
    var $strong_relist = array(
        ''   => '(?:(?<!\*)\*\*(?!\*)|(?<![a-zA-Z0-9_])__(?!_))(?=\S)(?![.,:;]\s)',
        '**' => '(?<=\S)(?<!\*)\*\*(?!\*)',
        '__' => '(?<=\S)(?<!_)__(?![a-zA-Z0-9_])',
        );
    var $em_strong_relist = array(
        ''    => '(?:(?<!\*)\*\*\*(?!\*)|(?<![a-zA-Z0-9_])___(?!_))(?=\S)(?![.,:;]\s)',
        '***' => '(?<=\S)(?<!\*)\*\*\*(?!\*)',
        '___' => '(?<=\S)(?<!_)___(?![a-zA-Z0-9_])',
        );


    function formParagraphs($text) {
    #
    #   Params:
    #       $text - string to process with html <p> tags
    #
        # Strip leading and trailing lines:
        $text = preg_replace('/\A\n+|\n+\z/', '', $text);

        $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY);

        #
        # Wrap <p> tags and unhashify HTML blocks
        #
        foreach ($grafs as $key => $value) {
            $value = trim($this->runSpanGamut($value));

            # Check if this should be enclosed in a paragraph.
            # Clean tag hashes & block tag hashes are left alone.
            $is_p = !preg_match('/^B\x1A[0-9]+B|^C\x1A[0-9]+C$/', $value);

            if ($is_p) {
                $value = "<p>$value</p>";
            }
            $grafs[$key] = $value;
        }

        # Join grafs in one text, then unhash HTML tags.
        $text = implode("\n\n", $grafs);

        # Finish by removing any tag hashes still present in $text.
        $text = $this->unhash($text);

        return $text;
    }


    ### Footnotes

    function stripFootnotes($text) {
    #
    # Strips link definitions from text, stores the URLs and titles in
    # hash references.
    #
        $less_than_tab = $this->tab_width - 1;

        # Link defs are in the form: [^id]: url "optional title"
        $text = preg_replace_callback('{
            ^[ ]{0,'.$less_than_tab.'}\[\^(.+?)\][ ]?:  # note_id = $1
              [ ]*
              \n?                   # maybe *one* newline
            (                       # text = $2 (no blank lines allowed)
                (?:
                    .+              # actual text
                |
                    \n              # newlines but
                    (?!\[\^.+?\]:\s)# negative lookahead for footnote marker.
                    (?!\n+[ ]{0,3}\S)# ensure line is not blank and followed
                                    # by non-indented content
                )*
            )
            }xm',
            array(&$this, '_stripFootnotes_callback'),
            $text);
        return $text;
    }
    function _stripFootnotes_callback($matches) {
        $note_id = $this->fn_id_prefix . $matches[1];
        $this->footnotes[$note_id] = $this->outdent($matches[2]);
        return ''; # String that will replace the block
    }


    function doFootnotes($text) {
    #
    # Replace footnote references in $text [^id] with a special text-token
    # which will be replaced by the actual footnote marker in appendFootnotes.
    #
        if (!$this->in_anchor) {
            $text = preg_replace('{\[\^(.+?)\]}', "F\x1Afn:\\1\x1A:", $text);
        }
        return $text;
    }


    function appendFootnotes($text) {
    #
    # Append footnote list to text.
    #
        $text = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}',
            array(&$this, '_appendFootnotes_callback'), $text);

        if (!empty($this->footnotes_ordered)) {
            $text .= "\n\n";
            $text .= "<div class=\"footnotes\">\n";
            $text .= "<hr". MARKDOWN_EMPTY_ELEMENT_SUFFIX ."\n";
            $text .= "<ol>\n\n";

            $attr = " rev=\"footnote\"";
            if ($this->fn_backlink_class != "") {
                $class = $this->fn_backlink_class;
                $class = $this->encodeAttribute($class);
                $attr .= " class=\"$class\"";
            }
            if ($this->fn_backlink_title != "") {
                $title = $this->fn_backlink_title;
                $title = $this->encodeAttribute($title);
                $attr .= " title=\"$title\"";
            }
            $num = 0;

            while (!empty($this->footnotes_ordered)) {
                $footnote = reset($this->footnotes_ordered);
                $note_id = key($this->footnotes_ordered);
                unset($this->footnotes_ordered[$note_id]);

                $footnote .= "\n"; # Need to append newline before parsing.
                $footnote = $this->runBlockGamut("$footnote\n");
                $footnote = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}',
                    array(&$this, '_appendFootnotes_callback'), $footnote);

                $attr = str_replace("%%", ++$num, $attr);
                $note_id = $this->encodeAttribute($note_id);

                # Add backlink to last paragraph; create new paragraph if needed.
                $backlink = "<a href=\"#fnref:$note_id\"$attr>&#8617;</a>";
                if (preg_match('{</p>$}', $footnote)) {
                    $footnote = substr($footnote, 0, -4) . "&#160;$backlink</p>";
                } else {
                    $footnote .= "\n\n<p>$backlink</p>";
                }

                $text .= "<li id=\"fn:$note_id\">\n";
                $text .= $footnote . "\n";
                $text .= "</li>\n\n";
            }

            $text .= "</ol>\n";
            $text .= "</div>";
        }
        return $text;
    }
    function _appendFootnotes_callback($matches) {
        $node_id = $this->fn_id_prefix . $matches[1];

        # Create footnote marker only if it has a corresponding footnote *and*
        # the footnote hasn't been used by another marker.
        if (isset($this->footnotes[$node_id])) {
            # Transfert footnote content to the ordered list.
            $this->footnotes_ordered[$node_id] = $this->footnotes[$node_id];
            unset($this->footnotes[$node_id]);

            $num = $this->footnote_counter++;
            $attr = " rel=\"footnote\"";
            if ($this->fn_link_class != "") {
                $class = $this->fn_link_class;
                $class = $this->encodeAttribute($class);
                $attr .= " class=\"$class\"";
            }
            if ($this->fn_link_title != "") {
                $title = $this->fn_link_title;
                $title = $this->encodeAttribute($title);
                $attr .= " title=\"$title\"";
            }

            $attr = str_replace("%%", $num, $attr);
            $node_id = $this->encodeAttribute($node_id);

            return
                "<sup id=\"fnref:$node_id\">".
                "<a href=\"#fn:$node_id\"$attr>$num</a>".
                "</sup>";
        }

        return "[^".$matches[1]."]";
    }


    ### Abbreviations ###

    function stripAbbreviations($text) {
    #
    # Strips abbreviations from text, stores titles in hash references.
    #
        $less_than_tab = $this->tab_width - 1;

        # Link defs are in the form: [id]*: url "optional title"
        $text = preg_replace_callback('{
            ^[ ]{0,'.$less_than_tab.'}\*\[(.+?)\][ ]?:  # abbr_id = $1
            (.*)                    # text = $2 (no blank lines allowed)
            }xm',
            array(&$this, '_stripAbbreviations_callback'),
            $text);
        return $text;
    }
    function _stripAbbreviations_callback($matches) {
        $abbr_word = $matches[1];
        $abbr_desc = $matches[2];
        if ($this->abbr_word_re)
            $this->abbr_word_re .= '|';
        $this->abbr_word_re .= preg_quote($abbr_word);
        $this->abbr_desciptions[$abbr_word] = trim($abbr_desc);
        return ''; # String that will replace the block
    }


    function doAbbreviations($text) {
    #
    # Find defined abbreviations in text and wrap them in <abbr> elements.
    #
        if ($this->abbr_word_re) {
            // cannot use the /x modifier because abbr_word_re may
            // contain significant spaces:
            $text = preg_replace_callback('{'.
                '(?<![\w\x1A])'.
                '(?:'.$this->abbr_word_re.')'.
                '(?![\w\x1A])'.
                '}',
                array(&$this, '_doAbbreviations_callback'), $text);
        }
        return $text;
    }
    function _doAbbreviations_callback($matches) {
        $abbr = $matches[0];
        if (isset($this->abbr_desciptions[$abbr])) {
            $desc = $this->abbr_desciptions[$abbr];
            if (empty($desc)) {
                return $this->hashPart("<abbr>$abbr</abbr>");
            } else {
                $desc = $this->encodeAttribute($desc);
                return $this->hashPart("<abbr title=\"$desc\">$abbr</abbr>");
            }
        } else {
            return $matches[0];
        }
    }

}


/*

PHP Markdown Extra
==================

Description
-----------

This is a PHP port of the original Markdown formatter written in Perl
by John Gruber. This special "Extra" version of PHP Markdown features
further enhancements to the syntax for making additional constructs
such as tables and definition list.

Markdown is a text-to-HTML filter; it translates an easy-to-read /
easy-to-write structured text format into HTML. Markdown's text format
is most similar to that of plain text email, and supports features such
as headers, *emphasis*, code blocks, blockquotes, and links.

Markdown's syntax is designed not as a generic markup language, but
specifically to serve as a front-end to (X)HTML. You can use span-level
HTML tags anywhere in a Markdown document, and you can use block level
HTML tags (like <div> and <table> as well).

For more information about Markdown's syntax, see:

<http://daringfireball.net/projects/markdown/>


Bugs
----

To file bug reports please send email to:

<michel.fortin@michelf.com>

Please include with your report: (1) the example input; (2) the output you
expected; (3) the output Markdown actually produced.


Version History
---------------

See the readme file for detailed release notes for this version.


Copyright and License
---------------------

PHP Markdown & Extra
Copyright (c) 2004-2008 Michel Fortin
<http://www.michelf.com/>
All rights reserved.

Based on Markdown
Copyright (c) 2003-2006 John Gruber
<http://daringfireball.net/>
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

*   Redistributions of source code must retain the above copyright notice,
    this list of conditions and the following disclaimer.

*   Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.

*   Neither the name "Markdown" nor the names of its contributors may
    be used to endorse or promote products derived from this software
    without specific prior written permission.

This software is provided by the copyright holders and contributors "as
is" and any express or implied warranties, including, but not limited
to, the implied warranties of merchantability and fitness for a
particular purpose are disclaimed. In no event shall the copyright owner
or contributors be liable for any direct, indirect, incidental, special,
exemplary, or consequential damages (including, but not limited to,
procurement of substitute goods or services; loss of use, data, or
profits; or business interruption) however caused and on any theory of
liability, whether in contract, strict liability, or tort (including
negligence or otherwise) arising in any way out of the use of this
software, even if advised of the possibility of such damage.

*/
?>