js - 将markdown字符串(仅粗体和斜体)解析为文本+样式jsons数组

时间:2017-09-14 07:45:18

标签: javascript regex markdown

尝试解析javascript中包含粗体注释的字符串,标记为*multi word bold*(星号)和斜体注释,标记为_multi word italic_(下划线)。
我希望解析器函数支持多字注释,粗体斜体,斜体粗体和混合(参见示例)。

以下是一些带有所需输出示例的输入:

const simpleInput = "The *quick brown fox* jumps _over the lazy dog_";
const simpleOutput =[
    {text: 'The '},
    {text: 'quick brown fox', bold: true},
    {text: ' jumps '},
    {text: 'over the lazy dog', italic: true}
];

const italicWithinBoldInput = "The *quick brown _fox jumps_ over the* lazy dog";
const italicWithinBoldOutput =[
    {text: 'The '},
    {text: 'quick brown ', bold: true},
    {text: 'fox jumps', bold: true, italic: true},
    {text: ' over the', bold: true},
    {text: ' lazy dog'}
];

const mixedInput = "The *quick brown _fox jumps* over the_ lazy dog";
const mixedOutput =[
    {text: 'The '},
    {text: 'quick brown ', bold: true},
    {text: 'fox jumps', bold: true, italic: true},
    {text: ' over the', italic: true},
    {text: ' lazy dog'}
];

我在npm尝试了一些解析器但是一切都有点矫枉过正,没有什么是我需要的......

1 个答案:

答案 0 :(得分:3)

您可以通过以下方式执行此操作



function getObject(str){
    let bold = false, italics = false;
    let output = [];
    let text = str.split('').reduce((a, b) => {
        if(b == '*'){
            if(bold){
                if(a != ''){
                    if(italics)
                        output.push({text: a, bold: true, italics:true});
                    else
                      output.push({text: a, bold: true});
                }
                bold = false;
            }
            else{
                if(italics)
                    output.push({text: a, italics: true})
                else
                    output.push({text: a})
                bold = true;
            }
            return '';
        }
        else if(b == '_'){
            if(italics){
                if(a != ''){
                    if(bold)
                        output.push({text: a, bold: true, italics:true});
                    else
                      output.push({text: a, italics: true});
                }
                italics = false;
            }
            else{
                if(bold)
                    output.push({text: a, bold: true})
                else
                    output.push({text: a})
                italics = true;
            }
            return '';
        }
        else{
            return a+b;
        }
    }, '');
    if(text != '')
        output.push({text : text});
    console.log(output);
    return output;
}


const simpleInput = "The *quick brown fox* jumps _over the lazy dog_";

getObject(simpleInput);

const italicWithinBoldInput = "The *quick brown _fox jumps_ over the* lazy dog";

getObject(italicWithinBoldInput);

const mixedInput = "The *quick brown _fox jumps* over the_ lazy dog";

getObject(mixedInput);