activeadmin-blog 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +20 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +215 -0
- data/README.md +162 -0
- data/Rakefile +7 -0
- data/activeadmin-blog.gemspec +30 -0
- data/app/controllers/activeadmin_blog/posts_controller.rb +50 -0
- data/app/models/activeadmin_blog/blog_category.rb +23 -0
- data/app/models/activeadmin_blog/blog_post.rb +81 -0
- data/app/views/activeadmin_blog/posts/_footer.html.erb +10 -0
- data/app/views/activeadmin_blog/posts/_header.html.erb +11 -0
- data/app/views/activeadmin_blog/posts/_post.html.erb +31 -0
- data/app/views/activeadmin_blog/posts/archive.html.erb +9 -0
- data/app/views/activeadmin_blog/posts/category.html.erb +9 -0
- data/app/views/activeadmin_blog/posts/feed.rss.builder +18 -0
- data/app/views/activeadmin_blog/posts/index.html.erb +9 -0
- data/app/views/activeadmin_blog/posts/search.html.erb +9 -0
- data/app/views/activeadmin_blog/posts/show.html.erb +35 -0
- data/app/views/activeadmin_blog/posts/tag.html.erb +9 -0
- data/app/views/admin/categories/_form.html.erb +26 -0
- data/app/views/admin/posts/_categories.html.erb +18 -0
- data/config/routes.rb +9 -0
- data/install.sh +160 -0
- data/lib/activeadmin-blog.rb +8 -0
- data/lib/activeadmin-blog/engine.rb +5 -0
- data/lib/activeadmin-blog/version.rb +3 -0
- data/lib/generators/activeadmin_blog/install_generator.rb +40 -0
- data/lib/generators/activeadmin_blog/templates/README +5 -0
- data/lib/generators/activeadmin_blog/templates/admin/blog_categories.rb +86 -0
- data/lib/generators/activeadmin_blog/templates/admin/blog_posts.rb +101 -0
- data/lib/generators/activeadmin_blog/views_generator.rb +16 -0
- data/vendor/assets/javascripts/activeadmin_blog.js.coffee +56 -0
- data/vendor/assets/stylesheets/activeadmin_blog.css.scss +51 -0
- metadata +180 -0
data/.gitignore
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
*.rbc
|
2
|
+
*.sassc
|
3
|
+
.sass-cache
|
4
|
+
capybara-*.html
|
5
|
+
.rspec
|
6
|
+
/.bundle
|
7
|
+
/vendor/bundle
|
8
|
+
/log/*
|
9
|
+
/tmp/*
|
10
|
+
/db/*.sqlite3
|
11
|
+
/public/system/*
|
12
|
+
/coverage/
|
13
|
+
/spec/tmp/*
|
14
|
+
**.orig
|
15
|
+
rerun.txt
|
16
|
+
pickle-email-*.html
|
17
|
+
pkg
|
18
|
+
*.swp
|
19
|
+
*.swo
|
20
|
+
.DS_Store
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,215 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
activeadmin-blog (0.4.0)
|
5
|
+
activeadmin-mongoid
|
6
|
+
activeadmin-mongoid-reorder
|
7
|
+
activeadmin-settings
|
8
|
+
mongoid_search (~> 0.2.8)
|
9
|
+
mongoid_slug
|
10
|
+
nokogiri
|
11
|
+
|
12
|
+
GEM
|
13
|
+
remote: https://rubygems.org/
|
14
|
+
specs:
|
15
|
+
actionmailer (3.2.8)
|
16
|
+
actionpack (= 3.2.8)
|
17
|
+
mail (~> 2.4.4)
|
18
|
+
actionpack (3.2.8)
|
19
|
+
activemodel (= 3.2.8)
|
20
|
+
activesupport (= 3.2.8)
|
21
|
+
builder (~> 3.0.0)
|
22
|
+
erubis (~> 2.7.0)
|
23
|
+
journey (~> 1.0.4)
|
24
|
+
rack (~> 1.4.0)
|
25
|
+
rack-cache (~> 1.2)
|
26
|
+
rack-test (~> 0.6.1)
|
27
|
+
sprockets (~> 2.1.3)
|
28
|
+
activeadmin (0.4.4)
|
29
|
+
bourbon (>= 1.0.0)
|
30
|
+
devise (>= 1.1.2)
|
31
|
+
fastercsv
|
32
|
+
formtastic (~> 2.1.1)
|
33
|
+
inherited_resources (>= 1.3.1)
|
34
|
+
jquery-rails (>= 1.0.0)
|
35
|
+
kaminari (>= 0.13.0)
|
36
|
+
meta_search (>= 0.9.2)
|
37
|
+
rails (>= 3.0.0)
|
38
|
+
sass (>= 3.1.0)
|
39
|
+
activeadmin-mongoid (0.0.1)
|
40
|
+
activeadmin (~> 0.4)
|
41
|
+
meta_search (>= 1.1.0.pre)
|
42
|
+
mongoid (~> 2.0)
|
43
|
+
sass-rails (~> 3.1, >= 3.1.4)
|
44
|
+
activeadmin-mongoid-reorder (0.2.1)
|
45
|
+
activeadmin-settings (0.3.1)
|
46
|
+
aws-s3
|
47
|
+
carrierwave-mongoid
|
48
|
+
fog
|
49
|
+
heroku-mongo-backup
|
50
|
+
mini_magick
|
51
|
+
mongoid_globalize
|
52
|
+
select2-rails
|
53
|
+
activemodel (3.2.8)
|
54
|
+
activesupport (= 3.2.8)
|
55
|
+
builder (~> 3.0.0)
|
56
|
+
activerecord (3.2.8)
|
57
|
+
activemodel (= 3.2.8)
|
58
|
+
activesupport (= 3.2.8)
|
59
|
+
arel (~> 3.0.2)
|
60
|
+
tzinfo (~> 0.3.29)
|
61
|
+
activeresource (3.2.8)
|
62
|
+
activemodel (= 3.2.8)
|
63
|
+
activesupport (= 3.2.8)
|
64
|
+
activesupport (3.2.8)
|
65
|
+
i18n (~> 0.6)
|
66
|
+
multi_json (~> 1.0)
|
67
|
+
arel (3.0.2)
|
68
|
+
aws-s3 (0.6.3)
|
69
|
+
builder
|
70
|
+
mime-types
|
71
|
+
xml-simple
|
72
|
+
bcrypt-ruby (3.0.1)
|
73
|
+
bourbon (2.1.1)
|
74
|
+
sass (>= 3.1)
|
75
|
+
bson (1.6.4)
|
76
|
+
bson_ext (1.6.4)
|
77
|
+
bson (~> 1.6.4)
|
78
|
+
builder (3.0.0)
|
79
|
+
carrierwave (0.6.2)
|
80
|
+
activemodel (>= 3.2.0)
|
81
|
+
activesupport (>= 3.2.0)
|
82
|
+
carrierwave-mongoid (0.2.1)
|
83
|
+
carrierwave (~> 0.6.1)
|
84
|
+
mongoid (~> 2.1)
|
85
|
+
devise (2.1.2)
|
86
|
+
bcrypt-ruby (~> 3.0)
|
87
|
+
orm_adapter (~> 0.1)
|
88
|
+
railties (~> 3.1)
|
89
|
+
warden (~> 1.2.1)
|
90
|
+
erubis (2.7.0)
|
91
|
+
excon (0.15.5)
|
92
|
+
fast-stemmer (1.0.1)
|
93
|
+
fastercsv (1.5.5)
|
94
|
+
fog (1.5.0)
|
95
|
+
builder
|
96
|
+
excon (~> 0.14)
|
97
|
+
formatador (~> 0.2.0)
|
98
|
+
mime-types
|
99
|
+
multi_json (~> 1.0)
|
100
|
+
net-scp (~> 1.0.4)
|
101
|
+
net-ssh (>= 2.1.3)
|
102
|
+
nokogiri (~> 1.5.0)
|
103
|
+
ruby-hmac
|
104
|
+
formatador (0.2.3)
|
105
|
+
formtastic (2.1.1)
|
106
|
+
actionpack (~> 3.0)
|
107
|
+
has_scope (0.5.1)
|
108
|
+
heroku-mongo-backup (0.3.9)
|
109
|
+
hike (1.2.1)
|
110
|
+
i18n (0.6.0)
|
111
|
+
inherited_resources (1.3.1)
|
112
|
+
has_scope (~> 0.5.0)
|
113
|
+
responders (~> 0.6)
|
114
|
+
journey (1.0.4)
|
115
|
+
jquery-rails (2.0.2)
|
116
|
+
railties (>= 3.2.0, < 5.0)
|
117
|
+
thor (~> 0.14)
|
118
|
+
json (1.7.4)
|
119
|
+
kaminari (0.13.0)
|
120
|
+
actionpack (>= 3.0.0)
|
121
|
+
activesupport (>= 3.0.0)
|
122
|
+
railties (>= 3.0.0)
|
123
|
+
mail (2.4.4)
|
124
|
+
i18n (>= 0.4.0)
|
125
|
+
mime-types (~> 1.16)
|
126
|
+
treetop (~> 1.4.8)
|
127
|
+
meta_search (1.1.3)
|
128
|
+
actionpack (~> 3.1)
|
129
|
+
activerecord (~> 3.1)
|
130
|
+
activesupport (~> 3.1)
|
131
|
+
polyamorous (~> 0.5.0)
|
132
|
+
mime-types (1.19)
|
133
|
+
mini_magick (3.4)
|
134
|
+
subexec (~> 0.2.1)
|
135
|
+
mongo (1.6.2)
|
136
|
+
bson (~> 1.6.2)
|
137
|
+
mongoid (2.4.12)
|
138
|
+
activemodel (~> 3.1)
|
139
|
+
mongo (<= 1.6.2)
|
140
|
+
tzinfo (~> 0.3.22)
|
141
|
+
mongoid_globalize (0.2.1)
|
142
|
+
bson_ext (~> 1.5)
|
143
|
+
mongoid (~> 2.4)
|
144
|
+
mongoid_search (0.2.8)
|
145
|
+
bson_ext (>= 1.2)
|
146
|
+
fast-stemmer (~> 1.0.0)
|
147
|
+
mongoid (>= 2.0.0)
|
148
|
+
mongoid_slug (0.10.0)
|
149
|
+
mongoid (~> 2.0)
|
150
|
+
stringex (~> 1.3)
|
151
|
+
multi_json (1.3.6)
|
152
|
+
net-scp (1.0.4)
|
153
|
+
net-ssh (>= 1.99.1)
|
154
|
+
net-ssh (2.5.2)
|
155
|
+
nokogiri (1.5.5)
|
156
|
+
orm_adapter (0.4.0)
|
157
|
+
polyamorous (0.5.0)
|
158
|
+
activerecord (~> 3.0)
|
159
|
+
polyglot (0.3.3)
|
160
|
+
rack (1.4.1)
|
161
|
+
rack-cache (1.2)
|
162
|
+
rack (>= 0.4)
|
163
|
+
rack-ssl (1.3.2)
|
164
|
+
rack
|
165
|
+
rack-test (0.6.1)
|
166
|
+
rack (>= 1.0)
|
167
|
+
rails (3.2.8)
|
168
|
+
actionmailer (= 3.2.8)
|
169
|
+
actionpack (= 3.2.8)
|
170
|
+
activerecord (= 3.2.8)
|
171
|
+
activeresource (= 3.2.8)
|
172
|
+
activesupport (= 3.2.8)
|
173
|
+
bundler (~> 1.0)
|
174
|
+
railties (= 3.2.8)
|
175
|
+
railties (3.2.8)
|
176
|
+
actionpack (= 3.2.8)
|
177
|
+
activesupport (= 3.2.8)
|
178
|
+
rack-ssl (~> 1.3.2)
|
179
|
+
rake (>= 0.8.7)
|
180
|
+
rdoc (~> 3.4)
|
181
|
+
thor (>= 0.14.6, < 2.0)
|
182
|
+
rake (0.9.2.2)
|
183
|
+
rdoc (3.12)
|
184
|
+
json (~> 1.4)
|
185
|
+
responders (0.9.2)
|
186
|
+
railties (~> 3.1)
|
187
|
+
ruby-hmac (0.4.0)
|
188
|
+
sass (3.2.0)
|
189
|
+
sass-rails (3.2.5)
|
190
|
+
railties (~> 3.2.0)
|
191
|
+
sass (>= 3.1.10)
|
192
|
+
tilt (~> 1.3)
|
193
|
+
select2-rails (3.0.0)
|
194
|
+
thor (~> 0.14)
|
195
|
+
sprockets (2.1.3)
|
196
|
+
hike (~> 1.2)
|
197
|
+
rack (~> 1.0)
|
198
|
+
tilt (~> 1.1, != 1.3.0)
|
199
|
+
stringex (1.4.0)
|
200
|
+
subexec (0.2.2)
|
201
|
+
thor (0.15.4)
|
202
|
+
tilt (1.3.3)
|
203
|
+
treetop (1.4.10)
|
204
|
+
polyglot
|
205
|
+
polyglot (>= 0.3.1)
|
206
|
+
tzinfo (0.3.33)
|
207
|
+
warden (1.2.1)
|
208
|
+
rack (>= 1.0)
|
209
|
+
xml-simple (1.1.1)
|
210
|
+
|
211
|
+
PLATFORMS
|
212
|
+
ruby
|
213
|
+
|
214
|
+
DEPENDENCIES
|
215
|
+
activeadmin-blog!
|
data/README.md
ADDED
@@ -0,0 +1,162 @@
|
|
1
|
+
## activeadmin-blog
|
2
|
+
|
3
|
+
Blog app on the top of activeadmin and mongoid.
|
4
|
+
|
5
|
+
|
6
|
+
## Quick install
|
7
|
+
|
8
|
+
**IMPORTANT**: Make sure local mongodb instance is running.
|
9
|
+
|
10
|
+
Replace `new_blog` name with the real one and run:
|
11
|
+
|
12
|
+
export project_name=new_blog ; curl https://raw.github.com/alexkravets/activeadmin-blog/master/install.sh | sh
|
13
|
+
|
14
|
+
This command creates new rails project fully configured and ready for Heroku deploy.
|
15
|
+
|
16
|
+
|
17
|
+
## Manual Installation
|
18
|
+
|
19
|
+
### Start a new rails project
|
20
|
+
|
21
|
+
$ rails new appname -T -O
|
22
|
+
|
23
|
+
### Setup and configure ActiveAdmin
|
24
|
+
|
25
|
+
Add these gems to Gemfile and run `bundle` command:
|
26
|
+
|
27
|
+
# Activeadmin
|
28
|
+
gem "bson_ext"
|
29
|
+
gem "mongoid"
|
30
|
+
gem "devise"
|
31
|
+
gem "activeadmin-mongoid"
|
32
|
+
|
33
|
+
# Activeadmin Mongoid Blog
|
34
|
+
gem "activeadmin-settings"
|
35
|
+
gem "activeadmin-blog"
|
36
|
+
|
37
|
+
# Bootstrap styles
|
38
|
+
gem "therubyracer"
|
39
|
+
gem "twitter-bootstrap-rails"
|
40
|
+
|
41
|
+
# Assets
|
42
|
+
gem "asset_sync"
|
43
|
+
|
44
|
+
Run following generators:
|
45
|
+
|
46
|
+
$ rails g mongoid:config
|
47
|
+
$ rails g devise:install
|
48
|
+
$ rails g active_admin:install
|
49
|
+
$ rails g redactor:install
|
50
|
+
$ rails g activeadmin_settings:install
|
51
|
+
$ rails g activeadmin_blog:install blog
|
52
|
+
|
53
|
+
Create default admin user for activeadmin:
|
54
|
+
|
55
|
+
rake activeadmin:settings:create_admin
|
56
|
+
|
57
|
+
Run `rails s` blog should be accesible at `http://localhost:3000/blog`
|
58
|
+
|
59
|
+
### Customizing blog views
|
60
|
+
|
61
|
+
Install default views templates to `/app/views/blog`:
|
62
|
+
|
63
|
+
$ rails g activeadmin_blog:views blog
|
64
|
+
|
65
|
+
### Default style
|
66
|
+
|
67
|
+
By default blog is comming with a Twitter Bootstrap typography, to enable it add to `Gemfile`:
|
68
|
+
|
69
|
+
gem "twitter-bootstrap-rails", :git => "git://github.com/seyhunak/twitter-bootstrap-rails.git"
|
70
|
+
|
71
|
+
Install required bootstrap assets:
|
72
|
+
|
73
|
+
rails g bootstrap:install
|
74
|
+
|
75
|
+
Remove `reuire_self` line from `application.js` and `application.css` these are added by bootstrap intall and will break the layout with activeadmin styles.
|
76
|
+
|
77
|
+
In `application.js` include:
|
78
|
+
|
79
|
+
//= require bootstrap
|
80
|
+
|
81
|
+
In `application.css` include:
|
82
|
+
|
83
|
+
/*
|
84
|
+
*= require bootstrap_and_overrides
|
85
|
+
*= require_self
|
86
|
+
*/
|
87
|
+
|
88
|
+
// Tuning styles for kaminari pagination
|
89
|
+
.pagination .page.current {
|
90
|
+
float:left;
|
91
|
+
padding:0 14px;
|
92
|
+
line-height:34px;
|
93
|
+
text-decoration:none;
|
94
|
+
border:1px solid #DDD;
|
95
|
+
border-left-width:0;
|
96
|
+
color:#999;
|
97
|
+
cursor:default;
|
98
|
+
background-color:whiteSmoke;
|
99
|
+
}
|
100
|
+
.pagination span:first-child, .pagination .first a { border-left-width:1px; }
|
101
|
+
|
102
|
+
|
103
|
+
## Heroku
|
104
|
+
|
105
|
+
#### Mongoid
|
106
|
+
|
107
|
+
Configure local and production `config/mongoid.yml` settings to look like this:
|
108
|
+
|
109
|
+
development:
|
110
|
+
host: localhost
|
111
|
+
database: supercaliblog
|
112
|
+
|
113
|
+
test:
|
114
|
+
host: localhost
|
115
|
+
database: supercaliblog_test
|
116
|
+
|
117
|
+
production:
|
118
|
+
uri: <%= ENV["MONGO_URL"] %>
|
119
|
+
|
120
|
+
#### Carrierwave
|
121
|
+
|
122
|
+
Create an S3 bucket for redactor image uploading feature and configure `config/initializers/carrierwave.rb`:
|
123
|
+
|
124
|
+
CarrierWave.configure do |config|
|
125
|
+
config.cache_dir = File.join(Rails.root, "tmp", "uploads")
|
126
|
+
config.storage = :fog
|
127
|
+
|
128
|
+
config.fog_credentials = {
|
129
|
+
:provider => "AWS",
|
130
|
+
:aws_access_key_id => ENV["AWS_ACCESS_KEY_ID"],
|
131
|
+
:aws_secret_access_key => ENV["AWS_SECRET_ACCESS_KEY"]
|
132
|
+
}
|
133
|
+
|
134
|
+
case Rails.env.to_sym
|
135
|
+
when :development
|
136
|
+
config.storage = :file
|
137
|
+
when :production
|
138
|
+
config.fog_directory = ENV["FOG_MEDIA_DIRECTORY"]
|
139
|
+
config.fog_host = "//#{ ENV["FOG_MEDIA_DIRECTORY"] }.s3.amazonaws.com"
|
140
|
+
config.fog_attributes = {"Cache-Control"=>"max-age=315576000"} # optional, defaults to {}
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
Make sure you've set Heroku environtment variables:
|
145
|
+
|
146
|
+
FOG_MEDIA_DIRECTORY
|
147
|
+
AWS_ACCESS_KEY_ID
|
148
|
+
AWS_SECRET_ACCESS_KEY
|
149
|
+
MONGO_URL
|
150
|
+
|
151
|
+
#### Production assets
|
152
|
+
|
153
|
+
Add the following line to `config/environments/production.rb`:
|
154
|
+
|
155
|
+
config.assets.precompile += ["active_admin.js", "active_admin.css", "redactor/css/style.css"]
|
156
|
+
|
157
|
+
|
158
|
+
## TODO
|
159
|
+
|
160
|
+
- Admin blog post search;
|
161
|
+
|
162
|
+
### The End
|
data/Rakefile
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/activeadmin-blog/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.name = 'activeadmin-blog'
|
6
|
+
gem.summary = 'Blog app on the top of activeadmin and mongoid.'
|
7
|
+
gem.description = ''
|
8
|
+
gem.license = 'MIT'
|
9
|
+
|
10
|
+
gem.authors = ['Alex Kravets']
|
11
|
+
gem.email = 'santyor@gmail.com'
|
12
|
+
gem.homepage = 'https://github.com/alexkravets/activeadmin-blog'
|
13
|
+
|
14
|
+
gem.files = `git ls-files`.split($\)
|
15
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
16
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
17
|
+
gem.require_paths = ['lib']
|
18
|
+
gem.version = ActiveadminBlog::VERSION
|
19
|
+
|
20
|
+
# Supress the warning about no rubyforge project
|
21
|
+
gem.rubyforge_project = 'nowarning'
|
22
|
+
|
23
|
+
# Dependencies
|
24
|
+
gem.add_runtime_dependency "nokogiri"
|
25
|
+
gem.add_runtime_dependency "mongoid_slug"
|
26
|
+
gem.add_runtime_dependency "mongoid_search", "~> 0.2.8" # "mongoid_search" this uses mongoid 3.x
|
27
|
+
gem.add_runtime_dependency "activeadmin-mongoid-reorder"
|
28
|
+
gem.add_runtime_dependency "activeadmin-mongoid"
|
29
|
+
gem.add_runtime_dependency "activeadmin-settings"
|
30
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class ActiveadminBlog::PostsController < ApplicationController
|
2
|
+
before_filter :load_categories
|
3
|
+
|
4
|
+
def load_categories
|
5
|
+
@categories = ActiveadminBlog::BlogCategory.all
|
6
|
+
end
|
7
|
+
|
8
|
+
def index
|
9
|
+
@posts = ActiveadminBlog::BlogPost.published
|
10
|
+
@posts = @posts.page params[:page]
|
11
|
+
end
|
12
|
+
|
13
|
+
def search
|
14
|
+
search_query = params[:q]
|
15
|
+
@posts = ActiveadminBlog::BlogPost.blog_search(search_query)
|
16
|
+
@posts = @posts.page params[:page]
|
17
|
+
end
|
18
|
+
|
19
|
+
def category
|
20
|
+
category_slug = params[:slug]
|
21
|
+
@posts = ActiveadminBlog::BlogPost.published_in_category(category_slug)
|
22
|
+
@posts = @posts.page params[:page]
|
23
|
+
end
|
24
|
+
|
25
|
+
def archive
|
26
|
+
month = params[:m].to_i
|
27
|
+
year = params[:y].to_i
|
28
|
+
@posts = ActiveadminBlog::BlogPost.published_in_month(month, year)
|
29
|
+
@posts = @posts.page params[:page]
|
30
|
+
end
|
31
|
+
|
32
|
+
def tag
|
33
|
+
tag = params[:tag]
|
34
|
+
@posts = ActiveadminBlog::BlogPost.tagged_with(tag)
|
35
|
+
@posts = @posts.page params[:page]
|
36
|
+
end
|
37
|
+
|
38
|
+
def show
|
39
|
+
@post = ActiveadminBlog::BlogPost.find_by_permalink!(params[:slug])
|
40
|
+
end
|
41
|
+
|
42
|
+
def feed
|
43
|
+
@posts = ActiveadminBlog::BlogPost.published
|
44
|
+
|
45
|
+
respond_to do |format|
|
46
|
+
format.rss { render :layout => false } #index.rss.builder
|
47
|
+
format.all { head :not_found }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|