File size: 6,303 Bytes
b787616
 
d9b4271
14f90e3
59718b5
ea3872d
c6564c0
59718b5
b787616
dda161c
 
b6d4315
 
dda161c
 
 
 
 
 
 
 
 
 
0b21467
c751fd4
 
0b21467
 
6085806
 
 
b6d4315
b787616
b6d4315
 
c751fd4
 
 
 
59718b5
b787616
 
8ceea03
59718b5
b787616
24d3971
 
 
dbc1992
 
 
 
24d3971
 
 
50e3646
24d3971
dc2bac2
 
 
 
 
 
 
 
 
 
dbc1992
c955f0a
dc2bac2
c955f0a
dc2bac2
c955f0a
dc2bac2
c955f0a
dc2bac2
c955f0a
dc2bac2
c955f0a
dc2bac2
21f99c2
fd1f4c2
b7f5781
 
 
 
 
 
 
 
 
 
21f99c2
b7f5781
14ce0f4
21f99c2
dbc1992
14ce0f4
dbc1992
21f99c2
 
14ce0f4
 
 
 
21f99c2
 
dbc1992
 
 
 
24d3971
 
 
dbc1992
 
 
 
24d3971
 
fd1f4c2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24d3971
0ff4e79
 
 
 
ea3872d
59718b5
ea3872d
59718b5
dda161c
59718b5
dda161c
14f90e3
dda161c
 
 
 
 
 
 
 
 
 
 
d9b4271
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import streamlit as st
import pandas as pd
import streamlit_common.footer
import streamlit_common.lib as lib
import streamlit_common.locale

mslist_path = "static/middleschool_extra_fields.csv"
_ = streamlit_common.locale.get_locale()

if "number_shown_results" not in st.session_state:
    st.session_state["number_shown_results"] = 20
if "lang" not in st.session_state:
    st.session_state["lang"] = "en"


def add_more_results():
    st.session_state["number_shown_results"] += 20


def reset_more_results():
    st.session_state["number_shown_results"] = 20


st.set_page_config(
    page_title="Middle School Tutor | Card Search",
    page_icon="favicon.ico",
    layout="wide",
)
lang = st.sidebar.radio(
    label="Language / 言語",
    options=["English", "日本語"],
    index=1 if st.session_state["lang"] == "ja" else 0,
)
st.session_state["lang"] = "ja" if lang == "日本語" else "en"
l = st.session_state["lang"]
headcol1, headcol2 = st.columns([1, 7])
headcol1.image("favicon.ico", width=80)
headcol2.write(f"# Middle School Tutor")
st.write(f'## {_["search"]["title"][l]}')
st.write(_["search"]["instructions"][l])

mslist_df = pd.read_csv(mslist_path)
mslist_df.fillna("", inplace=True)
st.write(f'**{mslist_df.shape[0]}**{_["search"]["cards_are_legal"][l]}')

results_df = mslist_df

# Filter by card name
input_name = st.text_input(
    f'**{_["search"]["search_by_card_name"][l]}**',
    placeholder=_["search"]["search_by_card_name_placeholder"][l],
).strip()
exact_match = lib.get_legal_cardnames(input_name, mslist_df)
results_en_df = results_df[results_df["name"].str.contains(input_name, case=False)]
results_ja_df = results_df[results_df["name_ja"].str.contains(input_name, case=False)]
results_df = results_en_df.merge(results_ja_df, how="outer")

# Filter by color
(
    colorcol0,
    colorcol1,
    colorcol2,
    colorcol3,
    colorcol4,
    colorcol5,
    colorcol6,
) = st.columns(7)
colorcol0.write(f'**{_["search"]["search_by_color"][l]}**')
if colorcol1.checkbox(_["basic"]["color_w"][l]):
    results_df = results_df[results_df["w"] == True]
if colorcol2.checkbox(_["basic"]["color_u"][l]):
    results_df = results_df[results_df["u"] == True]
if colorcol3.checkbox(_["basic"]["color_b"][l]):
    results_df = results_df[results_df["b"] == True]
if colorcol4.checkbox(_["basic"]["color_r"][l]):
    results_df = results_df[results_df["r"] == True]
if colorcol5.checkbox(_["basic"]["color_g"][l]):
    results_df = results_df[results_df["g"] == True]
