image

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

検索

最近のトラックバック

無料ブログはココログ

« google 製のブックカバー | トップページ | ピックアップ:Google File System(GFS)技術メモ, ページビューは死んだ!がついに現実に, etc... »

2007-07-10

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

さらにすこし変更した。

 * 管理ファイル-> xfy の resource ファイル変換 の ruby スクリプト
       (日本語が &%xxxx; になってしまっていたので修正した)
   * 管理ファイル <-xfy の resource ファイル変換 の ruby スクリプト
       (逆変換を追加)

管理ファイル-> xfy の resource ファイル変換 ===================================

$ cat res2langs.rb
# usage: $ ruby res2langs res.file
#        output to en/*.resource, ja/*.resource
require 'rubygems'
require 'builder'
require 'xmlsimple'
require 'pp'

def generate(doc)
  res = Hash.new
  doc['category'].each {|c|
    res[c['name']] = generateByCategory(c)
  }
  return res
end

def getLangs(cat)
  langs = Array.new
  cat['item'].each {|item|
    item['message'].each {|m|
      langs << m['lang']
    }
  }
  langs.uniq!
  return langs
end

def generateByCategory(cat)
  xmls = Hash.new
  langs = getLangs(cat)
  langs.each {|lang|
    xmls[lang] = generateByLang(cat, lang)
  }
  return xmls
end

def generateByLang(cat, lang)
  str = ""
  xm = Builder::XmlMarkup.new(:indent=>2, :target=>str)
  xm.instruct!
  xm.tag!('resource:resources', 'xmlns:resource'=>'http://xmlns.xfy.com/resource') {
    cat['item'].each {|item|
      item['message'].each {|m|
        if m['lang'] == lang
          xm.tag!('resource:string-resource', {:name=>item['id']}, m['content'])
        end
      }
    }
  }

  str.gsub!(/(¥&#)([[:xdigit:]]+);/){[$2.to_i].pack("U")}
  return str
end

#==========================================
doc = XmlSimple.xml_in File.open(ARGV[0])
xmls = generate(doc)

xmls.each {|cat,v|
  v.each {|lang, x|
    Dir::mkdir(lang) if !FileTest.exist?(lang)
    File::open("#{lang}/#{cat}.resource", "w") {|f|
      f.write x
    }
  }
}

管理ファイル <-xfy の resource ファイル変換
===================================

$ cat 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 'kconv'
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")

  catIndex = searchByCat(cats, cat)
  cats.push({cat=>Array.new}) if catIndex < 0
  catIndex = searchByCat(cats, cat)

  doc["string-resource"].each {|m|
    name = m["name"]
    val = m["content"]

    nameIndex = searchByName(cats[catIndex], name)
    cats[catIndex][cat].push({name=>Array.new})  if nameIndex < 0
    nameIndex = searchByName(cats[catIndex], name)
    cats[catIndex][cat][nameIndex][name].push({:lang=>lang, :message=>val})
  }
end

def searchByCat(cats, cat)
    cats.each_with_index {|v, index|
      return index  if v.key?(cat)
    }
    return -1
end

def searchByName(cat, name)
    cat.each_with_index {|v, index|      
      return index  if v==name
    }
    return -1
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|
      cat.each {|label,items|
        xm.tag!('r:category', :name=>label) {
          items.each {|item|
            item.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 = Array.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

つぎは、編集用の xvcd ファイルをきちんと作って公開しよう。
できたら、plugin 作成の ant build.xml に 管理ファイル -> リソースファイル
の変換を組み込み、開発時は、管理ファイルの編集をするだけで、言語リソース編集が済むようにしたい。

« google 製のブックカバー | トップページ | ピックアップ:Google File System(GFS)技術メモ, ページビューは死んだ!がついに現実に, etc... »

コメント

この記事へのコメントは終了しました。

トラックバック


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

« google 製のブックカバー | トップページ | ピックアップ:Google File System(GFS)技術メモ, ページビューは死んだ!がついに現実に, 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 あわせて読みたい

リンク