pandocomatic 0.0.13 → 0.1.0.b
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/bin/pandocomatic +2 -78
- data/lib/pandocomatic/cli.rb +183 -0
- data/lib/pandocomatic/command/command.rb +113 -0
- data/lib/pandocomatic/command/convert_dir_command.rb +155 -0
- data/lib/pandocomatic/command/convert_file_command.rb +163 -0
- data/lib/pandocomatic/command/copy_file_command.rb +49 -0
- data/lib/pandocomatic/command/create_link_command.rb +85 -0
- data/lib/pandocomatic/command/skip_command.rb +50 -0
- data/lib/pandocomatic/configuration.rb +212 -164
- data/lib/pandocomatic/error/cli_error.rb +49 -0
- data/lib/pandocomatic/error/configuration_error.rb +39 -0
- data/lib/pandocomatic/error/io_error.rb +50 -0
- data/lib/pandocomatic/error/pandoc_error.rb +30 -0
- data/lib/pandocomatic/error/pandocomatic_error.rb +48 -0
- data/lib/pandocomatic/error/processor_error.rb +33 -0
- data/lib/pandocomatic/fileinfo_preprocessor.rb +34 -13
- data/lib/pandocomatic/pandoc_metadata.rb +66 -34
- data/lib/pandocomatic/pandocomatic.rb +176 -0
- data/lib/pandocomatic/printer/command_printer.rb +28 -0
- data/lib/pandocomatic/printer/configuration_errors_printer.rb +29 -0
- data/lib/pandocomatic/printer/error_printer.rb +34 -0
- data/lib/pandocomatic/printer/finish_printer.rb +44 -0
- data/lib/pandocomatic/printer/help_printer.rb +27 -0
- data/lib/pandocomatic/printer/printer.rb +43 -0
- data/lib/pandocomatic/printer/summary_printer.rb +35 -0
- data/lib/pandocomatic/printer/version_printer.rb +30 -0
- data/lib/pandocomatic/printer/views/cli_error.txt +12 -0
- data/lib/pandocomatic/printer/views/command.txt +1 -0
- data/lib/pandocomatic/printer/views/configuration_error.txt +1 -0
- data/lib/pandocomatic/printer/views/configuration_errors.txt +10 -0
- data/lib/pandocomatic/printer/views/error.txt +5 -0
- data/lib/pandocomatic/printer/views/finish.txt +1 -0
- data/lib/pandocomatic/printer/views/help.txt +135 -0
- data/lib/pandocomatic/printer/views/io_error.txt +12 -0
- data/lib/pandocomatic/printer/views/pandoc_error.txt +1 -0
- data/lib/pandocomatic/printer/views/processor_error.txt +6 -0
- data/lib/pandocomatic/printer/views/summary.txt +1 -0
- data/lib/pandocomatic/printer/views/version.txt +7 -0
- data/lib/pandocomatic/printer/views/warning.txt +1 -0
- data/lib/pandocomatic/printer/warning_printer.rb +33 -0
- data/lib/pandocomatic/processor.rb +25 -8
- data/lib/pandocomatic/warning.rb +36 -0
- metadata +79 -17
- data/lib/pandocomatic/dir_converter.rb +0 -119
- data/lib/pandocomatic/file_converter.rb +0 -99
@@ -1,119 +0,0 @@
|
|
1
|
-
module Pandocomatic
|
2
|
-
|
3
|
-
require 'fileutils'
|
4
|
-
require_relative 'file_converter.rb'
|
5
|
-
|
6
|
-
CONFIG_FILE = 'pandocomatic.yaml'
|
7
|
-
|
8
|
-
class DirConverter
|
9
|
-
|
10
|
-
def initialize src, dst, config
|
11
|
-
@src_root = src
|
12
|
-
@dst_root = dst
|
13
|
-
@config = config
|
14
|
-
end
|
15
|
-
|
16
|
-
def convert src_dir = @src_root, dst_dir = @dst_root, config = @config
|
17
|
-
|
18
|
-
ensure_directory dst_dir
|
19
|
-
config = reconfigure config, src_dir
|
20
|
-
|
21
|
-
# Convert each file and subdirectory according to the specifications set in config
|
22
|
-
Dir.foreach src_dir do |filename|
|
23
|
-
src = File.join src_dir, filename
|
24
|
-
|
25
|
-
next if config.skip? src
|
26
|
-
|
27
|
-
dst = File.join dst_dir, filename
|
28
|
-
|
29
|
-
if File.symlink? src and not config.follow_links?
|
30
|
-
# Symlinks are also recognized as files and directories, so first
|
31
|
-
# check if they should be followed (and treated as files and
|
32
|
-
# directories), or if they should be recreated (if follow-links
|
33
|
-
# setting is false
|
34
|
-
recreate_link src, dst
|
35
|
-
|
36
|
-
elsif File.directory? src then
|
37
|
-
|
38
|
-
if config.recursive? then
|
39
|
-
|
40
|
-
# Convert subdirectories only when the recursivity is set in the
|
41
|
-
# configuration.
|
42
|
-
convert src, dst, config
|
43
|
-
else
|
44
|
-
next # skip directories when not recursive
|
45
|
-
end
|
46
|
-
|
47
|
-
elsif File.file? src
|
48
|
-
|
49
|
-
raise "Cannot read file #{src}" if not File.readable? src
|
50
|
-
raise "Cannot write file #{dst}" if File.exist? dst and not File.writable? dst
|
51
|
-
|
52
|
-
# Check if the source file has to be converted. If so, convert;
|
53
|
-
# otherwise, copy it to the destination tree
|
54
|
-
if config.convert? src then
|
55
|
-
dst = config.set_extension dst
|
56
|
-
Pandocomatic::FileConverter.new.convert src, dst, config if file_modified? src, dst
|
57
|
-
else
|
58
|
-
# copy file
|
59
|
-
FileUtils.cp src, dst if file_modified? src, dst
|
60
|
-
end
|
61
|
-
|
62
|
-
else
|
63
|
-
warn "Unclear what to do with #{src}, skipping this file"
|
64
|
-
next
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
|
69
|
-
end
|
70
|
-
|
71
|
-
private
|
72
|
-
|
73
|
-
# If the source directory contains a configuration file, use it to
|
74
|
-
# reconfigure the converter. Otherwise, use the current configuration
|
75
|
-
def reconfigure current_config, src_dir
|
76
|
-
config_file = File.join src_dir, CONFIG_FILE
|
77
|
-
if File.exist? config_file then
|
78
|
-
current_config.reconfigure config_file
|
79
|
-
else
|
80
|
-
current_config
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
# Ensure that dir exist (and is a directory)
|
85
|
-
def ensure_directory dir
|
86
|
-
if Dir.exist? dir then
|
87
|
-
raise "#{dir} is not a directory" if not File.directory? dir
|
88
|
-
else
|
89
|
-
begin
|
90
|
-
Dir.mkdir dir
|
91
|
-
rescue SystemCallError => e
|
92
|
-
raise "Error trying to create directory #{dir}: #{e.message}"
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
# Recreate source link in destination tree if it points to somewhere inside
|
98
|
-
# the source tree using relative paths
|
99
|
-
def recreate_link src, dst
|
100
|
-
src_target = File.readlink src
|
101
|
-
if src_target.start_with? '.' then
|
102
|
-
full_src_target = File.expand_path src_target, File.dirname(src)
|
103
|
-
dst_target = src_target
|
104
|
-
if full_src_target.start_with? File.absolute_path(@src_root)
|
105
|
-
File.symlink dst_target, dst unless File.exist? dst
|
106
|
-
else
|
107
|
-
warn "Skipping link #{src} because it points to outside the source tree"
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
def file_modified? src, dst
|
113
|
-
# src file is newer than the dstination file?
|
114
|
-
not File.exist? dst or File.mtime(src) > File.mtime(dst)
|
115
|
-
end
|
116
|
-
|
117
|
-
end
|
118
|
-
|
119
|
-
end
|
@@ -1,99 +0,0 @@
|
|
1
|
-
module Pandocomatic
|
2
|
-
|
3
|
-
require 'paru/pandoc'
|
4
|
-
require_relative 'pandoc_metadata.rb'
|
5
|
-
require_relative 'processor.rb'
|
6
|
-
require_relative 'fileinfo_preprocessor'
|
7
|
-
|
8
|
-
class FileConverter
|
9
|
-
|
10
|
-
def convert src, dst, current_config
|
11
|
-
@config = current_config
|
12
|
-
@src = src
|
13
|
-
metadata = PandocMetadata.load_file src
|
14
|
-
|
15
|
-
if metadata.has_template? then
|
16
|
-
template_name = metadata.template_name
|
17
|
-
else
|
18
|
-
template_name = @config.determine_template src
|
19
|
-
end
|
20
|
-
|
21
|
-
template = @config.get_template template_name
|
22
|
-
|
23
|
-
pandoc_options = (template['pandoc'] || {}).merge(metadata.pandoc_options || {})
|
24
|
-
|
25
|
-
input = File.read src
|
26
|
-
input = FileInfoPreprocessor.run input, src
|
27
|
-
input = preprocess input, template
|
28
|
-
input = pandoc input, pandoc_options, File.dirname(src)
|
29
|
-
output = postprocess input, template
|
30
|
-
|
31
|
-
if dst.to_s.empty? and metadata.pandoc_options.has_key? 'output'
|
32
|
-
dst = metadata.pandoc_options['output']
|
33
|
-
end
|
34
|
-
|
35
|
-
File.open( dst, 'w') do |file|
|
36
|
-
file << output
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
PANDOC_OPTIONS_WITH_PATH = [
|
43
|
-
'filter',
|
44
|
-
'template',
|
45
|
-
'css',
|
46
|
-
'include-in-header',
|
47
|
-
'include-before-body',
|
48
|
-
'include-after-body',
|
49
|
-
'reference-odt',
|
50
|
-
'reference-docx',
|
51
|
-
'epub-stylesheet',
|
52
|
-
'epub-cover-image',
|
53
|
-
'epub-metadata',
|
54
|
-
'epub-embed-font',
|
55
|
-
'bibliography',
|
56
|
-
'csl'
|
57
|
-
]
|
58
|
-
|
59
|
-
def pandoc input, options, src_dir
|
60
|
-
converter = Paru::Pandoc.new
|
61
|
-
options.each do |option, value|
|
62
|
-
|
63
|
-
value = @config.update_path value, src_dir if
|
64
|
-
PANDOC_OPTIONS_WITH_PATH.include? option
|
65
|
-
|
66
|
-
converter.send option, value unless option == 'output'
|
67
|
-
# don't let pandoc write the output to enable postprocessing
|
68
|
-
end
|
69
|
-
|
70
|
-
converter << input
|
71
|
-
end
|
72
|
-
|
73
|
-
def preprocess input, config
|
74
|
-
process input, 'preprocessors', config
|
75
|
-
end
|
76
|
-
|
77
|
-
def postprocess input, config
|
78
|
-
process input, 'postprocessors', config
|
79
|
-
end
|
80
|
-
|
81
|
-
# Run the input string through a list of filters called processors. There
|
82
|
-
# are to types: preprocessors and postprocessors
|
83
|
-
def process input, type, config
|
84
|
-
if config.has_key? type then
|
85
|
-
processors = config[type]
|
86
|
-
output = input
|
87
|
-
processors.each do |processor|
|
88
|
-
script = @config.update_path(processor, File.dirname(@src))
|
89
|
-
output = Processor.run(script, output)
|
90
|
-
end
|
91
|
-
output
|
92
|
-
else
|
93
|
-
input
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
end
|
98
|
-
|
99
|
-
end
|