-
Notifications
You must be signed in to change notification settings - Fork 16
/
index.js
55 lines (46 loc) · 1.57 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
var shorterNames = require('./shorter-css-color-names');
var REGEX = {
whitespace: /\s+/g,
urlHexPairs: /%[\dA-F]{2}/g,
quotes: /"/g,
}
function collapseWhitespace(str) {
return str.trim().replace(REGEX.whitespace, ' ');
}
function dataURIPayload(string) {
return encodeURIComponent(string)
.replace(REGEX.urlHexPairs, specialHexEncode);
}
// `#` gets converted to `%23`, so quite a few CSS named colors are shorter than
// their equivalent URL-encoded hex codes.
function colorCodeToShorterNames(string) {
Object.keys(shorterNames).forEach(function(key) {
if (shorterNames[key].test(string)) {
string = string.replace(shorterNames[key], key);
}
});
return string;
}
function specialHexEncode(match) {
switch (match) { // Browsers tolerate these characters, and they're frequent
case '%20': return ' ';
case '%3D': return '=';
case '%3A': return ':';
case '%2F': return '/';
default: return match.toLowerCase(); // compresses better
}
}
function svgToTinyDataUri(svgString) {
if (typeof svgString !== 'string') {
throw new TypeError('Expected a string, but received ' + typeof svgString);
}
// Strip the Byte-Order Mark if the SVG has one
if (svgString.charCodeAt(0) === 0xfeff) { svgString = svgString.slice(1) }
var body = colorCodeToShorterNames(collapseWhitespace(svgString))
.replace(REGEX.quotes, "'");
return 'data:image/svg+xml,' + dataURIPayload(body);
}
svgToTinyDataUri.toSrcset = function toSrcset(svgString) {
return svgToTinyDataUri(svgString).replace(/ /g, '%20');
}
module.exports = svgToTinyDataUri;