publify_core 9.2.10 → 10.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 (119) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +57 -18
  3. data/app/assets/javascripts/lang/ar_AR.js +17 -0
  4. data/app/controllers/admin/{content_controller.rb → articles_controller.rb} +24 -24
  5. data/app/controllers/admin/dashboard_controller.rb +3 -3
  6. data/app/controllers/admin/feedback_controller.rb +23 -23
  7. data/app/controllers/admin/pages_controller.rb +2 -2
  8. data/app/controllers/admin/post_types_controller.rb +10 -4
  9. data/app/controllers/admin/redirects_controller.rb +10 -6
  10. data/app/controllers/admin/resources_controller.rb +2 -2
  11. data/app/controllers/admin/sidebar_controller.rb +2 -2
  12. data/app/controllers/admin/tags_controller.rb +5 -3
  13. data/app/controllers/admin/themes_controller.rb +1 -2
  14. data/app/controllers/admin/users_controller.rb +5 -3
  15. data/app/controllers/articles_controller.rb +5 -5
  16. data/app/controllers/authors_controller.rb +2 -2
  17. data/app/controllers/base_controller.rb +0 -3
  18. data/app/controllers/feedback_controller.rb +3 -3
  19. data/app/controllers/tags_controller.rb +3 -3
  20. data/app/helpers/authors_helper.rb +1 -1
  21. data/app/helpers/base_helper.rb +6 -6
  22. data/app/models/ability.rb +1 -1
  23. data/app/models/archives_sidebar.rb +3 -3
  24. data/app/models/article.rb +13 -13
  25. data/app/models/blog.rb +3 -6
  26. data/app/models/content.rb +1 -3
  27. data/app/models/content_base.rb +2 -13
  28. data/app/models/feedback.rb +1 -2
  29. data/app/models/meta_sidebar.rb +1 -1
  30. data/app/models/note.rb +2 -2
  31. data/app/models/redirect.rb +0 -1
  32. data/app/models/sidebar.rb +1 -1
  33. data/app/models/static_sidebar.rb +1 -1
  34. data/app/models/tag.rb +7 -8
  35. data/app/models/tag_sidebar.rb +3 -3
  36. data/app/models/text_filter.rb +17 -43
  37. data/app/models/user.rb +2 -2
  38. data/app/services/title_builder.rb +4 -4
  39. data/app/views/admin/{content → articles}/_article_list.html.erb +3 -3
  40. data/app/views/admin/{content → articles}/_form.html.erb +11 -1
  41. data/app/views/admin/{content → articles}/index.html.erb +1 -1
  42. data/app/views/admin/dashboard/_drafts.html.erb +2 -2
  43. data/app/views/admin/dashboard/_overview.html.erb +1 -1
  44. data/app/views/admin/dashboard/_welcome.html.erb +4 -4
  45. data/app/views/admin/dashboard/index.html.erb +0 -7
  46. data/app/views/admin/feedback/article.html.erb +12 -6
  47. data/app/views/admin/feedback/edit.html.erb +14 -2
  48. data/app/views/admin/feedback/index.html.erb +6 -7
  49. data/app/views/admin/pages/_form.html.erb +13 -14
  50. data/app/views/admin/seo/show.html.erb +12 -1
  51. data/app/views/admin/shared/_menu.html.erb +5 -4
  52. data/app/views/admin/tags/_index_and_form.html.erb +2 -1
  53. data/app/views/articles/_comment_errors.html.erb +11 -1
  54. data/app/views/articles/read.html.erb +1 -1
  55. data/app/views/layouts/administration.html.erb +9 -17
  56. data/config/i18n-tasks.yml +8 -1
  57. data/config/initializers/devise.rb +1 -1
  58. data/config/locales/ar.yml +885 -0
  59. data/config/locales/da.yml +12 -12
  60. data/config/locales/de.yml +12 -12
  61. data/config/locales/en.yml +12 -12
  62. data/config/locales/es-MX.yml +12 -12
  63. data/config/locales/fr.yml +12 -12
  64. data/config/locales/he.yml +12 -12
  65. data/config/locales/it.yml +12 -12
  66. data/config/locales/ja.yml +13 -13
  67. data/config/locales/lt.yml +12 -12
  68. data/config/locales/{nb-NO.yml → nb.yml} +13 -13
  69. data/config/locales/nl.yml +13 -13
  70. data/config/locales/pl.yml +12 -12
  71. data/config/locales/pt-BR.yml +12 -12
  72. data/config/locales/ro.yml +12 -12
  73. data/config/locales/ru.yml +13 -13
  74. data/config/locales/sidebars.ar.yml +20 -0
  75. data/config/locales/{sidebars.nb-NO.yml → sidebars.nb.yml} +1 -1
  76. data/config/locales/zh-CN.yml +12 -12
  77. data/config/locales/zh-TW.yml +12 -12
  78. data/config/routes.rb +2 -2
  79. data/db/migrate/20150807134129_simplify_redirect_relations.rb +1 -0
  80. data/db/migrate/20150808052637_add_blog_ids.rb +3 -1
  81. data/db/migrate/20160605103918_replace_profile_id_with_string.rb +1 -0
  82. data/db/migrate/20160701062604_add_blog_id_to_resources.rb +2 -0
  83. data/db/migrate/20190208152646_move_text_filter_to_name.rb +17 -17
  84. data/db/migrate/20221007091049_remove_table_sitealizer.rb +19 -0
  85. data/db/migrate/20221010092846_remove_page_caches_table.rb +15 -0
  86. data/db/migrate/20221012163214_remove_itunes_fields_from_resources.rb +14 -0
  87. data/db/seeds.rb +0 -4
  88. data/lib/publify_core/content_text_helpers.rb +11 -0
  89. data/lib/publify_core/lang.rb +1 -1
  90. data/lib/publify_core/testing_support/factories/articles.rb +55 -0
  91. data/lib/publify_core/testing_support/factories/blogs.rb +24 -0
  92. data/lib/publify_core/testing_support/factories/comments.rb +40 -0
  93. data/lib/publify_core/testing_support/factories/contents.rb +7 -0
  94. data/lib/publify_core/testing_support/factories/notes.rb +17 -0
  95. data/lib/publify_core/testing_support/factories/pages.rb +13 -0
  96. data/lib/publify_core/testing_support/factories/post_types.rb +8 -0
  97. data/lib/publify_core/testing_support/factories/redirects.rb +9 -0
  98. data/lib/publify_core/testing_support/factories/resources.rb +16 -0
  99. data/lib/publify_core/testing_support/factories/sequences.rb +12 -0
  100. data/lib/publify_core/testing_support/factories/sidebars.rb +10 -0
  101. data/lib/publify_core/testing_support/factories/tags.rb +9 -0
  102. data/lib/publify_core/testing_support/factories/trackbacks.rb +13 -0
  103. data/lib/publify_core/testing_support/factories/users.rb +43 -0
  104. data/lib/publify_core/version.rb +1 -1
  105. data/lib/publify_core.rb +3 -3
  106. data/lib/publify_textfilter_markdown.rb +8 -9
  107. data/lib/publify_textfilter_markdown_smartquotes.rb +20 -0
  108. data/lib/publify_textfilter_twitterfilter.rb +36 -18
  109. data/lib/sidebar_field.rb +2 -2
  110. data/lib/sidebar_registry.rb +0 -12
  111. data/lib/text_filter_plugin.rb +23 -30
  112. metadata +213 -105
  113. data/lib/publify_core/testing_support/factories.rb +0 -240
  114. data/lib/publify_textfilter_textile.rb +0 -24
  115. data/lib/tasks/i18n.rake +0 -9
  116. /data/app/views/admin/{content → articles}/autosave.js.erb +0 -0
  117. /data/app/views/admin/{content → articles}/edit.html.erb +0 -0
  118. /data/app/views/admin/{content → articles}/index.js.erb +0 -0
  119. /data/app/views/admin/{content → articles}/new.html.erb +0 -0
@@ -10,7 +10,7 @@ class ArchivesSidebar < Sidebar
10
10
 
11
11
  def self.date_funcs
12
12
  @date_funcs ||=
13
- if /SQLite3Adapter/.match?(Content.connection.class.name)
13
+ if Content.connection.class.name.include?("SQLite3Adapter")
14
14
  ["strftime('%Y', published_at) as year", "strftime('%m', published_at) as month"]
15
15
  else
16
16
  ["extract(year from published_at) as year",
@@ -26,8 +26,8 @@ class ArchivesSidebar < Sidebar
26
26
  # DB-specific code.
27
27
  date_funcs = self.class.date_funcs
28
28
 
29
- article_counts = Article.published.select("count(*) as count", *date_funcs).
30
- group(:year, :month).reorder("year desc", "month desc").limit(count.to_i)
29
+ article_counts = Article.published.select("count(*) as count", *date_funcs)
30
+ .group(:year, :month).reorder("year desc", "month desc").limit(count.to_i)
31
31
 
32
32
  @archives = article_counts.map do |entry|
33
33
  month = entry.month.to_i
@@ -31,13 +31,13 @@ class Article < Content
31
31
  scope :pending, -> { where(state: "publication_pending").order(default_order) }
32
32
 
33
33
  scope :bestof, lambda {
34
- joins(:feedback).
35
- where("feedback.type" => "Comment",
36
- "contents.state" => "published").
37
- group("contents.id").
38
- select("contents.*, count(feedback.id) as comment_count").
39
- order("comment_count DESC").
40
- limit(5)
34
+ joins(:feedback)
35
+ .where("feedback.type" => "Comment",
36
+ "contents.state" => "published")
37
+ .group("contents.id")
38
+ .select("contents.*, count(feedback.id) as comment_count")
39
+ .order("comment_count DESC")
40
+ .limit(5)
41
41
  }
42
42
 
43
43
  setting :password, :string, ""
@@ -140,13 +140,13 @@ class Article < Content
140
140
  end
141
141
 
142
142
  def next
143
- Article.where("published_at > ?", published_at).order("published_at asc").
144
- limit(1).first
143
+ Article.where("published_at > ?", published_at).order("published_at asc")
144
+ .limit(1).first
145
145
  end
146
146
 
147
147
  def previous
148
- Article.where("published_at < ?", published_at).order("published_at desc").
149
- limit(1).first
148
+ Article.where("published_at < ?", published_at).order("published_at desc")
149
+ .limit(1).first
150
150
  end
151
151
 
152
152
  def publication_month
@@ -154,7 +154,7 @@ class Article < Content
154
154
  end
155
155
 
156
156
  def self.publication_months
157
- result = select("published_at").where("published_at is not NULL").where(type: "Article")
157
+ result = select("published_at").where.not(published_at: nil).where(type: "Article")
158
158
  result.map { |it| [it.publication_month] }.uniq
159
159
  end
160
160
 
@@ -289,7 +289,7 @@ class Article < Content
289
289
  format_url.gsub!("%day%", sprintf("%<day>.2d", day: published_at.day))
290
290
  format_url.gsub!("%title%", URI::DEFAULT_PARSER.escape(permalink.to_s))
291
291
  if format_url[0, 1] == "/"
292
- format_url[1..-1]
292
+ format_url[1..]
293
293
  else
294
294
  format_url
295
295
  end
data/app/models/blog.rb CHANGED
@@ -77,7 +77,7 @@ class Blog < ApplicationRecord
77
77
  setting :meta_keywords, :string, ""
78
78
  setting :google_analytics, :string, ""
79
79
  setting :rss_description, :boolean, false
80
- setting :rss_description_text, :text, <<-HTML.strip_heredoc
80
+ setting :rss_description_text, :text, <<~HTML
81
81
  <hr />
82
82
  <p><small>Original article written by %author% and published on <a href='%blog_url%'>%blog_name%</a>
83
83
  | <a href='%permalink_url%'>direct link to this article</a>
@@ -86,7 +86,7 @@ class Blog < ApplicationRecord
86
86
  HTML
87
87
  setting :permalink_format, :string, "/%year%/%month%/%day%/%title%"
88
88
  setting :robots, :text, 'User-agent: *\nAllow: /\nDisallow: /admin\n'
89
- setting :humans, :text, <<-TEXT.strip_heredoc
89
+ setting :humans, :text, <<~TEXT
90
90
  /* TEAM */
91
91
  Your title: Your name.
92
92
  Site: email, link to a contact form, etc.
@@ -191,10 +191,7 @@ class Blog < ApplicationRecord
191
191
  host: host_with_port,
192
192
  script_name: root_path)
193
193
  cache_key = merged_opts.values.prepend("blog-urlfor-withbaseurl").join("-")
194
- unless Rails.cache.exist?(cache_key)
195
- Rails.cache.write(cache_key, super(merged_opts))
196
- end
197
- Rails.cache.read(cache_key)
194
+ Rails.cache.fetch(cache_key) { super(merged_opts) }
198
195
  else
199
196
  raise "Invalid URL in url_for: #{options.inspect}"
200
197
  end
@@ -10,15 +10,13 @@ class Content < ApplicationRecord
10
10
  belongs_to :user, optional: true, touch: true
11
11
  belongs_to :blog
12
12
 
13
- validates :blog, presence: true
14
-
15
13
  has_one :redirect, dependent: :destroy, inverse_of: :content
16
14
 
17
15
  has_many :triggers, as: :pending_item, dependent: :delete_all
18
16
  has_many :resources, inverse_of: :content, dependent: :nullify
19
17
  has_and_belongs_to_many :tags
20
18
 
21
- scope :user_id, ->(user_id) { where("user_id = ?", user_id) }
19
+ scope :user_id, ->(user_id) { where(user_id: user_id) }
22
20
  scope :published, -> { where(state: "published").order(default_order) }
23
21
  scope :published_at, lambda { |time_params|
24
22
  published.where(published_at: PublifyTime.delta(*time_params))
@@ -5,12 +5,6 @@ module ContentBase
5
5
  base.extend ClassMethods
6
6
  end
7
7
 
8
- class ContentTextHelpers
9
- include ActionView::Helpers::UrlHelper
10
- include ActionView::Helpers::TextHelper
11
- include ActionView::Helpers::SanitizeHelper
12
- end
13
-
14
8
  attr_accessor :just_changed_published_status
15
9
  alias just_changed_published_status? just_changed_published_status
16
10
 
@@ -40,21 +34,16 @@ module ContentBase
40
34
  # object.
41
35
  def generate_html(field, text = nil)
42
36
  text ||= self[field].to_s
43
- prehtml = html_preprocess(field, text).to_s
44
- html = (text_filter || default_text_filter).filter_text(prehtml) || prehtml
37
+ html = (text_filter || default_text_filter).filter_text(text) || text
45
38
  html_postprocess(field, html).to_s
46
39
  end
47
40
 
48
41
  # Post-process the HTML
49
42
  def html_postprocess(_field, html)
50
- helper = ContentTextHelpers.new
43
+ helper = PublifyCore::ContentTextHelpers.new
51
44
  helper.sanitize html
52
45
  end
53
46
 
54
- def html_preprocess(_field, html)
55
- html
56
- end
57
-
58
47
  def html_map(field)
59
48
  content_fields.include? field
60
49
  end
@@ -13,7 +13,6 @@ class Feedback < ApplicationRecord
13
13
  include StringLengthLimit
14
14
 
15
15
  validate :feedback_allowed, on: :create
16
- validates :article, presence: true
17
16
 
18
17
  validates_default_string_length :title, :author, :email, :url, :blog_name,
19
18
  :user_agent, :text_filter_name
@@ -94,7 +93,7 @@ class Feedback < ApplicationRecord
94
93
  end
95
94
 
96
95
  def html_postprocess(_field, html)
97
- helper = ContentTextHelpers.new
96
+ helper = PublifyCore::ContentTextHelpers.new
98
97
  helper.sanitize(helper.auto_link(html), tags: self.class.allowed_tags)
99
98
  end
100
99
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  class MetaSidebar < Sidebar
4
4
  description "This widget just displays links to Publify main site," \
5
- " this blog's admin and RSS."
5
+ " this blog's admin and RSS."
6
6
 
7
7
  setting :title, "Meta"
8
8
  end
data/app/models/note.rb CHANGED
@@ -43,8 +43,8 @@ class Note < Content
43
43
  []
44
44
  end
45
45
 
46
- def html_preprocess(_field, html)
47
- PublifyApp::Textfilter::Twitterfilter.filtertext(html)
46
+ def html_postprocess(field, html)
47
+ super(field, PublifyApp::Textfilter::Twitterfilter.filtertext(html))
48
48
  end
49
49
 
50
50
  def truncate(message, length)
@@ -8,7 +8,6 @@ class Redirect < ApplicationRecord
8
8
 
9
9
  validates :from_path, uniqueness: true
10
10
  validates :to_path, presence: true
11
- validates :blog, presence: true
12
11
 
13
12
  validates_default_string_length :from_path, :to_path
14
13
 
@@ -62,7 +62,7 @@ class Sidebar < ApplicationRecord
62
62
  end
63
63
 
64
64
  def self.short_name
65
- to_s.underscore.split(/_/).first
65
+ to_s.underscore.split("_").first
66
66
  end
67
67
 
68
68
  def self.path_name
@@ -13,7 +13,7 @@ class StaticSidebar < Sidebar
13
13
  TEXT
14
14
 
15
15
  description "Static content, like links to other sites, advertisements," \
16
- " or blog meta-information"
16
+ " or blog meta-information"
17
17
 
18
18
  setting :title, "Links"
19
19
  setting :body, DEFAULT_TEXT, input_type: :text_area
data/app/models/tag.rb CHANGED
@@ -7,7 +7,6 @@ class Tag < ApplicationRecord
7
7
  has_and_belongs_to_many :contents, order: "created_at DESC"
8
8
 
9
9
  validates :name, uniqueness: { scope: :blog_id }
10
- validates :blog, presence: true
11
10
  validates :name, presence: true
12
11
  validates_default_string_length :display_name
13
12
 
@@ -40,11 +39,11 @@ class Tag < ApplicationRecord
40
39
  end
41
40
 
42
41
  def self.find_all_with_content_counters
43
- Tag.joins(:contents).
44
- where(contents: { state: "published" }).
45
- select(*Tag.column_names, "COUNT(contents_tags.content_id) as content_counter").
46
- group(*Tag.column_names).
47
- order("content_counter DESC").limit(1000)
42
+ Tag.joins(:contents)
43
+ .where(contents: { state: "published" })
44
+ .select(*Tag.column_names, "COUNT(contents_tags.content_id) as content_counter")
45
+ .group(*Tag.column_names)
46
+ .order("content_counter DESC").limit(1000)
48
47
  end
49
48
 
50
49
  def self.find_with_char(char)
@@ -52,8 +51,8 @@ class Tag < ApplicationRecord
52
51
  end
53
52
 
54
53
  def self.collection_to_string(tags)
55
- tags.map(&:display_name).sort.
56
- map { |name| / /.match?(name) ? "\"#{name}\"" : name }.join ", "
54
+ tags.map(&:display_name).sort
55
+ .map { |name| name.include?(" ") ? "\"#{name}\"" : name }.join ", "
57
56
  end
58
57
 
59
58
  def published_contents
@@ -7,8 +7,8 @@ class TagSidebar < Sidebar
7
7
  setting :maximum_tags, 20
8
8
 
9
9
  def tags
10
- @tags ||= Tag.find_all_with_content_counters.
11
- take(maximum_tags.to_i).sort_by(&:name)
10
+ @tags ||= Tag.find_all_with_content_counters
11
+ .take(maximum_tags.to_i).sort_by(&:name)
12
12
  end
13
13
 
14
14
  def sizes
@@ -18,7 +18,7 @@ class TagSidebar < Sidebar
18
18
  average = total.to_f / @tags.size
19
19
  @sizes = tags.reduce({}) do |h, tag|
20
20
  size = tag.content_counter.to_f / average
21
- h.merge tag => [[2.0 / 3.0, size].max, 2].min * 100
21
+ h.merge tag => size.clamp(2.0 / 3.0, 2) * 100
22
22
  end
23
23
  end
24
24
 
@@ -17,48 +17,34 @@ class TextFilter
17
17
  @params = params
18
18
  end
19
19
 
20
- def sanitize(*args, &blk)
21
- self.class.sanitize(*args, &blk)
20
+ def sanitize(...)
21
+ self.class.sanitize(...)
22
22
  end
23
23
 
24
24
  def self.find_or_default(name)
25
25
  make_filter(name) || none
26
26
  end
27
27
 
28
- def self.filter_text(text, filters)
29
- map = TextFilterPlugin.filter_map
30
-
31
- filters.each do |filter|
32
- next if filter.nil?
33
-
34
- filter_class = map[filter.to_s]
35
- next unless filter_class
28
+ def filter_text(text)
29
+ all_filters = TextFilterPlugin
30
+ .expand_filter_list([:macropre, markup, :macropost, filters].flatten)
36
31
 
37
- text = filter_class.filtertext(text)
32
+ all_filters.each do |filter|
33
+ text = filter.filtertext(text)
38
34
  end
39
35
 
40
36
  text
41
37
  end
42
38
 
43
- def filter_text(text)
44
- self.class.filter_text(text, [:macropre, markup, :macropost, filters].flatten)
45
- end
46
-
47
39
  def help
48
- filter_map = TextFilterPlugin.filter_map
49
- filter_types = TextFilterPlugin.available_filter_types
40
+ help_filters = TextFilterPlugin
41
+ .expand_filter_list([markup, :macropre, :macropost, filters].flatten)
50
42
 
51
- help = []
52
- help.push(filter_map[markup])
53
- filter_types["macropre"].sort_by(&:short_name).each { |f| help.push f }
54
- filter_types["macropost"].sort_by(&:short_name).each { |f| help.push f }
55
- filters.each { |f| help.push(filter_map[f.to_s]) }
56
-
57
- help_text = help.map do |f|
43
+ help_text = help_filters.map do |f|
58
44
  if f.help_text.blank?
59
45
  ""
60
46
  else
61
- "<h3>#{f.display_name}</h3>\n#{BlueCloth.new(f.help_text).to_html}\n"
47
+ "<h3>#{f.display_name}</h3>\n#{CommonMarker.render_html(f.help_text, :DEFAULT)}"
62
48
  end
63
49
  end
64
50
 
@@ -66,13 +52,11 @@ class TextFilter
66
52
  end
67
53
 
68
54
  def commenthelp
69
- filter_map = TextFilterPlugin.filter_map
70
-
71
- help = [filter_map[markup]]
72
- filters.each { |f| help.push(filter_map[f.to_s]) }
55
+ help_filters = TextFilterPlugin
56
+ .expand_filter_list([markup, filters].flatten)
73
57
 
74
- help.map do |f|
75
- f.help_text.blank? ? "" : "#{BlueCloth.new(f.help_text).to_html}\n"
58
+ help_filters.map do |f|
59
+ f.help_text.blank? ? "" : CommonMarker.render_html(f.help_text)
76
60
  end.join("\n")
77
61
  end
78
62
 
@@ -81,7 +65,6 @@ class TextFilter
81
65
  markdown,
82
66
  smartypants,
83
67
  markdown_smartypants,
84
- textile,
85
68
  none,
86
69
  ]
87
70
  end
@@ -94,8 +77,6 @@ class TextFilter
94
77
  smartypants
95
78
  when "markdown smartypants"
96
79
  markdown_smartypants
97
- when "textile"
98
- textile
99
80
  when "none"
100
81
  none
101
82
  end
@@ -116,15 +97,8 @@ class TextFilter
116
97
 
117
98
  def self.markdown_smartypants
118
99
  new(name: "markdown smartypants",
119
- description: "Markdown with SmartyPants",
120
- markup: "markdown",
121
- filters: [:smartypants])
122
- end
123
-
124
- def self.textile
125
- new(name: "textile",
126
- description: "Textile",
127
- markup: "textile")
100
+ description: "Markdown with smart quotes",
101
+ markup: "markdownsmartquotes")
128
102
  end
129
103
 
130
104
  def self.none
data/app/models/user.rb CHANGED
@@ -69,8 +69,8 @@ class User < ApplicationRecord
69
69
  end
70
70
 
71
71
  def display_names
72
- [:login, :nickname, :firstname, :lastname, :first_and_last_name].
73
- map { |f| send(f) }.delete_if(&:empty?)
72
+ [:login, :nickname, :firstname, :lastname, :first_and_last_name]
73
+ .map { |f| send(f) }.delete_if(&:empty?)
74
74
  end
75
75
 
76
76
  # Authenticate users with old password hashes
@@ -60,9 +60,9 @@ class TitleBuilder
60
60
  end
61
61
 
62
62
  def substitute_parameters(str, parameters)
63
- str = str.gsub("%date%", parse_date(str, parameters)) if /%date%/.match?(str)
63
+ str = str.gsub("%date%", parse_date(str, parameters)) if str.include?("%date%")
64
64
  str = str.gsub("%search%", parameters[:q]) if parameters[:q]
65
- str = str.gsub("%page%", parse_page(str, parameters)) if /%page%/.match?(str)
65
+ str = str.gsub("%page%", parse_page(str, parameters)) if str.include?("%page%")
66
66
 
67
67
  str
68
68
  end
@@ -75,8 +75,8 @@ class TitleBuilder
75
75
  format << "%B " if params[:month]
76
76
  format << "%Y" if params[:year]
77
77
 
78
- string.gsub("%date%", Time.zone.local(*params.values_at(:year, :month, :day)).
79
- strftime(format))
78
+ string.gsub("%date%", Time.zone.local(*params.values_at(:year, :month, :day))
79
+ .strftime(format))
80
80
  end
81
81
 
82
82
  def parse_page(_string, params)
@@ -1,6 +1,6 @@
1
1
  <% if @articles.empty? %>
2
2
  <tr>
3
- <td colspan="6">
3
+ <td colspan="7">
4
4
  <%= t('.no_articles') %>
5
5
  </td>
6
6
  </tr>
@@ -9,7 +9,7 @@
9
9
  <tr>
10
10
  <td>
11
11
  <% if article.published? %>
12
- <%= link_to_permalink(article, article.title, nil, 'published') %>
12
+ <%= link_to_permalink(article, article.title, style: 'published') %>
13
13
  <% else %>
14
14
  <%= link_to(article.title, { controller: '/articles', action: 'preview', id: article.id }, { class: 'unpublished', target: '_new' }) %>
15
15
  <% end %>
@@ -38,4 +38,4 @@
38
38
  </td>
39
39
  </tr>
40
40
  <% end %>
41
- <%= display_pagination(@articles, 5, 'first', 'last') %>
41
+ <%= display_pagination(@articles, 7, 'first', 'last') %>
@@ -21,7 +21,17 @@
21
21
  <div class="row">
22
22
  <div class="col-md-8 col-md-offset-2" id="error-message-article">
23
23
  <%= render 'shared/flash', flash: flash %>
24
- <%= error_messages_for 'article' %>
24
+ <% if @article.errors.any? %>
25
+ <div id="error_explanation">
26
+ <h2><%= t("errors.template.header", model: 'article', count: @article.errors.count) %></h2>
27
+ <p><%= t("errors.template.body") %></p>
28
+ <ul>
29
+ <% @article.errors.full_messages.each do |message| %>
30
+ <li><%= message %></li>
31
+ <% end %>
32
+ </ul>
33
+ </div>
34
+ <% end %>
25
35
  </div>
26
36
  </div>
27
37
 
@@ -1,7 +1,7 @@
1
1
  <% content_for :page_heading do %>
2
2
  <h2>
3
3
  <%= t('.manage_articles') %>
4
- <%= link_to(t('.new_article'), { controller: 'content', action: 'new' }, { id: 'dialog-link', class: 'btn btn-info pull-right' }) %>
4
+ <%= link_to(t('.new_article'), { controller: 'articles', action: 'new' }, { id: 'dialog-link', class: 'btn btn-info pull-right' }) %>
5
5
  </h2>
6
6
  <% end %>
7
7
 
@@ -6,13 +6,13 @@
6
6
  <ul class='list-unstyled'>
7
7
  <% if @drafts.empty? %>
8
8
  <li class='alert alert-info'>
9
- <%= link_to t('.no_drafts_yet'), controller: 'content', action: 'new' %> ?
9
+ <%= link_to t('.no_drafts_yet'), controller: 'articles', action: 'new' %> ?
10
10
  </li>
11
11
  <% else %>
12
12
  <% for post in @drafts %>
13
13
  <li>
14
14
  <h5>
15
- <%= link_to(post.title, controller: 'admin/content', action: 'edit', id: post.id) %>
15
+ <%= link_to(post.title, controller: 'admin/articles', action: 'edit', id: post.id) %>
16
16
  <%= display_date_and_time(post.created_at) %>
17
17
  </h5>
18
18
  <p><%= post.body&.strip_html&.slice(0, 300) %></p>
@@ -4,7 +4,7 @@
4
4
  <span class="sr-only">Close</span>
5
5
  </button>
6
6
  <% links = []
7
- links << link_to(t('.write_a_post'), controller: 'content', action: 'new') if can? :new, 'admin/content'
7
+ links << link_to(t('.write_a_post'), controller: 'articles', action: 'new') if can? :new, 'admin/articles'
8
8
  links << link_to(t('.write_a_page'), controller: 'pages', action: 'new') if can? :new, 'admin/pages'
9
9
  links << link_to(t('.update_your_profile_or_change_your_password'), controller: 'profiles', action: 'index') %>
10
10
  <p>
@@ -6,11 +6,11 @@
6
6
  <p><%= t('.articles_and_comments_count_since', articles_count: @newposts_count, comments_count: @newcomments_count) %></p>
7
7
  <p><%= t('.running_publify', version: PublifyCore::VERSION) %> <%= @version_message %></p>
8
8
  <div class='col-md-6'>
9
- <% if can? :index, 'admin/content' %>
9
+ <% if can? :index, 'admin/articles' %>
10
10
  <h4 class='page-header'><%= t('.content') %></h4>
11
- <p><%= link_to(t('.articles_count', count: @statposts), controller: 'admin/content') %></p>
12
- <p><%= link_to(t('.your_articles_count', count: @statuserposts), controller: 'admin/content', 'search[user_id]' => current_user.id) %></p>
13
- <p><%= link_to(t('.drafts_count', count: @statsdrafts), controller: 'admin/content', 'search[state]' => 'drafts') %></p>
11
+ <p><%= link_to(t('.articles_count', count: @statposts), controller: 'admin/articles') %></p>
12
+ <p><%= link_to(t('.your_articles_count', count: @statuserposts), controller: 'admin/articles', 'search[user_id]' => current_user.id) %></p>
13
+ <p><%= link_to(t('.drafts_count', count: @statsdrafts), controller: 'admin/articles', 'search[state]' => 'drafts') %></p>
14
14
  <p><%= link_to(t('.pages_count', count: @statspages), controller: 'admin/pages') %></p>
15
15
  <p><%= link_to(t('.notes_count', count: @statuses), controller: 'admin/notes') %></p>
16
16
  <% end %>
@@ -3,13 +3,6 @@
3
3
  <% end %>
4
4
 
5
5
  <%= render 'overview' %>
6
- <% if Content.where(text_filter_name: "textile").any? || Feedback.where(text_filter_name: "textile").any? %>
7
- <div class="alert alert-warning">
8
- <p>
9
- <%= t('.textile_deprecated_html') %>
10
- </p>
11
- </div>
12
- <% end %>
13
6
 
14
7
  <div class='row'>
15
8
  <div class='col-md-6'>
@@ -1,6 +1,6 @@
1
1
  <% content_for :page_heading do %>
2
2
  <h2 class="page-title">
3
- <%= t('.comments_for_html', title: @article.title) %>
3
+ <%= t('.comments_for_html', title: link_to_permalink(@article, @article.title)) %>
4
4
  </h2>
5
5
  <% end %>
6
6
 
@@ -8,18 +8,24 @@
8
8
 
9
9
  <%= hidden_field_tag 'article_id', @article.id %>
10
10
 
11
- <%= render 'button', position: 'top' %>
11
+ <% if @feedback.any? %>
12
+ <%= render 'button', position: 'top' %>
13
+ <% end %>
12
14
 
13
- <br class='clear' />
14
15
  <table class='table hover'>
15
16
  <thead>
16
17
  <tr class='noborder'>
17
- <th colspan='5'>
18
+ <th>
18
19
  <input type="checkbox" name="checkall" id="checkall" onclick="check_all(this);" />
19
- <%= t('.select_all') %>
20
20
  </th>
21
+ <th><%= t(".author") %></th>
22
+ <th><%= t(".created_at") %></th>
23
+ <th><%= t(".status") %></th>
24
+ <th><%= t(".content") %></th>
25
+ <th><%= t(".actions") %></th>
21
26
  </tr>
22
27
  </thead>
28
+
23
29
  <% if @feedback.empty? %>
24
30
  <tr>
25
31
  <td colspan="5">
@@ -62,7 +68,7 @@
62
68
  <%= text_area 'comment', 'body', rows: '10', class: 'form-control' %>
63
69
  </div>
64
70
  </div>
65
- <div class='form-group col-md-12'>
71
+ <div>
66
72
  <%= t('.action_or_other_html', first_action: link_to(t('.cancel'), action: 'index'), second_action: submit_tag(t('.save'), class: 'btn btn-primary')) %>
67
73
  </div>
68
74
  </fieldset>
@@ -1,12 +1,24 @@
1
1
  <% content_for :page_heading do %>
2
2
  <h2 class="page-title">
3
- <%= t('.comments_for_html', article_link: link_to(h(@comment.article.title), controller: '/admin/content', action: 'edit', id: @comment.article.id).html_safe) %>
3
+ <%= t('.comments_for_html', article_link: link_to(h(@comment.article.title), controller: '/admin/articles', action: 'edit', id: @comment.article.id).html_safe) %>
4
4
  </h2>
5
5
  <% end %>
6
6
 
7
7
  <%= form_tag action: 'update', id: @comment.id do %>
8
8
 
9
- <%= error_messages_for 'comment' %>
9
+ <%= render 'shared/flash', flash: flash %>
10
+ <% if @comment.errors.any? %>
11
+ <div id="error_explanation">
12
+ <h2><%= t("errors.template.header", model: 'comment', count: @comment.errors.count) %></h2>
13
+ <p><%= t("errors.template.body") %></p>
14
+ <ul>
15
+ <% @comment.errors.full_messages.each do |message| %>
16
+ <li><%= message %></li>
17
+ <% end %>
18
+ </ul>
19
+ </div>
20
+ <% end %>
21
+
10
22
  <%= hidden_field_tag 'article_id', @article.id %>
11
23
 
12
24
  <fieldset>