gettext 3.4.4 → 3.4.6

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 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