Вопрос или проблема
В тексте сообщения я получил обычный текст, а иногда мне встречался и жирный, и курсивный текст, а также текст с гиперссылками. Сейчас я могу обрабатывать жирный и курсивный текст, но не могу отобразить гиперссылку синим цветом и сделать ее кликабельной. Пожалуйста, помогите мне.
С backend я получил следующее
“body”: “Класс III\n\nУважаемые родители,\n\nПожалуйста, найдите ссылки на папку с ответами, в которой содержатся решения рабочих листов по главам для учебной программы TA 2. В дальнейшем все ключи ответов будут храниться в этой папке.\n\nСсылка: https://drive.google.com/drive/folders/1Wsf_1gUGdXUVZtfD8zgG3H1YVubXLF8V?usp=drive_link”,
код: с помощью моего кода я могу отображать жирный и курсивный текст, но мне нужен текст гиперссылки синего цвета, и он также должен быть кликабельным. Пожалуйста, помогите мне.
struct FormattedText {
static func parseMarkdown(_ input: String) -> AttributedString {
var attributedString = AttributedString(input)
let boldPattern = #"\*(.*?)\*"#
let italicPattern = #"\_(.*?)\_"#
func applyFormatting(regexPattern: String, font: Font, symbol: Character) {
if let regex = try? NSRegularExpression(pattern: regexPattern) {
let matches = regex.matches(in: input, range: NSRange(input.startIndex..., in: input))
for match in matches.reversed() {
if let range = Range(match.range, in: input) {
let rawText = String(input[range])
let formattedText = rawText.trimmingCharacters(in: CharacterSet(charactersIn: String(symbol)))
if let attributedRange = attributedString.range(of: rawText) {
attributedString.replaceSubrange(attributedRange, with: AttributedString(formattedText))
if let newRange = attributedString.range(of: formattedText) {
attributedString[newRange].font = font
}
}
}
}
}
}
applyFormatting(regexPattern: boldPattern, font: .body.bold(), symbol: "*")
applyFormatting(regexPattern: italicPattern, font: .body.italic(), symbol: "_")
return attributedString
}
}
используя это
Text(FormattedText.parseMarkdown(message.body ?? "n/a"))
Ответ или решение
Для отображения гиперссылок с определённым стилем и кликабельностью в SwiftUI, вы можете использовать Text
в сочетании с Link
для создания необходимых элементов. Ваш текущий код позволяет форматировать текст, но его необходимо доработать для обработки гиперссылок.
Ниже представлен пример решения, который показывает, как реализовать поддержку гиперссылок в вашем формате текста. Мы будем использовать регулярные выражения для извлечения гиперссылок из строки и создания кликабельного текста.
Шаг 1: Обновите ваш метод parseMarkdown
Сначала обновим ваш метод parseMarkdown
, добавив функцию для обработки гиперссылок:
struct FormattedText {
static func parseMarkdown(_ input: String) -> AttributedString {
var attributedString = AttributedString(input)
let boldPattern = #"\*(.*?)\*"#
let italicPattern = #"\_(.*?)\_"#
let linkPattern = #"<a href=\"(.*?)\".*?>(.*?)</a>"#
// Функция для применения форматирования
func applyFormatting(regexPattern: String, font: Font, symbol: Character, isLink: Bool = false) {
if let regex = try? NSRegularExpression(pattern: regexPattern) {
let matches = regex.matches(in: input, range: NSRange(input.startIndex..., in: input))
for match in matches.reversed() {
if let range = Range(match.range, in: input) {
let rawText = String(input[range])
let formattedText = rawText.trimmingCharacters(in: CharacterSet(charactersIn: String(symbol)))
if isLink {
let linkRange = rawText.range(of: "href=\"")?.upperBound
let urlRange = rawText[linkRange!...].range(of: "\"")?.lowerBound
if let url = rawText[linkRange!..<urlRange!],
let urlString = URL(string: String(url)) {
// Создаем гиперссылку
let linkText = AttributedString(formattedText)
attributedString.replaceSubrange(attributedString.range(of: rawText)!, with: linkText)
attributedString[urlString].foregroundColor = .blue
}
} else {
if let attributedRange = attributedString.range(of: rawText) {
attributedString.replaceSubrange(attributedRange, with: AttributedString(formattedText))
if let newRange = attributedString.range(of: formattedText) {
attributedString[newRange].font = font
}
}
}
}
}
}
}
applyFormatting(regexPattern: boldPattern, font: .body.bold(), symbol: "*")
applyFormatting(regexPattern: italicPattern, font: .body.italic(), symbol: "_")
applyFormatting(regexPattern: linkPattern, font: .body, symbol: " ", isLink: true)
return attributedString
}
}
Шаг 2: Отображение текста в вашем UI
Теперь вы можете отображать форматированный и кликабельный текст в вашем интерфейсе:
struct ContentView: View {
var body: some View {
let messageBody = "Class III\n\nDear Parents,\n\nPlease find the links to the answer key folder. Link: <a href=\"https://drive.google.com/drive/folders/1Wsf_1gUGdXUVZtfD8zgG3H1YVubXLF8V?usp=drive_link\" rel=\"nofollow noreferrer\">https://drive.google.com/drive/folders/1Wsf_1gUGdXUVZtfD8zgG3H1YVubXLF8V?usp=drive_link</a>."
// Отображение форматированного текста
Text(FormattedText.parseMarkdown(messageBody))
}
}
Объяснение решения
- Регулярные выражения: Мы использовали регулярные выражения для поиска и обработки жирного, курсивного текста и гиперссылок.
- Кликабельные ссылки: Наша функция
applyFormatting
содержит логику для преобразования текстовой гиперссылки в интерактивный элемент, изменяя цвет текста на синий. - Использование в SwiftUI: Мы отображаем текст при помощи
Text
, который теперь поддерживает как обычный текст, так и форматированные элементы, включая гиперссылки.
Таким образом, вы сможете показать текст с гиперссылками, который будет как кликабельным, так и стилизованным в соответствии с вашими требованиями.