1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 | 'use strict'
|
9 |
|
10 | const co = require('co')
|
11 | const path = require('path')
|
12 | const svgpng = require('svgpng')
|
13 | const writexml = require('writexml')
|
14 | const FurLogger = require('fur-logger')
|
15 |
|
16 |
|
17 | function Generator () {
|
18 | const s = this
|
19 | s.init.apply(s, arguments)
|
20 | }
|
21 |
|
22 | Generator.prototype = {
|
23 | |
24 |
|
25 |
|
26 |
|
27 | init (config) {
|
28 | const s = this
|
29 | for (let name of Object.keys(config)) {
|
30 | if (typeof config[ name ] === 'undefined') {
|
31 | delete config[ name ]
|
32 | }
|
33 | }
|
34 | Object.assign(s, config)
|
35 | },
|
36 | logger: new FurLogger(),
|
37 | |
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 | renderSvg (filename, data) {
|
44 | const s = this
|
45 | return co(function * () {
|
46 | yield new Promise((resolve, reject) =>
|
47 | writexml(filename, 'svg', data, (err) =>
|
48 | err ? reject(err) : resolve()
|
49 | )
|
50 | )
|
51 | })
|
52 | },
|
53 | |
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 | renderPng (filename, svgData) {
|
60 | let s = this
|
61 | let destDir = path.dirname(filename)
|
62 | let basename = path.basename(filename)
|
63 |
|
64 | let svgAttr = svgData[ '@' ] || {}
|
65 | let width = Number(svgAttr[ 'width' ] || 256)
|
66 | let height = Number(svgAttr[ 'height' ] || 256)
|
67 |
|
68 | let tmpFile = path.resolve(destDir, '.tmp.' + basename + '.' + new Date().getTime() + '.svg')
|
69 | return co(function * () {
|
70 | yield s.renderSvg(tmpFile, svgData)
|
71 | yield new Promise((resolve, reject) =>
|
72 | svgpng(tmpFile, filename, {
|
73 | size: {
|
74 | width: width,
|
75 | height: height
|
76 | },
|
77 | silent: true
|
78 | }, (err) =>
|
79 | err ? reject(err) : resolve()
|
80 | )
|
81 | )
|
82 | })
|
83 | },
|
84 | render (filename, format, svgData) {
|
85 | const s = this
|
86 | return co(function * () {
|
87 | format = format || path.extname(filename).replace(/^\./, '')
|
88 | switch (format) {
|
89 | case 'png':
|
90 | yield s.renderPng(filename, svgData)
|
91 | break
|
92 | case 'svg':
|
93 | yield s.renderSvg(filename, svgData)
|
94 | break
|
95 | default:
|
96 | throw new Error('Unknown format: ' + format)
|
97 | }
|
98 | })
|
99 | }
|
100 | }
|
101 |
|
102 | Generator.define = function (properties) {
|
103 | function Defined () {
|
104 | const s = this
|
105 | s.init.apply(s, arguments)
|
106 | }
|
107 |
|
108 | Defined.prototype = Object.assign(new Generator(properties), properties)
|
109 | return Defined
|
110 | }
|
111 |
|
112 | module.exports = Generator
|