lib/resolvers/data.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 errors = require('../errors');

module.exports = function () {
    return function data(assetConfig, fromUrl, cb) {
        var dataUrlMatch = assetConfig.url.match(/^data:([\w\-\+\.]+\/[\w\-\+\.]+)?(?:;charset=([\w\/\-]+))?(;base64)?,([\u0000-\u007f]*)$/);
        if (dataUrlMatch) {
            delete assetConfig.url;
            var contentType = dataUrlMatch[1] || 'text/plain',
                body = dataUrlMatch[4];
            if (dataUrlMatch[2]) {
                assetConfig.encoding = dataUrlMatch[2];
            } else {
                assetConfig.encoding = 'us-ascii';
            }
            if (dataUrlMatch[3]) {
                assetConfig.rawSrc = new Buffer(body, 'base64');
            } else {
                var octets = [];
                for (var i = 0 ; i < body.length ; i += 1) {
                    if (body[i] === '%' && /^[a-f0-9]$/i.test(body[i + 1]) && /^[a-f0-9]$/i.test(body[i + 2])) {
                        octets.push(parseInt(body.substr(i + 1, 2), 16));
                        i += 2;
                    } else {
                        octets.push(body.charCodeAt(i));
                    }
                }
                assetConfig.rawSrc = new Buffer(octets);
            }
            assetConfig.contentType = assetConfig.contentType || contentType;
            assetConfig.isResolved = true;
            process.nextTick(function () {
                cb(null, assetConfig);
            });
        } else {
            process.nextTick(function () {
                cb(new errors.ParseError({
                    message: "Cannot parse data url: " + assetConfig.url,
                    asset: assetConfig
                }));
            });
        }
    };
};