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
data/lib/paru/filter/list.rb
CHANGED
@@ -16,32 +16,34 @@
|
|
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 "./inline.rb"
|
21
|
+
|
19
22
|
module Paru
|
20
23
|
module PandocFilter
|
21
|
-
require_relative "./block"
|
22
|
-
|
23
24
|
# A List node is a base node for various List node types
|
24
25
|
class List < Block
|
25
26
|
|
26
27
|
# Create a new List node based on contents
|
27
28
|
#
|
28
29
|
# @param contents [Array] the contents of the list
|
29
|
-
|
30
|
+
# @param node_class [Node = PandocFilter::Block] the contents are {Inline} nodes
|
31
|
+
def initialize(contents, node_class = Block)
|
30
32
|
super []
|
31
33
|
contents.each do |item|
|
32
|
-
@children.push
|
34
|
+
@children.push node_class.new item
|
33
35
|
end
|
34
36
|
end
|
35
37
|
|
36
38
|
# Create an AST representation of this List node
|
37
|
-
def ast_contents
|
39
|
+
def ast_contents()
|
38
40
|
@children.map {|child| child.ast_contents}
|
39
41
|
end
|
40
42
|
|
41
43
|
# Has this List node block contents?
|
42
44
|
#
|
43
45
|
# @return [Boolean] true
|
44
|
-
def has_block?
|
46
|
+
def has_block?()
|
45
47
|
true
|
46
48
|
end
|
47
49
|
end
|
data/lib/paru/filter/math.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
|
# A Math Inline node with the type of math node and the mathematical
|
24
24
|
# contents
|
25
25
|
#
|
data/lib/paru/filter/meta.rb
CHANGED
@@ -16,16 +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 "./meta_map.rb"
|
20
|
+
|
19
21
|
module Paru
|
20
22
|
module PandocFilter
|
21
|
-
require_relative "./meta_map"
|
22
|
-
|
23
23
|
# A Meta node represents the metadata of a document. It is a MetaMap
|
24
24
|
# node.
|
25
25
|
#
|
26
26
|
# @see http://hackage.haskell.org/package/pandoc-types-1.17.0.4/docs/Text-Pandoc-Definition.html#t:Meta
|
27
27
|
class Meta < MetaMap
|
28
|
-
|
29
28
|
# The type of a Meta is "meta"
|
30
29
|
#
|
31
30
|
# @return [String] "meta"
|
@@ -42,11 +41,23 @@ module Paru
|
|
42
41
|
#
|
43
42
|
# @return [MetaMap] a MetaMap representation of this metadata
|
44
43
|
def to_meta_map()
|
45
|
-
map = MetaMap.new
|
44
|
+
map = MetaMap.new
|
46
45
|
map.children = @children
|
47
46
|
map
|
48
47
|
end
|
49
48
|
|
49
|
+
# Convert a {MetaMap} node to a {Meta} node
|
50
|
+
#
|
51
|
+
# @param meta_map [MetaMap] the {MetaMap} node to convert to a
|
52
|
+
# {Meta} node.
|
53
|
+
#
|
54
|
+
# @return [Meta]
|
55
|
+
def self.from_meta_map(meta_map)
|
56
|
+
meta = Meta.new {}
|
57
|
+
meta.children = meta_map.children unless meta_map.children.nil? or meta_map.children.empty?
|
58
|
+
meta
|
59
|
+
end
|
60
|
+
|
50
61
|
end
|
51
62
|
end
|
52
63
|
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 "./node.rb"
|
20
|
+
|
19
21
|
module Paru
|
20
22
|
module PandocFilter
|
21
|
-
require_relative "./node"
|
22
|
-
|
23
23
|
# A MetaBlocks Node contains a list of {Block} nodes
|
24
24
|
class MetaBlocks < Node
|
25
25
|
end
|
@@ -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 "./meta_value.rb"
|
20
|
+
|
19
21
|
module Paru
|
20
22
|
module PandocFilter
|
21
|
-
|
22
|
-
require_relative "./meta_value"
|
23
|
-
|
24
23
|
# A MetaBool Note representa a Boolean value
|
25
24
|
class MetaBool < MetaValue
|
26
25
|
end
|
@@ -16,12 +16,14 @@
|
|
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
|
# A MetaInlines node contains a list of {Inline} nodes
|
24
25
|
class MetaInlines < Node
|
26
|
+
include InnerMarkdown
|
25
27
|
end
|
26
28
|
end
|
27
29
|
end
|
@@ -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 "./node.rb"
|
20
|
+
|
19
21
|
module Paru
|
20
22
|
module PandocFilter
|
21
|
-
|
22
|
-
require_relative "./node"
|
23
|
-
|
24
23
|
# A MetaList node contains a list of MetaValue nodes
|
25
24
|
class MetaList < Node
|
26
25
|
end
|
data/lib/paru/filter/meta_map.rb
CHANGED
@@ -16,20 +16,21 @@
|
|
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_relative "./node.rb"
|
21
20
|
|
22
|
-
|
23
|
-
require_relative "../pandoc.rb"
|
21
|
+
require_relative "../pandoc.rb"
|
24
22
|
|
23
|
+
module Paru
|
24
|
+
module PandocFilter
|
25
25
|
# A MetaMap Node is a map of String keys with MetaValue values
|
26
26
|
class MetaMap < Node
|
27
27
|
include Enumerable
|
28
28
|
|
29
29
|
# Create a new MetaMap based on the contents
|
30
30
|
#
|
31
|
-
# @param contents [
|
32
|
-
|
31
|
+
# @param contents [Hash = {}] a list of key-value pairs, defaults
|
32
|
+
# to an empty hash
|
33
|
+
def initialize(contents = {})
|
33
34
|
@children = Hash.new
|
34
35
|
|
35
36
|
if contents.is_a? Hash
|
@@ -41,8 +42,7 @@ module Paru
|
|
41
42
|
end
|
42
43
|
end
|
43
44
|
|
44
|
-
# Get the value belonging to key.
|
45
|
-
# {replace} and {delete} methods to manipulate metadata.
|
45
|
+
# Get the value belonging to key.
|
46
46
|
#
|
47
47
|
# @param key [String] the key
|
48
48
|
#
|
@@ -51,9 +51,7 @@ module Paru
|
|
51
51
|
@children[key]
|
52
52
|
end
|
53
53
|
|
54
|
-
# Set a value with a key.
|
55
|
-
# metadata properties; the {yaml} method is the preferred method
|
56
|
-
# to set the metadata.
|
54
|
+
# Set a value with a key.
|
57
55
|
#
|
58
56
|
# @param key [String] the key to set
|
59
57
|
# @param value [MetaBlocks|MetaBool|MetaInlines|MetaList|MetaMap|MetaString|MetaValue] the value to set
|
@@ -67,146 +65,16 @@ module Paru
|
|
67
65
|
yield(key, value)
|
68
66
|
end
|
69
67
|
end
|
70
|
-
|
71
|
-
# Mixin the YAML code into this metadata object
|
72
|
-
#
|
73
|
-
# @param yaml_string [YAML] A string with YAML data
|
74
|
-
# @return [MetaMap] this MetaMap object
|
75
|
-
#
|
76
|
-
# @example Set some properties in the metadata
|
77
|
-
# #!/usr/bin/env ruby
|
78
|
-
# require "paru/filter"
|
79
|
-
# require "date"
|
80
|
-
#
|
81
|
-
# Paru::Filter.run do
|
82
|
-
# metadata.yaml <<~YAML
|
83
|
-
# ---
|
84
|
-
# date: #{Date.today.to_s}
|
85
|
-
# title: This **is** the title
|
86
|
-
# pandoc_options:
|
87
|
-
# from: markdown
|
88
|
-
# toc: true
|
89
|
-
# keywords:
|
90
|
-
# - metadata
|
91
|
-
# - pandoc
|
92
|
-
# - filter
|
93
|
-
# ...
|
94
|
-
# YAML
|
95
|
-
# end
|
96
|
-
#
|
97
|
-
def yaml(yaml_string)
|
98
|
-
meta_from_yaml(yaml_string).each do |key, value|
|
99
|
-
self[key] = value
|
100
|
-
end
|
101
|
-
self
|
102
|
-
end
|
103
|
-
|
104
|
-
# Replace the property in this MetaMap matching the selector with
|
105
|
-
# metadata specified by second parameter. If that parameter is a
|
106
|
-
# String, it is treated as a YAML string.
|
107
|
-
#
|
108
|
-
# @param selector [String] a dot-separated sequence of property
|
109
|
-
# names denoting a sequence of descendants.
|
110
|
-
#
|
111
|
-
# @param value [MetaBlocks|MetaBool|MetaInlines|MetaList|MetaMap|MetaString|MetaValue|String]
|
112
|
-
# if value is a String, it is treated as a yaml string
|
113
|
-
def replace(selector, value)
|
114
|
-
parent = select(selector, true)
|
115
|
-
if value.is_a? String
|
116
|
-
value = meta_from_yaml(value)
|
117
|
-
end
|
118
|
-
parent.children[last_key(selector)] = value
|
119
|
-
end
|
120
|
-
|
121
|
-
# Get the property in this MetaMap matching the selector
|
122
|
-
#
|
123
|
-
# @param selector [String] a dot-separated sequence of property
|
124
|
-
# names denoting a sequence of descendants.
|
125
|
-
#
|
126
|
-
# @return [MetaBlocks|MetaBool|MetaInlines|MetaList|MetaMap|MetaString|MetaValue] the value matching the selected property, nil if it cannot be found
|
127
|
-
def get(selector)
|
128
|
-
select(selector)
|
129
|
-
end
|
130
|
-
|
131
|
-
# Has this MetaMap a descendant matching selector?
|
132
|
-
#
|
133
|
-
# @param selector [String] a dot-separated sequence of property
|
134
|
-
# names denoting a sequence of descendants
|
135
|
-
#
|
136
|
-
# @return [Boolean] True if this MetaMap contains a descendant
|
137
|
-
# matching selector, false otherwise
|
138
|
-
def has?(selector)
|
139
|
-
not select(selector).nil?
|
140
|
-
end
|
141
|
-
|
142
|
-
# Delete the property in this MetaMap that matches the selector
|
143
|
-
#
|
144
|
-
# @param selector [String] a dot-separated sequence of property
|
145
|
-
# names denoting a sequence of descendants
|
146
|
-
#
|
147
|
-
# @return [MetaBlocks|MetaBool|MetaInlines|MetaList|MetaMap|MetaString|MetaValue] the value of the deleted property, nil if it cannot be found
|
148
|
-
#
|
149
|
-
def delete(selector)
|
150
|
-
parent = select(selector, true)
|
151
|
-
parent.children.delete(last_key(selector))
|
152
|
-
end
|
153
68
|
|
154
69
|
# The AST contents
|
155
70
|
def ast_contents()
|
156
71
|
ast = Hash.new
|
157
72
|
@children.each_pair do |key, value|
|
158
73
|
ast[key] = value.to_ast
|
159
|
-
end
|
74
|
+
end if @children.is_a? Hash
|
160
75
|
ast
|
161
76
|
end
|
162
|
-
|
163
|
-
private
|
164
|
-
|
165
|
-
# Select a node given a selector as a dot separated sequence of
|
166
|
-
# descendant names.
|
167
|
-
#
|
168
|
-
# @param selector [String] Dot separated sequence of property
|
169
|
-
# names
|
170
|
-
#
|
171
|
-
# @param get_parent [Boolean = false] Get the parent MetaMap
|
172
|
-
# of the selected property instead of its value
|
173
|
-
#
|
174
|
-
# @return [MetaBlocks|MetaBool|MetaInlines|MetaList|MetaMap|MetaString|MetaValue] the value of the deleted property, nil if it cannot be found
|
175
|
-
def select(selector, get_parent = false)
|
176
|
-
keys = selector.split(".")
|
177
|
-
level = self
|
178
|
-
|
179
|
-
while not keys.empty?
|
180
|
-
key = keys.shift
|
181
|
-
if not level.children.has_key? key
|
182
|
-
return nil
|
183
|
-
else
|
184
|
-
if get_parent and keys.empty?
|
185
|
-
return level
|
186
|
-
else
|
187
|
-
level = level[key]
|
188
|
-
end
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
level
|
193
|
-
end
|
194
|
-
|
195
|
-
# Get the last key in this selector
|
196
|
-
def last_key(selector)
|
197
|
-
selector.split(".").last
|
198
|
-
end
|
199
77
|
|
200
|
-
# Convert a yaml string to a MetaMap
|
201
|
-
def meta_from_yaml(yaml_string)
|
202
|
-
json_string = Pandoc.new do
|
203
|
-
from "markdown"
|
204
|
-
to "json"
|
205
|
-
end << yaml_string
|
206
|
-
|
207
|
-
meta_doc = PandocFilter::Document.from_JSON json_string
|
208
|
-
meta_doc.meta.to_meta_map
|
209
|
-
end
|
210
78
|
end
|
211
79
|
end
|
212
80
|
end
|
@@ -16,18 +16,19 @@
|
|
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
|
-
|
22
|
-
require_relative "./node"
|
23
|
-
|
24
24
|
# A MetaValue Node is either a MetaMap, MetaList, MetaBool, MetaString, MetaInlines, or a MetaBlocks.
|
25
25
|
#
|
26
26
|
# @see http://hackage.haskell.org/package/pandoc-types-1.17.0.4/docs/Text-Pandoc-Definition.html#t:MetaValue
|
27
27
|
#
|
28
28
|
# @!attribute value
|
29
|
-
# @return [String]
|
29
|
+
# @return [String|Boolean]
|
30
30
|
class MetaValue < Node
|
31
|
+
include InnerMarkdown
|
31
32
|
|
32
33
|
attr_accessor :value
|
33
34
|
|
@@ -0,0 +1,114 @@
|
|
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
|
+
require "yaml"
|
20
|
+
require_relative "../pandoc.rb"
|
21
|
+
require_relative "../filter_error.rb"
|
22
|
+
|
23
|
+
module Paru
|
24
|
+
module PandocFilter
|
25
|
+
# A Metadata object is a Ruby Hash representation of a pandoc metadata
|
26
|
+
# node.
|
27
|
+
class Metadata < Hash
|
28
|
+
|
29
|
+
# Create a new Metadata object based on the contents.
|
30
|
+
#
|
31
|
+
# @param contents [MetaMap|String|Hash] the initial contents of this
|
32
|
+
# metadata. If contents is a String, it is treated as a YAML string
|
33
|
+
# and converted to a Hash first.
|
34
|
+
#
|
35
|
+
# @raise Error when converting contents to a Hash fails
|
36
|
+
def initialize(contents = {})
|
37
|
+
if not contents.is_a? Hash
|
38
|
+
# If not a Hash, it is either a YAML string or can be
|
39
|
+
# converted to a YAML string
|
40
|
+
if contents.is_a? PandocFilter::MetaMap
|
41
|
+
yaml_string = meta2yaml contents
|
42
|
+
elsif contents.is_a? String
|
43
|
+
yaml_string = contents
|
44
|
+
else
|
45
|
+
raise FilterError.new("Expected a Hash, MetaMap, or String, got '#{contents}' instead.")
|
46
|
+
end
|
47
|
+
|
48
|
+
# Try to convert the YAML string to a Hash
|
49
|
+
if yaml_string.empty?
|
50
|
+
contents = {}
|
51
|
+
else
|
52
|
+
contents = YAML.load yaml_string
|
53
|
+
end
|
54
|
+
|
55
|
+
if not contents
|
56
|
+
# Error parsing YAML
|
57
|
+
raise FilterError.new("Unable to convert YAML string '#{yaml_string}' to a Hash.")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Merge the contents with this newly created Metadata
|
62
|
+
contents.each do |key, value|
|
63
|
+
self[key] = value
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# Convert this Metadata to a pandoc AST representation of
|
68
|
+
# metadata: {PandocFilter::Meta}
|
69
|
+
#
|
70
|
+
# @return [Meta] the pandoc AST representation as a {PandocFilter::Meta} node
|
71
|
+
def to_meta()
|
72
|
+
if self.empty?
|
73
|
+
PandocFilter::Meta.new {}
|
74
|
+
else
|
75
|
+
begin
|
76
|
+
yaml_string = "#{clean_hash.to_yaml}..."
|
77
|
+
yaml2json = Paru::Pandoc.new {from "markdown"; to "json"}
|
78
|
+
json_string = yaml2json << yaml_string
|
79
|
+
meta_doc = PandocFilter::Document.from_JSON json_string
|
80
|
+
meta_doc.meta
|
81
|
+
rescue
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
# Convert a {PandocFilter::Meta} node to a Metadata
|
89
|
+
#
|
90
|
+
# @param meta [Meta|MetaMap] the {PandocFilter::Meta} node to convert to a
|
91
|
+
# MetadataHash
|
92
|
+
def meta2yaml(meta)
|
93
|
+
begin
|
94
|
+
json2yaml = Paru::Pandoc.new {from "json"; to "markdown"; standalone}
|
95
|
+
meta = PandocFilter::Meta.from_meta_map(meta) unless meta.is_a? PandocFilter::Meta
|
96
|
+
meta_doc = PandocFilter::Document.new(PandocFilter::CURRENT_PANDOC_VERSION, meta.to_ast, [])
|
97
|
+
yaml_string = json2yaml << meta_doc.to_JSON
|
98
|
+
yaml_string.strip
|
99
|
+
rescue
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# Create a true Hash from this Metadata to prevent the +to_yaml+
|
104
|
+
# method from mixing in the name of this class and confusing pandoc
|
105
|
+
def clean_hash
|
106
|
+
hash = {}
|
107
|
+
each do |key, value|
|
108
|
+
hash[key] = value
|
109
|
+
end
|
110
|
+
hash
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|