forked from TurboWarp/scratch-blocks
-
Notifications
You must be signed in to change notification settings - Fork 0
/
js_to_json.js
46 lines (41 loc) · 1.4 KB
/
js_to_json.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
const es = require('event-stream');
const fs = require('fs');
const path = require('path');
const assert = require('assert');
// Storage object
const storage = {};
// File paths
const PATH_INPUT = path.resolve(__dirname, '../msg/messages.js');
const PATH_OUTPUT = path.resolve(__dirname, '../msg/json/en.json');
// Match function
const match = function (str) {
if (str.indexOf('Blockly.Msg.') !== 0) return false;
assert.notStrictEqual(str.indexOf('";'), str.length - 2, `[${str}] uses double quoted string, should use single quotes.`);
if (str.indexOf("';") !== str.length - 2) return false;
return true;
}
// Extract key and value from message definition
const extract = function (str) {
str = str.split('Blockly.Msg.')[1].split(' ');
return {
key: str[0],
value: str
.splice(2, str.length)
.join(' ')
.slice(1, -2) // strip off initial ', and ending ';
.replace(/\\'/g, "'")
};
};
// Stream input and push each match to the storage object
const stream = fs.createReadStream(PATH_INPUT);
stream
.pipe(es.split('\n'))
.pipe(es.mapSync(function (str) {
if (!match(str)) return;
const result = extract(str);
storage[result.key] = result.value;
}))
.pipe(es.wait(function (err) {
if (err) throw new Error(err);
fs.writeFileSync(PATH_OUTPUT, JSON.stringify(storage, null, 4));
}));