UNPKG

3.21 kBJavaScriptView Raw
1
2const { db } = require('../db/db');
3const { style, fsw } = require('@sutton-signwriting/core');
4const fs = require('fs');
5
6/**
7 * Function that creates an SVG image from an FSW symbol key with an optional style string
8 * @function fsw.symbolSvg
9 * @param {string} fswSym - an FSW symbol key with optional style string
10 * @param {function} callback - a callback function with error and result parameters
11 * @example
12 * const callback = (error, result) => {
13 * if (error) {
14 * console.log(error)
15 * } else {
16 * console.log(result + " is '<svg...")
17 * }
18 * }
19 *
20 * fsw.symbolSvg('S10000', callback )
21 */
22const symbolSvg = (fswSym, callback) => {
23 const parsed = fsw.parse.symbol(fswSym);
24 const blank = '<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="1" height="1"></svg>';
25 if (parsed.symbol) {
26 db.get('select svg,width,height from symbol where symkey=?', [parsed.symbol], (err, res) => {
27 if (err) {
28 callback(err, res);
29 } else {
30 if (!res) {
31 callback(err, blank)
32 } else {
33 let styling = style.parse(parsed.style);
34
35 let line;
36 if (styling.colorize) {
37 line = fsw.colorize(parsed.symbol);
38 } else if (styling.detail) {
39 line = styling.detail[0]
40 }
41 if (line) {
42 res.svg = res.svg.replace(/class="sym-line"/, `class="sym-line" fill="${line}"`);
43 }
44
45 let fill = styling.detail && styling.detail[1];
46 if (fill) {
47 res.svg = res.svg.replace(/class="sym-fill" fill="#ffffff"/, `class="sym-fill" fill="${fill}"`);
48 }
49
50 let x1 = 500;
51 let y1 = 500;
52 let background = '';
53 if (styling.padding) {
54 x1 -= styling.padding;
55 y1 -= styling.padding;
56 res.width += styling.padding * 2;
57 res.height += styling.padding * 2;
58 }
59 if (styling.background) {
60 background = `\n <rect x="${x1}" y="${y1}" width="${res.width}" height="${res.height}" style="fill:${styling.background};" />`
61 }
62 let sizing = '';
63 if (styling.zoom != 'x') {
64 sizing = ` width="${res.width * (styling.zoom ? styling.zoom : 1)}" height="${res.height * (styling.zoom ? styling.zoom : 1)}"`;
65 }
66
67 let classes = '';
68 if (styling.classes) {
69 classes = ` class="${styling.classes}"`
70 }
71 let id = '';
72 if (styling.id) {
73 id = ` id="${styling.id}"`
74 }
75 callback(null, `<svg${classes}${id} version="1.1" xmlns="http://www.w3.org/2000/svg"${sizing} viewBox="${x1} ${y1} ${res.width} ${res.height}">
76 <text font-size="0">${fswSym}</text>${background}
77 <svg x="500" y="500">${res.svg}</svg>
78</svg>`);
79 }
80 }
81 })
82 } else {
83 callback(null, blank);
84 }
85}
86
87if (require.main === module) {
88 symbolSvg(process.argv[2], (err, res) => {
89 if (process.argv[3]) {
90 fs.writeFileSync(process.argv[3], res)
91 } else {
92 console.log(err || res);
93 }
94 })
95} else {
96 module.exports = { symbolSvg }
97}