Class: GetText::RubyParser::POExtractor

Inherits:
Ripper::Filter
  • Object
show all
Defined in:
lib/gettext/tools/parser/ruby.rb

Constant Summary collapse

ID =
["gettext", "_", "N_", "sgettext", "s_"]
PLURAL_ID =
["ngettext", "n_", "Nn_", "ns_", "nsgettext"]
MSGCTXT_ID =
["pgettext", "p_"]
MSGCTXT_PLURAL_ID =
["npgettext", "np_"]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ POExtractor

Returns a new instance of POExtractor.



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/gettext/tools/parser/ruby.rb', line 29

def initialize(*args)
  super(*args)
  @start_block = false
  @in_block_arguments = false
  @ignore_next_comma = false
  @need_definition_name = false
  @current_po_entry = nil
  @current_po_entry_nth_attribute = 0
  @use_comment = false
  @comment_tag = nil
  @last_comment = ""
  @reset_comment = false
  @string_mark_stack = []
  @string_stack = []
end

Instance Attribute Details

#comment_tagObject

Returns the value of attribute comment_tag.



28
29
30
# File 'lib/gettext/tools/parser/ruby.rb', line 28

def comment_tag
  @comment_tag
end

#use_commentObject

Returns the value of attribute use_comment.



27
28
29
# File 'lib/gettext/tools/parser/ruby.rb', line 27

def use_comment
  @use_comment
end

Instance Method Details

#on_default(event, token, po) ⇒ Object



283
284
285
286
287
288
289
290
291
292
293
294
295
# File 'lib/gettext/tools/parser/ruby.rb', line 283

def on_default(event, token, po)
  trace(event, token) do
    process_method = "process_#{event}"
    start_block = @start_block
    if respond_to?(process_method)
      po = __send__(process_method, token, po)
    end
    if start_block and event != :on_sp
      @start_block = false
    end
    po
  end
end

#process_on_backtick(token, po) ⇒ Object



253
254
255
256
257
# File 'lib/gettext/tools/parser/ruby.rb', line 253

def process_on_backtick(token, po)
  @string_mark_stack << "`"
  @string_stack << ""
  po
end

#process_on_comma(token, po) ⇒ Object



226
227
228
229
230
231
232
233
# File 'lib/gettext/tools/parser/ruby.rb', line 226

def process_on_comma(token, po)
  unless @ignore_next_comma
    if @current_po_entry
      @current_po_entry_nth_attribute += 1
    end
  end
  po
end

#process_on_comment(token, po) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/gettext/tools/parser/ruby.rb', line 106

