FrontPage  Index  Search  Changes  RSS  wikifarm  Login

Replacer.rb

概要

変数名の長さを制限することによって、雛形の罫線などが崩れないように出来る雛形変換。

──────────────────────────────
(15)┌──────────────────────────┬
   │ │ │ │  │ │ │ │  │ │ │ │ │ │  │ │ │ │
  ├──┬──┬────────────────────┴
   │支払│区分│                                
   │を  ├─┬┴─────────────────────
   │受け│住│
   │    │  │東京都xx区xx町1−2−3
   │る者│所│
   ├──┴─┴──┬──────────┬────────
   │ 種  別    │支払金額        │給与控除後額  
  ├───────┼──────────┼────────
   │給料・賞与  │              12,345│              23
   ├───────┼─────┬────┴─────┬──
   │控除対象配偶者│配偶者特  │扶養親族の数        │障害
   │の有無等      │別控除額  │特定│老  人  │ 他 │特別
   ├───────┼─────┼──┼────┼──┼──
   │有 無 有 無 老│          │人従│内 人 従│人従│内 人
   │ │v│ │ │  │         0│ │ │ │ │  │ │ │ │
   ├───────┴─────┴──┴────┴──┴──
  │(摘要)

というようなテクストを

──────────────────────────────
(:Z)┌──────────────────────────┬
   │ │ │ │  │ │ │ │  │ │ │ │ │ │  │ │ │ │
   ├──┬──┬────────────────────┴
   │支払│区分│                                
   │を  ├─┬┴──────────────────────
   │受け│住│:zyuusho1--------------------------------------;│
   │    │  │:zyuusho2--------------------------------------;│
   │る者│所│:zyuusho3--------------------------------------;│
   ├──┴─┴──┬──────────┬─────────
   │ 種  別    │支払金額        │給与控除後額   
   ├───────┼──────────┼─────────
   │給料・賞与  │:siharai_kingaku###;│:kyuuyo_koujo_go###;│
   ├───────┼─────┬────┴─────┬───
   │控除対象配偶者│配偶者特  │扶養親族の数        │障害者
   │の有無等      │別控除額  │特定│老  人  │ 他 │特別│
   ├───────┼─────┼──┼────┼──┼──┴
   │有 無 有 無 老│          │人従│内 人 従│人従│内 人
   │:│:│:│:│: │:hai_kou#;│:│:│:│:│
   ├───────┴─────┴──┴────┴──┴───
  │(摘要)

と言うような雛形とハッシュデータから作成する。

puts Replacer.make(form,hash)

テキストの雛形からハッシュの雛形を作成するには form_to_hash。

require "Hash_tree"
#フォームからハッシュの雛形を取り出す。
puts Replacer.form_to_hash(form).tree

依存性

  1. Linux でも Windowsでもつかえます。
  1. String_comma.rb
  2. Hash_tree.rb

利用者


コメントがありましたらどうぞ

(comment plugin is disabled).

説明


ソース:

Replacer.rb

#! ruby -Ks
#-- Replacer.rb
#-- Replacer.pi

# 基本型(表示領域が3文字以上の場合)は
# 「:aaa;」「:aaa----;」など。「:」+「小文字・数字のid名」+「付加記号」+「;」。
# 2文字の場合は
# 「:A」など。「:」+「大文字1文字のid名」。位置決めなし、2文字分の文字列を入れること。
# 1文字の場合は
# 「:」で現れた順番の数値がハッシュの中の数値キーに対応する。
#
# 「:」を文書中で使いたい場合には、第3引数で別の記号を指定すること。
# (そうしないと、誤動作するか、消えてしまうか、例外を生成する)
#
# 「不可記号」の意味は
# "-" 右詰め
# "+" 左詰め
# "*" センタリング
# "#" コンマ付き右詰め
# 基本的に位置決めのみ。コンマ付きにする場合にはあらかじめ付けておく。

##require "comma"
require "String_comma"

