wwwjdic 13.0.0 → 16.0.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.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +63 -1
  3. data/Gemfile +9 -1
  4. data/README.md +499 -225
  5. data/Rakefile +12 -3
  6. data/copyright.md +17 -29
  7. data/examples/basics.rb +55 -45
  8. data/examples/translate.rb +161 -86
  9. data/examples/uri.rb +50 -78
  10. data/html/CHANGELOG.html +80 -21
  11. data/html/COPYING_md.html +13 -24
  12. data/html/Gemfile.html +12 -21
  13. data/html/Object.html +810 -45
  14. data/html/README_md.html +309 -161
  15. data/html/Rakefile.html +15 -24
  16. data/html/WWWJDic.html +41 -81
  17. data/html/WWWJDic/ParsableDuckType.html +15 -34
  18. data/html/WWWJDic/Parser.html +25 -64
  19. data/html/WWWJDic/Parsers.html +8 -13
  20. data/html/WWWJDic/Parsers/Dict.html +29 -54
  21. data/html/WWWJDic/Parsers/Display.html +24 -47
  22. data/html/WWWJDic/Parsers/Key.html +25 -48
  23. data/html/WWWJDic/Parsers/Search.html +19 -38
  24. data/html/WWWJDic/Parsers/Server.html +24 -47
  25. data/html/WWWJDic/Splitter.html +49 -142
  26. data/html/WWWJDic/Utils.html +9 -14
  27. data/html/WWWJDic/Utils/Downloader.html +8 -13
  28. data/html/WWWJDic/Utils/Downloader/Downloader.html +29 -63
  29. data/html/WWWJDic/Utils/Raisers.html +21 -72
  30. data/html/WWWJDic/WWWJDic.html +131 -312
  31. data/html/copyright_md.html +206 -225
  32. data/html/created.rid +33 -58
  33. data/html/css/rdoc.css +35 -6
  34. data/html/index.html +301 -169
  35. data/html/js/darkfish.js +22 -99
  36. data/html/js/navigation.js +4 -40
  37. data/html/js/navigation.js.gz +0 -0
  38. data/html/js/search.js +32 -31
  39. data/html/js/search_index.js +1 -1
  40. data/html/js/search_index.js.gz +0 -0
  41. data/html/js/searcher.js +6 -6
  42. data/html/js/searcher.js.gz +0 -0
  43. data/html/table_of_contents.html +160 -197
  44. data/lib/wwwjdic.rb +16 -15
  45. data/lib/wwwjdic/application.rb +69 -36
  46. data/lib/wwwjdic/constants.rb +48 -10
  47. data/lib/wwwjdic/locales/de.yml +9 -4
  48. data/lib/wwwjdic/locales/en.yml +9 -4
  49. data/lib/wwwjdic/locales/es.yml +9 -4
  50. data/lib/wwwjdic/locales/fr.yml +9 -4
  51. data/lib/wwwjdic/locales/hu.yml +9 -4
  52. data/lib/wwwjdic/locales/it.yml +9 -4
  53. data/lib/wwwjdic/locales/ja.yml +11 -5
  54. data/lib/wwwjdic/locales/nl.yml +9 -4
  55. data/lib/wwwjdic/locales/ru.yml +9 -4
  56. data/lib/wwwjdic/locales/sl.yml +9 -4
  57. data/lib/wwwjdic/locales/sv.yml +9 -4
  58. data/lib/wwwjdic/parser.rb +15 -8
  59. data/lib/wwwjdic/parsers/dict.rb +13 -8
  60. data/lib/wwwjdic/parsers/display.rb +10 -3
  61. data/lib/wwwjdic/parsers/key.rb +11 -3
  62. data/lib/wwwjdic/parsers/search.rb +12 -3
  63. data/lib/wwwjdic/parsers/server.rb +10 -3
  64. data/lib/wwwjdic/utils/downloader.rb +27 -30
  65. data/lib/wwwjdic/utils/raisers.rb +14 -15
  66. data/lib/wwwjdic/utils/splitter.rb +33 -18
  67. data/lib/wwwjdic/version.rb +28 -20
  68. data/test/test_helper.rb +12 -1
  69. data/test/test_wwwjdic.rb +12 -4
  70. data/test/wwwjdic/locales/de.yml +9 -1
  71. data/test/wwwjdic/locales/en.yml +9 -1
  72. data/test/wwwjdic/locales/es.yml +9 -1
  73. data/test/wwwjdic/locales/fr.yml +9 -1
  74. data/test/wwwjdic/locales/hu.yml +9 -1
  75. data/test/wwwjdic/locales/it.yml +10 -1
  76. data/test/wwwjdic/locales/ja.yml +11 -2
  77. data/test/wwwjdic/locales/nl.yml +9 -1
  78. data/test/wwwjdic/locales/ru.yml +9 -1
  79. data/test/wwwjdic/locales/sl.yml +9 -1
  80. data/test/wwwjdic/locales/sv.yml +9 -1
  81. data/test/wwwjdic/locales/test_locales.rb +43 -24
  82. data/test/wwwjdic/parsers/test_dict.rb +67 -37
  83. data/test/wwwjdic/parsers/test_display.rb +13 -5
  84. data/test/wwwjdic/parsers/test_key.rb +12 -4
  85. data/test/wwwjdic/parsers/test_server.rb +13 -5
  86. data/test/wwwjdic/test_application.rb +201 -149
  87. data/test/wwwjdic/test_parsable_duck_type.rb +11 -6
  88. data/test/wwwjdic/utils/test_downloader.rb +9 -1
  89. data/test/wwwjdic/utils/test_raisers.rb +48 -29
  90. data/wwwjdic.gemspec +46 -26
  91. metadata +55 -43
  92. data/acknowledgements.md +0 -55
  93. data/authors.md +0 -67
  94. data/html/acknowledgements_md.html +0 -149
  95. data/html/authors_md.html +0 -181
  96. data/html/js/jquery.js +0 -4
  97. data/html/wwwjdic_gemspec.html +0 -161
