/var/log/messages

Apr 19, 2014 - 2 minute read - Comments - Ruby

md2review くっさく

とりあえず 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>

こりゃどうにもならないや。一旦降参。