vanillajs-deck/js/slide.js
2019-12-02 15:18:17 -08:00

104 lines
2.6 KiB
JavaScript

// @ts-check
import { DataBinding } from "./dataBinding.js"
/**
* Represents a slide
* */
export class Slide {
/**
* @constructor
* @param {string} text - The content of the slide
*/
constructor(text) {
/**
* Internal text representation of the slide
* @type {string}
*/
this._text = text;
/**
* Context for embedded scripts
* @type {object}
*/
this._context = { };
/**
* Data binding helper
* @type {DataBinding}
*/
this._dataBinding = new DataBinding();
/**
* The HTML DOM hosting the slide contents
* @type {HTMLDivElement}
*/
this._html = document.createElement('div');
this._html.innerHTML = text;
/**
* The title of the slide
* @type {string}
*/
this._title = this._html.querySelectorAll("title")[0].innerText;
/** @type{NodeListOf<HTMLElement>} */
const transition = (this._html.querySelectorAll("transition"));
if (transition.length) {
/**
* The name of the animation to use for transitions
* @type {string}
*/
this._transition = transition[0].innerText;
}
else {
this._transition = null;
}
/** @type{NodeListOf<HTMLElement>} */
const hasNext = this._html.querySelectorAll("next-slide");
if (hasNext.length > 0) {
/**
* The name of the next slide to load
* @type {string}
*/
this._nextSlideName = hasNext[0].innerText;
}
else {
this._nextSlideName = null;
}
// execute any scripts
const script = this._html.querySelector("script");
if (script) {
this._dataBinding.executeInContext(script.innerText, this._context, true);
this._dataBinding.bindAll(this._html, this._context);
}
}
/**
* The slide transition
* @returns {string} The transition name
*/
get transition() {
return this._transition;
}
/**
* The slide title
* @returns {string} The slide title
*/
get title() {
return this._title;
}
/**
* The HTML DOM node for the slide
* @returns {HTMLDivElement} The HTML content
*/
get html() {
return this._html;
}
/**
* The name of the next slide (filename without the .html extension)
* @returns {string} The name of the next slide
*/
get nextSlide() {
return this._nextSlideName;
}
}