inline-source
Inline and compress tags that contain the inline
attribute. Supports <script>
, <link>
, and <img>
(including *.svg
sources) tags by default, and is easily extensible to handle others.
You can use inline-source-cli to run inline-source
from the command line or NPM Scripts.
Usage
inline(htmlpath, [options], callback(err, html)): asynchronously parse htmlpath
content for tags containing an inline
attribute, and replace with (optionally compressed) file contents.
htmlpath
can be either a filepath or a string of html content.
Available options
include:
attribute
: attribute used to parse sources (default 'inline'
)compress
: enable/disable compression of inlined content (default true
)fs
: specify fs
implementation (default is Node core 'fs'
)handlers
: specify custom handlers (default []
) [see custom handlers]ignore
: disable inlining based on tag
, type
, and/or format
(default []
)pretty
: maintain leading whitespace when options.compress
is false
(default false
)rootpath
: directory path used for resolving inlineable paths (default process.cwd()
)swallowErrors
: enable/disable suppression of errors (default false
)svgAsImage
: convert <img inline src="*.svg" />
to <img>
and not <svg>
(default false
)
Note: you can parse all script|link|img|object
tags by setting options.attribute=false
.
$ npm install inline-source
<!DOCTYPE html>
<html>
<head>
<link inline href="css/inlineStyle.css">
<script inline src="../js/inlineScript.js"></script>
<img inline src="images/inlineImage.png" />
<img inline src="images/inlineImage.svg" />
</head>
</html>
var inline = require('inline-source')
, fs = require('fs')
, path = require('path')
, htmlpath = path.resolve('project/src/html/index.html');
inline(htmlpath, {
compress: true,
rootpath: path.resolve('www'),
ignore: ['css', 'png']
}, function (err, html) {
});
inline.sync(htmlpath, [options]): same as inline
, but synchronously returns string of html content.
var inline = require('inline-source').sync
, fs = require('fs')
, path = require('path')
, htmlpath = path.resolve('project/src/html/index.html');
var html = inline(htmlpath, {
compress: true,
rootpath: path.resolve('www'),
ignore: 'script'
});
Custom Handlers
Custom handlers are simple middleware-type functions that enable you to provide new, or override existing, inlining behaviour. All handlers have the following signature: function handler (source, context, next) {}
-
source
: the current source object to act upon
attributes
: the parsed tag attributes objectcompress
: the compress flag (may be overriden at the tag level via props)content
: the processed fileContent
stringextension
: the file extensionfileContent
: the loaded file content stringfilepath
: the fully qualified path stringformat
: the format string (jpg
, gif
, svg+xml
, etc)match
: the matched html tag string, including closing tag if appropriateprops
: the parsed namespaced attributes object (see props)replace
: the tag wrapped content
string to replace match
tag
: the tag string (script
, link
, etc)type
: the content type based on type
mime-type attribute, or tag
(js
for application/javascript
, css
for text/css
, etc)
-
context
: the global context object storing all configuration options (attribute
, compress
, ignore
, pretty
, rootpath
, swallowErrors
, svgAsImage
), in addtion to:
html
: the html file's content stringhtmlpath
: the html file's path stringsources
: the array of source
objects
-
next(err)
: a function to be called to advance to the next middleware function. Accepts an optional error
object with behaviour determined by swallowErrors
flag (stops all processing if false
, skips current source
if true
)
Custom handlers are inserted before the defaults, enabling overriding of default behaviour:
module.exports = function customjs (source, context, next) {
if (source.fileContent
&& !source.content
&& (source.type == 'js')) {
source.content = "Hey! I'm overriding the file's content!";
next();
} else {
next();
}
};
In general, default file content processing will be skipped if source.content
is already set, and default wrapping of processed content will be skipped if source.replace
is already set.
Props
Source props
are a subset of attributes
that are namespaced with the current global attribute
('inline' by default), and allow declaratively passing data or settings to handlers:
<script inline inline-foo="foo" inline-compress src="../js/inlineScript.js"></script>
module.exports = function customjs (source, context, next) {
if (source.fileContent
&& !source.content
&& (source.type == 'js')) {
if (source.compress) {
}
if (source.props.foo == 'foo') {
}
next();
} else {
next();
}
};