1 |
|
2 | const { db } = require('../db/db');
|
3 | const { style, fsw } = require('@sutton-signwriting/core');
|
4 | const fs = require('fs');
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 | const 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 |
|
87 | if (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 | }
|