#!/usr/bin/ruby CHARSET_AND_PROJECTS = { 'UTF-8' => /project_utf8_(A|B)/, 'MS932' => /project_ms932/, 'euc-jp' => /project_euc-jp/ } stage = nil buffer = nil prop_length = 0 content_length_stage = nil add_charset = nil charset_found = nil charset = nil $stdin.each{|line| case stage when nil if line =~ /^Node-path: / then if $' =~ %r|trunk/| then charset = nil project = $' CHARSET_AND_PROJECTS.each{|c, projects| if project =~ projects then stage = 0 buffer = [] content_length_stage = nil add_charset = false charset_found = nil charset = c break end } end end when 1 stage = nil unless line =~ /^Node-kind: file/ when 2 stage = nil unless line =~ /^Node-action: add/ when 3 stage = nil unless line =~ /^Prop-content-length: / prop_length = $'.to_i else case line when %r|^Content-length:| content_length_stage = stage when %r|^PROPS-END| before_length = prop_length if add_charset then if charset_found then old_len = buffer[charset_found + 1].length buffer[charset_found + 1].sub!(/.+/, "V #{charset.length}") prop_length += (buffer[charset_found + 1].length - old_len) old_len = buffer[charset_found + 2].length buffer[charset_found + 2].sub!(/.+/, charset) prop_length += (buffer[charset_found + 2].length - old_len) else buffer << "K 7\n" buffer << "charset\n" buffer << "V #{charset.length}\n" buffer << "#{charset}\n" prop_length += buffer[-4..-1].inject(0){|sum, item| sum + item.length} end end buffer[3].sub!(/\d+/, prop_length.to_s) if content_length_stage then buffer[content_length_stage].sub!(/\d+/){|s| (s.to_i+ (prop_length - before_length)).to_s} end stage = nil when %r|^charset| charset_found = stage add_charset = true when %r|^text/| add_charset = true end end if stage then buffer << line stage += 1 else if buffer then print buffer.join('') buffer = nil end print line end }