From 5ea8a7d313eea9376231b0a997dc3b4d8e86edd0 Mon Sep 17 00:00:00 2001 From: My-Responsitories <107370289+My-Responsitories@users.noreply.github.com> Date: Wed, 16 Apr 2025 20:52:34 +0800 Subject: [PATCH] opt: remove duplicate em highlight --- lib/models/search/suggest.dart | 76 +++++++--------------------------- lib/utils/em.dart | 8 ++-- 2 files changed, 17 insertions(+), 67 deletions(-) diff --git a/lib/models/search/suggest.dart b/lib/models/search/suggest.dart index 92a4ebc8..d44a47cb 100644 --- a/lib/models/search/suggest.dart +++ b/lib/models/search/suggest.dart @@ -1,5 +1,5 @@ +import 'package:PiliPlus/utils/em.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; class SearchSuggestModel { SearchSuggestModel({ @@ -19,17 +19,10 @@ class SearchSuggestModel { } class SearchSuggestItem { - SearchSuggestItem({ - this.value, - this.term, - this.spid, - this.textRich, - }); - String? value; String? term; int? spid; - dynamic textRich; + late String textRich; SearchSuggestItem.fromJson(Map json, String inputTerm) { value = json['value']; @@ -39,57 +32,16 @@ class SearchSuggestItem { } Widget highlightText(BuildContext context, String str) { - // 创建正则表达式,匹配 ... 格式的文本 - RegExp regex = RegExp(r'(.*?)<\/em>'); - - // 用于存储每个匹配项的列表 - List children = []; - - // 获取所有匹配项 - Iterable matches = regex.allMatches(str); - - // 当前索引位置 - int currentIndex = 0; - - // 遍历每个匹配项 - for (var match in matches) { - // 获取当前匹配项之前的普通文本部分 - String normalText = str.substring(currentIndex, match.start); - - // 获取需要高亮显示的文本部分 - String highlightedText = match.group(1)!; - - // 如果普通文本部分不为空,则将其添加到 children 列表中 - if (normalText.isNotEmpty) { - children.add(TextSpan( - text: normalText, - style: DefaultTextStyle.of(Get.context!).style, - )); - } - - // 将需要高亮显示的文本部分添加到 children 列表中,并设置相应样式 - children.add(TextSpan( - text: highlightedText, - style: TextStyle( - fontWeight: FontWeight.bold, - color: Theme.of(context).colorScheme.primary), - )); - - // 更新当前索引位置 - currentIndex = match.end; - } - - // 如果当前索引位置小于文本长度,表示还有剩余的普通文本部分 - if (currentIndex < str.length) { - String remainingText = str.substring(currentIndex); - - // 将剩余的普通文本部分添加到 children 列表中 - children.add(TextSpan( - text: remainingText, - style: DefaultTextStyle.of(context).style, - )); - } - - // 使用 Text.rich 创建包含高亮显示的富文本小部件,并返回 - return Text.rich(TextSpan(children: children)); + return Text.rich(TextSpan(children: [ + for (var i in Em.regTitle(str)) + TextSpan( + text: i['text'], + style: i['type'] == 'em' + ? TextStyle( + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, + ) + : DefaultTextStyle.of(context).style, + ) + ])); } diff --git a/lib/utils/em.dart b/lib/utils/em.dart index 37da068e..0ffd9952 100644 --- a/lib/utils/em.dart +++ b/lib/utils/em.dart @@ -14,15 +14,13 @@ class Em { _exp, onMatch: (Match match) { String matchStr = match[0]!; - var map = {'type': 'em', 'text': regCate(matchStr)}; - res.add(map); + res.add({'type': 'em', 'text': regCate(matchStr)}); return matchStr; }, onNonMatch: (String str) { if (str != '') { - str = parse(str).body?.text ?? str; - var map = {'type': 'text', 'text': str}; - res.add(map); + str = decodeHtmlEntities(str); + res.add({'type': 'text', 'text': str}); } return str; },