class Replacer
  attr :form, true
  attr :hash, true
  attr :mark, true

  def initialize(form=nil,hash={},mark=":")
    @form = form
    @hash = hash
    @mark = mark
  end

  def self.make(form,hash,mark=":")
    ret = form.
      gsub(/#{mark}([a-z_\d]+)(\-*;)/){ hash[$1.intern].to_s.ljust( ($1+$2).size+1) }.
      gsub(/#{mark}([a-z_\d]+)(\+*;)/){ hash[$1.intern].to_s.rjust( ($1+$2).size+1) }.
      gsub(/#{mark}([a-z_\d]+)(\**;)/){ hash[$1.intern].to_s.center(($1+$2).size+1) }.
      gsub(/#{mark}([a-z_\d]+)(\#*;)/){ hash[$1.intern].to_i.to_s.comma.rjust(($1+$2).size+1) }.
      gsub(/#{mark}([A-Z])/){   (hash[$1.intern] || "  ").to_s }
    100.times{|n|
      return ret unless ret.sub!(/#{mark}/){ (hash[n] || " ").to_s.center(1) }
    }
    raise "too many(=100) '#{mark}'s, or hash includes '#{mark}'"
  end

  def make(form=@form,hash=@hash,mark=@mark)
    self.class.make(form,hash,mark)
  end

  def form_to_hash
    raise unless form
    ret = {}
    str = form.
      gsub(/\:([a-z_\d]+)(\-*;)/){ ret[$1.intern] = hash[$1.intern] }.
      gsub(/\:([a-z_\d]+)(\+*;)/){ ret[$1.intern] = hash[$1.intern] }.
      gsub(/\:([a-z_\d]+)(\**;)/){ ret[$1.intern] = hash[$1.intern] }.
      gsub(/\:([a-z_\d]+)(\#*;)/){ ret[$1.intern] = hash[$1.intern] }.
      gsub(/\:([A-Z])/){ ret[$1.intern] = hash[$1.intern] }
    100.times{|n|
      return ret unless str.sub!(/#{mark}/){ ret[n] = hash[n] }
    }
    ret
  end

  def self.form_to_hash(form,hash={})
    self.new(form,hash).form_to_hash
  end

end

if __FILE__ == $0

form = <<MMMM
─────────────────────────────────────────────────────────┼─
(:Z)┌──────────────────────────┬─────┬───────────┬────────┐│
   │ │ │ │  │ │ │ │  │ │ │ │ │ │  │ │ │ │        │                    │              ││
   ├──┬──┬────────────────────┴──┬─┬┴───────────┴────────┤│
   │支払│区分│                                  │ │                                         ││
   │を  ├─┬┴───────────────────────┤氏├─────────────────────┤│
   │受け│住│:zyuusho1--------------------------------------;│  │:simei_hurigana--------------------------;││
   │    │  │:zyuusho2--------------------------------------;│名├─────────────────────┤│
   │る者│所│:zyuusho3--------------------------------------;│  │:simei_kanji-----------------------------;││
   ├──┴─┴──┬──────────┬──────────┼─┴─────────┬───────────┤│
   │ 種  別    │支払金額        │給与控除後額    │所得控除合計     │源泉徴収税額      ││
  ├───────┼──────────┼──────────┼───────────┼───────────┤│
   │給料・賞与  │:siharai_kingaku###;│:kyuuyo_koujo_go###;│:syotoku_koujo_go####;│:gensen_tyoushuu#####;││
   ├───────┼─────┬────┴─────┬────┼─────┬─────┼─────┬─────┤│
   │控除対象配偶者│配偶者特  │扶養親族の数        │障害者数│社会保険料│生命保険料│損害保険料│住宅取得等││
   │の有無等      │別控除額  │特定│老  人  │ 他 │特別│他│等の金額  │の控除額  │の控除額  │特別控除額││
   ├───────┼─────┼──┼────┼──┼──┴─┼─────┼─────┼─────┼─────┤│
   │有 無 有 無 老│          │人従│内 人 従│人従│内 人 人│  千  円 │   千  円 │   千  円 │   千  円 ││
   │:│:│:│:│: │:hai_kou#;│:│:│:│:│ :│:│:│:│:│: │:syaho###;│:seiho###;│:sonpo###;│:zyuu####;││
   ├───────┴─────┴──┴────┴──┴────┴─────┼─────┴─────┼─────┤│
  │(摘要)                                                       │配偶者の合計所得   │:hai_syo#;││
  │                                                                      ├───────────┼─────┤│
  │                                                         │個人年金保険料の金額  │:nenkin##;││
  │                                    ├───────────┼─────┤│
  │ :kikan--------------------------------------------------------------;│長期損害保険料の金額  │:tyouki##;││
   ├─┬─┬─┬───┬─┬─┬─┬─┬─┬─┬─┬─┬─────────┼───────────┴─────┤│
  │夫│未│乙│障 害 │老│寡│婦│寡│勤│死│災│外│中途就・退職   │  受 給 者 生 年 月 日   ││
  │あ│成│欄├─┬─┤年│一│特│夫│労│亡│害│国├─┬─┬─┬─┬─┼─┬─┬─┬─┬──┬──┬───┤│
  │り│年│  │特│他│  │般│別│  │学│退│者│人│就│退│年│月│日│明│大│昭│平│  年│  月│  日  ││
   ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼──┼──┼───┤│
  │:A│:B│:C│:D│:E│:F│:G│:H│:I│:J│:K│:L│:M│:N│:O│:P│:Q│:R│:S│:T│:U│:V│:a-;│:b-;│:c-;  ││
   ├─┼─┴─┼─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴──┴──┴───┤│
  │支│住所  │ :zimusyo_zyuusyo---------------------------------------------------------------------------;││
  │払├───┼───────────────────────────────────────────────┤│
  │者│氏名  │ :zimusyo_mei-------------------------------------------------------------------------------;││
  └─┴───┴───────────────────────────────────────────────┘│
                                                                                                                 │
                                                                                                                 │
─────────────────────────────────────────────────────────┼─
MMMM

hash = {
:zyuusho1 => "",
:zyuusho2 => "東京都xx区xx町1−2−3",
:zyuusho3 => nil,
:simei_hurigana => "たけ てぃーけー",
:simei_kanji => "たけ(tk)",
:siharai_kingaku=>12345,
:kyuuyo_koujo_go=>23456,
:syotoku_koujo_go=>34567,
:gensen_tyoushuu=>45678,
1 => "v",  # 控除対象配偶者の有無等、有
:hai_kou => 0,
:syaho=>67890,
:seiho=>78901,
:sonpo=>89012,
:zyuu=>90123,
:hai_syo=>123456,
:nenkin=>234567,
:kikan => "2004/01/01-2004/12/31",
##:tyouki
#### 
##:A
##:B
##:C
##:D
##:E
##:F
##:G
##:H
##:I
##:J
##:K
##:L
##:M
##:N
##:O
##:P
##:Q
##:R
##:S
##:T
:U => " v",
##:V
:a => "12",
:b => "11",
:c => "10",
:zimusyo_zyuusyo => "xx区xx町2−3−4 xxビル7階",
:zimusyo_mei => "xxxx事務所",
:Z => 15
}


 #フォームからハッシュの雛形を取り出す。
#require "Hash_tree"
#puts Replacer.form_to_hash(form).tree
#raise

#replacer = Replacer.new(form)
#require "Hash_tree"
#puts replacer.form_to_hash.tree
#raise

#フォームからハッシュの雛形を取り出す。現在の値で。
#replacer = Replacer.new(form)
#replacer.hash = hash
#puts replacer.form_to_hash.tree
#raise

#replacer = Replacer.new(form,hash)
#puts replacer.make

puts Replacer.make(form,hash)

end

Last modified:2007/07/19 16:17:30
Keyword(s):
References: