docs/docs.py

125 lines
3.9 KiB
Python

from flask import Flask, send_from_directory, render_template
from livereload import Server
import xml_lexer
import re
import os
app = Flask(__name__)
app.jinja_options.setdefault('extensions', []).append('jinja2_highlight.HighlightExtension')
TEMPLATES = "templates"
PAGES_BASE = "pages"
STATIC = ["images"]
ROOT = os.environ.get("EA_ROOT", "")
def generate_xrpc_list():
output = "<ul>"
proto = TEMPLATES + "/" + PAGES_BASE + "/proto"
for base, _, files in os.walk(proto):
prefix = base[len(proto):].replace("\\", "/").strip("/")
if prefix:
prefix = prefix.replace("/", ".") + "."
for i in files:
delim = "_" if prefix else "."
href = f"{ROOT}/proto{base[len(proto):]}/{i}"
output += f"<li><code><a href=\"{href}\">"
output += prefix + i.replace(".html", delim + "%s")
output += "</code></a></li>"
with open(os.path.join(base, i)) as f:
headers = re.findall('<h2 id="([^"]*?)">', f.read())
output += "<ul>"
for j in headers:
output += f"<li><code><a href=\"{href}#{j}\">"
output += prefix + i.replace(".html", delim + j)
output += "</code></a></li>"
output += "</ul>"
return output + "</ul>"
@app.route("/styles.css")
def styles():
return send_from_directory(".", "styles.css")
@app.route("/tango.css")
def tango():
return send_from_directory(".", "tango.css")
for i in STATIC:
for base, _, files in os.walk(i):
for name in files:
def handler(base, name):
def handler():
return send_from_directory(base, name)
return handler
local_base = base.replace("\\", "/").strip(".").strip("/")
route = local_base + "/" + name
if not route.startswith("/"):
route = "/" + route
handler = handler(base, name)
handler.__name__ == route
app.add_url_rule(route, route, handler)
for base, _, files in os.walk(TEMPLATES + "/" + PAGES_BASE):
if ".git" in base:
continue
if base.startswith(TEMPLATES):
base = base[len(TEMPLATES):]
for name in files:
if name.endswith(".html"):
def handler(base, name):
def handler():
return render_template(
os.path.join(base, name).strip("/").replace("\\", "/"),
ROOT=ROOT,
generate_xrpc_list=generate_xrpc_list
)
return handler
local_base = base.replace("\\", "/").strip(".").strip("/")
if local_base.startswith(PAGES_BASE):
local_base = local_base[len(PAGES_BASE):]
route = local_base + "/" + name
if route.endswith("/index.html"):
route = route[:-10]
if not route.startswith("/"):
route = "/" + route
handler = handler(base, name)
handler.__name__ == route
app.add_url_rule(route, route, handler)
# from flask import url_for
# def has_no_empty_params(rule):
# defaults = rule.defaults if rule.defaults is not None else ()
# arguments = rule.arguments if rule.arguments is not None else ()
# return len(defaults) >= len(arguments)
# @app.route("/site-map")
# def site_map():
# links = []
# for rule in app.url_map.iter_rules():
# if "GET" in rule.methods and has_no_empty_params(rule):
# url = url_for(rule.endpoint, **(rule.defaults or {}))
# links.append((url, rule.endpoint))
# return str(links)
if __name__ == '__main__':
app.config['TEMPLATES_AUTO_RELOAD'] = True
app.config['DEBUG'] = True
app.run(debug=True, port=3000, host="0.0.0.0")
# server = Server(app.wsgi_app)
# server.watch(".")
# server.serve(port=3000)