@@ -1,6 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #--
2
4
  # wwwjdic
3
- # Copyright © 2014, 2015, 2016, 2017, 2018, 2019 Marco Bresciani
5
+ # rubocop:disable Style/AsciiComments
6
+ # © 2014 Marco Bresciani
7
+ # rubocop:enable Style/AsciiComments
4
8
  #
5
9
  # This file is part of wwwjdic.
6
10
  #
@@ -16,11 +20,14 @@
16
20
  #
17
21
  # You should have received a copy of the GNU General Public License
18
22
  # along with wwwjdic. If not, see <http://www.gnu.org/licenses/>.
23
+ #
24
+ # SPDX-FileCopyrightText: 2012 Jon Maken
25
+ #
26
+ # SPDX-License-Identifier: BSD-3-Clause
19
27
  #++
20
28
 
21
29
  module WWWJDic
22
30
  module Utils
23
-
24
31
  # This module is a simple wrapper container for Peter R. Marreck's
25
32
  # gist.
26
33
  #
@@ -28,15 +35,12 @@ module WWWJDic
28
35
  # License:: 3-clause BSD
29
36
  # Revision:: 2012-03-25 23:01:19 -0600
30
37
  module Downloader
31
-
32
38
  require 'net/http'
33
39
  require 'net/ftp'
34
40
  require 'openssl'
35
41
  require 'fileutils'
36
42
  require 'tempfile'
37
43
 
38
- #!/usr/bin/env ruby
39
- #
40
44
  # An HTTP/HTTPS/FTP file downloader library/CLI based upon
41
45
  # MiniPortile's HTTP implementation.
42
46
  #
@@ -44,46 +48,41 @@ module WWWJDic
44
48
  # License:: 3-clause BSD
45
49
  # Revision:: 2012-03-25 23:01:19 -0600
46
50
  class Downloader
47
-
48
51
  VERSION = '0.1.0'
49
52
 
50
53
  class << self
51
54
  attr_accessor :logger, :max_ca_verify_depth, :ftp_data_chunk_size
52
55
  end
53
56
 
54
- @logger = STDOUT.binmode
57
+ @logger = $stdout.binmode
55
58
  @max_ca_verify_depth = 5
56
59
  @ftp_data_chunk_size = 8192
57
60
 
58
-
59
61
  def self.download_file(url, full_path, count = 3)
60
- raise RuntimeError, I18n.t('error.nil') if url.nil?
61
- # return if File.exist?(full_path)
62
+ raise I18n.t('error.nil') if url.nil?
62
63
 
63
64
  http_download(url, full_path, count)
64
65
  end
65
66
 
66
- private
67
-
68
- def self.message(text)
67
+ private_class_method def self.message(text)
69
68
  @logger.print text
70
69
  @logger.flush
71
70
  end
72
71
 
73
- def self.output(text = '')
72
+ private_class_method def self.output(text = '')
74
73
  @logger.puts text
75
74
  @logger.flush
76
75
  end
77
76
 
78
- def self.http_download(url, full_path, count)
77
+ private_class_method def self.http_download(url, full_path, count)
79
78
  uri = URI.parse(url)
80
79
 
81
80
  begin
82
81
  filename = File.basename(uri.path)
83
82
 
84
83
  if ENV['HTTP_PROXY']
85
- #protocol,
86
- userinfo, proxy_host, proxy_port = URI::split(ENV['HTTP_PROXY'])
84
+ # protocol,
85
+ userinfo, proxy_host, proxy_port = URI.split(ENV['HTTP_PROXY'])
87
86
  proxy_user, proxy_pass = userinfo.split(/:/) if userinfo
88
87
  http = Net::HTTP.new(uri.host, uri.port, proxy_host, proxy_port, proxy_user, proxy_pass)
89
88
  else
@@ -101,7 +100,8 @@ module WWWJDic
101
100
  return false
102
101
 
103
102
  when Net::HTTPRedirection
104
- raise 'Too many redirections for the original URL, halting.' if count <= 0
103
+ raise 'Too many redirections, halting.' if count <= 0
104
+
105
105
  url = response['location']
106
106
  return http_download(url, full_path, count - 1)
107
107
 
@@ -111,25 +111,22 @@ module WWWJDic
111
111
  temp_file << response.body
112
112
  temp_file.close
113
113
 
114
- if full_path.nil?
115
- return response.body
116
- else
117
- File.unlink full_path if File.exist?(full_path)
118
- FileUtils.mkdir_p File.dirname(full_path)
119
- FileUtils.mv temp_file.path, full_path, :force => true
120
- end
114
+ return response.body if full_path.nil?
115
+
116
+ File.unlink full_path if File.exist?(full_path)
117
+ FileUtils.mkdir_p File.dirname(full_path)
118
+ FileUtils.mv temp_file.path, full_path, force: true
121
119
  else
122
120
  puts response
123
121
  end
124
122
  end
125
-
126
- rescue Exception => e
127
- File.unlink full_path if File.exist?(full_path) unless full_path.nil?
123
+ rescue StandardError => e
124
+ File.unlink full_path if !full_path.nil? && File.exist?(full_path)
128
125
  output "ERROR: #{e.message}"
129
- raise 'Failed to download file'
126
+ raise "Failed to download file: #{e.message}"
130
127
  end
131
128
  end
132
- end # Downloader
129
+ end
133
130
  end
134
131
  end
135
132
  end
@@ -1,6 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #--
2
4
  # wwwjdic
3
- # Copyright © 2014, 2015, 2016, 2017, 2018, 2019 Marco Bresciani
5
+ # rubocop:disable Style/AsciiComments
6
+ # © 2014 Marco Bresciani
7
+ # rubocop:enable Style/AsciiComments
4
8
  #
5
9
  # This file is part of wwwjdic.
6
10
  #
@@ -16,51 +20,46 @@
16
20
  #
17
21
  # You should have received a copy of the GNU General Public License
18
22
  # along with wwwjdic. If not, see <http://www.gnu.org/licenses/>.
23
+ #
24
+ # SPDX-FileCopyrightText: 2014 Marco Bresciani
25
+ #
26
+ # SPDX-License-Identifier: GPL-3.0-or-later
19
27
  #++
20
28
 
21
29
  require 'i18n'
22
30
 
