decktape/plugins/bespoke.js
2017-10-03 12:05:46 +02:00

79 lines
2.1 KiB
JavaScript

exports.help =
`Requires the bespoke-extern module to expose the Bespoke.js API to a global variable named
'bespoke' and provides access to the collection of deck instances via 'bespoke.decks
and the most recent deck via 'bespoke.deck'.`;
exports.create = page => new Bespoke(page);
class Bespoke {
constructor(page) {
this.page = page;
}
getName() {
return 'Bespoke.js';
}
isActive() {
return this.page.evaluate(_ => (window.bespoke || {}).deck ? (deck = bespoke.deck) : false);
}
configure() {
return this.page.evaluate(_ => {
document.body.classList.add('export');
if (deck.parent.classList.contains('bespoke-overview'))
deck.fire('overview');
deck.slide(0);
// Advance to last build on first slide (internal state in bespoke-bullets makes this tricky)
let builds = 0;
const one = deck.slides.length === 1;
if (one)
deck.slides.push(document.createElement('section'));
do
++builds && deck.next();
while (deck.slide() === 0);
for (let i = 0; i < builds; i++)
i === 0 ? deck.slide(0) : deck.next();
if (one)
deck.slides.splice(-1, 1);
});
}
size() {
return this.page.evaluate(_ => {
const style = getComputedStyle(deck.slides[0]);
return {
width : parseInt(style.width, 10),
height : parseInt(style.height, 10),
};
});
}
slideCount() {
return this.page.evaluate(_ => deck.slides.length);
}
currentSlideIndex() {
return this.page.evaluate(_ => deck.slide() + 1);
}
nextSlide() {
return this.page.evaluate(_ => {
// Advance to last build on next slide (internal state in bespoke-bullets makes this tricky)
const next = deck.slide() + 1;
const beforeLast = next === deck.slides.length - 1;
let builds = 0;
if (beforeLast)
deck.slides.push(document.createElement('section'));
do
++builds && deck.next();
while (deck.slide() <= next);
for (let i = 1; i < builds; i++)
i === 1 ? deck.slide(next) : deck.next();
if (beforeLast)
deck.slides.splice(-1, 1);
});
}
}