From: Toshiro Kuwabara Date: 2002-11-29T17:53:51+09:00 Subject: [ruby-list:36629] Re: RWikiのVerbatimBlock拡張について Toshです。 On 2002.11.29, at 11:34 Asia/Tokyo, Sougo Tsuboi wrote: > 「VerbatimBlockの中といえども、(())等のRWiki指定は > リンクに変換したい」 > > というものです。 > [ruby-talk:11929]とrd2rwiki-lib.rbのソースから、 > rd2rwiki-ext.rbにext_VerbatimBlock_XXXというメソッドを追加 > すればよさそうだ、というところまではわかったのですが、 > そのメソッドの中で、どうすれば((...))の変換を行えばよいのか > よくわからないのです。 > パーシング処理を独自に行うところから書くべきなのでしょうか? 同じようなことを前から何度か聞かれていましたが、「InlineParser にパースさせてやればできるんじゃないでしょうか」とか言いながらも ちゃんとした回答をしてなかったのでこの際RDInlineParserの使い方 を書いておきます。 こんな感じ。 irb(main):001:0> require 'rd/rdfmt' true irb(main):002:0> require 'rd/rd2html-lib' true -- RDInlineParser.newする。引数は意味ないです(文法エラーがなければ) irb(main):003:0> inlinep = RD::RDInlineParser.new(nil) # -- RDInlineParser#parse(str)する。RDを渡してやるとInline要素の配列が -- 返ってきます。 irb(main):004:0> ins = inlinep.parse("aaaa\nbb((*EM*))bb\ncc") [, , ] -- あとは好きなように処理すればいいのですが例えば... irb(main):005:0> vis = RD::RD2HTMLVisitor.new() ... -- InlineElement#accept(visitor)でフォーマットされるので上で得た配列 -- の要素のそれぞれにacceptさせてつなげる。 irb(main):006:0> ins.inject(""){|res,i| res + i.accept(vis) } "aaaa\nbbEMbb\ncc" -- 別の例。 irb(main):007:0> ins2 = inlinep.parse("(())") [ ] irb(main):008:0> ins2[0].accept(vis) "<URL:http://www.ruby-lang.org/ >" RWikiのext_VerbatimBlockとかは使ったことないのでその場合に具体的に どうするかはわかりませんが、とりあえずRD2RWikiVisitorはもともとある ものを使いまわせばいいと思います。 ちなみにAPIは将来かってに変更されうるのでこういう処理をする場合は 覚悟しておいてください。 --- Tosh Toshiro Kuwabara