找回密码
 立即注册
首页 资源区 代码 Java 操作 Markdown(1)--commonmark-java 使用

Java 操作 Markdown(1)--commonmark-java 使用

哈梨尔 2 小时前
commonmark-java 是一个用于解析和渲染 Markdown 文本的 Java 库;本文主要介绍其基本使用,文中所使用到的软件版本:Java 17.0.5、commonmark-java 0.25.1。
1、简介

commonmark-java 可以用来解析抽象语法树(AST),访问和操作其节点,以及生成 HTML 或 Markdown。它最初是 commonmark.js 的移植版,但后来发展成为一个可扩展的库,具备以下特点:

  • 小巧(核心没有依赖,扩展以独立的组件形式提供)
  • 快速(比曾经流行的 Markdown 库 pegdown 快 10 到 20 倍)
  • 灵活(解析后可操作 AST,定制 HTML 渲染)
  • 可扩展(支持表格、删除线、自动链接等)
commonmark-java 需要使用 Java 11 及以上版本。
2、commonmark-java 使用

2.1、样例文件

解析 Markdown 时使用该样例文件。
1.gif
2.gif
  1. ## 1 Markdown语法教程
  2. ### 1.1 标题
  3. 不同数量的`#`可以完成不同的标题,如下:
  4. # 一级标题
  5. ## 二级标题
  6. ### 三级标题
  7. ### 1.2 字体
  8. 粗体、斜体、粗体和斜体,删除线,需要在文字前后加不同的标记符号。如下:
  9. **这个是粗体**
  10. *这个是斜体*
  11. ***这个是粗体加斜体***
  12. ~~这里是删除线~~
  13. 注:如果想给字体换颜色、字体或者居中显示,需要使用内嵌HTML来实现。
  14. ### 1.3 无序列表
  15. 无序列表的使用,在符号`-`后加空格使用。如下:
  16. - 无序列表 1
  17. - 无序列表 2
  18. - 无序列表 3
  19. 如果要控制列表的层级,则需要在符号`-`前使用空格。如下:
  20. - 无序列表 1
  21. - 无序列表 2
  22.   - 无序列表 2.1
  23.   - 无序列表 2.2
  24. ### 1.4 有序列表
  25. 有序列表的使用,在数字及符号`.`后加空格后输入内容,如下:
  26. 1. 有序列表 1
  27. 2. 有序列表 2
  28. 3. 有序列表 3
  29. ### 1.5 引用
  30. 引用的格式是在符号`>`后面书写文字。如下:
  31. > 读一本好书,就是在和高尚的人谈话。 ——歌德
  32. > 雇用制度对工人不利,但工人根本无力摆脱这个制度。 ——阮一峰
  33. ### 1.7 链接
  34. 微信公众号仅支持公众号文章链接,即域名为`https://mp.weixin.qq.com/`的合法链接。使用方法如下所示:
  35. 对于该论述,欢迎读者查阅之前发过的文章,[你是《未来世界的幸存者》么?](https://mp.weixin.qq.com/s/s5IhxV2ooX3JN_X416nidA)
  36. ### 1.8 图片
  37. 插入图片,格式如下:
  38. ![这里写图片描述](https://markdown.com.cn/images/qrcode_for_gh_82cf87d482f0_258.jpg)
  39. 支持 jpg、png、gif、svg 等图片格式,**其中 svg 文件仅可在微信公众平台中使用**,svg 文件示例如下:
  40. ![](https://markdown.com.cn/images/i-am-svg.svg)
  41. 支持图片**拖拽和截图粘贴**到编辑器中。
  42. 注:支持图片 ***拖拽和截图粘贴*** 到编辑器中,仅支持 https 的图片,图片粘贴到微信时会自动上传微信服务器。
  43. ### 1.9 分割线
  44. 可以在一行中用三个以上的减号来建立一个分隔线,同时需要在分隔线的上面空一行。如下:
  45. ---
  46. ### 1.10 表格
  47. 可以使用冒号来定义表格的对齐方式,如下:
  48. | 姓名   | 年龄 |     工作 |
  49. | :----- | :--: | -------: |
  50. | 小可爱 |  18  | 吃可爱多 |
  51. | 小小勇敢 |  20  | 爬棵勇敢树 |
  52. | 小小小机智 |  22  | 看一本机智书 |
复制代码
test.md2.2、引入依赖
  1. <dependency>
  2.     <groupId>org.commonmark</groupId>
  3.     commonmark</artifactId>
  4.     <version>0.26.0</version>
  5. </dependency>
  6. <dependency>
  7.     <groupId>org.commonmark</groupId>
  8.     commonmark-ext-gfm-tables</artifactId>
  9.     <version>0.26.0</version>
  10. </dependency>
复制代码
2.3、API 方式生成 HTML 或 Markdown 文档
  1. @Test
  2. public void serialize() {
  3.     Document document = new Document();
  4.     Heading heading = new Heading();
  5.     heading.setLevel(2);
  6.     heading.appendChild(new Text("1 Markdown语法教程"));
  7.     document.appendChild(heading);
  8.     heading = new Heading();
  9.     heading.setLevel(3);
  10.     heading.appendChild(new Text("1.1 标题"));
  11.     document.appendChild(heading);
  12.     Paragraph paragraph = new Paragraph();
  13.     paragraph.appendChild(new Text("不同数量的"));
  14.     paragraph.appendChild(new Code("#"));
  15.     paragraph.appendChild(new Text("可以完成不同的标题,如下:"));
  16.     document.appendChild(paragraph);
  17.     heading = new Heading();
  18.     heading.setLevel(1);
  19.     heading.appendChild(new Text("一级标题"));
  20.     document.appendChild(heading);
  21.     heading = new Heading();
  22.     heading.setLevel(2);
  23.     heading.appendChild(new Text("二级标题"));
  24.     document.appendChild(heading);
  25.     heading = new Heading();
  26.     heading.setLevel(3);
  27.     heading.appendChild(new Text("三级标题"));
  28.     document.appendChild(heading);
  29.     heading = new Heading();
  30.     heading.setLevel(3);
  31.     heading.appendChild(new Text("1.2 字体"));
  32.     document.appendChild(heading);
  33.     paragraph = new Paragraph();
  34.     paragraph.appendChild(new Text("粗体、斜体、粗体和斜体,删除线,需要在文字前后加不同的标记符号。如下:"));
  35.     document.appendChild(paragraph);
  36.     paragraph = new Paragraph();
  37.     StrongEmphasis strongEmphasis = new StrongEmphasis();
  38.     strongEmphasis.appendChild(new Text("这个是粗体"));
  39.     paragraph.appendChild(strongEmphasis);
  40.     document.appendChild(paragraph);
  41.     paragraph = new Paragraph();
  42.     Emphasis emphasis = new Emphasis("*");
  43.     emphasis.appendChild(new Text("这个是斜体"));
  44.     paragraph.appendChild(emphasis);
  45.     document.appendChild(paragraph);
  46.     paragraph = new Paragraph();
  47.     strongEmphasis = new StrongEmphasis();
  48.     emphasis = new Emphasis("*");
  49.     emphasis.appendChild(new Text("这个是粗体加斜体"));
  50.     strongEmphasis.appendChild(emphasis);
  51.     paragraph.appendChild(strongEmphasis);
  52.     document.appendChild(paragraph);
  53.     paragraph = new Paragraph();
  54.     paragraph.appendChild(new Text("~~这里是删除线~~"));
  55.     document.appendChild(paragraph);
  56.     paragraph = new Paragraph();
  57.     paragraph.appendChild(new Text("注:如果想给字体换颜色、字体或者居中显示,需要使用内嵌HTML来实现。"));
  58.     document.appendChild(paragraph);
  59.     heading = new Heading();
  60.     heading.setLevel(3);
  61.     heading.appendChild(new Text("1.3 无序列表"));
  62.     document.appendChild(heading);
  63.     paragraph = new Paragraph();
  64.     paragraph.appendChild(new Text("无序列表的使用,在符号"));
  65.     paragraph.appendChild(new Code("-"));
  66.     paragraph.appendChild(new Text("后加空格使用。如下:"));
  67.     document.appendChild(paragraph);
  68.     BulletList bulletList = new BulletList();
  69.     ListItem listItem = new ListItem();
  70.     listItem.appendChild(new Text("无序列表 1"));
  71.     bulletList.appendChild(listItem);
  72.     bulletList.appendChild(new SoftLineBreak());
  73.     listItem = new ListItem();
  74.     listItem.appendChild(new Text("无序列表 2"));
  75.     bulletList.appendChild(listItem);
  76.     bulletList.appendChild(new SoftLineBreak());
  77.     listItem = new ListItem();
  78.     listItem.appendChild(new Text("无序列表 3"));
  79.     bulletList.appendChild(listItem);
  80.     document.appendChild(bulletList);
  81.     paragraph = new Paragraph();
  82.     paragraph.appendChild(new Text("如果要控制列表的层级,则需要在符号"));
  83.     paragraph.appendChild(new Code("-"));
  84.     paragraph.appendChild(new Text("前使用空格。如下:"));
  85.     document.appendChild(paragraph);
  86.     bulletList = new BulletList();
  87.     listItem = new ListItem();
  88.     listItem.appendChild(new Text("无序列表 1"));
  89.     bulletList.appendChild(listItem);
  90.     bulletList.appendChild(new SoftLineBreak());
  91.     listItem = new ListItem();
  92.     listItem.appendChild(new Text("无序列表 2"));
  93.     bulletList.appendChild(listItem);
  94.     bulletList.appendChild(new SoftLineBreak());
  95.     BulletList bulletList2 = new BulletList();
  96.     listItem = new ListItem();
  97.     listItem.setMarkerIndent(2);
  98.     listItem.appendChild(new Text("无序列表 2.1"));
  99.     bulletList2.appendChild(listItem);
  100.     bulletList2.appendChild(new SoftLineBreak());
  101.     listItem = new ListItem();
  102.     listItem.setMarkerIndent(2);
  103.     listItem.appendChild(new Text("无序列表 2.2"));
  104.     bulletList2.appendChild(listItem);
  105.     bulletList.appendChild(bulletList2);
  106.     document.appendChild(bulletList);
  107.     heading = new Heading();
  108.     heading.setLevel(3);
  109.     heading.appendChild(new Text("1.4 有序列表"));
  110.     document.appendChild(heading);
  111.     paragraph = new Paragraph();
  112.     paragraph.appendChild(new Text("有序列表的使用,在数字及符号"));
  113.     paragraph.appendChild(new Code("."));
  114.     paragraph.appendChild(new Text("后加空格后输入内容,如下:"));
  115.     document.appendChild(paragraph);
  116.     OrderedList orderedList = new OrderedList();
  117.     listItem = new ListItem();
  118.     listItem.appendChild(new Text("有序列表 1"));
  119.     orderedList.appendChild(listItem);
  120.     orderedList.appendChild(new SoftLineBreak());
  121.     listItem = new ListItem();
  122.     listItem.appendChild(new Text("有序列表 2"));
  123.     orderedList.appendChild(listItem);
  124.     orderedList.appendChild(new SoftLineBreak());
  125.     listItem = new ListItem();
  126.     listItem.appendChild(new Text("有序列表 3"));
  127.     orderedList.appendChild(listItem);
  128.     document.appendChild(orderedList);
  129.     heading = new Heading();
  130.     heading.setLevel(3);
  131.     heading.appendChild(new Text("1.5 引用"));
  132.     document.appendChild(heading);
  133.     paragraph = new Paragraph();
  134.     paragraph.appendChild(new Text("引用的格式是在符号"));
  135.     paragraph.appendChild(new Code(">"));
  136.     paragraph.appendChild(new Text("后面书写文字。如下:"));
  137.     document.appendChild(paragraph);
  138.     BlockQuote blockQuote = new BlockQuote();
  139.     blockQuote.appendChild(new Text("读一本好书,就是在和高尚的人谈话。 ——歌德"));
  140.     document.appendChild(blockQuote);
  141.     blockQuote = new BlockQuote();
  142.     blockQuote.appendChild(new Text("雇用制度对工人不利,但工人根本无力摆脱这个制度。 ——阮一峰"));
  143.     document.appendChild(blockQuote);
  144.     heading = new Heading();
  145.     heading.setLevel(3);
  146.     heading.appendChild(new Text("1.7 链接"));
  147.     document.appendChild(heading);
  148.     paragraph = new Paragraph();
  149.     paragraph.appendChild(new Text("微信公众号仅支持公众号文章链接,即域名为"));
  150.     paragraph.appendChild(new Code("https://mp.weixin.qq.com/"));
  151.     paragraph.appendChild(new Text("的合法链接。使用方法如下所示:"));
  152.     document.appendChild(paragraph);
  153.     paragraph = new Paragraph();
  154.     Link link = new Link("https://mp.weixin.qq.com/s/s5IhxV2ooX3JN_X416nidA", null);
  155.     link.appendChild(new Text("你是《未来世界的幸存者》么?"));
  156.     paragraph.appendChild(new Text("对于该论述,欢迎读者查阅之前发过的文章,"));
  157.     paragraph.appendChild(link);
  158.     document.appendChild(paragraph);
  159.     heading = new Heading();
  160.     heading.setLevel(3);
  161.     heading.appendChild(new Text("1.8 图片"));
  162.     document.appendChild(heading);
  163.     paragraph = new Paragraph();
  164.     paragraph.appendChild(new Text("插入图片,格式如下:"));
  165.     document.appendChild(paragraph);
  166.     paragraph = new Paragraph();
  167.     Image image = new Image("https://markdown.com.cn/images/qrcode_for_gh_82cf87d482f0_258.jpg", null);
  168.     image.appendChild(new Text("这里写图片描述"));
  169.     paragraph.appendChild(image);
  170.     document.appendChild(paragraph);
  171.     paragraph = new Paragraph();
  172.     paragraph.appendChild(new Text("支持 jpg、png、gif、svg 等图片格式,"));
  173.     emphasis = new Emphasis("**");
  174.     emphasis.appendChild(new Text("其中 svg 文件仅可在微信公众平台中使用"));
  175.     paragraph.appendChild(emphasis);
  176.     paragraph.appendChild(new Text(",svg 文件示例如下:"));
  177.     document.appendChild(paragraph);
  178.     paragraph = new Paragraph();
  179.     image = new Image("https://markdown.com.cn/images/i-am-svg.svg", null);
  180.     paragraph.appendChild(image);
  181.     document.appendChild(paragraph);
  182.     paragraph = new Paragraph();
  183.     paragraph.appendChild(new Text("支持图片"));
  184.     strongEmphasis = new StrongEmphasis();
  185.     strongEmphasis.appendChild(new Text("拖拽和截图粘贴"));
  186.     paragraph.appendChild(strongEmphasis);
  187.     paragraph.appendChild(new Text("到编辑器中。"));
  188.     document.appendChild(paragraph);
  189.     paragraph = new Paragraph();
  190.     paragraph.appendChild(new Text("注:支持图片 "));
  191.     strongEmphasis = new StrongEmphasis();
  192.     emphasis = new Emphasis("*");
  193.     emphasis.appendChild(new Text("拖拽和截图粘贴"));
  194.     strongEmphasis.appendChild(emphasis);
  195.     paragraph.appendChild(strongEmphasis);
  196.     paragraph.appendChild(new Text(" 到编辑器中,仅支持 https 的图片,图片粘贴到微信时会自动上传微信服务器。"));
  197.     document.appendChild(paragraph);
  198.     heading = new Heading();
  199.     heading.setLevel(3);
  200.     heading.appendChild(new Text("1.9 分割线"));
  201.     document.appendChild(heading);
  202.     paragraph = new Paragraph();
  203.     paragraph.appendChild(new Text("可以在一行中用三个以上的减号来建立一个分隔线,同时需要在分隔线的上面空一行。如下:"));
  204.     document.appendChild(paragraph);
  205.     ThematicBreak thematicBreak = new ThematicBreak();
  206.     thematicBreak.setLiteral("---");
  207.     document.appendChild(thematicBreak);
  208.     heading = new Heading();
  209.     heading.setLevel(3);
  210.     heading.appendChild(new Text("1.10 表格"));
  211.     document.appendChild(heading);
  212.     paragraph = new Paragraph();
  213.     paragraph.appendChild(new Text("可以使用冒号来定义表格的对齐方式,如下:"));
  214.     document.appendChild(paragraph);
  215.     TableBlock tableBlock = new TableBlock();
  216.     TableHead tableHead = new TableHead();
  217.     TableRow tableRow = new TableRow();
  218.     TableCell tableCell = new TableCell();
  219.     tableCell.appendChild(new Text("姓名"));
  220.     tableCell.setAlignment(TableCell.Alignment.LEFT);
  221.     tableRow.appendChild(tableCell);
  222.     tableCell = new TableCell();
  223.     tableCell.appendChild(new Text("年龄"));
  224.     tableCell.setAlignment(TableCell.Alignment.CENTER);
  225.     tableRow.appendChild(tableCell);
  226.     tableCell = new TableCell();
  227.     tableCell.appendChild(new Text("工作"));
  228.     tableCell.setAlignment(TableCell.Alignment.RIGHT);
  229.     tableRow.appendChild(tableCell);
  230.     tableHead.appendChild(tableRow);
  231.     TableBody tableBody = new TableBody();
  232.     tableRow = new TableRow();
  233.     tableCell = new TableCell();
  234.     tableCell.appendChild(new Text("小可爱"));
  235.     tableRow.appendChild(tableCell);
  236.     tableCell = new TableCell();
  237.     tableCell.appendChild(new Text("18"));
  238.     tableRow.appendChild(tableCell);
  239.     tableCell = new TableCell();
  240.     tableCell.appendChild(new Text("吃可爱多"));
  241.     tableRow.appendChild(tableCell);
  242.     tableBody.appendChild(tableRow);
  243.     tableRow = new TableRow();
  244.     tableCell = new TableCell();
  245.     tableCell.appendChild(new Text("小小勇敢"));
  246.     tableRow.appendChild(tableCell);
  247.     tableCell = new TableCell();
  248.     tableCell.appendChild(new Text("20"));
  249.     tableRow.appendChild(tableCell);
  250.     tableCell = new TableCell();
  251.     tableCell.appendChild(new Text("爬棵勇敢树"));
  252.     tableRow.appendChild(tableCell);
  253.     tableBody.appendChild(tableRow);
  254.     tableRow = new TableRow();
  255.     tableCell = new TableCell();
  256.     tableCell.appendChild(new Text("小小小机智"));
  257.     tableRow.appendChild(tableCell);
  258.     tableCell = new TableCell();
  259.     tableCell.appendChild(new Text("22"));
  260.     tableRow.appendChild(tableCell);
  261.     tableCell = new TableCell();
  262.     tableCell.appendChild(new Text("看一本机智书"));
  263.     tableRow.appendChild(tableCell);
  264.     tableBody.appendChild(tableRow);
  265.     tableBlock.appendChild(tableHead);
  266.     tableBlock.appendChild(tableBody);
  267.     document.appendChild(tableBlock);
  268.     List<Extension> extensions = List.of(TablesExtension.create());
  269.     MarkdownRenderer markdownRenderer = MarkdownRenderer.builder().extensions(extensions).build();
  270.     //转成markdown格式
  271.     String md = markdownRenderer.render(document);
  272.     System.out.println(md);
  273.     HtmlRenderer htmlRenderer = HtmlRenderer.builder().extensions(extensions).build();
  274.     //转成html
  275.     String html = htmlRenderer.render(document);
  276.     System.out.println(html);
  277. }
复制代码
2.4、解析 Markdown 文档
  1. @Test
  2. public void deserialize() throws IOException {
  3.     List<Extension> extensions = List.of(TablesExtension.create());
  4.     Parser parser = Parser.builder().extensions(extensions).build();
  5.     InputStreamReader reader = new InputStreamReader(CommonmarkCase.class.getClassLoader().getResourceAsStream("test.md"));
  6.     Node document = parser.parseReader(reader);
  7.     Node node = document.getFirstChild();
  8.     while (node != null) {
  9.         System.out.println(node.getClass());
  10.         if (node.getClass().equals(Heading.class)) {//处理标题
  11.             Heading heading = (Heading) node;
  12.             Text text = (Text)heading.getFirstChild();
  13.             System.out.println(text.getLiteral());
  14.         } else if (node.getClass().equals(BulletList.class)) {//处理无序列表
  15.             BulletList bulletList = (BulletList) node;
  16.             Node node2 = bulletList.getFirstChild();
  17.             while (node2 != null) {
  18.                 if (node2.getClass().equals(ListItem.class)) {
  19.                     Node node3 = node2.getFirstChild();
  20.                     if (node3.getClass().equals(Paragraph.class)) {
  21.                         Text text = (Text)node3.getFirstChild();
  22.                         System.out.println(text.getLiteral());
  23.                     }
  24.                     if (node3.getNext() != null && node3.getNext().getClass().equals(BulletList.class)) {
  25.                         System.out.println("二级无序列表");
  26.                         //TODO: 继续解析
  27.                     }
  28.                 }
  29.                 node2 = node2.getNext();
  30.             }
  31.         }
  32.         //else if  ...
  33.         node = node.getNext();
  34.     }
  35. }
复制代码
2.5、完整代码

3.gif
4.gif
  1. package com.abc.md;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.commonmark.Extension;
  4. import org.commonmark.ext.gfm.tables.*;
  5. import org.commonmark.node.*;
  6. import org.commonmark.parser.Parser;
  7. import org.commonmark.renderer.html.HtmlRenderer;
  8. import org.commonmark.renderer.markdown.MarkdownRenderer;
  9. import org.junit.Test;
  10. import java.io.IOException;
  11. import java.io.InputStreamReader;
  12. import java.util.List;
  13. @Slf4j
  14. public class CommonmarkCase {
  15.     @Test
  16.     public void serialize() {
  17.         Document document = new Document();
  18.         Heading heading = new Heading();
  19.         heading.setLevel(2);
  20.         heading.appendChild(new Text("1 Markdown语法教程"));
  21.         document.appendChild(heading);
  22.         heading = new Heading();
  23.         heading.setLevel(3);
  24.         heading.appendChild(new Text("1.1 标题"));
  25.         document.appendChild(heading);
  26.         Paragraph paragraph = new Paragraph();
  27.         paragraph.appendChild(new Text("不同数量的"));
  28.         paragraph.appendChild(new Code("#"));
  29.         paragraph.appendChild(new Text("可以完成不同的标题,如下:"));
  30.         document.appendChild(paragraph);
  31.         heading = new Heading();
  32.         heading.setLevel(1);
  33.         heading.appendChild(new Text("一级标题"));
  34.         document.appendChild(heading);
  35.         heading = new Heading();
  36.         heading.setLevel(2);
  37.         heading.appendChild(new Text("二级标题"));
  38.         document.appendChild(heading);
  39.         heading = new Heading();
  40.         heading.setLevel(3);
  41.         heading.appendChild(new Text("三级标题"));
  42.         document.appendChild(heading);
  43.         heading = new Heading();
  44.         heading.setLevel(3);
  45.         heading.appendChild(new Text("1.2 字体"));
  46.         document.appendChild(heading);
  47.         paragraph = new Paragraph();
  48.         paragraph.appendChild(new Text("粗体、斜体、粗体和斜体,删除线,需要在文字前后加不同的标记符号。如下:"));
  49.         document.appendChild(paragraph);
  50.         paragraph = new Paragraph();
  51.         StrongEmphasis strongEmphasis = new StrongEmphasis();
  52.         strongEmphasis.appendChild(new Text("这个是粗体"));
  53.         paragraph.appendChild(strongEmphasis);
  54.         document.appendChild(paragraph);
  55.         paragraph = new Paragraph();
  56.         Emphasis emphasis = new Emphasis("*");
  57.         emphasis.appendChild(new Text("这个是斜体"));
  58.         paragraph.appendChild(emphasis);
  59.         document.appendChild(paragraph);
  60.         paragraph = new Paragraph();
  61.         strongEmphasis = new StrongEmphasis();
  62.         emphasis = new Emphasis("*");
  63.         emphasis.appendChild(new Text("这个是粗体加斜体"));
  64.         strongEmphasis.appendChild(emphasis);
  65.         paragraph.appendChild(strongEmphasis);
  66.         document.appendChild(paragraph);
  67.         paragraph = new Paragraph();
  68.         paragraph.appendChild(new Text("~~这里是删除线~~"));
  69.         document.appendChild(paragraph);
  70.         paragraph = new Paragraph();
  71.         paragraph.appendChild(new Text("注:如果想给字体换颜色、字体或者居中显示,需要使用内嵌HTML来实现。"));
  72.         document.appendChild(paragraph);
  73.         heading = new Heading();
  74.         heading.setLevel(3);
  75.         heading.appendChild(new Text("1.3 无序列表"));
  76.         document.appendChild(heading);
  77.         paragraph = new Paragraph();
  78.         paragraph.appendChild(new Text("无序列表的使用,在符号"));
  79.         paragraph.appendChild(new Code("-"));
  80.         paragraph.appendChild(new Text("后加空格使用。如下:"));
  81.         document.appendChild(paragraph);
  82.         BulletList bulletList = new BulletList();
  83.         ListItem listItem = new ListItem();
  84.         listItem.appendChild(new Text("无序列表 1"));
  85.         bulletList.appendChild(listItem);
  86.         bulletList.appendChild(new SoftLineBreak());
  87.         listItem = new ListItem();
  88.         listItem.appendChild(new Text("无序列表 2"));
  89.         bulletList.appendChild(listItem);
  90.         bulletList.appendChild(new SoftLineBreak());
  91.         listItem = new ListItem();
  92.         listItem.appendChild(new Text("无序列表 3"));
  93.         bulletList.appendChild(listItem);
  94.         document.appendChild(bulletList);
  95.         paragraph = new Paragraph();
  96.         paragraph.appendChild(new Text("如果要控制列表的层级,则需要在符号"));
  97.         paragraph.appendChild(new Code("-"));
  98.         paragraph.appendChild(new Text("前使用空格。如下:"));
  99.         document.appendChild(paragraph);
  100.         bulletList = new BulletList();
  101.         listItem = new ListItem();
  102.         listItem.appendChild(new Text("无序列表 1"));
  103.         bulletList.appendChild(listItem);
  104.         bulletList.appendChild(new SoftLineBreak());
  105.         listItem = new ListItem();
  106.         listItem.appendChild(new Text("无序列表 2"));
  107.         bulletList.appendChild(listItem);
  108.         bulletList.appendChild(new SoftLineBreak());
  109.         BulletList bulletList2 = new BulletList();
  110.         listItem = new ListItem();
  111.         listItem.setMarkerIndent(2);
  112.         listItem.appendChild(new Text("无序列表 2.1"));
  113.         bulletList2.appendChild(listItem);
  114.         bulletList2.appendChild(new SoftLineBreak());
  115.         listItem = new ListItem();
  116.         listItem.setMarkerIndent(2);
  117.         listItem.appendChild(new Text("无序列表 2.2"));
  118.         bulletList2.appendChild(listItem);
  119.         bulletList.appendChild(bulletList2);
  120.         document.appendChild(bulletList);
  121.         heading = new Heading();
  122.         heading.setLevel(3);
  123.         heading.appendChild(new Text("1.4 有序列表"));
  124.         document.appendChild(heading);
  125.         paragraph = new Paragraph();
  126.         paragraph.appendChild(new Text("有序列表的使用,在数字及符号"));
  127.         paragraph.appendChild(new Code("."));
  128.         paragraph.appendChild(new Text("后加空格后输入内容,如下:"));
  129.         document.appendChild(paragraph);
  130.         OrderedList orderedList = new OrderedList();
  131.         listItem = new ListItem();
  132.         listItem.appendChild(new Text("有序列表 1"));
  133.         orderedList.appendChild(listItem);
  134.         orderedList.appendChild(new SoftLineBreak());
  135.         listItem = new ListItem();
  136.         listItem.appendChild(new Text("有序列表 2"));
  137.         orderedList.appendChild(listItem);
  138.         orderedList.appendChild(new SoftLineBreak());
  139.         listItem = new ListItem();
  140.         listItem.appendChild(new Text("有序列表 3"));
  141.         orderedList.appendChild(listItem);
  142.         document.appendChild(orderedList);
  143.         heading = new Heading();
  144.         heading.setLevel(3);
  145.         heading.appendChild(new Text("1.5 引用"));
  146.         document.appendChild(heading);
  147.         paragraph = new Paragraph();
  148.         paragraph.appendChild(new Text("引用的格式是在符号"));
  149.         paragraph.appendChild(new Code(">"));
  150.         paragraph.appendChild(new Text("后面书写文字。如下:"));
  151.         document.appendChild(paragraph);
  152.         BlockQuote blockQuote = new BlockQuote();
  153.         blockQuote.appendChild(new Text("读一本好书,就是在和高尚的人谈话。 ——歌德"));
  154.         document.appendChild(blockQuote);
  155.         blockQuote = new BlockQuote();
  156.         blockQuote.appendChild(new Text("雇用制度对工人不利,但工人根本无力摆脱这个制度。 ——阮一峰"));
  157.         document.appendChild(blockQuote);
  158.         heading = new Heading();
  159.         heading.setLevel(3);
  160.         heading.appendChild(new Text("1.7 链接"));
  161.         document.appendChild(heading);
  162.         paragraph = new Paragraph();
  163.         paragraph.appendChild(new Text("微信公众号仅支持公众号文章链接,即域名为"));
  164.         paragraph.appendChild(new Code("https://mp.weixin.qq.com/"));
  165.         paragraph.appendChild(new Text("的合法链接。使用方法如下所示:"));
  166.         document.appendChild(paragraph);
  167.         paragraph = new Paragraph();
  168.         Link link = new Link("https://mp.weixin.qq.com/s/s5IhxV2ooX3JN_X416nidA", null);
  169.         link.appendChild(new Text("你是《未来世界的幸存者》么?"));
  170.         paragraph.appendChild(new Text("对于该论述,欢迎读者查阅之前发过的文章,"));
  171.         paragraph.appendChild(link);
  172.         document.appendChild(paragraph);
  173.         heading = new Heading();
  174.         heading.setLevel(3);
  175.         heading.appendChild(new Text("1.8 图片"));
  176.         document.appendChild(heading);
  177.         paragraph = new Paragraph();
  178.         paragraph.appendChild(new Text("插入图片,格式如下:"));
  179.         document.appendChild(paragraph);
  180.         paragraph = new Paragraph();
  181.         Image image = new Image("https://markdown.com.cn/images/qrcode_for_gh_82cf87d482f0_258.jpg", null);
  182.         image.appendChild(new Text("这里写图片描述"));
  183.         paragraph.appendChild(image);
  184.         document.appendChild(paragraph);
  185.         paragraph = new Paragraph();
  186.         paragraph.appendChild(new Text("支持 jpg、png、gif、svg 等图片格式,"));
  187.         emphasis = new Emphasis("**");
  188.         emphasis.appendChild(new Text("其中 svg 文件仅可在微信公众平台中使用"));
  189.         paragraph.appendChild(emphasis);
  190.         paragraph.appendChild(new Text(",svg 文件示例如下:"));
  191.         document.appendChild(paragraph);
  192.         paragraph = new Paragraph();
  193.         image = new Image("https://markdown.com.cn/images/i-am-svg.svg", null);
  194.         paragraph.appendChild(image);
  195.         document.appendChild(paragraph);
  196.         paragraph = new Paragraph();
  197.         paragraph.appendChild(new Text("支持图片"));
  198.         strongEmphasis = new StrongEmphasis();
  199.         strongEmphasis.appendChild(new Text("拖拽和截图粘贴"));
  200.         paragraph.appendChild(strongEmphasis);
  201.         paragraph.appendChild(new Text("到编辑器中。"));
  202.         document.appendChild(paragraph);
  203.         paragraph = new Paragraph();
  204.         paragraph.appendChild(new Text("注:支持图片 "));
  205.         strongEmphasis = new StrongEmphasis();
  206.         emphasis = new Emphasis("*");
  207.         emphasis.appendChild(new Text("拖拽和截图粘贴"));
  208.         strongEmphasis.appendChild(emphasis);
  209.         paragraph.appendChild(strongEmphasis);
  210.         paragraph.appendChild(new Text(" 到编辑器中,仅支持 https 的图片,图片粘贴到微信时会自动上传微信服务器。"));
  211.         document.appendChild(paragraph);
  212.         heading = new Heading();
  213.         heading.setLevel(3);
  214.         heading.appendChild(new Text("1.9 分割线"));
  215.         document.appendChild(heading);
  216.         paragraph = new Paragraph();
  217.         paragraph.appendChild(new Text("可以在一行中用三个以上的减号来建立一个分隔线,同时需要在分隔线的上面空一行。如下:"));
  218.         document.appendChild(paragraph);
  219.         ThematicBreak thematicBreak = new ThematicBreak();
  220.         thematicBreak.setLiteral("---");
  221.         document.appendChild(thematicBreak);
  222.         heading = new Heading();
  223.         heading.setLevel(3);
  224.         heading.appendChild(new Text("1.10 表格"));
  225.         document.appendChild(heading);
  226.         paragraph = new Paragraph();
  227.         paragraph.appendChild(new Text("可以使用冒号来定义表格的对齐方式,如下:"));
  228.         document.appendChild(paragraph);
  229.         TableBlock tableBlock = new TableBlock();
  230.         TableHead tableHead = new TableHead();
  231.         TableRow tableRow = new TableRow();
  232.         TableCell tableCell = new TableCell();
  233.         tableCell.appendChild(new Text("姓名"));
  234.         tableCell.setAlignment(TableCell.Alignment.LEFT);
  235.         tableRow.appendChild(tableCell);
  236.         tableCell = new TableCell();
  237.         tableCell.appendChild(new Text("年龄"));
  238.         tableCell.setAlignment(TableCell.Alignment.CENTER);
  239.         tableRow.appendChild(tableCell);
  240.         tableCell = new TableCell();
  241.         tableCell.appendChild(new Text("工作"));
  242.         tableCell.setAlignment(TableCell.Alignment.RIGHT);
  243.         tableRow.appendChild(tableCell);
  244.         tableHead.appendChild(tableRow);
  245.         TableBody tableBody = new TableBody();
  246.         tableRow = new TableRow();
  247.         tableCell = new TableCell();
  248.         tableCell.appendChild(new Text("小可爱"));
  249.         tableRow.appendChild(tableCell);
  250.         tableCell = new TableCell();
  251.         tableCell.appendChild(new Text("18"));
  252.         tableRow.appendChild(tableCell);
  253.         tableCell = new TableCell();
  254.         tableCell.appendChild(new Text("吃可爱多"));
  255.         tableRow.appendChild(tableCell);
  256.         tableBody.appendChild(tableRow);
  257.         tableRow = new TableRow();
  258.         tableCell = new TableCell();
  259.         tableCell.appendChild(new Text("小小勇敢"));
  260.         tableRow.appendChild(tableCell);
  261.         tableCell = new TableCell();
  262.         tableCell.appendChild(new Text("20"));
  263.         tableRow.appendChild(tableCell);
  264.         tableCell = new TableCell();
  265.         tableCell.appendChild(new Text("爬棵勇敢树"));
  266.         tableRow.appendChild(tableCell);
  267.         tableBody.appendChild(tableRow);
  268.         tableRow = new TableRow();
  269.         tableCell = new TableCell();
  270.         tableCell.appendChild(new Text("小小小机智"));
  271.         tableRow.appendChild(tableCell);
  272.         tableCell = new TableCell();
  273.         tableCell.appendChild(new Text("22"));
  274.         tableRow.appendChild(tableCell);
  275.         tableCell = new TableCell();
  276.         tableCell.appendChild(new Text("看一本机智书"));
  277.         tableRow.appendChild(tableCell);
  278.         tableBody.appendChild(tableRow);
  279.         tableBlock.appendChild(tableHead);
  280.         tableBlock.appendChild(tableBody);
  281.         document.appendChild(tableBlock);
  282.         List<Extension> extensions = List.of(TablesExtension.create());
  283.         MarkdownRenderer markdownRenderer = MarkdownRenderer.builder().extensions(extensions).build();
  284.         //转成markdown格式
  285.         String md = markdownRenderer.render(document);
  286.         System.out.println(md);
  287.         HtmlRenderer htmlRenderer = HtmlRenderer.builder().extensions(extensions).build();
  288.         //转成html
  289.         String html = htmlRenderer.render(document);
  290.         System.out.println(html);
  291.     }
  292.     @Test
  293.     public void deserialize() throws IOException {
  294.         List<Extension> extensions = List.of(TablesExtension.create());
  295.         Parser parser = Parser.builder().extensions(extensions).build();
  296.         InputStreamReader reader = new InputStreamReader(CommonmarkCase.class.getClassLoader().getResourceAsStream("test.md"));
  297.         Node document = parser.parseReader(reader);
  298.         Node node = document.getFirstChild();
  299.         while (node != null) {
  300.             System.out.println(node.getClass());
  301.             if (node.getClass().equals(Heading.class)) {//处理标题
  302.                 Heading heading = (Heading) node;
  303.                 Text text = (Text)heading.getFirstChild();
  304.                 System.out.println(text.getLiteral());
  305.             } else if (node.getClass().equals(BulletList.class)) {//处理无序列表
  306.                 BulletList bulletList = (BulletList) node;
  307.                 Node node2 = bulletList.getFirstChild();
  308.                 while (node2 != null) {
  309.                     if (node2.getClass().equals(ListItem.class)) {
  310.                         Node node3 = node2.getFirstChild();
  311.                         if (node3.getClass().equals(Paragraph.class)) {
  312.                             Text text = (Text)node3.getFirstChild();
  313.                             System.out.println(text.getLiteral());
  314.                         }
  315.                         if (node3.getNext() != null && node3.getNext().getClass().equals(BulletList.class)) {
  316.                             System.out.println("二级无序列表");
  317.                             //TODO: 继续解析
  318.                         }
  319.                     }
  320.                     node2 = node2.getNext();
  321.                 }
  322.             }
  323.             //else if  ...
  324.             node = node.getNext();
  325.         }
  326.     }
  327. }
复制代码
CommonmarkCase.java 
 
 
参考:https://github.com/commonmark/commonmark-java。
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册