鄭です。 NAGAI Hidetoshi writes: > 永井@知能.九工大です. > > >>>>> "T" == TEI meiki <tei / harmony.co.jp> writes: > T> またまた Ruby/Tk で助けて下さい。 > T> Sun Solaris 2.5.1 の CDE 環境では、フォント名に > T> -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-* > T> などという途中にスペースを含んだ名前が標準で使われています。 > > あちゃ〜. > tkfont.rb を書いてた時は,この case については頭にありませんでした. > 対策をちょいと考えてみますが,今,忙しいので時間がかかるかもしれません. > 応急としては,問題となっている tk_split_list(str) を > tk_split_simplelist(str) に置き換えて試してみていただけませんか. だめでした。 考えた挙げ句、Tcl/Tk(私は Tk4 しかしらないのですが) の configure の 帰り値は、外側の 1レベルのブレースは、リスト構造をくくり、 さらにその内側のブレースは、文字リテラルだろうと決めうちして tk.rb の tk_split_list(str) を、ブレースをどこまでリスト構造と扱うかの 上限値の引数を追加してみました。 --- tk.rb-org Tue Sep 1 15:50:29 1998 +++ tk.rb Mon Oct 19 12:45:09 1998 @@ -62,6 +62,8 @@ when /^\./ Tk_WINDOWS[val] ? Tk_WINDOWS[val] : _genobj_for_tkwidget(val) when / / + # これは必要か??? + # 上で if val.include? ?\s しているから不要のような気がするが? val.split.collect{|elt| tk_tcl2ruby(elt) } @@ -72,6 +74,8 @@ end end +if nil +# 以下 tk_split_list(str) オリジナルコード def tk_split_list(str) return [] if str == "" idx = str.index('{') @@ -96,6 +100,43 @@ list += tk_split_list(str[i+1..-1]) list end +end + +# 以下 tk_split_list(str) テストコード + def tk_split_list(str, maxnest = nil, nest = 0) + str = str.strip + return [] if str == "" + result = [] + while str.length > 0 + if str[0] == ?{ then + i = 0 + brace = 1 + str[1..-1].each_byte {|c| + i += 1 + brace += 1 if c == ?{ + brace -= 1 if c == ?} + break if brace == 0 + } + result << str[0..i-1] # 先頭の '{' はまだ残しておく。 + str = str[i+1..-1].strip + else + i = str.index(" ") || str.length + result << str[0,i] + str = str[i+1..-1].strip + end + end + result.collect{ |element| + if element[0] == ?{ then + if ! maxnest || maxnest > nest then + tk_split_list( element[1..-1], maxnest, nest+1 ) + else + (element == "{") ? [] : element[1..-1] + end + else + tk_tcl2ruby(element) + end + } + end def tk_split_simplelist(str) return [] if str == "" そして、tkfont.rb の init_widget_font を以下のようにしてみました。 --- tkfont.rb-org Tue Sep 1 15:50:29 1998 +++ tkfont.rb Tue Oct 20 05:55:47 1998 @@ -64,7 +64,7 @@ def TkFont.init_widget_font(path, *args) case (Tk::TK_VERSION) when /^4\.*/ - conf = tk_split_list(tk_call(*args)) + conf = tk_split_list(tk_call(*args),1) if font_inf = conf.assoc('-font') ltn = font_inf[4] ltn = nil if ltn == [] @@ -81,7 +81,7 @@ TkFont.new(ltn, knj).call_font_configure(path, *(args + [{}])) when /^8\.*/ - conf = tk_split_list(tk_call(*args)) + conf = tk_split_list(tk_call(*args),1) unless font_inf = conf.assoc('-font') raise RuntimeError, "unknown option '-font'" end とりあえずこれでなんとなく動いているのですが、、ほんとうにこれで いいのでしょうか? (^_^;; ところで、このあいだも書きましたけど tk.rb の TkObject#method_missing で、 def method_missing(id, *args) name = id.id2name case args.length when 1 configure name, args[0] self # これを追加 when 0 fail NameError, "undefined local variable or method `#{name}' for #{self.to_s}", error_at else fail NameError, "undefined method `#{name}' for #{self.to_s}", error_at end end と、self を返すようにすると便利な気がするのですが、だめでしょうか? >まつもとさん、その他 tk*.rb の関係者のみなさん。 -- ┌─鄭 明毅───────────────────┐ └──tei / harmony.co.jp──tei@mirage.linc.or.jp─┘