paru 0.2.4.8 → 0.2.5b

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f287d46ed1a1baf39416d71f0fd52a225062be99
4
- data.tar.gz: 1ada26f825334fc92975559863c8c2da1dafa87d
3
+ metadata.gz: 87a2a350eeeb33246aa3d841ca14062935c29806
4
+ data.tar.gz: 92e889e2dd7b06f6966327406cb8fed6d3b2f3dc
5
5
  SHA512:
6
- metadata.gz: 783f0782f3d3c41a697ef4612c50a1bebf246e414639e66e04534cec150b6e5b6a5d7aa53c8bc89daea76bea4fc278f66825e736f767838267a3e7e94f79228e
7
- data.tar.gz: 6a88cc2fe3e25510b03613e21a53b332deae52ed1e30f4ec5c19c597c1336b28101d111bf1646cbb823119c2010810b808df1306d4eb464b25c514c4dc71da8d
6
+ metadata.gz: 616a84c6f967318840a95e4c4f993a63e48cc461e95bab75981dc92b35a8b32db473a1878dc46371893a2b875eddbc964d2974a616ebc0f37c1f5c8b092f5015
7
+ data.tar.gz: 4ce02c9ad9a3983c2751bda198efcbdab1701ad9e5a5f181d03e5cf440ebc7a98f2390723c635fffb327b65e44a7856c4564e8e67e8ed26c60d2273760178c8d
data/bin/do-pandoc.rb CHANGED
@@ -2,7 +2,9 @@
2
2
  require "yaml"
3
3
  require 'optparse'
4
4
  require "paru/pandoc"
5
- require "paru/pandoc2yaml"
5
+ require_relative "./pandoc2yaml.rb"
6
+
7
+ include Pandoc2Yaml
6
8
 
7
9
  parser = OptionParser.new do |opts|
8
10
  opts.banner = "do-pandoc.rb runs pandoc on an input file using the pandoc configuration specified in that input file."
@@ -42,9 +44,7 @@ if !File.readable? document
42
44
  warn "Cannot read file: #{input_document}"
43
45
  exit
44
46
  end
45
-
46
- yaml = Paru::Pandoc2Yaml.extract_metadata(document)
47
- metadata = YAML.load yaml
47
+ metadata = YAML.load Pandoc2Yaml.extract_metadata(document)
48
48
 
49
49
  if metadata.has_key? "pandoc" then
50
50
  begin
@@ -65,5 +65,5 @@ if metadata.has_key? "pandoc" then
65
65
  warn "Something went wrong while using pandoc:\n\n#{e.message}"
66
66
  end
67
67
  else
68
- warn "Unsure what to do: no pandoc options in #{input_document}"
68
+ warn "Unsure what to do: no pandoc options in #{input}"
69
69
  end
data/bin/pandoc2yaml.rb CHANGED
@@ -9,51 +9,86 @@
9
9
  # pandoc2yaml.rb input_file
10
10
  #
11
11
  ##
12
- require "json"
13
- require 'optparse'
14
- require 'paru/pandoc2yaml'
12
+ module Pandoc2Yaml
13
+ require "json"
14
+ require "paru/pandoc"
15
15
 
16
- parser = OptionParser.new do |opts|
16
+ # Paru converters:
17
+ # Note. When converting metadata back to the pandoc markdown format, you have
18
+ # to use the option "standalone", otherwise the metadata is skipped
19
+ PANDOC_2_JSON = Paru::Pandoc.new {from "markdown"; to "json"}
20
+ JSON_2_PANDOC = Paru::Pandoc.new {from "json"; to "markdown"; standalone}
21
+
22
+ # When converting a pandoc document to JSON, or vice versa, the JSON object
23
+ # has the following three properties:
24
+ VERSION = "pandoc-api-version"
25
+ META = "meta"
26
+ BLOCKS = "blocks"
27
+
28
+ def extract_metadata input_document
29
+ json = JSON.parse(PANDOC_2_JSON << File.read(input_document))
30
+ yaml = ""
31
+
32
+ version, metadata = json.values_at(VERSION, META)
33
+
34
+ if not metadata.empty? then
35
+ metadata_document = {
36
+ VERSION => version,
37
+ META => metadata,
38
+ BLOCKS => []
39
+ }
40
+
41
+ yaml = JSON_2_PANDOC << JSON.generate(metadata_document)
42
+ end
43
+
44
+ yaml
45
+ end
46
+ end
47
+
48
+ if __FILE__ == $0
49
+ include Pandoc2Yaml
50
+ require 'optparse'
51
+
52
+ parser = OptionParser.new do |opts|
17
53
  opts.banner = "pandoc2yaml.rb mines a pandoc markdown file for its YAML metadata"
