adminsite 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +12 -0
  3. data/Gemfile.lock +209 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.markdown +122 -0
  6. data/Rakefile +14 -0
  7. data/USAGE +18 -0
  8. data/VERSION +1 -0
  9. data/app/admin_configs/adminsite/adminsite_admin_user_admin_config.rb +43 -0
  10. data/app/admin_configs/adminsite/adminsite_file_asset_admin_config.rb +32 -0
  11. data/app/admin_configs/adminsite/adminsite_page_admin_config.rb +46 -0
  12. data/app/admin_configs/adminsite/adminsite_page_layout_admin_config.rb +31 -0
  13. data/app/assets/images/adminsite/admin/accept.png +0 -0
  14. data/app/assets/images/adminsite/admin/add.png +0 -0
  15. data/app/assets/images/adminsite/admin/arrow_left.png +0 -0
  16. data/app/assets/images/adminsite/admin/arrow_refresh.png +0 -0
  17. data/app/assets/images/adminsite/admin/arrow_up.png +0 -0
  18. data/app/assets/images/adminsite/admin/cross.png +0 -0
  19. data/app/assets/images/adminsite/admin/logo.gif +0 -0
  20. data/app/assets/images/adminsite/admin/logo.png +0 -0
  21. data/app/assets/images/adminsite/admin/magnifier.png +0 -0
  22. data/app/assets/images/adminsite/admin/newspaper_add.png +0 -0
  23. data/app/assets/images/adminsite/admin/newspaper_delete.png +0 -0
  24. data/app/assets/images/adminsite/admin/openid-icon-small.gif +0 -0
  25. data/app/assets/images/adminsite/admin/page_white_magnify.png +0 -0
  26. data/app/assets/images/adminsite/admin/pencil.png +0 -0
  27. data/app/assets/images/adminsite/admin/rails.png +0 -0
  28. data/app/assets/images/adminsite/admin/reorder.gif +0 -0
  29. data/app/assets/images/adminsite/admin/spinner.gif +0 -0
  30. data/app/assets/javascripts/adminsite/admin.js +13 -0
  31. data/app/assets/javascripts/adminsite/admin/code_editor.js.coffee +40 -0
  32. data/app/assets/javascripts/adminsite/admin/hide_and_show.js +26 -0
  33. data/app/assets/stylesheets/adminsite/admin.scss +16 -0
  34. data/app/assets/stylesheets/adminsite/admin/base.scss +521 -0
  35. data/app/assets/stylesheets/adminsite/admin/code_editor.scss +29 -0
  36. data/app/assets/stylesheets/adminsite/admin/pagination.scss +28 -0
  37. data/app/controllers/adminsite/admin/adminsite_admin_users_controller.rb +21 -0
  38. data/app/controllers/adminsite/admin/adminsite_file_assets_controller.rb +57 -0
  39. data/app/controllers/adminsite/admin/adminsite_page_layouts_controller.rb +41 -0
  40. data/app/controllers/adminsite/admin/adminsite_pages_controller.rb +40 -0
  41. data/app/controllers/adminsite/admin/base_controller.rb +16 -0
  42. data/app/controllers/adminsite/admin/crud_controller.rb +27 -0
  43. data/app/controllers/adminsite/admin/iframe_controller.rb +28 -0
  44. data/app/controllers/adminsite/admin/resources_controller.rb +148 -0
  45. data/app/controllers/adminsite/admin_application_controller.rb +9 -0
  46. data/app/controllers/adminsite/admin_user_sessions_controller.rb +5 -0
  47. data/app/controllers/adminsite/contents_controller.rb +88 -0
  48. data/app/helpers/admin/adminsite_application_helper.rb +174 -0
  49. data/app/helpers/admin_application_helper.rb +3 -0
  50. data/app/models/adminsite/admin_config/base.rb +100 -0
  51. data/app/models/adminsite/admin_user.rb +10 -0
  52. data/app/models/adminsite/file_asset.rb +22 -0
  53. data/app/models/adminsite/page.rb +59 -0
  54. data/app/models/adminsite/page_layout.rb +9 -0
  55. data/app/views/adminsite/admin/adminsite_file_assets/index.html.haml +39 -0
  56. data/app/views/adminsite/admin/adminsite_page_layouts/edit.html.haml +5 -0
  57. data/app/views/adminsite/admin/adminsite_page_layouts/index.html.haml +9 -0
  58. data/app/views/adminsite/admin/adminsite_page_layouts/new.html.haml +5 -0
  59. data/app/views/adminsite/admin/adminsite_pages/edit.html.haml +5 -0
  60. data/app/views/adminsite/admin/adminsite_pages/index.html.haml +16 -0
  61. data/app/views/adminsite/admin/adminsite_pages/new.html.haml +5 -0
  62. data/app/views/adminsite/admin/crud/index.html.haml +4 -0
  63. data/app/views/adminsite/admin/crud/show.html.haml +15 -0
  64. data/app/views/adminsite/admin/iframe/index.haml +14 -0
  65. data/app/views/adminsite/admin/resources/_form.haml +6 -0
  66. data/app/views/adminsite/admin/resources/_list.haml +18 -0
  67. data/app/views/adminsite/admin/resources/_search_form.html.haml +41 -0
  68. data/app/views/adminsite/admin/resources/edit.haml +13 -0
  69. data/app/views/adminsite/admin/resources/index.haml +13 -0
  70. data/app/views/adminsite/admin/resources/new.haml +14 -0
  71. data/app/views/adminsite/admin/resources/show.haml +15 -0
  72. data/app/views/adminsite/admin/shared/_admin_menu.html.haml +6 -0
  73. data/app/views/adminsite/admin/shared/_content_menu.html.haml +4 -0
  74. data/app/views/adminsite/admin/shared/_page_assets_list.html.haml +6 -0
  75. data/app/views/adminsite/admin/shared/_syntax_help.html.haml +24 -0
  76. data/app/views/adminsite/admin_user_sessions/new.html.haml +14 -0
  77. data/app/views/layouts/adminsite/admin.html.haml +31 -0
  78. data/config/initializers/adminsite_constants.rb +2 -0
  79. data/config/initializers/assets.rb +7 -0
  80. data/config/initializers/devise.rb +265 -0
  81. data/config/initializers/filter_parameter_logging.rb +4 -0
  82. data/config/initializers/paperclip.rb +15 -0
  83. data/config/initializers/time_formats.rb +1 -0
  84. data/config/locales/da.devise.yaml +57 -0
  85. data/config/locales/da.yaml +199 -0
  86. data/config/locales/en.devise.yaml +60 -0
  87. data/config/locales/en.yaml +205 -0
  88. data/config/routes.rb +17 -0
  89. data/db/migrate/20101007000000_create_admin.rb +59 -0
  90. data/db/migrate/20101007000001_create_cms_tables.rb +39 -0
  91. data/lib/adminsite.rb +28 -0
  92. data/lib/adminsite/configuration.rb +15 -0
  93. data/lib/adminsite/engine.rb +30 -0
  94. data/lib/adminsite/liquid/tags/asset.rb +70 -0
  95. data/lib/adminsite/version.rb +3 -0
  96. data/lib/generators/adminsite/add_dashboard/add_dashboard_generator.rb +34 -0
  97. data/lib/generators/adminsite/add_dashboard/templates/controllers/admin_dashboard_controller.rb +13 -0
  98. data/lib/generators/adminsite/add_dashboard/templates/views/index.html.haml +6 -0
  99. data/lib/generators/adminsite/add_iframe/add_iframe_generator.rb +42 -0
  100. data/lib/generators/adminsite/add_iframe/templates/controllers/admin_iframe_controller.rb +16 -0
  101. data/lib/generators/adminsite/add_resource/USAGE +0 -0
  102. data/lib/generators/adminsite/add_resource/add_resource_generator.rb +40 -0
  103. data/lib/generators/adminsite/add_resource/templates/admin_configs/resource_admin_config.rb +47 -0
  104. data/lib/generators/adminsite/add_resource/templates/controllers/admin_resource_controller.rb +19 -0
  105. data/lib/generators/adminsite/install/USAGE +13 -0
  106. data/lib/generators/adminsite/install/install_generator.rb +51 -0
  107. data/lib/generators/adminsite/install/templates/assets/adminsite.js +17 -0
  108. data/lib/generators/adminsite/install/templates/assets/adminsite.scss +14 -0
  109. data/lib/generators/adminsite/install/templates/config/locales/adminsite.da.yml +4 -0
  110. data/lib/generators/adminsite/install/templates/config/locales/adminsite.en.yml +6 -0
  111. data/lib/generators/adminsite/install/templates/recipes/application.rb +18 -0
  112. data/lib/generators/adminsite/install/templates/views/_admin_menu.html.haml +8 -0
  113. data/lib/recipes/adminsite.rb +82 -0
  114. data/lib/tasks/adminsite.rake +147 -0
  115. metadata +384 -0
