image

  • フォト Amazonギフト券
    ※この時計の時刻は、閲覧しているパソコンのものであり、必ずしも正確な時間とは限りません

検索

最近のトラックバック

無料ブログはココログ

« ピックアップ: パックマンがプレイできるFirefox拡張, 優秀なプログラマの8つの条件, etc... | トップページ | ピックアップ:バージョン管理のできるオンラインエディタ, masuidrive的プロジェクトの方針, etc... »

2007-07-13

xfy/xvcd の言語リソース編集ツールが欲しい (その3.8)

orderedhash (順番を保持する Hash)をつかって
xfy/xvcd のリソースファイルファイルを 独自の管理用ファイル形式にマージ
する変換処理 (ruby スクリプト) を書き直した。

1. orderdhash.rb
2. langs2res.rb

管理用ファイルは xml 形式だが、さらに csv との相互変換をつくれば。
Excel などで編集/閲覧をすることも可能になるなぁ。
OpenOffice で編集できるようにするのも良いかも。
xfy と OpenOffice を上手に組み合わせて使うことを考えていくべきかもしれない。
あるいは、リソースを DB に格納するというアプローチもありかもしれない。

1. orderdhash.rb

# See - http://rubyist.g.hatena.ne.jp/onishi/comment?date=20060519
#     - http://blog.kks-online.net/archives/2006/06/ruby_1.html

class OrderedHash < Hash
  def initialize
    @keyodrer = []
    super
  end

  def keys
    @keyodrer
  end

  def values
    # @keyodrer.collect{|k| self[k]}
    self.values_at(*@keyodrer)
  end

  def []=(_key, _value)
    @keyodrer << _key unless @keyodrer.include?(_key)
    super(_key, _value)
  end

  def delete(_key)
    @keyodrer.delete(_key)
    super(_key)
  end

  def each
    @keyodrer.each{|k|
      yield(k, self[k])
    }
  end
end
#--- End of File ---

2. langs2res.rb

# usage: $ ruby langs2res.rb init a.xml -ja ja/*.resource -en en/*.resource
#        output marged data to a.xml

require 'rubygems'
require 'builder'
require 'xmlsimple'
require 'orderedhash'
require 'pp'

def usage(str)
  puts str
  puts "usage: ruby lang2res.rb [init|import] res.xml [-ja|-en] foo.xml ... "
  puts "   ex: ruby lang2res.rb init res.xml -ja ja/*.resource -en/*.resousrce"
  abort
end

def readLangResource(cats, lang, f)
  doc = XmlSimple.xml_in File.open(f)
  cat = File.basename(f, ".resource")

  cats[cat] = OrderedHash.new if cats[cat] == nil
  doc["string-resource"].each {|m|
    name = m["name"]
    val = m["content"]

    cats[cat][name] = Array.new  if cats[cat][name] == nil
    cats[cat][name].push({:lang=>lang, :message=>val})
  }
end

def doImport(res, cats, ja, en)
  ja.each {|j|
    readLangResource(cats, 'ja', j)
  }

  en.each {|e|
    readLangResource(cats, 'en', e)
  }

  writeRes(res, cats)
end

def writeRes(res, cats)
  str = ""
  xm = Builder::XmlMarkup.new(:indent=>2, :target=>str)
  xm.instruct!
  xm.instruct!("com.xfy vocabulary-connection", :href=>"resedit.xvcd")
  xm.tag!('r:categories', 'xmlns:r'=>'http://xmlns.example.com/developer/tutorial/resedit') {
    cats.each {|cat, label|
      xm.tag!('r:category', :name=>cat) {
        label.each {|id, array|
          xm.tag!('r:item', {:id=>id}) {
            array.each {|m|
              xm.tag!('r:message', {:lang=>m[:lang]}, m[:message])
            }
          }
        }
      }
    }
  }
  str.gsub!(/(¥&#)([[:xdigit:]]+);/){[$2.to_i].pack("U")}
  File::open(res, "w") {|f|
    f.write str   
  }
end

#==========================================
command = ARGV.shift

outRes = ARGV.shift
ja = Array.new
en = Array.new
lang = ""

while arg = ARGV.shift
  case arg
  when "-ja"
    lang = arg
  when "-en"
    lang = arg
  else
    ja << arg if lang == "-ja"
    en << arg if lang == "-en"
  end
end

case command
  when "init"
    cats = OrderedHash.new
    doImport(outRes, cats, ja, en)
  when "import"
    cats = readResource(outRes)  #  not yet implemented
    doImport(outRes, cats, ja, en)
  else
    usage("illegal argument #{command}")
end
#--- End of File ---

« ピックアップ: パックマンがプレイできるFirefox拡張, 優秀なプログラマの8つの条件, etc... | トップページ | ピックアップ:バージョン管理のできるオンラインエディタ, masuidrive的プロジェクトの方針, etc... »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/184434/15741237

この記事へのトラックバック一覧です: xfy/xvcd の言語リソース編集ツールが欲しい (その3.8):

« ピックアップ: パックマンがプレイできるFirefox拡張, 優秀なプログラマの8つの条件, etc... | トップページ | ピックアップ:バージョン管理のできるオンラインエディタ, masuidrive的プロジェクトの方針, etc... »

mokuji

2013年12月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

google

  • twitter
  • __
  • _
    Googleボットチェッカー

合わせて読む

  • 合わせて読む
    フィードメーター - katoy: cocolog あわせて読みたい

リンク