import re from typing import Iterator from fastapi import APIRouter, Depends from markdown import markdown from ..config import Config from ..dav_file import DavFile from ._common import FileNameLister, PrefixFinder, PrefixUnique router = APIRouter(prefix="/text", tags=["text"]) _lister = FileNameLister( remote_path="text", re=re.compile( r"\.(txt|md)$", flags=re.IGNORECASE, ), ) _finder = PrefixFinder(_lister) _unique = PrefixUnique(_finder) async def get_ticker_lines() -> Iterator[str]: ticker = await DavFile("text/ticker.txt").string return ( line.strip() for line in ticker.split("\n") if line.strip() ) async def get_ticker_content_lines( ticker_lines: Iterator[str] = Depends(get_ticker_lines), ) -> Iterator[str]: return ( line for line in ticker_lines if not line.startswith("#") ) @router.get("/get/ticker") async def get_ticker_content( ticker_content_lines: Iterator[str] = Depends(get_ticker_content_lines), ) -> str: cfg = await Config.get() ticker_content_lines = ["", *ticker_content_lines, ""] ticker_content = cfg.ticker_separator.join(ticker_content_lines) return markdown( ticker_content.strip() ) @router.get( "/list", response_model=list[str], responses=_lister.responses, ) async def list_texts( names: Iterator[str] = Depends(_lister), ) -> list[str]: return list(names) @router.get( "/find/{prefix}", response_model=list[str], responses=_finder.responses, ) async def find_texts( names: Iterator[str] = Depends(_finder), ) -> list[str]: return list(names) @router.get( "/get/{prefix}", response_model=str, responses=_unique.responses, ) async def get_text( name: str = Depends(_unique), ) -> str: text = await DavFile(f"{_lister.remote_path}/{name}").string return markdown( text )