File size: 2,192 Bytes
6ca4b94
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
from datetime import datetime
from fastapi import FastAPI, Request
from fastapi.staticfiles import StaticFiles
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from starlette.middleware.trustedhost import TrustedHostMiddleware

from src.api.endpoints import demo
from src.api.endpoints import search
from src.config import config
from src.lifespan import lifespan, DEV_MODE

# Import bibliography utilities
from src.utils.bibliography import format_citation, format_bibliography, get_bibtex_entry

app = FastAPI(title=config.app.name, version=config.app.version, lifespan=lifespan)

# Trust HuggingFace Spaces proxy
@app.middleware("http")
async def proxy_headers_middleware(request: Request, call_next):
    if "x-forwarded-proto" in request.headers:
        request.scope["scheme"] = request.headers["x-forwarded-proto"]
    response = await call_next(request)
    return response

app.mount("/static", StaticFiles(directory="./public"), name="static")

app.include_router(demo.router, prefix="/api/v1/demo", tags=["demo"])
app.include_router(search.router, prefix="/api/v1/search", tags=["search"])

templates = Jinja2Templates(directory="./src/templates")
templates.env.globals["config"] = config
templates.env.globals["DEV_MODE"] = DEV_MODE
templates.env.globals["current_year"] = datetime.now().year

if DEV_MODE:
    templates.env.globals["hot_reload"] = lambda: getattr(app.state, 'hot_reload', None)
else:
    templates.env.globals["hot_reload"] = lambda: None

templates.env.filters["cite"] = format_citation
templates.env.filters["bibliography"] = format_bibliography
templates.env.filters["bibtex"] = get_bibtex_entry

@app.get("/", response_class=HTMLResponse)
async def read_root(request: Request):
    return templates.TemplateResponse(
        "pages/index.jinja", {
            "request": request, 
            "title": "Home",
            "search_result": [],
            "queries": [],
        }
    )


@app.get("/demo", response_class=HTMLResponse)
async def read_demo(request: Request):
    return templates.TemplateResponse(
        "pages/demo/demo.jinja", {"request": request, "title": "Taylor-Russell Model Calculator"}
    )