paru 1.5.0 → 1.5.1

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 (77) hide show
  1. checksums.yaml +4 -4
  2. data/lib/paru/error.rb +6 -4
  3. data/lib/paru/filter/ast_manipulation.rb +90 -91
  4. data/lib/paru/filter/attr.rb +75 -69
  5. data/lib/paru/filter/block.rb +15 -14
  6. data/lib/paru/filter/block_quote.rb +14 -12
  7. data/lib/paru/filter/bullet_list.rb +17 -16
  8. data/lib/paru/filter/caption.rb +50 -48
  9. data/lib/paru/filter/cell.rb +52 -50
  10. data/lib/paru/filter/citation.rb +53 -51
  11. data/lib/paru/filter/cite.rb +34 -33
  12. data/lib/paru/filter/code.rb +51 -49
  13. data/lib/paru/filter/code_block.rb +76 -76
  14. data/lib/paru/filter/col_spec.rb +58 -56
  15. data/lib/paru/filter/definition_list.rb +51 -52
  16. data/lib/paru/filter/definition_list_item.rb +45 -43
  17. data/lib/paru/filter/div.rb +37 -35
  18. data/lib/paru/filter/document.rb +112 -115
  19. data/lib/paru/filter/emph.rb +7 -5
  20. data/lib/paru/filter/empty_block.rb +17 -16
  21. data/lib/paru/filter/empty_inline.rb +23 -22
  22. data/lib/paru/filter/figure.rb +41 -39
  23. data/lib/paru/filter/header.rb +41 -39
  24. data/lib/paru/filter/horizontal_rule.rb +7 -5
  25. data/lib/paru/filter/image.rb +13 -12
  26. data/lib/paru/filter/inline.rb +27 -26
  27. data/lib/paru/filter/inner_markdown.rb +60 -62
  28. data/lib/paru/filter/int_value.rb +19 -18
  29. data/lib/paru/filter/line_block.rb +13 -11
  30. data/lib/paru/filter/line_break.rb +7 -5
  31. data/lib/paru/filter/link.rb +34 -33
  32. data/lib/paru/filter/list.rb +37 -37
  33. data/lib/paru/filter/list_attributes.rb +52 -51
  34. data/lib/paru/filter/math.rb +66 -64
  35. data/lib/paru/filter/meta.rb +40 -39
  36. data/lib/paru/filter/meta_blocks.rb +7 -5
  37. data/lib/paru/filter/meta_bool.rb +7 -5
  38. data/lib/paru/filter/meta_inlines.rb +9 -7
  39. data/lib/paru/filter/meta_list.rb +7 -5
  40. data/lib/paru/filter/meta_map.rb +50 -49
  41. data/lib/paru/filter/meta_string.rb +7 -6
  42. data/lib/paru/filter/meta_value.rb +26 -25
  43. data/lib/paru/filter/metadata.rb +150 -88
  44. data/lib/paru/filter/node.rb +400 -406
  45. data/lib/paru/filter/note.rb +29 -29
  46. data/lib/paru/filter/null.rb +7 -5
  47. data/lib/paru/filter/ordered_list.rb +50 -49
  48. data/lib/paru/filter/para.rb +21 -20
  49. data/lib/paru/filter/plain.rb +23 -21
  50. data/lib/paru/filter/quoted.rb +28 -26
  51. data/lib/paru/filter/short_caption.rb +7 -5
  52. data/lib/paru/filter/small_caps.rb +8 -7
  53. data/lib/paru/filter/soft_break.rb +7 -5
  54. data/lib/paru/filter/space.rb +7 -5
  55. data/lib/paru/filter/span.rb +29 -27
  56. data/lib/paru/filter/str.rb +33 -32
  57. data/lib/paru/filter/strikeout.rb +7 -6
  58. data/lib/paru/filter/strong.rb +7 -6
  59. data/lib/paru/filter/subscript.rb +7 -6
  60. data/lib/paru/filter/superscript.rb +7 -6
  61. data/lib/paru/filter/table.rb +201 -210
  62. data/lib/paru/filter/table_body.rb +67 -67
  63. data/lib/paru/filter/table_end.rb +53 -55
  64. data/lib/paru/filter/table_foot.rb +8 -7
  65. data/lib/paru/filter/table_head.rb +8 -7
  66. data/lib/paru/filter/target.rb +29 -27
  67. data/lib/paru/filter/underline.rb +7 -5
  68. data/lib/paru/filter/value.rb +74 -75
  69. data/lib/paru/filter/version.rb +23 -22
  70. data/lib/paru/filter.rb +355 -331
  71. data/lib/paru/filter_error.rb +7 -5
  72. data/lib/paru/info.rb +29 -30
  73. data/lib/paru/pandoc.rb +241 -248
  74. data/lib/paru/pandoc2yaml.rb +51 -42
  75. data/lib/paru/selector.rb +193 -184
  76. data/lib/paru.rb +3 -1
  77. metadata +4 -73
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #--
2
- # Copyright 2015, 2016, 2017 Huub de Beer <Huub@heerdebeer.org>
4
+ # Copyright 2015--2025 Huub de Beer <Huub@heerdebeer.org>
3
5
  #
