dom/tic.js

/**
 * @module DOM
 * @memberOf dom
 */

const {contains} = require("../core/collections");

/**
 * @class
 * @see dom.parseQuery
 */
class QueryParams {
    constructor() {
        /** @type {String} */
        this.tag = ""
        /** @type {String|null} */
        this.id = null
        /** @type {String[]} */
        this.classes = []
    }
}

/**
 * Parse Jade-like query to an object containing tag, id and classes
 *
 * @param {String} query - A string containing jade-like tag, id and classes
 * @param {QueryParams} def - Default value if empty
 * @returns {QueryParams}
 *
 * @example
 *  parseQuery('div#root.main.container');
 *  // returns {tag: 'div', id: 'root', classes: ['main', 'container']}
 */
function parseQuery(query, def={}) {
    let params = new QueryParams();
    params.tag = "";
    query = query.trim();
    let hasHash = contains(query,"#");
    let hasDot = contains(query,".");
    if (hasDot || hasHash) {
        let sp = query.split('#');
        if (hasHash) {
            params.tag = sp[0].toUpperCase();
            if (!hasDot) {
                params.id = query.split("#")[1];
            }
        }
        if (hasDot) {
            let ic = (sp.length>1?sp[1]:sp[0]).split(".");
            if (!hasHash) {
                params.tag = ic[0].toUpperCase();
            } else {
                params.id = ic[0];
            }
            params.classes = ic.slice(1);
            if (params.classes.length>0) params.hasClass = true;
        }
    } else {
        params.tag = query.toUpperCase();
    }
    if (params.tag === "" || params.tag === undefined)
        params.tag = "div";

    return params;
}

module.exports = {parseQuery}