とりあえず takahashim/md2review を clone して以下。
$ bundle install --path vendor/bundler
redcarpet は vendor/bundler/ruby/2.0.0/bundler/gems 配下にある模様。確認します。
なんか色々確認してたのですが肝心の実装は C で書いてあるらしく ext/rc_render.c の中に記述を発見。
static void
rndr_listitem(struct buf *ob, const struct buf *text, int flags, void *opaque)
{
BLOCK_CALLBACK("list_item", 2, buf2str(text),
(flags & MKD_LIST_ORDERED) ? CSTR2SYM("ordered") : CSTR2SYM("unordered"));
}
マクロの定義も同じファイルで以下。
#define BLOCK_CALLBACK(method_name, ...) {\
struct redcarpet_renderopt *opt = opaque;\
VALUE ret = rb_funcall(opt->self, rb_intern(method_name), __VA_ARGS__);\
if (NIL_P(ret)) return;\
Check_Type(ret, T_STRING);\
bufput(ob, RSTRING_PTR(ret), RSTRING_LEN(ret));\
}
んーと、入れ子になってる場合にどうしてるのか、が見たいのですがorz
む
以下エントリにて lib/redcarpet/render_man.rb が実装の参考になる という記述を発見。
確認します。って見てみたら md2review とあまり変わらないですね。
def list(content, list_type)
case list_type
when :ordered
"\n\n.nr step 0 1\n#{content}\n"
when :unordered
"\n.\n#{content}\n"
end
end
def list_item(content, list_type)
case list_type
when :ordered
".IP \\n+[step]\n#{content.strip}\n"
when :unordered
".IP \\[bu] 2 \n#{content.strip}\n"
end
end
むむむ、と言いつつ自分がボケてるのかと思い以下を md2review でフィルタしてみましたが
# Heading1
## Heading2
-箇条書き 1
- 箇条書き 2
- 箇条書き 3
- 入れこ1
- 入れこ2
駄目でした。
$ md2review test.md
= Heading1
== Heading2
* 箇条書き 1
* 箇条書き 2
* 箇条書き 3
* 入れこ1
* 入れこ2
これ、Redcarpet どうなってるのか、と言いつつ irb で云々してみるに以下。
irb(main):001:0> Redcarpet::Markdown.new(Redcarpet::Render::HTML, :superscript => true).render(" - hoge fuga")
=> "<ul>\n<li>hoge fuga</li>\n</ul>\n"
えーと、これではあまり参考にならないな。以下なスクリプトを作って md2review なツリーの中で bundle exec してみました。
require 'redcarpet'
while str = STDIN.gets
output = Redcarpet::Markdown.new(Redcarpet::Render::HTM).render(str)
STDOUT.puts(output)
end
こんなのが出てきた。
<ul>
<li>箇条書き 1</li>
</ul>
<ul>
<li>箇条書き 2</li>
</ul>
<ul>
<li>箇条書き 3</li>
</ul>
<ul>
<li>入れこ1</li>
</ul>
<ul>
<li>入れこ2</li>
</ul>
こりゃどうにもならないや。一旦降参。