From 8dd86b856f28302ab885a163cc2b5e646ab65711 Mon Sep 17 00:00:00 2001 From: dom Date: Wed, 1 Jul 2026 13:56:52 +0800 Subject: [PATCH] parse em html Signed-off-by: dom --- lib/utils/em.dart | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/lib/utils/em.dart b/lib/utils/em.dart index a36094300..8e34a7dd1 100644 --- a/lib/utils/em.dart +++ b/lib/utils/em.dart @@ -5,8 +5,26 @@ abstract final class Em { ); static String regCate(String origin) { - Iterable matches = _exp.allMatches(origin); - return matches.lastOrNull?.group(1) ?? origin; + final matches = _exp.firstMatch(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) { @@ -14,30 +32,12 @@ abstract final class Em { origin.splitMapJoin( _exp, onMatch: (Match match) { - String matchStr = match[0]!; - res.add((isEm: true, text: regCate(matchStr))); + res.add((isEm: true, text: parseHtml(match[1] ?? match[0]!))); return ''; }, onNonMatch: (String str) { if (str != '') { - res.add(( - 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)!, - }, - ), - )); + res.add((isEm: false, text: parseHtml(str))); } return ''; },