asciidoctor-revealjs 4.0.0 → 4.1.0.rc5
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/README.adoc +75 -35
- data/Rakefile +18 -3
- data/asciidoctor-revealjs.gemspec +1 -1
- data/examples/a11y-dark.css +99 -0
- data/examples/autoslide.adoc +22 -0
- data/examples/custom-layout.adoc +10 -0
- data/examples/data-attributes.adoc +245 -0
- data/examples/font-awesome-specific-version.adoc +11 -0
- data/examples/font-awesome.adoc +16 -2
- data/examples/footnotes.adoc +46 -0
- data/examples/fragments.adoc +12 -0
- data/examples/grid-layout-3x2.adoc +50 -0
- data/examples/grid-layout-docinfo-revealjs.html +1 -1
- data/examples/grid-layout.adoc +21 -1
- data/examples/images/cute-cat-1.jpg +0 -0
- data/examples/images/cute-cat-2.jpg +0 -0
- data/examples/images/cute-cat-3.jpg +0 -0
- data/examples/images/flock-of-seagulls_daniel-simion.mp3 +0 -0
- data/examples/issue-grid-layout-images.adoc +25 -0
- data/examples/mathjax-cdn.adoc +21 -0
- data/examples/mathjax.adoc +20 -0
- data/examples/release-4.0.adoc +2 -5
- data/examples/release-4.1.adoc +133 -0
- data/examples/release-4.1.css +50 -0
- data/examples/revealjs-custom-theme.adoc +10 -0
- data/examples/steps.adoc +87 -0
- data/examples/text-alignments.adoc +44 -0
- data/examples/video.adoc +19 -6
- data/lib/asciidoctor-revealjs/converter.rb +754 -647
- data/lib/asciidoctor-revealjs/version.rb +1 -1
- data/templates/admonition.html.slim +1 -1
- data/templates/asciidoctor-compatibility.css +303 -54
- data/templates/audio.html.slim +1 -1
- data/templates/colist.html.slim +1 -1
- data/templates/dlist.html.slim +3 -3
- data/templates/document.html.slim +12 -7
- data/templates/example.html.slim +1 -1
- data/templates/helpers.rb +80 -7
- data/templates/image.html.slim +2 -2
- data/templates/inline_anchor.html.slim +5 -4
- data/templates/inline_button.html.slim +2 -1
- data/templates/inline_footnote.html.slim +11 -4
- data/templates/inline_image.html.slim +2 -5
- data/templates/inline_kbd.html.slim +3 -2
- data/templates/inline_menu.html.slim +4 -3
- data/templates/inline_quoted.html.slim +13 -21
- data/templates/listing.html.slim +14 -9
- data/templates/literal.html.slim +1 -1
- data/templates/olist.html.slim +2 -2
- data/templates/open.html.slim +3 -3
- data/templates/paragraph.html.slim +1 -1
- data/templates/quote.html.slim +1 -1
- data/templates/section.html.slim +18 -1
- data/templates/sidebar.html.slim +1 -1
- data/templates/stem.html.slim +1 -1
- data/templates/table.html.slim +3 -2
- data/templates/ulist.html.slim +3 -3
- data/templates/verse.html.slim +1 -1
- data/templates/video.html.slim +14 -8
- metadata +26 -10
- data/CHANGELOG.adoc +0 -542
- data/HACKING.adoc +0 -411
data/templates/example.html.slim
CHANGED
data/templates/helpers.rb
CHANGED
|
@@ -33,11 +33,11 @@ module Slim::Helpers
|
|
|
33
33
|
# then link::example.com[Link text, preview=false]
|
|
34
34
|
# Here the template must have data-preview-link="false" not just no data-preview-link attribute
|
|
35
35
|
def bool_data_attr val
|
|
36
|
-
return false
|
|
36
|
+
return false unless attr?(val)
|
|
37
37
|
if attr(val).downcase == 'false' || attr(val) == '0'
|
|
38
|
-
|
|
38
|
+
'false'
|
|
39
39
|
else
|
|
40
|
-
|
|
40
|
+
true
|
|
41
41
|
end
|
|
42
42
|
end
|
|
43
43
|
|
|
@@ -72,25 +72,52 @@ module Slim::Helpers
|
|
|
72
72
|
# @yield The block of Slim/HTML code within the tag (optional).
|
|
73
73
|
# @return [String] a rendered HTML element.
|
|
74
74
|
#
|
|
75
|
-
|
|
76
75
|
def html_tag(name, attributes = {}, content = nil)
|
|
77
76
|
attrs = attributes.inject([]) do |attrs, (k, v)|
|
|
78
|
-
next attrs
|
|
77
|
+
next attrs unless v && (v == true || !v.nil_or_empty?)
|
|
79
78
|
v = v.compact.join(' ') if v.is_a? Array
|
|
80
79
|
attrs << (v == true ? k : %(#{k}="#{v}"))
|
|
81
80
|
end
|
|
82
81
|
attrs_str = attrs.empty? ? '' : ' ' + attrs.join(' ')
|
|
83
82
|
|
|
84
|
-
|
|
85
83
|
if VOID_ELEMENTS.include? name.to_s
|
|
86
84
|
%(<#{name}#{attrs_str}>)
|
|
87
85
|
else
|
|
88
|
-
content ||= yield if block_given?
|
|
86
|
+
content ||= (yield if block_given?)
|
|
89
87
|
%(<#{name}#{attrs_str}>#{content}</#{name}>)
|
|
90
88
|
end
|
|
91
89
|
end
|
|
92
90
|
|
|
93
91
|
|
|
92
|
+
#
|
|
93
|
+
# Extracts data- attributes from the attributes.
|
|
94
|
+
# @param attributes [Hash] (default: {})
|
|
95
|
+
# @return [Hash] a Hash that contains only data- attributes
|
|
96
|
+
#
|
|
97
|
+
def data_attrs(attributes)
|
|
98
|
+
# key can be an Integer (for positional attributes)
|
|
99
|
+
attributes.map { |key, value| (key == 'step') ? ['data-fragment-index', value] : [key, value] }
|
|
100
|
+
.to_h
|
|
101
|
+
.select { |key, _| key.to_s.start_with?('data-') }
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
#
|
|
106
|
+
# Wrap an inline text in a <span> element if the node contains a role, an id or data- attributes.
|
|
107
|
+
# @param content [#to_s] the content; +nil+ to call the block. (default: nil).
|
|
108
|
+
# @return [String] the content or the content wrapped in a <span> element as string
|
|
109
|
+
#
|
|
110
|
+
def inline_text_container(content = nil)
|
|
111
|
+
data_attrs = data_attrs(@attributes)
|
|
112
|
+
classes = [role, ('fragment' if (option? :step) || (attr? 'step') || (roles.include? 'step'))].compact
|
|
113
|
+
if !roles.empty? || !data_attrs.empty? || !@id.nil?
|
|
114
|
+
html_tag('span', { :id => @id, :class => classes }.merge(data_attrs), (content || (yield if block_given?)))
|
|
115
|
+
else
|
|
116
|
+
content || (yield if block_given?)
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
|
|
94
121
|
##
|
|
95
122
|
# Returns corrected section level.
|
|
96
123
|
#
|
|
@@ -101,6 +128,52 @@ module Slim::Helpers
|
|
|
101
128
|
@_section_level ||= (sec.level == 0 && sec.special) ? 1 : sec.level
|
|
102
129
|
end
|
|
103
130
|
|
|
131
|
+
##
|
|
132
|
+
# Display footnotes per slide
|
|
133
|
+
#
|
|
134
|
+
@@slide_footnotes = {}
|
|
135
|
+
@@section_footnotes = {}
|
|
136
|
+
|
|
137
|
+
def slide_footnote(footnote)
|
|
138
|
+
footnote_parent = footnote.parent
|
|
139
|
+
# footnotes declared on the section title are processed during the parsing/substitution.
|
|
140
|
+
# as a result, we need to store them to display them on the right slide/section
|
|
141
|
+
if footnote_parent.instance_of?(::Asciidoctor::Section)
|
|
142
|
+
footnote_parent_object_id = footnote_parent.object_id
|
|
143
|
+
section_footnotes = (@@section_footnotes[footnote_parent_object_id] || [])
|
|
144
|
+
footnote_index = section_footnotes.length + 1
|
|
145
|
+
attributes = footnote.attributes.merge({ 'index' => footnote_index })
|
|
146
|
+
inline_footnote = Asciidoctor::Inline.new(footnote_parent, footnote.context, footnote.text, :attributes => attributes)
|
|
147
|
+
section_footnotes << Asciidoctor::Document::Footnote.new(inline_footnote.attr(:index), inline_footnote.id, inline_footnote.text)
|
|
148
|
+
@@section_footnotes[footnote_parent_object_id] = section_footnotes
|
|
149
|
+
inline_footnote
|
|
150
|
+
else
|
|
151
|
+
parent = footnote.parent
|
|
152
|
+
until parent == nil || parent.instance_of?(::Asciidoctor::Section)
|
|
153
|
+
parent = parent.parent
|
|
154
|
+
end
|
|
155
|
+
# check if there is any footnote attached on the section title
|
|
156
|
+
section_footnotes = parent != nil ? @@section_footnotes[parent.object_id] || [] : []
|
|
157
|
+
initial_index = footnote.attr(:index)
|
|
158
|
+
# reset the footnote numbering to 1 on each slide
|
|
159
|
+
# make sure that if a footnote is used more than once it will use the same index/number
|
|
160
|
+
slide_index = (existing_footnote = @@slide_footnotes[initial_index]) ? existing_footnote.index : @@slide_footnotes.length + section_footnotes.length + 1
|
|
161
|
+
attributes = footnote.attributes.merge({ 'index' => slide_index })
|
|
162
|
+
inline_footnote = Asciidoctor::Inline.new(footnote_parent, footnote.context, footnote.text, :attributes => attributes)
|
|
163
|
+
@@slide_footnotes[initial_index] = Asciidoctor::Document::Footnote.new(inline_footnote.attr(:index), inline_footnote.id, inline_footnote.text)
|
|
164
|
+
inline_footnote
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def clear_slide_footnotes
|
|
169
|
+
@@slide_footnotes = {}
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def slide_footnotes(section)
|
|
173
|
+
section_object_id = section.object_id
|
|
174
|
+
section_footnotes = @@section_footnotes[section_object_id] || []
|
|
175
|
+
section_footnotes + @@slide_footnotes.values
|
|
176
|
+
end
|
|
104
177
|
|
|
105
178
|
##
|
|
106
179
|
# Returns the captioned section's title, optionally numbered.
|
data/templates/image.html.slim
CHANGED
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
- height = "100%"
|
|
11
11
|
|
|
12
12
|
- unless attributes[1] == 'background' || attributes[1] == 'canvas'
|
|
13
|
-
.
|
|
14
|
-
|
|
13
|
+
- inline_style = [("text-align: #{attr :align}" if attr? :align),("float: #{attr :float}" if attr? :float)].compact.join('; ')
|
|
14
|
+
= html_tag('div', { :id => @id, :class => ['imageblock', role, ('fragment' if (option? :step) || (attr? 'step'))], :style => inline_style }.merge(data_attrs(@attributes)))
|
|
15
15
|
- if attr? :link
|
|
16
16
|
a.image href=(attr :link) target=(attr :window) data-preview-link=(bool_data_attr :link_preview)
|
|
17
17
|
img src=image_uri(attr :target) alt=(attr :alt) width=(width) height=(height) style=((attr? :background) ? "background: #{attr :background}" : nil)
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
- case @type
|
|
2
2
|
- when :xref
|
|
3
3
|
- refid = (attr :refid) || @target
|
|
4
|
-
a href
|
|
4
|
+
= html_tag('a', { :href => @target, :class => [role, ('fragment' if (option? :step) || (attr? 'step'))].compact }.merge(data_attrs(@attributes)))
|
|
5
|
+
=(@text || @document.references[:ids].fetch(refid, "[#{refid}]")).tr_s("\n", ' ')
|
|
5
6
|
- when :ref
|
|
6
|
-
a id
|
|
7
|
+
= html_tag('a', { :id => @target }.merge(data_attrs(@attributes)))
|
|
7
8
|
- when :bibref
|
|
8
|
-
a id
|
|
9
|
+
= html_tag('a', { :id => @target }.merge(data_attrs(@attributes)))
|
|
9
10
|
|[#{@target}]
|
|
10
11
|
- else
|
|
11
|
-
a href
|
|
12
|
+
= html_tag('a', { :href => @target, :class => [role, ('fragment' if (option? :step) || (attr? 'step'))].compact, :target => (attr :window), 'data-preview-link' => (bool_data_attr :preview) }.merge(data_attrs(@attributes)))
|
|
12
13
|
=@text
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
b.
|
|
1
|
+
= html_tag('b', { :class => ['button'] }.merge(data_attrs(@attributes)))
|
|
2
|
+
= @text
|
|
@@ -1,6 +1,13 @@
|
|
|
1
|
+
- footnote = slide_footnote(self)
|
|
2
|
+
- index = footnote.attr(:index)
|
|
3
|
+
- id = footnote.id
|
|
1
4
|
- if @type == :xref
|
|
2
|
-
|
|
3
|
-
| [
|
|
5
|
+
= html_tag('sup', { :class => ['footnoteref'] }.merge(data_attrs(footnote.attributes)))
|
|
6
|
+
| [
|
|
7
|
+
span(class="footnote" title="View footnote.") = index
|
|
8
|
+
| ]
|
|
4
9
|
- else
|
|
5
|
-
|
|
6
|
-
| [
|
|
10
|
+
= html_tag('sup', { :id => ("_footnote_#{id}" if id), :class => ['footnote'] }.merge(data_attrs(footnote.attributes)))
|
|
11
|
+
| [
|
|
12
|
+
span(class="footnote" title="View footnote.") = index
|
|
13
|
+
| ]
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
span class
|
|
1
|
+
= html_tag('span', { :class => [@type, role, ('fragment' if (option? :step) || (attr? 'step'))], :style => ("float: #{attr :float}" if attr? :float) }.merge(data_attrs(@attributes)))
|
|
2
2
|
- if @type == 'icon' && (@document.attr? :icons, 'font')
|
|
3
|
-
- style_class = [
|
|
4
|
-
- style_class << "fa-#{attr :size}" if attr? :size
|
|
5
|
-
- style_class << "fa-rotate-#{attr :rotate}" if attr? :rotate
|
|
6
|
-
- style_class << "fa-flip-#{attr :flip}" if attr? :flip
|
|
3
|
+
- style_class = [(attr :set, 'fa'), "fa-#{@target}", ("fa-#{attr :size}" if attr? :size), ("fa-rotate-#{attr :rotate}" if attr? :rotate), ("fa-flip-#{attr :flip}" if attr? :flip)]
|
|
7
4
|
- if attr? :link
|
|
8
5
|
a.image href=(attr :link) target=(attr :window) data-preview-link=(bool_data_attr :link_preview)
|
|
9
6
|
i class=style_class title=(attr :title)
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
- if (keys = attr 'keys').size == 1
|
|
2
|
-
kbd
|
|
2
|
+
= html_tag('kbd', data_attrs(@attributes))
|
|
3
|
+
= keys.first
|
|
3
4
|
- else
|
|
4
|
-
span.
|
|
5
|
+
= html_tag('span', { :class => ['keyseq'] }.merge(data_attrs(@attributes)))
|
|
5
6
|
- keys.each_with_index do |key, idx|
|
|
6
7
|
- unless idx.zero?
|
|
7
8
|
|+
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
- menu = attr 'menu'
|
|
2
2
|
- menuitem = attr 'menuitem'
|
|
3
3
|
- if !(submenus = attr 'submenus').empty?
|
|
4
|
-
span.
|
|
4
|
+
= html_tag('span', { :class => ['menuseq'] }.merge(data_attrs(@attributes)))
|
|
5
5
|
span.menu=menu
|
|
6
6
|
| ▸ 
|
|
7
7
|
=submenus.map {|submenu| %(<span class="submenu">#{submenu}</span> ▸ ) }.join
|
|
8
8
|
span.menuitem=menuitem
|
|
9
9
|
- elsif !menuitem.nil?
|
|
10
|
-
span.
|
|
10
|
+
= html_tag('span', { :class => ['menuseq'] }.merge(data_attrs(@attributes)))
|
|
11
11
|
span.menu=menu
|
|
12
12
|
| ▸ 
|
|
13
13
|
span.menuitem=menuitem
|
|
14
14
|
- else
|
|
15
|
-
span.
|
|
15
|
+
= html_tag('span', { :class => ['menu'] }.merge(data_attrs(@attributes)))
|
|
16
|
+
= menu
|
|
@@ -1,22 +1,14 @@
|
|
|
1
|
-
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
- when :emphasis
|
|
5
|
-
em class=role =@text
|
|
6
|
-
- when :strong
|
|
7
|
-
strong class=role =@text
|
|
8
|
-
- when :monospaced
|
|
9
|
-
code class=role =@text
|
|
10
|
-
- when :superscript
|
|
11
|
-
sup class=role =@text
|
|
12
|
-
- when :subscript
|
|
13
|
-
sub class=role =@text
|
|
14
|
-
- when :double
|
|
15
|
-
=role? ? %(<span class="#{role}">“#{@text}”</span>) : %(“#{@text}”)
|
|
16
|
-
- when :single
|
|
17
|
-
=role? ? %(<span class="#{role}">‘#{@text}’</span>) : %(‘#{@text}’)
|
|
18
|
-
- when :asciimath, :latexmath
|
|
19
|
-
- open, close = Asciidoctor::INLINE_MATH_DELIMITERS[@type]
|
|
20
|
-
|#{open}#{@text}#{close}
|
|
1
|
+
- quote_tags = { emphasis: 'em', strong: 'strong', monospaced: 'code', superscript: 'sup', subscript: 'sup' }
|
|
2
|
+
- if (quote_tag = quote_tags[@type])
|
|
3
|
+
= html_tag(quote_tag, { :id => @id, :class => [role, ('fragment' if (option? :step) || (attr? 'step'))].compact }.merge(data_attrs(@attributes)), @text)
|
|
21
4
|
- else
|
|
22
|
-
|
|
5
|
+
- case @type
|
|
6
|
+
- when :double
|
|
7
|
+
- inline_text_container("“#{@text}”")
|
|
8
|
+
- when :single
|
|
9
|
+
= inline_text_container("‘#{@text}’")
|
|
10
|
+
- when :asciimath, :latexmath
|
|
11
|
+
- open, close = Asciidoctor::INLINE_MATH_DELIMITERS[@type]
|
|
12
|
+
= inline_text_container("#{open}#{@text}#{close}")
|
|
13
|
+
- else
|
|
14
|
+
= inline_text_container(@text)
|
data/templates/listing.html.slim
CHANGED
|
@@ -8,12 +8,17 @@
|
|
|
8
8
|
- style = doc_attrs[%(#{syntax_hl.name}-style)]
|
|
9
9
|
- opts = syntax_hl.highlight? ? { css_mode: css_mode, style: style } : {}
|
|
10
10
|
- opts[:nowrap] = nowrap
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
|
|
11
|
+
= html_tag('div', { :id => id, :class => ['listingblock', role, ('fragment' if (option? :step) || (attr? 'step'))] }.merge(data_attrs(@attributes)))
|
|
12
|
+
- if title?
|
|
13
|
+
div.title= captioned_title
|
|
14
|
+
div.content
|
|
15
|
+
- if syntax_hl
|
|
16
|
+
= (syntax_hl.format self, lang, opts)
|
|
17
|
+
- else
|
|
18
|
+
- if @style == 'source'
|
|
19
|
+
pre class = ['highlight', ('nowrap' if nowrap)]
|
|
20
|
+
code class = [("language-#{lang}" if lang)] data-lang = ("#{lang}" if lang)
|
|
21
|
+
= content || ''
|
|
22
|
+
- else
|
|
23
|
+
pre class = [('nowrap' if nowrap)]
|
|
24
|
+
= content || ''
|
data/templates/literal.html.slim
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
= html_tag('div', { :id => id, :class => ['literalblock', role, ('fragment' if (option? :step) || (attr? 'step'))] }.merge(data_attrs(@attributes)))
|
|
2
2
|
- if title?
|
|
3
3
|
.title=title
|
|
4
4
|
.content: pre class=(!(@document.attr? :prewrap) || (option? 'nowrap') ? 'nowrap' : nil) =content
|
data/templates/olist.html.slim
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
= html_tag('div', { :id => @id, :class => ['olist', @style, role] }.merge(data_attrs(@attributes)))
|
|
2
2
|
- if title?
|
|
3
3
|
.title=title
|
|
4
4
|
ol class=@style start=(attr :start) type=list_marker_keyword
|
|
5
5
|
- items.each do |item|
|
|
6
|
-
li class=('fragment' if (option? :step)
|
|
6
|
+
li class=('fragment' if (option? :step) || (has_role? 'step') || (attr? 'step'))
|
|
7
7
|
p=item.text
|
|
8
8
|
- if item.blocks?
|
|
9
9
|
=item.content
|
data/templates/open.html.slim
CHANGED
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
- if @parent == @document && @document.doctype == 'book'
|
|
3
3
|
- puts 'asciidoctor: WARNING: abstract block cannot be used in a document without a title when doctype is book. Excluding block content.'
|
|
4
4
|
- else
|
|
5
|
-
|
|
5
|
+
= html_tag('div', { :id => @id, :class => ['quoteblock', 'abstract', role, ('fragment' if (option? :step) || (attr? 'step'))] }.merge(data_attrs(@attributes)))
|
|
6
6
|
- if title?
|
|
7
7
|
.title=title
|
|
8
8
|
blockquote=content
|
|
9
9
|
- elsif @style == 'partintro' && (@level != 0 || @parent.context != :section || @document.doctype != 'book')
|
|
10
|
-
- puts 'asciidoctor: ERROR: partintro block can only be used when doctype is book and it\'s a child of a book part. Excluding block content.'
|
|
10
|
+
- puts 'asciidoctor: ERROR: partintro block can only be used when doctype is book and it\'s a child of a book part. Excluding block content.'
|
|
11
11
|
- else
|
|
12
12
|
- if (has_role? 'aside') or (has_role? 'speaker') or (has_role? 'notes')
|
|
13
13
|
include notes.html.slim
|
|
14
14
|
- else
|
|
15
|
-
|
|
15
|
+
= html_tag('div', { :id => @id, :class => ['openblock', (@style != 'open' ? @style : nil), role, ('fragment' if (option? :step) || (attr? 'step'))] }.merge(data_attrs(@attributes)))
|
|
16
16
|
- if title?
|
|
17
17
|
.title=title
|
|
18
18
|
.content=content
|
data/templates/quote.html.slim
CHANGED
data/templates/section.html.slim
CHANGED
|
@@ -30,11 +30,22 @@
|
|
|
30
30
|
- if attr? 'background-image'
|
|
31
31
|
- data_background_image = image_uri(attr 'background-image')
|
|
32
32
|
|
|
33
|
+
- if attr? 'background-video'
|
|
34
|
+
- data_background_video = media_uri(attr 'background-video')
|
|
35
|
+
|
|
33
36
|
- if attr? 'background-color'
|
|
34
37
|
- data_background_color = attr 'background-color'
|
|
35
38
|
|
|
36
39
|
- parent_section_with_vertical_slides = @level == 1 && !vertical_slides.empty?
|
|
37
40
|
|
|
41
|
+
- content_for :footnotes
|
|
42
|
+
- slide_footnotes = slide_footnotes(self)
|
|
43
|
+
- if document.footnotes? && !(parent.attr? 'nofootnotes') && !slide_footnotes.empty?
|
|
44
|
+
.footnotes
|
|
45
|
+
- slide_footnotes.each do |footnote|
|
|
46
|
+
.footnote
|
|
47
|
+
= "#{footnote.index}. #{footnote.text}"
|
|
48
|
+
|
|
38
49
|
- content_for :section
|
|
39
50
|
section(id=(titleless ? nil : id)
|
|
40
51
|
class=roles
|
|
@@ -47,10 +58,11 @@
|
|
|
47
58
|
data-background-transition=(data_background_transition || attr('background-transition'))
|
|
48
59
|
data-background-position=(data_background_position || attr('background-position'))
|
|
49
60
|
data-background-iframe=(attr "background-iframe")
|
|
50
|
-
data-background-video=
|
|
61
|
+
data-background-video=data_background_video
|
|
51
62
|
data-background-video-loop=((attr? 'background-video-loop') || (option? 'loop'))
|
|
52
63
|
data-background-video-muted=((attr? 'background-video-muted') || (option? 'muted'))
|
|
53
64
|
data-background-opacity=(attr "background-opacity")
|
|
65
|
+
data-autoslide=(attr "autoslide")
|
|
54
66
|
data-state=(attr 'state'))
|
|
55
67
|
- unless hide_title
|
|
56
68
|
h2=section_title
|
|
@@ -59,10 +71,15 @@
|
|
|
59
71
|
div.slide-content
|
|
60
72
|
- _blocks.each do |block|
|
|
61
73
|
=block.convert
|
|
74
|
+
- yield_content :footnotes
|
|
75
|
+
|
|
62
76
|
- else
|
|
63
77
|
- unless (_content = content.chomp).empty?
|
|
64
78
|
div.slide-content
|
|
65
79
|
=_content
|
|
80
|
+
- yield_content :footnotes
|
|
81
|
+
|
|
82
|
+
- clear_slide_footnotes
|
|
66
83
|
|
|
67
84
|
/ RENDERING
|
|
68
85
|
/ render parent section of vertical slides set
|
data/templates/sidebar.html.slim
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
- if (has_role? 'aside') or (has_role? 'speaker') or (has_role? 'notes')
|
|
2
2
|
include notes.html.slim
|
|
3
3
|
- else
|
|
4
|
-
|
|
4
|
+
= html_tag('div', { :id => @id, :class => ['sidebarblock', role, ('fragment' if (option? :step) || (has_role? 'step') || (attr? 'step'))] }.merge(data_attrs(@attributes)))
|
|
5
5
|
.content
|
|
6
6
|
- if title?
|
|
7
7
|
.title=title
|
data/templates/stem.html.slim
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
- equation = sub_specialcharacters equation
|
|
5
5
|
- unless (equation.start_with? open) && (equation.end_with? close)
|
|
6
6
|
- equation = %(#{open}#{equation}#{close})
|
|
7
|
-
|
|
7
|
+
= html_tag('div', { :id => @id, :class => ['stemblock', role, ('fragment' if (option? :step) || (has_role? 'step') || (attr? 'step'))] }.merge(data_attrs(@attributes)))
|
|
8
8
|
- if title?
|
|
9
9
|
.title=title
|
|
10
10
|
.content=equation
|
data/templates/table.html.slim
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
- classes = ['tableblock', "frame-#{attr :frame, 'all'}", "grid-#{attr :grid, 'all'}", role, ('fragment' if (option? :step) || (attr? 'step'))]
|
|
2
|
+
- styles = [("width:#{attr :tablepcwidth}%" unless option? 'autowidth'), ("float:#{attr :float}" if attr? :float)].compact.join('; ')
|
|
3
|
+
= html_tag('table', { :id => @id, :class => classes, :style => styles }.merge(data_attrs(@attributes)))
|
|
3
4
|
- if title?
|
|
4
5
|
caption.title=captioned_title
|
|
5
6
|
- unless (attr :rowcount).zero?
|
data/templates/ulist.html.slim
CHANGED
|
@@ -6,16 +6,16 @@
|
|
|
6
6
|
- if @document.attr? :icons, 'font'
|
|
7
7
|
- marker_checked = '<i class="icon-check"></i>'
|
|
8
8
|
- marker_unchecked = '<i class="icon-check-empty"></i>'
|
|
9
|
-
- else
|
|
9
|
+
- else
|
|
10
10
|
/ could use ☑ (checked ballot) and ☐ (ballot) w/o font instead
|
|
11
11
|
- marker_checked = '<input type="checkbox" data-item-complete="1" checked disabled>'
|
|
12
12
|
- marker_unchecked = '<input type="checkbox" data-item-complete="0" disabled>'
|
|
13
|
-
|
|
13
|
+
= html_tag('div', { :id => @id, :class => ['ulist', checklist, @style, role] }.merge(data_attrs(@attributes)))
|
|
14
14
|
- if title?
|
|
15
15
|
.title=title
|
|
16
16
|
ul class=(checklist || @style)
|
|
17
17
|
- items.each do |item|
|
|
18
|
-
li class=('fragment' if (option? :step) || (has_role? 'step'))
|
|
18
|
+
li class=('fragment' if (option? :step) || (has_role? 'step') || (attr? 'step'))
|
|
19
19
|
p
|
|
20
20
|
- if checklist && (item.attr? :checkbox)
|
|
21
21
|
=%(#{(item.attr? :checked) ? marker_checked : marker_unchecked}#{item.text})
|