def process_on_comment(token, po)
  @last_comment = "" if @reset_comment
  @reset_comment = false
  if @last_comment.empty?
    content = token.gsub(/\A#\s*/, "").chomp
    if comment_to_be_extracted?(content)
      @last_comment << content
    end
  else
    content = token.gsub(/\A#/, "").chomp
    @last_comment << "\n"
    @last_comment << content
  end
  po
end

#process_on_const(token, po) ⇒ Object



96
97
98
99
100
101
102
103
104
# File 'lib/gettext/tools/parser/ruby.rb', line 96

def process_on_const(token, po)
  case token
  when "N_"," Nn_"
    # TODO: Check the next token is :on_lparen
    process_on_ident(token, po)
  else
    po
  end
end

#process_on_embexpr_beg(token, po) ⇒ Object



215
216
217
218
219
# File 'lib/gettext/tools/parser/ruby.rb', line 215

def process_on_embexpr_beg(token, po)
  @current_po_entry = nil
  @current_po_entry_nth_attribute = 0
  po
end

#process_on_heredoc_beg(token, po) ⇒ Object



189
190
191
192
193
194
195
196
197
# File 'lib/gettext/tools/parser/ruby.rb', line 189

def process_on_heredoc_beg(token, po)
  if token.end_with?("'")
    @string_mark_stack << "'"
  else
    @string_mark_stack << "\""
  end
  @string_stack << ""
  po
end

#process_on_heredoc_end(token, po) ⇒ Object



199
200
201
# File 'lib/gettext/tools/parser/ruby.rb', line 199

def process_on_heredoc_end(token, po)
  process_on_tstring_end(token, po)
end

#process_on_ident(token, po) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/gettext/tools/parser/ruby.rb', line 71

def process_on_ident(token, po)
  store_po_entry(po)

  return po if @in_block_arguments
  return po if state.allbits?(Ripper::EXPR_ENDFN)

  case token
  when *ID
    @current_po_entry = POEntry.new(:normal)
  when *PLURAL_ID
    @current_po_entry = POEntry.new(:plural)
  when *MSGCTXT_ID
    @current_po_entry = POEntry.new(:msgctxt)
  when *MSGCTXT_PLURAL_ID
    @current_po_entry = POEntry.new(:msgctxt_plural)
  end
  if @current_po_entry
    @current_po_entry.add_comment(@last_comment) unless @last_comment.empty?
    @last_comment = ""
    @current_po_entry.references << "#{filename}:#{lineno}"
    @current_po_entry_nth_attribute = 0
  end
  po
end

#process_on_int(token, po) ⇒ Object



221
222
223
224
# File 'lib/gettext/tools/parser/ruby.rb', line 221

def process_on_int(token, po)
  @ignore_next_comma = true
  po
end

#process_on_kw(token, po) ⇒ Object



56
57
58
59
60
61
62
63
# File 'lib/gettext/tools/parser/ruby.rb', line 56

def process_on_kw(token, po)
  store_po_entry(po)
  case token
  when "do"
    @start_block = true
  end
  po
end

#process_on_lbrace(token, po) ⇒ Object



65
66
67
68
69
# File 'lib/gettext/tools/parser/ruby.rb', line 65

def process_on_lbrace(token, po)
  store_po_entry(po)
  @start_block = (state == Ripper::EXPR_BEG)
  po
end

#process_on_nl(token, po) ⇒ Object



240
241
242
243
# File 'lib/gettext/tools/parser/ruby.rb', line 240

def process_on_nl(token, po)
  @reset_comment = true
  po
end

#process_on_op(token, po) ⇒ Object



45
46
47
48
49
50
51
52
53
54
# File 'lib/gettext/tools/parser/ruby.rb', line 45

def process_on_op(token, po)
  if @start_block
    @in_block_arguments = (token == "|")
  else
    if @in_block_arguments and token == "|"
      @in_block_arguments = false
    end
  end
  po
end

#process_on_qsymbols_beg(token, po) ⇒ Object



265
266
267
268
269
# File 'lib/gettext/tools/parser/ruby.rb', line 265

def process_on_qsymbols_beg(token, po)
  @string_mark_stack << token
  @string_stack << ""
  po
end

#process_on_qwords_beg(token, po) ⇒ Object



277
278
279
280
281
# File 'lib/gettext/tools/parser/ruby.rb', line 277

def process_on_qwords_beg(token, po)
  @string_mark_stack << token
  @string_stack << ""
  po
end

#process_on_regexp_beg(token, po) ⇒ Object



203
204
205
206
207
# File 'lib/gettext/tools/parser/ruby.rb', line 203

def process_on_regexp_beg(token, po)
  @string_mark_stack << "\""
  @string_stack << ""
  po
end

#process_on_regexp_end(token, po) ⇒ Object



209
210
211
212
213
# File 'lib/gettext/tools/parser/ruby.rb', line 209

def process_on_regexp_end(token, po)
  @string_mark_stack.pop
  @string_stack.pop
  po
end

#process_on_rparen(token, po) ⇒ Object



235
236
237
238
# File 'lib/gettext/tools/parser/ruby.rb', line 235

def process_on_rparen(token, po)
  store_po_entry(po)
  po
end

#process_on_sp(token, po) ⇒ Object



122
123
124
# File 'lib/gettext/tools/parser/ruby.rb', line 122

def process_on_sp(token, po)
  po
end

#process_on_symbeg(token, po) ⇒ Object



245
246
247
248
249
250
251
# File 'lib/gettext/tools/parser/ruby.rb', line 245

def process_on_symbeg(token, po)
  if token.start_with?("%s") or [":'", ":\""].include?(token)
    @string_mark_stack << ":"
    @string_stack << ""
  end
  po
end

#process_on_symbols_beg(token, po) ⇒ Object



259
260
261
262
263
# File 'lib/gettext/tools/parser/ruby.rb', line 259

def process_on_symbols_beg(token, po)
  @string_mark_stack << "\""
  @string_stack << ""
  po
end

#process_on_tstring_beg(token, po) ⇒ Object



126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/gettext/tools/parser/ruby.rb', line 126

def process_on_tstring_beg(token, po)
  if token.start_with?("%Q")
    @string_mark_stack << "\""
  elsif token.start_with?("%q")
    @string_mark_stack << "'"
  elsif token.start_with?("%")
    @string_mark_stack << "\""
  else
    @string_mark_stack << token
  end
  @string_stack << ""
  po
end

#process_on_tstring_content(token, po) ⇒ Object



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/gettext/tools/parser/ruby.rb', line 140

def process_on_tstring_content(token, po)
  case @string_mark_stack.last
  when "\"", "`"
    @string_stack.last << token.gsub(/\\./) do |data|
      case data
      when "\\n"
        "\n"
      when "\\t"
        "\t"
      when "\\\\"
        "\\"
      when "\\\""
        "\""
      when "\\\#"
        "#"
      else
        data
      end
    end
  else
    @string_stack.last << token.gsub(/\\./) do |data|
      case data
      when "\\\\"
        "\\"
      when "\\'"
        "'"
      else
        data
      end
    end
  end
  po
end

#process_on_tstring_end(token, po) ⇒ Object



174
175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/gettext/tools/parser/ruby.rb', line 174

def process_on_tstring_end(token, po)
  @ignore_next_comma = false
  string_mark = @string_mark_stack.pop
  case string_mark
  when "\"", "'"
    last_string = @string_stack.pop
    if @current_po_entry and last_string
      @current_po_entry[@current_po_entry_nth_attribute] =
        (@current_po_entry[@current_po_entry_nth_attribute] || "") +
        last_string
    end
  end
  po
end

#process_on_words_beg(token, po) ⇒ Object



271
272
273
274
275
# File 'lib/gettext/tools/parser/ruby.rb', line 271

def process_on_words_beg(token, po)
  @string_mark_stack << "\""
  @string_stack << ""
  po
end