paru 0.2.5f → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/paru.rb +1 -1
- data/lib/paru/filter.rb +38 -15
- data/lib/paru/filter/ast_manipulation.rb +20 -3
- data/lib/paru/filter/node.rb +24 -4
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 185b75188642b10c09282a90bfc79cf3668881f7
|
4
|
+
data.tar.gz: a6ad0e6180196916b569e92c855bb6d0f5bca2c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e6140070d0709f90fbd9c23ef86c01685fe1e2f7421203cb8c732f00ece343fe8bdf0c87eee5d4d302697c54153fa37321d2e515b6a077c2354fe6dfb365d30
|
7
|
+
data.tar.gz: 19606ebcbbf9bed59c9c2cbaa694f56d9b2998dd07c8d1b6067f5715d5fde07e3c145fbad059c3458ffc757e7193acfa97e50e08fd915a028ba671fbb874898e
|
data/lib/paru.rb
CHANGED
data/lib/paru/filter.rb
CHANGED
@@ -199,9 +199,20 @@ module Paru
|
|
199
199
|
# Booleans, Arrays, and Hashes. You can manipulate it like any other Ruby
|
200
200
|
# Hash.
|
201
201
|
#
|
202
|
+
# @!attribute metadata
|
203
|
+
# @return [Hash] The metadata of the document being filtered as a Ruby
|
204
|
+
# Hash
|
205
|
+
#
|
206
|
+
# @!attribute document
|
207
|
+
# @return [Document] The document being filtered
|
208
|
+
#
|
209
|
+
# @!attribute current_node
|
210
|
+
# @return [Node] The node in the AST of the document being filtered that
|
211
|
+
# is currently being inspected by the filter.
|
212
|
+
#
|
202
213
|
class Filter
|
203
214
|
|
204
|
-
attr_reader :metadata, :document
|
215
|
+
attr_reader :metadata, :document, :current_node
|
205
216
|
|
206
217
|
# Create a new Filter instance. For convenience, {run} creates a new
|
207
218
|
# {Filter} and runs it immediately. Use this constructor if you want
|
@@ -261,26 +272,38 @@ module Paru
|
|
261
272
|
|
262
273
|
@metadata = PandocFilter::Metadata.new @document.meta
|
263
274
|
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
275
|
+
nodes_to_filter = Enumerator.new do |node_list|
|
276
|
+
@document.each_depth_first do |node|
|
277
|
+
node_list << node
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
@running = true # used to be able to stop filtering immediately
|
282
|
+
@current_node = @document
|
283
|
+
|
284
|
+
while @running do
|
285
|
+
begin
|
286
|
+
if @current_node.has_been_replaced?
|
287
|
+
@current_node = @current_node.get_replacement
|
288
|
+
@filtered_nodes.pop
|
289
|
+
else
|
290
|
+
@current_node = nodes_to_filter.next
|
291
|
+
end
|
292
|
+
|
293
|
+
@filtered_nodes.push @current_node
|
294
|
+
|
295
|
+
instance_eval(&block) # run the actual filter code
|
296
|
+
rescue StopIteration
|
297
|
+
@running = false
|
298
|
+
end
|
269
299
|
end
|
300
|
+
|
270
301
|
@running = false
|
271
302
|
|
272
303
|
@document.meta = @metadata.to_meta
|
273
304
|
@output.write @document.to_JSON
|
274
305
|
end
|
275
306
|
|
276
|
-
# +current_node+ points to the node that is *now* being processed while
|
277
|
-
# running this filter.
|
278
|
-
#
|
279
|
-
# @return [Node] the node that is currently being processed
|
280
|
-
def current_node()
|
281
|
-
@filtered_nodes.last
|
282
|
-
end
|
283
|
-
|
284
307
|
# Specify what nodes to filter with a +selector+. If the +current_node+
|
285
308
|
# matches that selector, it is passed to the block to this +with+ method.
|
286
309
|
#
|
@@ -288,7 +311,7 @@ module Paru
|
|
288
311
|
# @yield [Node] the current node if it matches the selector
|
289
312
|
def with(selector)
|
290
313
|
@selectors[selector] = Selector.new selector unless @selectors.has_key? selector
|
291
|
-
yield current_node if @selectors[selector].matches? current_node, @filtered_nodes
|
314
|
+
yield @current_node if @selectors[selector].matches? @current_node, @filtered_nodes
|
292
315
|
end
|
293
316
|
|
294
317
|
# Stop processing the document any further and output it as it is now.
|
@@ -32,6 +32,16 @@ module Paru
|
|
32
32
|
@children.find_index child
|
33
33
|
end
|
34
34
|
|
35
|
+
|
36
|
+
# Get the child node at index
|
37
|
+
#
|
38
|
+
# @param index [Number] the index of the child to get
|
39
|
+
#
|
40
|
+
# @return [Node] the child at index
|
41
|
+
def get(index)
|
42
|
+
@children[index]
|
43
|
+
end
|
44
|
+
|
35
45
|
# Insert child node among this node's children at position index.
|
36
46
|
#
|
37
47
|
# @param index [Integer] the position to insert the child
|
@@ -95,10 +105,17 @@ module Paru
|
|
95
105
|
# @param block [Proc] the block to apply to each node in this node
|
96
106
|
# tree
|
97
107
|
#
|
98
|
-
# @yield
|
99
|
-
def each_depth_first(&block)
|
108
|
+
# @yield [Node]
|
109
|
+
def each_depth_first(&block)
|
100
110
|
yield self
|
101
|
-
|
111
|
+
|
112
|
+
if has_been_replaced?
|
113
|
+
node = get_replacement
|
114
|
+
else
|
115
|
+
node = self
|
116
|
+
end
|
117
|
+
|
118
|
+
node.each {|child| child.each_depth_first(&block)} if node.has_children?
|
102
119
|
end
|
103
120
|
|
104
121
|
end
|
data/lib/paru/filter/node.rb
CHANGED
@@ -383,23 +383,43 @@ module Paru
|
|
383
383
|
temp_doc = temp_doc.children.first
|
384
384
|
|
385
385
|
if not temp_doc.children.all? {|node| node.is_inline?}
|
386
|
-
raise Error.new "Cannot replace the inline level node represented by '#{
|
386
|
+
raise Error.new "Cannot replace the inline level node represented by '#{self.markdown}' with markdown that converts to block level nodes: '#{markdown}'."
|
387
387
|
end
|
388
|
-
|
388
|
+
else
|
389
|
+
replacement = temp_doc.children.first
|
390
|
+
@replacement = replacement unless replacement.nil? or to_ast == replacement.to_ast
|
389
391
|
end
|
390
|
-
|
392
|
+
|
391
393
|
index = current_index
|
392
394
|
temp_doc.each do |child|
|
393
395
|
index += 1
|
394
396
|
parent.insert index, child
|
395
397
|
end
|
398
|
+
|
399
|
+
|
396
400
|
# Remove the original node
|
397
401
|
parent.remove_at current_index
|
398
402
|
end
|
399
|
-
|
400
403
|
end
|
401
404
|
|
402
405
|
alias outer_markdown= markdown=
|
406
|
+
|
407
|
+
# Has this node been replaced by using the {markdown} method? If
|
408
|
+
# so, return true.
|
409
|
+
#
|
410
|
+
# @return [Boolean]
|
411
|
+
def has_been_replaced?
|
412
|
+
not @replacement.nil?
|
413
|
+
end
|
414
|
+
|
415
|
+
# Get this node's replacemnt. Nil if it has not been replaced by
|
416
|
+
# the {markdown} method
|
417
|
+
#
|
418
|
+
# @return [Node] This node's replacement or nil if there is none.
|
419
|
+
def get_replacement
|
420
|
+
@replacement
|
421
|
+
end
|
422
|
+
|
403
423
|
end
|
404
424
|
end
|
405
425
|
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: 0.2.
|
4
|
+
version: 0.2.5
|
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: 2017-06-
|
11
|
+
date: 2017-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Use Pandoc (http://www.pandoc.org) with ruby
|
14
14
|
email: Huub@heerdebeer.org
|
@@ -101,12 +101,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
101
101
|
version: '0'
|
102
102
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
103
|
requirements:
|
104
|
-
- - "
|
104
|
+
- - ">="
|
105
105
|
- !ruby/object:Gem::Version
|
106
|
-
version:
|
106
|
+
version: '0'
|
107
107
|
requirements: []
|
108
108
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.
|
109
|
+
rubygems_version: 2.6.11
|
110
110
|
signing_key:
|
111
111
|
specification_version: 4
|
112
112
|
summary: Paru is a ruby wrapper around pandoc
|