simple_po_parser 1.1.3 → 1.1.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
- SHA1:
3
- metadata.gz: 145b9c1db6de2e03d5eab7a4b04297cb418af047
4
- data.tar.gz: f6cbc4211bc7bb482794c7d620585f8cab1dddba
2
+ SHA256:
3
+ metadata.gz: 7b32bc4f19bd4e4967e9395bb2869e377e75f63bac97a0820ced810d03191b73
4
+ data.tar.gz: 24bb37816cc545d65b2840ad96628bc17b4f7c994eeabe8d0cb43307302c89d1
5
5
  SHA512:
6
- metadata.gz: 60479f02418e32487fa9151b8c4a44cc38e3a701174d4201d4335668e4fb08674810ad6a759e2e3aed0979e457a17ed430ea90ed12ef3386e34069539e51407f
7
- data.tar.gz: 16984994b33283f09fe363d204f7830351ccd11fe9293ab32c380c534970d7c76d4d36bc69a3fe917c788c3268aaeeef5408b7a348e0a047cfd43a3c5525ece2
6
+ metadata.gz: 7469e3b963f89d2f35a29cef3d3c7f4fe3bb0e78e9cbbad9fd6e8f9a800a44b804c1193abfefa2685027d773fdf0c86faaa6abab1d0d84df35ca068e6b0eb209
7
+ data.tar.gz: 1283c455623d2e8c387e8b57d963dffd11a244dfdd4c4049f10444c4cf1fffa3adc5c9c59b83c8c463ac0167c1bd410741a1c17bd06b70f50e7822d8e8fb3bf2
data/.gitattributes ADDED
@@ -0,0 +1 @@
1
+ spec/simple_po_parser/fixtures/crlf_encoded.po binary
data/CHANGELOG.md CHANGED
@@ -1,15 +1,35 @@
1
- Version 1.1.0
1
+ Changelog
2
2
  =============
3
3
 
4
+ ## Version 1.1.6
5
+ * fixes parsing of multiline strings that have content on the first line. Fixes issue #3, added via PR #4 by @mgruner
6
+
7
+ ## Version 1.1.5
8
+ * added support for windows CRLF line endings. Fixes issue #2
9
+ * Note: CRLF support is enabled if the first line ends in a CRLF and reduces performance by about 50%. Performance for files only using \n is not affected. Files not using \r\n in the first line but somewhere else in the file might trigger errors.
10
+
11
+ ## Version 1.1.4
12
+ * see 1.1.5. **Shouldn't be used**.
13
+
14
+ ## Version 1.1.3
15
+
16
+ * merged PR#1 from @christopherstat for UTF-8 support of legacy ruby versions
17
+
18
+ ## Version 1.1.2
19
+ * Made the parser thread-safe
20
+
21
+ ## Version 1.1.2
22
+ * Made the parser thread-safe
23
+
24
+ ## Version 1.1.0
25
+
4
26
  * for line types only parsed once the parser returns a string instead of an array with one string
5
27
 
6
- Version 1.0.1
7
- =============
28
+ ## Version 1.0.1
8
29
 
9
30
  * added specs
10
31
  * fixed minor parser errors
11
32
 
12
- Version 1.0.0
13
- =============
33
+ ## Version 1.0.0
14
34
 
15
35
  * initial release
data/Rakefile CHANGED
@@ -20,15 +20,15 @@ namespace :parser do
20
20
  require 'benchmark'
21
21
  require 'simple_po_parser'
22
22
 
23
- desc "Benchmark of 10 full PoParser runs of test/benchmark.po"
23
+ desc "Benchmark of 1000 full PoParser runs of test/benchmark.po"
24
24
  task "benchmark" do
25
25
  pofile = File.expand_path("test/benchmark.po", __dir__)
26
26
  Benchmark.bmbm do |x|
27
- x.report("Parser:") {10.times { SimplePoParser.parse(pofile) }}
27
+ x.report("Parser:") {1000.times { SimplePoParser.parse(pofile) }}
28
28
  end
29
29
  end
30
30
 
