Module: RubyGettextExtractor::ExtractorMethods

Included in:
Extractor18, Extractor19
Defined in:
lib/gettext_i18n_rails/ruby_gettext_extractor.rb

Instance Method Summary collapse

Instance Method Details

#extract_key(args, seperator) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/gettext_i18n_rails/ruby_gettext_extractor.rb', line 72

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



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/gettext_i18n_rails/ruby_gettext_extractor.rb', line 53

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 == :+

    first_part = extract_string(recv)
    second_part = extract_string(args)

    return nil unless first_part && second_part
    return first_part.to_s + second_part.to_s
  else
    return nil
  end
end

#initialize(filename, targets) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/gettext_i18n_rails/ruby_gettext_extractor.rb', line 28

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

#new_call(recv, meth, args = nil) ⇒ Object



102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/gettext_i18n_rails/ruby_gettext_extractor.rb', line 102

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



44
45
46
47
48
49
50
51
# File 'lib/gettext_i18n_rails/ruby_gettext_extractor.rb', line 44

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