/
githubmirror
/
impress.js
Обзор
Документация
Войти
/
githubmirror
/
impress.js
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/plugins/extras/extras.js
116 строк
3 KB
thawk
Improve markdown support. (#817)
19 авг 2022, 11:57
Не верифицирован
19 авг 2022, 11:57
f8dd0e9
Код
Авторство
О чём код?
/** * Extras Plugin * * This plugin performs initialization (like calling mermaid.initialize()) * for the extras/ plugins if they are loaded into a presentation. * * See README.md for details. * * Copyright 2016 Henrik Ingo (@henrikingo) * Released under the MIT license. */ /* global markdown, marked, hljs, mermaid, impress */ ( function( document, window ) { "use strict"; const SLIDE_SEPARATOR = /^-----$/m; const getMarkdownParser = function( ) { if ( window.hasOwnProperty( "marked" ) ) { // Using marked return function( elem, src ) { return marked.parse( src ); }; } else if ( window.hasOwnProperty( "markdown" ) ) { // Using builtin markdown engine return function( elem, src ) { var dialect = elem.dataset.markdownDialect; return markdown.toHTML( src, dialect ); }; } return null; }; const getMarkdownSlides = function( elem ) { var text = elem.textContent; // Using first not blank line to detect leading whitespaces. // can't properly handle the mixing of space and tabs var m = text.match( /^([ \t]*)\S/m ); if ( m !== null ) { text = text.replace( new RegExp( "^" + m[ 1 ], "mg" ), "" ); } return text.split( SLIDE_SEPARATOR ); }; const convertMarkdowns = function( selector ) { // Detect markdown engine var parseMarkdown = getMarkdownParser(); if ( !parseMarkdown ) { return; } for ( var elem of document.querySelectorAll( selector ) ) { var id = null; if ( elem.id ) { id = elem.id; elem.id = ""; } var origTitle = null; if ( elem.title ) { origTitle = elem.title; elem.title = ""; } var slides = getMarkdownSlides( elem ); var slideElems = [ elem ]; for ( var j = 1; j < slides.length; ++j ) { var newElem = elem.cloneNode( false ); newElem.id = ""; elem.parentNode.insertBefore( newElem, slideElems[ 0 ] ); slideElems.splice( 0, 0, newElem ); } if ( id ) { slideElems[ 0 ].id = id; } for ( var i = 0; i < slides.length; ++i ) { slideElems[ i ].innerHTML = parseMarkdown( slideElems[ i ], slides[ i ] ); if ( origTitle && ( i === 0 ) ) { slideElems[ i ].title = origTitle; } } } }; var preInit = function() { // Query all .markdown elements and translate to HTML convertMarkdowns( ".markdown" ); if ( window.hljs ) { hljs.initHighlightingOnLoad(); } if ( window.mermaid ) { mermaid.initialize( { startOnLoad:true } ); } }; // Register the plugin to be called in pre-init phase // Note: Markdown.js should run early/first, because it creates new div elements. // So add this with a lower-than-default weight. impress.addPreInitPlugin( preInit, 1 ); } )( document, window );