PageRenderTime 49ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/amanda.rb

https://bitbucket.org/tannermares/amanda
Ruby | 228 lines | 200 code | 28 blank | 0 comment | 9 complexity | 70f5a2ba8b2c5212ec6546bae4ebc300 MD5 | raw file
  1. Encoding.default_external = Encoding::UTF_8
  2. Encoding.default_internal = Encoding::UTF_8
  3. require 'rack'
  4. require 'camping'
  5. require 'camping/session'
  6. require 'dropbox_sdk'
  7. require_relative 'amanda/helper'
  8. require_relative 'amanda/post'
  9. require_relative 'amanda/store'
  10. require_relative 'amanda/feed'
  11. Camping.goes :Amanda
  12. module Amanda
  13. set :secret, ENV["SECRET"]
  14. include Camping::Session
  15. include Amanda::Helper
  16. $store = Amanda::Store.new
  17. end
  18. module Amanda::Controllers
  19. class Style < R '/s/(.+)'
  20. PATH = File.expand_path(File.dirname(__FILE__))
  21. def get(path)
  22. unless path.include? ".." # prevent directory traversal attacks
  23. serve "#{path}", File.read("#{PATH}/s/#{path}")
  24. else
  25. @status = "403"
  26. "403 - Invalid path"
  27. end
  28. end
  29. end
  30. class Index < R '/'
  31. def get
  32. if $store.dropbox_session
  33. @last = $store.last
  34. @random = $store.random
  35. while @random.id == @last.id
  36. @random = $store.random
  37. end
  38. render :index
  39. else
  40. redirect "/authorize"
  41. end
  42. end
  43. end
  44. class Post < R '/(\d{4})/(\d{2})/(\d{2})/(\d{4})(/?.*)?'
  45. def get(year, month, day, time, rest)
  46. @post = $store.post("#{year}#{month}#{day}#{time}")
  47. @last = $store.last
  48. render :single
  49. end
  50. end
  51. class Tag < R '/tag/(.+)'
  52. def get(tag)
  53. @last = $store.last
  54. @posts = $store.posts_for_tag(tag)
  55. render :multiple
  56. end
  57. end
  58. class Tags < R '/tags'
  59. def get
  60. @tags = $store.tags
  61. render :tags
  62. end
  63. end
  64. class Refresh < R ENV["REFRESH_PATH"]
  65. def get
  66. $store.refresh_from_dropbox
  67. redirect "/"
  68. end
  69. end
  70. class Archive < R '/archive'
  71. def get
  72. @posts = $store.posts
  73. render :archive
  74. end
  75. end
  76. class Feed < R '/feed'
  77. def get
  78. Amanda::Feed.rss $store.posts(9), title: ENV["TITLE"], author: ENV["AUTHOR"], url: URL("/").to_s
  79. end
  80. end
  81. class Authorize < R '/authorize'
  82. def get
  83. if $store.dropbox_session
  84. redirect "/"
  85. else
  86. session = DropboxSession.new(ENV["DROPBOX_APP_KEY"], ENV["DROPBOX_APP_SECRET"])
  87. session.get_request_token
  88. @state["dropbox"] = session
  89. redirect session.get_authorize_url(URL("/authorized").to_s)
  90. end
  91. end
  92. end
  93. class Authorized < R '/authorized'
  94. def get
  95. if session = @state["dropbox"]
  96. session.get_access_token
  97. $store.dropbox_session(session)
  98. redirect ENV["REFRESH_PATH"]
  99. else
  100. "TUUT"
  101. end
  102. end
  103. end
  104. end
  105. module Amanda::Views
  106. def layout
  107. doctype!
  108. html do
  109. head do
  110. meta charset: "utf-8"
  111. meta :"http-equiv" => "X-UA-Compatible", content: "IE=edge,chrome=1"
  112. meta name: "description", content: ENV["TITLE"]
  113. link rel: "alternate", type: "application/rss+xml", title: "RSS", href: URL("/feed").to_s
  114. title { defined?(@post) && @post ? @post.title : ENV["TITLE"] }
  115. link rel: "stylesheet", type: "text/css", href: "/s/m.css"
  116. end
  117. body do
  118. div.container! do
  119. div.header! { render_header }
  120. div.content! { self << yield }
  121. div.footer! { render_footer }
  122. end
  123. script src: ENV["HAVEAMINT"], type: "text/javascript" if ENV["HAVEAMINT"]
  124. end
  125. end
  126. end
  127. def render_header
  128. div.nav! do
  129. ul class: "nav-list" do
  130. li {a(href: URL("/").to_s, title: "Home") { "Home" }}
  131. li {a(href: URL("/archive").to_s, title: "Archive") { "Archive" }}
  132. li {a(href: URL("/tags").to_s, title: "Tags") { "Tags" }}
  133. end
  134. end
  135. end
  136. def render_footer
  137. p do
  138. "Powered by " +
  139. a(href: "https://bitbucket.org/atog/amanda", title: "Amanda"){ "Amanda" }
  140. end
  141. p do
  142. "&copy; #{ENV["AUTHOR"]}"
  143. end
  144. end
  145. def render_meta(post)
  146. formatted_published_at(post)
  147. end
  148. def formatted_published_at(post)
  149. post.id.gsub(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})/, "Laten vallen op \\3/\\2/\\1 om \\4:\\5u")
  150. end
  151. def render_tags(tags)
  152. ul class: "tag-list" do
  153. tags.each {|t| li {a(href: URL("/tag/#{parameterize(t)}").to_s, title: t) { t }}}
  154. end
  155. end
  156. def render_post(post, desc=nil)
  157. div.post! do
  158. h2 do
  159. a(href: URL(post.url).to_s, title: post.title) { post.title }
  160. span(class: "desc") { desc } if desc
  161. end
  162. div.content! { post.html }
  163. div.meta! { render_meta(post) }
  164. div.tags! { render_tags(post.tags_to_arr) }
  165. end
  166. end
  167. def index
  168. div.post! class: "last" do
  169. h2 do
  170. a(href: URL(@last.url).to_s, title: @last.title) { @last.title }
  171. span(class: "desc") {"nieuw!"}
  172. end
  173. div.content! { @last.html }
  174. div.meta! { render_meta(@last) }
  175. div.tags! {render_tags(@last.tags_to_arr) }
  176. end
  177. hr
  178. render_post @random, "Random"
  179. end
  180. def single
  181. p {a(href: URL(@last.url).to_s, title: @last.title, class: "last") { "Laatste: #{@last.title}" }} unless @last.id == @post.id
  182. render_post(@post)
  183. end
  184. def multiple
  185. p {a(href: URL(@last.url).to_s, title: @last.title, class: "last") { "Laatste: #{@last.title}" }}
  186. count = @posts.length-1
  187. @posts.each_with_index do |post, i|
  188. render_post post
  189. hr if i < count
  190. end
  191. end
  192. def tags
  193. render_tags(@tags)
  194. end
  195. def archive
  196. ul class: "archive-list" do
  197. @posts.each {|p| li {a(href: URL(p.url).to_s, title: p.title) { "#{p.published_date} &rarr; #{p.title}" }}}
  198. end
  199. end
  200. end