asciidoctor-revealjs 3.1.0 → 4.0.0

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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.adoc +86 -0
  3. data/HACKING.adoc +18 -11
  4. data/README.adoc +260 -27
  5. data/Rakefile +12 -4
  6. data/asciidoctor-revealjs.gemspec +4 -2
  7. data/examples/docinfo-footer-revealjs.html +10 -0
  8. data/examples/docinfo-revealjs.html +7 -0
  9. data/examples/font-awesome.adoc +2 -1
  10. data/examples/font-awesome.css +3 -0
  11. data/examples/fragments.adoc +32 -0
  12. data/examples/fragments.css +18 -0
  13. data/examples/grid-layout-docinfo-revealjs.html +11 -0
  14. data/examples/grid-layout.adoc +174 -0
  15. data/examples/history-hash.adoc +19 -0
  16. data/examples/history-regression-tests.adoc +0 -5
  17. data/examples/history.adoc +4 -4
  18. data/examples/images/asciidoctor-logo.svg +102 -0
  19. data/examples/level-sectnums.adoc +24 -0
  20. data/examples/links-preview.adoc +32 -0
  21. data/examples/links.adoc +39 -0
  22. data/examples/release-4.0.adoc +195 -0
  23. data/examples/release-4.0.css +23 -0
  24. data/examples/source-coderay.adoc +15 -0
  25. data/examples/source-emphasis.adoc +128 -0
  26. data/examples/source-highlightjs-html.adoc +1 -1
  27. data/examples/source-highlightjs-languages.adoc +27 -0
  28. data/examples/source-highlightjs.adoc +85 -2
  29. data/examples/source-pygments.adoc +12 -0
  30. data/examples/source-rouge-docinfo.html +8 -0
  31. data/examples/source-rouge.adoc +18 -0
  32. data/examples/video.adoc +12 -3
  33. data/examples/with-docinfo-shared.adoc +13 -0
  34. data/lib/asciidoctor-revealjs/converter.rb +312 -136
  35. data/lib/asciidoctor-revealjs/highlightjs.rb +333 -2
  36. data/lib/asciidoctor-revealjs/version.rb +1 -1
  37. data/templates/asciidoctor-compatibility.css +141 -0
  38. data/templates/document.html.slim +64 -53
  39. data/templates/helpers.rb +93 -1
  40. data/templates/image.html.slim +1 -1
  41. data/templates/inline_anchor.html.slim +2 -1
  42. data/templates/inline_image.html.slim +3 -3
  43. data/templates/listing.html.slim +1 -1
  44. data/templates/section.html.slim +34 -43
  45. data/templates/stretch_nested_elements.js.slim +65 -0
  46. data/templates/title_slide.html.slim +28 -0
  47. metadata +55 -8
  48. data/examples/revealjs-features.adoc +0 -23
  49. data/templates/asciidoctor_revealjs.css.slim +0 -59
@@ -6,15 +6,34 @@ module Asciidoctor
6
6
  class HighlightJsAdapter < Asciidoctor::SyntaxHighlighter::Base
7
7
  register_for 'highlightjs', 'highlight.js'
8
8
 
9
+ HIGHLIGHT_JS_VERSION = '9.18.1'
10
+
9
11
  def initialize *args
10
12
  super
11
13
  @name = @pre_class = 'highlightjs'
12
14
  end
13
15
 
16
+ # Convert between highlight notation formats
17
+ # In addition to Asciidoctor's linenum converter leveraging core's resolve_lines_to_highlight,
18
+ # we also support reveal.js step-by-step highlights.
19
+ # The steps are split using the | character
20
+ # For example, this method makes "1..3|6,7" into "1,2,3|6,7"
21
+ def _convert_highlight_to_revealjs node
22
+ return node.attributes["highlight"].split("|").collect { |linenums|
23
+ node.resolve_lines_to_highlight(node.content, linenums).join(",")
24
+ }.join("|")
25
+ end
26
+
14
27
  def format node, lang, opts
15
28
  super node, lang, (opts.merge transform: proc { |_, code|
16
29
  code['class'] = %(language-#{lang || 'none'} hljs)
17
30
  code['data-noescape'] = true
31
+
32
+ if node.attributes.key?("highlight")
33
+ code['data-line-numbers'] = self._convert_highlight_to_revealjs(node)
34
+ elsif node.attributes.key?("linenums")
35
+ code['data-line-numbers'] = ''
36
+ end
18
37
  })
19
38
  end
20
39
 
@@ -31,10 +50,322 @@ module Asciidoctor
31
50
  if doc.attr? 'highlightjs-theme'
32
51
  theme_href = doc.attr 'highlightjs-theme'
33
52
  else
34
- theme_href = "#{revealjsdir}/lib/css/zenburn.css"
53
+ theme_href = "#{revealjsdir}/lib/css/monokai.css"
35
54
  end
36
- %(<link rel="stylesheet" href="#{theme_href}"#{opts[:self_closing_tag_slash]}>)
55
+ base_url = doc.attr 'highlightjsdir', %(#{opts[:cdn_base_url]}/highlight.js/#{HIGHLIGHT_JS_VERSION})
56
+ %(<link rel="stylesheet" href="#{theme_href}"#{opts[:self_closing_tag_slash]}>
57
+ <script src="#{base_url}/highlight.min.js"></script>
58
+ #{(doc.attr? 'highlightjs-languages') ? ((doc.attr 'highlightjs-languages').split ',').map {|lang| %[<script src="#{base_url}/languages/#{lang.lstrip}.min.js"></script>\n] }.join : ''}
59
+ <script>
60
+ #{HIGHLIGHT_PLUGIN_SOURCE}
61
+ hljs.initHighlightingOnLoad();
62
+ </script>)
37
63
  end
64
+
65
+ # this file was copied-pasted from https://raw.githubusercontent.com/hakimel/reveal.js/3.9.2/plugin/highlight/highlight.js
66
+ # please note that the bundled highlight.js code was removed so we can use the latest version from cdnjs.
67
+ HIGHLIGHT_PLUGIN_SOURCE = %q{
68
+ /* highlightjs-line-numbers.js 2.6.0 | (C) 2018 Yauheni Pakala | MIT License | github.com/wcoder/highlightjs-line-numbers.js */
69
+ /* Edited by Hakim for reveal.js; removed async timeout */
70
+ !function(n,e){"use strict";function t(){var n=e.createElement("style");n.type="text/css",n.innerHTML=g(".{0}{border-collapse:collapse}.{0} td{padding:0}.{1}:before{content:attr({2})}",[v,L,b]),e.getElementsByTagName("head")[0].appendChild(n)}function r(t){"interactive"===e.readyState||"complete"===e.readyState?i(t):n.addEventListener("DOMContentLoaded",function(){i(t)})}function i(t){try{var r=e.querySelectorAll("code.hljs,code.nohighlight");for(var i in r)r.hasOwnProperty(i)&&l(r[i],t)}catch(o){n.console.error("LineNumbers error: ",o)}}function l(n,e){"object"==typeof n&&f(function(){n.innerHTML=s(n,e)})}function o(n,e){if("string"==typeof n){var t=document.createElement("code");return t.innerHTML=n,s(t,e)}}function s(n,e){e=e||{singleLine:!1};var t=e.singleLine?0:1;return c(n),a(n.innerHTML,t)}function a(n,e){var t=u(n);if(""===t[t.length-1].trim()&&t.pop(),t.length>e){for(var r="",i=0,l=t.length;i<l;i++)r+=g('<tr><td class="{0}"><div class="{1} {2}" {3}="{5}"></div></td><td class="{4}"><div class="{1}">{6}</div></td></tr>',[j,m,L,b,p,i+1,t[i].length>0?t[i]:" "]);return g('<table class="{0}">{1}</table>',[v,r])}return n}function c(n){var e=n.childNodes;for(var t in e)if(e.hasOwnProperty(t)){var r=e[t];h(r.textContent)>0&&(r.childNodes.length>0?c(r):d(r.parentNode))}}function d(n){var e=n.className;if(/hljs-/.test(e)){for(var t=u(n.innerHTML),r=0,i="";r<t.length;r++){var l=t[r].length>0?t[r]:" ";i+=g('<span class="{0}">{1}</span>\n',[e,l])}n.innerHTML=i.trim()}}function u(n){return 0===n.length?[]:n.split(y)}function h(n){return(n.trim().match(y)||[]).length}function f(e){e()}function g(n,e){return n.replace(/\{(\d+)\}/g,function(n,t){return e[t]?e[t]:n})}var v="hljs-ln",m="hljs-ln-line",p="hljs-ln-code",j="hljs-ln-numbers",L="hljs-ln-n",b="data-line-number",y=/\r\n|\r|\n/g;n.hljs?(n.hljs.initLineNumbersOnLoad=r,n.hljs.lineNumbersBlock=l,n.hljs.lineNumbersValue=o,t()):n.console.error("highlight.js not detected!")}(window,document);
71
+
72
+ /**
73
+ * This reveal.js plugin is wrapper around the highlight.js
74
+ * syntax highlighting library.
75
+ */
76
+ (function( root, factory ) {
77
+ if (typeof define === 'function' && define.amd) {
78
+ root.RevealHighlight = factory();
79
+ } else if( typeof exports === 'object' ) {
80
+ module.exports = factory();
81
+ } else {
82
+ // Browser globals (root is window)
83
+ root.RevealHighlight = factory();
84
+ }
85
+ }( this, function() {
86
+
87
+ // Function to perform a better "data-trim" on code snippets
88
+ // Will slice an indentation amount on each line of the snippet (amount based on the line having the lowest indentation length)
89
+ function betterTrim(snippetEl) {
90
+ // Helper functions
91
+ function trimLeft(val) {
92
+ // Adapted from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim#Polyfill
93
+ return val.replace(/^[\s\uFEFF\xA0]+/g, '');
94
+ }
95
+ function trimLineBreaks(input) {
96
+ var lines = input.split('\n');
97
+
98
+ // Trim line-breaks from the beginning
99
+ for (var i = 0; i < lines.length; i++) {
100
+ if (lines[i].trim() === '') {
101
+ lines.splice(i--, 1);
102
+ } else break;
103
+ }
104
+
105
+ // Trim line-breaks from the end
106
+ for (var i = lines.length-1; i >= 0; i--) {
107
+ if (lines[i].trim() === '') {
108
+ lines.splice(i, 1);
109
+ } else break;
110
+ }
111
+
112
+ return lines.join('\n');
113
+ }
114
+
115
+ // Main function for betterTrim()
116
+ return (function(snippetEl) {
117
+ var content = trimLineBreaks(snippetEl.innerHTML);
118
+ var lines = content.split('\n');
119
+ // Calculate the minimum amount to remove on each line start of the snippet (can be 0)
120
+ var pad = lines.reduce(function(acc, line) {
121
+ if (line.length > 0 && trimLeft(line).length > 0 && acc > line.length - trimLeft(line).length) {
122
+ return line.length - trimLeft(line).length;
123
+ }
124
+ return acc;
125
+ }, Number.POSITIVE_INFINITY);
126
+ // Slice each line with this amount
127
+ return lines.map(function(line, index) {
128
+ return line.slice(pad);
129
+ })
130
+ .join('\n');
131
+ })(snippetEl);
132
+ }
133
+
134
+ var RevealHighlight = {
135
+
136
+ HIGHLIGHT_STEP_DELIMITER: '|',
137
+ HIGHLIGHT_LINE_DELIMITER: ',',
138
+ HIGHLIGHT_LINE_RANGE_DELIMITER: '-',
139
+
140
+ init: function() {
141
+
142
+ // Read the plugin config options and provide fallbacks
143
+ var config = Reveal.getConfig().highlight || {};
144
+ config.highlightOnLoad = typeof config.highlightOnLoad === 'boolean' ? config.highlightOnLoad : true;
145
+ config.escapeHTML = typeof config.escapeHTML === 'boolean' ? config.escapeHTML : true;
146
+
147
+ [].slice.call( document.querySelectorAll( '.reveal pre code' ) ).forEach( function( block ) {
148
+
149
+ // Trim whitespace if the "data-trim" attribute is present
150
+ if( block.hasAttribute( 'data-trim' ) && typeof block.innerHTML.trim === 'function' ) {
151
+ block.innerHTML = betterTrim( block );
152
+ }
153
+
154
+ // Escape HTML tags unless the "data-noescape" attrbute is present
155
+ if( config.escapeHTML && !block.hasAttribute( 'data-noescape' )) {
156
+ block.innerHTML = block.innerHTML.replace( /</g,"&lt;").replace(/>/g, '&gt;' );
157
+ }
158
+
159
+ // Re-highlight when focus is lost (for contenteditable code)
160
+ block.addEventListener( 'focusout', function( event ) {
161
+ hljs.highlightBlock( event.currentTarget );
162
+ }, false );
163
+
164
+ if( config.highlightOnLoad ) {
165
+ RevealHighlight.highlightBlock( block );
166
+ }
167
+ } );
168
+
169
+ },
170
+
171
+ /**
172
+ * Highlights a code block. If the <code> node has the
173
+ * 'data-line-numbers' attribute we also generate slide
174
+ * numbers.
175
+ *
176
+ * If the block contains multiple line highlight steps,
177
+ * we clone the block and create a fragment for each step.
178
+ */
179
+ highlightBlock: function( block ) {
180
+
181
+ hljs.highlightBlock( block );
182
+
183
+ // Don't generate line numbers for empty code blocks
184
+ if( block.innerHTML.trim().length === 0 ) return;
185
+
186
+ if( block.hasAttribute( 'data-line-numbers' ) ) {
187
+ hljs.lineNumbersBlock( block, { singleLine: true } );
188
+
189
+ // If there is at least one highlight step, generate
190
+ // fragments
191
+ var highlightSteps = RevealHighlight.deserializeHighlightSteps( block.getAttribute( 'data-line-numbers' ) );
192
+ if( highlightSteps.length > 1 ) {
193
+
194
+ // If the original code block has a fragment-index,
195
+ // each clone should follow in an incremental sequence
196
+ var fragmentIndex = parseInt( block.getAttribute( 'data-fragment-index' ), 10 );
197
+ if( typeof fragmentIndex !== 'number' || isNaN( fragmentIndex ) ) {
198
+ fragmentIndex = null;
199
+ }
200
+
201
+ // Generate fragments for all steps except the original block
202
+ highlightSteps.slice(1).forEach( function( highlight ) {
203
+
204
+ var fragmentBlock = block.cloneNode( true );
205
+ fragmentBlock.setAttribute( 'data-line-numbers', RevealHighlight.serializeHighlightSteps( [ highlight ] ) );
206
+ fragmentBlock.classList.add( 'fragment' );
207
+ block.parentNode.appendChild( fragmentBlock );
208
+ RevealHighlight.highlightLines( fragmentBlock );
209
+
210
+ if( typeof fragmentIndex === 'number' ) {
211
+ fragmentBlock.setAttribute( 'data-fragment-index', fragmentIndex );
212
+ fragmentIndex += 1;
213
+ }
214
+ else {
215
+ fragmentBlock.removeAttribute( 'data-fragment-index' );
216
+ }
217
+
218
+ } );
219
+
220
+ block.removeAttribute( 'data-fragment-index' )
221
+ block.setAttribute( 'data-line-numbers', RevealHighlight.serializeHighlightSteps( [ highlightSteps[0] ] ) );
222
+
223
+ }
224
+
225
+ RevealHighlight.highlightLines( block );
226
+
227
+ }
228
+
229
+ },
230
+
231
+ /**
232
+ * Visually emphasize specific lines within a code block.
233
+ * This only works on blocks with line numbering turned on.
234
+ *
235
+ * @param {HTMLElement} block a <code> block
236
+ * @param {String} [linesToHighlight] The lines that should be
237
+ * highlighted in this format:
238
+ * "1" = highlights line 1
239
+ * "2,5" = highlights lines 2 & 5
240
+ * "2,5-7" = highlights lines 2, 5, 6 & 7
241
+ */
242
+ highlightLines: function( block, linesToHighlight ) {
243
+
244
+ var highlightSteps = RevealHighlight.deserializeHighlightSteps( linesToHighlight || block.getAttribute( 'data-line-numbers' ) );
245
+
246
+ if( highlightSteps.length ) {
247
+
248
+ highlightSteps[0].forEach( function( highlight ) {
249
+
250
+ var elementsToHighlight = [];
251
+
252
+ // Highlight a range
253
+ if( typeof highlight.end === 'number' ) {
254
+ elementsToHighlight = [].slice.call( block.querySelectorAll( 'table tr:nth-child(n+'+highlight.start+'):nth-child(-n+'+highlight.end+')' ) );
255
+ }
256
+ // Highlight a single line
257
+ else if( typeof highlight.start === 'number' ) {
258
+ elementsToHighlight = [].slice.call( block.querySelectorAll( 'table tr:nth-child('+highlight.start+')' ) );
259
+ }
260
+
261
+ if( elementsToHighlight.length ) {
262
+ elementsToHighlight.forEach( function( lineElement ) {
263
+ lineElement.classList.add( 'highlight-line' );
264
+ } );
265
+
266
+ block.classList.add( 'has-highlights' );
267
+ }
268
+
269
+ } );
270
+
271
+ }
272
+
273
+ },
274
+
275
+ /**
276
+ * Parses and formats a user-defined string of line
277
+ * numbers to highlight.
278
+ *
279
+ * @example
280
+ * RevealHighlight.deserializeHighlightSteps( '1,2|3,5-10' )
281
+ * // [
282
+ * // [ { start: 1 }, { start: 2 } ],
283
+ * // [ { start: 3 }, { start: 5, end: 10 } ]
284
+ * // ]
285
+ */
286
+ deserializeHighlightSteps: function( highlightSteps ) {
287
+
288
+ // Remove whitespace
289
+ highlightSteps = highlightSteps.replace( /\s/g, '' );
290
+
291
+ // Divide up our line number groups
292
+ highlightSteps = highlightSteps.split( RevealHighlight.HIGHLIGHT_STEP_DELIMITER );
293
+
294
+ return highlightSteps.map( function( highlights ) {
295
+
296
+ return highlights.split( RevealHighlight.HIGHLIGHT_LINE_DELIMITER ).map( function( highlight ) {
297
+
298
+ // Parse valid line numbers
299
+ if( /^[\d-]+$/.test( highlight ) ) {
300
+
301
+ highlight = highlight.split( RevealHighlight.HIGHLIGHT_LINE_RANGE_DELIMITER );
302
+
303
+ var lineStart = parseInt( highlight[0], 10 ),
304
+ lineEnd = parseInt( highlight[1], 10 );
305
+
306
+ if( isNaN( lineEnd ) ) {
307
+ return {
308
+ start: lineStart
309
+ };
310
+ }
311
+ else {
312
+ return {
313
+ start: lineStart,
314
+ end: lineEnd
315
+ };
316
+ }
317
+
318
+ }
319
+ // If no line numbers are provided, no code will be highlighted
320
+ else {
321
+
322
+ return {};
323
+
324
+ }
325
+
326
+ } );
327
+
328
+ } );
329
+
330
+ },
331
+
332
+ /**
333
+ * Serializes parsed line number data into a string so
334
+ * that we can store it in the DOM.
335
+ */
336
+ serializeHighlightSteps: function( highlightSteps ) {
337
+
338
+ return highlightSteps.map( function( highlights ) {
339
+
340
+ return highlights.map( function( highlight ) {
341
+
342
+ // Line range
343
+ if( typeof highlight.end === 'number' ) {
344
+ return highlight.start + RevealHighlight.HIGHLIGHT_LINE_RANGE_DELIMITER + highlight.end;
345
+ }
346
+ // Single line
347
+ else if( typeof highlight.start === 'number' ) {
348
+ return highlight.start;
349
+ }
350
+ // All lines
351
+ else {
352
+ return '';
353
+ }
354
+
355
+ } ).join( RevealHighlight.HIGHLIGHT_LINE_DELIMITER );
356
+
357
+ } ).join( RevealHighlight.HIGHLIGHT_STEP_DELIMITER );
358
+
359
+ }
360
+
361
+ }
362
+
363
+ Reveal.registerPlugin( 'highlight', RevealHighlight );
364
+
365
+ return RevealHighlight;
366
+
367
+ }));
368
+ }
38
369
  end
39
370
  end
40
371
  end
@@ -1,5 +1,5 @@
1
1
  module Asciidoctor
2
2
  module Revealjs
3
- VERSION = '3.1.0'
3
+ VERSION = '4.0.0'
4
4
  end
5
5
  end
@@ -0,0 +1,141 @@
1
+ .reveal div.right{float:right}
2
+
3
+ /* listing block */
4
+ .reveal .listingblock.stretch>.content{height: 100%}
5
+ .reveal .listingblock.stretch>.content>pre{height: 100%}
6
+ .reveal .listingblock.stretch>.content>pre>code{height:100%;max-height:100%}
7
+
8
+ /* tables */
9
+ table{border-collapse:collapse;border-spacing:0}
10
+ table{margin-bottom:1.25em;border:solid 1px #dedede}
11
+ table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;text-align:left}
12
+ table tr th,table tr td{padding:.5625em .625em;font-size:inherit}
13
+ table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
14
+ td.tableblock>.content{margin-bottom:1.25em}
15
+ td.tableblock>.content>:last-child{margin-bottom:-1.25em}
16
+ table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
17
+ table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0}
18
+ table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0}
19
+ table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0}
20
+ table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px}
21
+ table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0}
22
+ table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0}
23
+ table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0}
24
+ table.frame-all{border-width:1px}
25
+ table.frame-sides{border-width:0 1px}
26
+ table.frame-topbot,table.frame-ends{border-width:1px 0}
27
+ .reveal table th.halign-left,.reveal table td.halign-left{text-align:left}
28
+ .reveal table th.halign-right,.reveal table td.halign-right{text-align:right}
29
+ .reveal table th.halign-center,.reveal table td.halign-center{text-align:center}
30
+ .reveal table th.valign-top,.reveal table td.valign-top{vertical-align:top}
31
+ .reveal table th.valign-bottom,.reveal table td.valign-bottom{vertical-align:bottom}
32
+ .reveal table th.valign-middle,.reveal table td.valign-middle{vertical-align:middle}
33
+ table thead th,table tfoot th{font-weight:bold}
34
+ tbody tr th{display:table-cell;line-height:1.6}
35
+ tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{font-weight:bold}
36
+ thead{display:table-header-group}
37
+
38
+ .reveal table.grid-none th,.reveal table.grid-none td{border-bottom:0!important}
39
+
40
+ /* kbd macro */
41
+ kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
42
+ .keyseq kbd:first-child{margin-left:0}
43
+ .keyseq kbd:last-child{margin-right:0}
44
+
45
+ /* callouts */
46
+ .conum[data-value] {display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:50%;border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
47
+ .conum[data-value] *{color:#fff!important}
48
+ .conum[data-value]+b{display:none}
49
+ .conum[data-value]:after{content:attr(data-value)}
50
+ pre .conum[data-value]{position:relative;top:-.125em}
51
+ b.conum *{color:inherit!important}
52
+ .conum:not([data-value]):empty{display:none}
53
+ /* Callout list */
54
+ .hdlist>table,.colist>table{border:0;background:none}
55
+ .hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
56
+ td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
57
+ td.hdlist1{font-weight:bold;padding-bottom:1.25em}
58
+ /* Disabled from Asciidoctor CSS because it caused callout list to go under the
59
+ * source listing when .stretch is applied (see #335)
60
+ * .literalblock+.colist,.listingblock+.colist{margin-top:-.5em} */
61
+ .colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
62
+ .colist td:not([class]):first-child img{max-width:none}
63
+ .colist td:not([class]):last-child{padding:.25em 0}
64
+
65
+ /* Override Asciidoctor CSS that causes issues with reveal.js features */
66
+ .reveal .hljs table{border: 0}
67
+ /* Callout list rows would have a bottom border with some reveal.js themes (see #335) */
68
+ .reveal .colist>table th, .reveal .colist>table td {border-bottom:0}
69
+ /* Fixes line height with Highlight.js source listing when linenums enabled (see #331) */
70
+ .reveal .hljs table thead tr th, .reveal .hljs table tfoot tr th, .reveal .hljs table tbody tr td, .reveal .hljs table tr td, .reveal .hljs table tfoot tr td{line-height:inherit}
71
+
72
+ /* Columns layout */
73
+ .columns .slide-content {
74
+ display: flex;
75
+ }
76
+
77
+ .columns.wrap .slide-content {
78
+ flex-wrap: wrap;
79
+ }
80
+
81
+ .columns.is-vcentered .slide-content {
82
+ align-items: center;
83
+ }
84
+
85
+ .columns .slide-content > .column {
86
+ display: block;
87
+ flex-basis: 0;
88
+ flex-grow: 1;
89
+ flex-shrink: 1;
90
+ padding: .75rem;
91
+ }
92
+
93
+ .columns .slide-content > .column.is-full {
94
+ flex: none;
95
+ width: 100%;
96
+ }
97
+
98
+ .columns .slide-content > .column.is-four-fifths {
99
+ flex: none;
100
+ width: 80%;
101
+ }
102
+
103
+ .columns .slide-content > .column.is-three-quarters {
104
+ flex: none;
105
+ width: 75%;
106
+ }
107
+
108
+ .columns .slide-content > .column.is-two-thirds {
109
+ flex: none;
110
+ width: 66.6666%;
111
+ }
112
+
113
+ .columns .slide-content > .column.is-three-fifths {
114
+ flex: none;
115
+ width: 60%;
116
+ }
117
+
118
+ .columns .slide-content > .column.is-half {
119
+ flex: none;
120
+ width: 50%;
121
+ }
122
+
123
+ .columns .slide-content > .column.is-two-fifths {
124
+ flex: none;
125
+ width: 40%;
126
+ }
127
+
128
+ .columns .slide-content > .column.is-one-third {
129
+ flex: none;
130
+ width: 33.3333%;
131
+ }
132
+
133
+ .columns .slide-content > .column.is-one-quarter {
134
+ flex: none;
135
+ width: 25%;
136
+ }
137
+
138
+ .columns .slide-content > .column.is-one-fifth {
139
+ flex: none;
140
+ width: 20%;
141
+ }