memo
perlでgithub風markdown
github風っていうのは、github-markdown-cssを、適用しただけなのでおまけみたいなものかな。
- Markdown記法で書かれたデータはHTMLではないので、ブラウザ等で閲覧しても、元のシンプルなテキスト状態で表示される。したがって、サイト上でMarkdown記法で書かれたデータを見せるには、データをscriptでHTMLに変換する事になりやすい。
- .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