Start on the colorscheme system
This commit is contained in:
@@ -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
|
||||||
@@ -4,6 +4,7 @@ try:
|
|||||||
from html5print import HTMLBeautifier
|
from html5print import HTMLBeautifier
|
||||||
except ModuleNotFoundError:
|
except ModuleNotFoundError:
|
||||||
pass
|
pass
|
||||||
|
#import colorscheme#imported later instead to avoid problems with cyclic imports
|
||||||
import config
|
import config
|
||||||
|
|
||||||
def readfile(path, binary=False):
|
def readfile(path, binary=False):
|
||||||
@@ -102,6 +103,8 @@ def withResource(path, binary=False):
|
|||||||
return decorator
|
return decorator
|
||||||
|
|
||||||
def mergeTemplate(path):
|
def mergeTemplate(path):
|
||||||
|
import colorscheme
|
||||||
|
|
||||||
filename = os.path.join(config.resourcedir, path)
|
filename = os.path.join(config.resourcedir, path)
|
||||||
if config.cache:
|
if config.cache:
|
||||||
template = airspeed.Template(readfile(filename), filename)
|
template = airspeed.Template(readfile(filename), filename)
|
||||||
@@ -121,7 +124,8 @@ def mergeTemplate(path):
|
|||||||
objects.update({
|
objects.update({
|
||||||
"strip_unit": strip_unit,
|
"strip_unit": strip_unit,
|
||||||
"escape_html": escape_html,
|
"escape_html": escape_html,
|
||||||
"escape_url":escape_url})
|
"escape_url": escape_url,
|
||||||
|
"get_colorscheme":colorscheme.get})
|
||||||
|
|
||||||
if config.prettifyHTML:
|
if config.prettifyHTML:
|
||||||
return response.html(HTMLBeautifier.beautify(
|
return response.html(HTMLBeautifier.beautify(
|
||||||
|
|||||||
@@ -2,5 +2,6 @@ cache = False
|
|||||||
resourcedir = "resources/"
|
resourcedir = "resources/"
|
||||||
carddir = "cards/"
|
carddir = "cards/"
|
||||||
svgdir = "svgs/"
|
svgdir = "svgs/"
|
||||||
|
colordir = "colorschemes/"
|
||||||
prettifyHTML = False#requires html5print module, only applies to html processed by airspeed
|
prettifyHTML = False#requires html5print module, only applies to html processed by airspeed
|
||||||
svg_page_size = 150
|
svg_page_size = 150
|
||||||
|
|||||||
@@ -47,9 +47,20 @@ article {
|
|||||||
grid-gap: 1.5mm 1.5mm;
|
grid-gap: 1.5mm 1.5mm;
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
border-width: 2mm;
|
border-width: 2mm;
|
||||||
border-color: #4a4a4a;
|
border-color: var(--color-border);
|
||||||
background-color: #4a4a4a;
|
background-color: var(--color-card-bg);
|
||||||
cursor: pointer;
|
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 {
|
article.effects {
|
||||||
grid-template-columns: 4fr 3fr;
|
grid-template-columns: 4fr 3fr;
|
||||||
@@ -69,7 +80,8 @@ article.item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
article >* {
|
article >* {
|
||||||
background-color: #ddd;
|
color: var(--color-main);
|
||||||
|
background-color: var(--color-main-bg);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
line-height: 1.4em;
|
line-height: 1.4em;
|
||||||
padding: 0 1mm;
|
padding: 0 1mm;
|
||||||
@@ -82,26 +94,32 @@ article h1 {
|
|||||||
font-size: 1.2em;
|
font-size: 1.2em;
|
||||||
line-height: 1.1em;
|
line-height: 1.1em;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
|
background-color: var(--color-header-bg);
|
||||||
|
color: var(--color-header);
|
||||||
}
|
}
|
||||||
|
|
||||||
article figure {
|
article figure {
|
||||||
grid-area: figure;
|
grid-area: figure;
|
||||||
background: #2f2f2f;
|
background: var(--color-figure-bg);
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
margin: -1.5mm 1.5mm;
|
margin: -1.5mm 1.5mm;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
article figure * {
|
article figure >* {
|
||||||
color: #999;
|
color: var(--color-figure);
|
||||||
|
position: absolute;
|
||||||
|
top:0;right:0;left:0;bottom:0;
|
||||||
}
|
}
|
||||||
article figure img{
|
article figure img {
|
||||||
padding: 1mm 0;
|
padding: 1mm 0;
|
||||||
display: block;
|
display: block;
|
||||||
height: calc(100% - 2mm);
|
height: calc(100% - 2mm);
|
||||||
margin: auto auto;
|
margin: auto auto;
|
||||||
}
|
}
|
||||||
article figure img.svg_filter{
|
article figure img.svg_filter{
|
||||||
|
/*causes DPI issues when printing*/
|
||||||
filter:
|
filter:
|
||||||
brightness(0)
|
brightness(0)
|
||||||
invert(1)
|
invert(1)
|
||||||
@@ -131,10 +149,10 @@ article.effects ul {
|
|||||||
|
|
||||||
article section {
|
article section {
|
||||||
grid-area: bar;
|
grid-area: bar;
|
||||||
background-color: #111;
|
background-color: var(--color-costbar-bg);
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
margin: 0 -2mm;
|
margin: 0 -2mm;
|
||||||
color: #eee;
|
color: var(--color-costbar);
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
flex-wrap: nowrap;
|
flex-wrap: nowrap;
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<link rel="stylesheet" href="colors.css">
|
||||||
|
|
||||||
|
#foreach($colorscheme in $colorschemes)
|
||||||
|
<section>
|
||||||
|
#if($colorscheme.filename)
|
||||||
|
$escape_html($colorscheme.filename)
|
||||||
|
#else
|
||||||
|
Default Scheme
|
||||||
|
#end
|
||||||
|
<iframe>
|
||||||
|
</iframe>
|
||||||
|
</section>
|
||||||
|
#end
|
||||||
@@ -3,6 +3,7 @@ import sys, os, airspeed, glob
|
|||||||
from sanic import Sanic, response
|
from sanic import Sanic, response
|
||||||
from common import mergeTemplate, withResource, call
|
from common import mergeTemplate, withResource, call
|
||||||
import card
|
import card
|
||||||
|
import colorscheme
|
||||||
import svg
|
import svg
|
||||||
import config
|
import config
|
||||||
|
|
||||||
@@ -114,6 +115,46 @@ async def preview_card(request):
|
|||||||
was_deleted = True
|
was_deleted = True
|
||||||
return locals()
|
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")
|
@app.get("/cards/svg")
|
||||||
@mergeTemplate("cards/svg.vm")
|
@mergeTemplate("cards/svg.vm")
|
||||||
async def svg_list(request):
|
async def svg_list(request):
|
||||||
|
|||||||
Reference in New Issue
Block a user