gettext 3.4.4 → 3.4.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '08ec1d309ee833a5038abf2d2e442006d05be64ac85d270a5ebc0f975049e156'
4
- data.tar.gz: ab50d773df116c00aa0b02ef6d13dfb5f375e481cbaafef29a6415c9892f4949
3
+ metadata.gz: 623479874c1f5d1800b18fc285df714bdb8bc48b63f55547e634506ac89a5b4f
4
+ data.tar.gz: b11c495203dc16e9668430a70f35ba93abe5126db80dbf04c773b72a609b34c8
5
5
  SHA512:
6
- metadata.gz: '0590096a216d72fc22176eab9b266c8acecce48375dc123f53cdc64f606d4310061f2d794ad011daaab5574e3f70654580e6c085f3d865eaa4f7acd9fd283636'
7
- data.tar.gz: 31d4038bdd98dfbb04c7d62c31099645cdd053341a1b2ef532cf46473352de8278aef615d47ca8c23d00047479a578a8c47e42715c2788ece1d0b52f8c235e36
6
+ metadata.gz: 9b6b842173b961104f45a2a5bc2dc6c1924d012aed19c114d748f8d85c94ae3510b4b7cf8db18a8df7790b19e57ab08b5ff2b7a5bc1ef50509f250a73cbcfce1
7
+ data.tar.gz: 480d5730ff338bc4bb4a1045df02fd0adfeef8cdc468e1c53977751917a243172f7b97e58b363175fe0566658c04a4c27db8282f0afc4707e1daf091419c47b4
data/doc/text/news.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # News
2
2
 
3
+ ## 3.4.6: 2023-07-12 {#version-3-4-6}
4
+
5
+ ### Fixes
6
+
7
+ * po: Fixed a bug that parsed `msgid`/`msgstr`/`msgctxt` in `.po`
8
+ may be too much unescaped.
9
+
10
+ ## 3.4.5: 2023-07-12 {#version-3-4-5}
11
+
12
+ ### Improvements
13
+
14
+ * po: Added support for escaping `\r` in `msgid`/`msgstr`.
15
+
3
16
  ## 3.4.4: 2023-06-11 {#version-3-4-4}
4
17
 
5
18
  ### Improvements
@@ -241,11 +241,12 @@ module GetText
241
241
  def escape(string)
242
242
  return "" if string.nil?
243
243
 