23
31
  module WWWJDic
24
-
25
32
  # This module is a simple collection of useful things and methods that
26
33
  # I prefer to keep as DRYer as possible. Just include it and use the
27
34
  # methods...
28
35
  #
29
36
  # Author:: {Marco Bresciani}[mailto:marcobresciani_1974@libero.it]
30
- # Copyright:: Copyright © 2014, 2015, 2016, 2017, 2018, 2019 Marco Bresciani
37
+ # Copyright:: (C) 2014 Marco Bresciani
31
38
  # License:: GNU General Public License version 3
32
39
  module Utils
33
-
34
40
  # This module contains some utility method to raise errors according
35
41
  # to (possibly) common conditions.
36
42
  #
37
43
  # Author:: {Marco Bresciani}[mailto:marcobresciani_1974@libero.it]
38
- # Copyright:: Copyright © 2014, 2015, 2016, 2017, 2018, 2019 Marco Bresciani
44
+ # Copyright:: (C) 2014 Marco Bresciani
39
45
  # License:: GNU General Public License version 3
40
46
  module Raisers
41
-
42
47
  # Raises an +ArgumentError+ according to parameters, unless the
43
48
  # +array+ contains the exact +value+.
44
49
  def raiser_array(name = 'error.value', value = nil, array = nil)
45
- unless value.nil?
46
- raise ArgumentError, I18n.t(name, value: value) unless array.include? value
47
- end
50
+ raise ArgumentError, I18n.t(name, value: value) if !value.nil? && !(array.include? value)
48
51
  end
49
52
 
50
53
  # Raises an +ArgumentError+ according to parameters, unless the
51
54
  # +array+ contains a downcased +value+.
52
55
  def raiser_downcase(name = 'error.value', value = nil, array = nil)
53
- unless value.nil?
54
- raise ArgumentError, I18n.t(name, value: value) unless array.include? value.downcase
55
- end
56
+ raise ArgumentError, I18n.t(name, value: value) if !value.nil? && !(array.include? value.downcase)
56
57
  end
57
58
 
58
59
  # Raises an +ArgumentError+ according to parameters, unless the
59
60
  # +array+ contains the number of the +value+.
60
61
  def raiser_to_i(name = 'error.value', value = nil, array = nil)
61
- unless value.nil?
62
- raise ArgumentError, I18n.t(name, value: value) unless array.include? value.to_i
63
- end
62
+ raise ArgumentError, I18n.t(name, value: value) if !value.nil? && !(array.include? value.to_i)
64
63
  end
65
64
  end
66
65
  end
@@ -1,6 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #--
2
4
  # wwwjdic
3
- # Copyright © 2014, 2015, 2016, 2017, 2018, 2019 Marco Bresciani
5
+ # rubocop:disable Style/AsciiComments
6
+ # © 2014 Marco Bresciani
7
+ # rubocop:enable Style/AsciiComments
4
8
  #
5
9
  # This file is part of wwwjdic.
6
10
  #
@@ -16,6 +20,10 @@
16
20
  #
17
21
  # You should have received a copy of the GNU General Public License
18
22
  # along with wwwjdic. If not, see <http://www.gnu.org/licenses/>.
23
+ #
24
+ # SPDX-FileCopyrightText: 2014 Marco Bresciani
25
+ #
26
+ # SPDX-License-Identifier: GPL-3.0-or-later
19
27
  #++
20
28
 
21
29
  require 'i18n'
@@ -27,7 +35,7 @@ module WWWJDic
27
35
  # This class is a simple API to interact with WWWJDic Backboor
28
36
  # Entry/API.
29
37
  # Author:: {Marco Bresciani}[mailto:marcobresciani_1974@libero.it]
30
- # Copyright:: Copyright © 2014, 2015, 2016, 2017, 2018, 2019 Marco Bresciani
38
+ # Copyright:: (C) 2014 Marco Bresciani
31
39
  # License:: GNU General Public License version 3
32
40
  class Splitter
33
41
  # Creates a +Splitter+ object.
@@ -39,20 +47,21 @@ module WWWJDic
39
47
  end
40
48
 
41
49
  def title
