2
schangxiang@126.com
2024-08-16 b47c50a2a514def7374b32d7194b2c599cba5625
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/**
 * Handles opening of and synchronization with the reveal.js
 * notes window.
 */
var RevealNotes = (function() {
 
    function openNotes() {
        var jsFileLocation = document.querySelector('script[src$="notes.js"]').src;  // this js file path
        jsFileLocation = jsFileLocation.replace(/notes\.js(\?.*)?$/, '');   // the js folder path
        var notesPopup = window.open( jsFileLocation + 'notes.html', 'reveal.js - Notes', 'width=1120,height=850' );
 
        // Fires when slide is changed
        Reveal.addEventListener( 'slidechanged', function( event ) {
            post('slidechanged');
        } );
 
        // Fires when a fragment is shown
        Reveal.addEventListener( 'fragmentshown', function( event ) {
            post('fragmentshown');
        } );
 
        // Fires when a fragment is hidden
        Reveal.addEventListener( 'fragmenthidden', function( event ) {
            post('fragmenthidden');
        } );
 
        /**
         * Posts the current slide data to the notes window
         *
         * @param {String} eventType Expecting 'slidechanged', 'fragmentshown' 
         * or 'fragmenthidden' set in the events above to define the needed 
         * slideDate.
         */
        function post( eventType ) {
            var slideElement = Reveal.getCurrentSlide(),
                messageData;
 
            if( eventType === 'slidechanged' ) {
                var notes = slideElement.querySelector( 'aside.notes' ),
                    indexh = Reveal.getIndices().h,
                    indexv = Reveal.getIndices().v,
                    nextindexh,
                    nextindexv;
 
                if( slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION' ) {
                    nextindexh = indexh;
                    nextindexv = indexv + 1;
                } else {
                    nextindexh = indexh + 1;
                    nextindexv = 0;
                }
 
                messageData = {
                    notes : notes ? notes.innerHTML : '',
                    indexh : indexh,
                    indexv : indexv,
                    nextindexh : nextindexh,
                    nextindexv : nextindexv,
                    markdown : notes ? typeof notes.getAttribute( 'data-markdown' ) === 'string' : false
                };
            }
            else if( eventType === 'fragmentshown' ) {
                messageData = {
                    fragment : 'next'
                };
            }
            else if( eventType === 'fragmenthidden' ) {
                messageData = {
                    fragment : 'prev'
                };
            }
 
            notesPopup.postMessage( JSON.stringify( messageData ), '*' );
        }
 
        // Navigate to the current slide when the notes are loaded
        notesPopup.addEventListener( 'load', function( event ) {
            post('slidechanged');
        }, false );
    }
 
    // If the there's a 'notes' query set, open directly
    if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) {
        openNotes();
    }
 
    // Open the notes when the 's' key is hit
    document.addEventListener( 'keydown', function( event ) {
        // Disregard the event if the target is editable or a
        // modifier is present
        if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
 
        if( event.keyCode === 83 ) {
            event.preventDefault();
            openNotes();
        }
    }, false );
 
    return { open: openNotes };
})();