From: Yoshinori Toki Date: 1999-03-20T00:23:41+09:00 Subject: [ruby-list:13030] Re: Tiny eRuby ----Next_Part(Sat_Mar_20_00:23:59_1999_809)-- Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit 土岐です。 From: Masatoshi SEKI Subject: [ruby-list:13000] Tiny eRuby Date: Thu, 18 Mar 1999 23:44:27 +0900 > 咳といいます。 > > ruby-dev の方で一時期話題になっていた eRuby を実装してみました。 > ...(略)... > HTMLの文書や定型文の作成などに便利そうです。 > お目汚しにどうぞ。 なかなかおもしろそうですね。ruby-dev をちょっとのぞいてみたら、もとも とは HTML に埋め込む用途を想定していたみたいですけど、これって他にもい ろいろ使えそうですよね。LaTeX の文書にテーブルコマンドを生成する Ruby スクリプトを埋め込んだりとか。 で、ちょっと使ってみていくつか気になるところがあったので、少し手を加え てみました。変更点は次のとおりです。 * 入力を ARGV[0] から仮想ファイルの $< に変更しました。 これでよりフィルターコマンドらしい動作になったと思います。 * 入力が空のとき IO#read が nil を返してエラーになっていたので、 この場合はただちに終了するように変更しました。 * `<%= [値] %>' タグは `print [値]' に置換されますが、これだと 値に `( )' の付いた式を使うと print が `( )' と結合して、例え ば `<%= (1 + 2) * 3 %>' が `print (1 + 2) * 3' となって ~~~~~~~~~~~~~ 期待していたのと異なる値が表示されてしまいます(というか、この 場合は print が nil を返すのでエラーになってしまう)。なので、 値を括弧でで括って `<%= [値] %>' が `print ([値])' に置換され るように変更しました。 * 笠原 基之さんの getoptlong ライブラリ (http://www.sra.co.jp/people/m-kasahr/ruby/getoptlong/) を使っていくつかオプションを追加してみました。 -d, --debug デバッグモード -r ライブラリのロード -v, --version バージョンの表示 -w 冗長モード これらはわたしがあったらいいなと思ったオプションです。 パッチを添付しときます。 ---------------------------------------------------------------------------- 土岐 仁謙 神戸大学物理高エネ研 M1 URL: http://www3.phys.sci.kobe-u.ac.jp/~toki/index.html PGP fingerprint = D0 A8 90 AB 73 F8 34 FE CE CA DB BF 01 30 C0 35 ----Next_Part(Sat_Mar_20_00:23:59_1999_809)-- Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=erb.patch *** erb.rb 1999-03-19 14:48:56+09 1.1 --- erb.rb 1999-03-19 23:22:34+09 1.6 *************** *** 46,52 **** # print に置換 list = @print.gsub(list) { v = @print.matching_data[1].join ! ['<% ', "print #{v}", ' %>'] } end module_function :pre_compile --- 46,52 ---- # print に置換 list = @print.gsub(list) { v = @print.matching_data[1].join ! ['<% ', "print (#{v})", ' %>'] } end module_function :pre_compile *************** *** 118,137 **** if __FILE__ == $0 ! if ARGV[0] == '-x' ! output = true ! ARGV.shift ! end ! if ARGV[0] == '-n' ! number = true ! ARGV.shift ! end ! f = open(ARGV[0]) ! src = f.read ! f.close erb = ERb.new(src) ! if output ! if number l = 1 for line in erb.src puts "%3d %s"%[l, line] --- 118,152 ---- if __FILE__ == $0 ! require "getoptlong" ! opt_parser = GetoptLong.new([ "-x", GetoptLong::NO_ARGUMENT ], ! [ "-n", GetoptLong::NO_ARGUMENT ], ! [ "-d", "--debug", GetoptLong::NO_ARGUMENT ], ! [ "-r", GetoptLong::REQUIRED_ARGUMENT ], ! [ "-v", "--version", GetoptLong::NO_ARGUMENT ], ! [ "-w", GetoptLong::NO_ARGUMENT ]) ! opt_parser.each_option do |name, arg| ! case name ! when "-x" # ruby source ! $output = true ! when "-n" # line number ! $number = true ! when "-w" # verbose ! $VERBOSE = true ! when "-v" # version ! STDERR.puts "erb 1.14 1999/03/16 16:49:42" ! exit ! when "-d" # debug ! $DEBUG = true ! when "-r" # require ! require arg ! end ! end ! src = $<.read ! exit unless src erb = ERb.new(src) ! if $output ! if $number l = 1 for line in erb.src puts "%3d %s"%[l, line] ----Next_Part(Sat_Mar_20_00:23:59_1999_809)----