42
- $1 if /<TITLE>(.*)<\/TITLE>/.match @translation
50
+ Regexp.last_match(1) if %r{<TITLE>(.*)</TITLE>}.match @translation
43
51
  end
44
52
 
45
53
  def translation
46
- $1.strip if /<pre>(.*)<\/pre>/m.match @translation
54
+ Regexp.last_match(1).strip if %r{<pre>(.*)</pre>}m.match @translation
47
55
  end
48
56
 
49
57
  def message
50
- return $1.strip if /<p>(.*)<p>/m.match @translation unless @translation.nil?
51
- $1 if /<p>(.*)<pre>/m.match @translation if @translation.nil?
58
+ return Regexp.last_match(1).strip unless @translation.nil? || !/<p>(.*)<p>/m.match(@translation)
59
+
60
+ Regexp.last_match(1) if @translation.nil? && /<p>(.*)<pre>/m.match(@translation)
52
61
  end
53
62
 
54
63
  def lines
55
- result = Array.new
64
+ result = []
56
65
  translation.each_line do |a_line|
57
66
  stripped_line = a_line.strip
58
67
  result.push stripped_line unless stripped_line.empty?
@@ -60,19 +69,12 @@ module WWWJDic
60
69
  result unless result.empty?
61
70
  end
62
71
 
72
+ # @return [Array] the arrays of elements containing the answer
63
73
  def content
64
- result = Array.new
74
+ result = []
65
75
  lines.each do |a_line|
66
- inner = Hash.new
67
- if /(.*)\[/m.match a_line
68
- inner[:word] = $1.strip
69
- inner[:kana] = $1.strip if /\[(.*)\]/m.match a_line
70
- inner[:text] = $1.strip if /\] \/(.*)\//m.match a_line
71
- else
72
- inner[:kana] = $1.strip if /^(.*)(\s)\//m.match a_line
73
- inner[:word] = inner[:kana]
74
- inner[:text] = $1.strip if /\/(.*)\//m.match a_line
75
- end
76
+ inner = {}
77
+ fill_inner_data(a_line, inner)
76
78
  inner[:meanings] = inner[:text].split('/') if inner[:text].include? '/'
77
79
  result.push inner unless inner.empty?
78
80
  end
@@ -80,5 +82,18 @@ module WWWJDic
80
82
  result unless result.empty?
81
83
  end
82
84
 
85
+ private
86
+
87
+ def fill_inner_data(a_line, inner)
88
+ if /(.*)\[/m.match a_line
89
+ inner[:word] = Regexp.last_match(1).strip
90
+ inner[:kana] = Regexp.last_match(1).strip if /\[(.*)\]/m.match a_line
91
+ inner[:text] = Regexp.last_match(1).strip if %r{\] /(.*)/}m.match a_line
92
+ else
93
+ inner[:kana] = Regexp.last_match(1).strip if %r{^(.*)(\s)/}m.match a_line
94
+ inner[:word] = inner[:kana]
95
+ inner[:text] = Regexp.last_match(1).strip if %r{/(.*)/}m.match a_line
96
+ end
97
+ end
83
98
  end
84
99
  end
@@ -1,20 +1,28 @@
1
- #--
2
- # wwwjdic
3
- # Copyright © 2014, 2015, 2016 Marco Bresciani
4
- #
5
- # This file is part of wwwjdic.
6
- #
7
- # wwwjdic is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
8
- # as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
9
- #
10
- # wwwjdic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
11
- # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12
- #
13
- # You should have received a copy of the GNU General Public License along with wwwjdic. If not, see
14
- # <http://www.gnu.org/licenses/>.
15
- #++
16
-
17
- module WWWJDic
18
- # Current version number for WWWJDic gem.
19
- VERSION = '13.0.0'
20
- end
1
+ # frozen_string_literal: true
2
+
3
+ #--
4
+ # wwwjdic
5
+ # rubocop:disable Style/AsciiComments
6
+ # © 2014 Marco Bresciani
7
+ # rubocop:enable Style/AsciiComments
8
+ #
9
+ # This file is part of wwwjdic.
10
+ #
11
+ # wwwjdic is free software: you can redistribute it and/or modify it
12
+ # under the terms of the GNU General Public License as published by the
13
+ # Free Software Foundation, either version 3 of the License, or (at your
14
+ # option) any later version.
15
+ #
16
+ # wwwjdic is distributed in the hope that it will be useful, but WITHOUT
17
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19
+ # for more details.
20
+ #
21
+ # You should have received a copy of the GNU General Public License
22
+ # along with wwwjdic. If not, see <http://www.gnu.org/licenses/>.
23
+ #++
24
+
25
+ module WWWJDic
26
+ # Current version number for WWWJDic gem.
27
+ VERSION = '16.0.0'
28
+ end
data/test/test_helper.rb CHANGED
@@ -1,6 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #--
2
4
  # wwwjdic
