liquidoc 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/liquidoc/version.rb +1 -1
- data/lib/liquidoc.rb +129 -43
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5a4da6a3e0ffecae192d8143237ecc0055c51e5e
|
4
|
+
data.tar.gz: a527ecde1277cc7e3db558d83685daf4ae332c39
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c5c82fceb1f91e3a0ddd088471f6794336672aa600f8b099e4f8187706433111acb62a3d4aea83e4b8ac9085fdcaea411a79c05c7d9b2822fa706fe2944cc499
|
7
|
+
data.tar.gz: b171e8757bed5ad7e1fc171a16ed503db71a5099f0fe6351148e6dc59e6b9d8540fb44007fd619e287659c4273fba5277fc6e4254b301bceb8bcbc3a88a88f5f
|
data/lib/liquidoc/version.rb
CHANGED
data/lib/liquidoc.rb
CHANGED
@@ -4,6 +4,7 @@ require 'json'
|
|
4
4
|
require 'optparse'
|
5
5
|
require 'liquid'
|
6
6
|
require 'asciidoctor'
|
7
|
+
require 'asciidoctor-pdf'
|
7
8
|
require 'logger'
|
8
9
|
require 'csv'
|
9
10
|
require 'crack/xml'
|
@@ -40,6 +41,8 @@ require 'fileutils'
|
|
40
41
|
@fonts_dir = 'theme/fonts/'
|
41
42
|
@output_filename = 'index'
|
42
43
|
@attributes = {}
|
44
|
+
@passed_attrs = {}
|
45
|
+
@verbose = false
|
43
46
|
|
44
47
|
@logger = Logger.new(STDOUT)
|
45
48
|
@logger.level = Logger::INFO
|
@@ -88,7 +91,19 @@ def iterate_build cfg
|
|
88
91
|
inclusive = step.options['inclusive'] if defined?(step.options['inclusive'])
|
89
92
|
copy_assets(step.source, step.target, inclusive)
|
90
93
|
when "render"
|
91
|
-
|
94
|
+
if defined?(step.data)
|
95
|
+
attrs = ingest_attributes(step.data)
|
96
|
+
else
|
97
|
+
attrs = {}
|
98
|
+
end
|
99
|
+
validate_file_input(step.source, "source")
|
100
|
+
doc = AsciiDocument.new(step.source)
|
101
|
+
doc.add_attrs!(attrs)
|
102
|
+
builds = step.builds
|
103
|
+
for bld in builds
|
104
|
+
build = Build.new(bld, type) # create an instance of the Build class; Build.new accepts a 'bld' hash & action 'type'
|
105
|
+
asciidocify(doc, build) # perform the liquify operation
|
106
|
+
end
|
92
107
|
when "deploy"
|
93
108
|
@logger.warn "Deploy actions not yet implemented."
|
94
109
|
else
|
@@ -169,11 +184,10 @@ class BuildConfigStep
|
|
169
184
|
|
170
185
|
def initialize step
|
171
186
|
@@step = step
|
172
|
-
@@logger = Logger.new(STDOUT)
|
173
187
|
if (defined?(@@step['action'])).nil?
|
174
|
-
@logger.error "Every step in the configuration file needs an 'action' type declared."
|
175
188
|
raise "ConfigStructError"
|
176
189
|
end
|
190
|
+
validate()
|
177
191
|
end
|
178
192
|
|
179
193
|
def type
|
@@ -200,7 +214,15 @@ class BuildConfigStep
|
|
200
214
|
return @@step['builds']
|
201
215
|
end
|
202
216
|
|
203
|
-
def
|
217
|
+
def validate
|
218
|
+
case self.type
|
219
|
+
when "parse"
|
220
|
+
reqs = ["data,builds"]
|
221
|
+
when "migrate"
|
222
|
+
reqs = ["source,target"]
|
223
|
+
when "render"
|
224
|
+
reqs = ["source,builds"]
|
225
|
+
end
|
204
226
|
for req in reqs
|
205
227
|
if (defined?(@@step[req])).nil?
|
206
228
|
@@logger.error "Every #{@@step['action']}-type in the configuration file needs a '#{req}' declaration."
|
@@ -216,20 +238,6 @@ class Build
|
|
216
238
|
def initialize build, type
|
217
239
|
@@build = build
|
218
240
|
@@type = type
|
219
|
-
required = []
|
220
|
-
case type
|
221
|
-
when "parse"
|
222
|
-
required = ["template,output"]
|
223
|
-
when "migrate"
|
224
|
-
required = ["source,target"]
|
225
|
-
when "render"
|
226
|
-
required = ["index,output"]
|
227
|
-
end
|
228
|
-
for req in required
|
229
|
-
if (defined?(req)).nil?
|
230
|
-
raise ActionSettingMissing
|
231
|
-
end
|
232
|
-
end
|
233
241
|
end
|
234
242
|
|
235
243
|
def template
|
@@ -240,8 +248,35 @@ class Build
|
|
240
248
|
@@build['output']
|
241
249
|
end
|
242
250
|
|
243
|
-
def
|
244
|
-
@@build['
|
251
|
+
def style
|
252
|
+
@@build['style']
|
253
|
+
end
|
254
|
+
|
255
|
+
def doctype
|
256
|
+
@@build['doctype']
|
257
|
+
end
|
258
|
+
|
259
|
+
def backend
|
260
|
+
@@build['backend']
|
261
|
+
end
|
262
|
+
|
263
|
+
def attributes
|
264
|
+
@@build['attributes']
|
265
|
+
end
|
266
|
+
|
267
|
+
def validate
|
268
|
+
reqs = []
|
269
|
+
case self.type
|
270
|
+
when "parse"
|
271
|
+
reqs = ["template,output"]
|
272
|
+
when "render"
|
273
|
+
reqs = ["output"]
|
274
|
+
end
|
275
|
+
for req in required
|
276
|
+
if (defined?(req)).nil?
|
277
|
+
raise "ActionSettingMissing"
|
278
|
+
end
|
279
|
+
end
|
245
280
|
end
|
246
281
|
|
247
282
|
end #class Build
|
@@ -309,6 +344,37 @@ class DataSrc
|
|
309
344
|
end
|
310
345
|
end
|
311
346
|
|
347
|
+
class AsciiDocument
|
348
|
+
def initialize map, type='article'
|
349
|
+
@@index = map
|
350
|
+
@@attributes = {}
|
351
|
+
@@type = type
|
352
|
+
end
|
353
|
+
|
354
|
+
def index
|
355
|
+
@@index
|
356
|
+
end
|
357
|
+
|
358
|
+
def add_attrs! attrs
|
359
|
+
raise "InvalidAttributesFormat" unless attrs.is_a?(Hash)
|
360
|
+
self.attributes.merge!attrs
|
361
|
+
end
|
362
|
+
|
363
|
+
def attributes
|
364
|
+
@@attributes
|
365
|
+
end
|
366
|
+
|
367
|
+
def type
|
368
|
+
@@type
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
class AsciiDoctorConfig
|
373
|
+
def initialize out, type, back
|
374
|
+
|
375
|
+
end
|
376
|
+
end
|
377
|
+
|
312
378
|
# ===
|
313
379
|
# Action-specific procs
|
314
380
|
# ===
|
@@ -451,7 +517,7 @@ def copy_assets src, dest, inclusive=true
|
|
451
517
|
else
|
452
518
|
FileUtils.cp(src, dest)
|
453
519
|
end
|
454
|
-
@logger.info "Copied
|
520
|
+
@logger.info "Copied #{src} to #{dest}."
|
455
521
|
rescue Exception => ex
|
456
522
|
@logger.warn "Problem while copying assets. #{ex.message}"
|
457
523
|
raise
|
@@ -464,10 +530,7 @@ end
|
|
464
530
|
|
465
531
|
# Gather attributes from a fixed attributes file
|
466
532
|
# Use _data/attributes.yml or designate as -a path/to/filename.yml
|
467
|
-
def
|
468
|
-
if attributes_file == nil
|
469
|
-
attributes_file = @attributes_file_def
|
470
|
-
end
|
533
|
+
def ingest_attributes attributes_file
|
471
534
|
validate_file_input(attributes_file, "attributes")
|
472
535
|
begin
|
473
536
|
attributes = YAML.load_file(attributes_file)
|
@@ -477,20 +540,44 @@ def get_attributes attributes_file
|
|
477
540
|
end
|
478
541
|
end
|
479
542
|
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
543
|
+
def derive_backend type, out_file
|
544
|
+
case File.extname(out_file)
|
545
|
+
when ".pdf"
|
546
|
+
backend = "pdf"
|
547
|
+
else
|
548
|
+
backend = "html5"
|
484
549
|
end
|
485
|
-
|
486
|
-
attributes.merge!get_attributes(@attributes_file)
|
487
|
-
attributes = '-a ' + attributes.map{|k,v| "#{k}='#{v}'"}.join(' -a ')
|
488
|
-
return attributes
|
550
|
+
return backend
|
489
551
|
end
|
490
552
|
|
491
|
-
|
492
|
-
|
493
|
-
|
553
|
+
def asciidocify doc, build
|
554
|
+
@logger.debug "Executing Asciidoctor render operation for #{build.output}."
|
555
|
+
to_file = build.output
|
556
|
+
back = derive_backend(doc.type, build.output)
|
557
|
+
if back == "pdf" # pass optional style file and set a default pdf-fontsdir
|
558
|
+
unless defined?(build.style).nil?
|
559
|
+
doc.add_attrs!({"pdf-style"=>build.style})
|
560
|
+
end
|
561
|
+
end
|
562
|
+
# Add attributes from config file build section
|
563
|
+
doc.add_attrs!(build.attributes.to_h)
|
564
|
+
# Add attributes from command-line -a args
|
565
|
+
doc.add_attrs!(@passed_attrs)
|
566
|
+
@logger.debug "Final pre-parse attributes: #{doc.attributes}"
|
567
|
+
# Perform the aciidoctor convert
|
568
|
+
Asciidoctor.convert_file(
|
569
|
+
doc.index,
|
570
|
+
to_file: to_file,
|
571
|
+
attributes: doc.attributes,
|
572
|
+
require: "pdf",
|
573
|
+
backend: back,
|
574
|
+
doctype: build.doctype,
|
575
|
+
safe: "server",
|
576
|
+
sourcemap: true,
|
577
|
+
verbose: @verbose,
|
578
|
+
mkdirs: true
|
579
|
+
)
|
580
|
+
@logger.info "Rendered file #{to_file}."
|
494
581
|
end
|
495
582
|
|
496
583
|
# ===
|
@@ -582,12 +669,11 @@ Liquid::Template.register_filter(CustomFilters)
|
|
582
669
|
command_parser = OptionParser.new do|opts|
|
583
670
|
opts.banner = "Usage: liquidoc [options]"
|
584
671
|
|
585
|
-
opts.on("-a
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
@passed_attrs = @passed_attrs.merge!n
|
672
|
+
opts.on("-a KEY=VALUE", "For passing an AsciiDoc attribute parameter to Asciidoctor. Ex: -a basedir=some/path -a custom_var='my value'") do |n|
|
673
|
+
pair = {}
|
674
|
+
k,v = n.split('=')
|
675
|
+
pair[k] = v
|
676
|
+
@passed_attrs.merge!pair
|
591
677
|
end
|
592
678
|
|
593
679
|
# Global Options
|
@@ -621,6 +707,7 @@ command_parser = OptionParser.new do|opts|
|
|
621
707
|
|
622
708
|
opts.on("--verbose", "Run verbose") do |n|
|
623
709
|
@logger.level = Logger::DEBUG
|
710
|
+
@verbose = true
|
624
711
|
end
|
625
712
|
|
626
713
|
opts.on("--stdout", "Puts the output in STDOUT instead of writing to a file.") do
|
@@ -639,7 +726,6 @@ command_parser.parse!
|
|
639
726
|
# Upfront debug output
|
640
727
|
@logger.debug "Base dir: #{@base_dir}"
|
641
728
|
@logger.debug "Config file: #{@config_file}"
|
642
|
-
@logger.debug "Index file: #{@index_file}"
|
643
729
|
|
644
730
|
# ===
|
645
731
|
# Execute
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: liquidoc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Dominick
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-10-
|
11
|
+
date: 2017-10-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|