memo

perlでgithub風markdown

github風っていうのは、github-markdown-cssを、適用しただけなのでおまけみたいなものかな。

  1. Markdown記法で書かれたデータはHTMLではないので、ブラウザ等で閲覧しても、元のシンプルなテキスト状態で表示される。したがって、サイト上でMarkdown記法で書かれたデータを見せるには、データをscriptでHTMLに変換する事になりやすい。
  2. .htaccessを設定して、元のMarkdownファイルにアクセスした時に1を実行して結果が返ってくれば、見た感じもURLもシンプルなものになる。

この.htaccessを利用したものは以前から考えていた事なんだけども、実際にやってる人達がいたので、perlでやってみようと。ここのサイトではGETでscriptにMarkdownファイルのURLを渡して処理していたのでmd.cgi?url=http://hogehogeのようなURLになっていたが、現在はmd.cgiと.htaccessを設定して運用している。

一応うまいこと動いたみたいです。ていうか、もがちゃんかわいい。

md.cgi

#!/usr/bin/perl
use strict;
use warnings;
use Path::Class;
use Text::Markdown::Discount qw/markdown/;
use YAML::XS;

(my $file = $ENV{PATH_INFO}) =~ s{^/test/}{};
my $file = file("$file");
my $data = $file->slurp;

my ($frontmatter,$md,$i);
if ($data =~/    -{3}${1}(.*?)-{3}${1}/s){
    $frontmatter = "$1";
}
my $yf = YAML::XS::Load($frontmatter);
my $titletag=$yf->{title};
print qq|Content-type: text/html\n\n|;
print &header_html($titletag);

# Markdown
my @line = split ( /\n/ , $data );
my ($ln,$line);
my $i=0;
my $item ="-{3}";

foreach $ln(@line){
    if ($ln =~ /$item/){
        $i++
    }
    elsif ($i>1){
        $line .= "$ln\n";
    }
}
my $html = markdown($line);

print $html;
print &footer_html;

sub header_html{
my $title=$_[0];
my $printlines = <<"__EOF__";
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<head>
<title>$title</title>
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <meta name="author" content="dsk" />
    <link rel="stylesheet" href="http://dsktnk.sakura.ne.jp/test/github-markdown-css/github-markdown.css">
<style>
        .markdown-body {
            min-width: 200px;
            max-width: 790px;
            margin: 0 auto;
            padding: 30px;
        }
</style>
</head>
<body>
    <article class="markdown-body">
__EOF__
return $printlines;
}


sub footer_html{
my $printlines = <<"__EOF__";
    </article>
</body>
</html>
__EOF__
return $printlines;
}

.htaccess

AddType text/markdown md
Action text/markdown /test/md.cgi

2016-07-04 20:00 tags:perlMarkdownHandlergithub