Commit b3cfcbd0 authored by fallenstardust's avatar fallenstardust

修正嵌套括号显示不正确

根据高亮文字设置查询关键字
parent 2cce17bd
......@@ -23,7 +23,7 @@ public class CardSearchInfo implements ICardFilter{
private int limitType;
private String limitName;
private CardSearchInfo() {
public CardSearchInfo() {
}
public int getLimitType() {
......
......@@ -31,6 +31,7 @@ import com.bm.library.PhotoView;
import com.feihua.dialogutils.util.DialogUtils;
import java.io.File;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
......@@ -38,6 +39,8 @@ import cn.garymb.ygomobile.AppsSettings;
import cn.garymb.ygomobile.Constants;
import cn.garymb.ygomobile.core.IrrlichtBridge;
import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.loader.CardKeyWord;
import cn.garymb.ygomobile.loader.CardSearchInfo;
import cn.garymb.ygomobile.loader.ImageLoader;
import cn.garymb.ygomobile.ui.activities.BaseActivity;
import cn.garymb.ygomobile.ui.adapters.BaseAdapterPlus;
......@@ -300,36 +303,88 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
}
public void setHighlightTextWithClickableSpans(String text) {
// 将卡片效果文本转换成SpannableString对象才能进行高亮操作
SpannableString spannableString = new SpannableString(text);
// 使用正则表达式查找「」和""之间的所有文本
String patternString = "(「(.*?)」|\"(.*?)\")";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
// 遍历所有匹配项并设置颜色和点击监听
while (matcher.find()) {
int startIndex = matcher.start() + 1;
int endIndex = matcher.end() - 1;
// 解析器状态
QuoteType currentQuoteType = QuoteType.NONE;
Stack<Integer> stack = new Stack<>();
int start = -1;
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
switch (currentQuoteType) {
case NONE:
if (c == '「') {
currentQuoteType = QuoteType.ANGLE_QUOTE;
start = i + 1;
stack.push(i);
} else if (c == '"') {
currentQuoteType = QuoteType.DOUBLE_QUOTE;
start = i + 1;
stack.push(i);
}
break;
case ANGLE_QUOTE:
if (c == '「') {
stack.push(i);
} else if (c == '」' && !stack.isEmpty()) {
stack.pop();
if (stack.isEmpty()) {
applySpan(spannableString, start, i, YGOUtil.c(R.color.holo_blue_bright));
currentQuoteType = QuoteType.NONE;
}
}
break;
case DOUBLE_QUOTE:
if (c == '"' && !stack.isEmpty()) {
stack.pop();
if (stack.isEmpty()) {
applySpan(spannableString, start, i, YGOUtil.c(R.color.holo_blue_bright));
currentQuoteType = QuoteType.NONE;
} else {
stack.push(i);
// 对于嵌套的情况,只增加/减少栈中的元素而不应用样式
}
}
break;
}
}
// 处理未关闭的引号对
if (!stack.isEmpty()) {
// Handle unclosed quotes error, e.g., log a warning or throw an exception
}
desc.setText(spannableString);
desc.setMovementMethod(android.text.method.LinkMovementMethod.getInstance());
}
private void applySpan(SpannableString spannableString, int start, int end, int color) {
// 设置颜色
spannableString.setSpan(new ForegroundColorSpan(Color.GREEN), startIndex, endIndex, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new ForegroundColorSpan(color), start, end, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
// 设置点击监听
spannableString.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
// 获取被点击的文本内容
String clickedText = ((TextView) widget).getText().subSequence(startIndex, endIndex).toString();
//TODO 点击搜索该关键词
String clickedText = ((TextView) widget).getText().subSequence(start, end).toString();
handleItemClick(clickedText);
}
@Override
public void updateDrawState(android.text.TextPaint ds) {
//添加下划线
// 可以在这里自定义点击状态下的样式,如去掉下划线
ds.setUnderlineText(true);
}
}, startIndex, endIndex, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
}, start, end, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
}
// 将效果文本textview设置上处理过的文本
desc.setText(spannableString);
desc.setMovementMethod(android.text.method.LinkMovementMethod.getInstance()); // 确保点击事件生效
// 处理点击事件的方法
private void handleItemClick(String clickedText) {
CardSearchInfo searchInfo = new CardSearchInfo.Builder().keyword(clickedText).build();
}
private void setCardInfo(Card cardInfo, View view) {
......@@ -666,4 +721,6 @@ public class CardDetail extends BaseAdapterPlus.BaseViewHolder {
}
}
// 定义引号类型
enum QuoteType { NONE, DOUBLE_QUOTE, ANGLE_QUOTE }
}
......@@ -23,7 +23,6 @@ import java.util.List;
import cn.garymb.ygomobile.AppsSettings;
import cn.garymb.ygomobile.lite.R;
import cn.garymb.ygomobile.loader.CardLoader;
import cn.garymb.ygomobile.loader.CardSearchInfo;
import cn.garymb.ygomobile.loader.ICardSearcher;
import cn.garymb.ygomobile.ui.adapters.SimpleSpinnerAdapter;
......@@ -32,7 +31,6 @@ import cn.garymb.ygomobile.ui.plus.DialogPlus;
import cn.garymb.ygomobile.ui.plus.VUiKit;
import ocgcore.DataManager;
import ocgcore.LimitManager;
import ocgcore.PackManager;
import ocgcore.StringManager;
import ocgcore.data.Card;
import ocgcore.data.CardSet;
......@@ -70,10 +68,9 @@ public class CardSearcher implements View.OnClickListener {
private final Button resetButton;
private final View view;
private final View layout_monster;
private final ICardSearcher dataLoader;
private final ICardSearcher mICardSearcher;
private final Context mContext;
private final Button myFavButton;
private final ICardSearcher mCardLoader;
protected StringManager mStringManager;
protected LimitManager mLimitManager;
protected AppsSettings mSettings;
......@@ -81,10 +78,10 @@ public class CardSearcher implements View.OnClickListener {
private CallBack mCallBack;
private boolean mShowFavorite;
public CardSearcher(View view, ICardSearcher dataLoader) {
public CardSearcher(View view, ICardSearcher iCardSearcher) {
this.view = view;
this.mContext = view.getContext();
this.dataLoader = dataLoader;
this.mICardSearcher = iCardSearcher;
this.mSettings = AppsSettings.get();
mStringManager = DataManager.get().getStringManager();
mLimitManager = DataManager.get().getLimitManager();
......@@ -115,7 +112,6 @@ public class CardSearcher implements View.OnClickListener {
LinkMarkerButton.setOnClickListener(this);
searchButton.setOnClickListener(this);
resetButton.setOnClickListener(this);
mCardLoader = dataLoader;
//输入即时搜索
OnEditorActionListener searchListener = (v, actionId, event) -> {
......@@ -289,7 +285,7 @@ public class CardSearcher implements View.OnClickListener {
}
if (mCallBack != null) {
VUiKit.post(() -> {
mCallBack.onSearchResult(CardFavorites.get().getCards(mCardLoader), !showList);
mCallBack.onSearchResult(CardFavorites.get().getCards(mICardSearcher), !showList);
});
}
}
......@@ -390,8 +386,8 @@ public class CardSearcher implements View.OnClickListener {
int index = -1;
int count = mLimitManager.getCount();
LimitList cur = null;
if (dataLoader != null) {
cur = dataLoader.getLimitList();
if (mICardSearcher != null) {
cur = mICardSearcher.getLimitList();
}
items.add(new SimpleSpinnerItem(0, getString(R.string.label_limitlist)));
for (int i = 0; i < count; i++) {
......@@ -566,7 +562,7 @@ public class CardSearcher implements View.OnClickListener {
}
private void search() {
if (dataLoader != null) {
if (mICardSearcher != null) {
CardSearchInfo searchInfo = new CardSearchInfo.Builder()
.keyword(text(keyWord))
.attribute(getIntSelect(attributeSpinner))
......@@ -590,14 +586,14 @@ public class CardSearcher implements View.OnClickListener {
.linkKey(lineKey)
.build();
Log.i(TAG, searchInfo.toString());
dataLoader.search(searchInfo);
mICardSearcher.search(searchInfo);
lineKey = 0;
}
}
private void resetAll() {
if (dataLoader != null) {
dataLoader.onReset();
if (mICardSearcher != null) {
mICardSearcher.onReset();
}
keyWord.setText(null);
reset(otSpinner);
......
......@@ -612,17 +612,11 @@ public class DeckManagerFragment extends BaseFragemnt implements RecyclerViewIte
private void showPackList(Card cardInfo) {
Integer idToUse = cardInfo.Alias != 0 ? cardInfo.Alias : cardInfo.Code;
Log.d("seesee", "Looking for pack with ID/Alias: " + idToUse);
// 确保再次检查 PackManager 是否已经加载完成
if (mPackManager == null) {
Log.w("seesee", "PackManager not loaded when showing pack list.");
return;
}
List<Card> packList = mPackManager.getCards(mCardLoader, idToUse);
Log.d("seesee", "Retrieved pack list: " + (packList == null ? "null" : packList.toString()));
if (packList != null) {
onSearchResult(packList, false);
} else {
......
......@@ -72,8 +72,8 @@ public class PackManager implements Closeable {
}
return packList;
}).done((list) -> {
Log.i(TAG, "Loaded " + list.size() + " files.");
Log.i(TAG, toString()); // 在异步任务完成后打印packList
Log.i(TAG, "pack: Loaded " + list.size() + " files.");
//Log.i(TAG, toString()); // 在异步任务完成后打印packList
}).fail((error) -> {
Log.e(TAG, "Error loading files: " + error.getMessage());
});
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment