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