user.nim 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #? stdtmpl(subsChar = '$', metaChar = '#')
  2. #import xmltree, strutils, uri, htmlgen
  3. #import ../types, ../formatters, ../utils
  4. #import ./tweet
  5. #
  6. #proc renderProfileCard*(profile: Profile): string =
  7. #let pic = profile.getUserpic().getSigUrl("pic")
  8. #let smallPic = profile.getUserpic("_200x200").getSigUrl("pic")
  9. <div class="profile-card">
  10. <a class="profile-card-avatar" href="${pic}">
  11. <img src="${smallPic}">
  12. </a>
  13. <div class="profile-card-tabs">
  14. <div class="profile-card-tabs-name">
  15. ${linkUser(profile, "h1", class="profile-card-name", username=false)}
  16. ${linkUser(profile, "h2", class="profile-card-username")}
  17. </div>
  18. </div>
  19. <div class="profile-card-extra">
  20. <div class="profile-bio">
  21. #if profile.bio.len > 0:
  22. <div class="profile-bio">
  23. <p>${linkifyText(xmltree.escape(profile.bio))}</p>
  24. </div>
  25. #end if
  26. </div>
  27. <div class="profile-card-extra-links">
  28. <ul class="profile-statlist">
  29. <li class="tweets">
  30. <span class="profile-stat-header">Tweets</span>
  31. <span>${$profile.tweets}</span>
  32. </li>
  33. <li class="followers">
  34. <span class="profile-stat-header">Followers</span>
  35. <span>${$profile.followers}</span>
  36. </li>
  37. <li class="following">
  38. <span class="profile-stat-header">Following</span>
  39. <span>${$profile.following}</span>
  40. </li>
  41. </ul>
  42. </div>
  43. </div>
  44. </div>
  45. #end proc
  46. #
  47. #proc renderBanner(profile: Profile): string =
  48. #if "#" in profile.banner:
  49. <div style="${profile.banner}" class="profile-banner-color"></div>
  50. #else:
  51. #let url = getSigUrl(profile.banner, "pic")
  52. <a href="${url}">
  53. <img src="${url}">
  54. </a>
  55. #end if
  56. #end proc
  57. #
  58. #proc renderTimeline*(tweets: Tweets; profile: Profile; beginning: bool): string =
  59. <div id="tweets">
  60. #if profile.protected:
  61. <div class="timeline-protected">
  62. <h2 class="timeline-protected-header">This account's Tweets are protected.</h2>
  63. <p class="timeline-protected-explanation">Only confirmed followers have access to @${profile.username}'s Tweets.
  64. </div>
  65. #end if
  66. #if not beginning:
  67. <div class="show-more status-el">
  68. <a href="/${profile.username}">Load newest tweets</a>
  69. </div>
  70. #end if
  71. #var retweets: Tweets
  72. #for tweet in tweets:
  73. #if tweet in retweets: continue
  74. #end if
  75. #if tweet.retweetBy.isSome: retweets.add tweet
  76. #end if
  77. ${renderTweet(tweet, "timeline-tweet")}
  78. #end for
  79. #if tweets.len > 0:
  80. <div class="show-more">
  81. <a href="/${profile.username}?after=${$tweets[^1].id}">Load older tweets</a>
  82. </div>
  83. #end if
  84. </div>
  85. #end proc
  86. #
  87. #proc renderProfile*(profile: Profile; tweets: Tweets; beginning: bool): string =
  88. <div class="profile-tabs">
  89. <div class="profile-banner">
  90. ${renderBanner(profile)}
  91. </div>
  92. <div class="profile-tab">
  93. ${renderProfileCard(profile)}
  94. </div>
  95. <div class="timeline-tab">
  96. ${renderTimeline(tweets, profile, beginning)}
  97. </div>
  98. </div>
  99. #end proc