| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- "use strict";
- var url = require( "url" );
- var path = require( "path" );
- var inline = require( "./util" );
- module.exports = function( options, callback )
- {
- var settings = Object.assign( {}, inline.defaults, options );
- var replaceUrl = function( callback )
- {
- var args = this;
- if( inline.isBase64Path( args.src ) )
- {
- return callback( null ); // Skip
- }
- inline.getFileReplacement( args.src, settings, function( err, datauriContent )
- {
- if( err )
- {
- return inline.handleReplaceErr( err, args.src, settings.strict, callback );
- }
- if( typeof( args.limit ) === "number" && datauriContent.length > args.limit * 1000 )
- {
- return callback( null ); // Skip
- }
- var css = "url(\"" + datauriContent + "\")";
- var re = new RegExp( "url\\(\\s?[\"']?(" + inline.escapeSpecialChars( args.src ) + ")[\"']?\\s?\\)", "g" );
- result = result.replace( re, () => css );
- return callback( null );
- } );
- };
- var rebase = function( src )
- {
- var css = "url(\"" + ( inline.isRemotePath( src ) || inline.isRemotePath( settings.rebaseRelativeTo ) ? url.resolve( settings.rebaseRelativeTo, src ) : path.join( settings.rebaseRelativeTo, src ).replace( /\\/g, "/" ) ) + "\")";
- var re = new RegExp( "url\\(\\s?[\"']?(" + inline.escapeSpecialChars( src ) + ")[\"']?\\s?\\)", "g" );
- result = result.replace( re, () => css );
- };
- var result = settings.fileContent;
- var tasks = [];
- var found = null;
- var urlRegex = /url\(\s?["']?([^)'"]+)["']?\s?\).*/i;
- var index = 0;
- if( settings.rebaseRelativeTo )
- {
- var matches = {};
- var src;
- while( ( found = urlRegex.exec( result.substring( index ) ) ) !== null )
- {
- src = found[ 1 ];
- matches[ src ] = true;
- index = found.index + index + 1;
- }
- for( src in matches )
- {
- if( !inline.isRemotePath( src ) && !inline.isBase64Path( src ) )
- {
- rebase( src );
- }
- }
- }
- var inlineAttributeCommentRegex = new RegExp( "\\/\\*\\s?" + settings.inlineAttribute + "\\s?\\*\\/", "i" );
- var inlineAttributeIgnoreCommentRegex = new RegExp( "\\/\\*\\s?" + settings.inlineAttribute + "-ignore\\s?\\*\\/", "i" );
- index = 0;
- while( ( found = urlRegex.exec( result.substring( index ) ) ) !== null )
- {
- if( !inlineAttributeIgnoreCommentRegex.test( found[ 0 ] ) &&
- ( settings.images || inlineAttributeCommentRegex.test( found[ 0 ] ) ) )
- {
- tasks.push( replaceUrl.bind(
- {
- src: found[ 1 ],
- limit: settings.images
- } ) );
- }
- index = found.index + index + 1;
- }
- var promises = tasks.map( function( fn )
- {
- return new Promise( function( resolve, reject )
- {
- fn( function( error )
- {
- if ( error ) {
- reject ( error );
- } else {
- resolve();
- }
- } );
- } );
- } );
- Promise.all( promises )
- .then( function()
- {
- callback( null, result );
- }, function( error )
- {
- callback( error, result );
- } );
- };
|