markdown 转文本,并保留换行

本贴最后更新于 1659 天前,其中的信息可能已经时移世异

做了个监控系统,报警消息的原文是 markdown 格式的。

如果消息发送到企业微信,就推 markdown 格式;如果发送到邮箱,就转 html;如果发短信,就要转文本。

在转文本后通过短信发送这里遇到了两个问题:

  1. html 转文本后,丢掉了换行,导致短信内容没有断句。
  2. 由于短信通道的问题,发出去的短信会丢掉所有不可见字符,包括换行、空格等。

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));
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 453 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
LyZane
我的眼神里,是自由光。 昆明

推荐标签 标签

  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1346 回帖 • 2 关注
  • CodeMirror
    1 引用 • 2 回帖 • 111 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 149 关注
  • 996
    13 引用 • 200 回帖 • 11 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 67 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 542 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 44 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    207 引用 • 2031 回帖
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 28 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    81 引用 • 122 回帖 • 613 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    64 引用 • 120 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 127 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    76 引用 • 37 回帖
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 30 关注
  • V2Ray
    1 引用 • 15 回帖
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 170 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 484 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    3 引用 • 72 回帖
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖 • 3 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 441 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    198 引用 • 120 回帖
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 741 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 313 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    21 引用 • 140 回帖 • 26 关注
  • 安装

    你若安好,便是晴天。

    127 引用 • 1183 回帖
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 19 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖 • 2 关注