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
							 |