| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 | const languages = require("./languages.js").languages;/** * This could be used to setup language selector. This require languages * container, and could create functional languages selector from it. This  * add options to select all avaoidable languages in the container. */class selector {    /**     * @var {languages}     * This store languages container.     */    #languages;    /**     * @var {?HTMLElement}     * This store selector HTML container, or null when not created.     */    #container;    /**     * @var {HTMLElement}     * This store languages HTML selector object.     */    #selector;    /**     * @var {Array}     * This is array of callbacks which must being called after change.     */    #callbacks;    /**     * This create new selector object, from languages container.     *      * @param {languages} languages - Languages container to work on.     */    constructor(languages) {        NODE: throw new Error("This module could not beind used in NodeJS.");                this.#container = null;        this.#languages = languages;        this.#callbacks = new Array();        this.#selector = this.#create_selector();    }    /**     * This check that selector is currently inserted anywhere.     *      * @returns {bool} - True when selector is inserted anywhere.     */    get is_inserted() {        return this.#container !== null;    }    /**     * This inserts selector into given HTML element, or directly into     * document body, when any element is not specified. It returns      * itselt, to call more functions inline.     *      * @param {?HTMLElement} where - Place to insert selector, or null.     * @returns {selector} - This object to chain loading.     */    insert(where = null) {        if (this.is_inserted) {            return this;        }        if (where === null) {            where = document.querySelector("body");        }        this.#container = this.#create_container();        where.appendChild(this.#container);        return this;    }    /**     * This run all functions which was registered as onChange callback.     */    #on_change() {        this.#callbacks.forEach(count => {            count(this.current);        });    }    /**     * This function remove selector from HTML element, if it is already     * inserted anywhere.     *      * @returns {selector} - This object to chain loading.     */    remove() {        if (!this.is_inserted) {            return this;        }        this.#container.remove();        this.#container = null;        return this;    }    /**     * This create new container with selector inside.     *      * @returns {HTMLElement} - New container with selector.     */    #create_container() {        const container = document.createElement("div");                container.classList.add(this.class_name);        container.appendChild(this.#selector);                return container;    }    /**     * This add new callback to selector. All callbacks would be called     * after language change. Callback would get one parameter, which is     * name of the location.     *      * @param {CallableFunction} callback - Function to call on change.     * @returns      */    add_listener(callback) {        this.#callbacks.push(callback);        return this;    }    /**     * This return HTML class name of selector container.     *      * @returns {string} - HTML class name of selector container.     */    get class_name() {        return 'cx-libtranslate-language-selector';    }    /**     * This create HTML option element from language name.     *      * @param {string} location - Name of single language.      * @returns {HTMLElement} - New option element.     */    #create_option(location) {        const name = location.split("_").pop();        const option = document.createElement("option");        option.innerText = name;        option.value = location;        return option;    }    /**     * This return current selected language name.     *      * @returns {string} - Current selected language.     */    get current() {        return this.#selector.value;    }    /**     * This set current selected language for the selector.     *      * @param {string} name - Name of the language to set.     * @returns {selector} - This to chain loading.     */    set_selection(name) {        if (!this.#languages.has(name)) {            DEBUG: throw new Error(                "Selector has not \"" + name + "\" " +                "language in the container."            );        }        this.#selector.value = name;        return this;    }    /**     * This reload languages list in the selector. It could be used     * after change in the languages container.     *      * @returns {selector} - Itself to chain loading.     */    reload() {        while (this.#selector.lastChild) {            this.#selector.lastChild.remove();        }        this.#languages.avairable.forEach(count => {            this.#selector.appendChild(this.#create_option(count));        });        return this;    }    /**     * This create new HTML selector object, witch all languages     * from container inserted as options.     *      * @returns {HTMLElement} - New selector object.     */    #create_selector() {        const selector = document.createElement("select");        selector.addEventListener("change", () => {            this.#on_change();        });        this.#languages.avairable.forEach(count => {            selector.appendChild(this.#create_option(count));        });                return selector;    }}exports.selector = selector;
 |