code.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from dataclasses import dataclass
  2. from pathlib import Path
  3. from typing import Iterable
  4. @dataclass(frozen=True)
  5. class PreviewFile:
  6. name: str
  7. size: int
  8. source: str = "url"
  9. @property
  10. def extension(self) -> str:
  11. return Path(self.name).suffix.removeprefix(".").lower()
  12. @property
  13. def is_large(self) -> bool:
  14. return self.size > 5 * 1024 * 1024
  15. RENDERERS = {
  16. "pdf": "pdfjs-dist",
  17. "ofd": "DLTech21/ofd.js",
  18. "typ": "typst.ts",
  19. "typst": "typst.ts",
  20. "dxf": "@flyfish-dev/cad-viewer",
  21. "dwg": "@flyfish-dev/cad-viewer",
  22. "dwf": "@flyfish-dev/cad-viewer",
  23. "dwfx": "@flyfish-dev/cad-viewer",
  24. "xps": "@flyfish-dev/cad-viewer",
  25. "json": "highlight.js",
  26. "py": "highlight.js",
  27. }
  28. def build_preview_queue(files: Iterable[PreviewFile]) -> list[dict[str, str]]:
  29. queue = []
  30. for item in files:
  31. renderer = RENDERERS.get(item.extension, "fallback")
  32. queue.append({
  33. "name": item.name,
  34. "renderer": renderer,
  35. "priority": "low" if item.is_large else "normal",
  36. })
  37. return queue
  38. samples = [
  39. PreviewFile("invoice.ofd", 428000),
  40. PreviewFile("report.typ", 18000),
  41. PreviewFile("house.dwfx", 17_000_000),
  42. PreviewFile("trace.log", 12000),
  43. ]
  44. for job in build_preview_queue(samples):
  45. print(f"{job['name']}: {job['renderer']} ({job['priority']})")