123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- /*
- global RevealMarkdown, RevealHighlight, RevealSearch, RevealNotes, RevealMath, RevealZoom, Reveal, mermaid, RevealMenu
- */
- import * as params from '@params';
- import {fixMermaid} from './wowchemy-utils';
- // Enable core slide features.
- var enabledPlugins = [RevealMarkdown, RevealHighlight, RevealSearch, RevealNotes, RevealMath.MathJax3, RevealZoom];
- const isObject = function (o) {
- return o === Object(o) && !isArray(o) && typeof o !== 'function';
- };
- const isArray = function (a) {
- return Array.isArray(a);
- };
- const toCamelCase = function (s) {
- return s.replace(/([-_][a-z])/gi, function (term) {
- return term.toUpperCase().replace('-', '').replace('_', '');
- });
- };
- const keysToCamelCase = function (o) {
- if (isObject(o)) {
- const n = {};
- Object.keys(o).forEach(function (k) {
- n[toCamelCase(k)] = keysToCamelCase(o[k]);
- });
- return n;
- } else if (isArray(o)) {
- return o.map(function (i) {
- return keysToCamelCase(i);
- });
- }
- return o;
- };
- // reveal configurations can be included in front matter under slides.reveal
- var pluginOptions = {};
- if (typeof params.slides.reveal_options !== 'undefined') {
- pluginOptions = params.slides.reveal_options;
- }
- pluginOptions = keysToCamelCase(pluginOptions);
- //enable menu by default if not set
- if (typeof pluginOptions.menu_enabled === 'undefined') {
- pluginOptions.menu_enabled = true;
- }
- // configure menu if enabled
- if (pluginOptions.menu_enabled) {
- enabledPlugins.push(RevealMenu);
- }
- pluginOptions['plugins'] = enabledPlugins;
- Reveal.initialize(pluginOptions);
- // The following functions are used to render Mermaid diagrams
- // after Reveal slides have been successfully loaded
- // since content of slides is lazy loaded, if diagrams are
- // rendered at start of presentation their sizes will be off
- // get all slides that are:
- // 1- data loaded
- // 2- display set to block
- // 3- has a mermaid element that is not processed (data-processed dne)
- function mermaidSlidesReadyToRender(mslide) {
- var diag = mslide.querySelector('.mermaid');
- if (diag) {
- var background = mslide.slideBackgroundElement;
- // render if we are 1 slide away horizontally
- // current visible slide index
- var currentHorizontalIndex = Reveal.getState()['indexh'];
- // mermaid slide index
- var diagramSlideIndex = Reveal.getIndices(mslide)['h'];
- if (
- // find slides with non-rendered mermaid tags
- // these will not have the attribute data-processed
- !diag.hasAttribute('data-processed') &&
- // check also that reveal slide is already loaded
- // reveal slides seem to be lazily loaded
- // things could be easier if reveal had a slide-loaded event
- background.hasAttribute('data-loaded') &&
- // loaded slides must also have the display attribute set to block
- background.style.display === 'block' &&
- // render diagrams that are 1 slide away
- diagramSlideIndex - currentHorizontalIndex <= 1
- )
- return mslide;
- }
- return null;
- }
- function renderMermaidSlides() {
- // find all slides with diagrams that are ready to render
- var diagramSlides = Reveal.getSlides().filter(mermaidSlidesReadyToRender);
- // render the diagram for each slide with ready to render diagrams
- diagramSlides.forEach(function (item) {
- mermaid.init(item.querySelector('.mermaid'));
- });
- }
- // render mermaid slides for slides that are ready
- Reveal.on('slidechanged', function () {
- renderMermaidSlides();
- });
- // render mermaid slides for slides that are ready on startup
- Reveal.on('Ready', function () {
- if (Reveal.isReady()) {
- renderMermaidSlides();
- }
- });
- // Disable Mermaid by default.
- if (typeof params.slides.diagram === 'undefined') {
- params.slides.diagram = false;
- }
- // Configure Mermaid only if diagrams are enabled.
- if (params.slides.diagram) {
- //mermaid options
- // mermaid: front matter configuration can be used to set mermaid options
- // You can also use directives (see mermaid documentation)
- var mermaidOptions = {};
- if (typeof params.slides.diagram_options !== 'undefined') {
- mermaidOptions = params.slides.diagram_options;
- }
- // `startOnLoad` must be false since diagrams are lazily rendered.
- mermaidOptions['startOnLoad'] = false;
- mermaid.initialize(mermaidOptions);
- // Fix Mermaid conflict with Hightlight JS.
- document.addEventListener('DOMContentLoaded', function () {
- fixMermaid(false);
- });
- }
|