3
- # Copyright © 2014, 2015, 2016, 2017, 2018, 2019 Marco Bresciani
5
+ # rubocop:disable Style/AsciiComments
6
+ # © 2014 Marco Bresciani
7
+ # rubocop:enable Style/AsciiComments
4
8
  #
5
9
  # This file is part of wwwjdic.
6
10
  #
@@ -16,8 +20,15 @@
16
20
  #
17
21
  # You should have received a copy of the GNU General Public License
18
22
  # along with wwwjdic. If not, see <http://www.gnu.org/licenses/>.
23
+ #
24
+ # SPDX-FileCopyrightText: 2014 Marco Bresciani
25
+ #
26
+ # SPDX-License-Identifier: GPL-3.0-or-later
19
27
  #++
20
28
 
29
+ require 'simplecov'
30
+ SimpleCov.start
31
+
21
32
  require 'i18n'
22
33
  require 'json'
23
34
  require 'minitest/autorun'
data/test/test_wwwjdic.rb CHANGED
@@ -1,6 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #--
2
4
  # wwwjdic
3
- # Copyright © 2014, 2015, 2016, 2017, 2018, 2019 Marco Bresciani
5
+ # rubocop:disable Style/AsciiComments
6
+ # © 2014 Marco Bresciani
7
+ # rubocop:enable Style/AsciiComments
4
8
  #
5
9
  # This file is part of wwwjdic.
6
10
  #
@@ -16,17 +20,21 @@
16
20
  #
17
21
  # You should have received a copy of the GNU General Public License
18
22
  # along with wwwjdic. If not, see <http://www.gnu.org/licenses/>.
23
+ #
24
+ # SPDX-FileCopyrightText: 2014 Marco Bresciani
25
+ #
26
+ # SPDX-License-Identifier: GPL-3.0-or-later
19
27
  #++
20
28
 
21
29
  require_relative 'test_helper'
22
30
 
23
31
  describe WWWJDic::WWWJDic do
24
32
  describe 'when created' do
25
- subject {WWWJDic::breener}
33
+ subject { WWWJDic.breener }
26
34
 
27
35
  it 'must create a wwwjdic object' do
28
- subject.wont_be_nil
29
- subject.must_be_instance_of WWWJDic::WWWJDic
36
+ _(subject).wont_be_nil
37
+ _(subject).must_be_instance_of WWWJDic::WWWJDic
30
38
  end
31
39
  end
32
40
  end
@@ -1,5 +1,8 @@
1
+ #--
1
2
  # wwwjdic
2
- # Copyright © 2014, 2015, 2016, 2017, 2018, 2019 Marco Bresciani
3
+ # rubocop:disable Style/AsciiComments
4
+ # © 2014 Marco Bresciani
5
+ # rubocop:enable Style/AsciiComments
3
6
  #
4
7
  # This file is part of wwwjdic.
5
8
  #
@@ -15,6 +18,11 @@
15
18
  #
16
19
  # You should have received a copy of the GNU General Public License
17
20
  # along with wwwjdic. If not, see <http://www.gnu.org/licenses/>.
21
+ #
22
+ # SPDX-FileCopyrightText: 2014 Marco Bresciani
23
+ #
24
+ # SPDX-License-Identifier: GPL-3.0-or-later
25
+ #++
18
26
 
19
27
  de:
20
28
  test: