pages_core 3.6.2 → 3.7.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 (232) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -1
  3. data/Rakefile +3 -1
  4. data/app/assets/javascripts/pages/admin/components/grid_image.jsx +1 -1
  5. data/app/assets/javascripts/pages/admin/components/image_editor.jsx +5 -5
  6. data/app/assets/javascripts/pages/admin/components/image_grid.jsx +10 -5
  7. data/app/assets/javascripts/pages/admin/components/image_uploader.jsx +10 -5
  8. data/app/assets/javascripts/pages/admin/components/page_tree.jsx +9 -9
  9. data/app/assets/javascripts/pages/admin/components/page_tree_node.jsx +11 -11
  10. data/app/assets/javascripts/pages/admin/components/rich_text_area.jsx +5 -4
  11. data/app/assets/javascripts/pages/admin/components/rich_text_toolbar.jsx +54 -21
  12. data/app/assets/javascripts/pages/admin/components/toast.jsx +0 -3
  13. data/app/assets/javascripts/pages/admin/components/toast_store.jsx +1 -1
  14. data/app/assets/javascripts/pages/admin/features/edit_page.jsx +3 -3
  15. data/app/assets/javascripts/pages/admin/features/rich_text.jsx +1 -1
  16. data/app/assets/javascripts/pages/admin/features/tag_editor.jsx +28 -28
  17. data/app/assets/javascripts/pages/admin/lib/tree.jsx +9 -9
  18. data/app/assets/javascripts/pages/login_form.jsx +8 -8
  19. data/app/assets/stylesheets/pages/admin/components/forms.scss +20 -0
  20. data/app/assets/stylesheets/pages/errors.css +2 -0
  21. data/app/controller_dummies/admin/admin_controller.rb +2 -0
  22. data/app/controller_dummies/application_controller.rb +2 -0
  23. data/app/controller_dummies/attachments_controller.rb +2 -0
  24. data/app/controller_dummies/frontend_controller.rb +2 -0
  25. data/app/controller_dummies/images_controller.rb +2 -0
  26. data/app/controller_dummies/page_files_controller.rb +2 -0
  27. data/app/controller_dummies/pages_controller.rb +2 -0
  28. data/app/controller_dummies/sitemaps_controller.rb +2 -0
  29. data/app/controllers/admin/attachments_controller.rb +4 -2
  30. data/app/controllers/admin/categories_controller.rb +2 -0
  31. data/app/controllers/admin/images_controller.rb +10 -5
  32. data/app/controllers/admin/invites_controller.rb +4 -1
  33. data/app/controllers/admin/pages_controller.rb +7 -19
  34. data/app/controllers/admin/password_resets_controller.rb +9 -5
  35. data/app/controllers/admin/users_controller.rb +10 -4
  36. data/app/controllers/concerns/pages_core/admin/news_page_controller.rb +13 -11
  37. data/app/controllers/concerns/pages_core/admin/persistent_params.rb +75 -0
  38. data/app/controllers/concerns/pages_core/authentication.rb +4 -1
  39. data/app/controllers/concerns/pages_core/error_renderer.rb +3 -0
  40. data/app/controllers/concerns/pages_core/error_reporting.rb +36 -0
  41. data/app/controllers/concerns/pages_core/policies_helper.rb +4 -1
  42. data/app/controllers/concerns/pages_core/preview_pages_controller.rb +3 -0
  43. data/app/controllers/concerns/pages_core/process_titler.rb +2 -0
  44. data/app/controllers/concerns/pages_core/rss_controller.rb +2 -0
  45. data/app/controllers/concerns/pages_core/static_cache_controller.rb +48 -0
  46. data/app/controllers/errors_controller.rb +5 -53
  47. data/app/controllers/pages_core/admin_controller.rb +7 -67
  48. data/app/controllers/pages_core/attachments_controller.rb +10 -6
  49. data/app/controllers/pages_core/base_controller.rb +11 -17
  50. data/app/controllers/pages_core/frontend/page_files_controller.rb +6 -2
  51. data/app/controllers/pages_core/frontend/pages_controller.rb +9 -15
  52. data/app/controllers/pages_core/frontend_controller.rb +3 -0
  53. data/app/controllers/pages_core/images_controller.rb +3 -1
  54. data/app/controllers/pages_core/sitemaps_controller.rb +11 -5
  55. data/app/controllers/sessions_controller.rb +2 -0
  56. data/app/formatters/pages_core/html_formatter.rb +13 -63
  57. data/app/formatters/pages_core/image_embedder.rb +79 -0
  58. data/app/formatters/pages_core/link_renderer.rb +2 -0
  59. data/app/helpers/admin/admin_helper.rb +2 -0
  60. data/app/helpers/admin/menu_helper.rb +6 -4
  61. data/app/helpers/admin/pages_helper.rb +4 -57
  62. data/app/helpers/application_helper.rb +2 -0
  63. data/app/helpers/frontend_helper.rb +2 -0
  64. data/app/helpers/pages_core/admin/admin_helper.rb +22 -106
  65. data/app/helpers/pages_core/admin/content_tabs_helper.rb +28 -0
  66. data/app/helpers/pages_core/admin/date_range_helper.rb +55 -0
  67. data/app/helpers/pages_core/admin/form_builder.rb +8 -0
  68. data/app/helpers/pages_core/admin/image_uploads_helper.rb +48 -0
  69. data/app/helpers/pages_core/admin/labelled_field_helper.rb +12 -9
  70. data/app/helpers/pages_core/admin/page_blocks_helper.rb +66 -0
  71. data/app/helpers/pages_core/admin/page_json_helper.rb +23 -0
  72. data/app/helpers/pages_core/admin/tag_editor_helper.rb +11 -9
  73. data/app/helpers/pages_core/application_helper.rb +3 -0
  74. data/app/helpers/pages_core/attachments_helper.rb +31 -27
  75. data/app/helpers/pages_core/form_builder.rb +17 -13
  76. data/app/helpers/pages_core/frontend_helper.rb +3 -3
  77. data/app/helpers/pages_core/head_tags_helper.rb +7 -2
  78. data/app/helpers/pages_core/images_helper.rb +3 -0
  79. data/app/helpers/pages_core/meta_tags_helper.rb +3 -1
  80. data/app/helpers/pages_core/open_graph_tags_helper.rb +7 -5
  81. data/app/helpers/pages_core/page_path_helper.rb +24 -3
  82. data/app/jobs/pages_core/autopublish_job.rb +3 -1
  83. data/app/jobs/pages_core/sweep_cache_job.rb +4 -2
  84. data/app/mailers/admin_mailer.rb +4 -14
  85. data/app/models/attachment.rb +10 -8
  86. data/app/models/autopublisher.rb +3 -0
  87. data/app/models/category.rb +3 -1
  88. data/app/models/concerns/pages_core/has_roles.rb +2 -0
  89. data/app/models/concerns/pages_core/humanizable_param.rb +9 -6
  90. data/app/models/concerns/pages_core/page_model/attachments.rb +2 -0
  91. data/app/models/concerns/pages_core/page_model/autopublishable.rb +2 -0
  92. data/app/models/concerns/pages_core/page_model/dated_page.rb +11 -11
  93. data/app/models/concerns/pages_core/page_model/images.rb +5 -1
  94. data/app/models/concerns/pages_core/page_model/localizable.rb +2 -0
  95. data/app/models/concerns/pages_core/page_model/pathable.rb +26 -25
  96. data/app/models/concerns/pages_core/page_model/redirectable.rb +3 -1
  97. data/app/models/concerns/pages_core/page_model/sortable.rb +6 -5
  98. data/app/models/concerns/pages_core/page_model/status.rb +2 -0
  99. data/app/models/concerns/pages_core/page_model/templateable.rb +7 -2
  100. data/app/models/concerns/pages_core/page_model/tree.rb +27 -20
  101. data/app/models/concerns/pages_core/sweepable.rb +4 -2
  102. data/app/models/concerns/pages_core/taggable.rb +8 -2
  103. data/app/models/image.rb +14 -1
  104. data/app/models/invite.rb +3 -1
  105. data/app/models/invite_role.rb +5 -3
  106. data/app/models/page.rb +4 -3
  107. data/app/models/page_builder.rb +2 -0
  108. data/app/models/page_category.rb +3 -1
  109. data/app/models/page_exporter.rb +22 -9
  110. data/app/models/page_file.rb +3 -1
  111. data/app/models/page_image.rb +3 -1
  112. data/app/models/page_path.rb +13 -5
  113. data/app/models/password_reset_token.rb +3 -1
  114. data/app/models/role.rb +8 -5
  115. data/app/models/tag.rb +8 -6
  116. data/app/models/tagging.rb +4 -2
  117. data/app/models/user.rb +7 -4
  118. data/app/policies/invite_policy.rb +2 -0
  119. data/app/policies/page_file_policy.rb +2 -0
  120. data/app/policies/page_image_policy.rb +2 -0
  121. data/app/policies/page_policy.rb +2 -0
  122. data/app/policies/policy.rb +2 -0
  123. data/app/policies/user_policy.rb +2 -0
  124. data/app/serializers/admin/attachment_serializer.rb +4 -2
  125. data/app/serializers/admin/image_serializer.rb +4 -2
  126. data/app/serializers/admin/page_file_serializer.rb +2 -0
  127. data/app/serializers/admin/page_image_serializer.rb +2 -0
  128. data/app/serializers/page_export_serializer.rb +2 -0
  129. data/app/serializers/page_file_export_serializer.rb +2 -0
  130. data/app/serializers/page_image_export_serializer.rb +2 -0
  131. data/app/serializers/page_image_serializer.rb +2 -0
  132. data/app/serializers/page_serializer.rb +2 -0
  133. data/app/services/pages_core/create_user_service.rb +5 -2
  134. data/app/services/pages_core/destroy_invite_service.rb +25 -0
  135. data/app/services/pages_core/invite_service.rb +2 -0
  136. data/app/views/admin/images/show.json.jbuilder +2 -0
  137. data/app/views/admin/pages/news.html.erb +1 -1
  138. data/app/views/errors/500.html.erb +2 -20
  139. data/app/views/errors/_generic_help.html.erb +1 -1
  140. data/app/views/feeds/pages.rss.builder +2 -0
  141. data/app/views/sitemaps/show.xml.builder +2 -0
  142. data/config/routes.rb +5 -5
  143. data/db/migrate/20111219033112_create_pages_tables.rb +192 -271
  144. data/lib/pages_core.rb +10 -0
  145. data/lib/pages_core/admin_menu_item.rb +3 -0
  146. data/lib/pages_core/archive_finder.rb +12 -16
  147. data/lib/pages_core/attachment_embedder.rb +4 -6
  148. data/lib/pages_core/cache_sweeper.rb +10 -108
  149. data/lib/pages_core/configuration.rb +2 -0
  150. data/lib/pages_core/configuration/base.rb +5 -0
  151. data/lib/pages_core/configuration/pages.rb +4 -2
  152. data/lib/pages_core/digest_verifier.rb +5 -5
  153. data/lib/pages_core/engine.rb +52 -0
  154. data/lib/pages_core/extensions.rb +2 -0
  155. data/lib/pages_core/extensions/string_extensions.rb +3 -1
  156. data/lib/pages_core/page_path_constraint.rb +2 -0
  157. data/lib/pages_core/pages_plugin.rb +3 -1
  158. data/lib/pages_core/plugin.rb +4 -52
  159. data/lib/pages_core/pub_sub.rb +2 -0
  160. data/lib/pages_core/static_cache.rb +26 -0
  161. data/lib/pages_core/static_cache/null_handler.rb +17 -0
  162. data/lib/pages_core/static_cache/page_cache_handler.rb +56 -0
  163. data/lib/pages_core/static_cache/varnish_handler.rb +55 -0
  164. data/lib/pages_core/templates.rb +5 -3
  165. data/lib/pages_core/templates/block_configuration.rb +3 -0
  166. data/lib/pages_core/templates/configuration.rb +5 -1
  167. data/lib/pages_core/templates/configuration_handler.rb +4 -2
  168. data/lib/pages_core/templates/configuration_proxy.rb +2 -0
  169. data/lib/pages_core/templates/controller_actions.rb +2 -0
  170. data/lib/pages_core/templates/template_configuration.rb +18 -13
  171. data/lib/pages_core/version.rb +3 -1
  172. data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +2 -0
  173. data/lib/rails/generators/pages_core/install/install_generator.rb +3 -7
  174. data/lib/rails/generators/pages_core/install/templates/active_job_initializer.rb +2 -0
  175. data/lib/rails/generators/pages_core/install/templates/application_controller.rb +2 -0
  176. data/lib/rails/generators/pages_core/install/templates/application_helper.rb +2 -0
  177. data/lib/rails/generators/pages_core/install/templates/delayed_job +1 -0
  178. data/lib/rails/generators/pages_core/install/templates/delayed_job_initializer.rb +17 -0
  179. data/lib/rails/generators/pages_core/install/templates/frontend_controller.rb +2 -0
  180. data/lib/rails/generators/pages_core/install/templates/frontend_helper.rb +2 -0
  181. data/lib/rails/generators/pages_core/install/templates/gitignore.erb +12 -1
  182. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +2 -0
  183. data/lib/rails/generators/pages_core/install/templates/pages_controller.rb +2 -0
  184. data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +2 -6
  185. data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +18 -14
  186. data/lib/rails/generators/pages_core/rspec/templates/factories.rb +3 -8
  187. data/lib/rails/generators/pages_core/rspec/templates/mailer_macros.rb +2 -0
  188. data/lib/rails/generators/pages_core/rspec/templates/page_templates_spec.rb +26 -0
  189. data/lib/rails/generators/pages_core/rspec/templates/rails_helper.rb +91 -0
  190. data/lib/rails/generators/pages_core/rspec/templates/spec_helper.rb +89 -36
  191. data/lib/tasks/pages.rake +3 -2
  192. data/lib/tasks/pages/cache.rake +8 -5
  193. data/lib/tasks/pages/export.rake +3 -1
  194. data/lib/tasks/pages/page_paths.rake +2 -0
  195. data/template.rb +2 -0
  196. metadata +127 -77
  197. data/app/controllers/concerns/pages_core/domain_based_cache.rb +0 -26
  198. data/app/views/admin_mailer/error_report.html.erb +0 -70
  199. data/app/views/errors/500_critical.html.erb +0 -7
  200. data/app/views/errors/report.html.erb +0 -4
  201. data/config/removed_migrations.yml +0 -60
  202. data/db/migrate/20120627033112_rename_textbits.rb +0 -17
  203. data/db/migrate/20121010055412_drop_removed_tables.rb +0 -81
  204. data/db/migrate/20130130053932_add_queue_to_delayed_jobs.rb +0 -9
  205. data/db/migrate/20130303053932_remove_filter_from_localizations.rb +0 -9
  206. data/db/migrate/20130303160632_remove_imagesets.rb +0 -22
  207. data/db/migrate/20130303161732_remove_sms_subscribers.rb +0 -14
  208. data/db/migrate/20130823133208_update_page_redirect_to.rb +0 -10
  209. data/db/migrate/20140203183900_create_roles.rb +0 -66
  210. data/db/migrate/20140414150500_change_locale_names.rb +0 -11
  211. data/db/migrate/20140604142100_remove_openid_url.rb +0 -9
  212. data/db/migrate/20140920231700_convert_images_to_dis.rb +0 -81
  213. data/db/migrate/20140922124600_convert_page_files_to_dis.rb +0 -50
  214. data/db/migrate/20141004003100_create_password_reset_tokens.rb +0 -10
  215. data/db/migrate/20141006181300_remove_user_cruft.rb +0 -11
  216. data/db/migrate/20141007173000_create_invites.rb +0 -16
  217. data/db/migrate/20150204130800_update_delayed_job_table.rb +0 -9
  218. data/db/migrate/20150401131300_localize_images.rb +0 -38
  219. data/db/migrate/20150520174300_add_meta_image_to_page.rb +0 -5
  220. data/db/migrate/20150904164200_add_pinned_to_tags.rb +0 -5
  221. data/db/migrate/20151002174800_create_page_paths.rb +0 -10
  222. data/db/migrate/20151021103400_drop_binaries_table.rb +0 -7
  223. data/db/migrate/20151204151000_remove_page_content_order.rb +0 -5
  224. data/db/migrate/20160330220900_rename_pages_categories.rb +0 -6
  225. data/db/migrate/20160405202700_change_localization_limit.rb +0 -9
  226. data/db/migrate/20170716040500_remove_page_comments.rb +0 -23
  227. data/db/migrate/20170716213400_remove_sessions.rb +0 -15
  228. data/db/migrate/20180207134000_add_dates_to_pages.rb +0 -11
  229. data/db/migrate/20190211154800_create_attachments.rb +0 -73
  230. data/db/migrate/20190318115000_fix_page_file_ids.rb +0 -34
  231. data/lib/rails/generators/pages_core/install/templates/cache_sweeper_initializer.rb +0 -6
  232. data/lib/tasks/pages/update.rake +0 -17
@@ -1,13 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # All admin controllers inherit Admin::AdminController, which provides layout,
2
4
  # authorization and other common code for the Admin set of controllers.
3
5
  module PagesCore
4
6
  class AdminController < ::ApplicationController
7
+ include PagesCore::Admin::PersistentParams
8
+
5
9
  protect_from_forgery with: :exception
6
10
 
7
11
  before_action :set_i18n_locale
8
12
  before_action :require_authentication
9
- before_action :restore_persistent_params
10
- after_action :save_persistent_params
11
13
 
12
14
  layout "admin"
13
15
 
@@ -36,29 +38,14 @@ module PagesCore
36
38
  # If not, renders the login screen.
37
39
  def require_authentication
38
40
  return if logged_in?
41
+
39
42
  if User.count < 1
40
- redirect_to(new_admin_user_url) && return
43
+ redirect_to(new_admin_user_url)
41
44
  else
42
- redirect_to(login_admin_users_url) && return
45
+ redirect_to(login_admin_users_url)
43
46
  end
44
47
  end
45
48
 
46
- # Loads persistent params from user model and merges with session.
47
- def restore_persistent_params
48
- return unless current_user && current_user.persistent_data?
49
- session[:persistent_params] ||= {}
50
- session[:persistent_params] = current_user.persistent_data.merge(
51
- session[:persistent_params]
52
- )
53
- end
54
-
55
- # Saves persistent params from session to User model if applicable.
56
- def save_persistent_params
57
- return unless current_user && session[:persistent_params]
58
- current_user.persistent_data = session[:persistent_params]
59
- current_user.save
60
- end
61
-
62
49
  def secure_compare(compare, other)
63
50
  return false unless compare && other
64
51
  return false unless compare.bytesize == other.bytesize
@@ -69,52 +56,5 @@ module PagesCore
69
56
  other.each_byte { |byte| res |= byte ^ l.shift }
70
57
  res.zero?
71
58
  end
72
-
73
- # --- HELPERS ---
74
-
75
- # Add a stylesheet
76
- def add_stylesheet(css_file)
77
- @admin_stylesheets ||= []
78
- @admin_stylesheets << "admin/#{css_file}"
79
- end
80
-
81
- def persistent_params(namespace)
82
- session[:persistent_params] ||= {}
83
- session[:persistent_params][namespace] ||= {}
84
- session[:persistent_params][namespace]
85
- end
86
-
87
- def coerce_persistent_param(value)
88
- case value
89
- when "true"
90
- true
91
- when "false"
92
- false
93
- else
94
- value
95
- end
96
- end
97
-
98
- # Get a persistent param
99
- def persistent_param(key, default = nil, options = {})
100
- key = key.to_s
101
- namespace = options[:namespace] || self.class.to_s
102
-
103
- value = coerce_persistent_param(
104
- if params.key?(key)
105
- params[key]
106
- elsif persistent_params(namespace).key?(key)
107
- persistent_params(namespace)[key]
108
- else
109
- default
110
- end
111
- )
112
-
113
- if !value.nil? || options[:preserve_nil]
114
- persistent_params(namespace)[key.to_s] = value
115
- end
116
-
117
- value
118
- end
119
59
  end
120
60
  end
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class AttachmentsController < ::ApplicationController
3
5
  before_action :verify_signed_params
4
6
  before_action :find_attachment, only: %i[show download]
5
7
 
6
- caches_page :show
8
+ static_cache :show, permanent: true
7
9
 
8
10
  def show
9
11
  send_attachment
@@ -20,12 +22,14 @@ module PagesCore
20
22
  end
21
23
 
22
24
  def send_attachment(disposition: "inline")
23
- if stale?(etag: @attachment, last_modified: @attachment.updated_at)
24
- send_data(@attachment.data,
25
- filename: @attachment.filename,
26
- type: @attachment.content_type,
27
- disposition: disposition)
25
+ unless stale?(etag: @attachment, last_modified: @attachment.updated_at)
26
+ return
28
27
  end
28
+
29
+ send_data(@attachment.data,
30
+ filename: @attachment.filename,
31
+ type: @attachment.content_type,
32
+ disposition: disposition)
29
33
  end
30
34
 
31
35
  def verify_signed_params
@@ -1,41 +1,35 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class BaseController < ActionController::Base
3
5
  include PagesCore::Authentication
4
- include PagesCore::DomainBasedCache
5
6
  include PagesCore::ErrorRenderer
7
+ include PagesCore::ErrorReporting
6
8
  include PagesCore::ProcessTitler
7
9
  include PagesCore::PoliciesHelper
10
+ include PagesCore::StaticCacheController
8
11
 
9
- before_action :set_locale, :configure_error_reporting
12
+ before_action :set_locale
10
13
  after_action :set_content_language_header
11
14
 
12
15
  protected
13
16
 
14
- # Configures additional report data if Sentry is installed
15
- def configure_error_reporting
16
- return unless Object.const_defined?("Raven")
17
- if logged_in?
18
- Raven.user_context(user_id: current_user.id,
19
- user_email: current_user.email)
20
- else
21
- Raven.user_context({})
22
- end
23
- Raven.tags_context(locale: locale)
24
- Raven.extra_context(params: params.to_unsafe_h)
17
+ def append_info_to_payload(payload)
18
+ super
19
+ payload[:remote_ip] = request.remote_ip
20
+ payload.merge!(current_user_context)
25
21
  end
26
22
 
27
23
  # Sets @locale from params[:locale], with I18n.default_locale as fallback
28
24
  def set_locale
29
- legacy_locales = {
30
- "nor" => "nb",
31
- "eng" => "en"
32
- }
25
+ legacy_locales = { "nor" => "nb", "eng" => "en" }
33
26
  @locale = params[:locale] || I18n.default_locale.to_s
34
27
  @locale = legacy_locales[@locale] if legacy_locales[@locale]
35
28
  end
36
29
 
37
30
  def set_content_language_header
38
31
  return unless locale
32
+
39
33
  headers["Content-Language"] = locale.to_s
40
34
  end
41
35
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module Frontend
3
5
  class PageFilesController < ::FrontendController
@@ -6,9 +8,11 @@ module PagesCore
6
8
  before_action :find_page_file, only: %i[show]
7
9
 
8
10
  def show
9
- if stale?(etag: @page_file, last_modified: @page_file.updated_at)
10
- redirect_to attachment_path(@page_file.attachment)
11
+ unless stale?(etag: @page_file, last_modified: @page_file.updated_at)
12
+ return
11
13
  end
14
+
15
+ redirect_to attachment_path(@page_file.attachment)
12
16
  end
13
17
 
14
18
  private
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module Frontend
3
5
  class PagesController < ::FrontendController
@@ -13,7 +15,7 @@ module PagesCore
13
15
  before_action :find_page, only: %i[show preview]
14
16
  before_action :require_page, only: %i[show preview]
15
17
  before_action :canonicalize_url, only: [:show]
16
- after_action :cache_page_request, only: %i[index show]
18
+ static_cache :index, :show
17
19
 
18
20
  def index
19
21
  respond_to do |format|
@@ -45,11 +47,8 @@ module PagesCore
45
47
  return if request.path == canonical_path(@page)
46
48
  # Don't canonicalize if any unknown params are present
47
49
  return if (params.keys - %w[controller action path locale id]).any?
48
- redirect_to(canonical_path(@page), status: :moved_permanently)
49
- end
50
50
 
51
- def disable_page_cache!
52
- @page_cache_disabled = true
51
+ redirect_to(canonical_path(@page), status: :moved_permanently)
53
52
  end
54
53
 
55
54
  def render(*args)
@@ -80,20 +79,13 @@ module PagesCore
80
79
  template = page_template(@page)
81
80
  run_template_actions_for(template, @page)
82
81
  return if @already_rendered
83
- render template: "pages/templates/#{template}"
84
- end
85
82
 
86
- # Cache pages by hand. This is dirty, but it works.
87
- def cache_page_request
88
- return if @page_cache_disabled || !PagesCore.config(:page_cache)
89
- return if response.status&.to_i != 200
90
- return unless @page && @locale
91
-
92
- self.class.cache_page(response.body, request.path)
83
+ render template: "pages/templates/#{template}"
93
84
  end
94
85
 
95
86
  def find_page_by_path
96
87
  return unless params[:path]
88
+
97
89
  @page = PagePath.get(locale, params[:path]).try(&:page)
98
90
  end
99
91
 
@@ -103,7 +95,7 @@ module PagesCore
103
95
  end
104
96
 
105
97
  def render_published_page(page)
106
- if page && page.published?
98
+ if page&.published?
107
99
  @page = page
108
100
  render_page
109
101
  else
@@ -113,11 +105,13 @@ module PagesCore
113
105
 
114
106
  def redirect_page(page)
115
107
  return false unless page.redirects?
108
+
116
109
  redirect_to(page.redirect_path(locale: locale))
117
110
  end
118
111
 
119
112
  def require_page
120
113
  return if @page
114
+
121
115
  render_error 404
122
116
  end
123
117
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Abstract controller for all frontend controllers.
2
4
  module PagesCore
3
5
  class FrontendController < ::ApplicationController
@@ -32,6 +34,7 @@ module PagesCore
32
34
  I18n.locale = locale_param
33
35
  rescue I18n::InvalidLocale
34
36
  raise if Rails.application.config.consider_all_requests_local
37
+
35
38
  render_error 404
36
39
  end
37
40
  end
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class ImagesController < ::ApplicationController
3
5
  include DynamicImage::Controller
4
6
 
5
- caches_page :show, :uncropped, :original
7
+ static_cache :show, :uncropped, :original, permanent: true
6
8
 
7
9
  private
8
10
 
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class SitemapsController < ::ApplicationController
3
5
  include PagesCore::PagePathHelper
4
- caches_page :show
6
+ static_cache :show
5
7
 
6
8
  def show
7
9
  @entries = formatted_entries
@@ -42,13 +44,13 @@ module PagesCore
42
44
 
43
45
  def pages
44
46
  ([Page.root.try(:localize, I18n.default_locale)] +
45
- locales.flat_map do |locale|
46
- Page.published.localized(locale)
47
- end).compact.uniq
47
+ locales.flat_map do |locale|
48
+ Page.published.localized(locale).includes(:parent)
49
+ end).compact.uniq
48
50
  end
49
51
 
50
52
  def page_record_url(record)
51
- if record == Page.root && record.locale == I18n.default_locale
53
+ if record == root_page && record.locale == I18n.default_locale
52
54
  root_url
53
55
  else
54
56
  page_url(record.locale, record)
@@ -68,5 +70,9 @@ module PagesCore
68
70
  def records
69
71
  pages
70
72
  end
73
+
74
+ def root_page
75
+ @root_page ||= Page.root
76
+ end
71
77
  end
72
78
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SessionsController < ::ApplicationController
2
4
  def create
3
5
  user = find_user(params[:username], params[:password])
@@ -1,9 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  class HtmlFormatter
3
- include ActionView::Helpers::AssetTagHelper
4
- include PagesCore::ImagesHelper
5
- include Rails.application.routes.url_helpers
6
-
7
5
  class << self
8
6
  def to_html(string, options = {})
9
7
  new(string, options).to_html
@@ -16,12 +14,9 @@ module PagesCore
16
14
  end
17
15
 
18
16
  def to_html
19
- string = parse_images(parse_files(parse_attachments(@string)))
20
- if @options[:shorten] && string.length > @options[:shorten]
21
- string = string[0..@options[:shorten]] + "..."
22
- end
17
+ string = shorten(parse_images(parse_files(parse_attachments(@string))))
23
18
  string += " #{@options[:append]}" if @options[:append]
24
- RedCloth.new(string).to_html.html_safe
19
+ fix_markup(RedCloth.new(string).to_html).html_safe
25
20
  end
26
21
 
27
22
  private
@@ -34,31 +29,6 @@ module PagesCore
34
29
  /\[file:([\d,]+)\]/
35
30
  end
36
31
 
37
- def image_expression
38
- /\[image:(\d+)([^\]]*)?\]/
39
- end
40
-
41
- def embed_image(id, size:, class_name:, link:)
42
- image = Image.find(id).localize(I18n.locale)
43
- class_name = ["image", image_class_name(image), class_name].compact
44
- image_tag = dynamic_image_tag(image,
45
- size: size, crop: false, upscale: false)
46
- content_tag(:figure,
47
- (link ? link_to(image_tag, link) : image_tag) +
48
- image_caption(image),
49
- class: class_name)
50
- rescue ActiveRecord::RecordNotFound
51
- nil
52
- end
53
-
54
- def embed_image_size(str)
55
- if str =~ /size="(\d*x\d*)"/
56
- Regexp.last_match(1)
57
- else
58
- "2000x2000"
59
- end
60
- end
61
-
62
32
  def find_attachment(id)
63
33
  Attachment.find(id).localize(I18n.locale)
64
34
  rescue ActiveRecord::RecordNotFound
@@ -85,6 +55,10 @@ module PagesCore
85
55
  .compact
86
56
  end
87
57
 
58
+ def fix_markup(str)
59
+ Nokogiri::HTML.fragment(str).to_html
60
+ end
61
+
88
62
  def parse_attachments(string)
89
63
  string.gsub(attachment_expression).each do |str|
90
64
  PagesCore.config.attachment_embedder.new(
@@ -101,40 +75,16 @@ module PagesCore
101
75
  end
102
76
  end
103
77
 
104
- def parse_image(str)
105
- id = str.match(image_expression)[1]
106
- options = str.match(image_expression)[2]
107
- class_name = (Regexp.last_match(1) if options =~ /class="([\s\-\w]+)"/)
108
- link = (Regexp.last_match(1) if options =~ /link="([^"]+)"/)
109
- embed_image(id,
110
- size: embed_image_size(options),
111
- class_name: class_name,
112
- link: link)
113
- end
114
-
115
78
  def parse_images(string)
116
- string.gsub(image_expression).each do |str|
117
- parse_image(str)
118
- end
79
+ PagesCore::ImageEmbedder.new(string).embed
119
80
  end
120
81
 
121
- def image_caption(image)
122
- return unless image.caption?
123
- content_tag(:figcaption, image.caption)
124
- end
125
-
126
- def image_class_name(image)
127
- if image.size.x == image.size.y
128
- "square"
129
- elsif image.size.x > image.size.y
130
- "landscape"
131
- else
132
- "portrait"
82
+ def shorten(string)
83
+ unless @options[:shorten] && string.length > @options[:shorten]
84
+ return string
133
85
  end
134
- end
135
86
 
136
- def link_to(content, href)
137
- content_tag(:a, content, href: href)
87
+ "#{string[0..@options[:shorten]]}..."
138
88
  end
139
89
  end
140
90
  end