Я пытаюсь связать HTML-код с помощью Dart / Flutter и получить тот же результат, что и функция Javascript, которую я уже использую.
Важно отметить, что полученный текст может быть смесью простого текста и HTML.
В основном я хотел бы преобразовать это:
<h1>Hello</h1>
Visit this link: http://www.link1.com<br />
And <strong>this</strong>:
<a href="http://www.link2.com">http://www.link2.com</a>
В это:
<h1>Hello</h1>
Visit this link: <a href="http://www.link1.com">http://www.link1.com</a><br />
And <strong>this</strong>:
<a href="http://www.link2.com">http://www.link2.com</a>
Я пробовал этот плагин, но он работает только с простым текстом: https://github.com/blossom/linkify-dart
Приведенный ниже код JavaScript работает точно так же, как и ожидалось
function linkify(text) {
var url_pattern = /(\()((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&'()*+,;=:\/?#[\]@%]+)(\))|(\[)((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&'()*+,;=:\/?#[\]@%]+)(\])|(\{)((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&'()*+,;=:\/?#[\]@%]+)(\})|(<|&(?:lt|#60|#x3c);)((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&'()*+,;=:\/?#[\]@%]+)(>|&(?:gt|#62|#x3e);)|((?:^|[^=\s'"\]])\s*['"]?|[^=\s]\s+)(\b(?:ht|f)tps?:\/\/[a-z0-9\-._~!$'()*+,;=:\/?#[\]@%]+(?:(?!&(?:gt|#0*62|#x0*3e);|&(?:amp|apos|quot|#0*3[49]|#x0*2[27]);[.!&',:?;]?(?:[^a-z0-9\-._~!$&'()*+,;=:\/?#[\]@%]|$))&[a-z0-9\-._~!$'()*+,;=:\/?#[\]@%]*)*[a-z0-9\-_~$()*+=\/#[\]@%])/img;
var url_replace = '$1$4$7$10$13<a href="$2$5$8$11$14" target="_blank">$2$5$8$11$14</a>$3$6$9$12';
return text.replace(url_pattern, url_replace);
}
function _linkify_html_callback(m0, m1, m2) {
if (m2) {
return m2;
}
return linkify(m1);
}
/**
* Original from https://github.com/jmrware/LinkifyURL
*/
function linkifyHtm() {
var text = this.replace(/&apos;/g, ''');
var section_html_pattern = /([^<]+(?:(?!<a\b)<[^<]*)*|(?:(?!<a\b)<[^<]*)+)|(<a\b[^>]*>[^<]*(?:(?!<\/a\b)<[^<]*)*<\/a\s*>)/ig;
return text.replace(section_html_pattern, _linkify_html_callback);
};