Class: RubyGettextExtractor::Extractor
- Inherits:
-
RubyParser
- Object
- RubyParser
- RubyGettextExtractor::Extractor
- Defined in:
- lib/gettext_i18n_rails/ruby_gettext_extractor.rb
Instance Method Summary collapse
- #extract_key(args, seperator) ⇒ Object
- #extract_string(node) ⇒ Object
-
#initialize(filename, targets) ⇒ Extractor
constructor
A new instance of Extractor.
- #new_call(recv, meth, args = nil) ⇒ Object
- #run(content) ⇒ Object
Constructor Details
#initialize(filename, targets) ⇒ Extractor
Returns a new instance of Extractor.
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# 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 |
Instance Method Details
#extract_key(args, seperator) ⇒ Object
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# 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) ⇒ Object
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# 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) ⇒ Object
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
# 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) ⇒ Object
50 51 52 53 54 55 56 57 |
# 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 |