image

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

検索

最近のトラックバック

無料ブログはココログ

« 2007年7月9日 | トップページ | 2007年7月11日 »

2007年7月10日

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 ブースでもらった資料袋の中に
Google 姓のブックカバーが入っていることに昨日、気がついた。
もっと早くきがついていれば、もっともらっておくんだったなぁ。

イニシエーション・ラブ。
これが文庫で出ているのを知った。(4月からでていたようだが)
これは、単行本で読んだ。
あの最後ページでの "エー、騙された! なんか違和感があったんだがそういうことか!" という驚きは忘れることができない。

サマータイム。
映像が思い浮かぶ文章。
あとがきでもふれられているが、第一話の "海” のゼリーのシーンは秀逸。

夜の来訪者。
戯曲作品。 web 上のどこかのベージでの紹介ページで知った。
ある家庭の食堂だけを舞台にして描かれるミステリー。
1 人の女性の死について、6人の登場人物がどう関わっているかが明かされていく...
先日みた 映画 "キサラギ" と同じような設定と話題。
でも、味わいや雰囲気はまったく異なる。
舞台を是非 観てみたい。

ピックアップ: 【NHKニュースおはよう日本】社内SNS紹介, 「IBMのビジネス変革」について, etc...

- http://www.socialnetworking.jp/archives/2007/07/nhksns.html
> > 【NHKニュースおはよう日本】社内SNS紹介: SNS,ソーシャルネットワーキング.jp

社内掲示への書き込みも、こんな風に上手く行くとよいなぁ。

- http://blogs.itmedia.co.jp/kenjiro/2007/07/sns_4de4.html?ref=atom
> > リアル コミュニティに学ぶ企業内SNSの運営のコツ(管理組合の理事長になってしまった編) - けんじろう と コラボろう! [ITmedia オルタナティブ・ブログ]

- http://zen.seesaa.net/article/47079413.html
> > メディア・パブ: SNS利用率,日本が12ヶ国中11位と低い

- http://www.ringolab.com/note/daiya/archives/cat_software.html
> > 情報考学 Passion For The Future: Software Archives: テキストファイルを暗号化し認証機能付き実行ファイルとして保存

- http://blogs.itmedia.co.jp/mm21/2007/07/ibm_2bb9.html
> > 「IBMのビジネス変革」について、大学院でお話しする - 永井孝尚のMM21 [ITmedia オルタナティブ・ブログ]

- http://d.hatena.ne.jp/kokorosha/20070709#p1
> > ココロ社: 可愛さのあまり正気を失うフクロウ写真

- http://d.hatena.ne.jp/starocker/20070709/p1
> > sta la sta - 地球に関する驚くべき10の事実

- http://gigazine.net/index.php?/news/comments/20070709_1m_rubic/
> > 1面が1万個あるルービックキューブを4分で解くムービー - GIGAZINE

- http://www.100shiki.com/archives/2007/07/pptzentation.html
> > プレゼン映像とPPTをシンクロさせて公開できる『Zentation』 | 100SHIKI.COM

- http://blog.livedoor.jp/dankogai/archives/50868325.html
> > 404 Blog Not Found:何でも「いまやる」としてしまう人が知るべき10個の真実

« 2007年7月9日 | トップページ | 2007年7月11日 »

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 あわせて読みたい

リンク