"use strict";
var path = require( "path" );
var { htmlUnescape } = require( "escape-goat" );
var inline = require( "./util" );
var css = require( "./css" );
var htmlparser = require( "htmlparser2" );
module.exports = function( options, callback )
{
var settings = Object.assign( {}, inline.defaults, options );
function replaceInlineAttribute( string )
{
return string
.replace( new RegExp( " " + settings.inlineAttribute + "-ignore" + inline.attrValueExpression, "gi" ), "" )
.replace( new RegExp( " " + settings.inlineAttribute + inline.attrValueExpression, "gi" ), "" );
}
var replaceScript = function( callback )
{
var args = this;
args.element = replaceInlineAttribute( args.element );
inline.getTextReplacement( args.src, settings, function( err, content )
{
if( err )
{
return inline.handleReplaceErr( err, args.src, settings.strict, callback );
}
var onTransform = function( err, content )
{
if( err )
{
return callback( err );
}
if( !content || typeof( args.limit ) === "number" && content.length > args.limit * 1000 )
{
return callback( null );
}
var html = content.toString();
html = html.replace( /<\/script>/gmi, "<\\/script>" );
html = "";
var re = new RegExp( inline.escapeSpecialChars( args.element ), "g" );
result = result.replace( re, () => html );
return callback( null );
};
if( options.scriptTransform )
{
return options.scriptTransform( content, onTransform );
}
onTransform( null, content );
} );
};
var replaceLink = function( callback )
{
var args = this;
args.element = replaceInlineAttribute( args.element );
inline.getTextReplacement( args.src, settings, function( err, content )
{
if( err )
{
return inline.handleReplaceErr( err, args.src, settings.strict, callback );
}
var onTransform = function( err, content )
{
if( err )
{
return callback( err );
}
if( !content || typeof( args.limit ) === "number" && content.length > args.limit * 1000 )
{
return callback( null );
}
var cssOptions = Object.assign( {}, settings, {
fileContent: content.toString(),
rebaseRelativeTo: inline.isRemotePath( args.src ) && !inline.isRemotePath( settings.relativeTo ) ? args.src : path.relative( settings.relativeTo, settings.rebaseRelativeTo || path.join( settings.relativeTo, args.src, ".." + path.sep ) )
} );
css( cssOptions, function( err, content )
{
if( err )
{
return callback( err );
}
var html = content.toString();
html = html.replace( /<\/script>/gmi, "<\\/script>" );
html = "";
var re = new RegExp( inline.escapeSpecialChars( args.element ), "g" );
result = result.replace( re, () => html );
return callback( null );
} );
};
if( options.linkTransform )
{
return options.linkTransform( content, onTransform );
}
onTransform( null, content );
} );
};
var replaceImg = function( callback )
{
var args = this;
args.element = replaceInlineAttribute( args.element );
inline.getFileReplacement( args.src, settings, function( err, datauriContent )
{
if( err )
{
return inline.handleReplaceErr( err, args.src, settings.strict, callback );
}
if( !datauriContent || typeof( args.limit ) === "number" && datauriContent.length > args.limit * 1000 )
{
return callback( null );
}
var html = "
";
var re = new RegExp( inline.escapeSpecialChars( args.element ), "g" );
result = result.replace( re, () => html );
return callback( null );
} );
};
var replaceSvg = function( callback )
{
var args = this;
args.element = replaceInlineAttribute( args.element );
inline.getTextReplacement( args.src, settings, function( err, content )
{
if( err )
{
return inline.handleReplaceErr( err, args.src, settings.strict, callback );
}
if( !content || typeof( args.limit ) === "number" && content.length > args.limit * 1000 )
{
return callback( null );
}
var handler = new htmlparser.DomHandler( function( err, dom )
{
if( err )
{
return callback( err );
}
var svg = htmlparser.DomUtils.getElements( { id: args.id }, dom );
if( svg.length )
{
var use = htmlparser.DomUtils.getInnerHTML( svg[ 0 ] );
var re = new RegExp( inline.escapeSpecialChars( args.element ), "g" );
result = result.replace( re, () => use );
}
return callback( null );
},{ normalizeWhitespace: true } );
var parser = new htmlparser.Parser( handler, { xmlMode: true } );
parser.write( content );
parser.done();
} );
};
var result = settings.fileContent;
var tasks = [];
var found;
var inlineAttributeRegex = new RegExp( settings.inlineAttribute, "i" );
var inlineAttributeIgnoreRegex = new RegExp( settings.inlineAttribute + "-ignore", "i" );
var relStylesheetAttributeIgnoreRegex = new RegExp( "stylesheet", "i" );
var scriptRegex = /