Commit b3cfcbd0 authored by fallenstardust's avatar fallenstardust

修正嵌套括号显示不正确

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