Skip to content

Commit 97f714e

Browse files
committed
po-parser: fix a bug that fuzzy flags may be added to unrelated entry
If we parse the following PO with ignore_fuzzy: true, "non-fuzzy" entry has "fuzzy" flag that was added to "hello" entry: #, fuzzy #: file.rb:10 msgid "hello" msgstr "bonjour" msgid "non-fuzzy" msgstr "non-fuzzy string"
1 parent aa6fefe commit 97f714e

File tree

3 files changed

+76
-49
lines changed

3 files changed

+76
-49
lines changed

lib/gettext/po_parser.rb

+26-26
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
module GetText
2020
class POParser < Racc::Parser
2121

22-
module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 122)
22+
module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 126)
2323
if GetText.respond_to?(:bindtextdomain)
2424
include GetText
2525
GetText.bindtextdomain("gettext")
@@ -62,16 +62,8 @@ def unescape(string)
6262
private :unescape
6363
6464
def parse(str, data)
65-
@translator_comments = []
66-
@extracted_comments = []
67-
@references = []
68-
@flags = []
69-
@previous = []
70-
@comments = []
65+
clear
7166
@data = data
72-
@fuzzy = false
73-
@msgctxt = nil
74-
@msgid_plural = nil
7567
7668
str = str.strip
7769
@q = []
@@ -157,15 +149,7 @@ def on_message(msgid, msgstr)
157149
@data.set_comment(msgid, format_comment(@comments))
158150
end
159151
160-
@translator_comments = []
161-
@extracted_comments = []
162-
@references = []
163-
@flags = []
164-
@previous = []
165-
@references = []
166-
@comments.clear
167-
@msgctxt = nil
168-
@msgid_plural = nil
152+
clear
169153
end
170154
171155
def format_comment(comments)
@@ -263,6 +247,18 @@ def parse_references_line(line)
263247
def parse_flags_line(line)
264248
line.split(/\s+/)
265249
end
250+
251+
def clear
252+
@translator_comments = []
253+
@extracted_comments = []
254+
@references = []
255+
@flags = []
256+
@previous = []
257+
@references = []
258+
@comments = []
259+
@msgctxt = nil
260+
@msgid_plural = nil
261+
end
266262
...end po_parser.ry/module_eval...
267263
##### State transition tables begin ###
268264

@@ -417,14 +413,18 @@ def _reduce_8(val, _values, result)
417413
end
418414
end
419415
@fuzzy = false
420-
on_message(msgid, msgstr) if use_message_p
416+
if use_message_p
417+
on_message(msgid, msgstr)
418+
else
419+
clear
420+
end
421421
result = ""
422422
423423
result
424424
end
425425
.,.,
426426

427-
module_eval(<<'.,.,', 'po_parser.ry', 60)
427+
module_eval(<<'.,.,', 'po_parser.ry', 64)
428428
def _reduce_9(val, _values, result)
429429
if @fuzzy and ignore_fuzzy?
430430
if val[1] != ""
@@ -446,7 +446,7 @@ def _reduce_9(val, _values, result)
446446
end
447447
.,.,
448448

449-
module_eval(<<'.,.,', 'po_parser.ry', 81)
449+
module_eval(<<'.,.,', 'po_parser.ry', 85)
450450
def _reduce_10(val, _values, result)
451451
if val[0].size > 0
452452
result = val[0] + "\000" + val[1]
@@ -460,31 +460,31 @@ def _reduce_10(val, _values, result)
460460

461461
# reduce 11 omitted
462462

463-
module_eval(<<'.,.,', 'po_parser.ry', 93)
463+
module_eval(<<'.,.,', 'po_parser.ry', 97)
464464
def _reduce_12(val, _values, result)
465465
result = val[2]
466466
467467
result
468468
end
469469
.,.,
470470

471-
module_eval(<<'.,.,', 'po_parser.ry', 100)
471+
module_eval(<<'.,.,', 'po_parser.ry', 104)
472472
def _reduce_13(val, _values, result)
473473
on_comment(val[0])
474474
475475
result
476476
end
477477
.,.,
478478

479-
module_eval(<<'.,.,', 'po_parser.ry', 108)
479+
module_eval(<<'.,.,', 'po_parser.ry', 112)
480480
def _reduce_14(val, _values, result)
481481
result = val.delete_if{|item| item == ""}.join
482482
483483
result
484484
end
485485
.,.,
486486

487-
module_eval(<<'.,.,', 'po_parser.ry', 112)
487+
module_eval(<<'.,.,', 'po_parser.ry', 116)
488488
def _reduce_15(val, _values, result)
489489
result = val[0]
490490

src/po_parser.ry

+22-22
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
#
33
# po_parser.ry - ruby version of msgfmt
44
#
5-
# Copyright (C) 2002-2008 Masao Mutoh <mutomasa at gmail.com>
6-
# Copyright (C) 2012-2017 Kouhei Sutou <[email protected]>
7-
# Copyright (C) 2012-2013 Haruka Yoshihara <[email protected]>
5+
# Copyright (C) 2002-2008 Masao Mutoh <mutomasa at gmail.com>
6+
# Copyright (C) 2012-2023 Sutou Kouhei <[email protected]>
7+
# Copyright (C) 2012-2013 Haruka Yoshihara <[email protected]>
88
#
99
# You may redistribute it and/or modify it under the same
1010
# license terms as Ruby or LGPL.
@@ -51,7 +51,11 @@ class GetText::POParser
5151
end
5252
end
5353
@fuzzy = false
54-
on_message(msgid, msgstr) if use_message_p
54+
if use_message_p
55+
on_message(msgid, msgstr)
56+
else
57+
clear
58+
end
5559
result = ""
5660
}
5761

@@ -161,16 +165,8 @@ require "gettext/po"
161165
private :unescape
162166

163167
def parse(str, data)
164-
@translator_comments = []
165-
@extracted_comments = []
166-
@references = []
167-
@flags = []
168-
@previous = []
169-
@comments = []
168+
clear
170169
@data = data
171-
@fuzzy = false
172-
@msgctxt = nil
173-
@msgid_plural = nil
174170

175171
str = str.strip
176172
@q = []
@@ -256,15 +252,7 @@ require "gettext/po"
256252
@data.set_comment(msgid, format_comment(@comments))
257253
end
258254

259-
@translator_comments = []
260-
@extracted_comments = []
261-
@references = []
262-
@flags = []
263-
@previous = []
264-
@references = []
265-
@comments.clear
266-
@msgctxt = nil
267-
@msgid_plural = nil
255+
clear
268256
end
269257

270258
def format_comment(comments)
@@ -362,5 +350,17 @@ require "gettext/po"
362350
def parse_flags_line(line)
363351
line.split(/\s+/)
364352
end
353+
354+
def clear
355+
@translator_comments = []
356+
@extracted_comments = []
357+
@references = []
358+
@flags = []
359+
@previous = []
360+
@references = []
361+
@comments = []
362+
@msgctxt = nil
363+
@msgid_plural = nil
364+
end
365365
---- footer
366366

test/test_po_parser.rb

+28-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (C) 2012-2020 Sutou Kouhei <[email protected]>
1+
# Copyright (C) 2012-2023 Sutou Kouhei <[email protected]>
22
# Copyright (C) 2012 Haruka Yoshihara <[email protected]>
33
#
44
# License: Ruby's or LGPL
@@ -238,6 +238,33 @@ def test_fuzzy
238238
assert_equal("fuzzy", entries["hello"].flag)
239239
end
240240

241+
def test_fuzzy_ignore
242+
po_file = create_po_file(<<-PO)
243+
#, fuzzy
244+
#: file.rb:10
245+
msgid "hello"
246+
msgstr "bonjour"
247+
248+
msgid "non-fuzzy"
249+
msgstr "non-fuzzy string"
250+
PO
251+
entries = suppress_warning do
252+
parse_po_file(po_file)
253+
end
254+
255+
actual = entries.collect do |entry|
256+
[
257+
entry.msgid,
258+
entry.msgstr,
259+
entry.flags,
260+
]
261+
end
262+
assert_equal([
263+
["non-fuzzy", "non-fuzzy string", []],
264+
],
265+
actual)
266+
end
267+
241268
private
242269
def parse_po_file(po_file, options={:ignore_fuzzy => true})
243270
ignore_fuzzy = options[:ignore_fuzzy]

0 commit comments

Comments
 (0)