-def scramble(secret, value):
- h = sha3_512()
- h.update(f"{secret}{value}".encode())
- return urlsafe_b64encode(h.digest()).rstrip(b"=").decode("ascii")
+class StaticTag(StandaloneTag):
+ tags = {"static"}
+
+ def render(
+ self, filename: str = "", hubapp: str | TreeFileApp | None = None
+ ):
+ """
+ If filename starts with '/', interpret the path as relative to hubapp.base_dir,
+ otherwise assume the path is relative to the current file.
+ """
+ static_file = self.context["static_file"]
+ h = static_file.hubapp
+ if isinstance(hubapp, str):
+ h = h.app.hubapps[hubapp]
+ elif isinstance(hubapp, TreeFileApp):
+ h = hubapp
+ del hubapp
+ if filename.startswith("/") or h != static_file.hubapp:
+ path = h.base_dir / filename.lstrip("/")
+ else:
+ path = static_file.path.parent / filename
+ return h.uri(path)