简单来说就是一款将markdown编辑器生成的html转换成文本的工具。

1.第一步肯定就是导入依赖,第一个就是commonmark基本的依赖,第二个是调整标题的,第三个是调整table的。

<dependency><groupId>com.atlassian.commonmark</groupId><artifactId>commonmark</artifactId><version>0.17.0</version></dependency><dependency><groupId>com.atlassian.commonmark</groupId><artifactId>commonmark-ext-heading-anchor</artifactId><version>0.17.0</version></dependency><dependency><groupId>com.atlassian.commonmark</groupId><artifactId>commonmark-ext-gfm-tables</artifactId><version>0.17.0</version></dependency>

2.编写commonmark工具类

public class MarkdownUtils {public static String markdownToHtml(String markdown) {Parser parser = Parser.builder().build();Node document = parser.parse(markdown);HtmlRenderer renderer = HtmlRenderer.builder().build();return renderer.render(document);}public static String markdownToHtmlExtensions(String markdown) {//h标题生成idSet<Extension> headingAnchorExtensions = Collections.singleton(HeadingAnchorExtension.create());//转换table的HTMLList<Extension> tableExtension = Arrays.asList(TablesExtension.create());Parser parser = Parser.builder().extensions(tableExtension).build();Node document = parser.parse(markdown);HtmlRenderer renderer = HtmlRenderer.builder().extensions(headingAnchorExtensions).extensions(tableExtension).attributeProviderFactory(new AttributeProviderFactory() {public AttributeProvider create(AttributeProviderContext context) {return new CustomAttributeProvider();}}).build();return renderer.render(document);}static class CustomAttributeProvider implements AttributeProvider {@Overridepublic void setAttributes(Node node, String tagName, Map<String, String> attributes) {//改变a标签的target属性为_blankif (node instanceof Link) {attributes.put("target", "_blank");}if (node instanceof TableBlock) {attributes.put("class", "ui celled table");}}}
}

3.直接调用方法,简单解释一下就是从数据库收到文章信息之后,将这个文章信息转换为文本格式,但是又不希望数据库原有的数据受到改变,就使用BeanUtil将数据库的内容进行复制,在转换,return到controller层。返回到前端。BenaUtil也放到这里

public class MyBeanUtils {public static String[] getNullPropertyNames(Object source){BeanWrapper beanWrapper=new BeanWrapperImpl(source);PropertyDescriptor [] pds=beanWrapper.getPropertyDescriptors();List<String> nullPropertyNames=new ArrayList<>();for (PropertyDescriptor pd:pds){String propertyName=pd.getName();if (beanWrapper.getPropertyValue(propertyName)==null){nullPropertyNames.add(propertyName);}}return  nullPropertyNames.toArray(new String[nullPropertyNames.size()]);}
}
@Overridepublic Blog getAndConvert(Long id) {Blog blog=blogRepository.findById(id).get();if (blog==null){throw  new NotFoundException("该博客不存在");}Blog b=new Blog();BeanUtils.copyProperties(blog,b);String content=b.getContent();b.setContent(MarkdownUtils.markdownToHtmlExtensions(content));return b;}

4.前端渲染界面,使用thymelf渲染。这里要使用utext,否则会有html的文本出现。

th:utext="${blog.content}"

5.有任何问题可以发评论一起探讨 ,感谢观看。

commonmark使用教程相关推荐

  1. 【案例】下载站自动化 一个月发布3000+原创文章

    首先抱歉有几个私信没回复,我看到时已经超过时间消息不能回复. 避免这种情况,如果想私信建议随便找篇文章留言,然后说明不显示或精选.等看到一定会回复并不会放出来.恩 就是传说中的「随迟但到」. 这个所谓 ...

  2. [swift 进阶]读书笔记-第十一章:互用性 C11P1 实践:封装 CommonMark

    第十一章:互用性 Interoperability 前言: swift 的最大优点就是与C 或者 OC 混编的时候稳的一匹 本章主要讲了swift和C之间的一些知识点. 11.1 实践:封装 Comm ...

  3. 【Tools】MarkDown教程(八)-Typora使用完全手册

    00. 目录 文章目录 00. 目录 01. Markdown简介 02. Typora简介 03. Typora设置简介 04. Typora智能标点 05. Typora图片插入 06. Typo ...

  4. a pycharm 标记多个_轻松学透Markdown的终极教程 #3:Markdown标准标记语法(全)

    轻松学透Markdown的终极教程 #3: Markdown标准标记语法(全) 掌握并熟记一些常用的Markdown的标记语法,简单.有趣.实用 其实如果大家选择了一款Markdown编辑器上手的话, ...

  5. Markdown 官方教程

    Markdown 官方教程 Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,Markdown文件的后缀名便是".md". Markdown 标题 ...

  6. Mybase使用教程-不古出品

    Mybase使用教程-不古出品 Mybase使用教程 Mybase Desktop简介 使用方法.常见问题及注意事项 Mybase Desktop 基本使用方法 如何更有效运用 Mybase 软件 如 ...

  7. 轻松学透Markdown的终极教程 #5: GFM(GitHub Flavored Markdown)语法

    目录 5.1 GFM与标准的Markdown标记语法的异同 5.2 GFM语法增加的标记 5.2.1 删除线 5.2.2 自动链接 5.2.3 任务列表 5.2.4 表格 5.2.5 代码块 5.2. ...

  8. Python版本的Markdown工具:Handout使用教程!用Python代码直接排版!

    内容摘要: ---------------------------------------------------------------------------------------------- ...

  9. 【Markdown基础教程】段落分段换行详解

    写一个笔记,如果不能换行, 一直着向右打字,当然不美观了,可能都会无法打印, 这就引出了这篇文章的内容--换行 段落的详解在上一篇文章讲了段落,这篇将讲解分段 那么,肯定有人会尝试写下面这个程序 # ...

最新文章

  1. 用 Qt 给嵌入式Linux加个桌面
  2. Android面试题目整理与讲解
  3. A1035. 素数之和
  4. 关于MySQL二次安装问题
  5. 2019计算机统考word视频,2019年9月 全国计算机二级 MS Office (Word 美化文档)
  6. app式成语_疯狂的成语app
  7. Angular里使用createEmbeddedView的单步调试
  8. 计算机网络第6章(应用层)
  9. 年终将至,回顾我们一起走过的 2020
  10. 使用HtmlAgilityPack抓取网页数据
  11. 32位hex转浮点 python_python——int()、hex()、oct()、bin()、float()数值类型转换函数
  12. 【大牛系列教学】java面试常考的编程题
  13. 最优化学习笔记(五)牛顿法及拟牛顿法
  14. 神器推荐!在浏览器中运行 VS Code,随时随地写代码
  15. 2010-2014总结 ____V_V____ hello-world
  16. javaEE版eclipse设置默认编码格式为utf-8
  17. 六种复杂控制系统简述:串级、分程、比值、前馈、选择性和三冲量控制
  18. Centos 7 虚拟机启动,Entering emergency mode问题解决
  19. arcgis_随机数vb脚本
  20. 未来十年的音视频,教科书级别的Android音视频开发教程,学完我成功“挤进”了抖音音视频开发岗

热门文章

  1. Java 解析GPS芯片 的经纬度信息
  2. SC-FDMA VS OFDMA
  3. IC50、pIC50、EC50、ED50、Ki、Kd、KD、Ka、Km、Kon、Koff概念辨析
  4. 报错 java.lang.IllegalStateException: Could not load TestContextBootstrapper [null]. Specify @Bootstra
  5. GeoTrust通配符证书介绍
  6. 没有python基础直接学爬虫_只针对 Python 爬虫,该如何学习?
  7. 证券投资深度学习_深度学习在量化投资中的应用
  8. 使用NetBox实现ASP网页封装为EXE教程
  9. 在Dreamweaver中运行JSP页面
  10. DFRobot柔性非接触式液位传感器的工作原理和应用领域