Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
GitHubに移行しました。 https://github.com/naoya/md2inao.pl
#!/usr/bin/env perl
use strict;
use warnings;
use Pod::Usage;
use Text::Markdown 'markdown';
use HTML::TreeBuilder;
use List::Util 'max';
use Encode;
use Unicode::EastAsianWidth;
# デフォルトのリストスタイル
# disc: 黒丸
# square: 四角
# circle: 白丸
# alpha: アルファベット
use constant DEFAULT_LIST => 'disc';
# リストの文字数上限
# WEB+DB PRESSの場合、リストは、1行63桁(文字)まで
# 書籍の場合、リストは1行69桁(文字)まで
use constant MAX_LIST_LENGTH => 63;
# 本文埋め込みリストの文字数上限
# WEB+DB PRESSの場合、本文リストは1行55桁(文字)まで
# 書籍の場合、本文リストは1行73桁(文字)まで
use constant MAX_INLINE_LIST_LENGTH => 55;
# 本文中に(◯1)や(1)など、リストを参照するときの形式に変換する
# 「リスト1.1(c1)を見てください」
# ->
# 「リスト1.1(◯1)を見てください」となる
#
# (d1) -> (1) # desc
# (c1) -> (◯1) # circle
# (s1) -> [1] # square
# (a1) -> (a) # alpha
#
# エスケープも可能
# (\d1) -> (d1)
# (\c1) -> (c1)
sub to_list_style {
my $text = shift;
# convert
$text =~ s/\(d(\d+)\)/$1/g;
$text =~ s/\(c(\d+)\)/(○$1/g;
$text =~ s/\(s(\d+)\)/$1/g;
$text =~ s/\(a(\d+)\)/'(' . chr($1 + 96) . ')'/ge;
# escape
$text =~ s/\(\\([dcsa]?\d+)\)/($1)/g;
return $text;
}
# 文字幅計算
# http://d.hatena.ne.jp/tokuhirom/20070514/1179108961
sub visual_length {
local $_ = Encode::decode_utf8(shift);
my $ret = 0;
while (/(?:(\p{InFullwidth}+)|(\p{InHalfwidth}+))/g) { $ret += ($1 ? length($1)*2 : length($2)) }
return $ret;
}
sub parse_inline {
my $elem = shift;
my $is_special_italic = shift;
my $ret = '';
for my $inline ($elem->content_list) {
if (ref $inline eq '') {
# (注:)は脚注としてあつかう
$inline =~ s!\(注:(.+?)\)!◆注/◆$1◆/注◆!gs;
# 改行を取り除く
$inline =~ s/(\n|\r)//g;
# キャプション
if ($inline =~ s!^●(.+?)::(.+)!$1\t$2!) {
$inline =~ s!\[(.+)\]$!\n$1!;
}
# リストスタイル文字の変換
$inline = to_list_style($inline);
$ret .= $inline;
}
elsif ($inline->tag eq 'code') {
$ret .= '◆cmd/◆';
$ret .= $inline->as_trimmed_text;
$ret .= '◆/cmd◆';
}
elsif ($inline->tag eq 'strong') {
$ret .= '◆b/◆';
$ret .= $inline->as_trimmed_text;
$ret .= '◆/b◆';
}
elsif ($inline->tag eq 'em') {
$ret .= $is_special_italic ? '◆i-j/◆' : '◆i/◆';
$ret .= $inline->as_trimmed_text;
$ret .= $is_special_italic ? '◆/i-j◆' : '◆/i◆';
}
elsif ($inline->tag eq 'kbd') {
$ret .= $inline->as_trimmed_text;
$ret .= '';
}
elsif ($inline->tag eq 'span') {
my $class = $inline->attr('class');
# 赤字
# <span class='red'>赤字</span>
if ($class eq 'red') {
$ret .= '◆red/◆';
$ret .= $inline->as_trimmed_text;
$ret .= '◆/red◆';
}
# ruby
# <span class='ruby'>漢字(かんじ)</span>
elsif ($class eq 'ruby') {
my $ruby = $inline->as_trimmed_text;
$ruby =~ s!(.+)\((.+)\)!◆ルビ/◆$1$2◆/ルビ◆!;
$ret .= $ruby;
}
# その他の記号
# <span class='symbol'>=></span>
elsif ($class eq 'symbol') {
$ret .= '';
$ret .= $inline->as_trimmed_text;
$ret .= '';
}
}
}
return $ret;
}
sub to_html_tree {
my $text = shift;
my $html = markdown($text);
my $tree = HTML::TreeBuilder->new;
$tree->no_space_compacting(1);
$tree->parse_content(\$html);
}
sub to_inao {
my $text = shift;
my $is_column = shift;
my $tree = to_html_tree($text);
my $inao = q[];
my $body = $tree->find('body');
for my $elem ($body->content_list) {
if ($elem->tag =~ /^h(\d+)/) {
my $level = $1;
$inao .= '' x $level;
$inao .= $elem->as_trimmed_text;
$inao .= "\n";
}
elsif ($elem->tag eq 'p') {
my $p = parse_inline($elem, $is_column);
if ($p !~ /^[\s ]+$/) {
$inao .= "$p\n";
}
}
elsif ($elem->tag eq 'pre') {
my $code = $elem->find('code');
my $text = $code ? $code->as_text : '';
my $list_label = 'list';
my $comment_label = 'comment';
# キャプション
$text =~ s!●(.+?)::(.+)!$1\t$2!g;
# 「!!! cmd」で始まるコードブロックはコマンドライン(黒背景)
if ($text =~ /!!!(\s+)?cmd/) {
$text =~ s/.+?\n//;
$list_label .= '-white';
$comment_label .= '-white';
}
# リストスタイル
$text = to_list_style($text);
# 文字数カウント
my $max = max(map { visual_length($_) } split /\r?\n/, $text);
if ($text =~ /^●/) {
if ($max > MAX_LIST_LENGTH) {
warn "リストは" . MAX_LIST_LENGTH . "文字まで!(現在${max}使用):\n$text\n\n";
}
}
else {
if ($max > MAX_INLINE_LIST_LENGTH) {
warn "本文埋め込みリストは" . MAX_INLINE_LIST_LENGTH . "文字まで!(現在${max}使用):\n$text\n\n";
}
}
# コード内コメント
$text =~ s!\(注:(.+?)\)!$comment_label/◆$1◆/$comment_label!g;
# コード内強調
$text =~ s!\*\*(.+?)\*\*!◆cmd-b/◆$1◆/cmd-b◆!g;
# コード内イタリック
$text =~ s!\___(.+?)\___!◆i-j/◆$1◆/i-j◆!g;
$inao .= "$list_label/◆\n";
$inao .= $text;
$inao .= "◆/$list_label\n";
}
elsif ($elem->tag eq 'ul') {
for my $list ($elem->find('li')) {
$inao .= '' . parse_inline($list, 1) . "\n";
}
}
elsif ($elem->tag eq 'ol') {
my $list_style = $elem->attr('class') || DEFAULT_LIST;
my $s = substr $list_style, 0, 1;
my $i = 0;
for my $list ($elem->find('li')) {
$inao .=
to_list_style((sprintf('(%s%d)', $s, ++$i)) .
parse_inline($list, 1)) . "\n";
}
}
elsif ($elem->tag eq 'table') {
my $summary = $elem->attr('summary') || '';
$summary =~ s!(.+?)::(.+)!$1\t$2\n!;
$inao .= "◆table/◆\n";
$inao .= $summary;
$inao .= "◆table-title◆";
for my $table ($elem->find('tr')) {
for my $item ($table->find('th')){
$inao .= $item->as_trimmed_text;
$inao .= "\t";
}
for my $item ($table->find('td')){
$inao .= $item->as_trimmed_text;
$inao .= "\t";
}
chop($inao);
$inao .= "\n"
}
$inao .= "◆/table◆\n";
}
elsif ($elem->tag eq 'div' and $elem->attr('class') eq 'column') {
# HTMLとして取得してcolumn自信のdivタグを削除
my $html = $elem->as_HTML('');
$html =~ s/^<div.+?>//;
$html =~ s/<\/div>$//;
$inao .= "◆column/◆\n";
$inao .= to_inao($html, 1);
$inao .= "◆/column◆\n";
}
elsif ($elem->tag eq 'blockquote') {
my $blockquote = '';
for my $p ($elem->content_list) {
$blockquote = parse_inline($p, 1);
}
$blockquote =~ s/(\s)//g;
$inao .= "◆quote/◆\n";
$inao .= $blockquote;
$inao .= "\n◆/quote◆\n";
}
}
return $inao;
}
my $infile = $ARGV[0]
or pod2usage(-1);
open my $fh, '<', $infile or die $!;
my $text = do { local $/; <$fh> };
close $fh;
print to_inao($text);
__END__
=head1 NAME
markdown2inao.pl - markdown to inao converter
=head1 SYNOPSIS
markdown2inao.pl input.markdown.txt
=cut
# 見出し1(大見出し、節)
## 見出し2(中見出し、項)
### 見出し3(小見出し、目)
 段落冒頭の字下げは、このように手動でお願いします。
改行は、(改行)
このように自動で取り除かれます。
 通常の本文**強調(ボールド)**通常の本文_斜体(イタリック)_通常の本文`インラインのコード`通常の本文(注:注釈ですよ。_イタリック_)通常の本文<kbd>Enter</kbd>(←キーボードフォント)<span class='red'>赤文字</span>通常の本文<span class='ruby'>外村(ほかむら)</span>(←ルビ)。
> _引用_です**引用**です引用です引用です引用です引用です引用です引用です
> 引用です引用です引用です引用です引用です引用です引用です引用です
> 引用です引用です引用です引用です引用です引用です引用です引用です
> 引用です引用です引用です引用です引用です引用です引用です引用です
<div class='column'>
#### コラム見出し
 **コラム**本文_コラム_本文コラム本文コラム本文コラム本文コラム本文コラム本文コラム本文コラム本文コラム本文コラム。
##### コラム小見出し
 コラム内でも**強調**などが使えます。
</div>
## 箇条書き(リスト)いろいろ
### 通常の箇条書き
* 通常の**箇条書き**
* 通常の_箇条書き_
* 通常の箇条書き
* 通常の箇条書き
* 通常の箇条書き
### 連番箇条書き(黒丸数字、連番の場合のデフォルト)
1. 連番箇条書き(黒丸数字)
2. 連番箇条書き(黒丸数字)
3. 連番箇条書き(黒丸数字)
4. 連番箇条書き(黒丸数字)
5. 連番箇条書き(黒丸数字)
### 連番箇条書き(白丸数字、重複などの事情で黒丸では不都合なとき)
<ol class='circle'>
<li>連番箇条書き(白丸数字)</li>
<li>連番箇条書き(白丸数字)</li>
<li>連番箇条書き(白丸数字)</li>
<li>連番箇条書き(白丸数字)</li>
<li>連番箇条書き(白丸数字)</li>
</ol>
### 連番箇条書き(黒四角数字)
<ol class='square'>
<li>連番箇条書き(黒四角数字)</li>
<li>連番箇条書き(黒四角数字)</li>
<li>連番箇条書き(黒四角数字)</li>
<li>連番箇条書き(黒四角数字)</li>
<li>連番箇条書き(黒四角数字)</li>
</ol>
### 連番箇条書き(アルファベット)
<ol class='alpha'>
<li>連番箇条書き(アルファベット)</li>
<li>連番箇条書き(アルファベット)</li>
<li>連番箇条書き(アルファベット)</li>
<li>連番箇条書き(アルファベット)</li>
<li>連番箇条書き(アルファベット)</li>
</ol>
### 本文やリスト中での番号
 箇条書き以外の本文やリスト中で番号を書きたいときは、(d1)、(d2)、(c1)、(c2)、(s1)、(s2)、(a1)、(a2)のように書いてください。
<ol class='square'>
<li>hogehogeをします</li>
<li>fugafugaと(s1)の結果を足し合わせます</li>
</ol>
 リスト1.1(c1)ではアラートを出しています。(c2)でもアラートを出しています。(\a1)エスケープできます。
●リスト1.1::キャプション(コードのタイトル)
function hoge() {
alert(foo); … (c1)
alert(bar); … (c2)
alert(\c1); // \でエスケープできます
}
## ソースコード
### 本文埋め込みコード
 本文中で流れでコードを掲載するときに使用します。
function **foo**(a) { // コード内強調
alert(a); (注:こんな風にコメントがつけられます)
}
(注:見出し的にも使えます)
function bar(b) {
alert(b);
}
 このように、上下に本文が入ります。
 本文から一連の流れで読んでもらうことができますが、コードがページをまたぐ可能性がございます。
### リスト(名前付きのコード)★要キャプション★
 リストは、本文とは別ボックス(別なパーツ)として紙面の端に寄せてレイアウトしますので、コードがページをまたぐことはございません(1ページを超えるコードはまたぎますけど)。
 以下、このリストや後述する図や表など、別ボックスものの場合のご注意点です。
* キャプション(タイトル)が必須です
* 「**リスト1.1**をご覧ください」「○○のコードを示します(**リスト1.1**)」「○○を**表1.1**にまとめました」みたいな感じで、本文から番号で参照してください
* 初出時のみ**リスト1.1**のように太字にします(2度目以降は通常の本文です)
(このドキュメントでは、別ボックスものは見出しに★要キャプション★と書いています)
●リスト1.1::キャプション(コードのタイトル)
function **foo**(a) { // コード内強調
alert(a); (注:こんな風にコメントがつけられます)
}
___foo('bar');___ // コード内___イタリック___
___foo('baz');___ // コード内**強調**
(注:見出し的にも使えます)
function bar(b) {
alert(b);
}
## コマンドの実行結果
 コマンドは、「!!! cmd」と付けていただく必要があるだけで、基本的には上記ソースコードと同じです。
 ただし、呼称が「リスト」ではなく「図」となります。また、コマンド行の行頭にはプロンプトを付けてください。
### 本文埋め込みコマンド(本文埋め込み版はWEB+DB PRESSでは未使用)
!!! cmd
$ command **foo** // コマンド内強調
bar (注:こんな風にコメントがつけられます)
(注:見出し的にも使えます)
function bar(b) {
alert(b);
}
### 図(名前付きのコマンド)★要キャプション★
!!! cmd
●図1.1::キャプション(コマンドのタイトル)
$ command **foo** // コマンド内強調
bar (注:こんな風にコメントがつけられます)
(注:見出し的にも使えます)
function bar(b) {
alert(b);
}
## 図★要キャプション★
 スクリーンショットなど、別ファイルを参照する図です。
●図1.1::キャプション(_図の_タイトル)[figure/sample.png]
## 表★要キャプション★
<table summary='表1.1::キャプション(表のタイトル)'>
<tr>
<th>表タイトル1</th>
<th>表タイトル2</th>
</tr>
<tr>
<td>内容1</td>
<td>内容2</td>
</tr>
<tr>
<td>内容1</td>
<td>内容2</td>
</tr>
</table>
## その他の記号
<span class='symbol'>→</span><span class='symbol'>←</span><span class='symbol'>↑</span><span class='symbol'>↓</span>
<span class='symbol'>←→</span>
<span class='symbol'>>=</span><span class='symbol'>=></span>
## キーボードフォント
<kbd>A</kbd>~<kbd>Z</kbd>
<kbd>a</kbd>~<kbd>z</kbd>
<kbd>0</kbd>~<kbd>9</kbd>
<kbd>F1</kbd>~<kbd>F12</kbd>
<kbd>→</kbd><kbd>↓</kbd><kbd>↑</kbd><kbd>←</kbd>
<kbd>End</kbd>
<kbd>Alt</kbd>
<kbd>Ctrl</kbd><kbd>Control</kbd>
<kbd>Shift</kbd>
<kbd>Tab</kbd>
<kbd>Esc</kbd>
<kbd>Delete</kbd>
<kbd>Insert</kbd>
<kbd>Pause</kbd>
<kbd>Break</kbd>
<kbd>Home</kbd>
<kbd>Back Space</kbd>
<kbd>Space</kbd>
<kbd>Pgup</kbd><kbd>Pgdn</kbd>
<kbd>Enter</kbd>
<kbd>!</kbd>
<kbd>#</kbd>
<kbd>$</kbd>
<kbd>%</kbd>
<kbd>&</kbd>
<kbd>'</kbd>
<kbd>(</kbd><kbd>)</kbd>
<kbd>[</kbd><kbd>]</kbd>
<kbd>=</kbd>
<kbd>-</kbd>
<kbd>^</kbd>
<kbd>~</kbd>
<kbd>|</kbd>
<kbd>+</kbd>
<kbd>*</kbd>
<kbd>;</kbd>
<kbd>:</kbd>
<kbd>,</kbd>
<kbd>.</kbd>
<kbd>/</kbd>
<kbd>?</kbd>
<kbd>_</kbd>
<kbd>@</kbd>
<kbd>`</kbd>
<kbd>"</kbd>
■見出し1(大見出し、節)
■■見出し2(中見出し、項)
■■■見出し3(小見出し、目)
 段落冒頭の字下げは、このように手動でお願いします。改行は、(改行)このように自動で取り除かれます。
 通常の本文◆b/◆強調(ボールド)◆/b◆通常の本文◆i/◆斜体(イタリック)◆/i◆通常の本文◆cmd/◆インラインのコード◆/cmd◆通常の本文◆注/◆注釈ですよ。◆i/◆イタリック◆/i◆◆/注◆通常の本文Enter▲(←キーボードフォント)◆red/◆赤文字◆/red◆通常の本文◆ルビ/◆外村◆ほかむら◆/ルビ◆(←ルビ)。
◆quote/◆
◆i-j/◆引用◆/i-j◆です◆b/◆引用◆/b◆です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です引用です
◆/quote◆
◆column/◆
■■■■コラム見出し
 ◆b/◆コラム◆/b◆本文◆i-j/◆コラム◆/i-j◆本文コラム本文コラム本文コラム本文コラム本文コラム本文コラム本文コラム本文コラム本文コラム。
■■■■■コラム小見出し
 コラム内でも◆b/◆強調◆/b◆などが使えます。
◆/column◆
■■箇条書き(リスト)いろいろ
■■■通常の箇条書き
・通常の◆b/◆箇条書き◆/b◆
・通常の◆i-j/◆箇条書き◆/i-j◆
・通常の箇条書き
・通常の箇条書き
・通常の箇条書き
■■■連番箇条書き(黒丸数字、連番の場合のデフォルト)
(1)連番箇条書き(黒丸数字)
(2)連番箇条書き(黒丸数字)
(3)連番箇条書き(黒丸数字)
(4)連番箇条書き(黒丸数字)
(5)連番箇条書き(黒丸数字)
■■■連番箇条書き(白丸数字、重複などの事情で黒丸では不都合なとき)
(○1)連番箇条書き(白丸数字)
(○2)連番箇条書き(白丸数字)
(○3)連番箇条書き(白丸数字)
(○4)連番箇条書き(白丸数字)
(○5)連番箇条書き(白丸数字)
■■■連番箇条書き(黒四角数字)
[1]連番箇条書き(黒四角数字)
[2]連番箇条書き(黒四角数字)
[3]連番箇条書き(黒四角数字)
[4]連番箇条書き(黒四角数字)
[5]連番箇条書き(黒四角数字)
■■■連番箇条書き(アルファベット)
(a)連番箇条書き(アルファベット)
(b)連番箇条書き(アルファベット)
(c)連番箇条書き(アルファベット)
(d)連番箇条書き(アルファベット)
(e)連番箇条書き(アルファベット)
■■■本文やリスト中での番号
 箇条書き以外の本文やリスト中で番号を書きたいときは、(1)、(2)、(○1)、(○2)、[1]、[2]、(a)、(b)のように書いてください。
[1]hogehogeをします
[2]fugafugaと[1]の結果を足し合わせます
 リスト1.1(○1)ではアラートを出しています。(○2)でもアラートを出しています。(a1)エスケープできます。
◆list/◆
●リスト1.1 キャプション(コードのタイトル)
function hoge() {
alert(foo); … (○1)
alert(bar); … (○2)
alert(c1); // \でエスケープできます
}
◆/list◆
■■ソースコード
■■■本文埋め込みコード
 本文中で流れでコードを掲載するときに使用します。
◆list/◆
function ◆cmd-b/◆foo◆/cmd-b◆(a) { // コード内強調
alert(a); ◆comment/◆こんな風にコメントがつけられます◆/comment◆
}
◆comment/◆見出し的にも使えます◆/comment◆
function bar(b) {
alert(b);
}
◆/list◆
 このように、上下に本文が入ります。
 本文から一連の流れで読んでもらうことができますが、コードがページをまたぐ可能性がございます。
■■■リスト(名前付きのコード)★要キャプション★
 リストは、本文とは別ボックス(別なパーツ)として紙面の端に寄せてレイアウトしますので、コードがページをまたぐことはございません(1ページを超えるコードはまたぎますけど)。
 以下、このリストや後述する図や表など、別ボックスものの場合のご注意点です。
・キャプション(タイトル)が必須です
・「◆b/◆リスト1.1◆/b◆をご覧ください」「○○のコードを示します(◆b/◆リスト1.1◆/b◆)」「○○を◆b/◆表1.1◆/b◆にまとめました」みたいな感じで、本文から番号で参照してください
・初出時のみ◆b/◆リスト1.1◆/b◆のように太字にします(2度目以降は通常の本文です)
(このドキュメントでは、別ボックスものは見出しに★要キャプション★と書いています)
◆list/◆
●リスト1.1 キャプション(コードのタイトル)
function ◆cmd-b/◆foo◆/cmd-b◆(a) { // コード内強調
alert(a); ◆comment/◆こんな風にコメントがつけられます◆/comment◆
}
◆i-j/◆foo('bar');◆/i-j◆ // コード内◆i-j/◆イタリック◆/i-j◆
◆i-j/◆foo('baz');◆/i-j◆ // コード内◆cmd-b/◆強調◆/cmd-b◆
◆comment/◆見出し的にも使えます◆/comment◆
function bar(b) {
alert(b);
}
◆/list◆
■■コマンドの実行結果
 コマンドは、「!!! cmd」と付けていただく必要があるだけで、基本的には上記ソースコードと同じです。
 ただし、呼称が「リスト」ではなく「図」となります。また、コマンド行の行頭にはプロンプトを付けてください。
■■■本文埋め込みコマンド(本文埋め込み版はWEB+DB PRESSでは未使用)
◆list-white/◆
$ command ◆cmd-b/◆foo◆/cmd-b◆ // コマンド内強調
bar ◆comment-white/◆こんな風にコメントがつけられます◆/comment-white◆
◆comment-white/◆見出し的にも使えます◆/comment-white◆
function bar(b) {
alert(b);
}
◆/list-white◆
■■■図(名前付きのコマンド)★要キャプション★
◆list-white/◆
●図1.1 キャプション(コマンドのタイトル)
$ command ◆cmd-b/◆foo◆/cmd-b◆ // コマンド内強調
bar ◆comment-white/◆こんな風にコメントがつけられます◆/comment-white◆
◆comment-white/◆見出し的にも使えます◆/comment-white◆
function bar(b) {
alert(b);
}
◆/list-white◆
■■図★要キャプション★
 スクリーンショットなど、別ファイルを参照する図です。
●図1.1 キャプション(◆i/◆図の◆/i◆タイトル)[figure/sample.png]
■■表★要キャプション★
◆table/◆
●表1.1 キャプション(表のタイトル)
◆table-title◆表タイトル1 表タイトル2
内容1 内容2
内容1 内容2
◆/table◆
■■その他の記号
◆→◆◆←◆◆↑◆◆↓◆
◆←→◆
◆>=◆◆=>◆
■■キーボードフォント
A▲~Z▲
a▲~z▲
0▲~9▲
F1▲~F12▲
→▲↓▲↑▲←▲
End▲
Alt▲
Ctrl▲Control▲
Shift▲
Tab▲
Esc▲
Delete▲
Insert▲
Pause▲
Break▲
Home▲
Back Space▲
Space▲
Pgup▲Pgdn▲
Enter▲
!▲
#▲
$▲
%▲
&▲
'▲
(▲)▲
[▲]▲
=▲
-▲
^▲
~▲
|▲
+▲
*▲
;▲
:▲
,▲
.▲
/▲
?▲
_▲
@▲
`▲
"▲
PDFにすると、以下のような仕上がりになります。
・書籍版
https://docs.google.com/open?id=0BzbGMS73rIkDUXpyUVlrSUxURXlmMXhQRV9Ua2JCUQ
・WEB+DB PRESS版
https://docs.google.com/open?id=0BzbGMS73rIkDZjdCTnBkMDFUaGF2UDJIdTNfaVJUUQ
導入方法です。
・はじめる!markdown2inao « blog.udzura.jp
http://blog.udzura.jp/2012/09/10/install-markdown2inao/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.