소스 검색

Support multiple aside notes elements per slide

So far, multiple notes per slide are only supported if they are
attached to fragments (without fragments, only the first aside notes
element on a slide is displayed).  With this commit, the contents of
all notes on a slide are displayed (except for fragments with notes,
for which, as before, only each fragment's first/single note is
displayed).
Jens Lechtenbörger 4 년 전
부모
커밋
f9ce61e34a
2개의 변경된 파일25개의 추가작업 그리고 13개의 파일을 삭제
  1. 10 6
      js/controllers/notes.js
  2. 15 7
      plugin/notes/plugin.js

+ 10 - 6
js/controllers/notes.js

@@ -1,5 +1,5 @@
 /**
- * Handles the showing and 
+ * Handles the showing of speaker notes
  */
 export default class Notes {
 
@@ -89,7 +89,7 @@ export default class Notes {
 	 * Retrieves the speaker notes from a slide. Notes can be
 	 * defined in two ways:
 	 * 1. As a data-notes attribute on the slide <section>
-	 * 2. As an <aside class="notes"> inside of the slide
+	 * 2. With <aside class="notes"> elements inside the slide
 	 *
 	 * @param {HTMLElement} [slide=currentSlide]
 	 * @return {(string|null)}
@@ -101,10 +101,14 @@ export default class Notes {
 			return slide.getAttribute( 'data-notes' );
 		}
 
-		// ... or using an <aside class="notes"> element
-		let notesElement = slide.querySelector( 'aside.notes' );
-		if( notesElement ) {
-			return notesElement.innerHTML;
+		// ... or using <aside class="notes"> elements
+		let notesElements = slide.querySelectorAll( 'aside.notes' );
+		if( notesElements ) {
+			let notes = "";
+			for (let i = 0; i < notesElements.length; i++) {
+				notes += notesElements[i].innerHTML + "\n";
+			}
+			return notes;
 		}
 
 		return null;

+ 15 - 7
plugin/notes/plugin.js

@@ -86,7 +86,7 @@ const Plugin = () => {
 		function post( event ) {
 
 			let slideElement = deck.getCurrentSlide(),
-				notesElement = slideElement.querySelector( 'aside.notes' ),
+				notesElements = slideElement.querySelectorAll( 'aside.notes' ),
 				fragmentElement = slideElement.querySelector( '.current-fragment' );
 
 			let messageData = {
@@ -108,21 +108,29 @@ const Plugin = () => {
 			if( fragmentElement ) {
 				let fragmentNotes = fragmentElement.querySelector( 'aside.notes' );
 				if( fragmentNotes ) {
-					notesElement = fragmentNotes;
+					messageData.notes = fragmentNotes.innerHTML;
+					messageData.markdown = typeof fragmentNotes.getAttribute( 'data-markdown' ) === 'string';
+
+					// Ignore other slide notes
+					notesElements = null;
 				}
 				else if( fragmentElement.hasAttribute( 'data-notes' ) ) {
 					messageData.notes = fragmentElement.getAttribute( 'data-notes' );
 					messageData.whitespace = 'pre-wrap';
 
 					// In case there are slide notes
-					notesElement = null;
+					notesElements = null;
 				}
 			}
 
-			// Look for notes defined in an aside element
-			if( notesElement ) {
-				messageData.notes = notesElement.innerHTML;
-				messageData.markdown = typeof notesElement.getAttribute( 'data-markdown' ) === 'string';
+			// Look for notes defined in aside elements
+			if( notesElements ) {
+				let notes = "";
+				for (let i = 0; i < notesElements.length; i++) {
+					notes += notesElements[i].innerHTML + "\n";
+				}
+				messageData.notes = notes;
+				messageData.markdown = typeof notesElements[0].getAttribute( 'data-markdown' ) === 'string';
 			}
 
 			popup.postMessage( JSON.stringify( messageData ), '*' );