gulp-recolor-svg v1.0.3
gulp-recolor-svg
A gulp package for replacing colors within SVGs.
Example
Let's say I have the following SVG (named plus.svg), a blue "+" symbol:
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 15 15" enable-background="new 0 0 15 15" xml:space="preserve">
<path fill="#0000FF" d="M6.3,1.1v5.2H1.1c-0.7,0-0.7,0.5-0.7,1.2c0,0.7,0.1,1.2,0.7,1.2h5.2v5.2c0,0.7,0.5,0.7,1.2,0.7
c0.7,0,1.2-0.1,1.2-0.7V8.7h5.2c0.7,0,0.7-0.5,0.7-1.2c0-0.7-0.1-1.2-0.7-1.2H8.7V1.1c0-0.7-0.5-0.7-1.2-0.7
C6.8,0.4,6.3,0.5,6.3,1.1"/>
</svg>Simple Recolor
The simplest use case for this package is replacing one or more colors in an SVG with different colors.
This gulpfile will generate a new SVG, plus--red.svg, containing a red plus symbol in place of the blue symbol:
var Color = require("color");
var gulp = require("gulp");
var RecolorSvg = require("gulp-recolor-svg");
var rename = require("gulp-rename");
gulp.task("default", function(){
gulp.src("plus.svg")
.pipe(RecolorSvg.Replace(
[ RecolorSvg.ColorMatcher(Color("blue")) ],
[ Color("red") ]
))
.pipe(rename({
suffix: "--red"
}))
.pipe(gulp.dest("./"));
});Generating Multiple Variants
This package can also be used to easily generate multiple variants of an input image. For example, if I'm using an SVG as the background of a <button>, I can easily different color variants for the button's hover, active, focus, and disabled states.
Given plus.svg, this gulpfile will generate four SVGs: plus--hover.svg, plus--active.svg, plus--focus.svg, and plus--disabled.svg, each with a different colored plus symbol:
var Color = require("color");
var gulp = require("gulp");
var RecolorSvg = require("gulp-recolor-svg");
gulp.task("default", function(){
gulp.src("plus.svg")
.pipe(RecolorSvg.GenerateVariants(
[ RecolorSvg.ColorMatcher(Color("blue")) ],
[ { suffix: "--hover", colors: [ Color("red") ] },
{ suffix: "--active", colors: [ Color("red").darken(0.1) ] },
{ suffix: "--focus", colors: [ Color("cyan") ] },
{ suffix: "--disabled", colors: [ Color("#ccc") ] } ]
))
.pipe(gulp.dest("./"));
});API
Color(args...)
This is just a wrapper around the color package for Node, which provides utilities for parsing and serializing CSS colors.
ColorMatcher(colorToMatch, maxDifference=0.1)
This returns a function that, when invoked with a color, will return a boolean value indicating whether the similarity of this color to the color used when instantiating the matcher is within the specified threshold.
Colors are compared using the CIE76 color difference algorithm. Since the vision of humans is more sensitive to differences in certain colors than in others, using the algorithm allows colors to be replaced uniformly across the visible spectrum. (However, this algorithm does have certain limitations—see the linked algorithm.)
Usage:
var RecolorSvg = require("gulp-recolor-svg");
matcher = RecolorSvg.ColorMatcher(Color("red"), 2);
matcher(RecolorSvg.Color("red").lighten(0.02)); # returns true
matcher(RecolorSvg.Color("blue")); # returns falseGenerateVariants(matcherFunctions, variants)
Returns a function that when passed a stream containing a file, emits multiple files—one for each variant—with the colors replaced.
Arguments:
matcherFunctionsis an array of functions that accept a single argument (a color) and return a boolean value indicating whether that color should be replaced. A matcher function can be an instance ofColorMatcher, or a custom function.variants: an array of objects withsuffixandcolorsproperties. The value ofsuffixis appended to the file name of the file generated for the variant; the value ofcolorsis an array of colors, with a length equal to the length ofmatcherFunctions. If a function frommatcherFunctionsevaluates totruefor a certain color in the SVG, that color will be replaced with the color at the corresponding index fromcolors.
Replace(matcherFunctions, replacementColors)
Returns a function that when passed a stream containing a file, emits a file with the colors replaced.
Arguments:
matcherFunctionsis an array of functions that accept a single argument (a color) and return a boolean value indicating whether that color should be replaced. A matcher function can be an instance ofColorMatcher, or a custom function.replacementColorsis an array of replacement colors. The length of this array should match the length ofmatcherFunctions. For each function ofmatcherFunction, if the function returns atruevalue, that color will be replaced by the color at the corresponding index fromreplacementColors.
See the Simple Recolor example.
Testing
Prior to running tests, you must install the devDependencies using:
npm installTests can be run using:
npm testLimitations
Currently, only fill and stroke properties are supported.
These properties will be replaced if they're set in any of the following ways:
- As attributes (
<path fill="red" stroke="blue" />) - As properties in a
styleattribute (<path style="fill: red; stroke: blue;") - In a stylesheet (
path { fill: red; stroke: blue })
This package only works with solid colors; colors with transparency aren't supported.