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.
Files changed (173) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +28 -31
  3. data/Rakefile +6 -2
  4. data/app/assets/stylesheets/blogit/themes/default.css +4 -0
  5. data/app/assets/stylesheets/blogit/themes/default.css.map +7 -0
  6. data/app/assets/stylesheets/blogit/themes/default.min.css +2 -0
  7. data/app/assets/stylesheets/blogit/themes/default.min.css.map +7 -0
  8. data/app/assets/stylesheets/blogit/themes/default.sass +2 -0
  9. data/app/assets/stylesheets/blogit/themes/default/base/_colors.sass +1 -0
  10. data/app/assets/stylesheets/blogit/themes/default/base/_typography.sass +1 -0
  11. data/app/assets/stylesheets/blogit/themes/default/blocks/_archives.sass +18 -0
  12. data/app/assets/stylesheets/blogit/themes/default/blocks/_comments.sass +7 -0
  13. data/app/assets/stylesheets/blogit/themes/default/blocks/_forms.sass +9 -0
  14. data/app/assets/stylesheets/blogit/themes/default/blocks/_headers.sass +4 -0
  15. data/app/assets/stylesheets/blogit/themes/default/blocks/_posts.sass +8 -0
  16. data/app/assets/stylesheets/blogit/themes/default/blocks/_related_posts_list.sass +3 -0
  17. data/app/assets/stylesheets/blogit/themes/default/blocks/_share_bars.sass +7 -0
  18. data/app/{views/blogit/posts/_no_comments.html.erb → assets/stylesheets/blogit/themes/default/blocks/_tag_list.sass} +0 -0
  19. data/app/assets/stylesheets/blogit/themes/default/blocks/_tags.sass +4 -0
  20. data/app/controllers/blogit/application_controller.rb +15 -31
  21. data/app/controllers/blogit/comments_controller.rb +48 -30
  22. data/app/controllers/blogit/posts_controller.rb +52 -86
  23. data/app/helpers/blogit/application_helper.rb +59 -69
  24. data/app/helpers/blogit/comments_helper.rb +20 -0
  25. data/app/helpers/blogit/layout_helper.rb +33 -0
  26. data/app/helpers/blogit/posts_helper.rb +36 -34
  27. data/app/models/blogit/post.rb +55 -6
  28. data/app/views/blogit/archive/_list.html.erb +5 -0
  29. data/app/views/blogit/archive/_month.html.erb +9 -0
  30. data/app/views/blogit/archive/_year.html.erb +7 -0
  31. data/app/views/blogit/{posts → comments}/_active_record_comments.html.erb +2 -1
  32. data/app/views/blogit/comments/_comment.html.erb +10 -14
  33. data/app/views/blogit/comments/_comments_count.html.erb +8 -0
  34. data/app/views/blogit/{posts → comments}/_disqus_comments.html.erb +0 -0
  35. data/app/views/blogit/comments/_form.html.erb +25 -18
  36. data/app/views/blogit/comments/_no_comments.html.erb +0 -0
  37. data/app/views/blogit/comments/create.js.erb +2 -2
  38. data/app/views/blogit/posts/_archiveable.html.erb +3 -0
  39. data/app/views/blogit/posts/_blog_post_spacer.html.erb +1 -1
  40. data/app/views/blogit/posts/_blogger_information.html.erb +9 -4
  41. data/app/views/blogit/posts/_meta_tags.html.erb +32 -0
  42. data/app/views/blogit/posts/_post.html.erb +6 -9
  43. data/app/views/blogit/posts/_post_footer.html.erb +1 -0
  44. data/app/views/blogit/posts/_post_head.html.erb +3 -2
  45. data/app/views/blogit/posts/_related.html.erb +7 -16
  46. data/app/views/blogit/posts/_related_post.html.erb +4 -0
  47. data/app/views/blogit/posts/_share_bar.html.erb +5 -6
  48. data/app/views/blogit/posts/_tags.html.erb +8 -0
  49. data/app/views/blogit/posts/index.html.erb +16 -11
  50. data/app/views/blogit/posts/show.html.erb +28 -4
  51. data/app/views/blogit/tags/_tag.html.erb +3 -0
  52. data/config/locales/en.yml +3 -2
  53. data/config/spring.rb +1 -0
  54. data/db/migrate/20150618184415_add_description_to_posts.rb +5 -0
  55. data/lib/blogit.rb +4 -5
  56. data/lib/blogit/archive.rb +8 -0
  57. data/lib/blogit/archive/archive_error.rb +3 -0
  58. data/lib/blogit/archive/archiveable.rb +20 -0
  59. data/lib/blogit/archive/list.rb +52 -0
  60. data/lib/blogit/archive/month.rb +34 -0
  61. data/lib/blogit/archive/year.rb +40 -0
  62. data/lib/blogit/blogs.rb +11 -5
  63. data/lib/blogit/configuration.rb +157 -147
  64. data/lib/blogit/parsers/html_parser.rb +6 -3
  65. data/lib/blogit/parsers/markdown_parser.rb +30 -5
  66. data/lib/blogit/parsers/textile_parser.rb +18 -8
  67. data/lib/blogit/renderers/html_with_albino.rb +1 -1
  68. data/lib/blogit/version.rb +1 -1
  69. data/lib/generators/templates/blogit.rb +23 -57
  70. data/lib/tasks/blogit.rake +42 -0
  71. data/lib/tasks/blogit/css.rake +22 -0
  72. data/lib/tasks/blogit/doc.rake +21 -0
  73. data/lib/tasks/seed_blog_posts.yml +95 -0
  74. data/lib/validators/absence_validator.rb +2 -2
  75. data/spec/blogit_spec.rb +3 -3
  76. data/spec/controllers/blogit/comments_controller_spec.rb +31 -86
  77. data/spec/controllers/blogit/posts_controller_spec.rb +33 -344
  78. data/spec/dummy/Rakefile +1 -1
  79. data/spec/dummy/app/assets/stylesheets/application.sass +7 -0
  80. data/spec/dummy/app/assets/stylesheets/base.sass +1 -0
  81. data/spec/dummy/app/assets/stylesheets/base/_html.sass +15 -0
  82. data/spec/dummy/app/assets/stylesheets/blocks.sass +1 -0
  83. data/spec/dummy/app/assets/stylesheets/blocks/_layout.sass +21 -0
  84. data/spec/dummy/app/views/layouts/application.html.erb +21 -18
  85. data/spec/dummy/app/views/layouts/custom.html.erb +2 -1
  86. data/spec/dummy/config.ru +0 -1
  87. data/spec/dummy/config/application.rb +1 -0
  88. data/spec/dummy/config/database.yml +5 -3
  89. data/spec/dummy/config/environments/production.rb +7 -2
  90. data/spec/dummy/config/environments/test.rb +6 -1
  91. data/spec/dummy/db/development.sqlite3 +0 -0
  92. 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
  93. 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
  94. 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
  95. data/spec/dummy/db/migrate/20150619080554_add_missing_taggable_index.acts_as_taggable_on_engine.rb +10 -0
  96. data/spec/dummy/db/migrate/20150619080555_change_collation_for_tag_names.acts_as_taggable_on_engine.rb +10 -0
  97. data/spec/dummy/db/schema.rb +9 -7
  98. data/spec/dummy/db/seeds.rb +17 -0
  99. data/spec/dummy/lib/tasks/dummy.rake +29 -0
  100. data/spec/dummy/log/development.log +22286 -1489
  101. data/spec/dummy/log/test.log +4608 -11518
  102. data/spec/factories.rb +10 -5
  103. data/spec/helpers/blogit/application_helper_spec.rb +10 -73
  104. data/spec/helpers/blogit/posts_helper_spec.rb +8 -63
  105. data/spec/injectables/dummy_archiveable.rb +6 -0
  106. data/spec/lib/archive/list_spec.rb +60 -0
  107. data/spec/lib/archive/month_spec.rb +17 -0
  108. data/spec/lib/archive/year_spec.rb +38 -0
  109. data/spec/lib/blogit/parsers/html_parser_spec.rb +1 -1
  110. data/spec/lib/blogit/parsers/markdown_parser_spec.rb +7 -6
  111. data/spec/lib/blogit/parsers/textile_parser_spec.rb +1 -1
  112. data/spec/lib/blogs_spec.rb +2 -2
  113. data/spec/lib/configuration_spec.rb +21 -49
  114. data/spec/models/blogit/comment_spec.rb +19 -19
  115. data/spec/models/blogit/post_spec.rb +63 -28
  116. data/spec/rails_helper.rb +28 -0
  117. data/spec/spec_helper.rb +2 -11
  118. data/spec/support/helpers/css_matchers.rb +42 -0
  119. metadata +193 -124
  120. data/app/assets/stylesheets/blogit/index.css +0 -84
  121. data/app/views/blogit/comments/_admin_links.html.erb +0 -3
  122. data/app/views/blogit/posts/_comments_count.html.erb +0 -5
  123. data/app/views/blogit/posts/_form.html.erb +0 -49
  124. data/app/views/blogit/posts/_post_body.html.erb +0 -1
  125. data/app/views/blogit/posts/_post_links.html.erb +0 -6
  126. data/app/views/blogit/posts/edit.html.erb +0 -3
  127. data/app/views/blogit/posts/new.html.erb +0 -3
  128. data/lib/tasks/blog_tasks.rake +0 -4
  129. data/spec/dummy/app/assets/stylesheets/application.css +0 -21
  130. data/spec/dummy/config/initializers/blogit.rb +0 -88
  131. data/spec/dummy/db/migrate/20140511174028_create_blogit_posts.blogit.rb +0 -16
  132. data/spec/dummy/db/migrate/20140511174029_create_blogit_comments.blogit.rb +0 -16
  133. data/spec/dummy/db/test.sqlite3 +0 -0
  134. data/spec/dummy/tmp/cache/assets/CB5/DD0/sprockets%2F346324d2a51df58457807bee661c449c +0 -0
  135. data/spec/dummy/tmp/cache/assets/CB6/ED0/sprockets%2F4390d06699f3ad4262e342be530f9f91 +0 -0
  136. data/spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  137. data/spec/dummy/tmp/cache/assets/CE7/230/sprockets%2F6f493a817d97133a8dbf674bcd322670 +0 -0
  138. data/spec/dummy/tmp/cache/assets/CEA/490/sprockets%2F9697d4fb1ed26d80f3c715611c8d4373 +0 -0
  139. data/spec/dummy/tmp/cache/assets/CEE/310/sprockets%2F89642af8492e579dcd7162a0e2b7f155 +0 -0
  140. data/spec/dummy/tmp/cache/assets/D01/8C0/sprockets%2F332d5a9ce3e800c6c4a7a99058023ba2 +0 -0
  141. data/spec/dummy/tmp/cache/assets/D11/CC0/sprockets%2F3a12dfa6665b5318fa99d097203ac7e7 +0 -0
  142. data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  143. data/spec/dummy/tmp/cache/assets/D3D/1E0/sprockets%2Ffbaabd57fa2c9d426f0c318156705667 +0 -0
  144. data/spec/dummy/tmp/cache/assets/D3E/920/sprockets%2F3efa8d0fc958c223647cb704183b65ca +0 -0
  145. data/spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  146. data/spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  147. data/spec/dummy/tmp/cache/assets/D61/6F0/sprockets%2F02da53eeca228bcef0c49278517111fe +0 -0
  148. data/spec/dummy/tmp/cache/assets/DCA/9B0/sprockets%2Fdf0e8f8a85e5d4056b3fe1cec3b7131a +0 -0
  149. data/spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  150. data/spec/dummy/tmp/cache/assets/E02/A60/sprockets%2Fb32faeede196f7a933c3a2794e7ed0bd +0 -0
  151. data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  152. data/spec/dummy/tmp/cache/assets/development/sprockets/02da53eeca228bcef0c49278517111fe +0 -0
  153. data/spec/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  154. data/spec/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  155. data/spec/dummy/tmp/cache/assets/development/sprockets/2ff93f9f5ed9970021c7704ff93237c8 +0 -0
  156. data/spec/dummy/tmp/cache/assets/development/sprockets/332d5a9ce3e800c6c4a7a99058023ba2 +0 -0
  157. data/spec/dummy/tmp/cache/assets/development/sprockets/346324d2a51df58457807bee661c449c +0 -0
  158. data/spec/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  159. data/spec/dummy/tmp/cache/assets/development/sprockets/3a12dfa6665b5318fa99d097203ac7e7 +0 -0
  160. data/spec/dummy/tmp/cache/assets/development/sprockets/3ed52366904e135bd833590814b6ac6d +0 -0
  161. data/spec/dummy/tmp/cache/assets/development/sprockets/4390d06699f3ad4262e342be530f9f91 +0 -0
  162. data/spec/dummy/tmp/cache/assets/development/sprockets/6f493a817d97133a8dbf674bcd322670 +0 -0
  163. data/spec/dummy/tmp/cache/assets/development/sprockets/89642af8492e579dcd7162a0e2b7f155 +0 -0
  164. data/spec/dummy/tmp/cache/assets/development/sprockets/89dc196c51ae83634b664c0c33052008 +0 -0
  165. data/spec/dummy/tmp/cache/assets/development/sprockets/8dd8236b00c868ba248fe30cd9c14c2a +0 -0
  166. data/spec/dummy/tmp/cache/assets/development/sprockets/9239a04d094a872c1cf77ac391072ea8 +0 -0
  167. data/spec/dummy/tmp/cache/assets/development/sprockets/b3ffb6bd243399012806331ce393ae4f +0 -0
  168. data/spec/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  169. data/spec/dummy/tmp/cache/assets/development/sprockets/d53accc3e58037ee4005e41221b8846b +0 -0
  170. data/spec/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  171. data/spec/dummy/tmp/cache/assets/development/sprockets/df0e8f8a85e5d4056b3fe1cec3b7131a +0 -0
  172. data/spec/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  173. 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 = Blogit::configuration.default_parser_class.new(content)
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
- # Returns the first error message for an ActiveRecord model instance
32
- # @param object A model instance to check
33
- # @param attribute A symbol or string for attribute name to check for
34
- # errors
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 +<div>+ tag with class 'field'
41
- # Used for separating form fields
42
- def field(content_or_options={}, options ={}, &block)
43
- div_with_default_class(:field, content_or_options, options, &block)
44
- end
45
-
46
- # A helper method for creating a +<div>+ tag with class 'actions'
47
- # Used for option links and form buttons
48
- def actions(content_or_options={}, options ={}, &block)
49
- div_with_default_class(:actions, content_or_options, options, &block)
50
- end
51
-
52
- # A helper method for creating a +<div>+ tag with class 'login_required'
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
- super
56
+ content = content_or_options
67
57
  end
