Source: text.js

/** Text engine. Controls all text
 * @module Text
 * @author Onien
 */


import { parse } from "./parser.js";
import { setupTypewriter } from "./typer/typer.js";


/** Main class of Text Engine 
 * @class Text
 */
export default class Text {
    /** @function constructor
     * @desc creates class
     * @param {HTMLElement} element
     * @param {Object} config
     * @param {number} config.speed - typing speed
     */
    constructor(element, config) {
        this.element = element;
        this.textEl = element.querySelector(".dialog");
        this.nameEl = element.querySelector(".name");
        this.config = config;
        this.typing = false;
        this.textToType = "";
    }


    /** @method setName
     * @desc sets text in the name element
     * @param {string} name - name
     */
    setName(name) {
        this.nameEl.innerText = name;
    }

    /** @method set
     * @desc just sets text
     * @param {string} text - text
     * @param {HTMLElement} element - html element
     */

    set(text, element = this.textEl) {
        element.innerHTML = text;
    }

    /** @method typeMultiply
     * @desc types array of the texts
     * @param {string[]} texts 
     * @param {HTMLElement[]} elements
     * @param {Function} [after]
     * @param {number} [idx=0] - start index
     */

    typeMultiply(texts, elements, after = () => {}, idx = 0) {
        if (idx >= elements.length) return after();

        this.type(texts[elements[idx].classList[0].slice(6)], "", () => {
            this.typeMultiply(texts, elements, after, idx + 1);
        }, elements[idx]);
    }

    /** @method type
     * @desc types in the element, skips html, parses text
     * @param {string} text
     * @param {string} [added=""] - start string
     * @param {Function} [after] - will be executed after all text typed
     * @param {HTMLElement} [element]
     * @param {number} [speed=config.speed] - typing speed
     * @param {Object} [parserData={}]
     * @returns {number} interval
     */

    type(text,  added = "", after = () => {}, element = this.textEl, speed = this.config.speed, parserData = {}) {
        text = parse(text, parserData, {useDOM: true});

        this.textToType = text;

        let typewriter = setupTypewriter(text, element, after, speed, added);
        typewriter.type();

        return typewriter;
    }
}