paru 0.2.5c → 0.2.5f
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/do-pandoc.rb +5 -5
- data/bin/pandoc2yaml.rb +23 -58
- data/lib/paru.rb +1 -5
- data/lib/paru/error.rb +0 -2
- data/lib/paru/filter.rb +46 -30
- data/lib/paru/filter/ast_manipulation.rb +0 -1
- data/lib/paru/filter/attr.rb +0 -1
- data/lib/paru/filter/block.rb +2 -2
- data/lib/paru/filter/block_quote.rb +2 -2
- data/lib/paru/filter/bullet_list.rb +2 -2
- data/lib/paru/filter/citation.rb +2 -2
- data/lib/paru/filter/cite.rb +8 -4
- data/lib/paru/filter/code.rb +11 -3
- data/lib/paru/filter/code_block.rb +5 -3
- data/lib/paru/filter/definition_list.rb +2 -2
- data/lib/paru/filter/definition_list_item.rb +4 -4
- data/lib/paru/filter/div.rb +5 -3
- data/lib/paru/filter/document.rb +47 -16
- data/lib/paru/filter/emph.rb +2 -2
- data/lib/paru/filter/empty_block.rb +3 -3
- data/lib/paru/filter/empty_inline.rb +2 -2
- data/lib/paru/filter/header.rb +6 -3
- data/lib/paru/filter/horizontal_rule.rb +6 -6
- data/lib/paru/filter/image.rb +2 -3
- data/lib/paru/filter/inline.rb +5 -2
- data/lib/paru/filter/inner_markdown.rb +85 -0
- data/lib/paru/filter/line_block.rb +8 -2
- data/lib/paru/filter/line_break.rb +2 -2
- data/lib/paru/filter/link.rb +4 -5
- data/lib/paru/filter/list.rb +8 -6
- data/lib/paru/filter/math.rb +2 -2
- data/lib/paru/filter/meta.rb +15 -4
- data/lib/paru/filter/meta_blocks.rb +2 -2
- data/lib/paru/filter/meta_bool.rb +2 -3
- data/lib/paru/filter/meta_inlines.rb +4 -2
- data/lib/paru/filter/meta_list.rb +2 -3
- data/lib/paru/filter/meta_map.rb +10 -142
- data/lib/paru/filter/meta_string.rb +1 -1
- data/lib/paru/filter/meta_value.rb +5 -4
- data/lib/paru/filter/metadata.rb +114 -0
- data/lib/paru/filter/node.rb +130 -11
- data/lib/paru/filter/note.rb +3 -4
- data/lib/paru/filter/null.rb +2 -2
- data/lib/paru/filter/ordered_list.rb +5 -5
- data/lib/paru/filter/para.rb +4 -2
- data/lib/paru/filter/plain.rb +4 -2
- data/lib/paru/filter/quoted.rb +2 -2
- data/lib/paru/filter/raw_block.rb +5 -3
- data/lib/paru/filter/raw_inline.rb +2 -3
- data/lib/paru/filter/small_caps.rb +2 -2
- data/lib/paru/filter/soft_break.rb +2 -2
- data/lib/paru/filter/space.rb +2 -2
- data/lib/paru/filter/span.rb +3 -4
- data/lib/paru/filter/str.rb +2 -2
- data/lib/paru/filter/strikeout.rb +2 -2
- data/lib/paru/filter/strong.rb +2 -2
- data/lib/paru/filter/subscript.rb +2 -2
- data/lib/paru/filter/superscript.rb +2 -2
- data/lib/paru/filter/table.rb +3 -3
- data/lib/paru/filter/table_row.rb +2 -2
- data/lib/paru/filter/target.rb +0 -1
- data/lib/paru/filter/version.rb +2 -2
- data/lib/paru/filter_error.rb +25 -0
- data/lib/paru/pandoc.rb +3 -4
- data/lib/paru/pandoc2yaml.rb +71 -0
- data/lib/paru/selector.rb +2 -4
- metadata +6 -3
- data/lib/paru/filter/markdown.rb +0 -150
@@ -16,11 +16,12 @@
|
|
16
16
|
# You should have received a copy of the GNU General Public License
|
17
17
|
# along with Paru. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#++
|
19
|
+
require_relative "./block.rb"
|
20
|
+
require_relative "./attr.rb"
|
21
|
+
require_relative "./inner_markdown.rb"
|
22
|
+
|
19
23
|
module Paru
|
20
24
|
module PandocFilter
|
21
|
-
require_relative "./block"
|
22
|
-
require_relative "./attr"
|
23
|
-
|
24
25
|
# A CodeBlock is a Block level node with an attribute object and the
|
25
26
|
# code as a string
|
26
27
|
#
|
@@ -30,6 +31,7 @@ module Paru
|
|
30
31
|
# @!attribute string
|
31
32
|
# @return [String]
|
32
33
|
class CodeBlock < Block
|
34
|
+
include InnerMarkdown
|
33
35
|
attr_accessor :attr, :string
|
34
36
|
|
35
37
|
# Create a new CodeBlock based on the contents
|
@@ -16,10 +16,10 @@
|
|
16
16
|
# You should have received a copy of the GNU General Public License
|
17
17
|
# along with Paru. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#++
|
19
|
+
require_relative "./block.rb"
|
20
|
+
|
19
21
|
module Paru
|
20
22
|
module PandocFilter
|
21
|
-
require_relative "./block"
|
22
|
-
|
23
23
|
# A DefinitionList is a list of term-definition pairs, respecitively an Inline list and a Block list.
|
24
24
|
class DefinitionList < Block
|
25
25
|
# Create a new DefinitionList node
|
@@ -16,12 +16,12 @@
|
|
16
16
|
# You should have received a copy of the GNU General Public License
|
17
17
|
# along with Paru. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#++
|
19
|
+
require_relative "./block.rb"
|
20
|
+
require_relative "./list.rb"
|
21
|
+
require_relative "./inline.rb"
|
22
|
+
|
19
23
|
module Paru
|
20
24
|
module PandocFilter
|
21
|
-
require_relative "./block"
|
22
|
-
require_relative "./list"
|
23
|
-
require_relative "./inline"
|
24
|
-
|
25
25
|
# A DefinitionListItem is a helper node to represent the pair of a term
|
26
26
|
# and its definition in a DefinitionList
|
27
27
|
#
|
data/lib/paru/filter/div.rb
CHANGED
@@ -16,13 +16,15 @@
|
|
16
16
|
# You should have received a copy of the GNU General Public License
|
17
17
|
# along with Paru. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#++
|
19
|
+
require_relative "./block.rb"
|
20
|
+
require_relative "./attr.rb"
|
21
|
+
require_relative "./inner_markdown.rb"
|
22
|
+
|
19
23
|
module Paru
|
20
24
|
module PandocFilter
|
21
|
-
require_relative "./block"
|
22
|
-
require_relative "./attr"
|
23
|
-
|
24
25
|
# A Div node consisting of an attribute object and a list of Block nodes.
|
25
26
|
class Div < Block
|
27
|
+
include InnerMarkdown
|
26
28
|
|
27
29
|
# Create a new Div node based on the contents
|
28
30
|
#
|
data/lib/paru/filter/document.rb
CHANGED
@@ -16,15 +16,17 @@
|
|
16
16
|
# You should have received a copy of the GNU General Public License
|
17
17
|
# along with Paru. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#++
|
19
|
-
|
20
|
-
module PandocFilter
|
19
|
+
require "json"
|
21
20
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
require_relative "./version"
|
21
|
+
require_relative "./node.rb"
|
22
|
+
require_relative "./plain.rb"
|
23
|
+
require_relative "./meta.rb"
|
24
|
+
require_relative "./version.rb"
|
27
25
|
|
26
|
+
require_relative "../filter_error.rb"
|
27
|
+
|
28
|
+
module Paru
|
29
|
+
module PandocFilter
|
28
30
|
# Pandoc type version key
|
29
31
|
VERSION = "pandoc-api-version"
|
30
32
|
# Pandoc type meta key
|
@@ -43,28 +45,56 @@ module Paru
|
|
43
45
|
# @return [Meta] the metadata of this document
|
44
46
|
class Document < Node
|
45
47
|
|
46
|
-
|
48
|
+
attr_accessor :meta
|
47
49
|
|
48
50
|
# Create a new Document from a JSON representation of the AST
|
49
51
|
#
|
50
52
|
# @param json [String] a JSON string representation of the AST of a document
|
51
53
|
# @return [Document] the newly created document
|
54
|
+
#
|
55
|
+
# @raise [ParuFilterError] when parsing JSON AST from pandoc fails
|
56
|
+
# or the parsed results do not make sense.
|
52
57
|
def self.from_JSON(json)
|
53
|
-
|
54
|
-
|
58
|
+
begin
|
59
|
+
doc = JSON.parse json
|
60
|
+
version, metadata, contents = doc.values_at(VERSION, META, BLOCKS)
|
61
|
+
rescue Exception => e
|
62
|
+
raise FilterError.new <<WARNING
|
63
|
+
Unable to read document.
|
64
|
+
|
65
|
+
Most likely cause: Paru expects a pandoc installation that has been
|
66
|
+
compiled with pandoc-types >= #{CURRENT_PANDOC_VERSION.join('.')}. You can
|
67
|
+
check which pandoc-types have been compiled with your pandoc installation by
|
68
|
+
running `pandoc -v`.
|
69
|
+
|
70
|
+
Original error message: #{e.message}
|
71
|
+
WARNING
|
72
|
+
end
|
73
|
+
|
74
|
+
if -1 == (version <=> CURRENT_PANDOC_VERSION)
|
75
|
+
if metadata.has_key?('debug_')
|
76
|
+
warn <<WARNING
|
77
|
+
pandoc-types API version used in document (version = #{version.join('.')}) is
|
78
|
+
lower than the version of pandoc-types used by paru
|
79
|
+
(#{CURRENT_PANDOC_VERSION.join('.')}. If you experience unexpected results,
|
80
|
+
please try updating pandoc or downgrading paru.
|
81
|
+
WARNING
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
55
85
|
PandocFilter::Document.new version, metadata, contents
|
56
86
|
end
|
57
87
|
|
58
88
|
# Create a new Document fragment from a list of Node elements
|
59
89
|
#
|
60
|
-
# @param node_list [
|
90
|
+
# @param node_list [Node[]] a list of nodes to create a Document
|
61
91
|
# fragment from
|
62
92
|
#
|
63
93
|
# @return [Document] the document containing nodes in node_list
|
64
94
|
def self.fragment(node_list)
|
65
95
|
meta = Hash.new
|
66
96
|
|
67
|
-
if node_list.any? {|n| n.is_block?}
|
97
|
+
if node_list.nil? or node_list.any? {|n| n.is_block?}
|
68
98
|
new_doc = Document.new CURRENT_PANDOC_VERSION, meta, []
|
69
99
|
new_doc.children = node_list
|
70
100
|
else
|
@@ -79,15 +109,16 @@ module Paru
|
|
79
109
|
# Create a new Document node based on the pandoc type version,
|
80
110
|
# metadata, and the contents of the document
|
81
111
|
#
|
82
|
-
# @param version [
|
83
|
-
# @param meta [Array] metadata
|
84
|
-
# @param contents [Array] contents
|
85
|
-
def initialize(version, meta, contents)
|
112
|
+
# @param version [Integer = CURRENT_PANDOC_VERSION] the version of pandoc types
|
113
|
+
# @param meta [Array = []] metadata
|
114
|
+
# @param contents [Array = []] contents
|
115
|
+
def initialize(version = CURRENT_PANDOC_VERSION, meta = [], contents = [])
|
86
116
|
@version = Version.new version
|
87
117
|
@meta = Meta.new meta
|
88
118
|
super contents
|
89
119
|
end
|
90
120
|
|
121
|
+
|
91
122
|
# Create an AST representation of this Document
|
92
123
|
def to_ast()
|
93
124
|
{
|
data/lib/paru/filter/emph.rb
CHANGED
@@ -16,10 +16,10 @@
|
|
16
16
|
# You should have received a copy of the GNU General Public License
|
17
17
|
# along with Paru. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#++
|
19
|
+
require_relative "./inline.rb"
|
20
|
+
|
19
21
|
module Paru
|
20
22
|
module PandocFilter
|
21
|
-
require_relative "./inline"
|
22
|
-
|
23
23
|
# An Emph, emphasized Inline
|
24
24
|
class Emph < Inline
|
25
25
|
end
|
@@ -16,15 +16,15 @@
|
|
16
16
|
# You should have received a copy of the GNU General Public License
|
17
17
|
# along with Paru. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#++
|
19
|
+
require_relative "./block.rb"
|
20
|
+
|
19
21
|
module Paru
|
20
22
|
module PandocFilter
|
21
|
-
require_relative "./block"
|
22
|
-
|
23
23
|
# An EmptyBlock, has not contents
|
24
24
|
class EmptyBlock < Block
|
25
25
|
|
26
26
|
# Create an empty block
|
27
|
-
def initialize
|
27
|
+
def initialize(contents = [])
|
28
28
|
super []
|
29
29
|
end
|
30
30
|
|
@@ -16,10 +16,10 @@
|
|
16
16
|
# You should have received a copy of the GNU General Public License
|
17
17
|
# along with Paru. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#++
|
19
|
+
require_relative "./inline.rb"
|
20
|
+
|
19
21
|
module Paru
|
20
22
|
module PandocFilter
|
21
|
-
require_relative "./inline"
|
22
|
-
|
23
23
|
# An EmptyInline node, has no content
|
24
24
|
class EmptyInline < Inline
|
25
25
|
|
data/lib/paru/filter/header.rb
CHANGED
@@ -16,11 +16,12 @@
|
|
16
16
|
# You should have received a copy of the GNU General Public License
|
17
17
|
# along with Paru. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#++
|
19
|
+
require_relative "./block.rb"
|
20
|
+
require_relative "./attr.rb"
|
21
|
+
require_relative "./inner_markdown.rb"
|
22
|
+
|
19
23
|
module Paru
|
20
24
|
module PandocFilter
|
21
|
-
require_relative "./block"
|
22
|
-
require_relative "./attr"
|
23
|
-
|
24
25
|
# A Header node has a level, an attribute object and the contents of
|
25
26
|
# the header as a list on Inline nodes.
|
26
27
|
#
|
@@ -30,6 +31,8 @@ module Paru
|
|
30
31
|
# @!attribute attr
|
31
32
|
# @return [Attr]
|
32
33
|
class Header < Block
|
34
|
+
include InnerMarkdown
|
35
|
+
|
33
36
|
attr_accessor :level, :attr
|
34
37
|
|
35
38
|
# Create a new Header node
|
@@ -16,12 +16,12 @@
|
|
16
16
|
# You should have received a copy of the GNU General Public License
|
17
17
|
# along with Paru. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#++
|
19
|
-
|
20
|
-
module PandocFilter
|
21
|
-
require_relative "./empty_block"
|
19
|
+
require_relative "./empty_block.rb"
|
22
20
|
|
23
|
-
|
24
|
-
|
21
|
+
module Paru
|
22
|
+
module PandocFilter
|
23
|
+
# HorizontalRule
|
24
|
+
class HorizontalRule < EmptyBlock
|
25
|
+
end
|
25
26
|
end
|
26
|
-
end
|
27
27
|
end
|
data/lib/paru/filter/image.rb
CHANGED
@@ -16,11 +16,10 @@
|
|
16
16
|
# You should have received a copy of the GNU General Public License
|
17
17
|
# along with Paru. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#++
|
19
|
+
require_relative "./link.rb"
|
20
|
+
|
19
21
|
module Paru
|
20
22
|
module PandocFilter
|
21
|
-
|
22
|
-
require_relative "./link"
|
23
|
-
|
24
23
|
# An Image has an attribute object, a caption, and a target
|
25
24
|
class Image < Link
|
26
25
|
|
data/lib/paru/filter/inline.rb
CHANGED
@@ -16,13 +16,15 @@
|
|
16
16
|
# You should have received a copy of the GNU General Public License
|
17
17
|
# along with Paru. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#++
|
19
|
+
require_relative "./node.rb"
|
20
|
+
require_relative "./inner_markdown.rb"
|
21
|
+
|
19
22
|
module Paru
|
20
23
|
module PandocFilter
|
21
|
-
require_relative "./node"
|
22
|
-
|
23
24
|
# An Inline node
|
24
25
|
# @see http://hackage.haskell.org/package/pandoc-types-1.17.0.4/docs/Text-Pandoc-Definition.html#t:Inline
|
25
26
|
class Inline < Node
|
27
|
+
include InnerMarkdown
|
26
28
|
|
27
29
|
# Create a new Inline node with contents
|
28
30
|
# @param contents [Array] the contents of this inline node
|
@@ -43,6 +45,7 @@ module Paru
|
|
43
45
|
def has_inline?()
|
44
46
|
true
|
45
47
|
end
|
48
|
+
|
46
49
|
end
|
47
50
|
end
|
48
51
|
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2015, 2016, 2017 Huub de Beer <Huub@heerdebeer.org>
|
3
|
+
#
|
4
|
+
# This file is part of Paru
|
5
|
+
#
|
6
|
+
# Paru is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Paru is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with Paru. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#++
|
19
|
+
module Paru
|
20
|
+
module PandocFilter
|
21
|
+
|
22
|
+
# A mixin to add inner_markdown properties to Nodes for which it makes
|
23
|
+
# sense to have an inner_markdown. Only those nodes that have a clear
|
24
|
+
# identifiable Inline level content, have the {#inner_markdown}
|
25
|
+
# method. This are almost all Inline nodes (except Cite) and Block
|
26
|
+
# level nodes with Inline contents like {Para} or {Header}.
|
27
|
+
module InnerMarkdown
|
28
|
+
|
29
|
+
# Get the markdown representation of this Node's children.
|
30
|
+
#
|
31
|
+
# @return [String] the inner markdown representation of this Node
|
32
|
+
#
|
33
|
+
# @example Replace all occurrences of "hello" by "world" in all paragraphs
|
34
|
+
# Paru::Filter.run do
|
35
|
+
# with "Para" do |p|
|
36
|
+
# p.inner_markdown = p.inner_markdown.gsub "hello", "world"
|
37
|
+
# end
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
def inner_markdown()
|
41
|
+
if has_children?
|
42
|
+
temp_doc = PandocFilter::Document.fragment @children
|
43
|
+
AST2MARKDOWN << temp_doc.to_JSON
|
44
|
+
elsif has_string?
|
45
|
+
@string
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Replace this Node's children with the Nodes represented by the
|
50
|
+
# markdown string
|
51
|
+
#
|
52
|
+
# @param markdown [String] the markdown string to replace this
|
53
|
+
# Node's children
|
54
|
+
#
|
55
|
+
# @example Replace all occurrences of "hello" by "world" in all paragraphs
|
56
|
+
# Paru::Filter.run do
|
57
|
+
# with "Para" do |p|
|
58
|
+
# p.inner_markdown = p.inner_markdown.gsub "hello", "world"
|
59
|
+
# end
|
60
|
+
# end
|
61
|
+
#
|
62
|
+
def inner_markdown=(markdown)
|
63
|
+
if has_string?
|
64
|
+
@string = markdown
|
65
|
+
else
|
66
|
+
if markdown.nil? or markdown.empty?
|
67
|
+
@children = []
|
68
|
+
else
|
69
|
+
json = MARKDOWN2JSON << markdown
|
70
|
+
temp_doc = PandocFilter::Document.from_JSON json
|
71
|
+
temp_doc.children.each {|c| c.parent = @parent}
|
72
|
+
|
73
|
+
if has_inline?
|
74
|
+
@children = temp_doc.children.first.children
|
75
|
+
elsif has_block?
|
76
|
+
@children = temp_doc.children
|
77
|
+
else
|
78
|
+
# Unknown; what to do here?
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -16,12 +16,18 @@
|
|
16
16
|
# You should have received a copy of the GNU General Public License
|
17
17
|
# along with Paru. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#--
|
19
|
+
require_relative "./list.rb"
|
20
|
+
|
19
21
|
module Paru
|
20
22
|
module PandocFilter
|
21
|
-
require_relative "./list.rb"
|
22
|
-
|
23
23
|
# A LineBlock is a List of Lists of Inline nodes
|
24
24
|
class LineBlock < List
|
25
|
+
# Create a new LineBlock node based on contents
|
26
|
+
#
|
27
|
+
# @param contents [Array] the contents of the LineBlock
|
28
|
+
def initialize(contents)
|
29
|
+
super(contents, Para)
|
30
|
+
end
|
25
31
|
end
|
26
32
|
end
|
27
33
|
end
|
@@ -16,10 +16,10 @@
|
|
16
16
|
# You should have received a copy of the GNU General Public License
|
17
17
|
# along with Paru. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#++
|
19
|
+
require_relative "./empty_inline.rb"
|
20
|
+
|
19
21
|
module Paru
|
20
22
|
module PandocFilter
|
21
|
-
require_relative "./empty_inline"
|
22
|
-
|
23
23
|
# A LineBreak is an empty inline element
|
24
24
|
class LineBreak < EmptyInline
|
25
25
|
end
|
data/lib/paru/filter/link.rb
CHANGED
@@ -16,13 +16,12 @@
|
|
16
16
|
# You should have received a copy of the GNU General Public License
|
17
17
|
# along with Paru. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#++
|
19
|
+
require_relative "./inline.rb"
|
20
|
+
require_relative "./attr.rb"
|
21
|
+
require_relative "./target.rb"
|
22
|
+
|
19
23
|
module Paru
|
20
24
|
module PandocFilter
|
21
|
-
|
22
|
-
require_relative "./inline"
|
23
|
-
require_relative "./attr"
|
24
|
-
require_relative "./target"
|
25
|
-
|
26
25
|
# A Link node has an attribute object, an Inline description and a
|
27
26
|
# target
|
28
27
|
#
|