commit b99a102515a9cd69d1ba7a39992353662d9e3cd1
parent ee22d2986de7e8e55fd56ffdf12f7f784a0667b2
Author: alex wennerberg <alex@alexwennerberg.com>
Date: Sat, 10 Feb 2024 15:46:03 -0500
new template system
Diffstat:
5 files changed, 70 insertions(+), 48 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -2,5 +2,5 @@
allcards.txt
*.db
*.csv
+*.tsv
.venv
-
diff --git a/buildpage.py b/buildpage.py
@@ -0,0 +1,32 @@
+import sqlite3,urllib
+from jinja2 import Environment, PackageLoader, select_autoescape
+
+con = sqlite3.connect("3cb.db")
+env = Environment(
+ loader=PackageLoader("buildpage"),
+ autoescape=select_autoescape()
+ )
+
+def card_link(card):
+ return f"https://scryfall.com/search?q={urllib.parse.quote_plus(card)}"
+
+env.filters['card_link'] = card_link
+
+def rows_to_dict(res):
+ desc = res.description
+ column_names = [col[0] for col in desc]
+ return [dict(zip(column_names, row)) for row in res.fetchall()]
+
+def export_html():
+ with open("sql/export.sql") as f:
+ query = f.read()
+ res = con.cursor().execute(query)
+ decks = rows_to_dict(res)
+ template = env.get_template("index.html")
+ print(template.render(decks=decks))
+
+if __name__ == "__main__":
+ export_html()
+
+
+
diff --git a/getdata.py b/getdata.py
@@ -110,7 +110,7 @@ def save_sheet(cur, sheet, n, final):
cur.execute("insert into deck values (?,?,?,?,?);", (n, player, clean_card(cards[0]), clean_card(cards[1]), clean_card(cards[2])))
for o, s in enumerate(row[start:end]):
cur.execute("insert into match values (?, ?, ?, ?, ?);",
- (n, group, player,players[o],s));
+ (n, group, player,players[o],int(s)));
def save_round(n, fileid):
wb = file_to_wb(fileid)
@@ -185,52 +185,6 @@ def clean_card(card_name):
return best_guess(clean)
return clean
-# TODO
-def card_link(card):
- return f"https://scryfall.com/search?q={urllib.parse.quote_plus(card)}"
-
-def export_html():
- with open("sql/export.sql") as f:
- query = f.read()
- res = con.cursor().execute(query)
- print("""<html charset='UTF-8'><head>
- <style> table { font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; width: 100%; }
- td, th { border: 1px solid #ddd; padding: 8px; }
- tr:nth-child(even){background-color: #f2f2f2;}
- tr:hover {background-color: #ddd;}
- #th {
- padding-top: 12px;
- padding-bottom: 12px;
- text-align: left;
- background-color: #04AA6D;
- color: white;
-}</style>
- </head><body><h1>3 card blind all data</h1><br>
- <table>
- <th><td>player</td><td>card_1</td><td>card 2</td>
- <td>card 3</td><td>group</td><td>score</td><td>final</td>
- </th>
- """)
- # html escape TODO
- for row in res:
- print("<tr>")
- print(f"<td>{row[0]}</td><td>{row[1]}</td>")
- for i in range(2,5):
- card = row[i]
- cardl = card_link(card)
- if row[i+3]: # TODO fix
- print(f"<td><a href='{cardl}'>{card}</a></td>")
- else:
- print(f"<td><a href='{cardl}'>{card}</a></td>")
- print(f"<td>{row[8]}</td>")
- print(f"<td>{row[9]}</td>")
- final = row[10] or ""
- print(f"<td>{final}</td>")
- print("</tr>")
- print("</table></body></html>")
-
-
-
if __name__ == "__main__":
for table in schema:
con.execute(table)
diff --git a/requirements.txt b/requirements.txt
@@ -2,3 +2,4 @@ requests
titlecase
openpyxl
Levenshtein
+jinja2
diff --git a/templates/index.html b/templates/index.html
@@ -0,0 +1,35 @@
+<html charset='UTF-8'>
+<head>
+<style>
+table { font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; width: 100%; }
+td, th { border: 1px solid #ddd; padding: 8px; }
+tr:nth-child(even){background-color: #f2f2f2;}
+tr:hover {background-color: #ddd;}
+#th { padding-top: 12px; padding-bottom: 12px; text-align: left; background-color: #04AA6D; color: white; }
+</style>
+<title>3 card bagic data analysis</title>
+<script src="sorttable.js"></script>
+</head>
+<body>
+ <h1>3 Card Blind Data Analysis</h1>
+ Full, cleaned data for <a href="//3cardmagic.org">3 card blind metashape</a>. Source code can be found <a href="//git.alexw.nyc/3cardblind">here</a>.
+ <p>Click on a header to sort by that value.</p>
+ <table class="sortable">
+ <th><td>player</td><td>card_1</td><td>card 2</td>
+ <td>card 3</td><td>group</td><td>score</td><td>final</td>
+ </th>
+ {% for deck in decks %}
+ <tr>
+ <td>{{deck.round}}</td>
+ <td>{{deck.player}}</td>
+ <td><a href="{{deck.card1|card_link}}">{{deck.card1}}</a></td>
+ <td><a href="{{deck.card2|card_link}}">{{deck.card2}}</a></td>
+ <td><a href="{{deck.card3|card_link}}">{{deck.card3}}</a></td>
+ <td>{{deck.prelim_group}}</td>
+ <td>{{deck.prelim_score}}</td>
+ <td>{{deck.final_score or ""}}</td>
+ </tr>
+ {% endfor %}
+ </table>
+</body>
+</html>