aboutsummaryrefslogtreecommitdiff
path: root/resources/assets/javascripts/lib/url_helper.js
blob: 61a5a6294cfa36fd9360b3465bde144f275f6aa6 (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
/**
 * This class helps to handle URLs of hyperlinks and change their parameters.
 * For example a javascript-page may open an item and the user expects other links
 * on the same page to "know" that this item is now open. But because we don't use
 * PHP session-variables here, this is difficult to use. This class can help. You
 * can overwrite the href-attribute of the link by:
 *
 *  [code]
 *  link.href = STUDIP.URLHelper.getURL("adresse.php?hello=world#anchor");
 *  [/code]
 * Returns something like:
 * "http://uni-adresse.de/studip/adresse.php?hello=world&mandatory=parameter#anchor"
 */

class URLHelper {
    constructor(base_url = null, parameters = {}) {
        //the base url for all links
        this.base_url = base_url;

        // bound link parameters
        this.parameters = parameters;
    }

    /**
     * method to extend short URLs like "dispatch.php/profile" to "http://.../dispatch.php/profile"
     */
    resolveURL(url) {
        if (!_.isString(this.base_url) || url.match(/^[a-zA-Z][a-zA-Z0-9+-.]*:/) !== null || url.charAt(0) === '?') {
            //this method cannot do any more:
            return url;
        }
        var base_url = this.base_url;
        if (url.charAt(0) === '/') {
            var host = this.base_url.match(/^[a-zA-Z][a-zA-Z0-9+-.]*:\/\/[\w:.\-]+/);
            base_url = host ? host[0] : '';
        }
        return base_url + url;
    }

    /**
     * returns a readily encoded URL with the mandatory parameters and additionally passed
     * parameters.
     *
     * @param url string: any url-string
     * @param param_object map: associative object for extra values
     * @param ignore_params boolean: ignore previously bound parameters
     * @return: url with all necessary and additional parameters, encoded
     */
    getURL(url, param_object, ignore_params) {
        var params = _.defaults(param_object || {}, ignore_params ? {} : this.parameters),
            tmp,
            fragment,
            query;

        tmp = url.split('#');
        url = tmp[0];
        fragment = tmp[1];

        tmp = url.split('?');
        url = tmp[0];
        query = tmp[1] || '';

        if (url !== '') {
            url = this.resolveURL(url);
        }
        query = decodeURIComponent(query);
        // split query string and merge with param_object
        _.each((query && query.split('&')) || [], function(e) {
            var pair = e.split('=');
            if (!(pair[0] in params)) {
                params[pair[0]] = pair[1];
            }
        });

        if (_.keys(params).length || url === '') {
            url += '?' + jQuery.param(params);
        }

        if (fragment) {
            url += '#' + fragment;
        }

        return url;
    }
}

export default function createURLHelper(config) {
    return new URLHelper(config && config.base_url, config && config.parameters);
}