class RubyGettextExtractor::Extractor
Public Class Methods
new(filename, targets)
click to toggle source
Calls superclass method
# File lib/gettext_i18n_rails/ruby_gettext_extractor.rb, line 34 def initialize(filename, targets) @filename = filename @targets = Hash.new @results = [] targets.each do |a| k, v = a # things go wrong if k already exists, but this # should not happen (according to the gettext doc) @targets[k] = a @results << a end super() end
Public Instance Methods
extract_key(args, seperator)
click to toggle source
# File lib/gettext_i18n_rails/ruby_gettext_extractor.rb, line 87 def extract_key(args, seperator) key = nil if args.size == 2 key = extract_string(args.value) else # this could be n_("aaa","aaa2",1) # all strings arguemnts are extracted and joined with \004 or \000 arguments = args[1..(-1)] res = [] arguments.each do |a| str = extract_string(a) # only add strings res << str if str end return nil if res.empty? key = res.join(seperator) end return nil unless key key.gsub!("\n", '\n') key.gsub!("\t", '\t') key.gsub!("\0", '\0') return key end
extract_string(node)
click to toggle source
# File lib/gettext_i18n_rails/ruby_gettext_extractor.rb, line 59 def extract_string(node) if node.first == :str return node.last elsif node.first == :call type, recv, meth, args = node # node has to be in form of "string"+("other_string") return nil unless recv && meth == :+ # descent recurrsivly to determine the 'receiver' of the string concatination # "foo" + "bar" + baz" is # ("foo".+("bar")).+("baz") first_part = extract_string(recv) if args.first == :arglist && args.size == 2 second_part = extract_string(args.last) return nil if second_part.nil? return first_part.to_s + second_part.to_s else raise "uuh?" end else return nil end end
new_call(recv, meth, args = nil)
click to toggle source
Calls superclass method
# File lib/gettext_i18n_rails/ruby_gettext_extractor.rb, line 117 def new_call recv, meth, args = nil # we dont care if the method is called on a a object if recv.nil? if (meth == :_ || meth == :p_ || meth == :N_ || meth == :pgettext || meth == :s_) key = extract_key(args, "\004") elsif meth == :n_ key = extract_key(args, "\000") else # skip end if key res = @targets[key] unless res res = [key] @results << res @targets[key] = res end res << "#{@filename}:#{lexer.lineno}" end end super recv, meth, args end
run(content)
click to toggle source
# File lib/gettext_i18n_rails/ruby_gettext_extractor.rb, line 50 def run(content) # ruby parser has an ugly bug which causes that several \000's take # ages to parse. This avoids this probelm by stripping them away (they probably wont appear in keys anyway) # See bug report: http://rubyforge.org/tracker/index.php?func=detail&aid=26898&group_id=439&atid=1778 safe_content = content.gsub(/\\\d\d\d/, '') self.parse(safe_content) return @results end