31
- desc "Generate 5 random PO files with 100 to 500 messages and benchmark each full PoParser run"
31
+ desc "Generate 5 random PO files with 1000 to 5000 messages and benchmark each full PoParser run"
32
32
  task 'five_random_po_full' do
33
33
  include Benchmark
34
34
  require_relative 'spec/utils/random_pofile_generator'
@@ -37,7 +37,7 @@ namespace :parser do
37
37
  total = nil
38
38
  total_length = 0
39
39
  for i in 0..5 do
40
- length = (Random.new.rand * 400.0 + 100).to_i
40
+ length = (Random.new.rand * 4000.0 + 1000).to_i
41
41
  total_length += length
42
42
  puts "Benchmarking file of length #{length}"
43
43
  SimplePoParser::RandomPoFileGenerator.generate_file(pofile, length)
@@ -109,7 +109,7 @@ module SimplePoParser
109
109
  skip_whitespace
110
110
  text = message_line
111
111
  add_result(:msgctxt, text)
112
- message_multiline(:msgctxt) if text.empty?
112
+ message_multiline(:msgctxt) if @scanner.peek(1) == '"'
113
113
  end
114
114
  msgid
115
115
  rescue PoSyntaxError => pe
@@ -127,7 +127,7 @@ module SimplePoParser
127
127
  skip_whitespace
128
128
  text = message_line
129
129
  add_result(:msgid, text)
130
- message_multiline(:msgid) if text.empty?
130
+ message_multiline(:msgid) if @scanner.peek(1) == '"'
131
131
  if msgid_plural
132
132
  msgstr_plural
133
133
  else
@@ -155,7 +155,7 @@ module SimplePoParser
155
155
  skip_whitespace
156
156
  text = message_line
157
157
  add_result(:msgid_plural, text)
158
- message_multiline(:msgid_plural) if text.empty?
158
+ message_multiline(:msgid_plural) if @scanner.peek(1) == '"'
159
159
  true
160
160
  else
161
161
  false
@@ -174,7 +174,7 @@ module SimplePoParser
174
174
  skip_whitespace
175
175
  text = message_line
176
176
  add_result(:msgstr, text)
177
- message_multiline(:msgstr) if text.empty?
177
+ message_multiline(:msgstr) if @scanner.peek(1) == '"'
178
178
  skip_whitespace
179
179
  raise PoSyntaxError, "Unexpected content after expected message end #{@scanner.peek(10).inspect}" unless @scanner.eos?
180
180
  else
@@ -202,7 +202,7 @@ module SimplePoParser
202
202
  skip_whitespace
203
203
  text = message_line
204
204
  add_result(msgstr_key, text)
205
- message_multiline(msgstr_key) if text.empty?
205
+ message_multiline(msgstr_key) if @scanner.peek(1) == '"'
206
206
  msgstr_plural(num+1)
207
207
  elsif num == 0 # and msgstr_key was false
208
208
  raise PoSyntaxError, "Plural message without msgstr[0] is not allowed. Line started unexpectedly with #{@scanner.peek(10).inspect}."
@@ -238,7 +238,7 @@ module SimplePoParser
238
238
  skip_whitespace
239
239
  text = message_line
240
240
  add_result(key, text)
