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 |