244
- string.gsub(/([\\"\t\n])/) do
245
- special_character = $1
244
+ string.gsub(/[\\"\t\r\n]/) do |special_character|
246
245
  case special_character
247
246
  when "\t"
248
247
  "\\t"
248
+ when "\r"
249
+ "\\r"
249
250
  when "\n"
250
251
  "\\n"
251
252
  else
@@ -8,7 +8,7 @@
8
8
 
9
9
  #
10
10
  # DO NOT MODIFY!!!!
11
- # This file is automatically generated by Racc 1.7.0
11
+ # This file is automatically generated by Racc 1.7.1
12
12
  # from Racc grammar file "".
13
13
  #
14
14
 
@@ -19,7 +19,7 @@ require "gettext/po"
19
19
  module GetText
20
20
  class POParser < Racc::Parser
21
21
 
22
- module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 123)
22
+ module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 122)
23
23
  if GetText.respond_to?(:bindtextdomain)
24
24
  include GetText
25
25
  GetText.bindtextdomain("gettext")
@@ -44,20 +44,23 @@ module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 123)
44
44
  @report_warning
45
45
  end
46
46
 
47
- def unescape(orig)
48
- ret = orig.gsub(/\\n/, "\n")
49
- ret.gsub!(/\\t/, "\t")
50
- ret.gsub!(/\\r/, "\r")
51
- ret.gsub!(/\\"/, "\"")
52
- ret
47
+ def unescape(string)
48
+ string.gsub(/\\(.)/) do
49
+ escaped_character = $1
50
+ case escaped_character
51
+ when "t"
52
+ "\t"
53
+ when "r"
54
+ "\r"
55
+ when "n"
56
+ "\n"
57
+ else
58
+ escaped_character
59
+ end
60
+ end
53
61
  end
54
62
  private :unescape
55
63
 
56
- def unescape_string(string)
57
- string.gsub(/\\\\/, "\\")
58
- end
59
- private :unescape_string
60
-
61
64
  def parse(str, data)
62
65
  @translator_comments = []
63
66
  @extracted_comments = []
@@ -102,7 +105,7 @@ module_eval(<<'...end po_parser.ry/module_eval...', 'po_parser.ry', 123)
102
105
  @q.push [:COMMENT, $&]
103
106
  str = $'
104
107
  when /\A\"(.*)\"/
105
- @q.push [:STRING, unescape_string($1)]
108
+ @q.push [:STRING, unescape($1)]
106
109
  str = $'
107
110
  else
108
111
  #c = str[0,1]
@@ -387,7 +390,7 @@ Racc_debug_parser = true
387
390
 
388
391
  module_eval(<<'.,.,', 'po_parser.ry', 26)
389
392
  def _reduce_5(val, _values, result)
390
- @msgctxt = unescape(val[1])
393
+ @msgctxt = val[1]
391
394
 
392
395
  result
393
396
  end
@@ -399,9 +402,8 @@ module_eval(<<'.,.,', 'po_parser.ry', 26)
399
402
 
400
403
  module_eval(<<'.,.,', 'po_parser.ry', 38)
401
404
  def _reduce_8(val, _values, result)
402
- msgid_raw = val[1]
403
- msgid = unescape(msgid_raw)
404
- msgstr = unescape(val[3])
405
+ msgid = val[1]
406
+ msgstr = val[3]
405
407
  use_message_p = true
406
408
  if @fuzzy and not msgid.empty?
407
409
  use_message_p = (not ignore_fuzzy?)
@@ -411,7 +413,7 @@ module_eval(<<'.,.,', 'po_parser.ry', 38)
411
413
  else
412
414
  $stderr.print _("Warning: fuzzy message was used.\n")
413
415
  end
414
- $stderr.print " #{@po_file}: msgid '#{msgid_raw}'\n"
416
+ $stderr.print " #{@po_file}: msgid '#{msgid}'\n"
415
417
  end
416
418
  end
417
419
  @fuzzy = false
@@ -422,7 +424,7 @@ module_eval(<<'.,.,', 'po_parser.ry', 38)
422
424
  end
423
425
  .,.,
424
426
 
425
- module_eval(<<'.,.,', 'po_parser.ry', 61)
427
+ module_eval(<<'.,.,', 'po_parser.ry', 60)
426
428
  def _reduce_9(val, _values, result)
427
429
  if @fuzzy and ignore_fuzzy?
428
430
  if val[1] != ""
@@ -444,7 +446,7 @@ module_eval(<<'.,.,', 'po_parser.ry', 61)
444
446
  end
445
447
  .,.,
446
448
 
447
- module_eval(<<'.,.,', 'po_parser.ry', 82)
449
+ module_eval(<<'.,.,', 'po_parser.ry', 81)
448
450
  def _reduce_10(val, _values, result)
449
451
  if val[0].size > 0
450
452
  result = val[0] + "\000" + val[1]
@@ -458,7 +460,7 @@ module_eval(<<'.,.,', 'po_parser.ry', 82)
458
460
 
459
461
  # reduce 11 omitted
460
462
 
461
- module_eval(<<'.,.,', 'po_parser.ry', 94)
463
+ module_eval(<<'.,.,', 'po_parser.ry', 93)
462
464
  def _reduce_12(val, _values, result)
463
465
  result = val[2]
464
466
 
@@ -466,7 +468,7 @@ module_eval(<<'.,.,', 'po_parser.ry', 94)
466
468
  end
467
469
  .,.,
468
470
 
469
- module_eval(<<'.,.,', 'po_parser.ry', 101)
471
+ module_eval(<<'.,.,', 'po_parser.ry', 100)
470
472
  def _reduce_13(val, _values, result)
471
473
  on_comment(val[0])
472
474
 
@@ -474,7 +476,7 @@ module_eval(<<'.,.,', 'po_parser.ry', 101)
474
476
  end
475
477
  .,.,
476
478
 
477
- module_eval(<<'.,.,', 'po_parser.ry', 109)
479
+ module_eval(<<'.,.,', 'po_parser.ry', 108)
478
480
  def _reduce_14(val, _values, result)
479
481
  result = val.delete_if{|item| item == ""}.join
480
482
 
@@ -482,7 +484,7 @@ module_eval(<<'.,.,', 'po_parser.ry', 109)
482
484
  end
483
485
  .,.,
484
486
 
485
- module_eval(<<'.,.,', 'po_parser.ry', 113)
487
+ module_eval(<<'.,.,', 'po_parser.ry', 112)
486
488
  def _reduce_15(val, _values, result)
487
489
  result = val[0]
488
490
 
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  version - version information of gettext
3
3
 
4
- Copyright (C) 2012-2022 Sutou Kouhei <kou@clear-code.com>
4
+ Copyright (C) 2012-2023 Sutou Kouhei <kou@clear-code.com>
5
5
  Copyright (C) 2005-2009 Masao Mutoh
6
6
 
7
7
  You may redistribute it and/or modify it under the same
@@ -9,5 +9,5 @@
9
9
  =end
10
10
 
11
11
  module GetText
12
- VERSION = "3.4.4"
12
+ VERSION = "3.4.6"
13
13
  end
data/po/gettext.pot CHANGED
@@ -6,10 +6,10 @@
6
6
  #, fuzzy
7
7
  msgid ""
8
8
  msgstr ""
9
- "Project-Id-Version: gettext 3.4.4\n"
9
+ "Project-Id-Version: gettext 3.4.6\n"
10
10
  "Report-Msgid-Bugs-To: \n"
11
- "POT-Creation-Date: 2023-06-11 06:21+0900\n"
12
- "PO-Revision-Date: 2023-06-11 06:21+0900\n"
11
+ "POT-Creation-Date: 2023-07-12 10:23+0900\n"
12
+ "PO-Revision-Date: 2023-07-12 10:23+0900\n"
13
13
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
14
  "Language-Team: LANGUAGE <LL@li.org>\n"
15
15
  "Language: \n"
data/src/po_parser.ry CHANGED
@@ -24,7 +24,7 @@ class GetText::POParser
24
24
  msgctxt
25
25
  : MSGCTXT string_list
26
26
  {
27
- @msgctxt = unescape(val[1])
27
+ @msgctxt = val[1]
28
28
  }
29
29
  ;
30
30
 
@@ -36,9 +36,8 @@ class GetText::POParser
36
36
  single_message
37
37
  : MSGID string_list MSGSTR string_list
38
38
  {
39
- msgid_raw = val[1]
40
- msgid = unescape(msgid_raw)
41
- msgstr = unescape(val[3])
39
+ msgid = val[1]
40
+ msgstr = val[3]
42
41
  use_message_p = true
43
42
  if @fuzzy and not msgid.empty?
44
43
  use_message_p = (not ignore_fuzzy?)
@@ -48,7 +47,7 @@ class GetText::POParser
48
47
  else
49
48
  $stderr.print _("Warning: fuzzy message was used.\n")
50
49
  end
51
- $stderr.print " #{@po_file}: msgid '#{msgid_raw}'\n"
50
+ $stderr.print " #{@po_file}: msgid '#{msgid}'\n"
52
51
  end
53
52
  end
54
53
  @fuzzy = false
@@ -144,20 +143,23 @@ require "gettext/po"
144
143
  @report_warning
145
144
  end
146
145
 
147
- def unescape(orig)
148
- ret = orig.gsub(/\\n/, "\n")
149
- ret.gsub!(/\\t/, "\t")
150
- ret.gsub!(/\\r/, "\r")
151
- ret.gsub!(/\\"/, "\"")
152
- ret
146
+ def unescape(string)
147
+ string.gsub(/\\(.)/) do
148
+ escaped_character = $1
149
+ case escaped_character
150
+ when "t"
151
+ "\t"
152
+ when "r"
153
+ "\r"
154
+ when "n"
155
+ "\n"
156
+ else
157
+ escaped_character
158
+ end
159
+ end
153
160
  end
154
161
  private :unescape
155
162
 
156
- def unescape_string(string)
157
- string.gsub(/\\\\/, "\\")
158
- end
159
- private :unescape_string
160
-
161
163
  def parse(str, data)
162
164
  @translator_comments = []
163
165
  @extracted_comments = []
@@ -202,7 +204,7 @@ require "gettext/po"
202
204
  @q.push [:COMMENT, $&]
203
205
  str = $'
204
206
  when /\A\"(.*)\"/
205
- @q.push [:STRING, unescape_string($1)]
207
+ @q.push [:STRING, unescape($1)]
206
208
  str = $'
207
209
  else
208
210
  #c = str[0,1]
@@ -233,13 +233,15 @@ EOE
233
233
  class TestEscape < self
234
234
  def test_normal
235
235
  entry = GetText::POEntry.new(:normal)
236
- entry.msgid = "He said \"hello.\""
237
- entry.msgstr = "Il a dit \"bonjour.\""
236
+ entry.msgid = "He said \"hello.\"\r\n"
237
+ entry.msgstr = "Il a dit \"bonjour.\"\r\n"
238
238
  entry.references = ["file1:1", "file2:10"]
239
239
  expected_po = <<-EOE
240
240
  #: file1:1 file2:10
241
- msgid "He said \\"hello.\\""
242
- msgstr "Il a dit \\"bonjour.\\""
241
+ msgid ""
242
+ "He said \\"hello.\\"\\r\\n"
243
+ msgstr ""
244
+ "Il a dit \\"bonjour.\\"\\r\\n"
243
245
  EOE
244
246
  assert_equal(expected_po, entry.to_s)
245
247
  end
@@ -62,6 +62,16 @@ EOP
62
62
  class TestPO < self
63
63
  include Helper::Warning
64
64
 
65
+ def test_msgid_escape
66
+ po_file = create_po_file(<<-'EOP')
67
+ msgid "\\\\r \\r \t \r \n"
68
+ msgstr "\\\\r \\r \t \r \n"
69
+ EOP
70
+ entries = parse_po_file(po_file)
71
+ assert_equal("\\\\r \\r \t \r \n",
72
+ entries["\\\\r \\r \t \r \n"].msgstr)
73
+ end
74
+
65
75
  def test_msgstr
66
76
  po_file = create_po_file(<<-EOP)
67
77
  # This is the comment.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gettext
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.4
4
+ version: 3.4.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kouhei Sutou
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-06-10 00:00:00.000000000 Z
12
+ date: 2023-07-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: erubi