Compare commits

...

2 commits

Author SHA1 Message Date
347143ab44
Add GZip compression 2022-11-27 14:24:42 +01:00
43d4e9a825
Combine multiple CSS stylesheets together. 2022-11-27 14:09:39 +01:00
7 changed files with 60 additions and 22 deletions

View file

@ -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:

View file

@ -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">

View file

@ -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">

View file

@ -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) {

View file

@ -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) {

View file

@ -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">

View file

@ -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