4
6
  # This file is part of Paru
5
7
  #
@@ -16,56 +18,63 @@
16
18
  # You should have received a copy of the GNU General Public License
17
19
  # along with Paru. If not, see <http://www.gnu.org/licenses/>.
18
20
  #++
19
- require "json"
20
- require_relative "./pandoc.rb"
21
+ require 'json'
22
+ require_relative 'pandoc'
21
23
 
22
24
  module Paru
23
- # Utility class to extract YAML metadata form a markdown file in pandoc's
24
- # own markdown format.
25
- class Pandoc2Yaml
26
- # Paru converters:
27
- # Note. When converting metadata back to the pandoc markdown format, you have
28
- # to use the option "standalone", otherwise the metadata is skipped
25
+ # Utility class to extract YAML metadata form a markdown file in pandoc's
26
+ # own markdown format.
27
+ class Pandoc2Yaml
28
+ # Paru converters:
29
+ # Note. When converting metadata back to the pandoc markdown format, you have
30
+ # to use the option "standalone", otherwise the metadata is skipped
31
+
32
+ # Converter from pandoc's markdown to pandoc's AST JSON
33
+ PANDOC_2_JSON = Paru::Pandoc.new do
34
+ from 'markdown'
35
+ to 'json'
36
+ end
29
37
 
30
- # Converter from pandoc's markdown to pandoc's AST JSON
31
- PANDOC_2_JSON = Paru::Pandoc.new {from "markdown"; to "json"}
38
+ # Converter from pandoc's AST JSON back to pandoc. Note the
39
+ # 'standalone' property, which is needed to output the metadata as
40
+ # well.
41
+ JSON_2_PANDOC = Paru::Pandoc.new do
42
+ from 'json'
43
+ to 'markdown'
44
+ standalone
45
+ end
32
46
 
33
- # Converter from pandoc's AST JSON back to pandoc. Note the
34
- # 'standalone' property, which is needed to output the metadata as
35
- # well.
36
- JSON_2_PANDOC = Paru::Pandoc.new {from "json"; to "markdown"; standalone}
47
+ # When converting a pandoc document to JSON, or vice versa, the JSON object
48
+ # has the following three properties:
37
49
 
38
- # When converting a pandoc document to JSON, or vice versa, the JSON object
39
- # has the following three properties:
40
-
41
- # Pandoc-type API version key
42
- VERSION = "pandoc-api-version"
43
- # Meta block key
44
- META = "meta"
45
- # Content's blocks key
46
- BLOCKS = "blocks"
50
+ # Pandoc-type API version key
51
+ VERSION = 'pandoc-api-version'
52
+ # Meta block key
53
+ META = 'meta'
54
+ # Content's blocks key
55
+ BLOCKS = 'blocks'
47
56
 
48
- # Extract the YAML metadata from input document
49
- #
50
- # @param input_document [String] path to input document
51
- # @return [String] YAML metadata from input document on STDOUT
52
- def self.extract_metadata input_document
53
- json = JSON.parse(PANDOC_2_JSON << File.read(input_document))
54
- yaml = ""
57
+ # Extract the YAML metadata from input document
58
+ #
59
+ # @param input_document [String] path to input document
60
+ # @return [String] YAML metadata from input document on STDOUT
61
+ def self.extract_metadata(input_document)
62
+ json = JSON.parse(PANDOC_2_JSON << File.read(input_document))
63
+ yaml = ''
55
64
 
56
- version, metadata = json.values_at(VERSION, META)
65
+ version, metadata = json.values_at(VERSION, META)
57
66
 