18
54
  opts.banner << "\n\nUsage: pandoc2yaml.rb some-pandoc-markdownfile.md"
19
55
  opts.separator ""
20
56
  opts.separator "Common options"
21
57
 
22
58
  opts.on_tail("-h", "--help", "Show this message") do
23
- puts opts
24
- exit
59
+ puts opts
60
+ exit
25
61
  end
26
62
 
27
63
  opts.on("-v", "--version", "Show version") do
28
- puts "pandoc2yaml.rb is part of paru version 0.2.3"
29
- exit
64
+ puts "pandoc2yaml.rb is part of paru version 0.2.3"
65
+ exit
30
66
  end
31
- end
67
+ end
32
68
 
33
- parser.parse! ARGV
69
+ parser.parse! ARGV
34
70
 
35
- input_document = ARGV.pop
71
+ input_document = ARGV.pop
36
72
 
37
- if ARGV.size != 0 then
73
+ if ARGV.size != 0 then
38
74
  warn "Expecting exactly one argument: the pandoc file to strip for metadata"
39
75
  puts ""
40
76
  puts parser
41
77
  exit
42
- end
78
+ end
43
79
 
44
- document = File.expand_path input_document
45
- if not File.exist? document
80
+ document = File.expand_path input_document
81
+ if not File.exist? document
46
82
  warn "Cannot find file: #{input_document}"
47
83
  exit
48
- end
84
+ end
49
85
 
50
- if !File.readable? document
86
+ if !File.readable? document
51
87
  warn "Cannot read file: #{input_document}"
52
88
  exit
53
- end
54
-
55
- yaml = Paru::Pandoc2Yaml.extract_metadata(document)
89
+ end
56
90
 
57
- yaml = "---\n..." if yaml.empty?
58
-
59
- puts yaml
91
+ output_metadata = Pandoc2Yaml.extract_metadata document
92
+
93
+ puts output_metadata
94
+ end
@@ -20,11 +20,10 @@ module Paru
20
20
  module PandocFilter
21
21
 
22
22
  require "json"
23
- require_relative "./node.rb"
24
- require_relative "./plain.rb"
25
- require_relative "./meta.rb"
26
- require_relative "./version.rb"
27
- require_relative "../filter_error.rb"
23
+ require_relative "./node"
24
+ require_relative "./plain"
25
+ require_relative "./meta"
26
+ require_relative "./version"
28
27
 
29
28
  # Pandoc type version key
30
29
  VERSION = "pandoc-api-version"
@@ -50,37 +49,9 @@ module Paru
50
49
  #
51
50
  # @param json [String] a JSON string representation of the AST of a document
52
51
  # @return [Document] the newly created document
53
- #
54
- # @raise [ParuFilterError] when parsing JSON AST from pandoc fails
55
- # or the parsed results do not make sense.
56
52
  def self.from_JSON(json)