241
- previous_multiline(key) if text.empty?
241
+ previous_multiline(key) if @scanner.match?(/#\|\p{Blank}*"/)
242
242
  else
243
243
  raise PoSyntaxError, "Previous comments must start with '#| msg'. #{@scanner.peek(10).inspect} unknown."
244
244
  end
@@ -265,8 +265,10 @@ module SimplePoParser
265
265
 
266
266
  # parses a multiline message
267
267
  #
268
- # multiline messages are indicated by an empty content as first line and the next line
269
- # starting with the double quote character
268
+ # Multiline messages are usually indicated by an empty string as the first line,
269
+ # followed by more lines starting with the double quote character.
270
+ #
271
+ # However, according to the PO file standard, the first line can also contain content.
270
272
  def message_multiline(key)
271
273
  begin
272
274
  skip_whitespace
@@ -8,7 +8,15 @@ module SimplePoParser
8
8
  end
9
9
 
10
10
  def parse_file(path)
11
- File.open(path, 'r').each_line("\n\n") do |block|
11
+ file = File.open(path, "r")
12
+ if(file.gets =~ /\r$/)
13
+ # detected windows line ending
14
+ file.close
15
+ file = File.open(path, "rt")
16
+ else
17
+ file.rewind
18
+ end
19
+ file.each_line("\n\n") do |block|
12
20
  block.strip! # dont parse empty blocks
13
21
  @messages << parse_block(block) if block != ''
14
22
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module SimplePoParser
4
- VERSION = "1.1.3"
4
+ VERSION = "1.1.6"
5
5
  end
@@ -0,0 +1,51 @@
1
+ # PO Header entry
2
+ #
3
+ #, fuzzy
4
+ msgid ""
5
+ msgstr ""
6
+ "Project-Id-Version: simple_po_parser 1\n"
7
+ "Report-Msgid-Bugs-To: me\n"
8
+ "POT-Creation-Date: 2012-05-04 12:56+0000\n"
9
+ "PO-Revision-Date: 2014-05-15 22:24+0330\n"
10
+ "Last-Translator: Dennis-Florian Herr <dennis.herr@experteer.com>\n"
11
+ "Language-Team: English\n"
12
+ "MIME-Version: 1.0\n"
13
+ "Content-Type: text/plain; charset=UTF-8\n"
14
+ "Content-Transfer-Encoding: 8bit\n"
15
+ "Plural-Forms: nplurals=1; plural=0;\n"
16
+
17
+ # translator-comment
18
+ #. extract
19
+ #: reference1
20
+ msgctxt "Context"
21
+ msgid "msgid"
22
+ msgstr "translated"
23
+
24
+ # translator-comment
25
+ #
26
+ #. extract
27
+ #: reference1
28
+ #: reference2
29
+ #, flag
30
+ #| msgctxt "previous context"
31
+ #| msgid ""
32
+ #| "multiline\n"
33
+ #|"previous messageid"
34
+ #| msgid_plural "previous msgid_plural"
35
+ msgctxt "Context"
36
+ msgid "msgid"
37
+ msgid_plural ""
38
+ "multiline msgid_plural\n"
39
+ ""
40
+ msgstr[0] "msgstr 0"
41
+ msgstr[1] ""
42
+ "msgstr 1 multiline 1\n"
43
+ "msgstr 1 line 2\n"
44
+ msgstr[2] "msgstr 2"
45
+
46
+ # translator-comment
47
+ #. extract
48
+ #: reference1
49
+ #~ msgctxt "Context"
50
+ #~ msgid "msgid"
51
+ #~ msgstr "translated"
@@ -0,0 +1,10 @@
1
+ #| msgid "multiline\n"
2
+ #|"previous messageid"
3
+ #|"with non-empty first line"
4
+ msgid ""
5
+ "multiline string "
6
+ "with empty first line "
7
+ "and trailing spaces"
8
+ msgstr "multiline string"
9
+ "with non-empty first line"
10
+ "and no trailing spaces"
@@ -4,6 +4,7 @@ describe SimplePoParser::Parser do
4
4
  let (:po_header) { File.read(File.expand_path("fixtures/header.po", __dir__))}
5
5
  let(:po_complex_message) { File.read(File.expand_path("fixtures/complex_entry.po", __dir__))}
6
6
  let(:po_simple_message) { File.read(File.expand_path("fixtures/simple_entry.po", __dir__))}
7
+ let(:po_multiline_message) { File.read(File.expand_path("fixtures/multiline.po", __dir__))}
7
8
 
8
9
  it "parses the PO header" do
9
10
  expected_result = {
@@ -27,6 +28,15 @@ describe SimplePoParser::Parser do
27
28
  expect(SimplePoParser::Parser.new.parse(po_simple_message)).to eq(expected_result)
28
29
  end
29
30
 
31
+ it "parses the multiline entry as expected" do
32
+ expected_result = {
33
+ :msgid => ["", "multiline string ", "with empty first line ", "and trailing spaces"],
34
+ :msgstr => ["multiline string", "with non-empty first line", "and no trailing spaces"],
35
+ :previous_msgid => ["multiline\\n", "previous messageid", "with non-empty first line"],
36
+ }
37
+ expect(SimplePoParser::Parser.new.parse(po_multiline_message)).to eq(expected_result)
38
+ end
39
+
30
40
  it "parses the complex entry as expected" do
31
41
  expected_result = {
32
42
  :translator_comment => ["translator-comment", ""],
@@ -2,12 +2,16 @@ require "spec_helper"
2
2
 
3
3
  describe SimplePoParser do
4
4
  let(:po_file) { Pathname.new('spec/simple_po_parser/fixtures/complete_file.po').realpath }
5
+ let(:crlf_file) { Pathname.new('spec/simple_po_parser/fixtures/crlf_encoded.po').realpath }
5
6
  let(:non_ascii_file) { Pathname.new('spec/simple_po_parser/fixtures/non_ascii_file.po').realpath }
6
7
  let(:po_complex_message) { File.read(File.expand_path("fixtures/complex_entry.po", __dir__))}
7
8
 
8
9
  it "parses a po file" do
9
10
  expect(SimplePoParser.parse(po_file)).to be_a_kind_of Array
10
11
  end
12
+ it "parses crlf encoded files" do
13
+ expect(SimplePoParser.parse(crlf_file)).to be_a_kind_of Array
14
+ end
11
15
 
12
16
  it "parses a non ascii po file" do
13
17
  expect(SimplePoParser.parse(non_ascii_file)).to be_a_kind_of Array
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_po_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dennis-Florian Herr
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-15 00:00:00.000000000 Z
11
+ date: 2022-03-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -46,6 +46,7 @@ executables: []
46
46
  extensions: []
47
47
  extra_rdoc_files: []
48
48
  files:
49
+ - ".gitattributes"
49
50
  - ".gitignore"
50
51
  - ".rspec"
51
52
  - ".travis.yml"
@@ -62,7 +63,9 @@ files:
62
63
  - simple_po_parser.gemspec
63
64
  - spec/simple_po_parser/fixtures/complete_file.po
64
65
  - spec/simple_po_parser/fixtures/complex_entry.po
66
+ - spec/simple_po_parser/fixtures/crlf_encoded.po
65
67
  - spec/simple_po_parser/fixtures/header.po
68
+ - spec/simple_po_parser/fixtures/multiline.po
66
69
  - spec/simple_po_parser/fixtures/non_ascii_file.po
67
70
  - spec/simple_po_parser/fixtures/simple_entry.po
68
71
  - spec/simple_po_parser/parser_spec.rb
@@ -74,7 +77,7 @@ homepage: http://github.com/experteer/simple_po_parser
74
77
  licenses:
75
78
  - MIT
76
79
  metadata: {}
77
- post_install_message:
80
+ post_install_message:
78
81
  rdoc_options: []
79
82
  require_paths:
80
83
  - lib
@@ -89,15 +92,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
92
  - !ruby/object:Gem::Version
90
93
  version: '0'
91
94
  requirements: []
92
- rubyforge_project:
93
- rubygems_version: 2.6.11
94
- signing_key:
95
+ rubygems_version: 3.2.15
96
+ signing_key:
95
97
  specification_version: 4
96
98
  summary: A simple PO file to ruby hash parser
97
99
  test_files:
98
100
  - spec/simple_po_parser/fixtures/complete_file.po
99
101
  - spec/simple_po_parser/fixtures/complex_entry.po
102
+ - spec/simple_po_parser/fixtures/crlf_encoded.po
100
103
  - spec/simple_po_parser/fixtures/header.po
104
+ - spec/simple_po_parser/fixtures/multiline.po
101
105
  - spec/simple_po_parser/fixtures/non_ascii_file.po
102
106
  - spec/simple_po_parser/fixtures/simple_entry.po
103
107
  - spec/simple_po_parser/parser_spec.rb