58
- if not metadata.empty? then
59
- metadata_document = {
60
- VERSION => version,
61
- META => metadata,
62
- BLOCKS => []
63
- }
67
+ unless metadata.empty?
68
+ metadata_document = {
69
+ VERSION => version,
70
+ META => metadata,
71
+ BLOCKS => []
72
+ }
64
73
 
65
- yaml = JSON_2_PANDOC << JSON.generate(metadata_document)
66
- end
74
+ yaml = JSON_2_PANDOC << JSON.generate(metadata_document)
75
+ end
67
76
 
68
- yaml
69
- end
77
+ yaml
70
78
  end
79
+ end
71
80
  end
data/lib/paru/selector.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: false
2
+
1
3
  #--
2
4
  # Copyright 2015, 2016, 2017, 2022 Huub de Beer <Huub@heerdebeer.org>
3
5
  #
@@ -16,194 +18,201 @@
16
18
  # You should have received a copy of the GNU General Public License
17
19
  # along with Paru. If not, see <http://www.gnu.org/licenses/>.
18
20
  #++
19
- require_relative './error'
21
+ require_relative 'error'
20
22
 
21
23
  module Paru
22
- # SelectorParseError is thrown when there is an error parsing a selector
23
- # used in a filter.
24
- class SelectorParseError < Error
24
+ # SelectorParseError is thrown when there is an error parsing a selector
25
+ # used in a filter.
26
+ class SelectorParseError < Error
27
+ end
28
+
29
+ # A Selector models a relationship between Pandoc AST nodes, such as
30
+ # parent-child or sibling. Selectors in paru are like CSS selectors, but
31
+ # more limited because the Pandoc AST is quite simple.
32
+ #
33
+ # Given a selector expression, Selector determines if a node complies with
34
+ # that selector expression or not.
35
+ class Selector
36
+ # Pseudo selector to select any inline and block node
37
+ ANY_SELECTOR = '*'.freeze
38
+
39
+ # All pseudo selectors
40
+ PSEUDO_SELECTORS = [ANY_SELECTOR].freeze
41
+
42
+ # Create a new Selector based on the selector string
43
+ #
44
+ # @param selector [String] the selector string
45
+ def initialize(selector)
46
+ @type = 'Unknown'
47
+ @relations = []
48
+ parse selector
25
49
  end
26
50
 
27
- # A Selector models a relationship between Pandoc AST nodes, such as
28
- # parent-child or sibling. Selectors in paru are like CSS selectors, but
29
- # more limited because the Pandoc AST is quite simple.
51
+ # Does node get selected by this Selector in the context of the already filtered
52
+ # nodes?
53
+ #
54
+ # @param node [Node] the node to check against this Selector
55
+ # @param filtered_nodes [Array<Node>] the context of filtered nodes to take
56
+ # into account as well
30
57
  #
