update markdown plugin formatting to match reveal.js core
This commit is contained in:
		| @@ -2,219 +2,230 @@ | |||||||
| // Modified by Hakim to handle Markdown indented with tabs | // Modified by Hakim to handle Markdown indented with tabs | ||||||
| (function(){ | (function(){ | ||||||
|  |  | ||||||
|     if( typeof marked === 'undefined' ) { | 	if( typeof marked === 'undefined' ) { | ||||||
|         throw 'The reveal.js Markdown plugin requires marked to be loaded'; | 		throw 'The reveal.js Markdown plugin requires marked to be loaded'; | ||||||
|     } | 	} | ||||||
|  |  | ||||||
|     if (typeof hljs !== 'undefined') { | 	if( typeof hljs !== 'undefined' ) { | ||||||
|         marked.setOptions({ | 		marked.setOptions({ | ||||||
|             highlight: function (lang, code) { | 			highlight: function( lang, code ) { | ||||||
|                 return hljs.highlightAuto(lang, code).value; | 				return hljs.highlightAuto( lang, code ).value; | ||||||
|             } | 			} | ||||||
|         }); | 		}); | ||||||
|     } | 	} | ||||||
|  |  | ||||||
|     var stripLeadingWhitespace = function(section) { | 	var stripLeadingWhitespace = function( section ) { | ||||||
|  |  | ||||||
|         var template = section.querySelector( 'script' ); | 		var template = section.querySelector( 'script' ); | ||||||
|  |  | ||||||
|         // strip leading whitespace so it isn't evaluated as code | 		// strip leading whitespace so it isn't evaluated as code | ||||||
|         var text = ( template || section ).textContent; | 		var text = ( template || section ).textContent; | ||||||
|  |  | ||||||
|         var leadingWs = text.match(/^\n?(\s*)/)[1].length, | 		var leadingWs = text.match( /^\n?(\s*)/ )[1].length, | ||||||
|             leadingTabs = text.match(/^\n?(\t*)/)[1].length; | 			leadingTabs = text.match( /^\n?(\t*)/ )[1].length; | ||||||
|  |  | ||||||
|         if( leadingTabs > 0 ) { | 		if( leadingTabs > 0 ) { | ||||||
|             text = text.replace( new RegExp('\\n?\\t{' + leadingTabs + '}','g'), '\n' ); | 			text = text.replace( new RegExp('\\n?\\t{' + leadingTabs + '}','g'), '\n' ); | ||||||
|         } | 		} | ||||||
|         else if( leadingWs > 1 ) { | 		else if( leadingWs > 1 ) { | ||||||
|             text = text.replace( new RegExp('\\n? {' + leadingWs + '}','g'), '\n' ); | 			text = text.replace( new RegExp('\\n? {' + leadingWs + '}','g'), '\n' ); | ||||||
|         } | 		} | ||||||
|  |  | ||||||
|         return text; | 		return text; | ||||||
|  |  | ||||||
|     }; | 	}; | ||||||
|  |  | ||||||
|     var twrap = function(el) { | 	var twrap = function( el ) { | ||||||
|         var content = el.content || el; |  | ||||||
|         content += el.asideContent ? ('<aside class="notes" data-markdown>' + el.asideContent + '</aside>') : ''; |  | ||||||
|         return '<script type="text/template">' + content + '</script>'; |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     var getForwardedAttributes = function(section) { | 		var content = el.content || el; | ||||||
|         var attributes = section.attributes; |  | ||||||
|         var result = []; |  | ||||||
|  |  | ||||||
|         for( var i = 0, len = attributes.length; i < len; i++ ) { | 		if( el.asideContent ) { | ||||||
|             var name = attributes[i].name, | 			content += '<aside class="notes" data-markdown>' + el.asideContent + '</aside>'; | ||||||
|                 value = attributes[i].value; | 		} | ||||||
|  |  | ||||||
|             // disregard attributes that are used for markdown loading/parsing | 		return '<script type="text/template">' + content + '</script>'; | ||||||
|             if( /data\-(markdown|separator|vertical|notes)/gi.test( name ) ) continue; |  | ||||||
|  |  | ||||||
|             if( value ) { | 	}; | ||||||
|                 result.push( name + '=' + value ); |  | ||||||
|             } |  | ||||||
|             else { |  | ||||||
|                 result.push( name ); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         return result.join( ' ' ); | 	var getForwardedAttributes = function( section ) { | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     var slidifyMarkdown = function(markdown, separator, vertical, notes, attributes) { | 		var attributes = section.attributes; | ||||||
|  | 		var result = []; | ||||||
|  |  | ||||||
|         separator = separator || '^\n---\n$'; | 		for( var i = 0, len = attributes.length; i < len; i++ ) { | ||||||
|         notes = notes || 'note:'; | 			var name = attributes[i].name, | ||||||
|  | 				value = attributes[i].value; | ||||||
|  |  | ||||||
|         var separatorRegex = new RegExp( separator + ( vertical ? '|' + vertical : '' ), 'mg' ), | 			// disregard attributes that are used for markdown loading/parsing | ||||||
|             horizontalSeparatorRegex = new RegExp( separator ), | 			if( /data\-(markdown|separator|vertical|notes)/gi.test( name ) ) continue; | ||||||
|             notesSeparatorRegex = new RegExp( notes, 'mgi' ), |  | ||||||
|             matches, |  | ||||||
|             noteMatch, |  | ||||||
|             lastIndex = 0, |  | ||||||
|             isHorizontal, |  | ||||||
|             wasHorizontal = true, |  | ||||||
|             content, |  | ||||||
|             asideContent, |  | ||||||
|             slide, |  | ||||||
|             sectionStack = [], |  | ||||||
|             markdownSections = ''; |  | ||||||
|  |  | ||||||
|         // iterate until all blocks between separators are stacked up | 			if( value ) { | ||||||
|         while( matches = separatorRegex.exec( markdown ) ) { | 				result.push( name + '=' + value ); | ||||||
|             asideContent = null; | 			} | ||||||
|  | 			else { | ||||||
|  | 				result.push( name ); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|             // determine direction (horizontal by default) | 		return result.join( ' ' ); | ||||||
|             isHorizontal = horizontalSeparatorRegex.test( matches[0] ); |  | ||||||
|  |  | ||||||
|             if( !isHorizontal && wasHorizontal ) { | 	}; | ||||||
|                 // create vertical stack |  | ||||||
|                 sectionStack.push( [] ); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             // pluck slide content from markdown input | 	var slidifyMarkdown = function( markdown, separator, vertical, notes, attributes ) { | ||||||
|             content = markdown.substring( lastIndex, matches.index ); |  | ||||||
|             noteMatch = content.split( notesSeparatorRegex ); |  | ||||||
|  |  | ||||||
|             if( noteMatch.length === 2 ) { | 		separator = separator || '^\n---\n$'; | ||||||
|                 content = noteMatch[0]; | 		notes = notes || 'note:'; | ||||||
|                 asideContent = noteMatch[1].trim(); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             slide = { | 		var separatorRegex = new RegExp( separator + ( vertical ? '|' + vertical : '' ), 'mg' ), | ||||||
|                 content: content, | 			horizontalSeparatorRegex = new RegExp( separator ), | ||||||
|                 asideContent: asideContent || "" | 			notesSeparatorRegex = new RegExp( notes, 'mgi' ), | ||||||
|             }; | 			matches, | ||||||
|  | 			noteMatch, | ||||||
|  | 			lastIndex = 0, | ||||||
|  | 			isHorizontal, | ||||||
|  | 			wasHorizontal = true, | ||||||
|  | 			content, | ||||||
|  | 			asideContent, | ||||||
|  | 			slide, | ||||||
|  | 			sectionStack = [], | ||||||
|  | 			markdownSections = ''; | ||||||
|  |  | ||||||
|             if( isHorizontal && wasHorizontal ) { | 		// iterate until all blocks between separators are stacked up | ||||||
|                 // add to horizontal stack | 		while( matches = separatorRegex.exec( markdown ) ) { | ||||||
|                 sectionStack.push(slide); | 			asideContent = null; | ||||||
|             } else { |  | ||||||
|                 // add to vertical stack |  | ||||||
|                 sectionStack[sectionStack.length-1].push(slide); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             lastIndex = separatorRegex.lastIndex; | 			// determine direction (horizontal by default) | ||||||
|             wasHorizontal = isHorizontal; | 			isHorizontal = horizontalSeparatorRegex.test( matches[0] ); | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // add the remaining slide | 			if( !isHorizontal && wasHorizontal ) { | ||||||
|         (wasHorizontal ? sectionStack : sectionStack[sectionStack.length-1]).push(markdown.substring(lastIndex)); | 				// create vertical stack | ||||||
|  | 				sectionStack.push( [] ); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|         // flatten the hierarchical stack, and insert <section data-markdown> tags | 			// pluck slide content from markdown input | ||||||
|         for( var k = 0, klen = sectionStack.length; k < klen; k++ ) { | 			content = markdown.substring( lastIndex, matches.index ); | ||||||
|             // vertical | 			noteMatch = content.split( notesSeparatorRegex ); | ||||||
|             if( sectionStack[k].propertyIsEnumerable(length) && typeof sectionStack[k].splice === 'function' ) { |  | ||||||
|                 markdownSections += '<section '+ attributes +'>' + |  | ||||||
|                                         '<section data-markdown>' +  sectionStack[k].map(twrap).join('</section><section data-markdown>') + '</section>' + |  | ||||||
|                                     '</section>'; |  | ||||||
|             } else { |  | ||||||
|                 markdownSections += '<section '+ attributes +' data-markdown>' + twrap( sectionStack[k] ) + '</section>'; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         return markdownSections; | 			if( noteMatch.length === 2 ) { | ||||||
|     }; | 				content = noteMatch[0]; | ||||||
|  | 				asideContent = noteMatch[1].trim(); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|     var querySlidingMarkdown = function() { | 			slide = { | ||||||
|  | 				content: content, | ||||||
|  | 				asideContent: asideContent || '' | ||||||
|  | 			}; | ||||||
|  |  | ||||||
|         var sections = document.querySelectorAll( '[data-markdown]'), | 			if( isHorizontal && wasHorizontal ) { | ||||||
|             section; | 				// add to horizontal stack | ||||||
|  | 				sectionStack.push(slide); | ||||||
|  | 			} else { | ||||||
|  | 				// add to vertical stack | ||||||
|  | 				sectionStack[sectionStack.length-1].push(slide); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|         for( var j = 0, jlen = sections.length; j < jlen; j++ ) { | 			lastIndex = separatorRegex.lastIndex; | ||||||
|  | 			wasHorizontal = isHorizontal; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|             section = sections[j]; | 		// add the remaining slide | ||||||
|  | 		(wasHorizontal ? sectionStack : sectionStack[sectionStack.length-1]).push(markdown.substring(lastIndex)); | ||||||
|  |  | ||||||
|             if( section.getAttribute('data-markdown').length ) { | 		// flatten the hierarchical stack, and insert <section data-markdown> tags | ||||||
|  | 		for( var k = 0, klen = sectionStack.length; k < klen; k++ ) { | ||||||
|  | 			// vertical | ||||||
|  | 			if( sectionStack[k].propertyIsEnumerable( length ) && typeof sectionStack[k].splice === 'function' ) { | ||||||
|  | 				markdownSections += '<section '+ attributes +'>' + | ||||||
|  | 										'<section data-markdown>' +  sectionStack[k].map( twrap ).join( '</section><section data-markdown>' ) + '</section>' + | ||||||
|  | 									'</section>'; | ||||||
|  | 			} else { | ||||||
|  | 				markdownSections += '<section '+ attributes +' data-markdown>' + twrap( sectionStack[k] ) + '</section>'; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|                 var xhr = new XMLHttpRequest(), | 		return markdownSections; | ||||||
|                     url = section.getAttribute('data-markdown'); | 	}; | ||||||
|  |  | ||||||
|                 datacharset = section.getAttribute('data-charset'); | 	var queryExternalMarkdown = function() { | ||||||
|                 // see https://developer.mozilla.org/en-US/docs/Web/API/element.getAttribute#Notes |  | ||||||
|                 if (datacharset != null && datacharset != '') { |  | ||||||
|                     xhr.overrideMimeType('text/html; charset=' + datacharset); |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 xhr.onreadystatechange = function () { | 		var sections = document.querySelectorAll( '[data-markdown]'), | ||||||
|                     if( xhr.readyState === 4 ) { | 			section; | ||||||
|                         if (xhr.status >= 200 && xhr.status < 300) { |  | ||||||
|                             section.outerHTML = slidifyMarkdown( xhr.responseText, section.getAttribute('data-separator'), section.getAttribute('data-vertical'), section.getAttribute('data-notes'), getForwardedAttributes(section) ); |  | ||||||
|                         } else { |  | ||||||
|                             section.outerHTML = '<section data-state="alert">ERROR: The attempt to fetch ' + url + ' failed with the HTTP status ' + xhr.status + |  | ||||||
|                                 '. Check your browser\'s JavaScript console for more details.' + |  | ||||||
|                                 '<p>Remember that you need to serve the presentation HTML from a HTTP server and the Markdown file must be there too.</p></section>'; |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 }; |  | ||||||
|  |  | ||||||
|                 xhr.open('GET', url, false); | 		for( var j = 0, jlen = sections.length; j < jlen; j++ ) { | ||||||
|                 try { |  | ||||||
|                     xhr.send(); |  | ||||||
|                 } catch (e) { |  | ||||||
|                     alert('Failed to get the Markdown file ' + url + '. Make sure that the presentation and the file are served by a HTTP server and the file can be found there. ' + e); |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|             } else if( section.getAttribute('data-separator') ) { | 			section = sections[j]; | ||||||
|  |  | ||||||
|                 var markdown = stripLeadingWhitespace(section); | 			if( section.getAttribute( 'data-markdown' ).length ) { | ||||||
|                 section.outerHTML = slidifyMarkdown( markdown, section.getAttribute('data-separator'), section.getAttribute('data-vertical'), section.getAttribute('data-notes'), getForwardedAttributes(section) ); |  | ||||||
|  |  | ||||||
|             } | 				var xhr = new XMLHttpRequest(), | ||||||
|         } | 					url = section.getAttribute( 'data-markdown' ); | ||||||
|  |  | ||||||
|     }; | 				datacharset = section.getAttribute( 'data-charset' ); | ||||||
|  |  | ||||||
|     var queryMarkdownSlides = function() { | 				// see https://developer.mozilla.org/en-US/docs/Web/API/element.getAttribute#Notes | ||||||
|  | 				if( datacharset != null && datacharset != '' ) { | ||||||
|  | 					xhr.overrideMimeType( 'text/html; charset=' + datacharset ); | ||||||
|  | 				} | ||||||
|  |  | ||||||
|         var sections = document.querySelectorAll( '[data-markdown]'); | 				xhr.onreadystatechange = function() { | ||||||
|  | 					if( xhr.readyState === 4 ) { | ||||||
|  | 						if ( xhr.status >= 200 && xhr.status < 300 ) { | ||||||
|  | 							section.outerHTML = slidifyMarkdown( xhr.responseText, section.getAttribute( 'data-separator' ), section.getAttribute( 'data-vertical' ), section.getAttribute( 'data-notes' ), getForwardedAttributes( section ) ); | ||||||
|  | 						} | ||||||
|  | 						else { | ||||||
|  | 							section.outerHTML = '<section data-state="alert">ERROR: The attempt to fetch ' + url + ' failed with the HTTP status ' + xhr.status + | ||||||
|  | 								'. Check your browser\'s JavaScript console for more details.' + | ||||||
|  | 								'<p>Remember that you need to serve the presentation HTML from a HTTP server and the Markdown file must be there too.</p></section>'; | ||||||
|  | 						} | ||||||
|  | 					} | ||||||
|  | 				}; | ||||||
|  |  | ||||||
|         for( var j = 0, jlen = sections.length; j < jlen; j++ ) { | 				xhr.open( 'GET', url, false ); | ||||||
|  |  | ||||||
|             makeHtml(sections[j]); | 				try { | ||||||
|  | 					xhr.send(); | ||||||
|  | 				} | ||||||
|  | 				catch ( e ) { | ||||||
|  | 					alert( 'Failed to get the Markdown file ' + url + '. Make sure that the presentation and the file are served by a HTTP server and the file can be found there. ' + e ); | ||||||
|  | 				} | ||||||
|  |  | ||||||
|         } | 			} else if( section.getAttribute( 'data-separator' ) ) { | ||||||
|  |  | ||||||
|     }; | 				var markdown = stripLeadingWhitespace( section ); | ||||||
|  | 				section.outerHTML = slidifyMarkdown( markdown, section.getAttribute( 'data-separator' ), section.getAttribute( 'data-vertical' ), section.getAttribute( 'data-notes' ), getForwardedAttributes( section ) ); | ||||||
|  |  | ||||||
|     var makeHtml = function(section) { | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|         var notes = section.querySelector( 'aside.notes' ); | 	}; | ||||||
|  |  | ||||||
|         var markdown = stripLeadingWhitespace(section); | 	var queryMarkdownSlides = function() { | ||||||
|  |  | ||||||
|         section.innerHTML = marked(markdown); | 		var sections = document.querySelectorAll( '[data-markdown]'); | ||||||
|  |  | ||||||
|         if( notes ) { | 		for( var j = 0, jlen = sections.length; j < jlen; j++ ) { | ||||||
|             section.appendChild( notes ); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|     }; | 			makeHtml( sections[j] ); | ||||||
|  |  | ||||||
|     querySlidingMarkdown(); | 		} | ||||||
|  |  | ||||||
|     queryMarkdownSlides(); | 	}; | ||||||
|  |  | ||||||
|  | 	var makeHtml = function( section ) { | ||||||
|  |  | ||||||
|  | 		var notes = section.querySelector( 'aside.notes' ); | ||||||
|  |  | ||||||
|  | 		var markdown = stripLeadingWhitespace( section ); | ||||||
|  |  | ||||||
|  | 		section.innerHTML = marked( markdown ); | ||||||
|  |  | ||||||
|  | 		if( notes ) { | ||||||
|  | 			section.appendChild( notes ); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	queryExternalMarkdown(); | ||||||
|  | 	queryMarkdownSlides(); | ||||||
|  |  | ||||||
| })(); | })(); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user