From: nobu.nakada@... Date: 2000-01-03T23:03:10+09:00 Subject: [ruby-list:20031] Re: RD with method index (again) なかだです。 At Mon, 3 Jan 2000 01:09:05 +0900, Toshiro Kuwabara wrote: > むぅ、なるほど。「わざ」ですね。 > # extendってこう使うのか。 いや、本来こう使うものかどうかは…(^^;。ちょっとこういう小手先 のはあんまり良くはないかなと思っても、こういった、どこにでもフッ クを仕込めるみたいなところは非常に楽ですね、カスタマイズに。 > リファレンスは結局どういう形に落ち着くのかわからないですが、可能な場合 > はこのコードの一部を使わせていただいても構わないでしょうか? もちろん構いません。というか使ってもらった方がありがたいです。 自分のところでしか同じドキュメント作れないって状況は芳しくないの で。 # 「使っちゃいや」ってものをわざわざ流したりはしませんし。 ただあれだと Hoge#hoge() と Hoge#hoge!() みたいのがあるとうまく マッチしてくれないので、今こうしてます。参考までに。 def [](k) if !v = super ['(?![\w\d!?])', ''].each do |tail| v = keys.grep(Regexp.new('\A' + Regexp.quote(k) + tail)) if v.size == 1 v = super(k = v[0]) break end end end # k.sub(/[()].*/, '').tr('#', ':'). # gsub(/(?![\da-z\-_.!~*\'();\/?:@&=+$,]|%[\da-f]{2})./i) {format('%%%02X', $&[0])} v end それとこういうのが欲しいのは私だけかも知れませんが、 <<< file filter という、フィルタを通した include ってのを追加してみました。いや、 サンプルコードを別ファイルにしたかったもので。 で、<<< は preprocess で完結するようにしてしまったんですが、こ れはまずいでしょうか。 ついでに要望をもう一つ。 例えば rd2html などで、charset やら stylesheet やらを指定できる ようになると嬉しいのですが。スクリプトを用意すればできるのかもで すが、できればコマンドラインからも指定できるともっと嬉しいような。 diff -ru2 rdtool-0.5.5/rd/rdfmt.rb rdtool-0.5.5+/rd/rdfmt.rb --- rdtool-0.5.5/rd/rdfmt.rb Mon Jan 3 21:59:39 2000 +++ rdtool-0.5.5+/rd/rdfmt.rb Mon Jan 3 22:12:24 2000 @@ -506,10 +506,7 @@ include Enumerable - TMP_DIR = "/tmp" - attr(:root, true) attr(:include_path, true) attr(:filter, true) - attr(:tmp_dir, true) def initialize(src, path = [], do_parse = true) @@ -517,5 +514,4 @@ @include_path = path @filter = Hash.new() - @tmp_dir = TMP_DIR if do_parse parse @@ -539,17 +535,21 @@ end alias each each_element - + + def find_file(file) + for dir in @include_path + return open(dir + "/" + file) rescue next + end + nil + end + private def preprocess(src) - case src - when String - src = src.split("\n") - end rd = [] other = [] in_rd = nil in_other = nil - tmpfile_num = 0 - while line = src.shift + filter = nil + part = nil + src.each do |line| case line when /^=begin\s*(?:\bRD\b.*)?\s*$/ @@ -564,29 +564,16 @@ part = RD::Part.new(other.join(""), "r") other.clear - part_out = @filter[in_other].call(part) - if @filter[in_other].mode == :rd - rd.concat(part_out.to_a) - else - basename = "rdtmp.#{$$}.#{tmpfile_num}" - tmpfile_num += 1 - tmpfile = open(@tmp_dir + "/" + basename + ".#{in_other}", "w") - tmpfile.print(part_out) - tmpfile.close - rd.push("<<< #{basename}\n") - end + filter = @filter[in_other] in_other = nil # else # raise "[BUG] unknown part.\n" end + when /^<<<\s*(\S+)\s*(\w+)/ + if filter = @filter[$2] + part = find_file($1) + end when /^<<<\s*(\S+\.(?:rd|rb))\s/ if in_rd - @include_path.each do |dir| - fileName = dir + "/" + $1 - if test(?e, fileName) - included = IO.readlines(fileName) - rd.concat(preprocess(included)) - break - end - end + rd.concat(preprocess(find_file($1))) end else @@ -596,4 +583,10 @@ other.push(line) end + end + if part + part = filter.call(part) + filter.mode == :rd or part = preprocess(part) + rd.concat(part.to_a) + part = nil end end diff -ru2 rdtool-0.5.5/rd2 rdtool-0.5.5+/rd2 --- rdtool-0.5.5/rd2 Mon Jan 3 21:59:39 2000 +++ rdtool-0.5.5+/rd2 Mon Jan 3 21:54:14 2000 @@ -49,5 +49,4 @@ end end - include_path.push(RD::RDTree::TMP_DIR) end @@ -77,9 +76,4 @@ out = visitor.visit(tree) print out - -# for filter -Dir.glob("#{RD::RDTree::TMP_DIR}/rdtmp.#{$$}.*.*").each do |i| - File.delete(i) -end def usage -- そうだ 強気に ちょっと インチキに☆彡 中田 "Bugるくらいがちょうどいいかも;-)" 伸悦