@@ -0,0 +1,9 @@
1
+ # Filters added to this controller apply to all controllers in the application.
2
+ # Likewise, all the methods added will be available for all controllers.
3
+
4
+ class Adminsite::AdminApplicationController < ActionController::Base
5
+ helper :all, "admin/adminsite_application"
6
+ layout 'adminsite/admin'
7
+ before_filter :authenticate_adminsite_admin_user!
8
+
9
+ end
@@ -0,0 +1,5 @@
1
+ class Adminsite::AdminUserSessionsController < Devise::SessionsController
2
+ skip_filter :verify_authenticity_token, only: [:destroy]
3
+
4
+ layout 'adminsite/admin'
5
+ end
@@ -0,0 +1,88 @@
1
+ class Adminsite::ContentsController < ApplicationController
2
+ include ActionController::Caching::Pages
3
+ self.page_cache_directory = Adminsite::Engine.config.action_controller.page_cache_directory
4
+
5
+ before_filter :set_p3p
6
+
7
+ def show
8
+ retrive_page_or_404(params[:page_url], params[:id], params[:format])
9
+ end
10
+
11
+ def render_404(format = params[:format])
12
+ page = find_page_by_url('404', format)
13
+ if page.nil?
14
+ render :file => Rails.root.join('public', '404.html'), :status => 404, layout: nil
15
+ else
16
+ render :text => page.render(liquid_attributes), :status => 404 and return
17
+ end
18
+ end
19
+
20
+ class << self
21
+
22
+ def fallback_format
23
+ 'html'
24
+ end
25
+
26
+ def find_page_by_url(url, format)
27
+ page = nil
28
+ urls = ["#{url}.#{format || fallback_format}" ]
29
+ urls.unshift(url) if format.nil?
30
+ urls.push(url) if format == 'html'
31
+ urls.each do |full_url|
32
+ page ||= Adminsite::Page.find_by_url(full_url)
33
+ end
34
+ page
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def find_page_by_url(url, format)
41
+ self.class.find_page_by_url(url, format)
42
+ end
43
+
44
+ def set_p3p
45
+ response.headers['P3P'] = 'CP="CAO PSA OUR"'
46
+ end
47
+
48
+ def content_params
49
+ { :authenticity_token => form_authenticity_token,
50
+ :authenticity_param => request_forgery_protection_token,
51
+ :notice => flash[:notice],
52
+ :error => flash[:error]
53
+ }
54
+ end
55
+
56
+ def liquid_attributes
57
+ return @liquid_attributes if @liquid_attributes.present?
58
+
59
+ @liquid_attributes = {}
60
+ if defined?(liquid_params)
61
+ @liquid_attributes = content_params.merge(liquid_params)
62
+ else
63
+ @liquid_attributes = content_params
64
+ Rails.logger.warn("Please define liquid_params in your application controller")
65
+ end
66
+ Rails.logger.debug("Content params: #{@liquid_attributes.inspect}")
67
+ @liquid_attributes
68
+ end
69
+
70
+ def retrive_page_or_404(url, id, format)
71
+ page = find_page_by_url(url, format)
72
+ unless page.nil?
73
+ return if page.requires_login && !authenticate_content_user
74
+
75
+ render :text => page.render(liquid_attributes)
76
+ if page.cacheable?
77
+ cache_page
78
+ logger.info("Caching page: #{page.url}")
79
+ else
80
+ logger.info("Not caching page: #{page.url}")
81
+ end
82
+ return
83
+ else
84
+ render_404(format)
85
+ end
86
+ end
87
+
88
+ end
@@ -0,0 +1,174 @@
1
+ module Admin::AdminsiteApplicationHelper
2
+
3
+ def column_of_attr(search_attr)
4
+ return if search_attr.blank?
5
+ resource_class.columns.each{|c| return c if c.name == search_attr.to_s.downcase }
6
+ nil
7
+ end
8
+
9
+ def input_type_of_column(column)
10
+ case
11
+ when column.sql_type.match(/\Acharacter varying/)
12
+ return :string
13
+ when column.sql_type.match(/\Atimestamp/)
14
+ return :date
15
+ when column.sql_type.match(/\integer/)
16
+ return :number
17
+ else
18
+ column.sql_type.try(:to_sym)
19
+ end
20
+ end
21
+
22
+ def ransack_predicate_input_type(input_type)
23
+ case input_type
24
+ when :boolean
25
+ return [:eq]
26
+ when :text
27
+ return [:eq, :cont]
28
+ when :string
29
+ return [:eq, :cont]
30
+ when :date
31
+ return [:lteq, :gteq]
32
+ when :number
33
+ return [:eq, :lteq, :gteq]
34
+ else
35
+ [:eq]
36
+ end
37
+ end
38
+
39
+ def format_response_value(value)
40
+ value = value.url if defined?(PictureUploader) && value.is_a?(PictureUploader)
41
+ response = '<td>'
42
+ if is_url?(value)
43
+ response += link_to(value,value, target: :blank)
44
+ response += "<br/>#{image_tag(value)}" if is_image?(value)
45
+ else
46
+ response += h value
47
+ end
48
+ response + '</td>'
49
+ end
50
+
51
+ def is_url?(value)
52
+ value.is_a?(String) && value.match(/\A[\/]|\Ahttp[s]*:/)
53
+ end
54
+
55
+ def image_extensions
56
+ %w(.png .gif .jpg .tif)
57
+ end
58
+
59
+ def is_image?(path)
60
+ image_extensions.include?( File.extname(path).split('?').first.try(:downcase) )
61
+ end
62
+
63
+ def error_messages_for(obj)
64
+ return if obj.errors.blank?
65
+ msgs = obj.errors.full_messages.collect{|msg| "<li>#{ h msg }</li>" }
66
+ raw ['<ul>', msgs, '</ul>'].flatten.join
67
+ end
68
+
69
+ def recognize_path(path)
70
+ return {} if path.try(:strip).blank?
71
+ begin
72
+ return Adminsite::Engine.routes.recognize_path(path) # '/admin/profiles'
73
+ return Rails.application.routes.recognize_path(path)
74
+ rescue Exception => e
75
+ end
76
+ end
77
+
78
+ def current_admin_menu
79
+ @current_admin_menu ||= params[:admin_menu]
80
+ end
81
+
82
+ def menu_item(label, url, child_controller_names = [], klasses = nil, method = nil, admin_menu = label)
83
+ link = link_to(label, "#{url}?admin_menu=#{admin_menu}", method: method, )
84
+ result = raw "<li class='#{html_classes(url, nil, klasses, admin_menu, label )}'>#{link}</li>"
85
+
86
+ if current_url?(url, label) || ( child_controller_active?(child_controller_names) && current_admin_menu == admin_menu)
87
+ child_controller_names.each do |child_controller_name|
88
+ child_menu = content_menu_item(child_controller_name, admin_menu, nil, nil )
89
+ content_for(:content_menu, child_menu)
90
+ end
91
+ end
92
+ result
93
+ end
94
+
95
+ def content_menu_label(url, controller_name)
96
+ menu_controller = recognize_path(url)[:controller]
97
+ return controller_name.titlecase if menu_controller.blank?
98
+ eval("#{menu_controller}_controller".classify).content_menu_label
99
+ end
100
+
101
+ def content_menu_item(controller_name, admin_menu, klasses, method )
102
+ if controller_name != controller_name.pluralize
103
+ url = eval("admin_#{controller_name}_index_path")
104
+ else
105
+ url = eval("admin_#{controller_name}_path")
106
+ end
107
+ link = link_to(content_menu_label(url, controller_name), "#{url}?admin_menu=#{admin_menu}", method: method, )
108
+ raw "<li class='#{html_classes(url, controller_name, klasses, admin_menu )}'>#{link}</li>"
109
+ end
110
+
111
+ def current_url?(url, label = '')
112
+ if label.present?
113
+ return request.fullpath == "#{url}?admin_menu=#{label}"
114
+ else
115
+ return request.fullpath == url
116
+ end
117
+ end
118
+
119
+ def child_controller_active?(child_controller_names)
120
+ child_controller_names.include?(controller.controller_name)
121
+ end
122
+
123
+ def html_classes(url, controller_name, klasses = nil, admin_menu = '', label = '')
124
+ result = []
125
+ result |= [klasses].flatten if klasses.present?
126
+ result |= ['current'] if current_url?(url, admin_menu)
127
+ result |= ['active'] if current_admin_menu == label || controller_name == controller.controller_name
128
+ result.join(' ')
129
+ end
130
+
131
+ def label_resource
132
+ @resource.send(resource_admin_config.label_attribute)
133
+ end
134
+
135
+ def label_resource_class
136
+ resource_class.name.underscore.gsub('_', ' ')
137
+ end
138
+
139
+ def label_resource_class_plural
140
+ label_resource_class.pluralize
141
+ end
142
+
143
+ def link_to_back(text, path = admin_resource_path)
144
+ link_to text, path, :class => 'back'
145
+ end
146
+
147
+ def link_to_new(text, path = admin_resource_path(nil, :new) )
148
+ link_to text, path, :class => 'add'
149
+ end
150
+
151
+ def link_to_show(resource)
152
+ link_to image_tag('adminsite/admin/magnifier.png', :size => '16x16'), admin_resource_path(resource.id), target: :blank
153
+ end
154
+
155
+ def link_to_edit(resource)
156
+ link_to image_tag('adminsite/admin/pencil.png', :size => '16x16'), admin_resource_path(resource.id, :edit)
157
+ end
158
+
159
+ def link_to_destroy(resource)
160
+ link_to image_tag('adminsite/admin/cross.png', :size => '16x16'), admin_resource_path(resource.id), :confirm => 'Are you sure?', :method => :delete
161
+ end
162
+
163
+ def display_resource_value(resource, attr)
164
+ value = nil
165
+ attr.to_s.split('.').each{|a| value = (value || resource).send(a) }
166
+ value = display_referenced_resource(value) if value.is_a?(ActiveRecord::Base)
167
+ format_response_value(value).html_safe
168
+ end
169
+
170
+ def display_referenced_resource(resource)
171
+ link_to resource.title, send("edit_admin_#{resource.class.name.underscore.gsub('/','_')}_path", resource.id, admin_menu: params[:admin_menu])
172
+ end
173
+
174
+ end
@@ -0,0 +1,3 @@
1
+ # Methods added to this helper will be available to all templates in the application.
2
+ module AdminApplicationHelper
3
+ end
@@ -0,0 +1,100 @@
1
+ module Adminsite
2
+ module AdminConfig
3
+ class Base #
4
+
5
+ @@admin_configs = {}
6
+
7
+ class << self
8
+
9
+ def admin_default_config_class(class_name)
10
+ config_class = 'Adminsite::AdminConfig::Base'
11
+ return config_class if class_name.blank?
12
+
13
+ config_class_name = class_name.to_s.gsub('::','')
14
+ begin
15
+ # Test if "Adminsite::AdminConfig::#{config_class_name.gsub('::','')}" is defined
16
+ config_class = "Adminsite::#{config_class_name}AdminConfig"
17
+ eval(config_class)
18
+ rescue NameError, LoadError => e
19
+ puts("AdminConfig for #{config_class_name} not found. Use fallback: #{config_class}")
20
+ Rails.logger.warn("AdminConfig for #{config_class_name} not found. Use fallback: #{config_class}")
21
+ end
22
+ config_class
23
+ end
24
+
25
+ def admin_config_of_class(class_name, admin_config_class = nil)
26
+ admin_config_class ||= @@admin_configs[class_name.to_s]
27
+ if admin_config_class.blank?
28
+ admin_config_class = admin_default_config_class(class_name.to_s)
29
+ register_admin_configs(class_name.to_s, admin_config_class)
30
+ end
31
+ eval(admin_config_class).new(class_name)
32
+ end
33
+
34
+ def register_admin_configs(class_name, admin_config, override = true)
35
+ if override
36
+ @@admin_configs[class_name] = admin_config
37
+ else
38
+ @@admin_configs[class_name] ||= admin_config
39
+ end
40
+ end
41
+
42
+ def all_registered_admin_configs
43
+ @@admin_configs
44
+ end
45
+ end
46
+
47
+ attr_reader :resource_class
48
+
49
+ def ignore_columns
50
+ ['created_at', 'updated_at', 'id']
51
+ end
52
+
53
+ def column_names
54
+ @column_names ||= resource_class.column_names
55
+ end
56
+
57
+ def attributes_index
58
+ column_names
59
+ end
60
+
61
+ def attributes_edit
62
+ @attributes_edit ||= (column_names - ignore_columns)
63
+ end
64
+
65
+ def attributes_show
66
+ attributes_edit
67
+ end
68
+
69
+ def attributes_search
70
+ attributes_index
71
+ end
72
+
73
+ def default_member_actions
74
+ [ :show,
75
+ :edit,
76
+ :destroy]
77
+ end
78
+
79
+ def actions_index
80
+ [ :new ]
81
+ end
82
+
83
+ def label_attribute
84
+ :title
85
+ end
86
+
87
+ def scopes
88
+ [:all]
89
+ end
90
+
91
+ protected
92
+
93
+ def initialize(resource_class)
94
+ require Adminsite::Engine.root.join("app/models/#{resource_class.name.underscore}") unless defined?(resource_class)
95
+ @resource_class = resource_class
96
+ end
97
+
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,10 @@
1
+ module Adminsite
2
+ class AdminUser < ActiveRecord::Base
3
+ # Include default devise modules. Others available are:
4
+ # :token_authenticatable, :confirmable, :lockable and :timeoutable
5
+ devise :database_authenticatable, :registerable,
6
+ :recoverable, :rememberable, :trackable, :validatable
7
+
8
+ end
9
+
10
+ end
@@ -0,0 +1,22 @@
1
+ module Adminsite
2
+ class FileAsset < ActiveRecord::Base
3
+
4
+ has_attached_file :attachment
5
+
6
+ validates_with AttachmentPresenceValidator, :attributes => :attachment
7
+ validates_with AttachmentSizeValidator, :attributes => :attachment, :less_than => 2.megabytes
8
+ validates_attachment :attachment, content_type: { content_type: /\A.*\Z/ }
9
+ # do_not_validate_attachment_file_type :image
10
+
11
+ class << self
12
+ def attachment_url_for(name)
13
+ asset = find_by_attachment_file_name(name)
14
+ if asset.nil?
15
+ "http://missing.jpg?#{name}"
16
+ else
17
+ asset.attachment.url(:original, false)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,59 @@
1
+ class Adminsite::Page < ActiveRecord::Base
2
+ belongs_to :page_layout
3
+ validates_presence_of :title
4
+ validates_presence_of :page_layout
5
+ validates_presence_of :url
6
+
7
+ class << self
8
+
9
+ def cleanup_all_cached
10
+ Adminsite::Page.all.each do |p|
11
+ p.cleanup_cached
12
+ end
13
+ logger.info("Page cache has been wiped out: deleted all cached pages.")
14
+ end
15
+
16
+ def cacheable
17
+ where(cacheable: true)
18
+ end
19
+
20
+ def requires_login
21
+ where(requires_login: true)
22
+ end
23
+
24
+ end
25
+
26
+ def cache_dir
27
+ @cache_dir ||= Adminsite::ContentsController.page_cache_directory # Adminsite::Engine.config.action_controller.page_cache_directory
28
+ end
29
+
30
+ def cleanup_cached
31
+ return if self.url.blank?
32
+ logger.info("Removing cached page for: #{self.url}")
33
+ cache_file_path = "#{cache_dir}/#{self.url}"
34
+ if !remove_cache_file(cache_file_path)
35
+ remove_cache_file("#{cache_file_path}.html")
36
+ end
37
+ end
38
+
39
+ def remove_cache_file(file_path)
40
+ if File.exist?(file_path)
41
+ logger.info("Removing cached page at: #{file_path}")
42
+ FileUtils.rm(file_path)
43
+ true
44
+ end
45
+ end
46
+
47
+ def render(args)
48
+ page_layout.render(layout_args(args))
49
+ end
50
+
51
+ def layout_args(args)
52
+ args.stringify_keys.merge(:content_for_template => content_for_template(args))
53
+ end
54
+
55
+ def content_for_template(liquid_params)
56
+ liquid_template = Liquid::Template.parse(body)
57
+ liquid_template.render(liquid_params.stringify_keys)
58
+ end
59
+ end