「Javascript」解析markdown为html——标题篇

在这里插入图片描述

author: 陆柒

date: 2023-03-20

classification: 计算机 . javascript

tag: Javascript, 解析, markdown, html, 格式转换, 目录跳转

1 前言

在 markodwn 解析中,标题是最简单的格式之一。简单到只需要将 “#” 符号去掉,换之 html 的标题标签即可。


2 格式分析

2.1 markdown

在 markdown 中,一条标题的格式为:

# title1
## title1.1
### title1.1.1

由此可见 markdown 中标题的格式:一方面, “#” 的个数代表了标题的级数,其中一级标题比较大,与正文字体差距较大,比较适合作为文章标题,二极标题则适合作为章节标题,三级标题适合作小节标题……以上只是我在记录笔记时的个人风格,如何使用完全看个人。

另一方面, “#” 标记与标题内容之间用空格分隔,这便给了解析以便利性。于是便有两种方法来得到对应的标题级数:

  1. 数 “#” 符号的个数,
  2. 获取第一个空格的下标。

相对来说,获取空格的下标更便捷一些,在 javascript 中,获取一个字符在字符串中第一次出现的位置只需要函数:

var str = "#### title1.1.1.1";
var level = str.indexOf(" ");

2.2 html

在 html 中,标题标记与 markdown 的标题标记有一一对应的关系,虽然格式不同,但是只需要一点简单的替换就能将 markdown 解析为html。Html 的标题格式为:

<h1>title1</h1>
<h2>
    title1.1
</h2>
<h3>
    title1.1.1
</h3>
<h2>
    title1.2
</h2>

不同标签表示不同等级的标题。


3 代码

3.1 将 markdown 解析为 html

单单将 markdown 文本解析为 html 文本的实现如下:

var str = "#### title1.1.1.1";
var level = str.indexOf(" ");
if(level==1){
    var title = str.replace(/^#+\x20/g,"");//把 # 标记和分割的空格替换掉,用正则匹配可以匹配任意多个 # ,是通用的。
    title = "<h" + level + ">" + title + "</h" + level + ">";//用 html 相同等级的标题标签包裹,可以跟上一步合写为一句
}

这里正则表达式的匹配效果如下:

在这里插入图片描述

3.2 html 可跳转目录

对于一篇比较长的文章来说,目录是十分有必要的。我希望在自己博客的文章一侧放置一个目录,点击目录就能跳转到对应标题。这需要对 html 的标题标签设置 id ,然后在 <a> 标签的 href 属性对应到标题即可实现跳转。如下:

<h1 id="title1">title1</h1>
<a href="#title1">点击跳转到title1</a>

所以我的解析 markdown 标题代码如下:

var title_content = block.replace(/^\#+\x20/g, "");
title_content = replaceSpecialstyle(title_content);
var level = block.indexOf(" ");	/* 以空格的下标判断标题的等级 */
var title = [0,0,0];// 分别记录一级、二极、三级标题的个数,
if (level == 1) {
	title[0]++;
	title[1] = title[2] = 0;// 遇到以及标题需要将二极、三级标题的个数清零。因为标题序号都是1.1、2.1.1之类
	block_html += "<div class=\"alticle-title\"><h1 id=\"_title" + title[0] + "\">" + title_content + "</h1></div><div class=\"paragraph\">";
}
else if (level == 2) {
	title[1]++;
	title[2] = 0;	// 遇到二极标题时,三级标题需要清零
	block_html += "<h2 id=\"_title" + title[0] + "-" + title[1] + "\">" + title_content + "</h2>";
}
else if (level == 3) {
	title[2]++;
	block_html += "<h3 id=\"_title" + title[0] + "-" + title[1] + "-" + title[2] + "\">" + title_content + "</h3>";
}
else {	// 对于其他更小的标题就不用跳转了
	block_html += "<h" + level + ">" + title_content + "</h" + level + ">";
}

以上。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Java中有很多库可以用来解析Markdown,其中比较流行的有CommonMark、Pegdown、Flexmark等。 以Flexmark为例,可以按照以下步骤来解析Markdown: 1. 引入Flexmark库的依赖,例如在Maven项目中可以在pom.xml文件中添加以下代码: ``` <dependency> <groupId>com.vladsch.flexmark</groupId> <artifactId>flexmark-all</artifactId> <version>0.36.8</version> </dependency> ``` 2. 编写Java代码来解析Markdown,例如: ``` import com.vladsch.flexmark.util.ast.Node; import com.vladsch.flexmark.parser.Parser; import com.vladsch.flexmark.html.HtmlRenderer; public class MarkdownParser { public static String parse(String markdown) { Parser parser = Parser.builder().build(); Node document = parser.parse(markdown); HtmlRenderer renderer = HtmlRenderer.builder().build(); return renderer.render(document); } } ``` 在上面的代码中,我们首先创建了一个Parser对象来解析Markdown文本,然后将解析得到的Node对象传递给HtmlRenderer对象来渲染成HTML格式的字符串。最终返回的就是解析后的HTML字符串。 3. 调用MarkdownParser类的parse方法来解析Markdown,例如: ``` String markdown = "## Hello, world!\n\nThis is a **Markdown** document."; String html = MarkdownParser.parse(markdown); System.out.println(html); ``` 运行上面的代码,输出的结果应该是: ``` <h2>Hello, world!</h2> <p>This is a <strong>Markdown</strong> document.</p> ``` 这就是将Markdown解析HTML的过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

武的阶乘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值