pandocomatic 0.2.5.0.alpha → 0.2.5.0.betad
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/pandocomatic/cli.rb +0 -1
- data/lib/pandocomatic/command/convert_file_command.rb +3 -1
- data/lib/pandocomatic/command/convert_file_multiple_command.rb +1 -1
- data/lib/pandocomatic/configuration.rb +24 -31
- data/lib/pandocomatic/input.rb +10 -0
- data/lib/pandocomatic/multiple_files_input.rb +27 -8
- data/lib/pandocomatic/pandoc_metadata.rb +31 -8
- data/lib/pandocomatic/pandocomatic.rb +13 -5
- data/lib/pandocomatic/printer/finish_printer.rb +1 -1
- metadata +18 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c46b6b2c7d745668a59b28bb2f38823ece50c90f24bd53e31c586489e429cb88
|
4
|
+
data.tar.gz: 336889e4f77b7511034f62cb21ab42c01095818e79ebd3d758f30aecc8e10278
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f1f6304e2838a32387b88fd4a18f855e1ee90159262635b9f2cd2b3f568523868dcb157499dcd6fb886f77769ca5a687f68427f24ffb233cb8e6f914e0de9e00
|
7
|
+
data.tar.gz: 5f13e1a64e6b012726d55053df8bf0eb9a7bca879201f3c71d164ae526f6ad7db721b0032616471223e7910d88b202cc44791361ec1812e1fc06ae459e16bcc1
|
data/lib/pandocomatic/cli.rb
CHANGED
@@ -90,7 +90,9 @@ module Pandocomatic
|
|
90
90
|
#
|
91
91
|
# @return [String]
|
92
92
|
def to_s
|
93
|
-
"convert #{File.basename @src} #{"-> #{File.basename @dst}" unless @dst.nil?}"
|
93
|
+
str = "convert #{File.basename @src} #{"-> #{File.basename @dst}" unless @dst.nil?}"
|
94
|
+
str += "\n\t encountered multiple pandocomatic properties in the metadata. Only the last occurring pandocomatic property is being used." unless @metadata.unique?
|
95
|
+
str
|
94
96
|
end
|
95
97
|
|
96
98
|
private
|
@@ -61,6 +61,8 @@ module Pandocomatic
|
|
61
61
|
# A Configuration object models a pandocomatic configuration.
|
62
62
|
class Configuration
|
63
63
|
|
64
|
+
attr_reader :input
|
65
|
+
|
64
66
|
# Pandocomatic's default configuration file
|
65
67
|
CONFIG_FILE = 'pandocomatic.yaml'
|
66
68
|
|
@@ -75,7 +77,7 @@ module Pandocomatic
|
|
75
77
|
@input = if input.nil? or input.empty? then
|
76
78
|
nil
|
77
79
|
elsif 1 < input.size then
|
78
|
-
MultipleFilesInput.new(input)
|
80
|
+
MultipleFilesInput.new(input, self)
|
79
81
|
else
|
80
82
|
Input.new(input)
|
81
83
|
end
|
@@ -265,7 +267,7 @@ module Pandocomatic
|
|
265
267
|
# Get the input file name
|
266
268
|
#
|
267
269
|
# @return [String]
|
268
|
-
def
|
270
|
+
def input_file()
|
269
271
|
if @input.nil? then
|
270
272
|
nil
|
271
273
|
else
|
@@ -347,7 +349,6 @@ module Pandocomatic
|
|
347
349
|
@settings.has_key? 'match-files' and 'first' == @settings['match-files']
|
348
350
|
end
|
349
351
|
|
350
|
-
|
351
352
|
# Set the extension of the destination file given this Confguration,
|
352
353
|
# template, and metadata
|
353
354
|
#
|
@@ -386,22 +387,13 @@ module Pandocomatic
|
|
386
387
|
end
|
387
388
|
end
|
388
389
|
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
# Output option in pandoc property has precedence
|
393
|
-
if metadata.has_pandocomatic?
|
394
|
-
pandocomatic = metadata.pandocomatic
|
395
|
-
if pandocomatic.has_key? "pandoc"
|
396
|
-
pandoc = pandocomatic["pandoc"]
|
397
|
-
destination = determine_output_in_pandoc.call pandoc
|
398
|
-
rename_script = pandoc["rename"]
|
399
|
-
end
|
400
|
-
end
|
390
|
+
# Output options in pandoc property have precedence
|
391
|
+
destination = determine_output_in_pandoc.call metadata.pandoc_options
|
392
|
+
rename_script = metadata.pandoc_options["rename"]
|
401
393
|
|
402
394
|
# Output option in template's pandoc property is next
|
403
395
|
if destination.nil? and not template_name.nil? and not template_name.empty? then
|
404
|
-
if @templates[template_name].has_key? "pandoc"
|
396
|
+
if @templates[template_name].has_key? "pandoc" and not @templates[template_name]["pandoc"].nil?
|
405
397
|
pandoc = @templates[template_name]["pandoc"]
|
406
398
|
destination = determine_output_in_pandoc.call pandoc
|
407
399
|
rename_script ||= pandoc["rename"]
|
@@ -445,21 +437,14 @@ module Pandocomatic
|
|
445
437
|
end
|
446
438
|
|
447
439
|
if template_name.nil? or template_name.empty? then
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
if not ext.nil?
|
455
|
-
extension = ext
|
456
|
-
elsif pandoc.has_key? "to"
|
457
|
-
extension = strip_extensions.call(pandoc["to"])
|
458
|
-
end
|
459
|
-
end
|
460
|
-
end
|
440
|
+
ext = use_extension.call metadata.pandoc_options
|
441
|
+
if not ext.nil?
|
442
|
+
extension = ext
|
443
|
+
elsif metadata.pandoc_options.has_key? "to"
|
444
|
+
extension = strip_extensions.call(metadata.pandoc_options["to"])
|
445
|
+
end
|
461
446
|
else
|
462
|
-
if @templates[template_name].has_key? "pandoc"
|
447
|
+
if @templates[template_name].has_key? "pandoc" and not @templates[template_name]["pandoc"].nil?
|
463
448
|
pandoc = @templates[template_name]["pandoc"]
|
464
449
|
ext = use_extension.call pandoc
|
465
450
|
|
@@ -475,6 +460,15 @@ module Pandocomatic
|
|
475
460
|
extension
|
476
461
|
end
|
477
462
|
|
463
|
+
def is_markdown_file?(filename)
|
464
|
+
if filename.nil? then
|
465
|
+
false
|
466
|
+
else
|
467
|
+
ext = File.extname(filename).delete_prefix(".");
|
468
|
+
"markdown" == DEFAULT_EXTENSION.key(ext)
|
469
|
+
end
|
470
|
+
end
|
471
|
+
|
478
472
|
# Is there a template with template_name in this Configuration?
|
479
473
|
#
|
480
474
|
# @param template_name [String] a template's name
|
@@ -885,6 +879,5 @@ module Pandocomatic
|
|
885
879
|
|
886
880
|
path
|
887
881
|
end
|
888
|
-
|
889
882
|
end
|
890
883
|
end
|
data/lib/pandocomatic/input.rb
CHANGED
@@ -23,11 +23,14 @@ module Pandocomatic
|
|
23
23
|
# Generic class to handle input files and directories in a general manner.
|
24
24
|
class Input
|
25
25
|
|
26
|
+
attr_reader :errors
|
27
|
+
|
26
28
|
# Create a new Input
|
27
29
|
#
|
28
30
|
# @param input [String[]] a list of input files
|
29
31
|
def initialize(input)
|
30
32
|
@input_files = input
|
33
|
+
@errors = []
|
31
34
|
end
|
32
35
|
|
33
36
|
# The absolute path to this Input
|
@@ -57,6 +60,13 @@ module Pandocomatic
|
|
57
60
|
def directory?()
|
58
61
|
File.directory? @input_files.first
|
59
62
|
end
|
63
|
+
|
64
|
+
# Does this input have encountered any errors?
|
65
|
+
#
|
66
|
+
# @return Boolean
|
67
|
+
def has_errors?()
|
68
|
+
not @errors.empty?
|
69
|
+
end
|
60
70
|
|
61
71
|
# A string representation of this Input
|
62
72
|
#
|
@@ -28,8 +28,9 @@ module Pandocomatic
|
|
28
28
|
# is created as well containing the content of all the files in input.
|
29
29
|
#
|
30
30
|
# @param input [String[]] a list with input files
|
31
|
-
def initialize(input)
|
31
|
+
def initialize(input, config)
|
32
32
|
super(input)
|
33
|
+
@config = config
|
33
34
|
create_temp_file
|
34
35
|
end
|
35
36
|
|
@@ -37,7 +38,7 @@ module Pandocomatic
|
|
37
38
|
#
|
38
39
|
# @return String
|
39
40
|
def name()
|
40
|
-
@tmp_file
|
41
|
+
@tmp_file.path
|
41
42
|
end
|
42
43
|
|
43
44
|
# Is this input a directory? A MultipleFilesInput cannot be a
|
@@ -60,7 +61,19 @@ module Pandocomatic
|
|
60
61
|
#
|
61
62
|
# @return String
|
62
63
|
def to_s()
|
63
|
-
@input_files.
|
64
|
+
input_string = @input_files.first
|
65
|
+
previous_dir = File.dirname @input_files.first
|
66
|
+
@input_files.slice(1..-1).each do |f|
|
67
|
+
current_dir = File.dirname f
|
68
|
+
if current_dir == previous_dir
|
69
|
+
input_string += " + #{File.basename f}"
|
70
|
+
else
|
71
|
+
previous_dir = current_dir
|
72
|
+
input_string += " + #{f}"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
input_string
|
64
77
|
end
|
65
78
|
|
66
79
|
private
|
@@ -69,13 +82,19 @@ module Pandocomatic
|
|
69
82
|
# Concatenate all input files into one (temporary) input file
|
70
83
|
# created in the same directory as the first input file
|
71
84
|
@tmp_file = Tempfile.new(@input_files.first, File.dirname(self.absolute_path))
|
72
|
-
|
73
|
-
@input_files.
|
74
|
-
|
75
|
-
|
76
|
-
@
|
85
|
+
|
86
|
+
contents = @input_files.map{|file|
|
87
|
+
@errors.push IOError.new(:file_does_not_exist, nil, file) unless File.exist? file
|
88
|
+
@errors.push IOError.new(:file_is_not_a_file, nil, file) unless File.file? file
|
89
|
+
@errors.push IOError.new(:file_is_not_readable, nil, file) unless File.readable? file
|
90
|
+
File.read File.absolute_path(file)
|
91
|
+
}.join("\n\n")
|
92
|
+
|
93
|
+
if not PandocMetadata.unique_pandocomatic_property? contents
|
94
|
+
warn "\nWarning: Encountered the pandocomatic metadata property more than once. Only the last occurrence of the pandocomatic metadata property is being used. Most likely you only want to use a pandocomatic metadata property in the first input file.\n\n"
|
77
95
|
end
|
78
96
|
|
97
|
+
@tmp_file.write contents
|
79
98
|
@tmp_file.rewind
|
80
99
|
end
|
81
100
|
end
|
@@ -36,7 +36,7 @@ module Pandocomatic
|
|
36
36
|
#
|
37
37
|
# @param input_document [String] a path to an input file
|
38
38
|
# @return [String] the input document's metadata in the YAML format.
|
39
|
-
def self.extract_metadata
|
39
|
+
def self.extract_metadata(input_document)
|
40
40
|
begin
|
41
41
|
pandoc2yaml File.read(input_document)
|
42
42
|
rescue StandardError => e
|
@@ -65,19 +65,31 @@ module Pandocomatic
|
|
65
65
|
.join("\n")
|
66
66
|
end
|
67
67
|
|
68
|
+
# Does the pandocomatic metadata property occur at most once?
|
69
|
+
#
|
70
|
+
# @return [Boolean] False if the pandocomatic metadata property does
|
71
|
+
# occur multiple times.
|
72
|
+
def self.unique_pandocomatic_property?(input)
|
73
|
+
1 >= input
|
74
|
+
.scan(METADATA_BLOCK)
|
75
|
+
.map {|match| YAML.load "---#{match.join()}..."}
|
76
|
+
.count {|yaml| yaml.key? "pandocomatic_" or yaml.key? "pandocomatic"}
|
77
|
+
end
|
78
|
+
|
68
79
|
# Collect the metadata embedded in the src file and create a new
|
69
80
|
# PandocMetadata instance
|
70
81
|
#
|
71
82
|
# @param src [String] the path to the file to load metadata from
|
72
83
|
# @return [PandocMetadata] the metadata in the source file, or an empty
|
73
84
|
# one if no such metadata is contained in the source file.
|
74
|
-
def self.load_file
|
75
|
-
|
85
|
+
def self.load_file(src)
|
86
|
+
input = File.read src
|
87
|
+
yaml_metadata = pandoc2yaml input
|
76
88
|
|
77
89
|
if yaml_metadata.empty? then
|
78
|
-
|
90
|
+
PandocMetadata.new
|
79
91
|
else
|
80
|
-
|
92
|
+
PandocMetadata.new YAML.load(yaml_metadata), unique_pandocomatic_property?(input)
|
81
93
|
end
|
82
94
|
end
|
83
95
|
|
@@ -86,10 +98,21 @@ module Pandocomatic
|
|
86
98
|
#
|
87
99
|
# @param hash [Hash] initial properties for this new PandocMetadata
|
88
100
|
# object
|
101
|
+
# @param unique [Boolean = true] the pandocomatic property did occur
|
102
|
+
# at most once.
|
89
103
|
# @return [PandocMetadata]
|
90
|
-
def initialize
|
91
|
-
super
|
104
|
+
def initialize(hash = {}, unique = true)
|
105
|
+
super()
|
92
106
|
merge! hash
|
107
|
+
@unique = unique
|
108
|
+
end
|
109
|
+
|
110
|
+
# Did the metadata contain multiple pandocomatic blocks?
|
111
|
+
#
|
112
|
+
# @return [Boolean] True if at most one pandocomatic block was present
|
113
|
+
# in the metadata
|
114
|
+
def unique?()
|
115
|
+
@unique
|
93
116
|
end
|
94
117
|
|
95
118
|
# Does this PandocMetadata object use a template?
|
@@ -170,7 +193,7 @@ module Pandocomatic
|
|
170
193
|
# @return [Boolean] True if there is a pandoc options property in this
|
171
194
|
# PandocMetadata object. False otherwise.
|
172
195
|
def has_pandoc_options?()
|
173
|
-
has_pandocomatic? and pandocomatic.has_key? 'pandoc'
|
196
|
+
has_pandocomatic? and pandocomatic.has_key? 'pandoc' and not pandocomatic['pandoc'].nil?
|
174
197
|
end
|
175
198
|
|
176
199
|
end
|
@@ -47,8 +47,8 @@ module Pandocomatic
|
|
47
47
|
ERROR_STATUS = 1266 # This is the sum of the ascii values of the characters in 'pandocomatic'
|
48
48
|
|
49
49
|
# Pandocomatic's current version
|
50
|
-
VERSION = [0, 2, 5, 0, "
|
51
|
-
|
50
|
+
VERSION = [0, 2, 5, 0, "beta"]
|
51
|
+
|
52
52
|
# Run pandocomatic given options
|
53
53
|
#
|
54
54
|
# @param args [String[]] list of options to configure pandocomatic
|
@@ -66,15 +66,23 @@ module Pandocomatic
|
|
66
66
|
# version option. If given, the help is printed.
|
67
67
|
HelpPrinter.new().print
|
68
68
|
else
|
69
|
+
# When using multiple input files, errors reading these
|
70
|
+
# files are already encountered at this point. If there
|
71
|
+
# are any errors, there is no reason to continue.
|
72
|
+
if configuration.input.has_errors?
|
73
|
+
ConfigurationErrorsPrinter.new(configuration.input.all_errors).print
|
74
|
+
exit ERROR_STATUS
|
75
|
+
end
|
76
|
+
|
69
77
|
# Run the pandocomatic converter configured according to the options
|
70
78
|
# given.
|
71
79
|
#
|
72
80
|
# Pandocomatic has two modes: converting a directory tree or
|
73
81
|
# converting a single file. The mode is selected by the input.
|
74
82
|
if configuration.directory?
|
75
|
-
command = ConvertDirCommand.new(configuration, configuration.
|
83
|
+
command = ConvertDirCommand.new(configuration, configuration.input_file, configuration.output)
|
76
84
|
else
|
77
|
-
command = ConvertFileMultipleCommand.new(configuration, configuration.
|
85
|
+
command = ConvertFileMultipleCommand.new(configuration, configuration.input_file, configuration.output)
|
78
86
|
command.make_quiet unless command.subcommands.size > 1
|
79
87
|
end
|
80
88
|
|
@@ -108,7 +116,7 @@ module Pandocomatic
|
|
108
116
|
warn "An unexpected error has occurred. You can report this bug via https://github.com/htdebeer/pandocomatic/issues/new."
|
109
117
|
raise e
|
110
118
|
ensure
|
111
|
-
configuration.clean_up!
|
119
|
+
configuration.clean_up! unless configuration.nil?
|
112
120
|
end
|
113
121
|
end
|
114
122
|
end
|
metadata
CHANGED
@@ -1,53 +1,53 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pandocomatic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.5.0.
|
4
|
+
version: 0.2.5.0.betad
|
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: 2019-03-
|
11
|
+
date: 2019-03-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: paru
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 0.3.2
|
20
17
|
- - ">="
|
21
18
|
- !ruby/object:Gem::Version
|
22
19
|
version: 0.3.2.0
|
20
|
+
- - "~>"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.3.2
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
|
-
- - "~>"
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 0.3.2
|
30
27
|
- - ">="
|
31
28
|
- !ruby/object:Gem::Version
|
32
29
|
version: 0.3.2.0
|
30
|
+
- - "~>"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.3.2
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: optimist
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
|
-
- - "
|
37
|
+
- - ">="
|
38
38
|
- !ruby/object:Gem::Version
|
39
39
|
version: 3.0.0
|
40
|
-
- - "
|
40
|
+
- - "~>"
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
version: 3.0.0
|
43
43
|
type: :runtime
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
|
-
- - "
|
47
|
+
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
49
|
version: 3.0.0
|
50
|
-
- - "
|
50
|
+
- - "~>"
|
51
51
|
- !ruby/object:Gem::Version
|
52
52
|
version: 3.0.0
|
53
53
|
- !ruby/object:Gem::Dependency
|
@@ -56,28 +56,28 @@ dependencies:
|
|
56
56
|
requirements:
|
57
57
|
- - "~>"
|
58
58
|
- !ruby/object:Gem::Version
|
59
|
-
version: '
|
59
|
+
version: '1.3'
|
60
60
|
type: :development
|
61
61
|
prerelease: false
|
62
62
|
version_requirements: !ruby/object:Gem::Requirement
|
63
63
|
requirements:
|
64
64
|
- - "~>"
|
65
65
|
- !ruby/object:Gem::Version
|
66
|
-
version: '
|
66
|
+
version: '1.3'
|
67
67
|
- !ruby/object:Gem::Dependency
|
68
68
|
name: yard
|
69
69
|
requirement: !ruby/object:Gem::Requirement
|
70
70
|
requirements:
|
71
71
|
- - "~>"
|
72
72
|
- !ruby/object:Gem::Version
|
73
|
-
version: 0.9.
|
73
|
+
version: 0.9.18
|
74
74
|
type: :development
|
75
75
|
prerelease: false
|
76
76
|
version_requirements: !ruby/object:Gem::Requirement
|
77
77
|
requirements:
|
78
78
|
- - "~>"
|
79
79
|
- !ruby/object:Gem::Version
|
80
|
-
version: 0.9.
|
80
|
+
version: 0.9.18
|
81
81
|
description: Pandocomatic is a tool to automate using pandoc (<http://pandoc.org>).
|
82
82
|
With pandocomatic you can express common patterns of using pandoc for generating
|
83
83
|
your documents. Applied to a directory, pandocomatic can act as a static site generator.
|
@@ -147,7 +147,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
147
147
|
requirements:
|
148
148
|
- - ">="
|
149
149
|
- !ruby/object:Gem::Version
|
150
|
-
version:
|
150
|
+
version: 2.4.4
|
151
151
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
152
152
|
requirements:
|
153
153
|
- - ">"
|
@@ -156,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
156
156
|
requirements:
|
157
157
|
- pandoc, a universal document converer <http://pandoc.org>
|
158
158
|
rubyforge_project:
|
159
|
-
rubygems_version:
|
159
|
+
rubygems_version: 3.0.0.beta1
|
160
160
|
signing_key:
|
161
161
|
specification_version: 4
|
162
162
|
summary: Automating the use of pandoc
|