lib/relations/CssUrlTokenRelation.js

lib/ AssetGraph.js errors.js index.js query.js
assets/ Asset.js Atom.js CacheManifest.js CoffeeScript.js Css.js Flash.js Gif.js Htc.js Html.js I18n.js Ico.js Image.js JavaScript.js Jpeg.js Json.js KnockoutJsTemplate.js Less.js Png.js Rss.js StaticUrlMap.js Stylus.js Text.js Xml.js index.js
relations/ CacheManifestEntry.js CssAlphaImageLoader.js CssBehavior.js CssFontFaceSrc.js CssImage.js CssImport.js CssUrlTokenRelation.js HtmlAlternateLink.js HtmlAnchor.js HtmlAppleTouchStartupImage.js HtmlApplet.js HtmlAudio.js HtmlCacheManifest.js HtmlConditionalComment.js HtmlDataBindAttribute.js HtmlEdgeSideInclude.js HtmlEmbed.js HtmlFrame.js HtmlIFrame.js HtmlIFrameSrcDoc.js HtmlImage.js HtmlInlineScriptTemplate.js HtmlKnockoutContainerless.js HtmlObject.js HtmlRelation.js HtmlRequireJsMain.js HtmlScript.js HtmlShortcutIcon.js HtmlStyle.js HtmlStyleAttribute.js HtmlVideo.js HtmlVideoPoster.js JavaScriptAmdDefine.js JavaScriptAmdRequire.js JavaScriptCommonJsRequire.js JavaScriptExtJsRequire.js JavaScriptGetStaticUrl.js JavaScriptGetText.js JavaScriptInclude.js JavaScriptShimRequire.js JavaScriptTrHtml.js Relation.js StaticUrlMapEntry.js index.js
resolvers/ data.js extJs4Dir.js file.js fixedDirectory.js http.js index.js javascript.js
transforms/ addCacheManifest.js bundleRelations.js bundleRequireJs.js compileCoffeeScriptToJavaScript.js compileLessToCss.js compileStylusToCss.js compressJavaScript.js convertCssImportsToHtmlStyles.js convertHtmlStylesToInlineCssImports.js convertStylesheetsToInlineStyles.js drawGraph.js executeJavaScriptInOrder.js externalizeRelations.js flattenStaticIncludes.js inlineCssImagesWithLegacyFallback.js inlineRelations.js loadAssets.js mergeIdenticalAssets.js minifyAssets.js moveAssets.js moveAssetsInOrder.js populate.js prettyPrintAssets.js pullGlobalsIntoVariables.js registerRequireJsConfig.js removeAssets.js removeRelations.js setAssetContentType.js setAssetEncoding.js setAssetExtension.js setHtmlImageDimensions.js startOverIfAssetSourceFilesChange.js writeAssetsToDisc.js writeAssetsToStdout.js writeStatsToStderr.js
util/ deepCopy.js extendWithGettersAndSetters.js fsTools.js getImageInfoFromBuffers.js memoizeAsyncAccessor.js uniqueId.js urlTools.js
var util = require('util'),
    _ = require('underscore'),
    extendWithGettersAndSetters = require('../util/extendWithGettersAndSetters'),
    Relation = require('./Relation');

function CssUrlTokenRelation(config) {
    Relation.call(this, config);
    this.tokenNumber = this.tokenNumber || 0;
}

util.inherits(CssUrlTokenRelation, Relation);

extendWithGettersAndSetters(CssUrlTokenRelation.prototype, {
    tokenRegExp: /\burl\((\'|\"|)([^\'\"]+?)\1\)/g,

    createUrlToken: function (href) {
        // Quote if necessary:
        if (/^[a-z0-9\/\-_.]*$/i.test(href)) {
            return "url(" + href + ")";
        } else {
            return "url('" + href.replace(/([\'\"])/g, "\\$1") + "')";
        }
    },

    get href() {
        this.tokenRegExp.lastIndex = 0; // Just in case
        var tokenNumber = 0,
            matchToken,
            url;
        while ((matchToken = this.tokenRegExp.exec(this.cssRule.style.getPropertyValue(this.propertyName)))) {
            if (tokenNumber === this.tokenNumber) {
                url = matchToken[2];
            }
            tokenNumber += 1;
        }
        return url; // Undefined if not found
    },

    set href(href) {
        var cssUrlToken = this.createUrlToken(href),
            tokenNumber = 0;
        this.cssRule.style.setProperty(this.propertyName, this.cssRule.style.getPropertyValue(this.propertyName).replace(this.tokenRegExp, function ($0, quoteChar, url) {
            if (tokenNumber++ === this.tokenNumber) {
                return cssUrlToken;
            } else {
                return $0;
            }
        }.bind(this)), this.cssRule.style.getPropertyPriority(this.propertyName));
    },

    inline: function () {
        Relation.prototype.inline.call(this);
        this.href = "data:" + this.to.contentType + ";base64," + this.to.rawSrc.toString('base64');
        this.from.markDirty();
        return this;
    },

    attach: function (asset, position, adjacentRelation) {
        throw new Error("Not implemented");
    },

    detach: function () {
        var value = this.cssRule.style.getPropertyValue(this.propertyName),
            matchToken = value && value.match(this.tokenRegExp);
        if (matchToken) {
            if (value === matchToken[0]) {
                this.cssRule.style.removeProperty(this.propertyName);
            } else {
                throw new Error("Not implemented");
            }
        }
        delete this.cssRule;
        return Relation.prototype.detach.call(this);
    }
});

module.exports = CssUrlTokenRelation;