WordPress.org

Plugin Directory

Changeset 660963


Ignore:
Timestamp:
01/29/13 23:06:58 (15 months ago)
Author:
markjaquith
Message:

deploy from git

Location:
markdown-on-save/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • markdown-on-save/trunk/markdown-extra/markdown-extra.php

    r294044 r660963  
    33# Markdown Extra  -  A text-to-HTML conversion tool for web writers 
    44# 
    5 # PHP Markdown & Extra 
    6 # Copyright (c) 2004-2009 Michel Fortin   
    7 # <http://michelf.com/projects/php-markdown/> 
     5# PHP Markdown & Extra   
     6# Copyright (c) 2004-2013 Michel Fortin   
     7# <http://michelf.ca/projects/php-markdown/> 
    88# 
    9 # Original Markdown 
     9# Original Markdown   
    1010# Copyright (c) 2004-2006 John Gruber   
    1111# <http://daringfireball.net/projects/markdown/> 
     
    1313 
    1414 
    15 define( 'MARKDOWN_VERSION',  "1.0.1n" ); # Sat 10 Oct 2009 
    16 define( 'MARKDOWNEXTRA_VERSION',  "1.2.4" ); # Sat 10 Oct 2009 
     15define( 'MARKDOWN_VERSION',  "1.0.1p" ); # Sun 13 Jan 2013 
     16define( 'MARKDOWNEXTRA_VERSION',  "1.2.6" ); # Sun 13 Jan 2013 
    1717 
    1818 
     
    3434@define( 'MARKDOWN_FN_LINK_CLASS',         "" ); 
    3535@define( 'MARKDOWN_FN_BACKLINK_CLASS',     "" ); 
     36 
     37# Optional class prefix for fenced code block. 
     38@define( 'MARKDOWN_CODE_CLASS_PREFIX',     "" ); 
     39 
     40# Class attribute for code blocks goes on the `code` tag; 
     41# setting this to true will put attributes on the `pre` tag instead. 
     42@define( 'MARKDOWN_CODE_ATTR_ON_PRE',   false ); 
    3643 
    3744 
     
    6572} 
    6673 
     74 
     75### WordPress Plugin Interface ### 
     76 
     77/* 
     78Plugin Name: Markdown Extra 
     79Plugin Name: Markdown 
     80Plugin URI: http://michelf.ca/projects/php-markdown/ 
     81Description: <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://michelf.ca/projects/php-markdown/">More...</a> 
     82Version: 1.2.6 
     83Author: Michel Fortin 
     84Author URI: http://michelf.ca/ 
     85*/ 
     86 
     87if (isset($wp_version)) { 
     88    # More details about how it works here: 
     89    # <http://michelf.ca/weblog/2005/wordpress-text-flow-vs-markdown/> 
     90     
     91    # Post content and excerpts 
     92    # - Remove WordPress paragraph generator. 
     93    # - Run Markdown on excerpt, then remove all tags. 
     94    # - Add paragraph tag around the excerpt, but remove it for the excerpt rss. 
     95    if (MARKDOWN_WP_POSTS) { 
     96        remove_filter('the_content',     'wpautop'); 
     97        remove_filter('the_content_rss', 'wpautop'); 
     98        remove_filter('the_excerpt',     'wpautop'); 
     99        add_filter('the_content',     'mdwp_MarkdownPost', 6); 
     100        add_filter('the_content_rss', 'mdwp_MarkdownPost', 6); 
     101        add_filter('get_the_excerpt', 'mdwp_MarkdownPost', 6); 
     102        add_filter('get_the_excerpt', 'trim', 7); 
     103        add_filter('the_excerpt',     'mdwp_add_p'); 
     104        add_filter('the_excerpt_rss', 'mdwp_strip_p'); 
     105         
     106        remove_filter('content_save_pre',  'balanceTags', 50); 
     107        remove_filter('excerpt_save_pre',  'balanceTags', 50); 
     108        add_filter('the_content',     'balanceTags', 50); 
     109        add_filter('get_the_excerpt', 'balanceTags', 9); 
     110    } 
     111     
     112    # Add a footnote id prefix to posts when inside a loop. 
     113    function mdwp_MarkdownPost($text) { 
     114        static $parser; 
     115        if (!$parser) { 
     116            $parser_class = MARKDOWN_PARSER_CLASS; 
     117            $parser = new $parser_class; 
     118        } 
     119        if (is_single() || is_page() || is_feed()) { 
     120            $parser->fn_id_prefix = ""; 
     121        } else { 
     122            $parser->fn_id_prefix = get_the_ID() . "."; 
     123        } 
     124        return $parser->transform($text); 
     125    } 
     126     
     127    # Comments 
     128    # - Remove WordPress paragraph generator. 
     129    # - Remove WordPress auto-link generator. 
     130    # - Scramble important tags before passing them to the kses filter. 
     131    # - Run Markdown on excerpt then remove paragraph tags. 
     132    if (MARKDOWN_WP_COMMENTS) { 
     133        remove_filter('comment_text', 'wpautop', 30); 
     134        remove_filter('comment_text', 'make_clickable'); 
     135        add_filter('pre_comment_content', 'Markdown', 6); 
     136        add_filter('pre_comment_content', 'mdwp_hide_tags', 8); 
     137        add_filter('pre_comment_content', 'mdwp_show_tags', 12); 
     138        add_filter('get_comment_text',    'Markdown', 6); 
     139        add_filter('get_comment_excerpt', 'Markdown', 6); 
     140        add_filter('get_comment_excerpt', 'mdwp_strip_p', 7); 
     141     
     142        global $mdwp_hidden_tags, $mdwp_placeholders; 
     143        $mdwp_hidden_tags = explode(' ', 
     144            '<p> </p> <pre> </pre> <ol> </ol> <ul> </ul> <li> </li>'); 
     145        $mdwp_placeholders = explode(' ', str_rot13( 
     146            'pEj07ZbbBZ U1kqgh4w4p pre2zmeN6K QTi31t9pre ol0MP1jzJR '. 
     147            'ML5IjmbRol ulANi1NsGY J7zRLJqPul liA8ctl16T K9nhooUHli')); 
     148    } 
     149     
     150    function mdwp_add_p($text) { 
     151        if (!preg_match('{^$|^<(p|ul|ol|dl|pre|blockquote)>}i', $text)) { 
     152            $text = '<p>'.$text.'</p>'; 
     153            $text = preg_replace('{\n{2,}}', "</p>\n\n<p>", $text); 
     154        } 
     155        return $text; 
     156    } 
     157     
     158    function mdwp_strip_p($t) { return preg_replace('{</?p>}i', '', $t); } 
     159 
     160    function mdwp_hide_tags($text) { 
     161        global $mdwp_hidden_tags, $mdwp_placeholders; 
     162        return str_replace($mdwp_hidden_tags, $mdwp_placeholders, $text); 
     163    } 
     164    function mdwp_show_tags($text) { 
     165        global $mdwp_hidden_tags, $mdwp_placeholders; 
     166        return str_replace($mdwp_placeholders, $mdwp_hidden_tags, $text); 
     167    } 
     168} 
     169 
     170 
    67171### bBlog Plugin Info ### 
    68172 
     
    76180        'licence' => 'GPL', 
    77181        'version' => MARKDOWNEXTRA_VERSION, 
    78         '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://michelf.com/projects/php-markdown/">More...</a>', 
     182        '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://michelf.ca/projects/php-markdown/">More...</a>', 
    79183        ); 
    80184} 
     
    119223class Markdown_Parser { 
    120224 
     225    ### Configuration Variables ### 
     226 
     227    # Change to ">" for HTML output. 
     228    var $empty_element_suffix = MARKDOWN_EMPTY_ELEMENT_SUFFIX; 
     229    var $tab_width = MARKDOWN_TAB_WIDTH; 
     230     
     231    # Change to `true` to disallow markup or entities. 
     232    var $no_markup = false; 
     233    var $no_entities = false; 
     234     
     235    # Predefined urls and titles for reference links and images. 
     236    var $predef_urls = array(); 
     237    var $predef_titles = array(); 
     238 
     239 
     240    ### Parser Implementation ### 
     241 
    121242    # Regex to match balanced [brackets]. 
    122243    # Needed to insert a maximum bracked depth while converting to PHP. 
     
    130251    var $escape_chars = '\`*_{}[]()>#+-.!'; 
    131252    var $escape_chars_re; 
    132  
    133     # Change to ">" for HTML output. 
    134     var $empty_element_suffix = MARKDOWN_EMPTY_ELEMENT_SUFFIX; 
    135     var $tab_width = MARKDOWN_TAB_WIDTH; 
    136      
    137     # Change to `true` to disallow markup or entities. 
    138     var $no_markup = false; 
    139     var $no_entities = false; 
    140      
    141     # Predefined urls and titles for reference links and images. 
    142     var $predef_urls = array(); 
    143     var $predef_titles = array(); 
    144253 
    145254 
     
    311420        $block_tags_a_re = 'ins|del'; 
    312421        $block_tags_b_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|'. 
    313                            'script|noscript|form|fieldset|iframe|math'; 
     422                           'script|noscript|form|fieldset|iframe|math|svg|'. 
     423                           'article|section|nav|aside|hgroup|header|footer|'. 
     424                           'figure'; 
    314425 
    315426        # Regular expression for the content of a block tag. 
     
    855966        # Re-usable patterns to match list item bullets and number markers: 
    856967        $marker_ul_re  = '[*+-]'; 
    857         $marker_ol_re  = '\d+[.]'; 
     968        $marker_ol_re  = '\d+[\.]'; 
    858969        $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)"; 
    859970 
     
    9161027        # Re-usable patterns to match list item bullets and number markers: 
    9171028        $marker_ul_re  = '[*+-]'; 
    918         $marker_ol_re  = '\d+[.]'; 
     1029        $marker_ol_re  = '\d+[\.]'; 
    9191030        $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)"; 
    9201031         
     
    10461157 
    10471158    var $em_relist = array( 
    1048         ''  => '(?:(?<!\*)\*(?!\*)|(?<!_)_(?!_))(?=\S|$)(?![.,:;]\s)', 
     1159        ''  => '(?:(?<!\*)\*(?!\*)|(?<!_)_(?!_))(?=\S|$)(?![\.,:;]\s)', 
    10491160        '*' => '(?<=\S|^)(?<!\*)\*(?!\*)', 
    10501161        '_' => '(?<=\S|^)(?<!_)_(?!_)', 
    10511162        ); 
    10521163    var $strong_relist = array( 
    1053         ''   => '(?:(?<!\*)\*\*(?!\*)|(?<!_)__(?!_))(?=\S|$)(?![.,:;]\s)', 
     1164        ''   => '(?:(?<!\*)\*\*(?!\*)|(?<!_)__(?!_))(?=\S|$)(?![\.,:;]\s)', 
    10541165        '**' => '(?<=\S|^)(?<!\*)\*\*(?!\*)', 
    10551166        '__' => '(?<=\S|^)(?<!_)__(?!_)', 
    10561167        ); 
    10571168    var $em_strong_relist = array( 
    1058         ''    => '(?:(?<!\*)\*\*\*(?!\*)|(?<!_)___(?!_))(?=\S|$)(?![.,:;]\s)', 
     1169        ''    => '(?:(?<!\*)\*\*\*(?!\*)|(?<!_)___(?!_))(?=\S|$)(?![\.,:;]\s)', 
    10591170        '***' => '(?<=\S|^)(?<!\*)\*\*\*(?!\*)', 
    10601171        '___' => '(?<=\S|^)(?<!_)___(?!_)', 
     
    14441555                    <\?.*?\?> | <%.*?%>     # processing instruction 
    14451556                | 
    1446                     <[/!$]?[-a-zA-Z0-9:_]+  # regular tags 
     1557                    <[!$]?[-a-zA-Z0-9:_]+   # regular tags 
    14471558                    (?> 
    14481559                        \s 
     
    14501561                    )? 
    14511562                    > 
     1563                | 
     1564                    <[-a-zA-Z0-9:_]+\s*/> # xml-style empty tag 
     1565                | 
     1566                    </[-a-zA-Z0-9:_]+\s*> # closing tag 
    14521567            ').' 
    14531568                ) 
     
    15811696class MarkdownExtra_Parser extends Markdown_Parser { 
    15821697 
     1698    ### Configuration Variables ### 
     1699 
    15831700    # Prefix for footnote ids. 
    15841701    var $fn_id_prefix = ""; 
     
    15911708    var $fn_link_class = MARKDOWN_FN_LINK_CLASS; 
    15921709    var $fn_backlink_class = MARKDOWN_FN_BACKLINK_CLASS; 
     1710 
     1711    # Optional class prefix for fenced code block. 
     1712    var $code_class_prefix = MARKDOWN_CODE_CLASS_PREFIX; 
     1713    # Class attribute for code blocks goes on the `code` tag; 
     1714    # setting this to true will put attributes on the `pre` tag instead. 
     1715    var $code_attr_on_pre = MARKDOWN_CODE_ATTR_ON_PRE; 
    15931716     
    15941717    # Predefined abbreviations. 
    15951718    var $predef_abbr = array(); 
    15961719 
     1720 
     1721    ### Parser Implementation ### 
    15971722 
    15981723    function MarkdownExtra_Parser() { 
     
    16291754    var $footnotes = array(); 
    16301755    var $footnotes_ordered = array(); 
     1756    var $footnotes_ref_count = array(); 
     1757    var $footnotes_numbers = array(); 
    16311758    var $abbr_desciptions = array(); 
    16321759    var $abbr_word_re = ''; 
     
    16441771        $this->footnotes = array(); 
    16451772        $this->footnotes_ordered = array(); 
     1773        $this->footnotes_ref_count = array(); 
     1774        $this->footnotes_numbers = array(); 
    16461775        $this->abbr_desciptions = array(); 
    16471776        $this->abbr_word_re = ''; 
     
    16621791        $this->footnotes = array(); 
    16631792        $this->footnotes_ordered = array(); 
     1793        $this->footnotes_ref_count = array(); 
     1794        $this->footnotes_numbers = array(); 
    16641795        $this->abbr_desciptions = array(); 
    16651796        $this->abbr_word_re = ''; 
     
    16691800     
    16701801     
     1802    ### Extra Attribute Parser ### 
     1803 
     1804    # Expression to use to catch attributes (includes the braces) 
     1805    var $id_class_attr_catch_re = '\{((?:[ ]*[#.][-_:a-zA-Z0-9]+){1,})[ ]*\}'; 
     1806    # Expression to use when parsing in a context when no capture is desired 
     1807    var $id_class_attr_nocatch_re = '\{(?:[ ]*[#.][-_:a-zA-Z0-9]+){1,}[ ]*\}'; 
     1808 
     1809    function doExtraAttributes($tag_name, $attr) { 
     1810    # 
     1811    # Parse attributes caught by the $this->id_class_attr_catch_re expression 
     1812    # and return the HTML-formatted list of attributes. 
     1813    # 
     1814    # Currently supported attributes are .class and #id. 
     1815    # 
     1816        if (empty($attr)) return ""; 
     1817         
     1818        # Split on components 
     1819        preg_match_all("/[.#][-_:a-zA-Z0-9]+/", $attr, $matches); 
     1820        $elements = $matches[0]; 
     1821 
     1822        # handle classes and ids (only first id taken into account) 
     1823        $classes = array(); 
     1824        $id = false; 
     1825        foreach ($elements as $element) { 
     1826            if ($element{0} == '.') { 
     1827                $classes[] = substr($element, 1); 
     1828            } else if ($element{0} == '#') { 
     1829                if ($id === false) $id = substr($element, 1); 
     1830            } 
     1831        } 
     1832 
     1833        # compose attributes as string 
     1834        $attr_str = ""; 
     1835        if (!empty($id)) { 
     1836            $attr_str .= ' id="'.$id.'"'; 
     1837        } 
     1838        if (!empty($classes)) { 
     1839            $attr_str .= ' class="'.implode(" ", $classes).'"'; 
     1840        } 
     1841        return $attr_str; 
     1842    } 
     1843 
     1844 
    16711845    ### HTML Block Parser ### 
    16721846     
    16731847    # Tags that are always treated as block tags: 
    1674     var $block_tags_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|form|fieldset|iframe|hr|legend'; 
    1675      
    1676     # Tags treated as block tags only if the opening tag is alone on it's line: 
    1677     var $context_block_tags_re = 'script|noscript|math|ins|del'; 
     1848    var $block_tags_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|form|fieldset|iframe|hr|legend|article|section|nav|aside|hgroup|header|footer|figcaption'; 
     1849                            
     1850    # Tags treated as block tags only if the opening tag is alone on its line: 
     1851    var $context_block_tags_re = 'script|noscript|ins|del|iframe|object|source|track|param|math|svg|canvas|audio|video'; 
    16781852     
    16791853    # Tags where markdown="1" default to span mode: 
     
    16821856    # Tags which must not have their contents modified, no matter where  
    16831857    # they appear: 
    1684     var $clean_tags_re = 'script|math'; 
     1858    var $clean_tags_re = 'script|math|svg'; 
    16851859     
    16861860    # Tags that do not need to be closed. 
    1687     var $auto_close_tags_re = 'hr|img'; 
     1861    var $auto_close_tags_re = 'hr|img|param|source|track'; 
    16881862     
    16891863 
     
    17001874    # This works by calling _HashHTMLBlocks_InMarkdown, which then calls 
    17011875    # _HashHTMLBlocks_InHTML when it encounter block tags. When the markdown="1"  
    1702     # attribute is found whitin a tag, _HashHTMLBlocks_InHTML calls back 
     1876    # attribute is found within a tag, _HashHTMLBlocks_InHTML calls back 
    17031877    #  _HashHTMLBlocks_InMarkdown to handle the Markdown syntax within the tag. 
    17041878    # These two functions are calling each other. It's recursive! 
    17051879    # 
     1880        if ($this->no_markup)  return $text; 
     1881 
    17061882        # 
    17071883        # Call the HTML-in-Markdown hasher. 
     
    17531929        $block_tag_re = 
    17541930            '{ 
    1755                 (                   # $2: Capture hole tag. 
     1931                (                   # $2: Capture whole tag. 
    17561932                    </?                 # Any opening or closing tag. 
    17571933                        (?>             # Tag name. 
     
    17891965                | 
    17901966                    # Fenced code block marker 
    1791                     (?> ^ | \n ) 
    1792                     [ ]{'.($indent).'}~~~+[ ]*\n 
     1967                    (?<= ^ | \n ) 
     1968                    [ ]{0,'.($indent+3).'}~{3,} 
     1969                                    [ ]* 
     1970                    (?: 
     1971                        [.]?[-_:a-zA-Z0-9]+ # standalone class name 
     1972                    | 
     1973                        '.$this->id_class_attr_nocatch_re.' # extra attributes 
     1974                    )? 
     1975                    [ ]* 
     1976                    \n 
    17931977                ' : '' ). ' # End (if not is span). 
    17941978                ) 
     
    18522036            } 
    18532037            # 
    1854             # Check for: Indented code block. 
    1855             # 
    1856             else if ($tag{0} == "\n" || $tag{0} == " ") { 
    1857                 # Indented code block: pass it unchanged, will be handled  
    1858                 # later. 
    1859                 $parsed .= $tag; 
    1860             } 
    1861             # 
    18622038            # Check for: Fenced code block marker. 
    18632039            # 
    1864             else if ($tag{0} == "~") { 
     2040            else if (preg_match('{^\n?([ ]{0,'.($indent+3).'})(~+)}', $tag, $capture)) { 
    18652041                # Fenced code block marker: find matching end marker. 
    1866                 $tag_re = preg_quote(trim($tag)); 
    1867                 if (preg_match('{^(?>.*\n)+?'.$tag_re.' *\n}', $text,  
     2042                $fence_indent = strlen($capture[1]); # use captured indent in re 
     2043                $fence_re = $capture[2]; # use captured fence in re 
     2044                if (preg_match('{^(?>.*\n)*?[ ]{'.($fence_indent).'}'.$fence_re.'[ ]*(?:\n|$)}', $text, 
    18682045                    $matches))  
    18692046                { 
     
    18762053                    $parsed .= $tag; 
    18772054                } 
     2055            } 
     2056            # 
     2057            # Check for: Indented code block. 
     2058            # 
     2059            else if ($tag{0} == "\n" || $tag{0} == " ") { 
     2060                # Indented code block: pass it unchanged, will be handled  
     2061                # later. 
     2062                $parsed .= $tag; 
    18782063            } 
    18792064            # 
     
    19712156        # Regex to match any tag. 
    19722157        $tag_re = '{ 
    1973                 (                   # $2: Capture hole tag. 
     2158                (                   # $2: Capture whole tag. 
    19742159                    </?                 # Any opening or closing tag. 
    19752160                        [\w:$]+         # Tag name. 
     
    20982283                    else                $parsed .= "$block_text"; 
    20992284                     
    2100                     # Start over a new block. 
     2285                    # Start over with a new block. 
    21012286                    $block_text = ""; 
    21022287                } 
     
    21172302    function hashClean($text) { 
    21182303    # 
    2119     # Called whenever a tag must be hashed when a function insert a "clean" tag 
    2120     # in $text, it pass through this function and is automaticaly escaped,  
     2304    # Called whenever a tag must be hashed when a function inserts a "clean" tag 
     2305    # in $text, it passes through this function and is automaticaly escaped,  
    21212306    # blocking invalid nested overlap. 
    21222307    # 
     
    21272312    function doHeaders($text) { 
    21282313    # 
    2129     # Redefined to add id attribute support. 
     2314    # Redefined to add id and class attribute support. 
    21302315    # 
    21312316        # Setext-style headers: 
     
    21332318        #     ======== 
    21342319        #   
    2135         #     Header 2  {#header2} 
     2320        #     Header 2  {#header2 .class1 .class2} 
    21362321        #     -------- 
    21372322        # 
     
    21392324            '{ 
    21402325                (^.+?)                              # $1: Header text 
    2141                 (?:[ ]+\{\#([-_:a-zA-Z0-9]+)\})?    # $2: Id attribute 
     2326                (?:[ ]+ '.$this->id_class_attr_catch_re.' )?     # $3 = id/class attributes 
    21422327                [ ]*\n(=+|-+)[ ]*\n+                # $3: Header footer 
    21432328            }mx', 
     
    21472332        #   # Header 1        {#header1} 
    21482333        #   ## Header 2       {#header2} 
    2149         #   ## Header 2 with closing hashes ##  {#header3} 
     2334        #   ## Header 2 with closing hashes ##  {#header3.class1.class2} 
    21502335        #   ... 
    2151         #   ###### Header 6   {#header2} 
     2336        #   ###### Header 6   {.class2} 
    21522337        # 
    21532338        $text = preg_replace_callback('{ 
     
    21572342                [ ]* 
    21582343                \#*         # optional closing #\'s (not counted) 
    2159                 (?:[ ]+\{\#([-_:a-zA-Z0-9]+)\})? # id attribute 
     2344                (?:[ ]+ '.$this->id_class_attr_catch_re.' )?     # $3 = id/class attributes 
    21602345                [ ]* 
    21612346                \n+ 
     
    21652350        return $text; 
    21662351    } 
    2167     function _doHeaders_attr($attr) { 
    2168         if (empty($attr))  return ""; 
    2169         return " id=\"$attr\""; 
    2170     } 
    21712352    function _doHeaders_callback_setext($matches) { 
    21722353        if ($matches[3] == '-' && preg_match('{^- }', $matches[1])) 
    21732354            return $matches[0]; 
    21742355        $level = $matches[3]{0} == '=' ? 1 : 2; 
    2175         $attr  = $this->_doHeaders_attr($id =& $matches[2]); 
     2356        $attr  = $this->doExtraAttributes("h$level", $dummy =& $matches[2]); 
    21762357        $block = "<h$level$attr>".$this->runSpanGamut($matches[1])."</h$level>"; 
    21772358        return "\n" . $this->hashBlock($block) . "\n\n"; 
     
    21792360    function _doHeaders_callback_atx($matches) { 
    21802361        $level = strlen($matches[1]); 
    2181         $attr  = $this->_doHeaders_attr($id =& $matches[3]); 
     2362        $attr  = $this->doExtraAttributes("h$level", $dummy =& $matches[3]); 
    21822363        $block = "<h$level$attr>".$this->runSpanGamut($matches[2])."</h$level>"; 
    21832364        return "\n" . $this->hashBlock($block) . "\n\n"; 
     
    24572638                    ~{3,} # Marker: three tilde or more. 
    24582639                ) 
     2640                [ ]* 
     2641                (?: 
     2642                    [.]?([-_:a-zA-Z0-9]+) # 2: standalone class name 
     2643                | 
     2644                    '.$this->id_class_attr_catch_re.' # 3: Extra attributes 
     2645                )? 
    24592646                [ ]* \n # Whitespace and newline following marker. 
    24602647                 
    2461                 # 2: Content 
     2648                # 4: Content 
    24622649                ( 
    24632650                    (?> 
     
    24752662    } 
    24762663    function _doFencedCodeBlocks_callback($matches) { 
    2477         $codeblock = $matches[2]; 
     2664        $classname =& $matches[2]; 
     2665        $attrs     =& $matches[3]; 
     2666        $codeblock = $matches[4]; 
    24782667        $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES); 
    24792668        $codeblock = preg_replace_callback('/^\n+/', 
    24802669            array(&$this, '_doFencedCodeBlocks_newlines'), $codeblock); 
    2481         $codeblock = "<pre><code>$codeblock</code></pre>"; 
     2670 
     2671        if ($classname != "") { 
     2672            if ($classname{0} == '.') 
     2673                $classname = substr($classname, 1); 
     2674            $attr_str = ' class="'.$this->code_class_prefix.$classname.'"'; 
     2675        } else { 
     2676            $attr_str = $this->doExtraAttributes($this->code_attr_on_pre ? "pre" : "code", $attrs); 
     2677        } 
     2678        $pre_attr_str  = $this->code_attr_on_pre ? $attr_str : ''; 
     2679        $code_attr_str = $this->code_attr_on_pre ? '' : $attr_str; 
     2680        $codeblock  = "<pre$pre_attr_str><code$code_attr_str>$codeblock</code></pre>"; 
     2681         
    24822682        return "\n\n".$this->hashBlock($codeblock)."\n\n"; 
    24832683    } 
     
    24932693    # 
    24942694    var $em_relist = array( 
    2495         ''  => '(?:(?<!\*)\*(?!\*)|(?<![a-zA-Z0-9_])_(?!_))(?=\S|$)(?![.,:;]\s)', 
     2695        ''  => '(?:(?<!\*)\*(?!\*)|(?<![a-zA-Z0-9_])_(?!_))(?=\S|$)(?![\.,:;]\s)', 
    24962696        '*' => '(?<=\S|^)(?<!\*)\*(?!\*)', 
    24972697        '_' => '(?<=\S|^)(?<!_)_(?![a-zA-Z0-9_])', 
    24982698        ); 
    24992699    var $strong_relist = array( 
    2500         ''   => '(?:(?<!\*)\*\*(?!\*)|(?<![a-zA-Z0-9_])__(?!_))(?=\S|$)(?![.,:;]\s)', 
     2700        ''   => '(?:(?<!\*)\*\*(?!\*)|(?<![a-zA-Z0-9_])__(?!_))(?=\S|$)(?![\.,:;]\s)', 
    25012701        '**' => '(?<=\S|^)(?<!\*)\*\*(?!\*)', 
    25022702        '__' => '(?<=\S|^)(?<!_)__(?![a-zA-Z0-9_])', 
    25032703        ); 
    25042704    var $em_strong_relist = array( 
    2505         ''    => '(?:(?<!\*)\*\*\*(?!\*)|(?<![a-zA-Z0-9_])___(?!_))(?=\S|$)(?![.,:;]\s)', 
     2705        ''    => '(?:(?<!\*)\*\*\*(?!\*)|(?<![a-zA-Z0-9_])___(?!_))(?=\S|$)(?![\.,:;]\s)', 
    25062706        '***' => '(?<=\S|^)(?<!\*)\*\*\*(?!\*)', 
    25072707        '___' => '(?<=\S|^)(?<!_)___(?![a-zA-Z0-9_])', 
     
    26232823                $note_id = key($this->footnotes_ordered); 
    26242824                unset($this->footnotes_ordered[$note_id]); 
     2825                $ref_count = $this->footnotes_ref_count[$note_id]; 
     2826                unset($this->footnotes_ref_count[$note_id]); 
     2827                unset($this->footnotes[$note_id]); 
    26252828                 
    26262829                $footnote .= "\n"; # Need to append newline before parsing. 
     
    26312834                $attr = str_replace("%%", ++$num, $attr); 
    26322835                $note_id = $this->encodeAttribute($note_id); 
    2633                  
     2836 
     2837                # Prepare backlink, multiple backlinks if multiple references 
     2838                $backlink = "<a href=\"#fnref:$note_id\"$attr>&#8617;</a>"; 
     2839                for ($ref_num = 2; $ref_num <= $ref_count; ++$ref_num) { 
     2840                    $backlink .= " <a href=\"#fnref$ref_num:$note_id\"$attr>&#8617;</a>"; 
     2841                } 
    26342842                # Add backlink to last paragraph; create new paragraph if needed. 
    2635                 $backlink = "<a href=\"#fnref:$note_id\"$attr>&#8617;</a>"; 
    26362843                if (preg_match('{</p>$}', $footnote)) { 
    26372844                    $footnote = substr($footnote, 0, -4) . "&#160;$backlink</p>"; 
     
    26562863        # the footnote hasn't been used by another marker. 
    26572864        if (isset($this->footnotes[$node_id])) { 
    2658             # Transfert footnote content to the ordered list. 
    2659             $this->footnotes_ordered[$node_id] = $this->footnotes[$node_id]; 
    2660             unset($this->footnotes[$node_id]); 
     2865            $num =& $this->footnotes_numbers[$node_id]; 
     2866            if (!isset($num)) { 
     2867                # Transfer footnote content to the ordered list and give it its 
     2868                # number 
     2869                $this->footnotes_ordered[$node_id] = $this->footnotes[$node_id]; 
     2870                $this->footnotes_ref_count[$node_id] = 1; 
     2871                $num = $this->footnote_counter++; 
     2872                $ref_count_mark = ''; 
     2873            } else { 
     2874                $ref_count_mark = $this->footnotes_ref_count[$node_id] += 1; 
     2875            } 
    26612876             
    2662             $num = $this->footnote_counter++; 
    26632877            $attr = " rel=\"footnote\""; 
    26642878            if ($this->fn_link_class != "") { 
     
    26772891             
    26782892            return 
    2679                 "<sup id=\"fnref:$node_id\">". 
     2893                "<sup id=\"fnref$ref_count_mark:$node_id\">". 
    26802894                "<a href=\"#fn:$node_id\"$attr>$num</a>". 
    26812895                "</sup>"; 
     
    27632977Markdown is a text-to-HTML filter; it translates an easy-to-read / 
    27642978easy-to-write structured text format into HTML. Markdown's text format 
    2765 is most similar to that of plain text email, and supports features such 
     2979is mostly similar to that of plain text email, and supports features such 
    27662980as headers, *emphasis*, code blocks, blockquotes, and links. 
    27672981 
     
    27812995To file bug reports please send email to: 
    27822996 
    2783 <michel.fortin@michelf.com> 
     2997<michel.fortin@michelf.ca> 
    27842998 
    27852999Please include with your report: (1) the example input; (2) the output you 
     
    27963010--------------------- 
    27973011 
    2798 PHP Markdown & Extra   
    2799 Copyright (c) 2004-2009 Michel Fortin   
    2800 <http://michelf.com/>   
     3012PHP Markdown & Extra 
     3013Copyright (c) 2004-2013 Michel Fortin 
     3014<http://michelf.ca/>   
    28013015All rights reserved. 
    28023016 
  • markdown-on-save/trunk/markdown-on-save.php

    r624731 r660963  
    257257} 
    258258 
     259// Kill global $wp_version, so MarkdownExtra doesn't load its own WordPress plugin code 
     260$_wp_version = $GLOBALS['wp_version']; 
     261unset( $GLOBALS['wp_version'] ); 
     262 
     263// Also do it the approved way 
     264@define( 'MARKDOWN_WP_POSTS', false ); 
     265@define( 'MARKDOWN_WP_COMMENTS', false ); 
     266 
    259267require_once( dirname( __FILE__) . '/markdown-extra/markdown-extra.php' ); 
     268 
     269// Restore $wp_version 
     270$GLOBALS['wp_version'] = $_wp_version; 
     271unset( $_wp_version ); 
     272 
    260273new CWS_Markdown; 
Note: See TracChangeset for help on using the changeset viewer.