if colorcol6.checkbox(_["basic"]["color_c"][l]):
    results_df = results_df[results_df["c"] == True]

# Filter by mana value range
min_mv = mslist_df["mv"].min()
max_mv = mslist_df["mv"].max()
mv_options = [mv for mv in range(min_mv, max_mv + 1)]
start_mv, end_mv = st.select_slider(
    f'**{_["search"]["search_by_mv"][l]}**', options=mv_options, value=(min_mv, max_mv)
)
cond1 = results_df["mv"] >= start_mv
cond2 = results_df["mv"] <= end_mv
results_df = results_df[cond1 & cond2]

# Filter by type (select)
col1, col2 = st.columns(2)
type_list = streamlit_common.locale.get_type_options()
select_types = col1.multiselect(
    f'**{_["search"]["select_type"][l]}**',
    type_list[l],
    placeholder=_["search"]["select_type_placeholder"][l],
)
for cardtype in select_types:
    type_to_search = cardtype
    if l == "ja":
        type_to_search = type_list["en"][type_list["ja"].index(cardtype)]
    results_df = results_df[results_df["type"].str.contains(type_to_search, case=False)]

# Filter by type (text input)
input_type = col2.text_input(
    f'**{_["search"]["search_by_type"][l]}**',
    placeholder=_["search"]["search_by_type_placeholder"][l],
).strip()
results_df = results_df[results_df["type"].str.contains(input_type, case=False)]

# Filter by text
input_text = st.text_input(
    f'**{_["search"]["search_by_text"][l]}**',
    placeholder=_["search"]["search_by_text_placeholder"][l],
).strip()
results_df = results_df[results_df["text"].str.contains(input_text, case=False)]

# Filter by power and toughness ranges

powtou_df = mslist_df[mslist_df["power"].isin(range(0, 100))]

min_pow = int(powtou_df["power"].min(skipna=True))
max_pow = int(powtou_df["power"].max(skipna=True))
pow_range = range(min_pow, max_pow + 1)
pow_options = [pow for pow in pow_range]
start_pow, end_pow = st.select_slider(
    f'**{_["search"]["search_by_pow"][l]}**',
    options=pow_options,
    value=(min_pow, max_pow),
)
if start_pow > min_pow or end_pow < max_pow:
    results_df = results_df[results_df["power"].isin(pow_range)]
    results_df = results_df[results_df["power"] >= start_pow]
    results_df = results_df[results_df["power"] <= end_pow]

min_tou = int(powtou_df["toughness"].min(skipna=True))
max_tou = int(powtou_df["toughness"].max(skipna=True))
tou_range = range(min_tou, max_tou + 1)
tou_options = [tou for tou in tou_range]
start_tou, end_tou = st.select_slider(
    f'**{_["search"]["search_by_tou"][l]}**',
    options=tou_options,
    value=(min_tou, max_tou),
)
if start_tou > min_tou or end_tou < max_tou:
    results_df = results_df[results_df["toughness"].isin(tou_range)]
    results_df = results_df[results_df["toughness"] >= start_tou]
    results_df = results_df[results_df["toughness"] <= end_tou]

if results_df.shape[0] < mslist_df.shape[0]:
    if exact_match[0]:
        cardname = exact_match[1]
        if exact_match[2] is not None:
            cardname = f"{cardname} / {exact_match[2]}"
        st.write(
            f'✅ [{cardname}]({lib.compose_scryfall_url(exact_match[1])}) {_["search"]["exact_match"][l]}'
        )
    st.write(f'**{results_df.shape[0]}**{_["search"]["cards_found"][l]}')
    if results_df.shape[0] > st.session_state["number_shown_results"]:
        st.write(_["search"]["top_results"][l])

    results_df["link"] = results_df["name"].apply(lib.compose_scryfall_url)
    results_df[: st.session_state["number_shown_results"]].transpose().apply(
        lib.row_to_link
    )

    if results_df.shape[0] > st.session_state["number_shown_results"]:
        st.button(label=_["search"]["see_more"][l], on_click=add_more_results)
    if st.session_state["number_shown_results"] > 20:
        st.button(
            label=_["search"]["see_20"][l],
            on_click=reset_more_results,
        )

streamlit_common.footer.write_footer()