This repository has been archived by the owner on Nov 24, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 51
/
index.js
140 lines (120 loc) · 3.06 KB
/
index.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
<<<<<<< HEAD
var Promise = require('q');
var crc = require('crc');
var mjAPI = require('mathjax-node/lib/mj-single.js');
var started = false;
=======
var Q = require('q');
var fs = require('fs');
var path = require('path');
var crc = require('crc');
var exec = require('child_process').exec;
var mjAPI = require('mathjax-node/lib/mj-single.js');
var started = false;
>>>>>>> master
var countMath = 0;
var cache = {};
/**
Prepare MathJaX
*/
function prepareMathJax() {
if (started) {
return;
}
mjAPI.config({
MathJax: {
SVG: {
font: 'TeX'
}
}
});
mjAPI.start();
started = true;
}
/**
Convert a tex formula into a SVG text
@param {String} tex
@param {Object} options
@return {Promise<String>}
*/
function convertTexToSvg(tex, options) {
var d = Promise.defer();
options = options || {};
prepareMathJax();
mjAPI.typeset({
math: tex,
format: (options.inline ? 'inline-TeX' : 'TeX'),
svg: true,
speakText: true,
speakRuleset: 'mathspeak',
speakStyle: 'default',
ex: 6,
width: 100,
linebreaks: true
}, function(data) {
if (data.errors) {
return d.reject(new Error(data.errors));
}
d.resolve(options.write ? null : data.svg);
});
return d.promise;
}
/**
Process a math block
@param {Block} block
@return {Promise<props>}
*/
function processBlock(block) {
var book = this;
var tex = block.children;
var isInline = !(tex[0] == '\n');
var config = book.config.get('pluginsConfig.mathjax', {});
return Promise()
.then(function() {
// For website return as script
if ((book.output.name == 'website' || book.output.name == 'json')
&& !config.forceSVG) {
return {
isSVG: false,
content: block.children,
inline: isInline
};
}
// Get key for cache
var hashTex = crc.crc32(tex).toString(16);
// Compute SVG filename
var imgFilename = '_mathjax_' + hashTex + '.svg';
return Promise()
.then(function() {
// Check if not already cached
if (cache[hashTex]) {
return;
}
cache[hashTex] = true;
countMath = countMath + 1;
return convertTexToSvg(tex, { inline: isInline })
.then(function(svg) {
return book.output.writeFile(imgFilename, svg);
});
})
.then(function() {
return {
isSVG: true,
filename: imgFilename,
inline: isInline
};
});
});
}
module.exports = {
blocks: {
math: {
shortcuts: {
parsers: [ 'markdown', 'asciidoc' ],
start: '$$',
end: '$$'
},
process: processBlock
}
}
};