Skip to content

Commit 078a752

Browse files
committed
refactor fragment pdf exporting to support multiple fragments with same index #1955
1 parent 3680f1a commit 078a752

File tree

1 file changed

+33
-19
lines changed

1 file changed

+33
-19
lines changed

js/reveal.js

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -794,31 +794,43 @@
794794
// Copy page and show fragments one after another
795795
if( config.pdfSeparateFragments ) {
796796

797-
var numberOfFragments = toArray( page.querySelectorAll( '.fragment' ) ).length;
797+
// Each fragment 'group' is an array containing one or more
798+
// fragments. Multiple fragments that appear at the same time
799+
// are part of the same group.
800+
var fragmentGroups = sortFragments( page.querySelectorAll( '.fragment' ), true );
798801

799-
for( var currentFragment = 0; currentFragment < numberOfFragments; currentFragment++ ) {
802+
var previousFragmentStep;
803+
var previousPage;
800804

801-
var clonedPage = page.cloneNode( true );
802-
page.parentNode.insertBefore( clonedPage, page.nextSibling );
803-
804-
toArray( sortFragments( clonedPage.querySelectorAll( '.fragment' ) ) ).forEach( function( fragment, fragmentIndex ) {
805+
fragmentGroups.forEach( function( fragments ) {
805806

806-
if( fragmentIndex < currentFragment ) {
807-
fragment.classList.add( 'visible' );
807+
// Remove 'current-fragment' from the previous group
808+
if( previousFragmentStep ) {
809+
previousFragmentStep.forEach( function( fragment ) {
808810
fragment.classList.remove( 'current-fragment' );
809-
}
810-
else if( fragmentIndex === currentFragment ) {
811-
fragment.classList.add( 'visible', 'current-fragment' );
812-
}
813-
else {
814-
fragment.classList.remove( 'visible', 'current-fragment' );
815-
}
811+
} );
812+
}
816813

814+
// Show the fragments for the current index
815+
fragments.forEach( function( fragment ) {
816+
fragment.classList.add( 'visible', 'current-fragment' );
817817
} );
818818

819-
page = clonedPage;
819+
// Create a separate page for the current fragment state
820+
var clonedPage = page.cloneNode( true );
821+
page.parentNode.insertBefore( clonedPage, ( previousPage || page ).nextSibling );
820822

821-
}
823+
previousFragmentStep = fragments;
824+
previousPage = clonedPage;
825+
826+
} );
827+
828+
// Reset the first/original page so that all fragments are hidden
829+
fragmentGroups.forEach( function( fragments ) {
830+
fragments.forEach( function( fragment ) {
831+
fragment.classList.remove( 'visible', 'current-fragment' );
832+
} );
833+
} );
822834

823835
}
824836
// Show all fragments
@@ -4223,9 +4235,11 @@
42234235
* the fragment within the fragments list.
42244236
*
42254237
* @param {object[]|*} fragments
4238+
* @param {boolean} grouped If true the returned array will contain
4239+
* nested arrays for all fragments with the same index
42264240
* @return {object[]} sorted Sorted array of fragments
42274241
*/
4228-
function sortFragments( fragments ) {
4242+
function sortFragments( fragments, grouped ) {
42294243

42304244
fragments = toArray( fragments );
42314245

@@ -4268,7 +4282,7 @@
42684282
index ++;
42694283
} );
42704284

4271-
return sorted;
4285+
return grouped === true ? ordered : sorted;
42724286

42734287
}
42744288

0 commit comments

Comments
 (0)