blogit 1.0.0.rc1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +28 -31
- data/Rakefile +6 -2
- data/app/assets/stylesheets/blogit/themes/default.css +4 -0
- data/app/assets/stylesheets/blogit/themes/default.css.map +7 -0
- data/app/assets/stylesheets/blogit/themes/default.min.css +2 -0
- data/app/assets/stylesheets/blogit/themes/default.min.css.map +7 -0
- data/app/assets/stylesheets/blogit/themes/default.sass +2 -0
- data/app/assets/stylesheets/blogit/themes/default/base/_colors.sass +1 -0
- data/app/assets/stylesheets/blogit/themes/default/base/_typography.sass +1 -0
- data/app/assets/stylesheets/blogit/themes/default/blocks/_archives.sass +18 -0
- data/app/assets/stylesheets/blogit/themes/default/blocks/_comments.sass +7 -0
- data/app/assets/stylesheets/blogit/themes/default/blocks/_forms.sass +9 -0
- data/app/assets/stylesheets/blogit/themes/default/blocks/_headers.sass +4 -0
- data/app/assets/stylesheets/blogit/themes/default/blocks/_posts.sass +8 -0
- data/app/assets/stylesheets/blogit/themes/default/blocks/_related_posts_list.sass +3 -0
- data/app/assets/stylesheets/blogit/themes/default/blocks/_share_bars.sass +7 -0
- data/app/{views/blogit/posts/_no_comments.html.erb → assets/stylesheets/blogit/themes/default/blocks/_tag_list.sass} +0 -0
- data/app/assets/stylesheets/blogit/themes/default/blocks/_tags.sass +4 -0
- data/app/controllers/blogit/application_controller.rb +15 -31
- data/app/controllers/blogit/comments_controller.rb +48 -30
- data/app/controllers/blogit/posts_controller.rb +52 -86
- data/app/helpers/blogit/application_helper.rb +59 -69
- data/app/helpers/blogit/comments_helper.rb +20 -0
- data/app/helpers/blogit/layout_helper.rb +33 -0
- data/app/helpers/blogit/posts_helper.rb +36 -34
- data/app/models/blogit/post.rb +55 -6
- data/app/views/blogit/archive/_list.html.erb +5 -0
- data/app/views/blogit/archive/_month.html.erb +9 -0
- data/app/views/blogit/archive/_year.html.erb +7 -0
- data/app/views/blogit/{posts → comments}/_active_record_comments.html.erb +2 -1
- data/app/views/blogit/comments/_comment.html.erb +10 -14
- data/app/views/blogit/comments/_comments_count.html.erb +8 -0
- data/app/views/blogit/{posts → comments}/_disqus_comments.html.erb +0 -0
- data/app/views/blogit/comments/_form.html.erb +25 -18
- data/app/views/blogit/comments/_no_comments.html.erb +0 -0
- data/app/views/blogit/comments/create.js.erb +2 -2
- data/app/views/blogit/posts/_archiveable.html.erb +3 -0
- data/app/views/blogit/posts/_blog_post_spacer.html.erb +1 -1
- data/app/views/blogit/posts/_blogger_information.html.erb +9 -4
- data/app/views/blogit/posts/_meta_tags.html.erb +32 -0
- data/app/views/blogit/posts/_post.html.erb +6 -9
- data/app/views/blogit/posts/_post_footer.html.erb +1 -0
- data/app/views/blogit/posts/_post_head.html.erb +3 -2
- data/app/views/blogit/posts/_related.html.erb +7 -16
- data/app/views/blogit/posts/_related_post.html.erb +4 -0
- data/app/views/blogit/posts/_share_bar.html.erb +5 -6
- data/app/views/blogit/posts/_tags.html.erb +8 -0
- data/app/views/blogit/posts/index.html.erb +16 -11
- data/app/views/blogit/posts/show.html.erb +28 -4
- data/app/views/blogit/tags/_tag.html.erb +3 -0
- data/config/locales/en.yml +3 -2
- data/config/spring.rb +1 -0
- data/db/migrate/20150618184415_add_description_to_posts.rb +5 -0
- data/lib/blogit.rb +4 -5
- data/lib/blogit/archive.rb +8 -0
- data/lib/blogit/archive/archive_error.rb +3 -0
- data/lib/blogit/archive/archiveable.rb +20 -0
- data/lib/blogit/archive/list.rb +52 -0
- data/lib/blogit/archive/month.rb +34 -0
- data/lib/blogit/archive/year.rb +40 -0
- data/lib/blogit/blogs.rb +11 -5
- data/lib/blogit/configuration.rb +157 -147
- data/lib/blogit/parsers/html_parser.rb +6 -3
- data/lib/blogit/parsers/markdown_parser.rb +30 -5
- data/lib/blogit/parsers/textile_parser.rb +18 -8
- data/lib/blogit/renderers/html_with_albino.rb +1 -1
- data/lib/blogit/version.rb +1 -1
- data/lib/generators/templates/blogit.rb +23 -57
- data/lib/tasks/blogit.rake +42 -0
- data/lib/tasks/blogit/css.rake +22 -0
- data/lib/tasks/blogit/doc.rake +21 -0
- data/lib/tasks/seed_blog_posts.yml +95 -0
- data/lib/validators/absence_validator.rb +2 -2
- data/spec/blogit_spec.rb +3 -3
- data/spec/controllers/blogit/comments_controller_spec.rb +31 -86
- data/spec/controllers/blogit/posts_controller_spec.rb +33 -344
- data/spec/dummy/Rakefile +1 -1
- data/spec/dummy/app/assets/stylesheets/application.sass +7 -0
- data/spec/dummy/app/assets/stylesheets/base.sass +1 -0
- data/spec/dummy/app/assets/stylesheets/base/_html.sass +15 -0
- data/spec/dummy/app/assets/stylesheets/blocks.sass +1 -0
- data/spec/dummy/app/assets/stylesheets/blocks/_layout.sass +21 -0
- data/spec/dummy/app/views/layouts/application.html.erb +21 -18
- data/spec/dummy/app/views/layouts/custom.html.erb +2 -1
- data/spec/dummy/config.ru +0 -1
- data/spec/dummy/config/application.rb +1 -0
- data/spec/dummy/config/database.yml +5 -3
- data/spec/dummy/config/environments/production.rb +7 -2
- data/spec/dummy/config/environments/test.rb +6 -1
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/{20140511174024_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb → 20150619080551_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb} +0 -0
- data/spec/dummy/db/migrate/{20140511174025_add_missing_unique_indices.acts_as_taggable_on_engine.rb → 20150619080552_add_missing_unique_indices.acts_as_taggable_on_engine.rb} +0 -0
- data/spec/dummy/db/migrate/{20140511174026_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb → 20150619080553_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb} +0 -0
- data/spec/dummy/db/migrate/20150619080554_add_missing_taggable_index.acts_as_taggable_on_engine.rb +10 -0
- data/spec/dummy/db/migrate/20150619080555_change_collation_for_tag_names.acts_as_taggable_on_engine.rb +10 -0
- data/spec/dummy/db/schema.rb +9 -7
- data/spec/dummy/db/seeds.rb +17 -0
- data/spec/dummy/lib/tasks/dummy.rake +29 -0
- data/spec/dummy/log/development.log +22286 -1489
- data/spec/dummy/log/test.log +4608 -11518
- data/spec/factories.rb +10 -5
- data/spec/helpers/blogit/application_helper_spec.rb +10 -73
- data/spec/helpers/blogit/posts_helper_spec.rb +8 -63
- data/spec/injectables/dummy_archiveable.rb +6 -0
- data/spec/lib/archive/list_spec.rb +60 -0
- data/spec/lib/archive/month_spec.rb +17 -0
- data/spec/lib/archive/year_spec.rb +38 -0
- data/spec/lib/blogit/parsers/html_parser_spec.rb +1 -1
- data/spec/lib/blogit/parsers/markdown_parser_spec.rb +7 -6
- data/spec/lib/blogit/parsers/textile_parser_spec.rb +1 -1
- data/spec/lib/blogs_spec.rb +2 -2
- data/spec/lib/configuration_spec.rb +21 -49
- data/spec/models/blogit/comment_spec.rb +19 -19
- data/spec/models/blogit/post_spec.rb +63 -28
- data/spec/rails_helper.rb +28 -0
- data/spec/spec_helper.rb +2 -11
- data/spec/support/helpers/css_matchers.rb +42 -0
- metadata +193 -124
- data/app/assets/stylesheets/blogit/index.css +0 -84
- data/app/views/blogit/comments/_admin_links.html.erb +0 -3
- data/app/views/blogit/posts/_comments_count.html.erb +0 -5
- data/app/views/blogit/posts/_form.html.erb +0 -49
- data/app/views/blogit/posts/_post_body.html.erb +0 -1
- data/app/views/blogit/posts/_post_links.html.erb +0 -6
- data/app/views/blogit/posts/edit.html.erb +0 -3
- data/app/views/blogit/posts/new.html.erb +0 -3
- data/lib/tasks/blog_tasks.rake +0 -4
- data/spec/dummy/app/assets/stylesheets/application.css +0 -21
- data/spec/dummy/config/initializers/blogit.rb +0 -88
- data/spec/dummy/db/migrate/20140511174028_create_blogit_posts.blogit.rb +0 -16
- data/spec/dummy/db/migrate/20140511174029_create_blogit_comments.blogit.rb +0 -16
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/tmp/cache/assets/CB5/DD0/sprockets%2F346324d2a51df58457807bee661c449c +0 -0
- data/spec/dummy/tmp/cache/assets/CB6/ED0/sprockets%2F4390d06699f3ad4262e342be530f9f91 +0 -0
- data/spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/CE7/230/sprockets%2F6f493a817d97133a8dbf674bcd322670 +0 -0
- data/spec/dummy/tmp/cache/assets/CEA/490/sprockets%2F9697d4fb1ed26d80f3c715611c8d4373 +0 -0
- data/spec/dummy/tmp/cache/assets/CEE/310/sprockets%2F89642af8492e579dcd7162a0e2b7f155 +0 -0
- data/spec/dummy/tmp/cache/assets/D01/8C0/sprockets%2F332d5a9ce3e800c6c4a7a99058023ba2 +0 -0
- data/spec/dummy/tmp/cache/assets/D11/CC0/sprockets%2F3a12dfa6665b5318fa99d097203ac7e7 +0 -0
- data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/D3D/1E0/sprockets%2Ffbaabd57fa2c9d426f0c318156705667 +0 -0
- data/spec/dummy/tmp/cache/assets/D3E/920/sprockets%2F3efa8d0fc958c223647cb704183b65ca +0 -0
- data/spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/D61/6F0/sprockets%2F02da53eeca228bcef0c49278517111fe +0 -0
- data/spec/dummy/tmp/cache/assets/DCA/9B0/sprockets%2Fdf0e8f8a85e5d4056b3fe1cec3b7131a +0 -0
- data/spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/E02/A60/sprockets%2Fb32faeede196f7a933c3a2794e7ed0bd +0 -0
- data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/02da53eeca228bcef0c49278517111fe +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2ff93f9f5ed9970021c7704ff93237c8 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/332d5a9ce3e800c6c4a7a99058023ba2 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/346324d2a51df58457807bee661c449c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3a12dfa6665b5318fa99d097203ac7e7 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/3ed52366904e135bd833590814b6ac6d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/4390d06699f3ad4262e342be530f9f91 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6f493a817d97133a8dbf674bcd322670 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/89642af8492e579dcd7162a0e2b7f155 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/89dc196c51ae83634b664c0c33052008 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/8dd8236b00c868ba248fe30cd9c14c2a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/9239a04d094a872c1cf77ac391072ea8 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/b3ffb6bd243399012806331ce393ae4f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d53accc3e58037ee4005e41221b8846b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/df0e8f8a85e5d4056b3fe1cec3b7131a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/routing/post_routing_spec.rb +0 -49
@@ -1,94 +1,84 @@
|
|
1
1
|
module Blogit
|
2
2
|
module ApplicationHelper
|
3
|
-
|
4
|
-
TIMETAG_FORMAT = "%Y-%m-%dT%TZ"
|
5
|
-
|
6
|
-
# Creates a div tag with class 'blog_' + (post|comment) + '_' + name
|
7
|
-
# Eg:
|
8
|
-
# blog_tag(:title, "") # => <div class="blog_post_title"></div>
|
9
|
-
# blog_tag(:email, "", {:type => "comment"}) # => <div class="blog_comment_email"></div>
|
10
|
-
# blog_tag(:tweet, "", {:type => "status"}) # => <div class="blog_status_tweet"></div>
|
11
|
-
def blog_tag(name, content_or_options = {}, options = {}, &block)
|
12
|
-
tag_type = options.delete(:type) || "post"
|
13
|
-
|
14
|
-
if block_given?
|
15
|
-
content = capture(&block)
|
16
|
-
options = content_or_options
|
17
|
-
else
|
18
|
-
content = content_or_options
|
19
|
-
end
|
20
|
-
options[:class] = "#{options[:class]} blog_#{tag_type}_#{name}".strip
|
21
|
-
content_tag(name, content, options)
|
22
|
-
end
|
23
|
-
|
3
|
+
|
24
4
|
# Format content using the {Blogit::Configuration#default_parser_class default_parser_class}
|
5
|
+
#
|
6
|
+
# content - A String containing the content to be formatted (defaults: nil)
|
7
|
+
# block - A Proc that returns a String of content to be formatted
|
8
|
+
#
|
9
|
+
# Examples
|
10
|
+
#
|
11
|
+
# format_content("# This is a Markdown header")
|
12
|
+
# # => "<h1>This is a Markdown header</h1>"
|
13
|
+
#
|
14
|
+
# format_content do
|
15
|
+
# "some text"
|
16
|
+
# end
|
17
|
+
# # => "<p>some text</p>"
|
18
|
+
#
|
19
|
+
# Returns an HTML safe String.
|
25
20
|
def format_content(content = nil, &block)
|
26
21
|
content = capture(&block) if block_given?
|
27
|
-
parser
|
28
|
-
parser.parsed.html_safe
|
22
|
+
parser = Blogit::configuration.default_parser_class.new(content)
|
23
|
+
parser.parsed.to_s.html_safe
|
29
24
|
end
|
30
25
|
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
26
|
+
# The first error message for an ActiveRecord::Base model instance attribute
|
27
|
+
#
|
28
|
+
# object - An ActiveRecord::Base instance to check
|
29
|
+
# attribute - A Symbol or String with the attribute name to check errors on
|
30
|
+
#
|
31
|
+
# Examples
|
32
|
+
#
|
33
|
+
# errors_on(@user, :first_name)
|
34
|
+
# # => "Can't be blank"
|
35
|
+
#
|
36
|
+
# Returns a String with the error message
|
35
37
|
def errors_on(object, attribute)
|
36
38
|
error_message = object.errors[attribute].first
|
37
39
|
content_tag(:span, error_message, class: "blogit_error_message") if error_message
|
38
40
|
end
|
39
41
|
|
40
|
-
# A helper method for creating a
|
41
|
-
#
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
# A
|
47
|
-
#
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
# Will only render content if there is a logged in user
|
54
|
-
def login_required(content_or_options={}, options ={}, &block)
|
55
|
-
if current_blogger and blogit_conf.include_admin_links
|
56
|
-
div_with_default_class(:login_required, content_or_options, options, &block)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
# Can search for named routes directly in the main app, omitting
|
61
|
-
# the "main_app." prefix
|
62
|
-
def method_missing method, *args, &block
|
63
|
-
if main_app_url_helper?(method)
|
64
|
-
main_app.send(method, *args)
|
42
|
+
# A helper method for creating a div tag with class 'field'. Used for separating
|
43
|
+
# form fields.
|
44
|
+
#
|
45
|
+
# content_or_options - The content to include in the div when not using a block. The
|
46
|
+
# options Hash when using a block
|
47
|
+
# options - The options when not using a block
|
48
|
+
# block - A block that returns HTML content to include in the div
|
49
|
+
#
|
50
|
+
# Returns an HTML safe String
|
51
|
+
def field(content_or_options = {}, options ={}, &block)
|
52
|
+
if block_given?
|
53
|
+
options = content_or_options
|
54
|
+
content = capture(&block)
|
65
55
|
else
|
66
|
-
|
56
|
+
content = content_or_options
|
67
57
|
end
|
68
|
-
|
69
|
-
|
70
|
-
def respond_to?(method)
|
71
|
-
main_app_url_helper?(method) or super
|
72
|
-
end
|
73
|
-
|
74
|
-
private
|
75
|
-
|
76
|
-
def main_app_url_helper?(method)
|
77
|
-
Blogit::configuration.inline_main_app_named_routes and
|
78
|
-
(method.to_s.end_with?('_path') or method.to_s.end_with?('_url')) and
|
79
|
-
main_app.respond_to?(method)
|
58
|
+
options[:class] = Array(options[:class]) + ["field"]
|
59
|
+
content_tag(:div, content, options)
|
80
60
|
end
|
81
61
|
|
82
|
-
|
62
|
+
# A helper method for creating a div tag with class 'actions'. Used as a wrapper
|
63
|
+
# for form actions.
|
64
|
+
#
|
65
|
+
# content_or_options - The content to include in the div when not using a block. The
|
66
|
+
# options Hash when using a block
|
67
|
+
# options - The options when not using a block
|
68
|
+
# block - A block that returns HTML content to include in the div
|
69
|
+
#
|
70
|
+
# Returns an HTML safe String
|
71
|
+
def actions(content_or_options={}, options ={}, &block)
|
83
72
|
if block_given?
|
84
|
-
content = capture(&block)
|
85
73
|
options = content_or_options
|
74
|
+
content = capture(&block)
|
86
75
|
else
|
87
76
|
content = content_or_options
|
88
77
|
end
|
89
|
-
options[:class] =
|
78
|
+
options[:class] = Array(options[:class]) + ["actions"]
|
90
79
|
content_tag(:div, content, options)
|
91
80
|
end
|
92
81
|
|
93
82
|
end
|
94
|
-
|
83
|
+
|
84
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Blogit
|
2
|
+
|
3
|
+
module CommentsHelper
|
4
|
+
|
5
|
+
# The commenter's name for a Comment. When the Comment has a website, includes an html
|
6
|
+
# link containing their name. Otherwise, just shows the name as a String.
|
7
|
+
#
|
8
|
+
# comment - A {Blogit::Comment}
|
9
|
+
#
|
10
|
+
# Returns a String containing the commenter's name.
|
11
|
+
def name_for_comment(comment)
|
12
|
+
if comment.website?
|
13
|
+
link_to(comment.name, comment.website, class: "blogit_comment__name_link")
|
14
|
+
else
|
15
|
+
comment.name
|
16
|
+
end + " " + t('wrote', scope: "blogit.comments")
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Blogit
|
2
|
+
|
3
|
+
module LayoutHelper
|
4
|
+
|
5
|
+
# Sets or returns the title for a page
|
6
|
+
#
|
7
|
+
# content - The content to include in the HTML title tag.
|
8
|
+
#
|
9
|
+
# Returns a String
|
10
|
+
def title(content=nil)
|
11
|
+
if content
|
12
|
+
content_for(:title, content)
|
13
|
+
else
|
14
|
+
content_for(:title)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Sets or returns the description for a page. Formats the content if it's Markdown or
|
19
|
+
# HTML and strips out the HTML tags.
|
20
|
+
#
|
21
|
+
# content - The content to include in the HTML meta description tag.
|
22
|
+
#
|
23
|
+
# Returns a String
|
24
|
+
def description(content=nil)
|
25
|
+
if content
|
26
|
+
content_for(:description, strip_tags(format_content(content)).html_safe)
|
27
|
+
else
|
28
|
+
content_for(:description)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -1,45 +1,47 @@
|
|
1
1
|
module Blogit
|
2
2
|
module PostsHelper
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
|
4
|
+
require "blogit/archive"
|
5
|
+
|
6
|
+
# Renders the comments for a {Post} based on the
|
7
|
+
# {Blogit::Configuration::include_comments} configuration
|
8
|
+
def comments_for_post(post)
|
9
|
+
comment_type = Blogit.configuration.include_comments
|
10
|
+
render(partial: "blogit/comments/#{comment_type}_comments",
|
11
|
+
locals: { post: post, comment: Blogit::Comment.new })
|
7
12
|
end
|
8
13
|
|
9
|
-
#
|
10
|
-
|
14
|
+
# Renders the comments for a JS share bar based on the
|
15
|
+
# {Blogit::Configuration::include_share_bar} configuration
|
16
|
+
def share_bar_for_post(post)
|
11
17
|
return "" unless Blogit.configuration.include_share_bar
|
12
18
|
render(partial: "blogit/posts/share_bar", locals: { post: post})
|
13
19
|
end
|
20
|
+
|
21
|
+
# Returns the {Post Posts} that share one or more of the same tags for a given post
|
22
|
+
#
|
23
|
+
# post - A {Post} instance
|
24
|
+
#
|
25
|
+
# Returns a collection of {Post Posts}
|
26
|
+
def related_posts_for_post(post)
|
27
|
+
post.find_related_on_tags.active
|
28
|
+
end
|
14
29
|
|
15
|
-
# Creates a ul tag tree with posts by year and
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
# @
|
21
|
-
#
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
result << "<li><a data-blogit-click-to-toggle-children>#{year}</a><ul class=\"#{month_css}\">"
|
31
|
-
posts_by_month.each do |month, posts|
|
32
|
-
result << "<li><a data-blogit-click-to-toggle-children>#{CGI.escape_html(month)}</a><ul class=\"#{post_css}\">"
|
33
|
-
posts.each do |post|
|
34
|
-
result << "<li>#{link_to(post.title, blogit.post_path(post))}</li>"
|
35
|
-
end
|
36
|
-
result << "</ul></li>"
|
37
|
-
end
|
38
|
-
result << "</ul></li>"
|
39
|
-
end
|
40
|
-
result << "</ul>"
|
41
|
-
|
42
|
-
result.join.html_safe
|
30
|
+
# Creates a ul tag tree with posts by year and months. Include blogit/archive.js in
|
31
|
+
# your js to enabled expand collapse.
|
32
|
+
#
|
33
|
+
# Examples
|
34
|
+
#
|
35
|
+
# <%= archive_list_for_posts(@posts) %>
|
36
|
+
# # => <div class="blogit_archive">
|
37
|
+
# <ul class="blogit_archive__list blogit_archive__list--years">
|
38
|
+
# ...
|
39
|
+
# </ul>
|
40
|
+
# </div>
|
41
|
+
#
|
42
|
+
# Returns an HTML safe String
|
43
|
+
def archive_list_for_posts(archive_posts)
|
44
|
+
render Blogit::Archive::List.new(archive_posts)
|
43
45
|
end
|
44
46
|
|
45
47
|
end
|
data/app/models/blogit/post.rb
CHANGED
@@ -18,31 +18,67 @@ module Blogit
|
|
18
18
|
# ===============
|
19
19
|
|
20
20
|
validates :title, presence: true, length: { minimum: 10, maximum: 66 }
|
21
|
+
|
21
22
|
validates :body, presence: true, length: { minimum: 10 }
|
23
|
+
|
24
|
+
validates :description, presence: Blogit.configuration.show_post_description
|
25
|
+
|
22
26
|
validates :blogger_id, presence: true
|
27
|
+
|
23
28
|
validates :state, presence: true
|
24
29
|
|
25
30
|
# ================
|
26
31
|
# = Associations =
|
27
32
|
# ================
|
28
33
|
|
34
|
+
##
|
35
|
+
# The blogger (User, Admin, etc.) who wrote this Post
|
36
|
+
#
|
37
|
+
# Returns a Blogger (polymorphic type)
|
29
38
|
belongs_to :blogger, :polymorphic => true
|
30
39
|
|
40
|
+
##
|
41
|
+
# The {Comment Comments} written on this Post
|
42
|
+
#
|
43
|
+
# Returns an ActiveRecord::Relation instance
|
31
44
|
has_many :comments, :class_name => "Blogit::Comment"
|
32
45
|
|
33
46
|
# ==========
|
34
47
|
# = Scopes =
|
35
48
|
# ==========
|
36
49
|
|
37
|
-
|
38
|
-
|
39
|
-
|
50
|
+
scope :for_index, lambda { |page_no = 1|
|
51
|
+
active.order("created_at DESC").page(page_no) }
|
52
|
+
|
40
53
|
scope :active, lambda { where(state: Blogit.configuration.active_states ) }
|
41
54
|
|
55
|
+
|
56
|
+
# The posts to be displayed for RSS and XML feeds/sitemaps
|
57
|
+
#
|
58
|
+
# Returns an ActiveRecord::Relation
|
59
|
+
def self.for_feed
|
60
|
+
active.order('created_at DESC')
|
61
|
+
end
|
62
|
+
|
63
|
+
# Finds an active post with given id
|
64
|
+
#
|
65
|
+
# id - The id of the Post to find
|
66
|
+
#
|
67
|
+
# Returns a Blogit::Post
|
68
|
+
# Raises ActiveRecord::NoMethodError if no Blogit::Post could be found
|
69
|
+
def self.active_with_id(id)
|
70
|
+
active.find(id)
|
71
|
+
end
|
72
|
+
|
42
73
|
# ====================
|
43
74
|
# = Instance Methods =
|
44
75
|
# ====================
|
45
76
|
|
77
|
+
# TODO: Get published at working properly!
|
78
|
+
def published_at
|
79
|
+
created_at
|
80
|
+
end
|
81
|
+
|
46
82
|
def to_param
|
47
83
|
"#{id}-#{title.parameterize}"
|
48
84
|
end
|
@@ -62,8 +98,11 @@ module Blogit
|
|
62
98
|
end
|
63
99
|
|
64
100
|
|
65
|
-
#
|
66
|
-
#
|
101
|
+
# The blogger who wrote this {Post Post's} display name
|
102
|
+
#
|
103
|
+
# Returns the blogger's display name as a String if it's set.
|
104
|
+
# Returns an empty String if blogger is not present.
|
105
|
+
# Raises a ConfigurationError if the method called is not defined on {#blogger}
|
67
106
|
def blogger_display_name
|
68
107
|
if self.blogger and !self.blogger.respond_to?(Blogit.configuration.blogger_display_name_method)
|
69
108
|
raise ConfigurationError,
|
@@ -71,12 +110,22 @@ module Blogit
|
|
71
110
|
elsif self.blogger.nil?
|
72
111
|
""
|
73
112
|
else
|
74
|
-
|
113
|
+
blogger.send(Blogit.configuration.blogger_display_name_method)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# If there's a blogger and that blogger responds to :twitter_username, returns that.
|
118
|
+
# Otherwise, returns nil
|
119
|
+
def blogger_twitter_username
|
120
|
+
if blogger and blogger.respond_to?(:twitter_username)
|
121
|
+
blogger.twitter_username
|
75
122
|
end
|
76
123
|
end
|
124
|
+
|
77
125
|
|
78
126
|
private
|
79
127
|
|
128
|
+
|
80
129
|
def check_comments_config
|
81
130
|
raise RuntimeError.new("Posts only allow active record comments (check blogit configuration)") unless Blogit.configuration.include_comments == :active_record
|
82
131
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<li class="blogit_archive__item blogit_archive__item--month">
|
2
|
+
<%= link_to(month, '#', class: "blogit_archive__toggle_link",
|
3
|
+
data: { blogit_click_to_toggle_children: true }) %>
|
4
|
+
<ul class="blogit_archive__list blogit_archive__list--archiveables">
|
5
|
+
<% for archiveable in month.archiveables %>
|
6
|
+
<%= render partial: "#{archiveable.model_name.i18n_key.to_s.pluralize}/archiveable", object: archiveable, as: archiveable.model_name.singular_route_key %>
|
7
|
+
<% end %>
|
8
|
+
</ul>
|
9
|
+
</li>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<li class="blogit_archive__item blogit_archive__item--year">
|
2
|
+
<%= link_to(year, '#', class: 'blogit_archive__toggle_link',
|
3
|
+
data: { blogit_click_to_toggle_children: true }) %>
|
4
|
+
<ul class="blogit_archive__list blogit_archive__list--months">
|
5
|
+
<%= render year.months %>
|
6
|
+
</ul>
|
7
|
+
</li>
|
@@ -1,21 +1,17 @@
|
|
1
|
-
<%= content_tag(:
|
2
|
-
<%= content_tag(:div, class: "blog_comment_name", id: "blog_comment_#{comment.id}_name") do %>
|
3
|
-
<%= comment.website? ? link_to(comment.name, comment.website) : comment.name %>
|
4
|
-
<%= t('blogit.comments.wrote') %>
|
5
|
-
<% end %>
|
1
|
+
<%= content_tag(:div, id: "blogit_comment_#{comment.id}", class: "blogit_comment") do %>
|
6
2
|
|
3
|
+
<div class="blogit_comment__name">
|
4
|
+
<%= name_for_comment(comment) %>
|
5
|
+
</div>
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
<% end %>
|
7
|
+
<div class="blogit_comment__body">
|
8
|
+
<%= format_content(comment.body.to_s) %>
|
9
|
+
</div>
|
12
10
|
|
13
|
-
|
14
|
-
<%=t
|
11
|
+
<div class="blogit_comment__created_at">
|
12
|
+
<%= t(:posted_on, scope: 'blogit.comments') %>
|
15
13
|
<%= time_tag(comment.created_at, format: blogit_conf.datetime_format) %>
|
16
|
-
|
17
|
-
|
18
|
-
<%= render partial: "blogit/comments/admin_links", locals: {comment: comment} %>
|
14
|
+
</div>
|
19
15
|
|
20
16
|
<% end if comment.persisted? %>
|
21
17
|
|