diff --git a/colorscheme.py b/colorscheme.py
new file mode 100644
index 0000000..55ba4c1
--- /dev/null
+++ b/colorscheme.py
@@ -0,0 +1,59 @@
+import glob, os
+from common import Model, wrap_output
+import config
+
+class ColorScheme(Model):
+ filename = ""
+ border = "4a4a4a"
+ card_bg = "4a4a4a"
+ main_bg = "ddd"
+ main = "000"
+ header = "ddd"
+ header_bg = "111"
+ figure = "aaa"
+ figure_bg = "2a2a2a"
+ costbar = "eee"
+ costbar_bg = "111"
+
+def get(filename):
+ if not filename:
+ return ColorScheme()
+ with open(os.path.join(config.colordir, f"{filename}.yaml"), "r") as f:
+ return from_yaml(f.read(), filename=filename)
+def store(colorscheme):
+ assert colorscheme.filename, "no filename set"
+
+ with open(os.path.join(config.colordir, f"{filename}.yaml"), "w") as f:
+ f.write(to_yaml(colorscheme))
+def delete(filename):
+ if type(filename) is ColorScheme:
+ assert filename.filename, "no filename set"
+ filename = filename.filename
+ os.remove(os.path.join(config.colordir, f"{filename}.yaml"))
+
+@wrap_output(list)
+def list_all():
+ yield ColorScheme()
+ for i in glob.glob(os.path.join(config.colordir, "*.yaml")):
+ yield get(os.path.basename(i)[:-5])
+
+def from_yaml(data, filename="from_yaml"):
+ colorscheme = ColorScheme()
+ colorscheme.filename = filename
+ for key, val in load(data).items():
+ setattr(colorscheme, key, val)
+ return colorscheme
+def to_yaml(colorscheme):
+ out = {}
+ for key in dir(colorscheme):
+ if "_" not in key[0] and key != "filename":
+ val = getattr(colorscheme, key)
+ if (val or val==0) and val != getattr(ColorScheme, key):
+ out[key] = val
+ return dump(out, default_flow_style=False)
+def from_form(form):#sanic's request.form
+ colorscheme = ColorScheme()
+ for key, val in form.items():
+ if not val[0]: continue
+ setattr(colorscheme, key, val[0].strip())
+ return colorscheme
diff --git a/colorschemes/.folder b/colorschemes/.folder
new file mode 100644
index 0000000..e69de29
diff --git a/common.py b/common.py
index 740d0e0..e4c6da6 100644
--- a/common.py
+++ b/common.py
@@ -4,6 +4,7 @@ try:
from html5print import HTMLBeautifier
except ModuleNotFoundError:
pass
+#import colorscheme#imported later instead to avoid problems with cyclic imports
import config
def readfile(path, binary=False):
@@ -102,6 +103,8 @@ def withResource(path, binary=False):
return decorator
def mergeTemplate(path):
+ import colorscheme
+
filename = os.path.join(config.resourcedir, path)
if config.cache:
template = airspeed.Template(readfile(filename), filename)
@@ -121,7 +124,8 @@ def mergeTemplate(path):
objects.update({
"strip_unit": strip_unit,
"escape_html": escape_html,
- "escape_url":escape_url})
+ "escape_url": escape_url,
+ "get_colorscheme":colorscheme.get})
if config.prettifyHTML:
return response.html(HTMLBeautifier.beautify(
diff --git a/config.py b/config.py
index 1295397..aaec97a 100644
--- a/config.py
+++ b/config.py
@@ -2,5 +2,6 @@ cache = False
resourcedir = "resources/"
carddir = "cards/"
svgdir = "svgs/"
+colordir = "colorschemes/"
prettifyHTML = False#requires html5print module, only applies to html processed by airspeed
svg_page_size = 150
diff --git a/resources/cards/card.css b/resources/cards/card.css
index 6be5e22..70314f4 100644
--- a/resources/cards/card.css
+++ b/resources/cards/card.css
@@ -47,9 +47,20 @@ article {
grid-gap: 1.5mm 1.5mm;
border-style: solid;
border-width: 2mm;
- border-color: #4a4a4a;
- background-color: #4a4a4a;
+ border-color: var(--color-border);
+ background-color: var(--color-card-bg);
cursor: pointer;
+
+ --color-border: #4a4a4a;
+ --color-card-bg: #4a4a4a;
+ --color-main: #000;
+ --color-main-bg: #ddd;
+ --color-header-bg: #111;
+ --color-header: #ddd;
+ --color-figure-bg: #2a2a2a;
+ --color-figure: #aaa;
+ --color-costbar-bg: #111;
+ --color-costbar: #eee;
}
article.effects {
grid-template-columns: 4fr 3fr;
@@ -69,7 +80,8 @@ article.item {
}
article >* {
- background-color: #ddd;
+ color: var(--color-main);
+ background-color: var(--color-main-bg);
text-align: center;
line-height: 1.4em;
padding: 0 1mm;
@@ -82,26 +94,32 @@ article h1 {
font-size: 1.2em;
line-height: 1.1em;
font-weight: 600;
+ background-color: var(--color-header-bg);
+ color: var(--color-header);
}
article figure {
grid-area: figure;
- background: #2f2f2f;
+ background: var(--color-figure-bg);
border-radius: 0;
margin: -1.5mm 1.5mm;
overflow: hidden;
+ position: relative;
}
-article figure * {
- color: #999;
+article figure >* {
+ color: var(--color-figure);
+ position: absolute;
+ top:0;right:0;left:0;bottom:0;
}
-article figure img{
+article figure img {
padding: 1mm 0;
display: block;
height: calc(100% - 2mm);
margin: auto auto;
}
article figure img.svg_filter{
+ /*causes DPI issues when printing*/
filter:
brightness(0)
invert(1)
@@ -131,10 +149,10 @@ article.effects ul {
article section {
grid-area: bar;
- background-color: #111;
+ background-color: var(--color-costbar-bg);
border-radius: 0;
margin: 0 -2mm;
- color: #eee;
+ color: var(--color-costbar);
display: flex;
flex-direction: row;
flex-wrap: nowrap;
diff --git a/resources/cards/colors.css b/resources/cards/colors.css
new file mode 100644
index 0000000..e69de29
diff --git a/resources/cards/colors.vm b/resources/cards/colors.vm
new file mode 100644
index 0000000..6a25029
--- /dev/null
+++ b/resources/cards/colors.vm
@@ -0,0 +1,14 @@
+
+
+
+#foreach($colorscheme in $colorschemes)
+
+ #if($colorscheme.filename)
+ $escape_html($colorscheme.filename)
+ #else
+ Default Scheme
+ #end
+
+
+#end
diff --git a/server.py b/server.py
index f7de7a4..9284ead 100755
--- a/server.py
+++ b/server.py
@@ -3,6 +3,7 @@ import sys, os, airspeed, glob
from sanic import Sanic, response
from common import mergeTemplate, withResource, call
import card
+import colorscheme
import svg
import config
@@ -114,6 +115,46 @@ async def preview_card(request):
was_deleted = True
return locals()
+@app.get("/cards/colors")
+@mergeTemplate("cards/colors.vm")
+async def get_color_picker(request):
+ colorschemes = colorscheme.list_all()
+ print(colorschemes)
+ return locals()
+
+@app.get("/card/colors/preview")
+@mergeTemplate("cards/card.vm")
+async def get_color_preview(request):
+ cards = [card.Card()]
+ cards[0].colorscheme = request.args.get(schemename) or ""
+ cards[0].title = cards[0].colorscheme or "Default Colors"
+ cards[0].figure = ""
+ cards[0].figure_source = ""
+ cards[0].description = "This is a description"
+ cards[0].steps = ["Do A", "Then B"]
+ cards[0].cost = "Something"
+ cards[0].power = 5
+ cards[0].cp = 50
+
+ return locals()
+
+@app.post("/card/colors/preview")
+@mergeTemplate("cards/card.vm")
+async def get_color_preview(request):
+ cards = [card.Card()]
+ cards[0].colorscheme = request.args.get(schemename) or ""
+ cards[0].title = cards[0].colorscheme or "Default Colors"
+ cards[0].figure = ""
+ cards[0].figure_source = ""
+ cards[0].description = "This is a description"
+ cards[0].steps = ["Do A", "Then B"]
+ cards[0].cost = "Something"
+ cards[0].power = 5
+ cards[0].cp = 50
+
+ return locals()
+
+
@app.get("/cards/svg")
@mergeTemplate("cards/svg.vm")
async def svg_list(request):