jekyll_asciidoctor_pdf 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/jekyll_asciidoctor_pdf.gemspec +1 -0
- data/lib/jekyll_asciidoctor_pdf/adoc.rb +93 -3
- data/lib/jekyll_asciidoctor_pdf/commands.rb +0 -2
- data/lib/jekyll_asciidoctor_pdf/gitinfo.rb +2 -2
- data/lib/jekyll_asciidoctor_pdf/sidebar.rb +28 -3
- data/lib/jekyll_asciidoctor_pdf/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: df0c08936771991bbd479c0660e3894ff098f90a8622b2a08388c75a74c7c8c8
|
4
|
+
data.tar.gz: eca5423777312dd5426656a1c295dd2c3a770fb2fabd59b0afaa686a21eb9e43
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66bf3b9a3be30eb7007f1bfbb0c373453037113f3e36b2390cc3bd2edd0bef5f51d1c969ee3d052e119fa3bd055f1622bb21588110e49ca525fa18d4f246fd2e
|
7
|
+
data.tar.gz: ca588094ef6072e4dd5ae6ed4cac5c6e2543981287a2a137e483be7ac5edf32ffc92eeef854695be93f4087591a44a2753c34a1d07ed8fa36a292d101007d94d
|
@@ -45,6 +45,7 @@ Gem::Specification.new do |spec|
|
|
45
45
|
spec.add_runtime_dependency 'safe_yaml', '>= 1.0.5'
|
46
46
|
spec.add_runtime_dependency 'json', '>= 2.1.0'
|
47
47
|
spec.add_runtime_dependency 'rest-client', '>= 2.0.0'
|
48
|
+
spec.add_runtime_dependency 'prawn', '>= 2.2.2'
|
48
49
|
spec.add_runtime_dependency 'asciidoctor-pdf', '>= 1.5.1'
|
49
50
|
|
50
51
|
end
|
@@ -1,13 +1,50 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
require 'fileutils'
|
3
|
+
require 'prawn'
|
3
4
|
require 'asciidoctor-pdf'
|
4
5
|
require 'asciidoctor'
|
5
6
|
|
6
7
|
# Do not touch, this REGEXP is taken from Jekyll source code
|
7
8
|
YAML_FRONT_MATTER_REGEXP = /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m
|
9
|
+
RELATIVE_LINK_REGEXP = /(^|\s)link:(?!(http:|https:))/
|
10
|
+
CHECK_REGEXP = /✓/
|
8
11
|
|
9
12
|
module JekyllAsciidoctorPdf
|
10
13
|
class ADoc
|
14
|
+
|
15
|
+
##
|
16
|
+
# Search and replace expression to clean up the original file
|
17
|
+
#
|
18
|
+
# Common Issues:
|
19
|
+
# - Relative links: link:relative.html -> link:<BASE_URL>.html
|
20
|
+
# - Checkmark symbol: ✓ -> icon:check[]
|
21
|
+
# - Remove YAML front matter (we could use skip-front-matter attribute)
|
22
|
+
#
|
23
|
+
#
|
24
|
+
# Previous code
|
25
|
+
#
|
26
|
+
# subs = {
|
27
|
+
# YAML_FRONT_MATTER_REGEXP => '',
|
28
|
+
# RELATIVE_LINK_REGEXP => '\1link:' + base_url,
|
29
|
+
# CHECK_REGEXP => 'icon:check[]'
|
30
|
+
# }
|
31
|
+
#
|
32
|
+
# combined_regexp = Regexp.union(subs.keys)
|
33
|
+
#
|
34
|
+
# return content.gsub(combined_regexp, subs)
|
35
|
+
#
|
36
|
+
# Previous code didn't work properly
|
37
|
+
#
|
38
|
+
# TODO: We should try to perform mutilple regexp subs at once.
|
39
|
+
#
|
40
|
+
def self.fixCommonIssues(content, base_url)
|
41
|
+
temp = content.gsub(YAML_FRONT_MATTER_REGEXP, '')
|
42
|
+
temp = temp.gsub(RELATIVE_LINK_REGEXP, '\1link:' + base_url )
|
43
|
+
temp = temp.gsub(CHECK_REGEXP, ' icon:check[] ')
|
44
|
+
|
45
|
+
return temp
|
46
|
+
end
|
47
|
+
|
11
48
|
def self.getAuthorsList(file)
|
12
49
|
names = %x[ git log --pretty=format:"%an" #{file} | sort | uniq ]
|
13
50
|
# last_commit_date can be nil iff the file was not committed.
|
@@ -22,9 +59,12 @@ module JekyllAsciidoctorPdf
|
|
22
59
|
# Generate a PDF of an individual page
|
23
60
|
#
|
24
61
|
# - Remove the jekyll frontmatter
|
62
|
+
# - Read the content
|
63
|
+
# - Execute regexp to fix issues
|
25
64
|
# - Execute the convert process
|
26
65
|
# - Let the caller to collect information from the front_matter and from the file itself
|
27
66
|
#
|
67
|
+
#
|
28
68
|
def self.generatePdf(product_name, file, output_path, parameters, cover_page, theme_pdf, revision, authors, base_url)
|
29
69
|
|
30
70
|
front_matter = {}
|
@@ -35,7 +75,7 @@ module JekyllAsciidoctorPdf
|
|
35
75
|
front_matter = SafeYAML.load(Regexp.last_match(1))
|
36
76
|
end
|
37
77
|
|
38
|
-
stream_adoc = content
|
78
|
+
stream_adoc = fixCommonIssues(content, base_url)
|
39
79
|
|
40
80
|
# We should think about the performance of get the title in that way
|
41
81
|
adoc = Asciidoctor.load stream_adoc
|
@@ -44,7 +84,6 @@ module JekyllAsciidoctorPdf
|
|
44
84
|
filename = File.basename(file,'.*') + '.pdf'
|
45
85
|
filename_path = output_path
|
46
86
|
base_path = File.dirname(file)
|
47
|
-
#authors = getAuthorsList(file)
|
48
87
|
|
49
88
|
generateBookTypePdf(filename, filename_path, product_name, title, base_path, stream_adoc, parameters, cover_page, theme_pdf, revision, authors)
|
50
89
|
|
@@ -111,10 +150,15 @@ module JekyllAsciidoctorPdf
|
|
111
150
|
revision_s = revision.strftime('%m/%d/%Y')
|
112
151
|
end
|
113
152
|
|
153
|
+
temp_pdf = File.join(File.dirname(cover_page), 'temp-cover.pdf')
|
154
|
+
|
155
|
+
generateCoverPage(title, product_name, authors_s, revision_s, '', cover_page, temp_pdf)
|
156
|
+
|
114
157
|
text = <<~TEXT
|
115
158
|
= #{title} : #{product_name}
|
116
159
|
#{authors_s}
|
117
160
|
#{revision_s}
|
161
|
+
:notitle:
|
118
162
|
:doctype: book
|
119
163
|
:experimental:
|
120
164
|
:reproducible:
|
@@ -129,7 +173,7 @@ module JekyllAsciidoctorPdf
|
|
129
173
|
ifdef::backend-pdf[]
|
130
174
|
:pdf-theme: #{theme_pdf}
|
131
175
|
:title-page:
|
132
|
-
:
|
176
|
+
:front-cover-image: image:#{temp_pdf}[]
|
133
177
|
:source-highlighter: rouge
|
134
178
|
endif::[]
|
135
179
|
:chapter-label:
|
@@ -143,6 +187,52 @@ module JekyllAsciidoctorPdf
|
|
143
187
|
return text
|
144
188
|
end
|
145
189
|
|
190
|
+
def self.generateCoverPage(title, subtitle, authors, revision, abstract, background_image, file)
|
191
|
+
|
192
|
+
info = {
|
193
|
+
:Title => title,
|
194
|
+
:Author => authors,
|
195
|
+
:Subject => subtitle,
|
196
|
+
:Keywords => "",
|
197
|
+
:Creator => "NetApp",
|
198
|
+
:Producer => "NetApp",
|
199
|
+
:CreationDate => Time.now
|
200
|
+
}
|
201
|
+
|
202
|
+
Prawn::Document.generate(file, :page_size => 'A4', :margin => 0, :info => info) do
|
203
|
+
stroke_bounds
|
204
|
+
image background_image, :position => :left, :vposition => :top, :fit => [680,3508]
|
205
|
+
|
206
|
+
bounding_box([60, 700], :width => 500, :height => 650) do
|
207
|
+
font "Times-Roman"
|
208
|
+
#stroke_bounds
|
209
|
+
#stroke_circle [0, 0], 10
|
210
|
+
|
211
|
+
move_down 120
|
212
|
+
|
213
|
+
text "Technical Report", size: 12, color: "4B4b4b"
|
214
|
+
move_down 10
|
215
|
+
|
216
|
+
text title, size: 20, font: 'Times-Roman', color: "1667c5"
|
217
|
+
move_down 5
|
218
|
+
text subtitle, size: 16, font: 'Times-Roman', color: "999999"
|
219
|
+
|
220
|
+
move_down 10
|
221
|
+
|
222
|
+
text authors, size: 12, font: 'Times-Roman', color: "4B4b4b"
|
223
|
+
text revision, size: 12, font: 'Times-Roman', color: "4B4b4b"
|
224
|
+
|
225
|
+
|
226
|
+
#move_down 300
|
227
|
+
#text "Abstract", size: 14, font: "Times-Roman", color: "0000FF"
|
228
|
+
#move_down 10
|
229
|
+
#font_size(12) { text abstract, font: "Times-Roman" }
|
230
|
+
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
|
146
236
|
def self.getCopyright()
|
147
237
|
text = <<~TEXT
|
148
238
|
<<<
|
@@ -186,14 +186,12 @@ module JekyllAsciidoctorPdf
|
|
186
186
|
#
|
187
187
|
def init
|
188
188
|
output("Initialize files & output directories ...")
|
189
|
-
output_fullsite = File.join(absolute_output_path, '/fullsite')
|
190
189
|
output_pages = File.join(absolute_output_path, '/pages')
|
191
190
|
output_assets = File.join(absolute_output_path, '/assets')
|
192
191
|
|
193
192
|
mkdir_p(absolute_output_path, quiet)
|
194
193
|
mkdir_p(output_pages,quiet)
|
195
194
|
mkdir_p(output_assets,quiet)
|
196
|
-
mkdir_p(output_fullsite,quiet)
|
197
195
|
|
198
196
|
fullsite_config = parameters['fullsite']
|
199
197
|
background_image = File.join(absolute_working_path, fullsite_config['background_image'])
|
@@ -49,7 +49,7 @@ module JekyllAsciidoctorPdf
|
|
49
49
|
userResponse = response.body
|
50
50
|
unless userResponse.nil? || userResponse.empty?
|
51
51
|
hash = JSON.parse(userResponse)
|
52
|
-
if (hash.key?('name'))
|
52
|
+
if (hash.key?('name') and (not hash['name'].nil?))
|
53
53
|
authors_hash[login_name] = hash['name']
|
54
54
|
return hash['name']
|
55
55
|
end
|
@@ -101,7 +101,7 @@ module JekyllAsciidoctorPdf
|
|
101
101
|
rescue => e
|
102
102
|
puts "Error Message: #{e.to_s}";
|
103
103
|
end
|
104
|
-
|
104
|
+
|
105
105
|
authors = contributors.sort_by{|name, commits| [-commits, name]}.transpose[0]
|
106
106
|
|
107
107
|
if (authors.nil? || authors.empty? )
|
@@ -48,7 +48,7 @@ module JekyllAsciidoctorPdf
|
|
48
48
|
#
|
49
49
|
class SidebarYAML
|
50
50
|
|
51
|
-
attr_reader :product_name, :name, :file, :permalinks, :parameters, :section_output_path, :sidebar_output_path, :base_path, :cover_page, :theme_pdf
|
51
|
+
attr_reader :product_name, :name, :file, :permalinks, :parameters, :section_output_path, :sidebar_output_path, :base_path, :cover_page, :theme_pdf, :prefix
|
52
52
|
|
53
53
|
|
54
54
|
def initialize(product_name, name, file, permalinks, parameters, output_path, base_path, cover_page, theme_pdf )
|
@@ -57,9 +57,10 @@ module JekyllAsciidoctorPdf
|
|
57
57
|
@file = file
|
58
58
|
@permalinks = permalinks
|
59
59
|
@parameters = parameters
|
60
|
-
@base_path = base_path
|
61
60
|
@cover_page = cover_page
|
62
61
|
@theme_pdf = theme_pdf
|
62
|
+
@base_path = base_path
|
63
|
+
@prefix = nil
|
63
64
|
|
64
65
|
@section_output_path = File.join(output_path,name)
|
65
66
|
@sidebar_output_path = File.join(output_path,'/fullsite-' + name)
|
@@ -68,7 +69,27 @@ module JekyllAsciidoctorPdf
|
|
68
69
|
FileUtils::mkdir_p(sidebar_output_path)
|
69
70
|
|
70
71
|
toc = YAML.load_file(file)
|
71
|
-
|
72
|
+
|
73
|
+
|
74
|
+
##
|
75
|
+
# In the more general structure this prefix is important
|
76
|
+
# We use in two ways
|
77
|
+
#
|
78
|
+
# - Move the base path to execute the asciidoctor process
|
79
|
+
# - Use prefix + url to find in the permalinks hash
|
80
|
+
#
|
81
|
+
if toc and toc.key?('prefix')
|
82
|
+
@prefix = toc['prefix']
|
83
|
+
@base_path = File.join(base_path, @prefix)
|
84
|
+
end
|
85
|
+
|
86
|
+
##
|
87
|
+
# A few repositories may have sidebar.yml empty.
|
88
|
+
# we should ignore it
|
89
|
+
#
|
90
|
+
if toc and toc.key?('entries')
|
91
|
+
loadAndProcess('Root', toc['entries'], true)
|
92
|
+
end
|
72
93
|
|
73
94
|
end
|
74
95
|
|
@@ -120,6 +141,10 @@ module JekyllAsciidoctorPdf
|
|
120
141
|
# We ignore absolute links
|
121
142
|
output("Absolute links are not supported!")
|
122
143
|
else
|
144
|
+
if not prefix.nil?
|
145
|
+
page = '/' + prefix + child['url']
|
146
|
+
end
|
147
|
+
|
123
148
|
if permalinks.key?(page)
|
124
149
|
# We have the content
|
125
150
|
node.add_child(JekyllAsciidoctorPdf::SidebarEntry.new(title,page, permalinks[page].content, false))
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll_asciidoctor_pdf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Guido Genzone
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-04-
|
11
|
+
date: 2020-04-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -122,6 +122,20 @@ dependencies:
|
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: 2.0.0
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: prawn
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 2.2.2
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 2.2.2
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: asciidoctor-pdf
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|