publify_core 9.0.0.pre6 → 9.0.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.
Files changed (176) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +44 -0
  3. data/README.md +9 -0
  4. data/app/controllers/admin/base_controller.rb +0 -6
  5. data/app/controllers/admin/content_controller.rb +34 -15
  6. data/app/controllers/admin/dashboard_controller.rb +4 -9
  7. data/app/controllers/admin/feedback_controller.rb +1 -0
  8. data/app/controllers/admin/notes_controller.rb +1 -1
  9. data/app/controllers/admin/pages_controller.rb +3 -7
  10. data/app/controllers/admin/sidebar_controller.rb +1 -0
  11. data/app/controllers/admin/tags_controller.rb +1 -0
  12. data/app/controllers/articles_controller.rb +50 -55
  13. data/app/controllers/comments_controller.rb +2 -3
  14. data/app/controllers/content_controller.rb +8 -17
  15. data/app/controllers/feedback_controller.rb +5 -39
  16. data/app/controllers/notes_controller.rb +1 -3
  17. data/app/controllers/setup_controller.rb +14 -18
  18. data/app/controllers/tags_controller.rb +13 -15
  19. data/app/controllers/theme_controller.rb +7 -5
  20. data/app/controllers/xml_controller.rb +11 -59
  21. data/app/helpers/authors_helper.rb +2 -2
  22. data/app/helpers/base_helper.rb +11 -4
  23. data/app/helpers/xml_helper.rb +2 -2
  24. data/app/jobs/application_job.rb +2 -0
  25. data/app/models/archives_sidebar.rb +8 -11
  26. data/app/models/article.rb +53 -72
  27. data/app/models/article/factory.rb +1 -1
  28. data/app/models/blog.rb +17 -40
  29. data/app/models/comment.rb +4 -3
  30. data/app/models/content.rb +18 -21
  31. data/app/models/content_base.rb +0 -5
  32. data/app/models/feedback.rb +76 -54
  33. data/app/models/meta_sidebar.rb +1 -0
  34. data/app/models/note.rb +7 -0
  35. data/app/models/page.rb +10 -5
  36. data/app/models/ping.rb +0 -113
  37. data/app/models/post_type.rb +1 -0
  38. data/app/models/redirect.rb +1 -1
  39. data/app/models/resource.rb +1 -19
  40. data/app/models/sidebar.rb +1 -1
  41. data/app/models/static_sidebar.rb +1 -0
  42. data/app/models/tag.rb +13 -9
  43. data/app/models/tag_sidebar.rb +4 -4
  44. data/app/models/trackback.rb +1 -8
  45. data/app/models/trigger.rb +1 -15
  46. data/app/models/user.rb +2 -9
  47. data/app/uploaders/resource_uploader.rb +33 -2
  48. data/app/views/accounts/confirm.html.erb +0 -1
  49. data/app/views/admin/content/_article_list.html.erb +1 -1
  50. data/app/views/admin/content/_form.html.erb +3 -7
  51. data/app/views/admin/pages/_form.html.erb +2 -2
  52. data/app/views/admin/seo/_general.html.erb +33 -28
  53. data/app/views/admin/seo/_permalinks.html.erb +2 -2
  54. data/app/views/admin/seo/_titles.html.erb +36 -36
  55. data/app/views/admin/settings/display.html.erb +20 -27
  56. data/app/views/admin/settings/feedback.html.erb +44 -51
  57. data/app/views/admin/settings/index.html.erb +14 -14
  58. data/app/views/admin/settings/write.html.erb +12 -30
  59. data/app/views/admin/tags/_index_and_form.html.erb +1 -1
  60. data/app/views/articles/_archives_article.html.erb +9 -0
  61. data/app/views/articles/_article.html.erb +8 -6
  62. data/app/views/articles/_article_collection.html.erb +1 -1
  63. data/app/views/articles/_article_excerpt.html.erb +10 -8
  64. data/app/views/articles/_article_links.html.erb +4 -2
  65. data/app/views/articles/_comment_list.html.erb +5 -5
  66. data/app/views/articles/_full_article_content.html.erb +4 -2
  67. data/app/views/articles/archives.html.erb +10 -20
  68. data/app/views/articles/feedback_atom_feed.atom.builder +5 -5
  69. data/app/views/articles/feedback_rss_feed.rss.builder +12 -13
  70. data/app/views/articles/index_atom_feed.atom.builder +3 -4
  71. data/app/views/articles/index_rss_feed.rss.builder +9 -10
  72. data/app/views/articles/read.html.erb +5 -31
  73. data/app/views/articles/search.html.erb +1 -1
  74. data/app/views/articles/trackback.xml.builder +1 -1
  75. data/app/views/authors/show.html.erb +11 -21
  76. data/app/views/authors/show_atom_feed.atom.builder +3 -4
  77. data/app/views/authors/show_rss_feed.rss.builder +9 -10
  78. data/app/views/comments/_comment.html.erb +17 -16
  79. data/app/views/feedback/index.atom.builder +7 -0
  80. data/app/views/feedback/index.rss.builder +19 -0
  81. data/app/views/notes/_note.html.erb +16 -15
  82. data/app/views/notes/index.html.erb +1 -1
  83. data/app/views/notification_mailer/_mail_footer.html.erb +0 -2
  84. data/app/views/notification_mailer/_mail_header.html.erb +2 -0
  85. data/app/views/notification_mailer/article.html.erb +4 -3
  86. data/app/views/notification_mailer/comment.html.erb +7 -6
  87. data/app/views/notification_mailer/notif_user.html.erb +3 -8
  88. data/app/views/setup/index.html.erb +4 -0
  89. data/app/views/shared/_atom_header.atom.builder +3 -3
  90. data/app/views/shared/_atom_item_article.atom.builder +26 -19
  91. data/app/views/shared/_atom_item_comment.atom.builder +3 -5
  92. data/app/views/shared/_atom_item_trackback.atom.builder +3 -4
  93. data/app/views/shared/_page_header.html.erb +1 -1
  94. data/app/views/shared/_rss_item_article.rss.builder +10 -15
  95. data/app/views/shared/_rss_item_comment.rss.builder +1 -2
  96. data/app/views/shared/_rss_item_trackback.rss.builder +1 -1
  97. data/app/views/tags/index.html.erb +2 -2
  98. data/app/views/xml/sitemap.googlesitemap.builder +7 -0
  99. data/config/initializers/mime_types.rb +0 -1
  100. data/config/locales/da.yml +8 -37
  101. data/config/locales/de.yml +7 -36
  102. data/config/locales/en.yml +7 -36
  103. data/config/locales/es-MX.yml +8 -37
  104. data/config/locales/fr.yml +7 -36
  105. data/config/locales/he.yml +4 -33
  106. data/config/locales/it.yml +7 -36
  107. data/config/locales/ja.yml +5 -34
  108. data/config/locales/lt.yml +7 -36
  109. data/config/locales/nb-NO.yml +7 -36
  110. data/config/locales/nl.yml +9 -38
  111. data/config/locales/pl.yml +8 -37
  112. data/config/locales/pt-BR.yml +8 -37
  113. data/config/locales/ro.yml +9 -38
  114. data/config/locales/ru.yml +7 -36
  115. data/config/locales/zh-CN.yml +6 -35
  116. data/config/locales/zh-TW.yml +7 -36
  117. data/config/routes.rb +6 -28
  118. data/db/migrate/113_initial_schema.rb +191 -191
  119. data/db/migrate/114_fixes_buggy_articles_and_notes.rb +6 -7
  120. data/db/migrate/115_drops_categories_for_tags.rb +3 -3
  121. data/db/migrate/20150207131657_add_missing_indexes.rb +1 -1
  122. data/db/migrate/20150807134129_simplify_redirect_relations.rb +1 -1
  123. data/db/migrate/20150808052637_add_blog_ids.rb +3 -5
  124. data/db/migrate/20150808191127_add_blog_id_to_redirects.rb +1 -1
  125. data/db/migrate/20150810094754_add_blog_id_to_tags.rb +1 -1
  126. data/db/migrate/20160108111120_add_devise_to_users.rb +3 -3
  127. data/db/migrate/20160108184201_move_last_connection_to_last_sign_in_at.rb +1 -1
  128. data/db/migrate/20160110094906_remove_profiles_rights.rb +1 -1
  129. data/db/migrate/20160605103918_replace_profile_id_with_string.rb +1 -3
  130. data/db/migrate/20160605154632_remove_profiles.rb +2 -2
  131. data/db/migrate/20160701061851_demand_blog_id_on_contents.rb +1 -1
  132. data/db/migrate/20160701062604_add_blog_id_to_resources.rb +1 -1
  133. data/db/migrate/20170528093024_move_resources_to_content.rb +5 -0
  134. data/db/migrate/20170528094923_move_tags_to_content.rb +6 -0
  135. data/db/migrate/20170528201606_remove_separate_published_flag.rb +5 -0
  136. data/db/migrate/20170605071626_remove_extra_state_columns_from_feedback.rb +6 -0
  137. data/db/migrate/20170702105201_remove_published_at_from_feedback.rb +5 -0
  138. data/db/seeds.rb +1 -1
  139. data/lib/publify_core.rb +0 -1
  140. data/lib/publify_core/version.rb +1 -1
  141. data/lib/publify_guid.rb +1 -1
  142. data/lib/publify_time.rb +2 -2
  143. data/lib/sidebar_field.rb +19 -12
  144. data/lib/transforms.rb +1 -0
  145. metadata +102 -66
  146. data/.gitignore +0 -13
  147. data/.rspec +0 -2
  148. data/.rubocop.yml +0 -84
  149. data/.rubocop_todo.yml +0 -148
  150. data/.travis.yml +0 -27
  151. data/Gemfile +0 -17
  152. data/README.rdoc +0 -3
  153. data/Rakefile +0 -35
  154. data/app/assets/stylesheets/publify_core/.keep +0 -0
  155. data/app/controllers/.keep +0 -0
  156. data/app/controllers/admin/migrations_controller.rb +0 -19
  157. data/app/controllers/concerns/.keep +0 -0
  158. data/app/controllers/trackbacks_controller.rb +0 -36
  159. data/app/helpers/.keep +0 -0
  160. data/app/mailers/.keep +0 -0
  161. data/app/models/.keep +0 -0
  162. data/app/models/article/states.rb +0 -179
  163. data/app/models/concerns/.keep +0 -0
  164. data/app/models/feedback/states.rb +0 -256
  165. data/app/services/migrator.rb +0 -25
  166. data/app/views/.keep +0 -0
  167. data/app/views/comments/index.html.erb +0 -1
  168. data/app/views/comments/index_atom_feed.atom.builder +0 -8
  169. data/app/views/comments/index_rss_feed.rss.builder +0 -20
  170. data/app/views/trackbacks/index_atom_feed.atom.builder +0 -7
  171. data/app/views/trackbacks/index_rss_feed.rss.builder +0 -20
  172. data/app/views/trackbacks/trackback.xml.builder +0 -4
  173. data/app/views/xml/feed.googlesitemap.builder +0 -7
  174. data/app/views/xml/rsd.rsd.builder +0 -8
  175. data/lib/stateful.rb +0 -106
  176. data/publify_core.gemspec +0 -54
@@ -1,4 +1,4 @@
1
- class CommentsController < FeedbackController
1
+ class CommentsController < BaseController
2
2
  before_action :get_article, only: [:create, :preview]
3
3
 
4
4
  def create
@@ -43,7 +43,6 @@ class CommentsController < FeedbackController
43
43
  def new_comment_defaults
44
44
  { ip: request.remote_ip,
45
45
  author: 'Anonymous',
46
- published: true,
47
46
  user: @current_user,
48
47
  user_agent: request.env['HTTP_USER_AGENT'],
49
48
  referrer: request.env['HTTP_REFERER'],
@@ -53,7 +52,7 @@ class CommentsController < FeedbackController
53
52
  def set_cookies_for(comment)
54
53
  add_to_cookies(:author, comment.author)
55
54
  add_to_cookies(:url, comment.url)
56
- unless comment.email.blank?
55
+ if comment.email.present?
57
56
  add_to_cookies(:gravatar_id, Digest::MD5.hexdigest(comment.email.strip))
58
57
  end
59
58
  end
@@ -1,21 +1,5 @@
1
1
  class ContentController < BaseController
2
- class ExpiryFilter
3
- def before(_controller)
4
- @request_time = Time.now
5
- end
6
-
7
- def after(controller)
8
- future_article =
9
- this_blog.articles.where('published = ? AND published_at > ?', true, @request_time).
10
- order('published_at ASC').first
11
- if future_article
12
- delta = future_article.published_at - Time.now
13
- controller.response.lifetime = delta <= 0 ? 0 : delta
14
- end
15
- end
16
- end
17
-
18
- protected
2
+ private
19
3
 
20
4
  # TODO: Make this work for all content.
21
5
  def auto_discovery_feed(options = {})
@@ -28,4 +12,11 @@ class ContentController < BaseController
28
12
  def theme_layout
29
13
  this_blog.current_theme.layout(action_name)
30
14
  end
15
+
16
+ def render_cached_xml(template, object)
17
+ feed = cache([controller_name, template, object]) do
18
+ render_to_string template, layout: false
19
+ end
20
+ render xml: feed
21
+ end
31
22
  end
@@ -1,45 +1,11 @@
1
1
  class FeedbackController < BaseController
2
- before_action :get_article, only: [:create]
3
-
4
- # Used only by comments. Maybe need move to comments controller
5
- # or use it in our code with send some feed about trackback
6
- #
7
- # Redirect to article with good anchor with /comments?article_id=xxx ou
8
- # /trackacks?article_id=xxx
9
- #
10
- # If no article_id params, so no page found. TODO: See all
11
- # comments/trackbacks with paginate ?
12
- #
13
- # If /comments.rss|atom or /trabacks.atom|rss see a feed about all comments
14
- # or trackback
15
- #
16
- # If article_id params in feed see only this comment|feedback on this
17
- # article.
18
- #
19
- # TODO: It's usefull but use anywhere. Create some extension in xml_sidebar
20
- # to define this feed.
21
2
  def index
22
- @page_title = self.class.name.to_s.sub(/Controller$/, '')
3
+ @feedback = Feedback.ham.
4
+ newest_first.
5
+ limit(this_blog.per_page(params[:format]))
23
6
  respond_to do |format|
24
- format.html do
25
- if params[:article_id]
26
- article = Article.find(params[:article_id])
27
- redirect_to "#{URI.parse(article.permalink_url).path}\##{@page_title.underscore}"
28
- else
29
- render plain: 'this space left blank'
30
- end
31
- end
32
- feedbacks = Feedback.from(controller_name, params[:article_id]).limit(this_blog.per_page(params[:format]))
33
- format.atom { render_feed 'atom', feedbacks }
34
- format.rss { render_feed 'rss', feedbacks }
7
+ format.atom { render 'index', format: 'atom' }
8
+ format.rss { render 'index', format: 'rss' }
35
9
  end
36
10
  end
37
-
38
- protected
39
-
40
- def render_feed(format, collection)
41
- ivar_name = "@#{self.class.to_s.sub(/Controller$/, '').underscore}"
42
- instance_variable_set(ivar_name, collection)
43
- render "index_#{format}_feed"
44
- end
45
11
  end
@@ -15,9 +15,7 @@ class NotesController < ContentController
15
15
  end
16
16
 
17
17
  def show
18
- @note = Note.published.find_by permalink: CGI.escape(params[:permalink])
19
-
20
- return render 'errors/404', status: 404 unless @note
18
+ @note = Note.published.find_by! permalink: CGI.escape(params[:permalink])
21
19
 
22
20
  if @note.in_reply_to_message.present?
23
21
  @reply = JSON.parse(@note.in_reply_to_message)
@@ -1,30 +1,25 @@
1
1
  class SetupController < BaseController
2
- before_action :check_config, only: 'index'
2
+ before_action :check_config
3
3
  layout 'accounts'
4
4
 
5
5
  def index
6
- return unless request.post?
6
+ end
7
7
 
8
+ def create
8
9
  this_blog.blog_name = params[:setting][:blog_name]
9
10
  this_blog.base_url = blog_base_url
10
11
 
11
12
  @user = User.new(login: 'admin',
12
13
  email: params[:setting][:email],
14
+ password: params[:setting][:password],
13
15
  nickname: 'Publify Admin')
14
- @user.generate_password!
15
16
  @user.name = @user.login
16
17
 
17
- unless this_blog.valid? && @user.valid?
18
+ unless this_blog.save && @user.save
18
19
  redirect_to setup_url
19
20
  return
20
21
  end
21
22
 
22
- return unless this_blog.save
23
-
24
- session[:tmppass] = @user.password
25
-
26
- return unless @user.save
27
-
28
23
  sign_in @user
29
24
 
30
25
  if User.count == 1
@@ -32,24 +27,25 @@ class SetupController < BaseController
32
27
  create_first_page @user
33
28
  end
34
29
 
30
+ EmailNotify.send_user_create_notification(@user)
31
+
35
32
  redirect_to confirm_accounts_url
36
33
  end
37
34
 
38
35
  private
39
36
 
40
37
  def create_first_post(user)
41
- this_blog.articles.create(title: I18n.t('setup.article.title'),
42
- author: user.login,
43
- body: I18n.t('setup.article.body'),
44
- allow_comments: 1,
45
- allow_pings: 1,
46
- published: 1,
47
- user: user)
38
+ this_blog.articles.build(title: I18n.t('setup.article.title'),
39
+ author: user.login,
40
+ body: I18n.t('setup.article.body'),
41
+ allow_comments: 1,
42
+ allow_pings: 1,
43
+ user: user).publish!
48
44
  end
49
45
 
50
46
  def create_first_page(user)
51
47
  this_blog.pages.create(name: 'about',
52
- published: true,
48
+ state: 'published',
53
49
  title: I18n.t('setup.page.about'),
54
50
  user: user,
55
51
  body: I18n.t('setup.page.body'))
@@ -6,38 +6,36 @@ class TagsController < ContentController
6
6
  @tags = Tag.page(params[:page]).per(100)
7
7
  @page_title = controller_name.capitalize
8
8
  @keywords = ''
9
- @description = "#{self.class.to_s.sub(/Controller$/, '')} for #{this_blog.blog_name}"
9
+ @description = "Tags for #{this_blog.blog_name}"
10
10
  end
11
11
 
12
12
  def show
13
- @grouping = Tag.find_by(name: params[:id])
14
- if @grouping.nil?
15
- @articles = []
16
- else
17
- @page_title = this_blog.tag_title_template.to_title(@grouping, this_blog, params)
18
- @description = @grouping.description.to_s
19
- @keywords = ''
20
- @keywords << @grouping.keywords unless @grouping.keywords.blank?
21
- @keywords << this_blog.meta_keywords unless this_blog.meta_keywords.blank?
22
- @articles = @grouping.articles.published.page(params[:page]).per(10)
23
- end
13
+ @tag = Tag.find_by!(name: params[:id])
14
+
15
+ @articles = @tag.
16
+ contents.includes(:blog, :user, :tags, :resources, :text_filter).
17
+ published.page(params[:page]).per(10)
18
+
24
19
  respond_to do |format|
25
20
  format.html do
26
21
  if @articles.empty?
27
- render 'errors/404', status: 404
22
+ raise ActiveRecord::RecordNotFound
28
23
  else
24
+ @page_title = this_blog.tag_title_template.to_title(@tag, this_blog, params).strip
25
+ @description = this_blog.tag_desc_template.to_title(@tag, this_blog, params).strip
26
+ @keywords = this_blog.meta_keywords
29
27
  render template_name(params[:id])
30
28
  end
31
29
  end
32
30
 
33
31
  format.atom do
34
32
  @articles = @articles[0, this_blog.limit_rss_display]
35
- render 'articles/index_atom_feed', layout: false
33
+ render_cached_xml 'articles/index_atom_feed', @articles
36
34
  end
37
35
 
38
36
  format.rss do
39
37
  @articles = @articles[0, this_blog.limit_rss_display]
40
- render 'articles/index_rss_feed', layout: false
38
+ render_cached_xml 'articles/index_rss_feed', @articles
41
39
  end
42
40
  end
43
41
  end
@@ -24,17 +24,19 @@ class ThemeController < ContentController
24
24
  private
25
25
 
26
26
  def render_theme_item(type, file, mime = nil)
27
- mime ||= mime_for(file)
28
- if file.split(%r{[\\/]}).include?('..')
29
- return (render 'errors/404', status: 404, formats: ['html'])
30
- end
27
+ return render_not_found if file.split(%r{[\\/]}).include?('..')
31
28
 
32
29
  src = this_blog.current_theme.path + "/#{type}/#{file}"
33
- return (render plain: 'Not Found', status: 404) unless File.exist? src
30
+ return render_not_found unless File.exist? src
34
31
 
32
+ mime ||= mime_for(file)
35
33
  send_file(src, type: mime, disposition: 'inline', stream: true)
36
34
  end
37
35
 
36
+ def render_not_found
37
+ render plain: 'Not Found', status: 404
38
+ end
39
+
38
40
  def mime_for(filename)
39
41
  case filename.downcase
40
42
  when /\.js$/
@@ -1,66 +1,18 @@
1
1
  class XmlController < BaseController
2
- NORMALIZED_FORMAT_FOR = { 'atom' => 'atom', 'rss' => 'rss',
3
- 'atom10' => 'atom', 'atom03' => 'atom', 'rss20' => 'rss',
4
- 'googlesitemap' => 'googlesitemap', 'rsd' => 'rsd' }.freeze
2
+ def sitemap
3
+ @items = []
4
+ @blog = this_blog
5
5
 
6
- ACCEPTED_TYPE = %w(feed comments article tag author trackbacks sitemap).freeze
6
+ @feed_title = this_blog.blog_name
7
+ @link = this_blog.base_url
8
+ @self_url = request.url
7
9
 
8
- def feed
9
- @format = 'rss'
10
- if params[:format]
11
- @format = NORMALIZED_FORMAT_FOR[params[:format]]
12
- return render(plain: 'Unsupported format', status: 404) unless @format
13
- end
14
-
15
- # TODO: Move redirects into config/routes.rb, if possible
16
- param_type = ACCEPTED_TYPE.dup.delete(params[:type])
17
- param_id = params[:id] # .present? && params[:id].to_i # Think about a way to secure that to a valid tag/author for int value ...
18
-
19
- case param_type
20
- when 'feed'
21
- redirect_to controller: 'articles', action: 'index', format: @format, status: :moved_permanently
22
- when 'comments'
23
- redirect_to admin_comments_url(format: @format), status: :moved_permanently
24
- when 'article'
25
- redirect_to this_blog.articles.find(param_id).feed_url(@format), status: :moved_permanently
26
- when 'tag', 'author'
27
- redirect_to send("#{param_type}_url", param_id, format: @format), status: :moved_permanently
28
- when 'trackbacks'
29
- redirect_to trackbacks_url(format: @format), status: :moved_permanently
30
- when 'sitemap'
31
- @items = []
32
- @blog = this_blog
33
-
34
- @feed_title = this_blog.blog_name
35
- @link = this_blog.base_url
36
- @self_url = request.url
10
+ @items += Article.find_already_published(1000)
11
+ @items += Page.find_already_published(1000)
12
+ @items += Tag.find_all_with_content_counters unless this_blog.unindex_tags
37
13
 
38
- @items += Article.find_already_published(1000)
39
- @items += Page.find_already_published(1000)
40
- @items += Tag.find_all_with_article_counters unless this_blog.unindex_tags
41
-
42
- respond_to do |format|
43
- format.googlesitemap
44
- end
45
- else
46
- return render(plain: 'Unsupported feed type', status: 404)
14
+ respond_to do |format|
15
+ format.googlesitemap
47
16
  end
48
17
  end
49
-
50
- # TODO: Move redirects into config/routes.rb, if possible
51
- def articlerss
52
- redirect_to(URI.parse(Article.find(params[:id]).feed_url('rss')).path, status: :moved_permanently)
53
- end
54
-
55
- def commentrss
56
- redirect_to admin_comments_url(format: 'rss'), status: :moved_permanently
57
- end
58
-
59
- def trackbackrss
60
- redirect_to trackbacks_url(format: 'rss'), status: :moved_permanently
61
- end
62
-
63
- def rsd
64
- render 'rsd', formats: [:rsd], handlers: [:builder]
65
- end
66
18
  end
@@ -2,7 +2,7 @@ module AuthorsHelper
2
2
  include BlogHelper
3
3
 
4
4
  def display_profile_item(item, item_desc)
5
- return unless item.present?
5
+ return if item.blank?
6
6
  item = link_to(item, item) if is_url?(item)
7
7
  content_tag :li do
8
8
  safe_join([item_desc, item], ' ')
@@ -16,7 +16,7 @@ module AuthorsHelper
16
16
  end
17
17
 
18
18
  def author_description(user)
19
- return unless user.description.present?
19
+ return if user.description.blank?
20
20
 
21
21
  content_tag(:div, user.description, id: 'author-description')
22
22
  end
@@ -1,4 +1,5 @@
1
1
  # coding: utf-8
2
+
2
3
  # Methods added to this helper will be available to all templates in the application.
3
4
  require 'digest/sha1'
4
5
 
@@ -38,7 +39,12 @@ module BaseHelper
38
39
  options = {}
39
40
  options[:class] = style if style
40
41
  options[:rel] = 'nofollow' if nofollow
41
- link_to title, item.permalink_url(anchor, only_path), options
42
+ url = item.permalink_url(anchor, only_path)
43
+ if url
44
+ link_to title, url, options
45
+ else
46
+ title
47
+ end
42
48
  end
43
49
 
44
50
  def avatar_tag(options = {})
@@ -52,7 +58,7 @@ module BaseHelper
52
58
  end
53
59
 
54
60
  def meta_tag(name, value)
55
- tag :meta, name: name, content: value unless value.blank?
61
+ tag :meta, name: name, content: value if value.present?
56
62
  end
57
63
 
58
64
  def markup_help_popup(markup, text)
@@ -98,7 +104,7 @@ module BaseHelper
98
104
  user.resource.upload.avatar.url
99
105
  end
100
106
  return if avatar_path.nil?
101
- avatar_url = File.join(this_blog.base_url, avatar_path)
107
+ avatar_url = this_blog.file_url(avatar_path)
102
108
  elsif user.twitter_profile_image.present?
103
109
  avatar_url = user.twitter_profile_image
104
110
  end
@@ -168,6 +174,7 @@ module BaseHelper
168
174
  end
169
175
 
170
176
  def display_date_and_time(timestamp)
177
+ return if timestamp.blank?
171
178
  if this_blog.date_format == 'setting_date_format_distance_of_time_in_words'
172
179
  timeago_tag timestamp, date_only: false
173
180
  else
@@ -177,7 +184,7 @@ module BaseHelper
177
184
 
178
185
  def show_meta_keyword
179
186
  return unless this_blog.use_meta_keyword
180
- meta_tag 'keywords', @keywords unless @keywords.blank?
187
+ meta_tag 'keywords', @keywords if @keywords.present?
181
188
  end
182
189
 
183
190
  def stop_index_robots?(blog)
@@ -1,7 +1,7 @@
1
1
  module XmlHelper
2
2
  def collection_lastmod(collection)
3
- article_updated = collection.articles.order(updated_at: :desc).first
4
- article_published = collection.articles.order(published_at: :desc).first
3
+ article_updated = collection.contents.order(updated_at: :desc).first
4
+ article_published = collection.contents.order(published_at: :desc).first
5
5
 
6
6
  times = []
7
7
  times.push article_updated.updated_at if article_updated
@@ -0,0 +1,2 @@
1
+ class ApplicationJob < ActiveJob::Base
2
+ end
@@ -6,16 +6,12 @@ class ArchivesSidebar < Sidebar
6
6
 
7
7
  attr_accessor :archives
8
8
 
9
- def self.date_func
9
+ def self.date_funcs
10
10
  @date_func ||=
11
- begin
12
- if Content.connection.is_a?(ActiveRecord::ConnectionAdapters::SQLite3Adapter)
13
- "strftime('%Y', published_at) as year, strftime('%m', published_at) as month"
14
- else
15
- 'extract(year from published_at) as year,extract(month from published_at) as month'
16
- end
17
- rescue NameError
18
- 'extract(year from published_at) as year,extract(month from published_at) as month'
11
+ if Content.connection.class.name =~ /SQLite3Adapter/
12
+ ["strftime('%Y', published_at) as year", "strftime('%m', published_at) as month"]
13
+ else
14
+ ['extract(year from published_at) as year', 'extract(month from published_at) as month']
19
15
  end
20
16
  end
21
17
 
@@ -25,9 +21,10 @@ class ArchivesSidebar < Sidebar
25
21
  # Unfortunately, there's no universally-supported way to do this
26
22
  # across all three of our supported DBs. So, we resort to a bit of
27
23
  # DB-specific code.
28
- date_func = self.class.date_func
24
+ date_funcs = self.class.date_funcs
29
25
 
30
- article_counts = Content.find_by_sql(["select count(*) as count, #{date_func} from contents where type='Article' and published = ? and published_at < ? group by year,month order by year desc,month desc limit ? ", true, Time.now, count.to_i])
26
+ article_counts = Article.published.select('count(*) as count', *date_funcs).
27
+ group(:year, :month).reorder('year desc', 'month desc').limit(count.to_i)
31
28
 
32
29
  @archives = article_counts.map do |entry|
33
30
  month = entry.month.to_i