안드로이드 개발 팁 #48 - 마크다운 텍스트를 HTML 텍스트로 변환하고 Jsoup Document 객체로 변환하는 방법steemCreated with Sketch.

마크다운 텍스트를 HTML 텍스트로 변환하고 Jsoup Document 객체로 변환하는 방법

No. 48
23.10.05 (목) | Written by @dorian-mobileapp

시작하며…

스팀잇 포스트의 포맷은 마크다운 텍스트입니다. commonmark 라이브러리를 활용하여 이를 HTML 텍스트로 바꿀 수 있는데요. HTML의 일부 요소(element)들은 변경 또는 새로 추가해야 합니다. 각 요소를 Element 객체로 접근하는 방법을 Jsoup 라이브러리가 제공하고요. 오늘 포스트에서는 마크다운 텍스트를 HTML 텍스트로 변환 그리고 Jsoup Document 객체로 변환하는 방법에 대해 정리합니다.


필요 라이브러리

  • jsoup
  • build.gradle 파일의 dependencies 블록에 라이브러리 추가 코드 (2023. 10. 05 기준)
dependencies {
    // ...
    implementation 'org.jsoup:jsoup:1.16.1'
}

마크다운 텍스트를 HTML 텍스트로 변환하는 String 클래스의 확장 메소드

commonmark 라이브러리를 활용하여 변환된 HTML 텍스트는 Jsoup 클래스의 parse() 정적 메소드를 호출하여 Document 객체로 변환할 수 있습니다. 그런데 newline들이 화이트스페이스 문자로 변환되는 문제가 있었네요. 이것은 Document 클래스의 outputSettings(Document.OutputSettings().prettyPrint(false)) 메소드를 호출하여 해결하였습니다. (자세한 내용은 아래 코드의 링크 참조) 추가로 a 원소들의 href 속성은 링크로 연결될 URL들이지요. 이들이 URL 인코딩이 되지 않아 링크가 실행되지 않는 문제도 있었습니다. 이에 별도로 URL 인코딩을 추가 적용하였습니다.

import org.jsoup.Jsoup
import org.jsoup.nodes.Document

fun String.convertMarkdownToHtmlDocument(): Document {
    val document = Jsoup.parse(convertMarkdownToHtml()).apply {
        // to prevent changing newlines to whitespaces
        // Refer to https://stackoverflow.com/questions/40396524/avoid-removal-of-spaces-and-newline-while-parsing-html-using-jsoup
        outputSettings(Document.OutputSettings().prettyPrint(false))

        select("a").forEach {
            val hrefValue = it.attr("href")
            it.attr("href", hrefValue.applyURLEncoding())
        }
    }

    return document
}
  • String.convertMarkdownToHtml() 메소드: 링크 참고
  • String.applyURLEncoding() 메소드
fun String.applyURLEncoding(enc: String = "UTF-8"): String {
    return try {
        URLEncoder.encode(this, enc).replace("+", "%20")
    }
    catch (e: UnsupportedEncodingException) {
        e.printStackTrace()
        ""
    }
}

참고 링크


지난 안드로이드 개발 팁


Layout provided by Steemit Enhancer hommage by ayogom


Posted through the ECblog app (https://blog.etain.club)
Sort:  

안녕하세요.
SteemitKorea팀에서 제공하는 'steemit-enhancer'를 사용해 주셔서 감사합니다. 개선 사항이 있으면 언제나 저에게 연락을 주시면 되고, 관심이 있으신 분들은 https://cafe.naver.com/steemitkorea/425 에서 받아보실 수 있습니다. 사용시 @응원해 가 포함이 되며, 악용시에는 모든 서비스에서 제외될 수 있음을 알려드립니다.

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Thank you, friend!
I'm @steem.history, who is steem witness.
Thank you for witnessvoting for me.
image.png
please click it!
image.png
(Go to https://steemit.com/~witnesses and type fbslo at the bottom of the page)

The weight is reduced because of the lack of Voting Power. If you vote for me as a witness, you can get my little vote.


안녕하세요.
이 글은 SteemitKorea팀(@ayogom)님께서 저자이신 @dorian-mobileapp님을 응원하는 글입니다.
소정의 보팅을 해드렸습니다 ^^ 항상 좋은글 부탁드립니다
SteemitKorea팀에서는 보다 즐거운 steemit 생활을 위해 노력하고 있습니다.
이 글은 다음날 다시 한번 포스팅을 통해 소개 될 예정입니다. 감사합니다!

Upvoted! Thank you for supporting witness @jswit.

 2 years ago 

이제 대충 형태는 파악할 수 있는 정도가 되었습니다. 아직 제대로 이해하려면 시간이 많이 걸릴 것 같습니다. 계속 개발 글을 써주셔서 감사합니다.

Coin Marketplace

STEEM 0.08
TRX 0.30
JST 0.037
BTC 105939.26
ETH 3564.15
USDT 1.00
SBD 0.55