Merge pull request #14 from lingting-gzm/master

 钉钉消息以及markdown基础实现
This commit is contained in:
b2baccline
2020-06-11 23:34:11 +08:00
36 changed files with 977 additions and 170 deletions

View File

@@ -0,0 +1,242 @@
package com.hccake.ballcat.common.core.markdown;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
/**
* 生成 markdown 文本
*
* @author lingting 2020/6/10 22:43
*/
public class MarkdownBuilder {
public static final String TITLE_PREFIX = "#";
public static final String QUOTE_PREFIX = "> ";
public static final String BOLD_PREFIX = "**";
public static final String ITALIC_PREFIX = "*";
public static final String UNORDERED_LIST_PREFIX = "- ";
public static final String ORDER_LIST_PREFIX = ". ";
/**
* 存放内容
*/
private final List<String> content = new ArrayList<>();
/**
* 当前操作行文本
*/
private StringBuilder lineTextBuilder;
/**
* 添加自定义内容
*
* @param content 自定义内容
* @author lingting 2020-06-10 23:14:54
*/
public MarkdownBuilder append(String content) {
lineTextBuilder.append(content);
return this;
}
/**
* 有序列表 自动生成 索引
*
* @param content 文本
* @author lingting 2020-06-10 23:13:41
*/
public MarkdownBuilder orderList(String content) {
// 获取最后一个字符串
String tmp = "";
if (this.content.size() != 0) {
tmp = this.content.get(this.content.size() - 1);
}
// 索引
int index = 1;
// 校验 是否 为有序列表行的正则
String isOrderListPattern = "^\\d\\. .*";
if (Pattern.matches(isOrderListPattern, tmp)) {
// 如果是数字开头
index = Convert.toInt(tmp.substring(0, tmp.indexOf(ORDER_LIST_PREFIX) - 1));
}
return orderList(index, content);
}
/**
* 有序列表
*
* @param index 索引
* @param content 文本
* @author lingting 2020-06-10 23:13:41
*/
public MarkdownBuilder orderList(int index, String content) {
lineBreak();
lineTextBuilder.append(index).append(ORDER_LIST_PREFIX).append(content);
return this;
}
/**
* 无序列表
* - item1
* - item2
*
* @author lingting 2020-06-10 23:09:29
*/
public MarkdownBuilder unorderedList(String content) {
// 换行
lineBreak();
lineTextBuilder.append(UNORDERED_LIST_PREFIX).append(content);
return this;
}
/**
* 图片
*
* @param url 图片链接
* @author lingting 2020-06-10 23:03:04
*/
public MarkdownBuilder pic(String url) {
return pic(StrUtil.EMPTY, url);
}
/**
* 图片
*
* @param title 图片标题
* @param url 图片路径
* @author lingting 2020-06-10 23:03:11
*/
public MarkdownBuilder pic(String title, String url) {
lineTextBuilder.append("![").append(title).append("](").append(url).append(")");
return this;
}
/**
* 链接
*
* @param title 标题
* @param url http 路径
* @author lingting 2020-06-10 23:01:15
*/
public MarkdownBuilder link(String title, String url) {
lineTextBuilder.append("[").append(title).append("](").append(url).append(")");
return this;
}
/**
* 斜体
*
* @author lingting 2020-06-10 22:59:26
*/
public MarkdownBuilder italic(String content) {
lineTextBuilder.append(ITALIC_PREFIX).append(content).append(ITALIC_PREFIX);
return this;
}
/**
* 加粗
*
* @author lingting 2020-06-10 22:58:39
*/
public MarkdownBuilder bold(String content) {
lineTextBuilder.append(BOLD_PREFIX).append(content).append(BOLD_PREFIX);
return this;
}
/**
* 引用
* > 文本
*
* @param content 文本
* @author lingting 2020-06-10 22:58:04
*/
public MarkdownBuilder quote(String content) {
forceLineBreak();
lineTextBuilder.append(QUOTE_PREFIX).append(content);
// 下面得换行两次
forceLineBreak();
forceLineBreak();
return this;
}
/**
* 强制换行
*
* @author lingting 2020-06-10 22:56:25
*/
public MarkdownBuilder forceLineBreak() {
content.add(lineTextBuilder.toString());
lineTextBuilder = new StringBuilder();
return this;
}
/**
* 换行
* 当已编辑文本长度不为0时换行
*
* @author lingting 2020-06-10 22:56:25
*/
public MarkdownBuilder lineBreak() {
if (lineTextBuilder.length() != 0) {
return forceLineBreak();
}
return this;
}
/**
* 生成 i 级标题
*
* @author lingting 2020-06-10 22:55:39
*/
private MarkdownBuilder title(int i, String content) {
lineTextBuilder = new StringBuilder();
for (int j = 0; j < i; j++) {
lineTextBuilder.append(TITLE_PREFIX);
}
this.content.add(lineTextBuilder.append(" ").append(content).toString());
lineTextBuilder = new StringBuilder();
return this;
}
public MarkdownBuilder title1(String text) {
return title(1, text);
}
public MarkdownBuilder title2(String text) {
return title(2, text);
}
public MarkdownBuilder title3(String text) {
return title(3, text);
}
public MarkdownBuilder title4(String text) {
return title(4, text);
}
public MarkdownBuilder title5(String text) {
return title(5, text);
}
@Override
public String toString() {
return build();
}
/**
* 构筑 Markdown 文本
*
* @author lingting 2020-06-11 22:55:40
*/
public String build() {
if (lineTextBuilder.length() != 0) {
// 最后一个操作的 如果不为空也需要添加进入list
content.add(lineTextBuilder.toString());
}
StringBuilder res = new StringBuilder();
content.forEach(content -> res.append(content).append("\\n"));
return res.toString();
}
}