Seth Duncan
Seth Duncan

Reputation: 1300

Remove inline styles from markdown in SwiftUI

I'm pulling in JSON data and displaying it with Text in my SwiftUI App, but some of the text contains inline styles in the MD. Is there a way to remove this or even apply the styles?

Example:

if !ticket.isEmpty {
    Text(self.ticket.first?.notes.first?.prettyUpdatedString ?? "")
        .padding()
    Text(self.ticket.first?.notes.first?.mobileNoteText ?? "")
        .padding()
        .fixedSize(horizontal: false, vertical: true)
}

The prettyUpdatedString prints out "Last updated by < strong >Seth Duncan</ strong>"

Update:

In an attempt to apply this fix to the Ticket Short Detail, an exception is being thrown.

Exception   NSException *   "*** -[NSRegularExpression enumerateMatchesInString:options:range:usingBlock:]: Range or index out of bounds"   0x0000600003f06370

I'm not sure what's going on here. Any ideas?

Example of Data shortDetail is being pulled from

{
id: ID,
type: "Ticket",
lastUpdated: "2020-07-23T08:19:12Z",
shortSubject: null,
shortDetail: "broken screen - @ CEH Tina Desk",
displayClient: "STUDENT",
updateFlagType: 0,
prettyLastUpdated: "6 days ago",
latestNote: {
id: ID,
type: "TechNote",
mobileListText: "<b>S. Duncan: </b> Sent to AGI for repair.",
noteColor: "aqua",
noteClass: "bubble right"
}
},

ERROR CODE

enter image description here

Screen I'm attempting to access...short detail is below name

enter image description here

Upvotes: 0

Views: 642

Answers (1)

Pedro Cavaleiro
Pedro Cavaleiro

Reputation: 932

The trick here is to play with RegEx in my opinion, in this case I would create an function that clears the markdown

UPDATE

Based on what I understood from your comment you want to replace   with an white space not an empty string.

To archive that I just replace all occurrences of   with an space " "

.replacingOccurrences(of: "&nbsp;", with: " ")

Leaving you with this code

// original answer had an incorrect regex 
func clearMarkdown(on str: String) -> String {
    // we build markdown open and close regular expressions we ensure that they are valid
    guard let match = try? NSRegularExpression(pattern: "<[^>]+>|\\n+") else { return str }
    
    // we get the range of the string to analize, in this case the whole string
    let range = NSRange(location: 0, length: str.lengthOfBytes(using: .utf8))
    
    // we match all opening markdown
    let matches = match.matches(in: str, range: range)
    
    // we start replacing with empty strings
    return matches.reversed().reduce(into: str) { current, result in
        let range = Range(result.range, in: current)!
        current.replaceSubrange(range, with: "")
    }.replacingOccurrences(of: "&nbsp;", with: " ")
}

This function will clear all markdown stylings from your strings, but it will not format the strings, nor give you any information about the markdown taking in count your example the usage would be something like this

var str = "Last updated by < strong >Seth Duncan</ strong>"
str = clearMarkdown(on: str) // prints "Last updated by Seth Duncan" without quotes

If you require the styling to be applied the will not work but I can write something that will

UPDATE 2

After looking your problem I found out that you received a couple of strings with characters not available in the UTF-8 charset.The character in this case is which is available in ANSI while those that use UTF-8 normally use '. This being said you just need to change the charset by

// Replacing this line
let range = NSRange(location: 0, length: str.lengthOfBytes(using: .utf8))
// With
let range = NSRange(location: 0, length: str.lengthOfBytes(using: .windowsCP1254))

I'm not mistaken this is one of the most complete charsets and matches (or closely matches) the ANSI charset, you can also use .ascii that I tested and seems to work

Upvotes: 1

Related Questions