/
ameba.rb
154 lines (130 loc) · 2.71 KB
/
ameba.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
$:.unshift File.expand_path(File.dirname(__FILE__) + '/lib')
require 'sinatra'
require "sinatra/reloader" if development?
require 'authorization'
require 'models'
require 'routes'
require 'uihelpers'
require 'slim'
autoload :Chronic, 'chronic'
helpers do
include Sinatra::Authorization
include Sinatra::Routes
include Sinatra::UIHelpers
end
configure :development do
Slim::Engine.set_default_options :pretty => true
end
before do
@site = Site.new
@robots = "index,follow"
@queue_count = Post.not_published.count if current_user
end
get '/new' do
login_required!
editor_form Post.new
end
post '/new' do
login_required!
post = Post.new params[:post]
post.created_at = date_from_form(params[:post][:when])
post.user = current_user
if post.save
redirect path_for(:post, :slug => post.slug)
else
editor_form post
end
end
get %r{/edit/(.+)} do |slug|
login_required!
post = Post.find_by_slug!(slug)
editor_form post
end
post %r{/edit/(.+)} do |slug|
login_required!
post = Post.find_by_slug!(slug)
post.title = params[:post][:title]
post.rawbody = params[:post][:rawbody]
post.created_at = date_from_form(params[:post][:when])
post.url = params[:post][:url]
if post.save
redirect path_for(:post, :slug => post.slug)
else
editor_form post
end
end
get '/logout' do
logout!
end
get '/login' do
set_title = 'Log In'
@user = User.new
v :login
end
post '/login' do
if authorize(params[:email], params[:password])
redirect_to = session[:return_to] || path_for(:home)
session[:return_to] = nil
redirect redirect_to
else
flash[:notice] = "Invalid email/password combination"
v :login
end
end
get '/atom' do
#set :haml, {:format => :xhtml}
content_type "application/xml"
@posts = Post.recent
set :slim, {:format => :xhtml}
slim :atom, :layout => false
end
get '/about' do
v :about
end
get '/archive' do
@posts = Post.archive
@robots = "noindex,follow"
v :archive
end
get '/queue' do
login_required!
@posts = Post.queued
@robots = "noindex,nofollow"
v :queue
end
get %r{/(.+)} do |slug|
@post = Post.find_by_slug(slug)
if @post
@post.increment_views unless logged_in?
v :post
else
404
end
end
get '/' do
@posts = Post.recent(10, params[:page] || 1)
v :index
end
not_found do
@posts = Post.popular
v :'404'
end
def set_title (text=nil)
@title = text ? "#{text} : #{@site.title}" : @site.title
pjax? ? "<title>#{@title}</title>" : ''
end
private
def editor_form(post)
@post = post
v :editor
end
def date_from_form(date)
date = 'now' if date.blank?
Chronic.parse(date).ago(@site.timezone_offset.hours).utc
end
def pjax?
env['HTTP_X_PJAX']
end
def v(name)
slim name, :layout => !pjax?
end