parse em html

Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-07-01 13:56:52 +08:00
parent ee770f4e2e
commit 8dd86b856f

View File

@@ -5,8 +5,26 @@ abstract final class Em {
); );
static String regCate(String origin) { static String regCate(String origin) {
Iterable<Match> matches = _exp.allMatches(origin); final matches = _exp.firstMatch(origin);
return matches.lastOrNull?.group(1) ?? origin; return matches?.group(1) ?? origin;
}
static String parseHtml(String str) {
return str.replaceAllMapped(
_htmlRegExp,
(match) => switch (match.group(1)) {
'lt' => '<',
'gt' => '>',
'quot' => '"',
'apos' => "'",
'nbsp' => ' ',
'amp' => '&',
var i? when (i.startsWith('#x')) => String.fromCharCode(
int.parse(i.substring(2), radix: 16),
),
_ => match.group(0)!,
},
);
} }
static List<({bool isEm, String text})> regTitle(String origin) { static List<({bool isEm, String text})> regTitle(String origin) {
@@ -14,30 +32,12 @@ abstract final class Em {
origin.splitMapJoin( origin.splitMapJoin(
_exp, _exp,
onMatch: (Match match) { onMatch: (Match match) {
String matchStr = match[0]!; res.add((isEm: true, text: parseHtml(match[1] ?? match[0]!)));
res.add((isEm: true, text: regCate(matchStr)));
return ''; return '';
}, },
onNonMatch: (String str) { onNonMatch: (String str) {
if (str != '') { if (str != '') {
res.add(( res.add((isEm: false, text: parseHtml(str)));
isEm: false,
text: str.replaceAllMapped(
_htmlRegExp,
(m) => switch (m.group(1)) {
'lt' => '<',
'gt' => '>',
'quot' => '"',
'apos' => "'",
'nbsp' => ' ',
'amp' => '&',
var i? when (i.startsWith('#x')) => String.fromCharCode(
int.parse(i.substring(2), radix: 16),
),
_ => m.group(0)!,
},
),
));
} }
return ''; return '';
}, },