-
-
Notifications
You must be signed in to change notification settings - Fork 1.9k
/
Copy pathpull_font_svg.js
56 lines (47 loc) · 1.75 KB
/
pull_font_svg.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
56
var fs = require('fs');
var xml2js = require('xml2js');
var parser = new xml2js.Parser();
var builder = new xml2js.Builder({ headless: true, rootName: 'svg', renderOpts: {'newline': ''}});
module.exports = function pullFontSVG(data, pathOut) {
parser.parseString(data, function(err, result) {
if(err) throw err;
var font_obj = result.svg.defs[0].font[0],
default_width = Number(font_obj.$['horiz-adv-x']),
ascent = Number(font_obj['font-face'][0].$.ascent),
descent = Number(font_obj['font-face'][0].$.descent),
chars = {};
font_obj.glyph.forEach(function(glyph) {
var name = glyph.$['glyph-name'],
transform = name === 'spikeline' ?
'matrix(1.5 0 0 -1.5 0 ' + ascent + ')' :
'matrix(1 0 0 -1 0 ' + ascent + ')';
chars[name] = {
width: Number(glyph.$['horiz-adv-x']) || default_width,
height: ascent - descent,
path: glyph.$.d,
transform: transform,
};
});
// Load SVG
var svgs = result.svg.defs[0].svg;
svgs.forEach(function(svg) {
var name = svg.$.id;
delete svg.$.id;
chars[name] = {
name: name,
svg: builder.buildObject(svg)
};
});
// turn remaining double quotes into single
var charStr = JSON.stringify(chars, null, 4).replace(/\"/g, '\'');
var outStr = [
'\'use strict\';',
'',
'module.exports = ' + charStr + ';',
''
].join('\n');
fs.writeFile(pathOut, outStr, function(err) {
if(err) throw err;
});
});
};