일모도원(日暮途遠) 개발자

[iOS개발] SwiftSoap로 \n 문자 추출하기 본문

iOS개발/iOS개발

[iOS개발] SwiftSoap로 \n 문자 추출하기

달님개발자 2023. 9. 23. 10:07

 

아라한자 앱에서 한자위에 독음을 달아주는 기능을 만들고 있는데, rb 태그에 있는 값이 \n이면 제대로 읽어오지를 못한다.

(웹뷰에 쓰는 HTML Hurigana tag가 아니라 표준 포맷은 아니다. 제대로 쓸려면 data-를 span태그안의 각 custom attribute안에 붙여야 한다...)


<span pronounce=\"천\" meaning=\"하늘 천\"><ruby><rb>天</rb><rt>천</rt></ruby></span>

<span pronounce=\"\" meaning=\"\"><ruby><rb>\n</rb><rt></rt></ruby></span>

아래와 같은 코드로 rb태그를 읽어오면 "천"은 제대로 읽어오는데, "\n"은 공백(空白, space)으로 읽어온다. 즉 " " 이 되어 버린다.

import SwiftSoup
let text = """
    <span pronounce=\"천\" meaning=\"하늘 천\"><ruby><rb>天</rb><rt>천</rt></ruby></span>
    <span pronounce=\"\" meaning=\"\"><ruby><rb>\n</rb><rt></rt></ruby></span>
    """
let doc = try SwiftSoup.parse(text)
let rbTags = try doc.select("rb")


for (_, rbTag) in rbTags.enumerated() {
  do {
    let baseText = try rbTag.html()
  } catch {
    print("Error parsing text: \(error)")
  }
}

 

챗GPT에게 물어보니 제대로 해결을 못해줘서, 구글링해보니 같은 이슈가 있었다.

.replacingOccurrences(of: "\n", with: "</br>") will fix it ;)

 

 

Cannot handle new line · Issue #77 · scinfu/SwiftSoup

Lib version: 1.4.2 Code: let string = "Text with tags: <br>new line <b>bold</b> \nnew line" let document = try SwiftSoup.parse(htmlString) print(document.text()) Output: Html text with tags: new li...

github.com

 

그래서 text에 있는 \n을 <br>로 다 바꾸어 주었다.

let newText = text.replacingOccurrences(of: "\n", with: "<br>")
let doc = try SwiftSoup.parse(newText)

 

그리고 읽어오고나서는 다시 \n로 바꾸어주어서 사용하니 잘 해결 되었다.

var baseText = try rbTag.html()
baseText = baseText.replacingOccurrences(of: "<br>", with: "\n")

 

import SwiftSoup
let text = """
    <span pronounce=\"천\" meaning=\"하늘 천\"><ruby><rb>天</rb><rt>천</rt></ruby></span>
    <span pronounce=\"\" meaning=\"\"><ruby><rb>\n</rb><rt></rt></ruby></span>
    """
let newText = text.replacingOccurrences(of: "\n", with: "<br>")
let doc = try SwiftSoup.parse(newText)    
let rbTags = try doc.select("rb")


for (_, rbTag) in rbTags.enumerated() {
  do {
    var baseText = try rbTag.html()
    baseText = baseText.replacingOccurrences(of: "<br>", with: "\n")    
  } catch {
    print("Error parsing text: \(error)")
  }
}