nbsrc/utils/parser.js

goog.module('nbsrc.utils.parser');

const Event = goog.require('goog.events.Event');
const Coordinate = goog.require('goog.math.Coordinate');

/**
 * Gibt eine Liste der Interaktionspunkte eines Ereignisses zurück. Diese Methode berücksichtigt die Unterschiede zwischen den Geräten.
 * @param {Event} event
 * @param {number=} scale
 * @return {Array<Coordinate>}
 */
function getBrowserPoints(event, scale = 1)
{
    let points = [];

    if(event.getBrowserEvent() && ((event.getBrowserEvent().touches && event.getBrowserEvent().touches.length > 0) || (event.getBrowserEvent().changedTouches && event.getBrowserEvent().changedTouches.length > 0)))
    {
        let touchPoints =  event.getBrowserEvent().touches.length > 0 ? event.getBrowserEvent().touches : event.getBrowserEvent().changedTouches;
        for(let i=touchPoints.length-1; i>=0; i--)
        {
            points.push(new Coordinate(touchPoints[i]['clientX'] * scale, touchPoints[i]['clientY'] * scale));
        }
    }
    else if(event.getBrowserEvent() && event.getBrowserEvent().clientX)
    {
        points.push(new Coordinate(event.getBrowserEvent().clientX * scale, event.getBrowserEvent().clientY * scale));
    }
    else
    {
        points.push(new Coordinate(event['clientX'] * scale, event['clientY'] * scale));
    }

    return points;
}

/**
 * Returns from a pafd only the filename without its extension.
 * @param {string} path
 * @return {string}
 */
function getFileName(path)
{
    let filename = path.substring(path.lastIndexOf("/") + 1).toLowerCase();
    return filename.split('.')[0];
}

/**
 * Gets german moth name aut of a list [0-11]
 * @param {number} month Desired month 0-11
 * @return {string}
 */
function getGermanMonthName(month)
{
    let monthNames = [
        'Januar',
        'Februar',
        'März',
        'April',
        'Mai',
        'Juni',
        'Juli',
        'August',
        'September',
        'Oktober',
        'November',
        'Dezember'
    ];
    return monthNames[month];
}

/**
 * Change the pathname so that `@2x` is added before the file extension.
 * @param {string} path
 * @return {string}
 */
function createRetinaFilePath(path)
{
    let fileObject = path.split('.');
    if(fileObject.length == 2)
        return fileObject[0] + "@2x." + fileObject[1];
    return path;
}

/**
 * Gets the query parameters of `window.location.search` as an object for better handling.
 * @param {string} urlSearch Is equal to window.location.search
 * @return {Object}
 */
function getQueryParams(urlSearch) {
    urlSearch = urlSearch.split('+').join(' ');
    let params = {};
    let tokens;
    let re = /[?&]?([^=]+)=([^&]*)/g;

    while (tokens = re.exec(urlSearch)) {
        params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);
    }

    return params;
}

/**
 * Generate a timestring with optionla include of milliseconds
 * @param {number} time in milliseconds
 * @param {boolean=} hideZeroHours Don't show zero hours if the time is lass than on hour
 * @param {boolean=} showMilliseconds
 * @return {string}
 */
function msToTime(time, hideZeroHours = false, showMilliseconds = false) {
    let ms = time % 1000;
    time = (time - ms) / 1000;
    let secs = time % 60;
    time = (time - secs) / 60;
    let mins = time % 60;
    let hrs = (time - mins) / 60;

    let str = ('00'+mins).slice(-2) + ':' + ('00'+secs).slice(-2);
    if(!(hideZeroHours && hrs == 0))
        str = ('00'+hrs).slice(-2) + ':' + str;
    if(showMilliseconds)
        str += '.' + ('000'+ms).slice(-3);

    return str;
}

/**
 * Shorten the text up to a maximum number of characters. At the end of the new shorter text `...` added.
 * @param {string} text
 * @param {number} maxCharacters
 * @param {boolean=} preventWordCut
 * @return {string}
 */
function createShortText(text, maxCharacters, preventWordCut = false) {
    if(text.length <= maxCharacters)
        return text;
    if(preventWordCut)
    {
        let textObj = text.split(' ');
        let textStr = '';
        for(let i=0; i<textObj.length; i++)
        {
            if(textStr.length + textObj[i].length + 1 < maxCharacters)
                textStr += textObj[i]+' ';
        }
        if(textStr.length>0)
            return textStr+'...';
    }
    return text.substr(0, maxCharacters)+'...';
}

exports = {
    getBrowserPoints,
    getFileName,
    createRetinaFilePath,
    getGermanMonthName,
    getQueryParams,
    msToTime,
    createShortText
};