mh-two-thousand-and-two
2024-04-12 7fc6dbf547b8899d949b67cdec36b96a7d1701c7
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
'use strict';
 
// using URLjs because I don't want to think about all this:
// http://blog.lunatech.com/2009/02/03/what-every-web-developer-must-know-about-url-encoding
var URI    = require( 'urijs' );
var regexp = require( './regexp' );
 
/**
 * UrlHelper constructor
 * @constructor
 * @param {String} rule CSS rule with url().
 */
var UrlHelper = function ( rule ) {
    var exports = {};
 
    if ( ! ( this instanceof UrlHelper ) ) {
        return new UrlHelper( rule );
    }
 
    this._originalURI = this._extractURI( rule );
 
    if ( !this._originalURI && this._originalURI !== '') { return false; }
 
    this._originalRule = rule;
 
    this.URI = URI( this._originalURI );
 
    exports.URI             = this.URI;
    exports.getOriginalURI  = this.getOriginalURI.bind(  this );
    exports.getModifiedRule = this.getModifiedRule.bind( this );
    exports.getOriginalRule = this.getOriginalRule.bind( this );
 
    return exports;
};
 
/**
 * Extracts URI from rule.
 * @private
 * @param   {String} rule String to test.
 * @returns {String|undefined} Returns URI value or undefined.
 */
UrlHelper.prototype._extractURI = function( rule ) {
    if ( rule.match( regexp.URLS ) ) {
        return rule.match( regexp.URLS )[ 0 ]
            .replace( /^url\s?\(/, '' )
            .replace( /\)$/, '' )
            .trim()
            .replace( /^("|\')/, '' )
            .replace( /("|\')$/, '' );
    }
 
    return '';
};
 
/**
 * Returns original URI.
 * @returns {String} Original URI.
 */
UrlHelper.prototype.getOriginalURI = function () {
    return this._originalURI;
};
 
/**
 * Returns modified rule.
 * @returns {String} Modified rule.
 */
UrlHelper.prototype.getModifiedRule = function () {
    var modifiedURI = this.URI.toString();
    var originalHasIEFix = this._originalURI.match( /\?#iefix/ );
    var modifiedShouldHaveIEFix = modifiedURI.match( /[^?]#iefix/ );
 
    // TODO Remove VERY ugly ?#iefix exeption handling, urijs normalizing it and removing "?"
    if ( originalHasIEFix && modifiedShouldHaveIEFix ) {
        modifiedURI = modifiedURI.replace( '#iefix', '?#iefix' );
    }
 
    if (this._originalRule.match(/url\(\s*\)/) && modifiedURI) {
        return "url('" + modifiedURI + "')";
    }
 
    return this._originalRule.replace( this._originalURI, modifiedURI );
};
 
/**
 * Returns original rule.
 * @returns {String} Original rule.
 */
UrlHelper.prototype.getOriginalRule = function () {
    return this._originalRule;
};
 
module.exports = UrlHelper;