[MT Plugin]全新改寫的 Markdown 解析插件

一直在用 Markdown 寫Blog。
總覺得貌似解析效率有點不高。何況引入 代碼高亮 後,處理代碼顯示是個問題。

檢查了 MT 自帶的 Markdown 解析插件 ( plugins/Markdown/Markdown.pl ) , 原來是 John Gruber 2004 寫的第一版。

My God , so oooold。。。

John Gruber 這個原代碼寫的很經典, 但是究竟很老了。。

而且現在 Cpan 上有現成的模塊 Text::Markdown 可以使用。 乾脆改寫吧。。。

另外,改寫的插件還是丟到 plugins/Easun 目錄吧,方便升級。 直接刪除 plugins/Markdown/ 目錄, 在plugins/Easun下新建立 Markdown_md.pl 文件,全文如下:

Perl    #
    # Markdown -- A text-to-HTML conversion tool for web writers
    #
    # Copyright (c) 2004 John Gruber
    # <http://daringfireball.net/projects/markdown/>
    # Modify 2017 By EasunLee<http://www.kcpon.com>
    # <http://github.com/easunlee/MT-copy/blob/master/plugins/Easun/Markdown_md.pl>
    #

    package MT::Plugin::Easun::Markdown;
    use strict;
    use warnings;

    use vars qw($MYNAME $VERSION $DEBUG $Useproxy );
    $VERSION = "1.03e";


    #### Movable Type plug-in interface #####################################
    use MT::Plugin;

    my $plugin = new MT::Plugin(
    {   name=> "Markdown_Modify",
    author_name => "John Gruber",
    author_link => "http://daringfireball.net/",
    plugin_link => "http://daringfireball.net/projects/markdown/",
    version => $VERSION,
    description =>
    '<MT_TRANS phrase="A plain-text-to-HTML formatting plugin.">',
    doc_link => 'http://daringfireball.net/projects/markdown/',
    registry => {
    tags => {
    block => {
    MarkdownOptions => sub {
    my $ctx = shift;
    my $args= shift;
    my $builder = $ctx->stash('builder');
    my $tokens  = $ctx->stash('tokens');

    if ( defined( $args->{'output'} ) ) {
    $ctx->stash( 'markdown_output',
    lc $args->{'output'} );
    }

    defined( my $str = $builder->build( $ctx, $tokens ) )
    or return $ctx->error( $builder->errstr );
    $str;# return value
    },
    },
    },
    text_filters => {
    'markdown' => {
    label => 'Markdown_Modify',
    docs  => 'http://daringfireball.net/projects/markdown/',
    code  => sub {
    my $text = shift;
    my $ctx  = shift;
    my $raw  = 0;
    if ( defined $ctx ) {
    my $output = $ctx->stash('markdown_output');
    if ( defined $output && $output =~ m/^html/i ) {
    #$g_empty_element_suffix = ">";
    $ctx->stash( 'markdown_output', '' );
    }
    elsif ( defined $output && $output eq 'raw' ) {
    $raw = 1;
    $ctx->stash( 'markdown_output', '' );
    }
    else {
    $raw= 0;
      #  $g_empty_element_suffix = " />";
    }
    }
    $text = $raw ? $text : &_easunCode( $text );
    $text;
    },
    },


    },
    },
    }
    );
    MT->add_plugin($plugin);

    sub _easunCode {
    my $text = shift;
      &_DoCodeBlocks_github(\$text);

    require Text::Markdown;
    my $m = Text::Markdown->new;
    $text = $m->markdown($text);


    $text =~ s{<pre><code>```(.*?)\n}{<pre><b class=\"name\">$1<\/b><code class=\"language-$1\">}g; 
    $text =~ s/<pre><code>/<pre><b class=\"name\">code<\/b><code class=\"code\">/g;
    return $text;
    }

    #
    #  GitHub style Code
    #
    sub _DoCodeBlocks_github {

    my $text = shift; 
    $$text =~ s{\r\n}{\n}g;# DOS to Unix
    $$text =~ s{\r}{\n}g;  # Mac to Unix

     #$$text =~ s{(\n\n|\A)(```\w+)\n}{$1\t$2\n}g;

    $$text =~ s{
       (?:\n\n|\A)
       ```(\w+)\n
    (   # $2 = the code block -- one or more lines, starting with a space/tab
    .*?
      )
       \n```
       (?:\n|\Z)
       }{
    my $codeType = $1;
    my $codeblock = $2;
    my $result; # return value

    $codeblock =~ s/\A\n+//; # trim leading newlines
    $codeblock =~ s/\s+\z//; # trim trailing whitespace  
    $codeblock =~ s/\n/\n\t/g;   
    $result = "\n\n\t```" .$codeType ."\n\t" . $codeblock . "\n\n";
    $result;
    }segmx;

    }

    1;

更詳細的插件信息可以見 GitHub 地址: http://github.com/easunlee/MT-copy/blob/master/plugins/Easun/Markdown_md.pl

當然,不要忘記安裝 Text::Markdown 模塊。

Bashcpanm Text::Markdown

保存,重啟 mt-starman, 到此新的 Markdown 解析器替換完成。