gettext 3.2.9 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +276 -198
- data/Rakefile +2 -1
- data/doc/text/news.md +43 -0
- data/gettext.gemspec +3 -2
- data/lib/gettext/locale_path.rb +5 -1
- data/lib/gettext/po.rb +4 -4
- data/lib/gettext/po_entry.rb +17 -7
- data/lib/gettext/text_domain.rb +1 -1
- data/lib/gettext/tools/parser/ruby.rb +238 -224
- data/lib/gettext/version.rb +2 -2
- data/po/bg/gettext.edit.po +10 -4
- data/po/bg/gettext.po +5 -0
- data/po/bs/gettext.edit.po +10 -4
- data/po/bs/gettext.po +5 -0
- data/po/ca/gettext.edit.po +10 -4
- data/po/ca/gettext.po +5 -0
- data/po/cs/gettext.edit.po +10 -4
- data/po/cs/gettext.po +5 -0
- data/po/de/gettext.edit.po +10 -4
- data/po/de/gettext.po +5 -0
- data/po/el/gettext.edit.po +10 -4
- data/po/el/gettext.po +5 -0
- data/po/eo/gettext.edit.po +10 -4
- data/po/eo/gettext.po +5 -0
- data/po/es/gettext.edit.po +10 -4
- data/po/es/gettext.po +5 -0
- data/po/et/gettext.edit.po +10 -4
- data/po/et/gettext.po +5 -0
- data/po/fr/gettext.edit.po +10 -4
- data/po/fr/gettext.po +5 -0
- data/po/gettext.pot +32 -25
- data/po/hr/gettext.edit.po +10 -4
- data/po/hr/gettext.po +5 -0
- data/po/hu/gettext.edit.po +10 -4
- data/po/hu/gettext.po +5 -0
- data/po/it/gettext.edit.po +10 -4
- data/po/it/gettext.po +5 -0
- data/po/ja/gettext.edit.po +10 -4
- data/po/ja/gettext.po +5 -0
- data/po/ko/gettext.edit.po +10 -4
- data/po/ko/gettext.po +5 -0
- data/po/lv/gettext.edit.po +10 -4
- data/po/lv/gettext.po +5 -0
- data/po/nb/gettext.edit.po +10 -4
- data/po/nb/gettext.po +5 -0
- data/po/nl/gettext.edit.po +10 -4
- data/po/nl/gettext.po +5 -0
- data/po/pt_BR/gettext.edit.po +10 -4
- data/po/pt_BR/gettext.po +5 -0
- data/po/ru/gettext.edit.po +10 -4
- data/po/ru/gettext.po +5 -0
- data/po/sr/gettext.edit.po +10 -4
- data/po/sr/gettext.po +5 -0
- data/po/sv/gettext.edit.po +10 -4
- data/po/sv/gettext.po +5 -0
- data/po/uk/gettext.edit.po +10 -4
- data/po/uk/gettext.po +5 -0
- data/po/vi/gettext.edit.po +10 -4
- data/po/vi/gettext.po +5 -0
- data/po/zh/gettext.edit.po +10 -4
- data/po/zh/gettext.po +5 -0
- data/po/zh_TW/gettext.edit.po +10 -4
- data/po/zh_TW/gettext.po +5 -0
- data/samples/cgi/po/helloerb1.pot +3 -3
- data/samples/cgi/po/helloerb2.pot +3 -3
- data/samples/cgi/po/hellolib.pot +3 -3
- data/samples/cgi/po/main.pot +3 -3
- data/samples/po/hello.pot +3 -3
- data/samples/po/hello2.pot +4 -4
- data/samples/po/hello_glade2.pot +4 -4
- data/samples/po/hello_gtk2.pot +4 -4
- data/samples/po/hello_gtk_builder.pot +4 -5
- data/samples/po/hello_noop.pot +4 -4
- data/samples/po/hello_plural.pot +4 -4
- data/samples/po/hello_tk.pot +4 -4
- data/test/fixtures/_.rb +9 -0
- data/test/fixtures/erb/non_ascii.rhtml +1 -0
- data/test/gettext-test-utils.rb +10 -3
- data/test/locale/fr/LC_MESSAGES/plural_error.mo +0 -0
- data/test/locale/ja/LC_MESSAGES/_.mo +0 -0
- data/test/po/_.pot +8 -4
- data/test/po/backslash.pot +6 -4
- data/test/po/fr/plural_error.po +7 -0
- data/test/po/hello.pot +3 -3
- data/test/po/ja/_.edit.po +6 -2
- data/test/po/ja/_.po +5 -2
- data/test/po/ja/hello.edit.po +0 -1
- data/test/po/non_ascii.pot +4 -4
- data/test/po/np_.pot +8 -5
- data/test/po/ns_.pot +6 -4
- data/test/po/p_.pot +3 -3
- data/test/po/s_.pot +6 -4
- data/test/po/untranslated.pot +4 -4
- data/test/test_class_info.rb +8 -9
- data/test/test_gettext.rb +7 -1
- data/test/test_parser.rb +1 -1
- data/test/test_po_entry.rb +1 -13
- data/test/test_po_parser.rb +6 -4
- data/test/test_string.rb +9 -5
- data/test/tools/test_msgmerge.rb +5 -2
- data/test/tools/test_xgettext.rb +5 -1
- metadata +17 -18
- data/lib/gettext/tools/parser/haml.rb +0 -61
data/Rakefile
CHANGED
|
@@ -49,7 +49,8 @@ end
|
|
|
49
49
|
|
|
50
50
|
po_parser_ry_path = "src/po_parser.ry"
|
|
51
51
|
file po_parser_rb_path => po_parser_ry_path do
|
|
52
|
-
|
|
52
|
+
racc_spec = Gem::Specification.find_by_name("racc")
|
|
53
|
+
racc = File.join(racc_spec.bin_dir, racc_spec.executable)
|
|
53
54
|
tempfile = Tempfile.new("gettext-po-parser")
|
|
54
55
|
ruby(racc, "-g", po_parser_ry_path, "-o", tempfile.path)
|
|
55
56
|
|
data/doc/text/news.md
CHANGED
|
@@ -1,5 +1,48 @@
|
|
|
1
1
|
# News
|
|
2
2
|
|
|
3
|
+
## 3.3.0: 2020-01-08 {#version-3-3-0}
|
|
4
|
+
|
|
5
|
+
### Improvements
|
|
6
|
+
|
|
7
|
+
* Fixed README markup.
|
|
8
|
+
[GitHub#57][Patch by Alexander Paukste]
|
|
9
|
+
|
|
10
|
+
* Suppressed warnings.
|
|
11
|
+
[GitHub#58][Patch by 284km]
|
|
12
|
+
|
|
13
|
+
* Improved README.
|
|
14
|
+
[GitHub#62][Patch by Robert Graff]
|
|
15
|
+
|
|
16
|
+
* Added support for finding `racc` of Ruby 2.7.
|
|
17
|
+
[GitHub#65][Patch by KITAITI Makoto]
|
|
18
|
+
|
|
19
|
+
* Added support for Ruby 2.7.
|
|
20
|
+
[GitHub#64][Reported by Anatol Pomozov]
|
|
21
|
+
|
|
22
|
+
* Dropped support for Ruby 2.4.
|
|
23
|
+
|
|
24
|
+
### Fixes
|
|
25
|
+
|
|
26
|
+
* Fixed a bug that `n_` may return nil.
|
|
27
|
+
[GitHub#60][Patch by Michaël Hoste]
|
|
28
|
+
|
|
29
|
+
* Fixed a sort by msgid bug.
|
|
30
|
+
[GitHub#61][Patch by Robert Graff]
|
|
31
|
+
|
|
32
|
+
### Thanks
|
|
33
|
+
|
|
34
|
+
* Alexander Paukste
|
|
35
|
+
|
|
36
|
+
* 284km
|
|
37
|
+
|
|
38
|
+
* Michaël Hoste
|
|
39
|
+
|
|
40
|
+
* Robert Graff
|
|
41
|
+
|
|
42
|
+
* KITAITI Makoto
|
|
43
|
+
|
|
44
|
+
* Anatol Pomozov
|
|
45
|
+
|
|
3
46
|
## 3.2.9: 2018-03-05 {#version-3-2-9}
|
|
4
47
|
|
|
5
48
|
### Fixes
|
data/gettext.gemspec
CHANGED
|
@@ -15,8 +15,7 @@ So you can use GNU gettext tools for maintaining.
|
|
|
15
15
|
EOD
|
|
16
16
|
s.authors = ["Kouhei Sutou", "Masao Mutoh"]
|
|
17
17
|
s.email = ["kou@clear-code.com", "mutomasa at gmail.com"]
|
|
18
|
-
s.homepage = "
|
|
19
|
-
s.rubyforge_project = "gettext"
|
|
18
|
+
s.homepage = "https://ruby-gettext.github.io/"
|
|
20
19
|
s.require_paths = ["lib"]
|
|
21
20
|
Dir.chdir(base_dir) do
|
|
22
21
|
s.files = Dir.glob("{locale,bin,data,doc/text,lib,po,samples,src,test}/**/*")
|
|
@@ -28,6 +27,8 @@ So you can use GNU gettext tools for maintaining.
|
|
|
28
27
|
s.test_files = Dir.glob("test/test_*.rb")
|
|
29
28
|
end
|
|
30
29
|
|
|
30
|
+
s.required_ruby_version = ">= 2.5.0"
|
|
31
|
+
|
|
31
32
|
s.add_runtime_dependency("locale", ">= 2.0.5")
|
|
32
33
|
s.add_runtime_dependency("text", ">= 1.3.0")
|
|
33
34
|
s.add_development_dependency("rake")
|
data/lib/gettext/locale_path.rb
CHANGED
|
@@ -85,7 +85,11 @@ module GetText
|
|
|
85
85
|
this_path_rules = rule % {:lang => "([^\/]+)", :name => name}
|
|
86
86
|
Dir.glob(rule % {:lang => "*", :name => name}).each do |path|
|
|
87
87
|
if /#{this_path_rules}/ =~ path
|
|
88
|
-
|
|
88
|
+
locale_path = $1
|
|
89
|
+
unless @locale_paths[locale_path]
|
|
90
|
+
path.untaint if RUBY_VERSION < "2.7"
|
|
91
|
+
@locale_paths[locale_path] = path
|
|
92
|
+
end
|
|
89
93
|
end
|
|
90
94
|
end
|
|
91
95
|
end
|
data/lib/gettext/po.rb
CHANGED
|
@@ -222,11 +222,11 @@ module GetText
|
|
|
222
222
|
def sort(entries)
|
|
223
223
|
case @order
|
|
224
224
|
when :reference, :references # :references is deprecated.
|
|
225
|
-
|
|
225
|
+
sort_by_reference(entries)
|
|
226
226
|
when :msgid
|
|
227
|
-
|
|
227
|
+
sort_by_msgid(entries)
|
|
228
228
|
else
|
|
229
|
-
|
|
229
|
+
entries.to_a
|
|
230
230
|
end
|
|
231
231
|
end
|
|
232
232
|
|
|
@@ -268,7 +268,7 @@ module GetText
|
|
|
268
268
|
def sort_by_msgid(entries)
|
|
269
269
|
entries.sort_by do |msgid_entry|
|
|
270
270
|
# msgid_entry = [[msgctxt, msgid], POEntry]
|
|
271
|
-
msgid_entry[0]
|
|
271
|
+
msgid_entry[0][1]
|
|
272
272
|
end
|
|
273
273
|
end
|
|
274
274
|
end
|
data/lib/gettext/po_entry.rb
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
#
|
|
2
|
-
#
|
|
3
|
-
# Copyright (C) 2012-2017 Kouhei Sutou <kou@clear-code.com>
|
|
1
|
+
# Copyright (C) 2012-2019 Sutou Kouhei <kou@clear-code.com>
|
|
4
2
|
# Copyright (C) 2010 masone (Christian Felder) <ema@rh-productions.ch>
|
|
5
3
|
# Copyright (C) 2009 Masao Mutoh
|
|
6
4
|
#
|
|
@@ -210,13 +208,25 @@ module GetText
|
|
|
210
208
|
true
|
|
211
209
|
end
|
|
212
210
|
|
|
213
|
-
def [](
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
211
|
+
def [](number_or_param)
|
|
212
|
+
__send__(resolve_param(number_or_param))
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
def []=(number_or_param, value)
|
|
216
|
+
__send__("#{resolve_param(number_or_param)}=", value)
|
|
217
217
|
end
|
|
218
218
|
|
|
219
219
|
private
|
|
220
|
+
def resolve_param(number_or_param)
|
|
221
|
+
case number_or_param
|
|
222
|
+
when Integer
|
|
223
|
+
param = @param_type[number_or_param]
|
|
224
|
+
raise ParseError, 'no more string parameters expected' unless param
|
|
225
|
+
param
|
|
226
|
+
else
|
|
227
|
+
number_or_param
|
|
228
|
+
end
|
|
229
|
+
end
|
|
220
230
|
|
|
221
231
|
# sets or extends the value of a translation target params like msgid,
|
|
222
232
|
# msgctxt etc.
|
data/lib/gettext/text_domain.rb
CHANGED
|
@@ -124,7 +124,7 @@ module GetText
|
|
|
124
124
|
# [[msgstr[0], msgstr[1], msgstr[2],...], cond]
|
|
125
125
|
mo = @mofiles[lang.to_s]
|
|
126
126
|
cond = (mo and mo != :empty) ? mo.plural_as_proc : DEFAULT_PLURAL_CALC
|
|
127
|
-
ret = [msg.split("\000"), cond]
|
|
127
|
+
ret = [msg.split("\000", -1), cond]
|
|
128
128
|
else
|
|
129
129
|
ret = [[msg], DEFAULT_SINGLE_CALC]
|
|
130
130
|
end
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
=begin
|
|
3
2
|
parser/ruby.rb - parser for ruby script
|
|
4
3
|
|
|
5
|
-
Copyright (C) 2013-
|
|
4
|
+
Copyright (C) 2013-2019 Sutou Kouhei <kou@clear-code.com>
|
|
6
5
|
Copyright (C) 2003-2009 Masao Mutoh
|
|
7
6
|
Copyright (C) 2005 speakillof
|
|
8
7
|
Copyright (C) 2001,2002 Yasushi Shoji, Masao Mutoh
|
|
@@ -12,162 +11,271 @@
|
|
|
12
11
|
|
|
13
12
|
=end
|
|
14
13
|
|
|
15
|
-
require "
|
|
14
|
+
require "ripper"
|
|
16
15
|
require "stringio"
|
|
17
|
-
require "gettext/po_entry"
|
|
18
16
|
|
|
19
|
-
require "
|
|
17
|
+
require "gettext/po_entry"
|
|
20
18
|
|
|
21
19
|
module GetText
|
|
22
|
-
class
|
|
23
|
-
class
|
|
20
|
+
class RubyParser
|
|
21
|
+
class POExtractor < Ripper::Filter
|
|
22
|
+
ID = ["gettext", "_", "N_", "sgettext", "s_"]
|
|
23
|
+
PLURAL_ID = ["ngettext", "n_", "Nn_", "ns_", "nsgettext"]
|
|
24
|
+
MSGCTXT_ID = ["pgettext", "p_"]
|
|
25
|
+
MSGCTXT_PLURAL_ID = ["npgettext", "np_"]
|
|
26
|
+
|
|
27
|
+
attr_accessor :use_comment
|
|
28
|
+
attr_accessor :comment_tag
|
|
24
29
|
def initialize(*args)
|
|
25
|
-
super
|
|
30
|
+
super(*args)
|
|
31
|
+
@in_block_arguments = false
|
|
32
|
+
@ignore_next_comma = false
|
|
33
|
+
@context_stack = []
|
|
34
|
+
@need_definition_name = false
|
|
35
|
+
@current_po_entry = nil
|
|
36
|
+
@current_po_entry_nth_attribute = 0
|
|
37
|
+
@use_comment = false
|
|
38
|
+
@comment_tag = nil
|
|
39
|
+
@last_comment = ""
|
|
40
|
+
@reset_comment = false
|
|
41
|
+
@embed_expression_level = 0
|
|
26
42
|
@string_mark_stack = []
|
|
43
|
+
@string_stack = []
|
|
27
44
|
end
|
|
28
45
|
|
|
29
|
-
def
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
else
|
|
46
|
-
data
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
else
|
|
50
|
-
output << token.gsub(/\\./) do |data|
|
|
51
|
-
case data
|
|
52
|
-
when "\\\\"
|
|
53
|
-
"\\"
|
|
54
|
-
when "\\'"
|
|
55
|
-
"'"
|
|
56
|
-
else
|
|
57
|
-
data
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
when :on_tstring_beg
|
|
62
|
-
unless @string_mark_stack.empty?
|
|
63
|
-
output << token
|
|
64
|
-
end
|
|
65
|
-
@string_mark_stack << token
|
|
66
|
-
when :on_tstring_end
|
|
67
|
-
@string_mark_stack.pop
|
|
68
|
-
unless @string_mark_stack.empty?
|
|
69
|
-
output << token
|
|
46
|
+
def process_on_op(token, po)
|
|
47
|
+
@in_block_arguments = !@in_block_arguments if token == "|"
|
|
48
|
+
po
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def process_on_kw(token, po)
|
|
52
|
+
store_po_entry(po)
|
|
53
|
+
case token
|
|
54
|
+
when "begin", "case", "do", "for"
|
|
55
|
+
@context_stack.push(token)
|
|
56
|
+
when "class", "def", "module"
|
|
57
|
+
@context_stack.push(token)
|
|
58
|
+
when "if", "unless", "until", "while"
|
|
59
|
+
# postfix case
|
|
60
|
+
unless state.allbits?(Ripper::EXPR_LABEL)
|
|
61
|
+
@context_stack.push(token)
|
|
70
62
|
end
|
|
63
|
+
when "end"
|
|
64
|
+
@context_stack.pop
|
|
65
|
+
end
|
|
66
|
+
po
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def process_on_ident(token, po)
|
|
70
|
+
if @embed_expression_level > 0
|
|
71
|
+
@string_stack.last << token
|
|
72
|
+
return po
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
store_po_entry(po)
|
|
76
|
+
|
|
77
|
+
return po if @in_block_arguments
|
|
78
|
+
return po if state.allbits?(Ripper::EXPR_ENDFN)
|
|
79
|
+
|
|
80
|
+
case token
|
|
81
|
+
when *ID
|
|
82
|
+
@current_po_entry = POEntry.new(:normal)
|
|
83
|
+
when *PLURAL_ID
|
|
84
|
+
@current_po_entry = POEntry.new(:plural)
|
|
85
|
+
when *MSGCTXT_ID
|
|
86
|
+
@current_po_entry = POEntry.new(:msgctxt)
|
|
87
|
+
when *MSGCTXT_PLURAL_ID
|
|
88
|
+
@current_po_entry = POEntry.new(:msgctxt_plural)
|
|
89
|
+
end
|
|
90
|
+
if @current_po_entry
|
|
91
|
+
@current_po_entry.add_comment(@last_comment) unless @last_comment.empty?
|
|
92
|
+
@last_comment = ""
|
|
93
|
+
@current_po_entry.references << "#{filename}:#{lineno}"
|
|
94
|
+
@current_po_entry_nth_attribute = 0
|
|
95
|
+
end
|
|
96
|
+
po
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def process_on_const(token, po)
|
|
100
|
+
case token
|
|
101
|
+
when "N_"," Nn_"
|
|
102
|
+
# TODO: Check the next token is :on_lparen
|
|
103
|
+
process_on_ident(token, po)
|
|
71
104
|
else
|
|
72
|
-
|
|
73
|
-
output << token.to_s
|
|
74
|
-
end
|
|
105
|
+
po
|
|
75
106
|
end
|
|
76
|
-
output
|
|
77
107
|
end
|
|
78
|
-
end
|
|
79
108
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
@
|
|
109
|
+
def process_on_comment(token, po)
|
|
110
|
+
@last_comment = "" if @reset_comment
|
|
111
|
+
@reset_comment = false
|
|
112
|
+
if @last_comment.empty?
|
|
113
|
+
content = token.gsub(/\A#\s*/, "").chomp
|
|
114
|
+
if comment_to_be_extracted?(content)
|
|
115
|
+
@last_comment << content
|
|
87
116
|
end
|
|
117
|
+
else
|
|
118
|
+
content = token.gsub(/\A#/, "").chomp
|
|
119
|
+
@last_comment << "\n"
|
|
120
|
+
@last_comment << content
|
|
121
|
+
end
|
|
122
|
+
po
|
|
123
|
+
end
|
|
88
124
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
125
|
+
def process_on_sp(token, po)
|
|
126
|
+
po
|
|
127
|
+
end
|
|
92
128
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
129
|
+
def process_on_tstring_beg(token, po)
|
|
130
|
+
@string_mark_stack << token
|
|
131
|
+
@string_stack << ""
|
|
132
|
+
po
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def process_on_tstring_content(token, po)
|
|
136
|
+
if @string_mark_stack.last == "\""
|
|
137
|
+
@string_stack.last << token.gsub(/\\./) do |data|
|
|
138
|
+
case data
|
|
139
|
+
when "\\n"
|
|
140
|
+
"\n"
|
|
141
|
+
when "\\t"
|
|
142
|
+
"\t"
|
|
143
|
+
when "\\\\"
|
|
144
|
+
"\\"
|
|
145
|
+
when "\\\""
|
|
146
|
+
"\""
|
|
147
|
+
when "\\\#"
|
|
148
|
+
"#"
|
|
149
|
+
else
|
|
150
|
+
data
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
else
|
|
154
|
+
@string_stack.last << token.gsub(/\\./) do |data|
|
|
155
|
+
case data
|
|
156
|
+
when "\\\\"
|
|
157
|
+
"\\"
|
|
158
|
+
when "\\'"
|
|
159
|
+
"'"
|
|
160
|
+
else
|
|
161
|
+
data
|
|
162
|
+
end
|
|
97
163
|
end
|
|
164
|
+
end
|
|
165
|
+
po
|
|
166
|
+
end
|
|
98
167
|
|
|
99
|
-
|
|
168
|
+
def process_on_tstring_end(token, po)
|
|
169
|
+
@ignore_next_comma = false
|
|
170
|
+
@string_mark_stack.pop
|
|
171
|
+
last_string = @string_stack.pop
|
|
172
|
+
if @current_po_entry and last_string
|
|
173
|
+
@current_po_entry[@current_po_entry_nth_attribute] =
|
|
174
|
+
(@current_po_entry[@current_po_entry_nth_attribute] || "") +
|
|
175
|
+
last_string
|
|
100
176
|
end
|
|
177
|
+
po
|
|
178
|
+
end
|
|
101
179
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
else
|
|
108
|
-
$stderr.puts(tk)
|
|
109
|
-
end
|
|
180
|
+
def process_on_heredoc_beg(token, po)
|
|
181
|
+
if token.end_with?("'")
|
|
182
|
+
@string_mark_stack << "'"
|
|
183
|
+
else
|
|
184
|
+
@string_mark_stack << "\""
|
|
110
185
|
end
|
|
186
|
+
@string_stack << ""
|
|
187
|
+
po
|
|
188
|
+
end
|
|
111
189
|
|
|
112
|
-
|
|
190
|
+
def process_on_heredoc_end(token, po)
|
|
191
|
+
process_on_tstring_end(token, po)
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def process_on_regexp_beg(token, po)
|
|
195
|
+
@string_mark_stack << "\""
|
|
196
|
+
@string_stack << ""
|
|
197
|
+
po
|
|
113
198
|
end
|
|
114
|
-
return nil
|
|
115
|
-
end
|
|
116
199
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
200
|
+
def process_on_embexpr_beg(token, po)
|
|
201
|
+
@embed_expression_level += 1
|
|
202
|
+
@string_stack.last << token
|
|
203
|
+
po
|
|
204
|
+
end
|
|
121
205
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
206
|
+
def process_on_embexpr_end(token, po)
|
|
207
|
+
@embed_expression_level -= 1
|
|
208
|
+
@string_stack.last << token
|
|
209
|
+
po
|
|
210
|
+
end
|
|
125
211
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
212
|
+
def process_on_regexp_end(token, po)
|
|
213
|
+
@string_mark_stack.pop
|
|
214
|
+
@string_stack.pop
|
|
215
|
+
po
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def process_on_int(token, po)
|
|
219
|
+
@ignore_next_comma = true
|
|
220
|
+
po
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def process_on_comma(token, po)
|
|
224
|
+
unless @ignore_next_comma
|
|
225
|
+
if @current_po_entry
|
|
226
|
+
@current_po_entry_nth_attribute += 1
|
|
227
|
+
end
|
|
131
228
|
end
|
|
229
|
+
po
|
|
132
230
|
end
|
|
133
|
-
return Token(TkCOMMENT_WITH_CONTENT, get_readed)
|
|
134
|
-
end
|
|
135
231
|
|
|
136
|
-
|
|
232
|
+
def process_on_rparen(token, po)
|
|
233
|
+
store_po_entry(po)
|
|
234
|
+
po
|
|
235
|
+
end
|
|
137
236
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
def set_current_attribute(str)
|
|
143
|
-
param = @param_type[@param_number]
|
|
144
|
-
raise ParseError, "no more string parameters expected" unless param
|
|
145
|
-
set_value(param, str)
|
|
146
|
-
end
|
|
237
|
+
def process_on_nl(token, po)
|
|
238
|
+
@reset_comment = true
|
|
239
|
+
po
|
|
240
|
+
end
|
|
147
241
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
242
|
+
def on_default(event, token, po)
|
|
243
|
+
trace(event, token) do
|
|
244
|
+
process_method = "process_#{event}"
|
|
245
|
+
if respond_to?(process_method)
|
|
246
|
+
__send__(process_method, token, po)
|
|
247
|
+
else
|
|
248
|
+
po
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
end
|
|
152
252
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
include POEntryForRubyParser
|
|
159
|
-
alias :initialize_old :initialize
|
|
160
|
-
def initialize(type)
|
|
161
|
-
initialize_old(type)
|
|
162
|
-
init_param
|
|
163
|
-
end
|
|
164
|
-
end
|
|
253
|
+
private
|
|
254
|
+
@@debug = ENV["GETTEXT_RUBY_PARSER_DEBUG"]
|
|
255
|
+
def debug?
|
|
256
|
+
@@debug
|
|
257
|
+
end
|
|
165
258
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
259
|
+
def trace(event_name, token)
|
|
260
|
+
pp [event_name, token, state, @context_stack.last] if debug?
|
|
261
|
+
yield
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
def store_po_entry(po)
|
|
265
|
+
return if @current_po_entry.nil?
|
|
266
|
+
po << @current_po_entry if @current_po_entry.msgid
|
|
267
|
+
@current_po_entry = nil
|
|
268
|
+
@current_po_entry_nth_attribute = 0
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
def comment_to_be_extracted?(comment)
|
|
272
|
+
return false unless @use_comment
|
|
273
|
+
|
|
274
|
+
return true if @comment_tag.nil?
|
|
275
|
+
|
|
276
|
+
comment.start_with?(@comment_tag)
|
|
277
|
+
end
|
|
278
|
+
end
|
|
171
279
|
|
|
172
280
|
class << self
|
|
173
281
|
def target?(file) # :nodoc:
|
|
@@ -282,106 +390,12 @@ module GetText
|
|
|
282
390
|
end
|
|
283
391
|
|
|
284
392
|
def parse_source(source)
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
rl.skip_space = true
|
|
290
|
-
#rl.readed_auto_clean_up = true
|
|
291
|
-
|
|
292
|
-
po_entry = nil
|
|
293
|
-
line_no = nil
|
|
294
|
-
last_comment = ""
|
|
295
|
-
reset_comment = false
|
|
296
|
-
ignore_next_comma = false
|
|
297
|
-
rl.parse do |tk|
|
|
298
|
-
begin
|
|
299
|
-
ignore_current_comma = ignore_next_comma
|
|
300
|
-
ignore_next_comma = false
|
|
301
|
-
case tk
|
|
302
|
-
when RubyToken::TkIDENTIFIER, RubyToken::TkCONSTANT
|
|
303
|
-
if store_po_entry(po, po_entry, line_no, last_comment)
|
|
304
|
-
last_comment = ""
|
|
305
|
-
end
|
|
306
|
-
if ID.include?(tk.name)
|
|
307
|
-
po_entry = POEntry.new(:normal)
|
|
308
|
-
elsif PLURAL_ID.include?(tk.name)
|
|
309
|
-
po_entry = POEntry.new(:plural)
|
|
310
|
-
elsif MSGCTXT_ID.include?(tk.name)
|
|
311
|
-
po_entry = POEntry.new(:msgctxt)
|
|
312
|
-
elsif MSGCTXT_PLURAL_ID.include?(tk.name)
|
|
313
|
-
po_entry = POEntry.new(:msgctxt_plural)
|
|
314
|
-
else
|
|
315
|
-
po_entry = nil
|
|
316
|
-
end
|
|
317
|
-
line_no = tk.line_no.to_s
|
|
318
|
-
when RubyToken::TkBITOR
|
|
319
|
-
po_entry = nil
|
|
320
|
-
when RubyToken::TkSTRING, RubyToken::TkDSTRING
|
|
321
|
-
po_entry.set_current_attribute tk.value if po_entry
|
|
322
|
-
when RubyToken::TkPLUS, RubyToken::TkNL
|
|
323
|
-
#do nothing
|
|
324
|
-
when RubyToken::TkINTEGER
|
|
325
|
-
ignore_next_comma = true
|
|
326
|
-
when RubyToken::TkCOMMA
|
|
327
|
-
unless ignore_current_comma
|
|
328
|
-
po_entry.advance_to_next_attribute if po_entry
|
|
329
|
-
end
|
|
330
|
-
else
|
|
331
|
-
if store_po_entry(po, po_entry, line_no, last_comment)
|
|
332
|
-
po_entry = nil
|
|
333
|
-
last_comment = ""
|
|
334
|
-
end
|
|
335
|
-
end
|
|
336
|
-
rescue
|
|
337
|
-
$stderr.print "\n\nError"
|
|
338
|
-
$stderr.print " parsing #{@path}:#{tk.line_no}\n\t #{source.lines.to_a[tk.line_no - 1]}" if tk
|
|
339
|
-
$stderr.print "\n #{$!.inspect} in\n"
|
|
340
|
-
$stderr.print $!.backtrace.join("\n")
|
|
341
|
-
$stderr.print "\n"
|
|
342
|
-
exit 1
|
|
343
|
-
end
|
|
344
|
-
|
|
345
|
-
case tk
|
|
346
|
-
when RubyToken::TkCOMMENT_WITH_CONTENT
|
|
347
|
-
last_comment = "" if reset_comment
|
|
348
|
-
if last_comment.empty?
|
|
349
|
-
comment1 = tk.value.lstrip
|
|
350
|
-
if comment_to_be_extracted?(comment1)
|
|
351
|
-
last_comment += comment1
|
|
352
|
-
end
|
|
353
|
-
else
|
|
354
|
-
last_comment += "\n"
|
|
355
|
-
last_comment += tk.value
|
|
356
|
-
end
|
|
357
|
-
reset_comment = false
|
|
358
|
-
when RubyToken::TkNL
|
|
359
|
-
else
|
|
360
|
-
reset_comment = true
|
|
361
|
-
end
|
|
362
|
-
end
|
|
363
|
-
po
|
|
364
|
-
end
|
|
365
|
-
|
|
366
|
-
private
|
|
367
|
-
def store_po_entry(po, po_entry, line_no, last_comment) #:nodoc:
|
|
368
|
-
if po_entry && po_entry.msgid
|
|
369
|
-
po_entry.references << @path + ":" + line_no
|
|
370
|
-
po_entry.add_comment(last_comment) unless last_comment.empty?
|
|
371
|
-
po << po_entry
|
|
372
|
-
true
|
|
373
|
-
else
|
|
374
|
-
false
|
|
393
|
+
extractor = POExtractor.new(source, @path)
|
|
394
|
+
if @options.key?(:comment_tag)
|
|
395
|
+
extractor.use_comment = true
|
|
396
|
+
extractor.comment_tag = @options[:comment_tag]
|
|
375
397
|
end
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
def comment_to_be_extracted?(comment)
|
|
379
|
-
return false unless @options.has_key?(:comment_tag)
|
|
380
|
-
|
|
381
|
-
tag = @options[:comment_tag]
|
|
382
|
-
return true if tag.nil?
|
|
383
|
-
|
|
384
|
-
/\A#{Regexp.escape(tag)}/ === comment
|
|
398
|
+
extractor.parse([])
|
|
385
399
|
end
|
|
386
400
|
end
|
|
387
401
|
end
|