后端返回的题目数据为:
#{“type”:“para_begin”,“style”:“math_text”}#计算49+499+4999=,下面哪一种计算方法最简便( )。#{“type”:“para_end”}#
/**
* 题目的题干字段解析
* @param stem
* @returns {any[]}
*/
function getParagraph(stem) {
const pattern = /#{"type":"para_begin"[^}]*}#(.*?)#{"type":"para_end"}#/ig;
let paraList = stem.match(pattern);
const stemList = paraList.map(function (value) {
// 题干的段落个数
let stemItem = JSON.parse(value.match(/#{(.+?)}#/)[0].replace(/#/g, ''));
stemItem.children = [];
let childStem = /#{"type":"para_begin"[^}]*}#(.*?)#{"type":"para_end"}#/ig.exec(value)[1];
const list = getParagraphChild(stemItem.children, childStem);
stemItem.children = list;
return stemItem;
});
return stemList;
}
/**
* 题目的解析字段解析
* @param {Array} explain
*/
function getExplain(explainStr) {
const explain = getParagraphChild([], explainStr);
return explain;
}
/**
* 解析段落内容,返回该段落队列
* 不只是解析题干字段,还包括选项字段、解析字段等等。
* @param {Array} stemList
* @param {String} str
* @returns {Array}
*/
function getParagraphChild(stemList, str) {
var pattern = /#{(.+?)}#/g;
var match = pattern.exec(str);
// 正则匹配是否有返回值
if (!match) {
let obj = { type: 'text', text: str };
stemList.push(obj);
} else {
var index = match.index;
var lastIndex = pattern.lastIndex;
if (index !== 0) {
// 如果 index !== 0,说明 str 最前面还有一段文字
// 需要将文字添加到队列里面
const con = str.substring(0, index);
let obj = { type: 'text', text: con };
stemList.push(obj);
// 递归
getParagraphChild(stemList, str.substring(index, str.length));
} else {
var con = str.substring(0, lastIndex);
var obj = JSON.parse(con.replace(/(#)/g, ''));
if (obj.type === 'latex') {
let block = obj.content.match(/{"type":"blank".*?}\\/g);
block && block.forEach((val) => {
// obj.content = obj.content.replace(val, `left[\\right]`);
obj.content = obj.content.replace(val, `MathQuillMathField{}`);
});
}
stemList.push(obj);
if (lastIndex !== str.length) {
// 如果 lastIndex !== str.length,说明 str 未全部解析完
// 需要再递归解析 str
getParagraphChild(stemList, str.substring(lastIndex, str.length));
}
}
}
return stemList;
}
export { getParagraph, getExplain, getParagraphChild };