'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 regexp = require( './regexp' ); var URI = require( 'urijs' ); var UrlHelper = require( './url' ); /** * ImportHelper constructor * @constructor * @param {String} rule @import value. */ var ImportHelper = function ( rule ) { var exports = {}; if ( ! ( this instanceof ImportHelper ) ) { return new ImportHelper( rule ); } this._originalURI = this._extractURI( rule ); if ( !this._originalURI ) { return false; } this._originalRule = rule; this._mediaQuery = this.getOriginalMediaQuery(); 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 ); exports.setMediaQuery = this.setMediaQuery.bind( this ); exports.getMediaQuery = this.getMediaQuery.bind( this ); exports.getOriginalMediaQuery = this.getOriginalMediaQuery.bind( this ); return exports; }; ImportHelper.prototype = Object.create( UrlHelper.prototype ); ImportHelper.prototype.constructor = ImportHelper; /** * Extracts URI from rule. * @private * @param {String} rule String to test. * @returns {String|undefined} Returns URI value or undefined. */ ImportHelper.prototype._extractURI = function( rule ) { if ( rule.match( regexp.URLS ) ) { return rule.match( regexp.URLS )[ 0 ] .replace( /^url\s?\(/, '' ) .replace( /\)$/, '' ) .trim() .replace( /^("|\')/, '' ) .replace( /("|\')$/, '' ); } else if ( rule.match( regexp.STRINGS ) ) { return rule.match( regexp.STRINGS )[ 0 ] .replace( /^("|\')/, '' ) .replace( /("|\')$/, '' ); } }; /** * Returns media query from original string. * @returns {String|boolean} Media query or false. */ ImportHelper.prototype.getOriginalMediaQuery = function() { var query = this.getOriginalRule(); if ( query.match( regexp.URLS ) ) { query = query.replace( regexp.URLS, '' ).trim(); } else { query = query.replace( regexp.STRINGS, '' ).trim(); } return query || false; }; /** * Returns current media query. * @returns {String|boolean} Media query or false. */ ImportHelper.prototype.getMediaQuery = function() { return this._mediaQuery; }; /** * Sets media query value. * @param {String} query New media query. */ ImportHelper.prototype.setMediaQuery = function( query ) { this._mediaQuery = query; }; /** * Returns modified rule. * @returns {String} Modified rule. */ ImportHelper.prototype.getModifiedRule = function () { var rule = UrlHelper.prototype.getModifiedRule.apply( this ); if ( this.getMediaQuery() !== this.getOriginalMediaQuery() ) { if ( this.getOriginalMediaQuery() ) { rule = rule.replace( this.getOriginalMediaQuery(), this.getMediaQuery() || '' ).trim(); } else if ( this.getMediaQuery() ) { rule = rule + ' ' + this.getMediaQuery(); } } return rule; }; module.exports = ImportHelper;