UNPKG

2.69 kBJavaScriptView Raw
1/**
2 * Abstract Generator
3 * @abstract
4 * @memberof module:fur/lib
5 * @constructor Generator
6 */
7
8'use strict'
9
10const co = require('co')
11const path = require('path')
12const svgpng = require('svgpng')
13const writexml = require('writexml')
14const FurLogger = require('fur-logger')
15
16/** @lens Generator */
17function Generator () {
18 const s = this
19 s.init.apply(s, arguments)
20}
21
22Generator.prototype = {
23 /**
24 * Initialize Generator.
25 * @param {object} config - Generator config.
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 * Render a svg file.
39 * @param {string} filename - Filename to render.
40 * @param {object} data - SVG data.
41 * @returns {Promise}
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 * Render a png file.
55 * @param {string} filename - Filename to render.
56 * @param {object} svgData - SVG data.
57 * @returns {Promise}
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
102Generator.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
112module.exports = Generator