68
- end
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
- def div_with_default_class(default_class, content_or_options={}, options={}, &block)
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] = "#{default_class} #{options[:class]}".strip
78
+ options[:class] = Array(options[:class]) + ["actions"]
90
79
  content_tag(:div, content, options)
91
80
  end
92
81
 
93
82
  end
94
- end
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
- # A comments tag corresponding to the comments configuration
5
- def comments_for(post)
6
- render(partial: "blogit/posts/#{Blogit.configuration.include_comments}_comments", locals: { post: post, comment: Blogit::Comment.new })
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
- # A share bar as configured
10
- def share_bar_for(post)
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 monthes. Include
16
- # blogit/archive.js to enabled expand collapse.
17
- # @param year_css [String, Symbol] The CSS class of the year UL tag
18
- # @param month_css [String, Symbol] The CSS class of the month UL tag
19
- # @param post_css [String, Symbol] The CSS class of the year LI tag
20
- # @param archive_posts [ActiveRecord::Relation, Array] The posts to be included in the archive (defaults to Post.all)
21
- # @yield[post] block responsible for writing the link (or whatever) to the post
22
- def blog_posts_archive_tag(year_css, month_css, post_css, archive_posts = Post.order("created_at DESC"))
23
- posts_tree = archive_posts.chunk {|post| post.created_at.year}.map do |year, posts_of_year|
24
- [year, posts_of_year.chunk {|post| l(post.created_at, format: :plain_month_only) }]
25
- end
26
-
27
- result = []
28
- result << "<ul class=\"#{year_css}\">"
29
- posts_tree.each do |year, posts_by_month|
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
@@ -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
- # Returns the blog posts paginated for the index page
38
- # @scope class
39
- scope :for_index, lambda { |page_no = 1| order("created_at DESC").page(page_no) }
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
- # If there's a current blogger and the display name method is set, returns the blogger's display name
66
- # Otherwise, returns an empty string
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
- self.blogger.send Blogit.configuration.blogger_display_name_method
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,5 @@
1
+ <div class="blogit_archive">
2
+ <ul class="blogit_archive__list blogit_archive__list--years">
3
+ <%= render list.years %>
4
+ </ul>
5
+ </div>
@@ -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,4 +1,5 @@
1
- <div id="comments">
1
+ <div class="blogit_comments_list">
2
+ <h3 class="blogit_comments_list__header blogit_header--section">Comments</h3>
2
3
  <%= render post.comments %>
3
4
  </div>
4
5
  <%= render partial: "blogit/comments/form", locals: { post: post, comment: comment } %>
@@ -1,21 +1,17 @@
1
- <%= content_tag(:article, id: "blog_comment_#{comment.id}", class: "blog_comment") do %>
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
- <%= content_tag(:div, class: "blog_comment_body",
9
- id: "blog_comment_#{comment.id}_body") do %>
10
- <%= format_content comment.body || "" %>
11
- <% end %>
7
+ <div class="blogit_comment__body">
8
+ <%= format_content(comment.body.to_s) %>
9
+ </div>
12
10
 
13
- <%= blog_tag(:footer, type: "comment") do %>
14
- <%=t :posted_on, scope: 'blogit.comments'%>
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
- <% end %>
17
-
18
- <%= render partial: "blogit/comments/admin_links", locals: {comment: comment} %>
14
+ </div>
19
15
 
20
16
  <% end if comment.persisted? %>
21
17