前端解析js题目

后端返回的题目数据为:

#{“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 };

猜你喜欢

转载自blog.csdn.net/qq_43031907/article/details/88312200