- slides_content = self.content - content_for :slides - unless noheader - unless (header_docinfo = docinfo :header, '-revealjs.html').empty? = header_docinfo - if header? include title_slide.html.slim = slides_content - unless (footer_docinfo = docinfo :footer, '-revealjs.html').empty? = footer_docinfo doctype 5 html lang=(attr :lang, 'en' unless attr? :nolang) head meta charset="utf-8" meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui" title=(doctitle sanitize: true, use_fallback: true) - if RUBY_ENGINE == 'opal' && JAVASCRIPT_PLATFORM == 'node' - revealjsdir = (attr :revealjsdir, 'node_modules/reveal.js') - else - revealjsdir = (attr :revealjsdir, 'reveal.js') - unless (asset_uri_scheme = (attr 'asset-uri-scheme', 'https')).empty? - asset_uri_scheme = %(#{asset_uri_scheme}:) - cdn_base = %(#{asset_uri_scheme}//cdnjs.cloudflare.com/ajax/libs) - [:description, :keywords, :author, :copyright].each do |key| - if attr? key meta name=key content=(attr key) - if attr? 'favicon' - if (icon_href = attr 'favicon').empty? - icon_href = 'favicon.ico' - icon_type = 'image/x-icon' - elsif (icon_ext = File.extname icon_href) - icon_type = icon_ext == '.ico' ? 'image/x-icon' : %(image/#{icon_ext.slice 1, icon_ext.length}) - else - icon_type = 'image/x-icon' link rel="icon" type="#{icon_type}" href="#{icon_href}" - linkcss = (attr? 'linkcss') link rel="stylesheet" href="#{revealjsdir}/dist/reset.css" link rel="stylesheet" href="#{revealjsdir}/dist/reveal.css" / Default theme required even when using custom theme link rel='stylesheet' href=(attr :revealjs_customtheme, %(#{revealjsdir}/dist/theme/#{attr 'revealjs_theme', 'black'}.css)) id='theme' /! This CSS is generated by the Asciidoctor reveal.js converter to further integrate AsciiDoc's existing semantic with reveal.js style type="text/css" include asciidoctor-compatibility.css - if attr? :icons, 'font' / iconfont-remote is implicitly set by Asciidoctor core. See https://github.com/asciidoctor/asciidoctor.org/issues/361 - if attr? 'iconfont-remote' - if (iconfont_cdn = (attr 'iconfont-cdn')) link rel='stylesheet' href=iconfont_cdn - else / default icon font is Font Awesome - font_awesome_version = (attr 'font-awesome-version', '5.15.1') link rel='stylesheet' href=%(#{cdn_base}/font-awesome/#{font_awesome_version}/css/all.min.css) link rel='stylesheet' href=%(#{cdn_base}/font-awesome/#{font_awesome_version}/css/v4-shims.min.css) - else link rel='stylesheet' href=(normalize_web_path %(#{attr 'iconfont-name', 'font-awesome'}.css), (attr 'stylesdir', ''), false) = generate_stem(cdn_base) - syntax_hl = self.syntax_highlighter - if syntax_hl && (syntax_hl.docinfo? :head) =syntax_hl.docinfo :head, self, cdn_base_url: cdn_base, linkcss: linkcss, self_closing_tag_slash: '/' - if attr? :customcss link rel='stylesheet' href=((customcss = attr :customcss).empty? ? 'asciidoctor-revealjs.css' : customcss) - unless (_docinfo = docinfo :head, '-revealjs.html').empty? =_docinfo body .reveal / Any section element inside of this container is displayed as a slide .slides - yield_content :slides script src="#{revealjsdir}/dist/reveal.js" / Supports easy AsciiDoc syntax for background color javascript: Array.prototype.slice.call(document.querySelectorAll('.slides section')).forEach(function(slide) { if (slide.getAttribute('data-background-color')) return; // user needs to explicitly say he wants CSS color to override otherwise we might break custom css or theme (#226) if (!(slide.classList.contains('canvas') || slide.classList.contains('background'))) return; var bgColor = getComputedStyle(slide).backgroundColor; if (bgColor !== 'rgba(0, 0, 0, 0)' && bgColor !== 'transparent') { slide.setAttribute('data-background-color', bgColor); slide.style.backgroundColor = 'transparent'; } }); // More info about config & dependencies: // - https://github.com/hakimel/reveal.js#configuration // - https://github.com/hakimel/reveal.js#dependencies Reveal.initialize({ // Display presentation control arrows controls: #{to_boolean(attr 'revealjs_controls', true)}, // Help the user learn the controls by providing hints, for example by // bouncing the down arrow when they first encounter a vertical slide controlsTutorial: #{to_boolean(attr 'revealjs_controlstutorial', true)}, // Determines where controls appear, "edges" or "bottom-right" controlsLayout: '#{attr 'revealjs_controlslayout', 'bottom-right'}', // Visibility rule for backwards navigation arrows; "faded", "hidden" // or "visible" controlsBackArrows: '#{attr 'revealjs_controlsbackarrows', 'faded'}', // Display a presentation progress bar progress: #{to_boolean(attr 'revealjs_progress', true)}, // Display the page number of the current slide slideNumber: #{to_valid_slidenumber(attr 'revealjs_slidenumber', false)}, // Control which views the slide number displays on showSlideNumber: '#{attr 'revealjs_showslidenumber', 'all'}', // Add the current slide number to the URL hash so that reloading the // page/copying the URL will return you to the same slide hash: #{to_boolean(attr 'revealjs_hash', false)}, // Push each slide change to the browser history. Implies `hash: true` history: #{to_boolean(attr 'revealjs_history', false)}, // Enable keyboard shortcuts for navigation keyboard: #{to_boolean(attr 'revealjs_keyboard', true)}, // Enable the slide overview mode overview: #{to_boolean(attr 'revealjs_overview', true)}, // Disables the default reveal.js slide layout so that you can use custom CSS layout disableLayout: #{to_boolean(attr 'revealjs_disablelayout', false)}, // Vertical centering of slides center: #{to_boolean(attr 'revealjs_center', true)}, // Enables touch navigation on devices with touch input touch: #{to_boolean(attr 'revealjs_touch', true)}, // Loop the presentation loop: #{to_boolean(attr 'revealjs_loop', false)}, // Change the presentation direction to be RTL rtl: #{to_boolean(attr 'revealjs_rtl', false)}, // See https://github.com/hakimel/reveal.js/#navigation-mode navigationMode: '#{attr 'revealjs_navigationmode', 'default'}', // Randomizes the order of slides each time the presentation loads shuffle: #{to_boolean(attr 'revealjs_shuffle', false)}, // Turns fragments on and off globally fragments: #{to_boolean(attr 'revealjs_fragments', true)}, // Flags whether to include the current fragment in the URL, // so that reloading brings you to the same fragment position fragmentInURL: #{to_boolean(attr 'revealjs_fragmentinurl', false)}, // Flags if the presentation is running in an embedded mode, // i.e. contained within a limited portion of the screen embedded: #{to_boolean(attr 'revealjs_embedded', false)}, // Flags if we should show a help overlay when the questionmark // key is pressed help: #{to_boolean(attr 'revealjs_help', true)}, // Flags if speaker notes should be visible to all viewers showNotes: #{to_boolean(attr 'revealjs_shownotes', false)}, // Global override for autolaying embedded media (video/audio/iframe) // - null: Media will only autoplay if data-autoplay is present // - true: All media will autoplay, regardless of individual setting // - false: No media will autoplay, regardless of individual setting autoPlayMedia: #{attr 'revealjs_autoplaymedia', 'null'}, // Global override for preloading lazy-loaded iframes // - null: Iframes with data-src AND data-preload will be loaded when within // the viewDistance, iframes with only data-src will be loaded when visible // - true: All iframes with data-src will be loaded when within the viewDistance // - false: All iframes with data-src will be loaded only when visible preloadIframes: #{attr 'revealjs_preloadiframes', 'null'}, // Number of milliseconds between automatically proceeding to the // next slide, disabled when set to 0, this value can be overwritten // by using a data-autoslide attribute on your slides autoSlide: #{attr 'revealjs_autoslide', 0}, // Stop auto-sliding after user input autoSlideStoppable: #{to_boolean(attr 'revealjs_autoslidestoppable', true)}, // Use this method for navigation when auto-sliding autoSlideMethod: #{attr 'revealjs_autoslidemethod', 'Reveal.navigateNext'}, // Specify the average time in seconds that you think you will spend // presenting each slide. This is used to show a pacing timer in the // speaker view defaultTiming: #{attr 'revealjs_defaulttiming', 120}, // Specify the total time in seconds that is available to // present. If this is set to a nonzero value, the pacing // timer will work out the time available for each slide, // instead of using the defaultTiming value totalTime: #{attr 'revealjs_totaltime', 0}, // Specify the minimum amount of time you want to allot to // each slide, if using the totalTime calculation method. If // the automated time allocation causes slide pacing to fall // below this threshold, then you will see an alert in the // speaker notes window minimumTimePerSlide: #{attr 'revealjs_minimumtimeperslide', 0}, // Enable slide navigation via mouse wheel mouseWheel: #{to_boolean(attr 'revealjs_mousewheel', false)}, // Hide cursor if inactive hideInactiveCursor: #{to_boolean(attr 'revealjs_hideinactivecursor', true)}, // Time before the cursor is hidden (in ms) hideCursorTime: #{attr 'revealjs_hidecursortime', 5000}, // Hides the address bar on mobile devices hideAddressBar: #{to_boolean(attr 'revealjs_hideaddressbar', true)}, // Opens links in an iframe preview overlay // Add `data-preview-link` and `data-preview-link="false"` to customise each link // individually previewLinks: #{to_boolean(attr 'revealjs_previewlinks', false)}, // Transition style (e.g., none, fade, slide, convex, concave, zoom) transition: '#{attr 'revealjs_transition', 'slide'}', // Transition speed (e.g., default, fast, slow) transitionSpeed: '#{attr 'revealjs_transitionspeed', 'default'}', // Transition style for full page slide backgrounds (e.g., none, fade, slide, convex, concave, zoom) backgroundTransition: '#{attr 'revealjs_backgroundtransition', 'fade'}', // Number of slides away from the current that are visible viewDistance: #{attr 'revealjs_viewdistance', 3}, // Number of slides away from the current that are visible on mobile // devices. It is advisable to set this to a lower number than // viewDistance in order to save resources. mobileViewDistance: #{attr 'revealjs_mobileviewdistance', 3}, // Parallax background image (e.g., "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'") parallaxBackgroundImage: '#{attr 'revealjs_parallaxbackgroundimage', ''}', // Parallax background size in CSS syntax (e.g., "2100px 900px") parallaxBackgroundSize: '#{attr 'revealjs_parallaxbackgroundsize', ''}', // Number of pixels to move the parallax background per slide // - Calculated automatically unless specified // - Set to 0 to disable movement along an axis parallaxBackgroundHorizontal: #{attr 'revealjs_parallaxbackgroundhorizontal', 'null'}, parallaxBackgroundVertical: #{attr 'revealjs_parallaxbackgroundvertical', 'null'}, // The display mode that will be used to show slides display: '#{attr 'revealjs_display', 'block'}', // The "normal" size of the presentation, aspect ratio will be preserved // when the presentation is scaled to fit different resolutions. Can be // specified using percentage units. width: #{attr 'revealjs_width', 960}, height: #{attr 'revealjs_height', 700}, // Factor of the display size that should remain empty around the content margin: #{attr 'revealjs_margin', 0.1}, // Bounds for smallest/largest possible scale to apply to content minScale: #{attr 'revealjs_minscale', 0.2}, maxScale: #{attr 'revealjs_maxscale', 1.5}, // PDF Export Options // Put each fragment on a separate page pdfSeparateFragments: #{to_boolean(attr 'revealjs_pdfseparatefragments', true)}, // For slides that do not fit on a page, max number of pages pdfMaxPagesPerSlide: #{attr 'revealjs_pdfmaxpagesperslide', 1}, // Optional libraries used to extend on reveal.js dependencies: [ #{revealjs_dependencies(document, self, revealjsdir)} ], }); / Workaround the "Only direct descendants of a slide section can be stretched" limitation in reveal.js / https://github.com/hakimel/reveal.js/issues/2584 include stretch_nested_elements.js.slim - if syntax_hl && (syntax_hl.docinfo? :footer) =syntax_hl.docinfo :footer, self, cdn_base_url: cdn_base, linkcss: linkcss, self_closing_tag_slash: '/' - unless (docinfo_content = (docinfo :footer, '.html')).empty? =docinfo_content