summaryrefslogtreecommitdiff
path: root/client/js/util/uri.js
blob: 172b8c814f53492f21fc13c20ac51c5b0f6887a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
"use strict";

function formatApiLink(...values) {
    let parts = [];
    for (let value of values) {
        if (value.constructor === Object) {
            // assert this is the last piece
            let variableParts = [];
            for (let key of Object.keys(value)) {
                if (value[key]) {
                    variableParts.push(
                        key + "=" + encodeURIComponent(value[key].toString())
                    );
                }
            }
            if (variableParts.length) {
                parts.push("?" + variableParts.join("&"));
            }
            break;
        } else {
            parts.push(encodeURIComponent(value.toString()));
        }
    }
    return "/" + parts.join("/");
}

function escapeParam(text) {
    return encodeURIComponent(text);
}

function unescapeParam(text) {
    return decodeURIComponent(text);
}

function getPostsQuery(parameters) {
    let normalQuery = parameters.query || "";
    let metricQuery = (parameters.metrics || "")
        .split(" ") //see metric_header_control
        .filter(m => m)
        .map(m => m + " sort:metric-" + m)
        .join(" ");
    return normalQuery + " " + metricQuery;
}

function formatClientLink(...values) {
    let parts = [];
    for (let value of values) {
        if (value.constructor === Object) {
            // assert this is the last piece
            let variableParts = [];
            for (let key of Object.keys(value)) {
                if (value[key]) {
                    variableParts.push(
                        key + "=" + escapeParam(value[key].toString())
                    );
                }
            }
            if (variableParts.length) {
                parts.push(variableParts.join(";"));
            }
            break;
        } else {
            parts.push(escapeParam(value.toString()));
        }
    }
    return parts.join("/");
}

function extractHostname(url) {
    // https://stackoverflow.com/a/23945027
    return url
        .split("/")
        [url.indexOf("//") > -1 ? 2 : 0].split(":")[0]
        .split("?")[0];
}

function extractRootDomain(url) {
    // https://stackoverflow.com/a/23945027
    let domain = extractHostname(url);
    let splitArr = domain.split(".");
    let arrLen = splitArr.length;

    // if there is a subdomain
    if (arrLen > 2) {
        domain = splitArr[arrLen - 2] + "." + splitArr[arrLen - 1];
        // check to see if it's using a Country Code Top Level Domain (ccTLD) (i.e. ".me.uk")
        if (
            splitArr[arrLen - 2].length === 2 &&
            splitArr[arrLen - 1].length === 2
        ) {
            // this is using a ccTLD
            domain = splitArr[arrLen - 3] + "." + domain;
        }
    }
    return domain;
}

function escapeTagName(text) {
    return text.replace(/:/g, "\\:").replace(/\./g, "\\.");
}

module.exports = {
    getPostsQuery: getPostsQuery,
    formatClientLink: formatClientLink,
    formatApiLink: formatApiLink,
    escapeTagName: escapeTagName,
    escapeParam: escapeParam,
    unescapeParam: unescapeParam,
    extractHostname: extractHostname,
    extractRootDomain: extractRootDomain,
};