做了个监控系统,报警消息的原文是 markdown 格式的。
如果消息发送到企业微信,就推 markdown 格式;如果发送到邮箱,就转 html;如果发短信,就要转文本。
在转文本后通过短信发送这里遇到了两个问题:
- html 转文本后,丢掉了换行,导致短信内容没有断句。
- 由于短信通道的问题,发出去的短信会丢掉所有不可见字符,包括换行、空格等。
markdown 转 html 再转 文本 再转短信的代码如下:
<!--用于 markdown 转 html-->
<dependency>
<groupId>com.atlassian.commonmark</groupId>
<artifactId>commonmark</artifactId>
<version>0.13.0</version>
</dependency>
<!--用于 html 转 text-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.3</version>
</dependency>~~~~
import org.commonmark.parser.Parser;
import org.commonmark.renderer.html.HtmlRenderer;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.safety.Whitelist;
private static final Pattern MATCH_NOT_SYMBOL_PATTERN = Pattern.compile("[0-9a-z\\u4e00-\\u9fa5]", Pattern.CASE_INSENSITIVE);
public static void main(String[] args) {
String raw = "x-checkpoint" + System.lineSeparator() +
System.lineSeparator() +
"* 第三方服务不可用 22次" + System.lineSeparator() +
System.lineSeparator() +
"##### 失败原因:" + System.lineSeparator() +
System.lineSeparator() +
"1. 巴拉巴拉小魔仙!" + System.lineSeparator() +
"2. 雨女无瓜";
// markdown 转 html
String html = HtmlRenderer
.builder()
.build()
.render(
Parser
.builder()
.build()
.parse(raw)
);
System.out.println(html);
System.out.println();
/*
<p>x-checkpoint</p>
<ul>
<li>第三方服务不可用 22次</li>
</ul>
<h5>失败原因:</h5>
<ol>
<li>巴拉巴拉小魔仙!</li>
<li>雨女无瓜</li>
</ol>
*/
// html 转文本(默认)
String temp = Jsoup.parse(html).body().text();
System.out.println(temp);
System.out.println();
/*
x-checkpoint 第三方服务不可用 22次 失败原因: 巴拉巴拉小魔仙! 雨女无瓜
*/
// html 转文本(保留换行)
String text = Jsoup.clean(html, "", Whitelist.none(), new Document.OutputSettings().prettyPrint(false));
System.out.println(text);
System.out.println();
/*
x-checkpoint
第三方服务不可用 22次
失败原因:
巴拉巴拉小魔仙!
雨女无瓜
*/
// 文本转短信
String[] lines = text.split(System.lineSeparator());
StringBuilder message = new StringBuilder();
String separator = ";";
for (String line : lines) {
line = line.trim();
// 丢弃空行
if ("".equals(line)) {
continue;
}
// 检查行尾是否是符号
String lastChar = line.substring(line.length() - 1);
boolean lastCharIsSymbol = !MATCH_NOT_SYMBOL_PATTERN.matcher(lastChar).find();
message.append(line);
// 如果行尾不是符号,追加分隔符
if (!lastCharIsSymbol) {
message.append(separator);
}
}
System.out.println(message);
/*
x-checkpoint;第三方服务不可用 22次;失败原因:巴拉巴拉小魔仙!雨女无瓜;
*/
}
关键代码:
// 此处会在 html 转 text 时保留换行~~~~
String text = Jsoup.clean(html, "", Whitelist.none(), new Document.OutputSettings().prettyPrint(false));
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于