diff --git a/resources/cards/svg.css b/resources/cards/svg.css
new file mode 100644
index 0000000..4459fef
--- /dev/null
+++ b/resources/cards/svg.css
@@ -0,0 +1,43 @@
+ul {
+ margin: 0;
+ padding: 0;
+}
+
+li {
+ list-style-type: none;
+ display: inline-block;
+ width: 10em;
+ height: 10em;
+ padding: 0;
+ margin: 1em 0.3em;
+ overflow: hidden;
+ border: solid 1px black;
+ border-radius: 0.2em;
+}
+li:hover {
+ border-color: #888;
+ background-color: #ddf;
+}
+
+li h1 {
+ text-align: center;
+ font-size: 1em;
+ line-height: 1em;
+}
+
+img {
+ display: block;
+ max-width: 100%;
+ max-height: 6.8em;
+ width: auto;
+ height: 6.8em;
+ margin: 0 auto;
+
+ /*filter: invert(1) opacity(0.8);*/
+ filter: opacity(0.8);
+}
+
+body >h1,
+form {
+ text-align: center;
+}
diff --git a/resources/cards/svg.vm b/resources/cards/svg.vm
new file mode 100644
index 0000000..b319d78
--- /dev/null
+++ b/resources/cards/svg.vm
@@ -0,0 +1,36 @@
+
+
+
+#macro(form)
+
+#end
+
+Return to cardlist
+
+#form()
+
+Available SVGs:
+
+
+#foreach($name in $svgs)
+ -
+
$name
+
+
+#end
+
+
+#form()
+
+Return to cardlist
diff --git a/server.py b/server.py
index 384df80..1e26809 100755
--- a/server.py
+++ b/server.py
@@ -3,6 +3,7 @@ import sys, os, airspeed, glob
from sanic import Sanic, response
from common import withTemplate, withResource
import card
+import svg
import config
app = Sanic()
@@ -39,26 +40,53 @@ async def show_cards(request, template={}):
@app.post('/cards/preview')
@withTemplate("cards/card.vm")
async def preview_card(request, template={}):
- cards = [card.Card()]
-
- for key, val in request.form.items():
- if not val[0]: continue
- if type(getattr(card.Card, key)) in (tuple, list):
- setattr(cards[0], key, val)
- else:
- setattr(cards[0], key, val[0])
-
+ cards = [card.from_form(request.form)]
+ if "save" in request.form:
+ card.to_file(cards[0])
+ was_saved = True
+ if "delete" in request.form:
+ card.del_file(cards[0])
+ was_deleted = True
return response.html(template["card.vm"].merge(locals()))
-#add static files:
+@app.get("/cards/svg")
+@withTemplate("cards/svg.vm")
+async def svg_list(request, template={}):
+ svgs = svg.list_all()
+ svgs.sort()
+ return response.html(template["svg.vm"].merge(locals()))
+
+@app.post("/cards/svg")
+@withTemplate("cards/svg.vm")
+async def svg_add(request, template={}):
+ file = request.files.get("file")
+ name = request.form.get("name") or file.name
+ if name[-4:] == ".svg": name = name[:-4]
+
+ svg.store(name, file.body)
+
+ uploaded = True
+ svgs = svg.list_all()
+ return response.html(template["svg.vm"].merge(locals()))
+
+#add static resources:
for i in glob.iglob(os.path.join(config.resourcedir, "**","*"), recursive=True):
- if i.split(".")[-1] in ("html", "css", "js"):
+ filetype = i.split('.')[-1]
+ if filetype in ("html", "css", "js"):
i = os.path.relpath(i, config.resourcedir)
- print(i)
+ print("Adding static resource", repr(i))
+ if filetype == "js": filetype = "javascript"
+
@app.get(f"/{i}")
@withResource(i)
async def card_style(request, file={}):
- return response.text(tuple(file.values())[0], headers={"Content-Type": f"text/{i.split('.')[-1]}"})
+ file = tuple(file.values())[0]
+ return response.text(file, headers={"Content-Type": f"text/{filetype}"})
+
+#add svgs:
+@app.get(f"/svg/.svg")
+async def get_svg(request, name):
+ return response.text(svg.get(name), headers={"Content-Type": "image/svg+xml"})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)
diff --git a/svg.py b/svg.py
new file mode 100644
index 0000000..438c3d7
--- /dev/null
+++ b/svg.py
@@ -0,0 +1,18 @@
+import glob, os
+import config
+from common import memoize, listify_output
+
+@listify_output
+def list_all():
+ for i in glob.glob(os.path.join(config.svgdir, "*.svg")):
+ yield os.path.basename(i)[:-4]
+
+
+@memoize
+def get(name):
+ with open(os.path.join(config.svgdir, f"{name}.svg"), "r") as f:
+ return f.read()
+
+def store(name, data):
+ with open(os.path.join(config.svgdir, f"{name}.svg"), "wb" if type(data) is bytes else "w") as f:
+ return f.write(data)
diff --git a/svgs/.folder b/svgs/.folder
new file mode 100644
index 0000000..e69de29