hyla 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/README.adoc +38 -3
- data/bin/hyla +21 -8
- data/data/toc.adoc +3 -3
- data/documentation/introduction.adoc +30 -26
- data/documentation/scripts/create_adoc_from_toc.sh +3 -0
- data/documentation/scripts/create_myblankproject_add_artefacts.sh +7 -7
- data/documentation/scripts/create_myblankproject_add_artefacts_config.sh +14 -8
- data/documentation/scripts/create_myblankproject_add_artefacts_my_config.sh +15 -0
- data/documentation/scripts/generate_content_myblankproject.sh +7 -7
- data/documentation/scripts/generate_content_myblankproject_config.sh +17 -11
- data/documentation/scripts/generate_content_myblankproject_other_style.sh +7 -7
- data/documentation/scripts/generate_pdf_from_html.sh +1 -1
- data/documentation/scripts/generate_slideshow_deckjs.sh +4 -4
- data/documentation/scripts/generate_slideshow_mytoc_all.sh +2 -2
- data/documentation/scripts/generate_slideshow_mytoc_module.sh +1 -1
- data/documentation/scripts/generate_slideshow_revealjs.sh +13 -4
- data/documentation/scripts/generate_slideshow_revealjs_config.sh +36 -0
- data/documentation/scripts/sendmail.sh +1 -1
- data/hyla.gemspec +2 -1
- data/lib/hyla.rb +2 -1
- data/lib/hyla/commands/{create.rb → add.rb} +18 -1
- data/lib/hyla/commands/generate.rb +215 -44
- data/lib/hyla/commands/new.rb +16 -9
- data/lib/hyla/commands/sendmail.rb +37 -13
- data/lib/hyla/commands/serve.rb +2 -2
- data/lib/hyla/configuration.rb +73 -33
- data/lib/hyla/core_ext.rb +11 -1
- data/lib/hyla/project.rb +1 -1
- data/lib/resources/backends/haml/revealjs/document.html.haml +9 -2
- data/lib/resources/backends/slim/html5/block_image.html.slim +1 -0
- data/lib/resources/backends/slim/html5/document.html.slim +18 -9
- data/lib/resources/backends/slim/revealjs/block_sidebar.html.slim +5 -5
- data/lib/resources/backends/slim/revealjs/document.html.slim +10 -2
- data/lib/resources/backends/slim/revealjs/section.html.slim +5 -1
- data/lib/resources/cover.slim +70 -0
- data/lib/resources/fonts/liberation/Sans-Bold.ttf +0 -0
- data/lib/resources/fonts/liberation/Sans-BoldItalic.ttf +0 -0
- data/lib/resources/fonts/liberation/Sans-Italic.ttf +0 -0
- data/lib/resources/fonts/liberation/Sans-Regular.ttf +0 -0
- data/lib/resources/revealjs/css/theme/gpe.css +225 -0
- data/lib/resources/styles/liberation.css +3 -1
- data/lib/templates/_config.yaml +26 -8
- data/lib/templates/book/readme.adoc +1 -1
- data/lib/templates/sample/{asciidoc_article.adoc → asciidoc_article.ad} +0 -0
- data/lib/templates/sample/{asciidoc_audio.adoc → asciidoc_audio.ad} +0 -0
- data/lib/templates/sample/{asciidoc_book.adoc → asciidoc_book.ad} +0 -0
- data/lib/templates/sample/{asciidoc_image.adoc → asciidoc_image.ad} +0 -0
- data/lib/templates/sample/{asciidoc_report.adoc → asciidoc_report.ad} +3 -2
- data/lib/templates/sample/{asciidoc_source.adoc → asciidoc_source.ad} +0 -0
- data/lib/templates/sample/{asciidoc_table.adoc → asciidoc_table.ad} +0 -0
- data/lib/templates/sample/{asciidoc_video.adoc → asciidoc_video.ad} +0 -0
- data/lib/templates/sample/{slideshow_deckjs.adoc → slideshow_deckjs.ad} +0 -0
- data/lib/templates/sample/{slideshow_revealjs.adoc → slideshow_revealjs.ad} +1 -1
- data/lib/templates/training-exercises/{README.md → README.ad} +0 -0
- data/lib/templates/training/readme.adoc +1 -1
- metadata +61 -32
- data/documentation/scripts/create_adoc_from_toc_config.sh +0 -24
- data/lib/resources/backends/slim/document.html.bk.slim +0 -335
- data/lib/resources/styles/redhat.css +0 -1
- data/test/reports/test-1.0.x-11-12-2013.txt +0 -123
data/lib/hyla/commands/new.rb
CHANGED
@@ -2,17 +2,29 @@ module Hyla
|
|
2
2
|
module Commands
|
3
3
|
class New < Command
|
4
4
|
|
5
|
+
@readme_content = <<-EOS
|
6
|
+
== Readme Asciidoctor Project
|
7
|
+
|
8
|
+
This is an empty Asciidoctor readme file.
|
9
|
+
|
10
|
+
To create **asciidoc(tor)** content, more info is available http://asciidoctor.org/docs/user-manual[here]
|
11
|
+
|
12
|
+
Otherwise, you can add content to this newly project created using this hyla command :
|
13
|
+
|
14
|
+
hyla add --t asciidoc --a xxx --d pathToProjectCreated
|
15
|
+
|
16
|
+
where xxx can be article, book, source, audio, video, ...
|
17
|
+
EOS
|
18
|
+
|
5
19
|
def self.process(args, options = {})
|
6
|
-
|
20
|
+
|
7
21
|
out_dir = options[:destination] if self.check_mandatory_option?('-d / --destination', options[:destination])
|
8
22
|
|
9
23
|
#
|
10
24
|
# Calculate project path (rel/absolute)
|
11
25
|
#
|
12
|
-
#new_project_path = File.expand_path(args[0], Dir.pwd)
|
13
26
|
new_project_path = File.expand_path(out_dir, Dir.pwd)
|
14
27
|
|
15
|
-
|
16
28
|
if Dir.exist? new_project_path
|
17
29
|
|
18
30
|
Hyla.logger.debug("Dir exists: #{new_project_path}")
|
@@ -73,12 +85,7 @@ module Hyla
|
|
73
85
|
def self.create_blank_project(path)
|
74
86
|
Dir.chdir(path) do
|
75
87
|
f = File.open('readme.ad', 'w')
|
76
|
-
f.puts
|
77
|
-
f.puts "This is an empty Asciidoctor readme file."
|
78
|
-
f.puts "To create **asciidoc(tor)** content, more info are available http://asciidoctor.org/docs/user-manual[here]"
|
79
|
-
f.puts "otherwise, you can add content to this newly project created using this hyla command :"
|
80
|
-
f.puts "hyla create --t asciidoc --a xxx --d pathToProjectCreated"
|
81
|
-
f.puts "where xxx can be article, book, source, audio, video, ..."
|
88
|
+
f.puts @readme_content
|
82
89
|
end
|
83
90
|
end
|
84
91
|
|
@@ -4,9 +4,10 @@ module Hyla
|
|
4
4
|
|
5
5
|
def self.process(args, options)
|
6
6
|
|
7
|
-
location = options[:
|
7
|
+
location = options[:source] if self.check_mandatory_option?('-s / --source', options[:source])
|
8
8
|
file_name = options[:file] if check_mandatory_option?('-f / --file', options[:file])
|
9
9
|
email_attributes = options[:email_attributes] if check_mandatory_option?('-e / --email_attributes', options[:email_attributes])
|
10
|
+
attachment = options[:attachment]
|
10
11
|
|
11
12
|
sender = email_attributes[:from]
|
12
13
|
recipients = email_attributes[:to]
|
@@ -46,20 +47,22 @@ module Hyla
|
|
46
47
|
</html>
|
47
48
|
EOS
|
48
49
|
|
49
|
-
mail =
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
content_type 'multipart/related'
|
54
|
-
end
|
50
|
+
mail = populate_email(recipients, sender, subject)
|
51
|
+
|
52
|
+
case attachment
|
53
|
+
when true
|
55
54
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
55
|
+
attachment = File.read(file_path)
|
56
|
+
mail.attachments[file_name] = {
|
57
|
+
:mime_type => 'application/x-html',
|
58
|
+
:content => attachment,
|
59
|
+
:Content_Transfer_Encoding => 'quoted-printable'}
|
61
60
|
|
62
|
-
|
61
|
+
inline_html = inline_body_with_attachments(body, mail.attachments)
|
62
|
+
|
63
|
+
when false
|
64
|
+
inline_html = File.read(file_path)
|
65
|
+
end
|
63
66
|
|
64
67
|
html_part = Mail::Part.new do
|
65
68
|
content_type 'text/html; charset=UTF-8'
|
@@ -73,6 +76,24 @@ module Hyla
|
|
73
76
|
Hyla.logger.info "Email send to SMTP server from #{sender} with this subject : #{subject}"
|
74
77
|
end
|
75
78
|
|
79
|
+
#
|
80
|
+
# Create Mail using
|
81
|
+
# Recipients, Sender and subject
|
82
|
+
#
|
83
|
+
def self.populate_email(recipients, sender, subject)
|
84
|
+
mail = Mail.new do
|
85
|
+
to recipients
|
86
|
+
from sender
|
87
|
+
subject subject
|
88
|
+
content_type 'multipart/related'
|
89
|
+
end
|
90
|
+
return mail
|
91
|
+
end
|
92
|
+
|
93
|
+
#
|
94
|
+
# Generate the Hash of the parameters
|
95
|
+
# used by mail compoent nto send email
|
96
|
+
#
|
76
97
|
def self.parameters()
|
77
98
|
parameters = {}
|
78
99
|
parameters[:address] = @smtp_server unless @smtp_server.nil?
|
@@ -84,6 +105,9 @@ module Hyla
|
|
84
105
|
return parameters
|
85
106
|
end
|
86
107
|
|
108
|
+
#
|
109
|
+
# Substitute filename with cid
|
110
|
+
#
|
87
111
|
def self.inline_body_with_attachments(html, attachments)
|
88
112
|
attachments.each do |attachment|
|
89
113
|
if (html =~ /#{attachment.filename}/)
|
data/lib/hyla/commands/serve.rb
CHANGED
@@ -5,18 +5,18 @@ module Hyla
|
|
5
5
|
def self.process(args, options)
|
6
6
|
include WEBrick
|
7
7
|
|
8
|
-
my_opts =
|
8
|
+
my_opts = {}
|
9
9
|
|
10
10
|
destination = options[:destination] if self.check_mandatory_option?('-d / --destination', options[:destination])
|
11
11
|
|
12
12
|
my_opts[:Port] = options[:port]
|
13
13
|
my_opts[:BindAddress] = options[:host]
|
14
|
+
my_opts[:baseurl] = options[:baseurl]
|
14
15
|
my_opts[:MimeTypes] = self.mime_types
|
15
16
|
my_opts[:DoNotReverseLookupmy_opts] = true
|
16
17
|
my_opts[:StartCallback] = start_callback(options[:detach])
|
17
18
|
my_opts[:AccessLog] = []
|
18
19
|
my_opts[:Logger] = Log::new([], Log::WARN)
|
19
|
-
my_opts[:baseurl] = options[:baseurl]
|
20
20
|
|
21
21
|
# recreate NondisclosureName under utf-8 circumstance
|
22
22
|
fh_option = WEBrick::Config::FileHandler
|
data/lib/hyla/configuration.rb
CHANGED
@@ -3,33 +3,43 @@ module Hyla
|
|
3
3
|
|
4
4
|
attr_reader :HEADER, :INDEX_SUFFIX, :HEADER_INDEX, :INCLUDE_PREFIX, :INCLUDE_SUFFIX, :LEVEL_1, :LEVEL_2, :SKIP_CHARACTERS,
|
5
5
|
:ADOC_EXT, :PREFIX_ARTEFACT, :YAML_CONFIG_FILE_NAME, :DEFAULTS,
|
6
|
-
:templates, :samples, :resources, :styles, :backends
|
6
|
+
:templates, :cover_template, :samples, :resources, :styles, :fonts, :backends
|
7
7
|
|
8
8
|
DEFAULTS = {
|
9
|
-
'source'
|
10
|
-
'destination'
|
11
|
-
'watch_dir'
|
12
|
-
'watch_ext'
|
9
|
+
'source' => Dir.pwd,
|
10
|
+
'destination' => File.join(Dir.pwd, 'generated_content'),
|
11
|
+
'watch_dir' => '.',
|
12
|
+
'watch_ext' => %w(ad adoc asc asciidoc txt index),
|
13
13
|
|
14
14
|
# Asciidoctor
|
15
|
-
'backend'
|
16
|
-
'eruby'
|
17
|
-
'doctype'
|
18
|
-
'compact'
|
19
|
-
'to_dir'
|
20
|
-
'to_file'
|
21
|
-
'attributes'
|
15
|
+
'backend' => 'html5',
|
16
|
+
'eruby' => 'erb',
|
17
|
+
'doctype' => 'article',
|
18
|
+
'compact' => false,
|
19
|
+
'to_dir' => '.',
|
20
|
+
'to_file' => '',
|
21
|
+
'attributes' => {
|
22
22
|
'source-highlighter' => 'coderay',
|
23
|
-
'linkcss!'
|
24
|
-
'data-uri'
|
25
|
-
'stylesheet'
|
26
|
-
'stylesdir'
|
23
|
+
'linkcss!' => 'true',
|
24
|
+
'data-uri' => 'true',
|
25
|
+
'stylesheet' => 'asciidoctor.css',
|
26
|
+
'stylesdir' => 'styles'
|
27
27
|
},
|
28
|
-
'safe'
|
28
|
+
'safe' => 'unsafe',
|
29
29
|
'header_footer' => true
|
30
30
|
|
31
31
|
}
|
32
32
|
|
33
|
+
#
|
34
|
+
# Matches an include preprocessor directive.
|
35
|
+
#
|
36
|
+
# Examples
|
37
|
+
#
|
38
|
+
# include::chapter1.ad[]
|
39
|
+
# include::example.txt[lines=1;2;5..10]
|
40
|
+
#
|
41
|
+
IncludeDirectiveRx = /^\\?include::([^\[]+)\[(.*?)\]$/
|
42
|
+
|
33
43
|
INCLUDE_PREFIX = 'include::'
|
34
44
|
|
35
45
|
INCLUDE_SUFFIX = '[]'
|
@@ -42,11 +52,12 @@ module Hyla
|
|
42
52
|
":source-highlighter: coderay\n"
|
43
53
|
|
44
54
|
HEADER_INDEX = ":data-uri:\n" +
|
45
|
-
":navigation
|
46
|
-
":menu
|
47
|
-
":status
|
48
|
-
":goto
|
49
|
-
":notitle
|
55
|
+
":navigation: # navigation attribute used for DeckJS Slideshow\n" +
|
56
|
+
":menu: # navigation attribute used for DeckJS Slideshow\n" +
|
57
|
+
":status: # navigation attribute used for DeckJS Slideshow\n" +
|
58
|
+
":goto: # navigation attribute used for DeckJS Slideshow\n" +
|
59
|
+
":notitle: \n" +
|
60
|
+
":toc: left # Comment or uncomment this attribute if you don't need to display left part of the HTML page a table of content\n"
|
50
61
|
|
51
62
|
LEVEL_1 = '= '
|
52
63
|
|
@@ -54,7 +65,7 @@ module Hyla
|
|
54
65
|
|
55
66
|
SKIP_CHARACTERS = '>>'
|
56
67
|
|
57
|
-
ADOC_EXT = '.
|
68
|
+
ADOC_EXT = '.ad'
|
58
69
|
|
59
70
|
PREFIX_ARTEFACT = 'asciidoc_'
|
60
71
|
|
@@ -66,10 +77,21 @@ module Hyla
|
|
66
77
|
|
67
78
|
STYLES = '../../lib/resources/styles'
|
68
79
|
|
80
|
+
FONTS = '../../lib/resources/fonts'
|
81
|
+
|
69
82
|
BACKENDS = '../../lib/resources/backends'
|
70
83
|
|
84
|
+
COVER_TEMPLATE = '../../lib/resources/cover.slim'
|
85
|
+
|
71
86
|
YAML_CONFIG_FILE_NAME = '_config.yaml'
|
72
87
|
|
88
|
+
#
|
89
|
+
# Cover Slim Template
|
90
|
+
#
|
91
|
+
def self.cover_template
|
92
|
+
File.expand_path(COVER_TEMPLATE, File.dirname(__FILE__))
|
93
|
+
end
|
94
|
+
|
73
95
|
#
|
74
96
|
# Templates Location
|
75
97
|
#
|
@@ -91,6 +113,13 @@ module Hyla
|
|
91
113
|
File.expand_path(STYLES, File.dirname(__FILE__))
|
92
114
|
end
|
93
115
|
|
116
|
+
#
|
117
|
+
# Fonts Location
|
118
|
+
#
|
119
|
+
def self.fonts
|
120
|
+
File.expand_path(FONTS, File.dirname(__FILE__))
|
121
|
+
end
|
122
|
+
|
94
123
|
#
|
95
124
|
# Backends Location
|
96
125
|
#
|
@@ -133,13 +162,21 @@ module Hyla
|
|
133
162
|
config = DEFAULTS
|
134
163
|
Hyla::logger.debug("DEFAULTS Keys: #{config.inspect}")
|
135
164
|
|
136
|
-
#
|
137
|
-
#
|
138
|
-
|
139
|
-
|
140
|
-
|
165
|
+
#
|
166
|
+
# Read the config file passed as parameter if it exists
|
167
|
+
# otherwise read default _config.yaml file if it exists and
|
168
|
+
# merge content with DEFAULT config
|
169
|
+
#
|
170
|
+
alt_config = read_config_file(override['config']) if override['config']
|
171
|
+
if !alt_config.nil?
|
172
|
+
config = config.deep_merge(alt_config)
|
173
|
+
else
|
174
|
+
new_config = read_config_file(YAML_CONFIG_FILE_NAME)
|
175
|
+
Hyla::logger.debug("OVERRIDE Keys: #{new_config.inspect}") if !new_config.nil?
|
176
|
+
config = config.deep_merge(new_config) if !new_config.nil?
|
177
|
+
end
|
141
178
|
|
142
|
-
# Merge DEFAULTS < _config.yaml < override
|
179
|
+
# Merge DEFAULTS < _config.yaml or your_config.yaml file < override
|
143
180
|
config = config.deep_merge(override)
|
144
181
|
# Convert String Keys to Symbols Keys
|
145
182
|
config = Configuration[].transform_keys_to_symbols(config)
|
@@ -156,7 +193,7 @@ module Hyla
|
|
156
193
|
config = safe_load_file(f)
|
157
194
|
config
|
158
195
|
rescue SystemCallError
|
159
|
-
Hyla::logger.warn "No
|
196
|
+
Hyla::logger.warn "No configuration file retrieved for the name : #{filename}"
|
160
197
|
end
|
161
198
|
|
162
199
|
#
|
@@ -180,8 +217,10 @@ module Hyla
|
|
180
217
|
return hash if not hash.is_a?(Hash)
|
181
218
|
hash.inject({}) { |result, (key, value)|
|
182
219
|
new_key = case key
|
183
|
-
when String then
|
184
|
-
|
220
|
+
when String then
|
221
|
+
key.to_sym
|
222
|
+
else
|
223
|
+
key
|
185
224
|
end
|
186
225
|
new_value = case value
|
187
226
|
when Hash
|
@@ -190,7 +229,8 @@ module Hyla
|
|
190
229
|
else
|
191
230
|
transform_keys_to_symbols(value)
|
192
231
|
end
|
193
|
-
else
|
232
|
+
else
|
233
|
+
value
|
194
234
|
end
|
195
235
|
result[new_key] = new_value
|
196
236
|
result
|
data/lib/hyla/core_ext.rb
CHANGED
data/lib/hyla/project.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Hyla
|
2
|
-
VERSION = '1.0.
|
2
|
+
VERSION = '1.0.4'
|
3
3
|
DESCRIPTION = 'Asciidoctor Hyla - Command Line tool to create new project, watch modifications, generate content, publish or consult it live !'
|
4
4
|
SUMMARY = 'Asciidoctor Hyla - builder/generator of HTML5, slideshow. Watch modifications, generate content, publish or consult it live !'
|
5
5
|
end
|
@@ -19,11 +19,18 @@
|
|
19
19
|
%meta(name='keywords'){:content=>(attr :keywords)}
|
20
20
|
- if attr? :author
|
21
21
|
%meta(name='author'){:content=>(attr :author)}
|
22
|
-
|
22
|
+
:javascript
|
23
|
+
document.write( '<link rel="stylesheet" href="revealjs/css/print/' +
|
24
|
+
( window.location.search.match( /print-pdf/gi ) ? 'pdf' : 'paper' ) +
|
25
|
+
'.css" type="text/css" media="print">' );
|
23
26
|
%body{:id=>@id, :class=>['reveal-container',(attr :doctype)]}
|
24
27
|
.reveal
|
28
|
+
.header
|
29
|
+
%img(src='image/rhheader_thin.png' alt='RedHat Corporate Logo')
|
25
30
|
.slides
|
26
31
|
=content
|
32
|
+
.footer
|
33
|
+
Copyright ©2014 Red Hat, Inc.
|
27
34
|
%script(src='lib/js/head.min.js')
|
28
35
|
%script(src='reveal.js/js/reveal.min.js')
|
29
36
|
:javascript
|
@@ -53,7 +60,7 @@
|
|
53
60
|
// Apply a 3D roll to links on hover
|
54
61
|
rollingLinks: true,
|
55
62
|
// Transition style
|
56
|
-
transition: '
|
63
|
+
transition: 'none', // default/cube/page/concave/zoom/linear/fade/none
|
57
64
|
// Transition speed
|
58
65
|
transitionSpeed: 'default', // default/fast/slow
|
59
66
|
// Transition style for full page backgrounds
|
@@ -67,6 +67,8 @@ html lang=(attr :lang, 'en' unless attr? :nolang)
|
|
67
67
|
/ AsciiDoc leaves an empty header div even if there's no doctitle
|
68
68
|
#header
|
69
69
|
- if has_header?
|
70
|
+
- if attr? :header_image_path
|
71
|
+
img src=image_uri(attr :header_image_path)
|
70
72
|
- unless notitle
|
71
73
|
h1=@header.title
|
72
74
|
- if attr? :author
|
@@ -89,6 +91,9 @@ html lang=(attr :lang, 'en' unless attr? :nolang)
|
|
89
91
|
- if attr? :revremark
|
90
92
|
br
|
91
93
|
span#revremark=attr :revremark
|
94
|
+
- else
|
95
|
+
- if attr? :header_image_path
|
96
|
+
img src=image_uri(attr :header_image_path)
|
92
97
|
- if (attr? :toc) && (attr? 'toc-placement', 'auto')
|
93
98
|
#toc class=(attr 'toc-class', 'toc')
|
94
99
|
#toctitle=attr 'toc-title'
|
@@ -101,12 +106,16 @@ html lang=(attr :lang, 'en' unless attr? :nolang)
|
|
101
106
|
- footnotes.each do |fn|
|
102
107
|
.footnote id='_footnote_#{fn.index}'
|
103
108
|
<a href="#_footnoteref_#{fn.index}">#{fn.index}</a>. #{fn.text}
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
109
|
+
- if attr? :footer_copyright
|
110
|
+
.footer-copyright
|
111
|
+
=attr :footer_copyright
|
112
|
+
- unless attr? :nofooter
|
113
|
+
#footer
|
114
|
+
#footer-text
|
115
|
+
- if attr? :revnumber
|
116
|
+
| #{attr 'version-label'} #{attr :revnumber}
|
117
|
+
- if attr? 'last-update-label'
|
118
|
+
br
|
119
|
+
| #{attr 'last-update-label'} #{attr :docdatetime}
|
120
|
+
- unless (docinfo_content = (docinfo :footer)).empty?
|
121
|
+
=docinfo_content
|
@@ -1,5 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
aside id=@id class='notes'
|
2
|
+
- if title?
|
3
|
+
.title=title
|
4
|
+
=content
|
5
|
+
|