31
- # Given a selector expression, Selector determines if a node complies with
32
- # that selector expression or not.
33
- class Selector
34
-
35
- # Pseudo selector to select any inline and block node
36
- ANY_SELECTOR = "*"
37
-
38
- # All pseudo selectors
39
- PSEUDO_SELECTORS = [ANY_SELECTOR]
40
-
41
- # Create a new Selector based on the selector string
42
- #
43
- # @param selector [String] the selector string
44
- def initialize(selector)
45
- @type = 'Unknown'
46
- @relations = []
47
- parse selector
48
- end
49
-
50
- # Does node get selected by this Selector in the context of the already filtered
51
- # nodes?
52
- #
53
- # @param node [Node] the node to check against this Selector
54
- # @param filtered_nodes [Array<Node>] the context of filtered nodes to take
55
- # into account as well
56
- #
57
- # @return [Boolean] True if the node in the context of the
58
- # filtered_nodes is selected by this Selector
59
- def matches? node, filtered_nodes
60
- case @type
61
- when ANY_SELECTOR
62
- Paru::PANDOC_TYPES.include? node.type
63
- else
64
- node.type == @type and
65
- @classes.all? {|c| node.has_class? c } and
66
- @relations.all? {|r| r.matches? node, filtered_nodes}
67
- end
68
- end
69
-
70
- private
71
-
72
- S = /\s*/
73
- # Improved CSS class selector taken from https://stackoverflow.com/questions/448981/which-characters-are-valid-in-css-class-names-selectors/449000#449000
74
- CLASS = /(\.-?[_a-zA-Z]+[_a-zA-Z0-9-]*)/
75
- TYPE = /(?<type>(?<name>[A-Z][a-zA-Z]*|\*)(?<classes>#{CLASS}*))/
76
- OTHER_TYPE = /(?<other_type>(?<other_name>[A-Z][a-zA-Z]*)(?<other_classes>#{CLASS}*))/
77
- OPERATOR = /(?<operator>\+|-|>)/
78
- DISTANCE = /(?<distance>[1-9][0-9]*)/
79
- RELATION = /(?<relation>#{S}#{OTHER_TYPE}#{S}#{OPERATOR}#{S}#{DISTANCE}?#{S})/
80
- RELATIONS = /(?<relations>#{RELATION}+)/
81
- SELECTOR = /\A#{S}(?<selector>#{RELATIONS}?#{S}#{TYPE})#{S}\Z/
82
-
83
- # Parse the selector_string to construct this Selector
84
- def parse(selector_string)
85
- partial_match = expect_match SELECTOR, selector_string
86
- @type, @classes = expect_pandoc_type partial_match
87
-
88
- while continue_parsing? partial_match
89
- operator = expect partial_match, :operator
90
- distance = expect_integer partial_match, :distance
91
- type, classes = expect_pandoc_other_type partial_match
92
-
93
- @relations.push Relation.new(operator, distance, type, classes)
94
-
95
- partial_match = rest partial_match
96
- end
97
- end
98
-
99
- # Is type actually a Pandoc AST node type?
100
- def is_pandoc_type(type)
101
- Paru::PANDOC_TYPES.concat(PSEUDO_SELECTORS).include? type
102
- end
103
-
104
- def expect(parts, part)
105
- raise SelectorParseError.new "Expected #{part}" if parts[part].nil?
106
- parts[part]
107
- end
108
-
109
- def expect_match(regexp, string)
110
- match = regexp.match string
111
- raise SelectorParseError.new "Unable to parse '#{string}'" if match.nil?
112
- match
113
- end
114
-
115
- def expect_pandoc_type(parts)
116
- type = expect parts, :name
117
- classes = parts[:classes].split(".").select {|c| not c.empty?} if not parts[:classes].nil?
118
- raise SelectorParseError.new "Expected a Pandoc type, got '#{type}' instead" if not is_pandoc_type type
119
- [type, classes]
120
- end
121
-
122
- def expect_pandoc_other_type(parts)
123
- type = expect parts, :other_name
124
- classes = parts[:other_classes].split('.').select {|c| not c.empty?} if not parts[:other_classes].nil?
125
- raise SelectorParseError.new "Expected a Pandoc type, got '#{type}' instead" if not is_pandoc_type type
126
- [type, classes]
127
- end
128
-
129
- def expect_integer(parts, part)
130
- if parts[part].nil?
131
- number = 0
132
- else
133
- number = parts[part].to_i
134
- raise SelectorParseError.new "Expected a positive #{part}, got '#{parts[part]}' instead" if number <= 0
135
- end
136
- number
137
- end
138
-
139
- def continue_parsing?(parts)
140
- not parts.nil? and not parts[:relations].nil?
141
- end
142
-
143
- def rest(parts)
144
- rest_string = parts[:relations].slice 0, parts[:relations].size - parts[:relation].size
145
- RELATIONS.match rest_string
146
- end
147
- end
148
-
149
- # @private
150
- class Relation
151
- def initialize(selector, distance, type, classes)
152
- @selector = selector
153
- @distance = distance
154
- @type = type
155
- @classes = classes
156
- end
157
-
158
- def matches?(node, filtered_nodes)
159
- level_nodes = filtered_nodes.keep_if do |n|
160
- node.is_inline? == n.is_inline? or
161
- node.can_act_as_both_block_and_inline?
162
- end
163
- previous_nodes = previous level_nodes, @distance
164
- case @selector
165
- when '+'
166
- in_sequence? node, previous_nodes
167
- when '-'
168
- not_in_sequence? node, previous_nodes
169
- when '>'
170
- is_descendant? node
171
- else
172
- false
173
- end
174
- end
175
-
176
- def in_sequence?(node, previous_nodes)
177
- previous_nodes.any? do |other|
178
- other.type == @type and @classes.all? {|c| other.has_class? c}
179
- end
180
- end
181
-
182
- def not_in_sequence?(node, previous_nodes)
183
- previous_nodes.all? do |other|
184
- other.type != @type or not @classes.all? {|c| other.has_class? c}
185
- end
186
- end
187
-
188
- def is_descendant?(node)
189
- distance = 0
190
- parent = nil
191
- begin
192
- distance += 1 if @distance > 0
193
- node = parent unless parent.nil?
194
- parent = node.parent
195
- ancestry = parent.type == @type and @classes.all? {|c| parent.has_class? c}
196
- end while not ancestry and not parent.is_root? and distance <= @distance
197
- ancestry
198
- end
199
-
200
- def previous(filtered_nodes, distance)
201
- distance = [distance, filtered_nodes.size - 1].min
202
- if distance <= 0
203
- filtered_nodes.slice(0, filtered_nodes.size - 1)
204
- else
205
- filtered_nodes.slice(-1 * distance - 1, distance)
206
- end
207
- end
58
+ # @return [Boolean] True if the node in the context of the
59
+ # filtered_nodes is selected by this Selector
60
+ def matches?(node, filtered_nodes)
61
+ case @type
62
+ when ANY_SELECTOR
63
+ Paru::PANDOC_TYPES.include? node.type
64
+ else
65
+ node.type == @type and
66
+ @classes.all? { |c| node.has_class? c } and
67
+ @relations.all? { |r| r.matches? node, filtered_nodes }
68
+ end
69
+ end
70
+
71
+ private
72
+
73
+ S = /\s*/.freeze
74
+ # Improved CSS class selector taken from https://stackoverflow.com/questions/448981/which-characters-are-valid-in-css-class-names-selectors/449000#449000
75
+ CLASS = /(\.-?[_a-zA-Z]+[_a-zA-Z0-9-]*)/.freeze
76
+ TYPE = /(?<type>(?<name>[A-Z][a-zA-Z]*|\*)(?<classes>#{CLASS}*))/.freeze
77
+ OTHER_TYPE = /(?<other_type>(?<other_name>[A-Z][a-zA-Z]*)(?<other_classes>#{CLASS}*))/.freeze
78
+ OPERATOR = /(?<operator>\+|-|>)/.freeze
79
+ DISTANCE = /(?<distance>[1-9][0-9]*)/.freeze
80
+ RELATION = /(?<relation>#{S}#{OTHER_TYPE}#{S}#{OPERATOR}#{S}#{DISTANCE}?#{S})/.freeze
81
+ RELATIONS = /(?<relations>#{RELATION}+)/.freeze
82
+ SELECTOR = /\A#{S}(?<selector>#{RELATIONS}?#{S}#{TYPE})#{S}\Z/.freeze
83
+
84
+ # Parse the selector_string to construct this Selector
85
+ def parse(selector_string)
86
+ partial_match = expect_match SELECTOR, selector_string
87
+ @type, @classes = expect_pandoc_type partial_match
88
+
89
+ while continue_parsing? partial_match
90
+ operator = expect partial_match, :operator
91
+ distance = expect_integer partial_match, :distance
92
+ type, classes = expect_pandoc_other_type partial_match
93
+
94
+ @relations.push Relation.new(operator, distance, type, classes)
95
+
96
+ partial_match = rest partial_match
97
+ end
98
+ end
99
+
100
+ # Is type actually a Pandoc AST node type?
101
+ def is_pandoc_type(type)
102
+ Paru::PANDOC_TYPES.concat(PSEUDO_SELECTORS).include? type
103
+ end
104
+
105
+ alias pandoc_type? is_pandoc_type
106
+
107
+ def expect(parts, part)
108
+ raise SelectorParseError, "Expected #{part}" if parts[part].nil?
109
+
110
+ parts[part]
111
+ end
112
+
113
+ def expect_match(regexp, string)
114
+ match = regexp.match string
115
+ raise SelectorParseError, "Unable to parse '#{string}'" if match.nil?
116
+
117
+ match
118
+ end
119
+
120
+ def expect_pandoc_type(parts)
121
+ type = expect parts, :name
122
+ classes = parts[:classes].split('.').reject(&:empty?) unless parts[:classes].nil?
123
+ raise SelectorParseError, "Expected a Pandoc type, got '#{type}' instead" unless is_pandoc_type type
124
+
125
+ [type, classes]
126
+ end
127
+
128
+ def expect_pandoc_other_type(parts)
129
+ type = expect parts, :other_name
130
+ classes = parts[:other_classes].split('.').reject(&:empty?) unless parts[:other_classes].nil?
131
+ raise SelectorParseError, "Expected a Pandoc type, got '#{type}' instead" unless is_pandoc_type type
132
+
133
+ [type, classes]
134
+ end
135
+
136
+ def expect_integer(parts, part)
137
+ if parts[part].nil?
138
+ number = 0
139
+ else
140
+ number = parts[part].to_i
141
+ raise SelectorParseError, "Expected a positive #{part}, got '#{parts[part]}' instead" if number <= 0
142
+ end
143
+ number
144
+ end
145
+
146
+ def continue_parsing?(parts)
147
+ !parts.nil? and !parts[:relations].nil?
148
+ end
149
+
150
+ def rest(parts)
151
+ rest_string = parts[:relations].slice 0, parts[:relations].size - parts[:relation].size
152
+ RELATIONS.match rest_string
153
+ end
154
+ end
155
+
156
+ # @private
157
+ class Relation
158
+ def initialize(selector, distance, type, classes)
159
+ @selector = selector
160
+ @distance = distance
161
+ @type = type
162
+ @classes = classes
163
+ end
164
+
165
+ def matches?(node, filtered_nodes)
166
+ level_nodes = filtered_nodes.keep_if do |n|
167
+ node.is_inline? == n.is_inline? or
168
+ node.can_act_as_both_block_and_inline?
169
+ end
170
+ previous_nodes = previous level_nodes, @distance
171
+ case @selector
172
+ when '+'
173
+ in_sequence? node, previous_nodes
174
+ when '-'
175
+ not_in_sequence? node, previous_nodes
176
+ when '>'
177
+ is_descendant? node
178
+ else
179
+ false
180
+ end
181
+ end
182
+
183
+ def in_sequence?(_node, previous_nodes)
184
+ previous_nodes.any? do |other|
185
+ other.type == @type and @classes.all? { |c| other.has_class? c }
186
+ end
187
+ end
188
+
189
+ def not_in_sequence?(_node, previous_nodes)
190
+ previous_nodes.all? do |other|
191
+ other.type != @type or !@classes.all? { |c| other.has_class? c }
192
+ end
193
+ end
194
+
195
+ def is_descendant?(node)
196
+ distance = 0
197
+ parent = nil
198
+ begin
199
+ distance += 1 if @distance.positive?
200
+ node = parent unless parent.nil?
201
+ parent = node.parent
202
+ ancestry = parent.type == @type and @classes.all? { |c| parent.has_class? c }
203
+ end while !ancestry && !parent.is_root? && distance <= @distance
204
+ ancestry
205
+ end
206
+
207
+ alias descendant? is_descendant?
208
+
209
+ def previous(filtered_nodes, distance)
210
+ distance = [distance, filtered_nodes.size - 1].min
211
+ if distance <= 0
212
+ filtered_nodes.slice(0, filtered_nodes.size - 1)
213
+ else
214
+ filtered_nodes.slice((-1 * distance) - 1, distance)
215
+ end
208
216
  end
217
+ end
209
218
  end
data/lib/paru.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #--
2
4
  # Copyright 2015--2024 Huub de Beer <Huub@heerdebeer.org>
3
5
  #
@@ -18,5 +20,5 @@
18
20
  #++
19
21
  module Paru
20
22
  # Paru's current version
21
- VERSION = [1, 5, 0].freeze
23
+ VERSION = [1, 5, 1].freeze
22
24
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paru
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Huub de Beer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-09-07 00:00:00.000000000 Z
11
+ date: 2025-09-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: csv
@@ -24,76 +24,6 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3.3'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '13'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '13'
41
- - !ruby/object:Gem::Dependency
42
- name: yard
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '0.9'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '0.9'
55
- - !ruby/object:Gem::Dependency
56
- name: minitest
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '5.0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '5.0'
69
- - !ruby/object:Gem::Dependency
70
- name: minitest-reporters
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '1.4'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '1.4'
83
- - !ruby/object:Gem::Dependency
84
- name: rubocop
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: 1.56.4
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: 1.56.4
97
27
  description: Control pandoc with Ruby and write pandoc filters in Ruby
98
28
  email: Huub@heerdebeer.org
99
29
  executables:
@@ -186,7 +116,8 @@ files:
186
116
  homepage: https://heerdebeer.org/Software/markdown/paru/
187
117
  licenses:
188
118
  - GPL-3.0-or-later
189
- metadata: {}
119
+ metadata:
120
+ rubygems_mfa_required: 'true'
190
121
  post_install_message:
191
122
  rdoc_options: []
192
123
  require_paths: