简单来说就是一款将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标题生成id
Set<Extension> headingAnchorExtensions = Collections.singleton(HeadingAnchorExtension.create());
//转换table的HTML
List<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 {
@Override
public void setAttributes(Node node, String tagName, Map<String, String> attributes) {
//改变a标签的target属性为_blank
if (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()]);
}
}
@Override
public 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.有任何问题可以发评论一起探讨 ,感谢观看。