|
794 | 794 | // Copy page and show fragments one after another
|
795 | 795 | if( config.pdfSeparateFragments ) {
|
796 | 796 |
|
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 ); |
798 | 801 |
|
799 |
| - for( var currentFragment = 0; currentFragment < numberOfFragments; currentFragment++ ) { |
| 802 | + var previousFragmentStep; |
| 803 | + var previousPage; |
800 | 804 |
|
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 ) { |
805 | 806 |
|
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 ) { |
808 | 810 | 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 | + } |
816 | 813 |
|
| 814 | + // Show the fragments for the current index |
| 815 | + fragments.forEach( function( fragment ) { |
| 816 | + fragment.classList.add( 'visible', 'current-fragment' ); |
817 | 817 | } );
|
818 | 818 |
|
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 ); |
820 | 822 |
|
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 | + } ); |
822 | 834 |
|
823 | 835 | }
|
824 | 836 | // Show all fragments
|
|
4223 | 4235 | * the fragment within the fragments list.
|
4224 | 4236 | *
|
4225 | 4237 | * @param {object[]|*} fragments
|
| 4238 | + * @param {boolean} grouped If true the returned array will contain |
| 4239 | + * nested arrays for all fragments with the same index |
4226 | 4240 | * @return {object[]} sorted Sorted array of fragments
|
4227 | 4241 | */
|
4228 |
| - function sortFragments( fragments ) { |
| 4242 | + function sortFragments( fragments, grouped ) { |
4229 | 4243 |
|
4230 | 4244 | fragments = toArray( fragments );
|
4231 | 4245 |
|
|
4268 | 4282 | index ++;
|
4269 | 4283 | } );
|
4270 | 4284 |
|
4271 |
| - return sorted; |
| 4285 | + return grouped === true ? ordered : sorted; |
4272 | 4286 |
|
4273 | 4287 | }
|
4274 | 4288 |
|
|
0 commit comments