sbfkcel / towxml

微信小程序HTML、Markdown渲染库
https://github.com/sbfkcel/towxml/wiki
2.5k stars 317 forks source link

Markdown 语法无法正常解析,会出现多余的换行 #273

Open Versus2017 opened 10 months ago

Versus2017 commented 10 months ago

我使用的是最新版本v3,我在解析长字符串时,解析成小程序的dom,会出现很多多余的换行,导致显示错乱!

要解析的原文本如下

成为律师通常需要完成以下步骤,但请注意,这些步骤可能因国家或地区而异:

1. **教育背景**:
   - 完成高中教育。
   - 获得学士学位。在某些国家,你需要完成特定的预律学课程或拥有相关领域的学士学位,如政治学、历史或法学。

2. **法学院**:
   - 参加法学院入学考试(如美国的LSAT)。
   - 获得法学院录取,并完成法学教育,通常是三年的全日制学习,获得法学博士(JD)学位。

3. **实习经验**:
   - 在法学院期间或之后,通过实习或工作,获得实际法律工作经验。

4. **通过律师资格考试**:
   - 在大多数国家和地区,你需要通过律师资格考试才能获得执业许可。在美国,这被称为律师资格考试(Bar Exam)。

5. **道德和背景审查**:
   - 通过道德品质评估和背景调查,证明你的诚信和适合从事法律职业。

6. **律师执照**:
   - 在通过考试和审查后,你将获得律师执照,可以在特定的司法管辖区内执业。

7. **持续教育**:
   - 律师通常需要参加持续法律教育课程,以保持他们的执业资格并跟上法律的变化。

8. **专业发展**:
   - 一些律师可能会选择专门化,通过额外的考试和认证来专攻某个法律领域。

9. **加入律师协会**:
   - 在某些国家,律师需要加入律师协会或律师公会,以便维护职业标准和参与职业发展活动。

请记住,这些步骤是一般性的指导,具体要求可能会根据你所在的国家或地区有所不同。如果你对特定地区的要求有疑问,最好咨询当地的律师协会或教育机构。

调用 md.render 后的结果如下

<p>成为律师通常需要完成以下步骤,但请注意,这些步骤可能因国家或地区而异:</p>
<ol>
<li>
<p><strong>教育背景</strong>:</p>
<ul>
<li>完成高中教育。</li>
<li>获得学士学位。在某些国家,你需要完成特定的预律学课程或拥有相关领域的学士学位,如政治学、历史或法学。</li>
</ul>
</li>
<li>
<p><strong>法学院</strong>:</p>
<ul>
<li>参加法学院入学考试(如美国的LSAT)。</li>
<li>获得法学院录取,并完成法学教育,通常是三年的全日制学习,获得法学博士(JD)学位。</li>
</ul>
</li>
<li>
<p><strong>实习经验</strong>:</p>
<ul>
<li>在法学院期间或之后,通过实习或工作,获得实际法律工作经验。</li>
</ul>
</li>
<li>
<p><strong>通过律师资格考试</strong>:</p>
<ul>
<li>在大多数国家和地区,你需要通过律师资格考试才能获得执业许可。在美国,这被称为律师资格考试(Bar Exam)。</li>
</ul>
</li>
<li>
<p><strong>道德和背景审查</strong>:</p>
<ul>
<li>通过道德品质评估和背景调查,证明你的诚信和适合从事法律职业。</li>
</ul>
</li>
<li>
<p><strong>律师执照</strong>:</p>
<ul>
<li>在通过考试和审查后,你将获得律师执照,可以在特定的司法管辖区内执业。</li>
</ul>
</li>
<li>
<p><strong>持续教育</strong>:</p>
<ul>
<li>律师通常需要参加持续法律教育课程,以保持他们的执业资格并跟上法律的变化。</li>
</ul>
</li>
<li>
<p><strong>专业发展</strong>:</p>
<ul>
<li>一些律师可能会选择专门化,通过额外的考试和认证来专攻某个法律领域。</li>
</ul>
</li>
<li>
<p><strong>加入律师协会</strong>:</p>
<ul>
<li>在某些国家,律师需要加入律师协会或律师公会,以便维护职业标准和参与职业发展活动。</li>
</ul>
</li>
</ol>
<p>请记住,这些步骤是一般性的指导,具体要求可能会根据你所在的国家或地区有所不同。如果你对特定地区的要求有疑问,最好咨询当地的律师协会或教育机构。</p>

最后每个节点按照如上字符串的方式出现多余换行,结果如下:

image
Versus2017 commented 10 months ago

我查看dom节点,发现有很多换行

image
Versus2017 commented 10 months ago

还请麻烦指导一下

Versus2017 commented 10 months ago

是不是应该在匹配节点末端,如 </li>,不添加换行?

Versus2017 commented 9 months ago

暂时解决了这个问题,我在解析之前过滤了 \r\n


module.exports = (str,type,option)=>{
    option = option || {};
    let result;
    switch (type) {
        case 'markdown':
            let r = md(str)
            // 添加如下代码,过滤 \r\n
            r = r.replace(/(\r|\n){1,}/g, str => {
                return new Array(str.length).join("<p>&nbsp;</p>")
            });
            r = r.replace(/\r|\n/g, str => {
                return "\r"
            });

            result = parse(r,option);
        break;
        case 'html':
            result = parse(str,option);
        break;
        default:
            throw new Error('Invalid type, only markdown and html are supported');
        break;
    };
    return result;
};
JamiLanister commented 2 months ago

暂时解决了这个问题,我在解析之前过滤了 \r\n


module.exports = (str,type,option)=>{
    option = option || {};
    let result;
    switch (type) {
        case 'markdown':
            let r = md(str)
            // 添加如下代码,过滤 \r\n
            r = r.replace(/(\r|\n){1,}/g, str => {
                return new Array(str.length).join("<p>&nbsp;</p>")
            });
            r = r.replace(/\r|\n/g, str => {
                return "\r"
            });

            result = parse(r,option);
        break;
        case 'html':
            result = parse(str,option);
        break;
        default:
            throw new Error('Invalid type, only markdown and html are supported');
        break;
    };
    return result;
};

感谢老哥 我也这么解决的,但是想问下为什么要用空p标签替换呢?