forked from dundalek/markmap
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparse.pandoc.js
98 lines (84 loc) · 2.46 KB
/
parse.pandoc.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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
var child_process = require('child_process');
function pandocOptions(inputType) {
return {
path: process.platform === 'win32' ? 'pandoc.exe' : 'pandoc',
args: ['-f', inputType || 'markdown', '-t', 'json', '--trace']
};
}
function parseSync(text, inputType) {
var options = pandocOptions(inputType);
var result = child_process.spawnSync(options.path, options.args, {
input: text,
encoding: 'utf-8'
});
return processPandoc(result.stdout, result.stderr);
}
function parseAsync(text, inputType, callback) {
var options = pandocOptions(inputType);
var pandoc = child_process.spawn(options.path, options.args);
var stdout = collectStream(pandoc.stdout);
var stderr = collectStream(pandoc.stderr);
pandoc.on('error', function(err) {
callback(err, null);
});
pandoc.on('exit', function(code, signal) {
if(code !== 0) {
callback(code, null);
}
callback(null, processPandoc(stdout.join(''), stderr.join('')));
});
pandoc.stdin.write(text, 'utf8');
pandoc.stdin.end();
}
function collectStream(stream) {
var result = []
stream.setEncoding('utf8');
stream.on('data', function(data) {
result.push(data);
});
return result;
}
function pandocToString(tokens) {
return tokens.map(function(t) {
if (t.t === 'Str') {
return t.c;
} else if (t.t === 'Space') {
return ' ';
}
var e = new Error('Unknown pandoc token: ' + t.t);
e.token = t;
throw e;
}).join('');
}
function processPandoc(json, trace) {
var re = /(?:\n|^)line \d+: \[(?:Header|DefinitionList)/g;
var lines = trace.match(re);
var tokens = JSON.parse(json)[1];
var headings = [];
var currentDepth = 0;
for (var i = 0, j = 0; i < tokens.length; i += 1) {
if (tokens[i].t === 'Header') {
currentDepth = tokens[i].c[0]
headings.push({
depth: currentDepth,
line: parseInt(lines[j++].match(/\d+/)[0], 10)-1,
name: pandocToString(tokens[i].c[2])
});
} else if (tokens[i].t === 'DefinitionList') {
var line = parseInt(lines[j++].match(/\d+/)[0], 10)-1;
tokens[i].c.forEach(function(d) {
headings.push({
depth: currentDepth + 1,
line: line,
name: pandocToString(d[0])
});
});
}
}
return headings;
}
module.exports = parseSync;
module.exports.async = parseAsync;
module.exports.pandocOptions = pandocOptions;
module.exports.pandocToString = pandocToString;
module.exports.processPandoc = processPandoc;