Compare commits
2 commits
8c0451c640
...
347143ab44
Author | SHA1 | Date | |
---|---|---|---|
347143ab44 | |||
43d4e9a825 |
7 changed files with 60 additions and 22 deletions
|
@ -1,19 +1,22 @@
|
|||
from typing import Union
|
||||
from fastapi.staticfiles import StaticFiles
|
||||
from fastapi.responses import HTMLResponse
|
||||
from fastapi import FastAPI, Form
|
||||
from fastapi.middleware.gzip import GZipMiddleware
|
||||
from fastapi.responses import HTMLResponse, PlainTextResponse
|
||||
from fastapi import FastAPI, Form, Response
|
||||
import jinja2
|
||||
import uvicorn
|
||||
import httpx
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import importlib.resources
|
||||
from . import utils
|
||||
from . import __version__
|
||||
|
||||
basedir = os.path.dirname(__file__)
|
||||
|
||||
app = FastAPI(openapi_url=None)
|
||||
app.add_middleware(GZipMiddleware)
|
||||
app.mount("/static", StaticFiles(directory=basedir + "/static"), name="static")
|
||||
|
||||
template_env = jinja2.Environment(
|
||||
|
@ -23,6 +26,7 @@ template_env = jinja2.Environment(
|
|||
error_template = template_env.get_template("error.html")
|
||||
|
||||
template_env.globals["convert_times"] = utils.convert_times
|
||||
template_env.globals["combineCSS"] = utils.combineCSS
|
||||
template_env.globals["isSelected"] = utils.isSelected
|
||||
template_env.globals["generate_thumbnail_url"] = utils.generate_thumbnail_url
|
||||
template_env.globals["__version__"] = __version__
|
||||
|
@ -40,6 +44,21 @@ utils.global_imgproxy_params = json.loads(utils.config_value("IMGPROXY_PARAMS",
|
|||
# \S[A-Z0-9]{8} = without dash, no whitespace
|
||||
level_code_regex = re.compile("[A-Z0-9]{4}\-[A-Z0-9]{4}|[A-Z0-9]{8}")
|
||||
|
||||
class CSSResponse(Response):
|
||||
media_type = "text/css"
|
||||
def render(self, content: any) -> bytes:
|
||||
return content.encode()
|
||||
|
||||
@app.get("/assets/combine_css", response_class=CSSResponse)
|
||||
async def combineCSSResources(resources: str, response: Response):
|
||||
"""Combines and returns the css stylesheets. The resources have to be accessible via /static."""
|
||||
combined_css = ""
|
||||
for resource in resources.split(","):
|
||||
path = os.path.join(os.path.abspath(basedir), "static", os.path.relpath(resource))
|
||||
with open(path) as f:
|
||||
contents = f.read()
|
||||
combined_css += f"\n/* SRC: {resource} */\n" + re.sub(" {4}| {2}"," ", re.sub("\n.*\/\*.*\*\/", "", contents))
|
||||
return combined_css
|
||||
|
||||
@app.get("/", response_class=HTMLResponse)
|
||||
async def root():
|
||||
|
@ -78,7 +97,6 @@ async def search(
|
|||
timeout=10,
|
||||
)
|
||||
searchResults = rq.json()
|
||||
print(rq.url, p * limit)
|
||||
except httpx.ReadTimeout:
|
||||
return "Server timed out"
|
||||
else:
|
||||
|
@ -126,7 +144,6 @@ async def search(
|
|||
reason="Server is unavailable right now."
|
||||
)
|
||||
searchResults = rq.json()
|
||||
print(rq.url, p * limit)
|
||||
except httpx.ReadTimeout:
|
||||
return error_template.render(reason="Server timed out")
|
||||
except json.decoder.JSONDecodeError:
|
||||
|
|
|
@ -4,6 +4,11 @@
|
|||
<title></title>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" href="{{ combineCSS(
|
||||
'/static/index.css',
|
||||
'/static/main.css',
|
||||
'/static/error.css'
|
||||
) }}">
|
||||
<link rel="stylesheet" href="/static/index.css">
|
||||
<link rel="stylesheet" href="/static/main.css">
|
||||
<link rel="stylesheet" href="/static/error.css">
|
||||
|
|
|
@ -4,10 +4,12 @@
|
|||
<title>IWM Browser</title>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" href="/static/index.css">
|
||||
<link rel="stylesheet" href="/static/main.css">
|
||||
<link rel="stylesheet" href="/static/homepage.css">
|
||||
<link rel="stylesheet" href="/static/search/search.css">
|
||||
<link rel="stylesheet" href="{{ combineCSS(
|
||||
'/static/index.css',
|
||||
'/static/main.css',
|
||||
'/static/homepage.css',
|
||||
'/static/search/search.css'
|
||||
) }}">
|
||||
</head>
|
||||
<body>
|
||||
<div class="Home">
|
||||
|
|
|
@ -4,10 +4,12 @@
|
|||
<title></title>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" href="/static/index.css">
|
||||
<link rel="stylesheet" href="/static/main.css">
|
||||
<link rel="stylesheet" href="/static/search/search.css">
|
||||
<link rel="stylesheet" href="/static/search/searchResults.css">
|
||||
<link rel="stylesheet" href="{{ combineCSS(
|
||||
'/static/index.css',
|
||||
'/static/main.css',
|
||||
'/static/search/search.css',
|
||||
'/static/search/searchResults.css'
|
||||
) }}">
|
||||
<!-- Optional features -->
|
||||
<script>
|
||||
function copy(obj) {
|
||||
|
|
|
@ -5,10 +5,12 @@
|
|||
<meta charset="UTF-8">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" href="/static/index.css">
|
||||
<link rel="stylesheet" href="/static/main.css">
|
||||
<link rel="stylesheet" href="/static/search/search.css">
|
||||
<link rel="stylesheet" href="/static/search/searchResults.css">
|
||||
<link rel="stylesheet" href="{{ combineCSS(
|
||||
'/static/index.css',
|
||||
'/static/main.css',
|
||||
'/static/search/search.css',
|
||||
'/static/search/searchResults.css'
|
||||
) }}">
|
||||
<!-- Optional features -->
|
||||
<script>
|
||||
function copy(obj) {
|
||||
|
|
|
@ -4,11 +4,18 @@
|
|||
<title></title>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" href="/static/index.css">
|
||||
<link rel="stylesheet" href="/static/main.css">
|
||||
<link rel="stylesheet" href="/static/search/search.css">
|
||||
<link rel="stylesheet" href="/static/search/searchResults.css">
|
||||
<link rel="stylesheet" href="/static/user.css">
|
||||
<link rel="stylesheet" href="{{ combineCSS(
|
||||
'/static/index.css',
|
||||
'/static/main.css',
|
||||
'/static/search/search.css',
|
||||
'/static/search/searchResults.css',
|
||||
'/static/user.css'
|
||||
) }}">
|
||||
<!-- <link rel="stylesheet" href="/static/index.css"> -->
|
||||
<!-- <link rel="stylesheet" href="/static/main.css"> -->
|
||||
<!-- <link rel="stylesheet" href="/static/search/search.css"> -->
|
||||
<!-- <link rel="stylesheet" href="/static/search/searchResults.css"> -->
|
||||
<!-- <link rel="stylesheet" href="/static/user.css"> -->
|
||||
</head>
|
||||
<body>
|
||||
<div class="Search">
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
from imgproxy import ImgProxy
|
||||
import json
|
||||
import os
|
||||
import urllib.parse
|
||||
|
||||
def convert_times(time):
|
||||
# Not sure if it's the right way to do that, but it seems to work.
|
||||
|
@ -30,9 +31,11 @@ def config_value(key: str, default_value=None):
|
|||
def isSelected(selection, value):
|
||||
"""Returns 'selected' if values are equal.
|
||||
Intended for selection boxes"""
|
||||
print(f"DBG: {selection} {value},")
|
||||
return 'selected="true"' if selection == value else ''
|
||||
|
||||
def combineCSS(*paths):
|
||||
"""Generates the /assets/combine_css url"""
|
||||
return f"/assets/combine_css?resources={','.join(paths)}"
|
||||
|
||||
# Specify default imgproxy instance.
|
||||
global_imgproxy_url = None
|
||||
|
|
Loading…
Reference in a new issue