middleschool / Middle_School_Card_Search.py
Alejandro Cremades
Do not show the slash between names when only one name is available
81025f5
raw
history blame
2.61 kB
import streamlit as st
import pandas as pd
import urllib.parse
import streamlit_common.footer
def compose_scryfall_url(x: str) -> str:
return f"https://scryfall.com/search?q=prefer%3Aoldest%20!%22{urllib.parse.quote_plus(x)}%22"
def row_to_link(x: pd.DataFrame) -> None:
cardname = x["name"]
if x.name_ja is not "":
cardname = f"{cardname} / {x.name_ja}"
st.markdown(f"- [{cardname}]({x.link})")
def is_legal(cardname: str) -> list:
english_match = mslist_df[mslist_df["name"].str.lower() == cardname.lower()]
cardname_en_list = None
if english_match.shape[0] > 0:
cardname_en_list = english_match["name"].to_list()
cardname_ja_list = english_match["name_ja"].to_list()
japanese_match = mslist_df[mslist_df["name_ja"] == cardname]
if japanese_match.shape[0] > 0:
cardname_en_list = japanese_match["name"].to_list()
cardname_ja_list = japanese_match["name_ja"].to_list()
if cardname_en_list is not None and len(cardname_en_list) > 0:
return [
cardname_en_list[0] or None,
cardname_ja_list[0] or None,
]
return None
mslist_path = "output/middleschool.csv"
number_shown_results = 20
st.set_page_config(
page_title="Middle School | Card Search",
page_icon="πŸƒ",
layout="wide",
)
st.write(
"""
# Middle School Card Search
Enter any English or Japanese text to find all Middle School legal card titles which include it.
"""
)
mslist_df = pd.read_csv(mslist_path)
mslist_df.fillna("", inplace=True)
st.write(mslist_df.shape[0], "cards are legal")
name_input = st.text_input(f"Search by card name").strip()
exact_match = is_legal(name_input)
results_en_df = mslist_df[
mslist_df["name"].str.contains(name_input.lower(), case=False)
]
results_ja_df = mslist_df[
mslist_df["name_ja"].str.contains(name_input.lower(), case=False)
]
results_df = results_en_df.merge(results_ja_df, how="outer")
if name_input:
if exact_match is not None:
cardname = exact_match[0]
if exact_match[1] is not None:
cardname = f"{cardname} / {exact_match[1]}"
st.write(
f"βœ… [{cardname}]({compose_scryfall_url(exact_match[0])}) is an exact match"
)
st.write(results_df.shape[0], f'cards found by "{name_input}"')
if results_df.shape[0] > number_shown_results:
st.write(f"Top {number_shown_results} results:")
results_df["link"] = results_df["name"].apply(compose_scryfall_url)
results_df[:number_shown_results].transpose().apply(row_to_link)
streamlit_common.footer.write_footer()