Add support for svg collections, add svg browser pagination and filtering
svg collections must be added manually to the svg directory
This commit is contained in:
@@ -41,3 +41,20 @@ body >h1,
|
||||
form {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
h4 {
|
||||
margin:0;
|
||||
}
|
||||
|
||||
.splitcontainer {
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
.splitl {
|
||||
width: 45%;
|
||||
float:left;
|
||||
}
|
||||
.splitr {
|
||||
width: 45%;
|
||||
float:right;
|
||||
}
|
||||
|
||||
+54
-18
@@ -1,38 +1,74 @@
|
||||
<!DOCTYPE html>
|
||||
<title>SVG list</title>
|
||||
<link rel="stylesheet" href="svg.css">
|
||||
|
||||
<title>SVG list</title>
|
||||
|
||||
#macro(form)
|
||||
<form action="svg" method="post" enctype="multipart/form-data">
|
||||
<h3>Upload SVG:</h3>
|
||||
<p>
|
||||
<input type="file" name="file" accept="image/svg+xml"><br/>
|
||||
<input type="text" name="name" placeholder="name">
|
||||
<input type="submit">
|
||||
|
||||
#if($uploaded)
|
||||
<i>Upload was successfull!</i>
|
||||
#end
|
||||
</p>
|
||||
</form>
|
||||
<form action="svg" method="post" enctype="multipart/form-data">
|
||||
<h3>Upload SVG:</h3>
|
||||
<p>
|
||||
<input type="file" name="file" accept="image/svg+xml"><br/>
|
||||
<input type="text" name="name" placeholder="name">
|
||||
<input type="submit">
|
||||
|
||||
#if($uploaded)
|
||||
<i>Upload was successfull!</i>
|
||||
#end
|
||||
</p>
|
||||
</form>
|
||||
#end
|
||||
#macro(pagination)
|
||||
<center>
|
||||
#set($self = "svg?")
|
||||
#if($current_collection)
|
||||
#set($self = "${self}collection=$escape_html($current_collection)&")
|
||||
#end
|
||||
#if($filter)
|
||||
#set($self = "${self}filter=$escape_html($filter)&")
|
||||
#end
|
||||
#if($page>1)<a href="${self}page=$page.__sub__(1)">Previous page</a> - #end
|
||||
<a href="${self}page=$page.__add__(1)">Next page</a>
|
||||
</center>
|
||||
#end
|
||||
|
||||
<a href="../" style="opacity:0.6;">Return to cardlist</a>
|
||||
|
||||
#form()
|
||||
<div class="splitcontainer">
|
||||
<div class="splitl">
|
||||
#form()
|
||||
</div>
|
||||
<div class="splitr">
|
||||
<form method="get" action="svg">
|
||||
<h3>filter</h3>
|
||||
<input type="text" name="filter" value="$escape_html($filter)">
|
||||
#if($current_collection)
|
||||
<input type="hidden" name="collection" value="$escape_html($current_collection)">
|
||||
#end
|
||||
<input type="submit">
|
||||
</form>
|
||||
<center>
|
||||
<h4>Collections:</h4>
|
||||
<a href="svg">No collection</a>
|
||||
#foreach($collection in $collections)
|
||||
- <a href="svg?collection=$escape_html($collection)">$escape_html($collection)</a>
|
||||
#end
|
||||
</center>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h1>Available SVGs:</h1>
|
||||
|
||||
#pagination()
|
||||
|
||||
<ul>
|
||||
#foreach($name in $svgs)
|
||||
<li><!--todo: add "copy to clipboard" feature-->
|
||||
<h1>$name</h1>
|
||||
<li>
|
||||
<h1>$escape_html($name)</h1>
|
||||
<img src="/svg/${escape_html($name)}.svg">
|
||||
</li>
|
||||
#end
|
||||
</ul>
|
||||
|
||||
#pagination()
|
||||
|
||||
#form()
|
||||
|
||||
<a href="../" style="opacity:0.6;">Return to cardlist</a>
|
||||
|
||||
@@ -124,8 +124,19 @@ async def preview_card(request, template={}):
|
||||
@app.get("/cards/svg")
|
||||
@withTemplate("cards/svg.vm")
|
||||
async def svg_list(request, template={}):
|
||||
svgs = svg.list_all()
|
||||
filter = request.args.get("filter")
|
||||
page = int(request.args.get("page") or 1)
|
||||
current_collection = request.args.get("collection")
|
||||
|
||||
collections = svg.list_collections()
|
||||
svgs = svg.list_all(current_collection)
|
||||
|
||||
if filter:
|
||||
svgs = [i for i in svgs if filter in i]
|
||||
|
||||
svgs.sort()
|
||||
svgs = svgs[(page-1)*100:page*100]
|
||||
|
||||
return response.html(template["svg.vm"].merge(locals()))
|
||||
|
||||
@app.post("/cards/svg")
|
||||
@@ -161,6 +172,9 @@ for j in glob.iglob(os.path.join(config.resourcedir, "**","*"), recursive=True):
|
||||
@app.get(f"/svg/<name>.svg")
|
||||
async def get_svg(request, name):
|
||||
return response.text(svg.get(name), headers={"Content-Type": "image/svg+xml"})
|
||||
@app.get(f"/svg/<collection>/<name>.svg")
|
||||
async def get_svg(request, collection, name):
|
||||
return response.text(svg.get(os.path.join(collection, name)), headers={"Content-Type": "image/svg+xml"})
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(host="0.0.0.0", port=8000)
|
||||
|
||||
@@ -3,16 +3,28 @@ 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]
|
||||
|
||||
|
||||
def list_all(collection = None):
|
||||
if collection:
|
||||
for i in glob.glob(os.path.join(config.svgdir, collection, "*.svg")):
|
||||
yield os.path.join(collection, os.path.basename(i)[:-4])
|
||||
else:
|
||||
for i in glob.glob(os.path.join(config.svgdir, "*.svg")):
|
||||
yield os.path.basename(i)[:-4]
|
||||
|
||||
@listify_output
|
||||
def list_collections():
|
||||
for i in glob.glob(os.path.join(config.svgdir, "*")):
|
||||
if not i.endswith(".svg"):
|
||||
yield os.path.basename(i)
|
||||
|
||||
|
||||
@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)
|
||||
|
||||
Reference in New Issue
Block a user