general.nim 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import karax/[karaxdsl, vdom]
  2. import renderutils
  3. import ../utils, ../types
  4. const doctype = "<!DOCTYPE html>\n"
  5. proc renderNavbar*(title, path: string): VNode =
  6. buildHtml(nav(id="nav", class="nav-bar container")):
  7. tdiv(class="inner-nav"):
  8. tdiv(class="item"):
  9. a(class="site-name", href="/"): text title
  10. a(href="/"): img(class="site-logo", src="/logo.png")
  11. tdiv(class="item right"):
  12. icon "info-circled", title="About", href="/about"
  13. iconReferer "cog", "/settings", path, title="Preferences"
  14. proc renderMain*(body: VNode; prefs: Prefs; title="Nitter"; titleText=""; desc="";
  15. path="/"; `type`="article"; video=""; images: seq[string] = @[]): string =
  16. let node = buildHtml(html(lang="en")):
  17. head:
  18. link(rel="stylesheet", `type`="text/css", href="/css/style.css")
  19. link(rel="stylesheet", `type`="text/css", href="/css/fontello.css")
  20. if prefs.hlsPlayback:
  21. script(src="/js/hls.light.min.js")
  22. script(src="/js/hlsPlayback.js")
  23. title:
  24. if titleText.len > 0:
  25. text titleText & " | " & title
  26. else:
  27. text title
  28. meta(name="viewport", content="width=device-width, initial-scale=1.0")
  29. meta(property="og:type", content=`type`)
  30. meta(property="og:title", content=titleText)
  31. meta(property="og:description", content=desc)
  32. meta(property="og:site_name", content="Twitter")
  33. for url in images:
  34. meta(property="og:image", content=getPicUrl(url))
  35. if video.len > 0:
  36. meta(property="og:video:url", content=video)
  37. meta(property="og:video:secure_url", content=video)
  38. body:
  39. renderNavbar(title, path)
  40. tdiv(id="content", class="container"):
  41. body
  42. result = doctype & $node
  43. proc renderSearch*(): VNode =
  44. buildHtml(tdiv(class="panel-container")):
  45. tdiv(class="search-panel"):
  46. form(`method`="post", action="/search"):
  47. input(`type`="text", name="query", autofocus="", placeholder="Enter usernames...")
  48. button(`type`="submit"): icon "search"
  49. proc renderError*(error: string): VNode =
  50. buildHtml(tdiv(class="panel-container")):
  51. tdiv(class="error-panel"):
  52. span: text error
  53. proc showError*(error, title: string): string =
  54. renderMain(renderError(error), Prefs(), title, "Error")