欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實現(xiàn)富文本轉(zhuǎn)markdown

 更新時間:2023年12月08日 09:06:46   作者:路口lyne  
這篇文章主要為大家詳細(xì)介紹了如何通過Java實現(xiàn)富文本轉(zhuǎn)markdown功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以參考下

實現(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("![");
                if (element.hasAttr("alt")) {
                    sb.append(element.attr("alt"));
                }
                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設(shè)置生成帶注釋的getter和setter的圖文教程

    通常我們用idea默認(rèn)生成的getter和setter方法是不帶注釋的,當(dāng)然,我們同樣可以設(shè)置idea像MyEclipse一樣生成帶有Javadoc的模板,具體設(shè)置方法,大家參考下本文
    2018-05-05
  • 詳解如何給Sprintboot應(yīng)用添加插件機制

    詳解如何給Sprintboot應(yīng)用添加插件機制

    這篇文章主要為大家介紹了如何給 Sprintboot 應(yīng)用添加插件機制,文中有詳細(xì)的解決方案及示例代碼,具有一定的參考價值,需要的朋友可以參考下
    2023-08-08
  • SpringBoot整合ES-Elasticsearch的實例

    SpringBoot整合ES-Elasticsearch的實例

    這篇文章主要介紹了SpringBoot整合ES-Elasticsearch的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Netty分布式ByteBuf使用命中緩存的分配解析

    Netty分布式ByteBuf使用命中緩存的分配解析

    這篇文章主要為大家介紹了Netty分布式ByteBuf?使用命中緩存的分配解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • java(jdk)環(huán)境變量配置(XP、win7、win8)圖文教程詳解

    java(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é))

    讀取Java文件到byte數(shù)組的三種方法(總結(jié))

    下面小編就為大家?guī)硪黄x取Java文件到byte數(shù)組的三種方法(總結(jié))。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • Spring Junit測試找不到SpringJUnit4ClassRunner.class的解決

    Spring Junit測試找不到SpringJUnit4ClassRunner.class的解決

    這篇文章主要介紹了Spring Junit測試找不到SpringJUnit4ClassRunner.class的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java的string類為什么是不可變的

    Java的string類為什么是不可變的

    這篇文章主要介紹了Java的string類為什么是不可變的,總結(jié)了三個答案,需要的朋友可以參考下
    2014-04-04
  • MybatisPlus BaseMapper 中的方法全部 Invalid bound statement (not found Error處理)

    MybatisPlus BaseMapper 中的方法全部 Invalid bound statement (not f

    這篇文章主要介紹了MybatisPlus BaseMapper 中的方法全部 Invalid bound statement (not found)的Error處理方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Linux部署springboot項目彩色日志打印方式

    Linux部署springboot項目彩色日志打印方式

    這篇文章主要介紹了Linux部署springboot項目彩色日志打印方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評論