81 lines
2.0 KiB
JavaScript
81 lines
2.0 KiB
JavaScript
|
/**
|
||
|
* @fileoverview latex 插件
|
||
|
* katex.min.js来源 https://github.com/rojer95/katex-mini
|
||
|
*/
|
||
|
const parse = require('./katex.min')
|
||
|
|
||
|
function Latex () {
|
||
|
|
||
|
}
|
||
|
|
||
|
Latex.prototype.onParse = function (node, vm) {
|
||
|
// $...$包裹的内容为latex公式
|
||
|
if (!vm.options.editable && node.type === 'text' && node.text.includes('$')) {
|
||
|
const part = node.text.split(/(\${1,2})/)
|
||
|
const children = []
|
||
|
let status = 0
|
||
|
for (let i = 0; i < part.length; i++) {
|
||
|
if (i % 2 === 0) {
|
||
|
// 文本内容
|
||
|
if (part[i]) {
|
||
|
if (status === 0) {
|
||
|
children.push({
|
||
|
type: 'text',
|
||
|
text: part[i]
|
||
|
})
|
||
|
} else {
|
||
|
if (status === 1) {
|
||
|
// 行内公式
|
||
|
const nodes = parse.default(part[i])
|
||
|
children.push({
|
||
|
name: 'span',
|
||
|
attrs: {},
|
||
|
l: 'T',
|
||
|
f: 'display:inline-block',
|
||
|
children: nodes
|
||
|
})
|
||
|
} else {
|
||
|
// 块公式
|
||
|
const nodes = parse.default(part[i], {
|
||
|
displayMode: true
|
||
|
})
|
||
|
children.push({
|
||
|
name: 'div',
|
||
|
attrs: {
|
||
|
style: 'text-align:center'
|
||
|
},
|
||
|
children: nodes
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
// 分隔符
|
||
|
if (part[i] === '$' && part[i + 2] === '$') {
|
||
|
// 行内公式
|
||
|
status = 1
|
||
|
part[i + 2] = ''
|
||
|
} else if (part[i] === '$$' && part[i + 2] === '$$') {
|
||
|
// 块公式
|
||
|
status = 2
|
||
|
part[i + 2] = ''
|
||
|
} else {
|
||
|
if (part[i] && part[i] !== '$$') {
|
||
|
// 普通$符号
|
||
|
part[i + 1] = part[i] + part[i + 1]
|
||
|
}
|
||
|
// 重置状态
|
||
|
status = 0
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
delete node.type
|
||
|
delete node.text
|
||
|
node.name = 'span'
|
||
|
node.attrs = {}
|
||
|
node.children = children
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = Latex
|