Java實現(xiàn)富文本轉(zhuǎn)markdown
實現(xiàn)富文本即html語法轉(zhuǎn)md,要求是盡可能展示效果一樣,可以有少許誤差,另外只實現(xiàn)了html中的body轉(zhuǎn)md,其他標(biāo)簽如head等未實現(xiàn)。
大致思路是:通過jsoup工具獲取html節(jié)點,再窮舉替換。前提是熟悉html以及md語法
依賴如下:
<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.16.1</version> </dependency>
代碼如下:
import lombok.Data; import org.apache.commons.lang3.StringUtils; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.util.ArrayList; import java.util.List; public class Html2MarkdownUtil { public static void main(String[] args) { String html = "<p style=\"padding: 0; margin: 10px 0; line-height: 1.5; font-size: 16px;\"><b style=\"padding: 0; margin: 0;\">Hello<font color=\"#c24f4a\" style=\"padding: 0; margin: 0;\">world</font></b></p>"; System.out.println(parseHtml2Markdown(html)); } /** * 解析html2md * * @param html html * @return {@link String} */ public static String parseHtml2Markdown(String html) { Document doc = Jsoup.parse(html); StringBuilder sb = new StringBuilder(); for (Element element : doc.body().children()) { HtmlElement htmlElement = new HtmlElement(element); sb.append(htmlElement.getMarkdownText()); } return sb.toString(); } /** * 標(biāo)記文本 * * @param element 要素 * @return {@link String} */ public static String toMarkdownText(Element element) { StringBuilder sb = new StringBuilder(); String tagName = element.tagName().toLowerCase(); String text = element.ownText(); switch (tagName) { case "h1": sb.append("# ").append(text); break; case "h2": sb.append("## ").append(text); break; case "h3": sb.append("### ").append(text); break; case "h4": sb.append("#### ").append(text); break; case "h5": sb.append("##### ").append(text); break; case "h6": sb.append("###### ").append(text); break; case "p": case "font": case "b": case "span": sb.append(text); break; case "ul": for (Element child : element.children()) { sb.append("* ").append(child.text().trim()).append("\n"); } break; case "ol": int index = 1; for (Element child : element.children()) { sb.append(index).append(". ").append(child.text().trim()).append("\n"); index++; } break; case "a": sb.append("[").append(text).append("](").append(element.attr("href")).append(")"); break; case "strong": sb.append("**").append(text).append("**"); break; case "em": sb.append("_").append(text).append("_"); break; case "blockquote": sb.append("> ").append(text); break; case "img": sb.append(".append(element.attr("src")).append(")"); break; default: break; } return sb.toString(); } @Data public static class HtmlElement { private Element element; private String tagName; private String ownText; private boolean isNewline; private List<HtmlElement> children; public HtmlElement(Element element) { this.element = element; this.tagName = element.tagName().toLowerCase(); this.ownText = element.ownText(); this.isNewline = isNewline(); if (!StringUtils.equalsAny(this.tagName, "ul", "ol")) { Elements children = element.children(); if (children.size() > 0) { this.children = new ArrayList<>(); for (Element child : children) { this.children.add(new HtmlElement(child)); } } } } public boolean isNewline() { return StringUtils.equalsAny(tagName, "h1", "h2", "h3", "h4", "h5", "h6", "p", "ul", "ol", "blockquote"); } public String getMarkdownText() { StringBuilder sb = new StringBuilder(); sb.append(toMarkdownText(element)); if (children != null && children.size() > 0) { for (HtmlElement child : children) { sb.append(child.getMarkdownText()); } } if (isNewline) { sb.append("\n"); } return sb.toString(); } } }
到此這篇關(guān)于Java實現(xiàn)富文本轉(zhuǎn)markdown的文章就介紹到這了,更多相關(guān)Java富文本轉(zhuǎn)markdown內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA設(shè)置生成帶注釋的getter和setter的圖文教程
通常我們用idea默認(rèn)生成的getter和setter方法是不帶注釋的,當(dāng)然,我們同樣可以設(shè)置idea像MyEclipse一樣生成帶有Javadoc的模板,具體設(shè)置方法,大家參考下本文2018-05-05SpringBoot整合ES-Elasticsearch的實例
這篇文章主要介紹了SpringBoot整合ES-Elasticsearch的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05java(jdk)環(huán)境變量配置(XP、win7、win8)圖文教程詳解
對于初學(xué)java的同學(xué)來說,第一件事不是寫hello world,而是搭建好java開發(fā)環(huán)境,下載jdk,安裝,配置環(huán)境變量。這些操作在xp、win7、win8不同的操作系統(tǒng)里面配置不太一樣,下面通過本文給大家介紹如何在上面不同操作系統(tǒng)下配置2017-03-03讀取Java文件到byte數(shù)組的三種方法(總結(jié))
下面小編就為大家?guī)硪黄x取Java文件到byte數(shù)組的三種方法(總結(jié))。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08Spring Junit測試找不到SpringJUnit4ClassRunner.class的解決
這篇文章主要介紹了Spring Junit測試找不到SpringJUnit4ClassRunner.class的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04MybatisPlus BaseMapper 中的方法全部 Invalid bound statement (not f
這篇文章主要介紹了MybatisPlus BaseMapper 中的方法全部 Invalid bound statement (not found)的Error處理方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09