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.
- checksums.yaml +4 -4
- data/lib/paru/error.rb +6 -4
- data/lib/paru/filter/ast_manipulation.rb +90 -91
- data/lib/paru/filter/attr.rb +75 -69
- data/lib/paru/filter/block.rb +15 -14
- data/lib/paru/filter/block_quote.rb +14 -12
- data/lib/paru/filter/bullet_list.rb +17 -16
- data/lib/paru/filter/caption.rb +50 -48
- data/lib/paru/filter/cell.rb +52 -50
- data/lib/paru/filter/citation.rb +53 -51
- data/lib/paru/filter/cite.rb +34 -33
- data/lib/paru/filter/code.rb +51 -49
- data/lib/paru/filter/code_block.rb +76 -76
- data/lib/paru/filter/col_spec.rb +58 -56
- data/lib/paru/filter/definition_list.rb +51 -52
- data/lib/paru/filter/definition_list_item.rb +45 -43
- data/lib/paru/filter/div.rb +37 -35
- data/lib/paru/filter/document.rb +112 -115
- data/lib/paru/filter/emph.rb +7 -5
- data/lib/paru/filter/empty_block.rb +17 -16
- data/lib/paru/filter/empty_inline.rb +23 -22
- data/lib/paru/filter/figure.rb +41 -39
- data/lib/paru/filter/header.rb +41 -39
- data/lib/paru/filter/horizontal_rule.rb +7 -5
- data/lib/paru/filter/image.rb +13 -12
- data/lib/paru/filter/inline.rb +27 -26
- data/lib/paru/filter/inner_markdown.rb +60 -62
- data/lib/paru/filter/int_value.rb +19 -18
- data/lib/paru/filter/line_block.rb +13 -11
- data/lib/paru/filter/line_break.rb +7 -5
- data/lib/paru/filter/link.rb +34 -33
- data/lib/paru/filter/list.rb +37 -37
- data/lib/paru/filter/list_attributes.rb +52 -51
- data/lib/paru/filter/math.rb +66 -64
- data/lib/paru/filter/meta.rb +40 -39
- data/lib/paru/filter/meta_blocks.rb +7 -5
- data/lib/paru/filter/meta_bool.rb +7 -5
- data/lib/paru/filter/meta_inlines.rb +9 -7
- data/lib/paru/filter/meta_list.rb +7 -5
- data/lib/paru/filter/meta_map.rb +50 -49
- data/lib/paru/filter/meta_string.rb +7 -6
- data/lib/paru/filter/meta_value.rb +26 -25
- data/lib/paru/filter/metadata.rb +150 -88
- data/lib/paru/filter/node.rb +400 -406
- data/lib/paru/filter/note.rb +29 -29
- data/lib/paru/filter/null.rb +7 -5
- data/lib/paru/filter/ordered_list.rb +50 -49
- data/lib/paru/filter/para.rb +21 -20
- data/lib/paru/filter/plain.rb +23 -21
- data/lib/paru/filter/quoted.rb +28 -26
- data/lib/paru/filter/short_caption.rb +7 -5
- data/lib/paru/filter/small_caps.rb +8 -7
- data/lib/paru/filter/soft_break.rb +7 -5
- data/lib/paru/filter/space.rb +7 -5
- data/lib/paru/filter/span.rb +29 -27
- data/lib/paru/filter/str.rb +33 -32
- data/lib/paru/filter/strikeout.rb +7 -6
- data/lib/paru/filter/strong.rb +7 -6
- data/lib/paru/filter/subscript.rb +7 -6
- data/lib/paru/filter/superscript.rb +7 -6
- data/lib/paru/filter/table.rb +201 -210
- data/lib/paru/filter/table_body.rb +67 -67
- data/lib/paru/filter/table_end.rb +53 -55
- data/lib/paru/filter/table_foot.rb +8 -7
- data/lib/paru/filter/table_head.rb +8 -7
- data/lib/paru/filter/target.rb +29 -27
- data/lib/paru/filter/underline.rb +7 -5
- data/lib/paru/filter/value.rb +74 -75
- data/lib/paru/filter/version.rb +23 -22
- data/lib/paru/filter.rb +355 -331
- data/lib/paru/filter_error.rb +7 -5
- data/lib/paru/info.rb +29 -30
- data/lib/paru/pandoc.rb +241 -248
- data/lib/paru/pandoc2yaml.rb +51 -42
- data/lib/paru/selector.rb +193 -184
- data/lib/paru.rb +3 -1
- metadata +4 -73
data/lib/paru/pandoc2yaml.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
#--
|
2
|
-
# Copyright 2015
|
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
|
20
|
-
require_relative
|
21
|
+
require 'json'
|
22
|
+
require_relative 'pandoc'
|
21
23
|
|
22
24
|
module Paru
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
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
|
-
|
31
|
-
|
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
|
-
|
34
|
-
|
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
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
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
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
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
|
-
|
65
|
+
version, metadata = json.values_at(VERSION, META)
|
57
66
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
67
|
+
unless metadata.empty?
|
68
|
+
metadata_document = {
|
69
|
+
VERSION => version,
|
70
|
+
META => metadata,
|
71
|
+
BLOCKS => []
|
72
|
+
}
|
64
73
|
|
65
|
-
|
66
|
-
|
74
|
+
yaml = JSON_2_PANDOC << JSON.generate(metadata_document)
|
75
|
+
end
|
67
76
|
|
68
|
-
|
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 '
|
21
|
+
require_relative 'error'
|
20
22
|
|
21
23
|
module Paru
|
22
|
-
|
23
|
-
|
24
|
-
|
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
|
-
#
|
28
|
-
#
|
29
|
-
#
|
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
|
-
#
|
32
|
-
#
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
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
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.
|
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-
|
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:
|