57
- begin
58
- doc = JSON.parse json
59
- version, metadata, contents = doc.values_at(VERSION, META, BLOCKS)
60
- rescue Exception => e
61
- raise FilterError.new <<WARNING
62
- Unable to read document.
63
-
64
- Most likely cause: Paru expects a pandoc installation that has been
65
- compiled with pandoc-types >= #{CURRENT_PANDOC_VERSION.join('.')}. You can
66
- check which pandoc-types have been compiled with your pandoc installation by
67
- running `pandoc -v`.
68
-
69
- Original error message: #{e.message}
70
- WARNING
71
- end
72
-
73
- if -1 == (version <=> CURRENT_PANDOC_VERSION)
74
- if metadata.has_key?('_debug')
75
- warn <<WARNING
76
- pandoc-types API version used in document (version = #{version.join('.')}) is
77
- lower than the version of pandoc-types used by paru
78
- (#{CURRENT_PANDOC_VERSION.join('.')}. If you experience unexpected results,
79
- please try updating pandoc or downgrading paru.
80
- WARNING
81
- end
82
- end
83
-
53
+ doc = JSON.parse json
54
+ version, metadata, contents = doc.values_at(VERSION, META, BLOCKS)
84
55
  PandocFilter::Document.new version, metadata, contents
85
56
  end
86
57
 
@@ -42,7 +42,7 @@ module Paru
42
42
  end
43
43
 
44
44
  # Get the value belonging to key. Prefer to use the {has?}, {get},
45
- # {replace} and {delete} methods to manipulate metadata.
45
+ # and {delete} methods to manipulate metadata.
46
46
  #
47
47
  # @param key [String] the key
48
48
  #
@@ -56,7 +56,9 @@ module Paru
56
56
  # to set the metadata.
57
57
  #
58
58
  # @param key [String] the key to set
59
- # @param value [MetaBlocks|MetaBool|MetaInlines|MetaList|MetaMap|MetaString|MetaValue] the value to set
59
+ # @param value
60
+ # [MetaBlocks|MetaBool|MetaInline|MetaList|MetaMap|MetaString|MetaValue]
61
+ # the value to set
60
62
  def []=(key, value)
61
63
  @children[key] = value
62
64
  end
@@ -71,7 +73,6 @@ module Paru
71
73
  # Mixin the YAML code into this metadata object
72
74
  #
73
75
  # @param yaml_string [YAML] A string with YAML data
74
- # @return [MetaMap] this MetaMap object
75
76
  #
76
77
  # @example Set some properties in the metadata
77
78
  # #!/usr/bin/env ruby
@@ -81,7 +82,7 @@ module Paru
81
82
  # Paru::Filter.run do
82
83
  # metadata.yaml <<~YAML
83
84
  # ---
84
- # date: #{Date.today.to_s}
85
+ # date: Date.today.to_s
85
86
  # title: This **is** the title
86
87
  # pandoc_options:
87
88
  # from: markdown
@@ -98,7 +99,6 @@ module Paru
98
99
  meta_from_yaml(yaml_string).each do |key, value|
99
100
  self[key] = value
100
101
  end
101
- self
102
102
  end
103
103
 
104
104
  # Replace the property in this MetaMap matching the selector with
@@ -108,7 +108,8 @@ module Paru
108
108
  # @param selector [String] a dot-separated sequence of property
109
109
  # names denoting a sequence of descendants.
110
110
  #
111
- # @param value [MetaBlocks|MetaBool|MetaInlines|MetaList|MetaMap|MetaString|MetaValue|String]
111
+ # @param value
112
+ # [MetaBlocks|MetaBool|MetaInline|MetaList|MetaMap|MetaString|MetaValue|String]
112
113
  # if value is a String, it is treated as a yaml string
113
114
  def replace(selector, value)
114
115
  parent = select(selector, true)
@@ -123,7 +124,7 @@ module Paru
123
124
  # @param selector [String] a dot-separated sequence of property
124
125
  # names denoting a sequence of descendants.
125
126
  #
126
- # @return [MetaBlocks|MetaBool|MetaInlines|MetaList|MetaMap|MetaString|MetaValue] the value matching the selected property, nil if it cannot be found
127
+ # @return [MetaBlocks|MetaBool|MetaInline|MetaList|MetaMap|MetaString|MetaValue] the value matching the selected property, nil if it cannot be found
127
128
  def get(selector)
128
129
  select(selector)
129
130
  end
@@ -144,17 +145,14 @@ module Paru
144
145
  # @param selector [String] a dot-separated sequence of property
145
146
  # names denoting a sequence of descendants
146
147
  #
147
- # @return [MetaBlocks|MetaBool|MetaInlines|MetaList|MetaMap|MetaString|MetaValue] the value of the deleted property, nil if it cannot be found
148
+ # @return [MetaBlocks|MetaBool|MetaInline|MetaList|MetaMap|MetaString|MetaValue] the value of the deleted property, nil if it cannot be found
148
149
  #
149
150
  def delete(selector)
150
- if has?(selector)
151
- parent = select(selector, true)
152
- parent.children.delete(last_key(selector))
153
- else
154
- nil
155
- end
151
+ parent = select(selector, true)
152
+ parent.children.delete(last_key(selector))
156
153
  end
157
154
 
155
+
158
156
  # The AST contents
159
157
  def ast_contents()
160
158
  ast = Hash.new
@@ -175,7 +173,7 @@ module Paru
175
173
  # @param get_parent [Boolean = false] Get the parent MetaMap
176
174
  # of the selected property instead of its value
177
175
  #
178
- # @return [MetaBlocks|MetaBool|MetaInlines|MetaList|MetaMap|MetaString|MetaValue] the value of the deleted property, nil if it cannot be found
176
+ # @return [MetaBlocks|MetaBool|MetaInline|MetaList|MetaMap|MetaString|MetaValue] the value of the deleted property, nil if it cannot be found
179
177
  def select(selector, get_parent = false)
180
178
  keys = selector.split(".")
181
179
  level = self
@@ -26,7 +26,7 @@ module Paru
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|Boolean]
29
+ # @return [String]
30
30
  class MetaValue < Node
31
31
 
32
32
  attr_accessor :value
@@ -38,7 +38,7 @@ module Paru
38
38
  end
39
39
 
40
40
  # Create an AST representation of this RawBlock node
41
- def ast_contents()
41
+ def to_ast()
42
42
  [
43
43
  @format,
44
44
  @string
data/lib/paru/filter.rb CHANGED
@@ -19,7 +19,7 @@
19
19
  module Paru
20
20
 
21
21
  require_relative "./selector"
22
- require_relative "./filter/document"
22
+ require_relative "filter/document"
23
23
 
24
24
  # Paru filter is a wrapper around pandoc's JSON api, which is based on
25
25
  # {pandoc-types}[https://hackage.haskell.org/package/pandoc-types-1.17.0.4/docs/Text-Pandoc-Definition.html].
@@ -198,23 +198,11 @@ module Paru
198
198
  #
199
199
  class Filter
200
200
 
201
- # Create a new Filter instance. For convenience, {run} creates a new
202
- # {Filter} and runs it immediately. Use this constructor if you want
203
- # to run a filter on different input and output streams that STDIN and
204
- # STDOUT respectively.
205
- #
206
- # @param input [IO = $stdin] the input stream to read, defaults to
207
- # STDIN
208
- # @param output [IO = $stdout] the output stream to write, defaults to
209
- # STDOUT
210
- def initialize(input = $stdin, output = $stdout)
211
- @input = input
212
- @output = output
213
- end
214
-
215
- # Run the filter specified by block. This is a convenience method that
216
- # creates a new {Filter} using input stream STDIN and output stream
217
- # STDOUT and immediately runs {filter} with the block supplied.
201
+ # Run the filter specified by block. In the block you specify
202
+ # selectors and actions to be performed on selected nodes. In the
203
+ # example below, the selector is "Image", which selects all image
204
+ # nodes. The action is to prepend the contents of the image's caption
205
+ # by the string "Figure. ".
218
206
  #
219
207
  # @param block [Proc] the filter specification
220
208
  #
@@ -225,39 +213,23 @@ module Paru
225
213
  # end
226
214
  # end
227
215
  def self.run(&block)
228
- Filter.new($stdin, $stdout).filter(&block)
216
+ Filter.new().filter(&block)
229
217
  end
230
218
 
219
+
231
220
  # The Document node from JSON formatted pandoc document structure
232
221
  # on STDIN that is being filtered
233
222
  #
234
223
  # @return [Document] create a new Document node from a pandoc AST from
235
224
  # JSON from STDIN
236
225
  def document()
237
- PandocFilter::Document.from_JSON @input.read
226
+ PandocFilter::Document.from_JSON $stdin.read
238
227
  end
239
228
 
240
- # Create a filter using +block+. In the block you specify
241
- # selectors and actions to be performed on selected nodes. In the
242
- # example below, the selector is "Image", which selects all image
243
- # nodes. The action is to prepend the contents of the image's caption
244
- # by the string "Figure. ".
245
- #
246
- # @param block [Proc] the filter specification
229
+ # Create a filter using +block+.
247
230
  #
231
+ # @param block [Proc] a block specifying selectors and actions
248
232
  # @return [JSON] a JSON string with the filtered pandoc AST
249
- #
250
- # @example Add 'Figure' to each image's caption
251
- # input = IOString.new(File.read("my_report.md")
252
- # output = IOString.new
253
- #
254
- # Paru::Filter.new(input, output).filter do
255
- # with "Image" do |image|
256
- # image.inner_markdown = "Figure. #{image.inner_markdown}"
257
- # end
258
- # end
259
- #
260
- # # do something with output.string
261
233
  def filter(&block)
262
234
  @selectors = Hash.new
263
235
  @filtered_nodes = []
@@ -268,9 +240,10 @@ module Paru
268
240
  instance_eval(&block)
269
241
  end
270
242
 
271
- @output.write @doc.to_JSON
243
+ puts @doc.to_JSON
272
244
  end
273
245
 
246
+
274
247
  # +current_node+ points to the node that is *now* being processed while
275
248
  # running this filter.
276
249
  #
@@ -298,8 +271,4 @@ module Paru
298
271
  end
299
272
 
300
273
  end
301
-
302
- # FilterError is thrown when there is an error during fitlering
303
- class FilterError < Error
304
- end
305
274
  end
data/lib/paru/selector.rb CHANGED
@@ -25,6 +25,7 @@ module Paru
25
25
  class SelectorParseError < Error
26
26
  end
27
27
 
28
+
28
29
  # A Selector models a relationship between Pandoc AST nodes, such as
29
30
  # parent-child or sibling. Selectors in paru are like CSS selectors, but
30
31
  # more limited because the Pandoc AST is quite simple.
data/lib/paru.rb CHANGED
@@ -18,11 +18,9 @@
18
18
  #++
19
19
  module Paru
20
20
  require "paru/pandoc"
21
- require "paru/filter"
22
- require "paru/filter_error"
23
21
  require "paru/error"
24
- require "paru/pandoc2yaml"
22
+ require "paru/filter"
25
23
 
26
24
  # Paru's current version
27
- VERSION = [0, 2, 4, 7]
25
+ VERSION = [0, 2, 4, 4]
28
26
  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.8
4
+ version: 0.2.5b
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-02 00:00:00.000000000 Z
11
+ date: 2017-05-19 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
@@ -80,9 +80,7 @@ files:
80
80
  - lib/paru/filter/table_row.rb
81
81
  - lib/paru/filter/target.rb
82
82
  - lib/paru/filter/version.rb
83
- - lib/paru/filter_error.rb
84
83
  - lib/paru/pandoc.rb
85
- - lib/paru/pandoc2yaml.rb
86
84
  - lib/paru/pandoc_options.yaml
87
85
  - lib/paru/selector.rb
88
86
  homepage: https://heerdebeer.org/Software/markdown/paru/
@@ -100,9 +98,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
100
98
  version: '0'
101
99
  required_rubygems_version: !ruby/object:Gem::Requirement
102
100
  requirements:
103
- - - ">="
101
+ - - ">"
104
102
  - !ruby/object:Gem::Version
105
- version: '0'
103
+ version: 1.3.1
106
104
  requirements: []
107
105
  rubyforge_project:
108
106
  rubygems_version: 2.5.2
@@ -1,24 +0,0 @@
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_relative "./error.rb"
20
- module Paru
21
- # A FilterError raised when there is an error while running a filter.
22
- class FilterError < Error
23
- end
24
- end
@@ -1,71 +0,0 @@
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
- require "json"
21
- require_relative "./pandoc.rb"
22
-
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
29
-
30
- # Converter from pandoc's markdown to pandoc's AST JSON
31
- PANDOC_2_JSON = Paru::Pandoc.new {from "markdown"; to "json"}
32
-
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}
37
-
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"
47
-
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 = ""
55
-
56
- version, metadata = json.values_at(VERSION, META)
57
-
58
- if not metadata.empty? then
59
- metadata_document = {
60
- VERSION => version,
61
- META => metadata,
62
- BLOCKS => []
63
- }
64
-
65
- yaml = JSON_2_PANDOC << JSON.generate(metadata_document)
66
- end
67
-
68
- yaml
69
- end
70
- end
71
- end