pf2db/db_explorer/db_explorer/app.py
2021-11-17 21:56:11 +01:00

57 lines
2.1 KiB
Python

import urllib.parse
import os
import re
from flask import Flask, render_template
from flask_pymongo import PyMongo
app = Flask(__name__)
app.config["MONGO_URI"] = os.environ["MONGO_URI"]
mongo = PyMongo(app)
@app.template_filter('filter_vtt')
def filter_vtt(text):
compendium_re = re.compile(r"@Compendium\[([^\]]+)\]\{([^\}]+)\}")
def compendium_return(m):
return f"<a>{m.group(2)}</a>"
macro_re = re.compile(r"\[\[\/\S?r\s(?:(?P<sdice>[^\{\] ]+)[^\{\]]*|(?:\{(?P<ldice>[^\}]+)\}\[[^\]]+\])?)\]\](?:\{(?P<alt>[^\}]+)\})?")
def macro_return(m):
if m.group('alt') is not None:
return m.group('alt')
return m.group('sdice')
text = compendium_re.sub(compendium_return, text)
text = macro_re.sub(macro_return, text)
return text
@app.route("/")
def list_types():
types = [ {"name": "Actions", "href": "action"} ]
return render_template("list.html", header="All types", items=types)
@app.route("/action")
def list_actions():
items = list(map(lambda x: {"name": x["name"], "href": "./action/" + urllib.parse.quote(x["name"], safe='')}, mongo.db.action.find({}, {"name": 1}).sort("name", 1)))
return render_template("list.html", header="All actions", items=items)
@app.route("/action/<name>")
def show_action(name):
item = mongo.db.action.find_one_or_404({"name": name})
if item["data"]["actions"]["value"] == None:
if item["data"]["actionType"]["value"] == 'passive':
item['_action_icon'] = None
elif item["data"]["actionType"]["value"] == 'reaction':
item['_action_icon'] = 'r'
elif item["data"]["actionType"]["value"] == 'free':
item['_action_icon'] = 0
else:
raise ValueError(f'Unknown action type: {item["data"]["actionType"]["value"]}')
elif item["data"]["actions"]["value"] in (1,2,3):
item['_action_icon'] = item["data"]["actions"]["value"]
else:
raise ValueError(f'Unknown action: {item["data"]["actionType"]["value"]} - {item["data"]["actions"]["value"]}')
return render_template("action.html", action=item)
if __name__ == "__main__":
app.run()