hancock_cms_pages 1.0.0 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/hancock/pages/blocksetable.rb +48 -14
  3. data/app/controllers/concerns/hancock/pages/localizeable.rb +5 -5
  4. data/app/controllers/concerns/hancock/pages/nav_menu.rb +10 -5
  5. data/app/controllers/concerns/hancock/pages/seo_pages.rb +3 -3
  6. data/app/helpers/hancock/pages/blocksets_helper.rb +26 -0
  7. data/app/helpers/hancock/pages/pages_helper.rb +11 -0
  8. data/app/models/concerns/hancock/pages/connectable.rb +1 -1
  9. data/app/views/blocks/_cached_blockset_navigation.html.slim +26 -0
  10. data/app/views/blocks/_cached_navigation.html.slim +26 -0
  11. data/app/views/blocks/_header.html.slim +9 -1
  12. data/app/views/hancock/pages/pages/show.html.slim +14 -1
  13. data/app/views/shared/_obj.html.slim +21 -25
  14. data/config/locales/hancock.pages.ru.yml +5 -0
  15. data/hancock_cms_pages.gemspec +3 -3
  16. data/lib/generators/hancock/pages/config/{install_generator.rb → config_generator.rb} +0 -0
  17. data/lib/generators/hancock/pages/config/templates/hancock_pages.erb +19 -6
  18. data/lib/generators/hancock/pages/controllers/decorators_generator.rb +24 -0
  19. data/lib/generators/hancock/pages/{migration_generator.rb → migrations/migrations_generator.rb} +3 -3
  20. data/lib/generators/hancock/pages/{templates → migrations/templates}/migration_blocks.rb +0 -0
  21. data/lib/generators/hancock/pages/{templates → migrations/templates}/migration_pages.rb +0 -0
  22. data/lib/generators/hancock/pages/models/templates/block.erb +5 -5
  23. data/lib/generators/hancock/pages/models/templates/blockset.erb +5 -5
  24. data/lib/generators/hancock/pages/models/templates/menu.erb +5 -5
  25. data/lib/generators/hancock/pages/models/templates/page.erb +7 -7
  26. data/lib/hancock/pages/admin.rb +35 -8
  27. data/lib/hancock/pages/admin/block.rb +14 -1
  28. data/lib/hancock/pages/admin/blockset.rb +34 -11
  29. data/lib/hancock/pages/admin/menu.rb +3 -1
  30. data/lib/hancock/pages/admin/page.rb +35 -5
  31. data/lib/hancock/pages/configuration.rb +28 -5
  32. data/lib/hancock/pages/controllers/pages.rb +10 -1
  33. data/lib/hancock/pages/engine.rb +59 -0
  34. data/lib/hancock/pages/models/active_record/blockset.rb +2 -1
  35. data/lib/hancock/pages/models/block.rb +234 -55
  36. data/lib/hancock/pages/models/blockset.rb +50 -38
  37. data/lib/hancock/pages/models/menu.rb +24 -15
  38. data/lib/hancock/pages/models/mongoid/block.rb +13 -0
  39. data/lib/hancock/pages/models/mongoid/blockset.rb +3 -0
  40. data/lib/hancock/pages/models/mongoid/menu.rb +4 -1
  41. data/lib/hancock/pages/models/mongoid/page.rb +19 -6
  42. data/lib/hancock/pages/models/page.rb +196 -90
  43. data/lib/hancock/pages/rails_admin_ext/hancock_connectable.rb +2 -0
  44. data/lib/hancock/pages/rails_admin_ext/menu.rb +11 -7
  45. data/lib/hancock/pages/version.rb +1 -1
  46. data/lib/hancock/pages/views_whitelist.rb +103 -0
  47. data/lib/hancock_cms_pages.rb +4 -6
  48. data/release.sh +1 -1
  49. metadata +19 -14
  50. data/app/helpers/hancock/pages/pages_helpers.rb +0 -2
@@ -9,6 +9,8 @@ module Hancock::Pages
9
9
  attr_accessor :menu_max_depth
10
10
 
11
11
  attr_accessor :seo_support
12
+ attr_accessor :cache_support
13
+ attr_accessor :insertions_support
12
14
 
13
15
  attr_accessor :localize
14
16
 
@@ -18,18 +20,39 @@ module Hancock::Pages
18
20
  attr_accessor :user_abilities_support
19
21
  attr_accessor :ra_comments_support
20
22
 
23
+ attr_accessor :renderer_lib_extends
24
+
25
+ attr_accessor :verbose_render
26
+ attr_accessor :raven_support
27
+
28
+ attr_accessor :available_layouts
29
+
21
30
  def initialize
22
31
  @menu_max_depth = 2
23
32
 
24
- @seo_support = defined? Hancock::Seo
33
+ @seo_support = !!defined? Hancock::Seo
34
+ @cache_support = !!defined?(Hancock::Cache)
35
+ @insertions_support = true
25
36
 
26
37
  @localize = Hancock.config.localize
27
38
 
28
- @breadcrumbs_on_rails_support = defined?(BreadcrumbsOnRails)
39
+ @breadcrumbs_on_rails_support = !!defined?(BreadcrumbsOnRails)
40
+
41
+ @model_settings_support = !!defined?(RailsAdminModelSettings)
42
+ @user_abilities_support = !!defined?(RailsAdminUserAbilities)
43
+ @ra_comments_support = !!defined?(RailsAdminComments)
44
+
45
+ @renderer_lib_extends = [
46
+ # ::ActionController::Base,
47
+ ::ActionView::Helpers::TagHelper,
48
+ ::ActionView::Context
49
+ ]
50
+
51
+ @verbose_render = Rails.env.development? or Rails.env.test?
52
+ @raven_support = !!(Hancock.config.respond_to?(:raven_support) ? Hancock.config.raven_support : defined?(Raven))
53
+
54
+ @available_layouts = ["application"]
29
55
 
30
- @model_settings_support = defined?(RailsAdminModelSettings)
31
- @user_abilities_support = defined?(RailsAdminUserAbilities)
32
- @ra_comments_support = defined?(RailsAdminComments)
33
56
  end
34
57
  end
35
58
  end
@@ -3,6 +3,11 @@ module Hancock::Pages
3
3
  module Pages
4
4
  extend ActiveSupport::Concern
5
5
 
6
+ included do
7
+ include ActionView::Helpers::TagHelper
8
+ include ActionView::Context
9
+ end
10
+
6
11
  def show
7
12
  if @seo_page.nil? || !@seo_page.persisted?
8
13
  if !params[:id].blank? or !params[:slug].blank?
@@ -18,6 +23,10 @@ module Hancock::Pages
18
23
  if Hancock::Pages.config.breadcrumbs_on_rails_support
19
24
  add_breadcrumb @seo_page.name, @seo_page.slug
20
25
  end
26
+
27
+ if Hancock::Pages.config.available_layouts.include?(@seo_page.layout_name)
28
+ render layout: @seo_page.layout_name
29
+ end
21
30
  end
22
31
 
23
32
  private
@@ -27,7 +36,7 @@ module Hancock::Pages
27
36
 
28
37
  def after_initialize
29
38
  end
30
-
39
+
31
40
  end
32
41
  end
33
42
  end
@@ -1,5 +1,64 @@
1
1
  module Hancock::Pages
2
2
  class Engine < ::Rails::Engine
3
3
  # isolate_namespace Hancock::Pages
4
+
5
+ # initializer "hancock_cms_pages.blocksets_settings" do
6
+ # # Write default email settings to DB so they can be changed.
7
+ #
8
+ # #temp
9
+ # begin
10
+ # if Settings and Settings.table_exists?
11
+ # Settings.hancock_pages_blocks_whitelist(default: '', kind: :text, label: 'Белый список блоков')
12
+ # Settings.hancock_pages_blocks_human_names(default: '', kind: :yaml, label: 'Имена блоков')
13
+ # end
14
+ #
15
+ # # if Settings and Settings.table_exists? and Hancock::Pages.model_settings_support
16
+ # # Hancock::Pages::Blockset.settings.blocks_whitelist(default: '', kind: :text, label: 'Белый список блоков')
17
+ # # Hancock::Pages::Blockset.settings.blocks_human_names(default: '', kind: :yaml, label: 'Имена блоков')
18
+ # #
19
+ # #
20
+ # # _setting_existed = !Hancock::Cache::Fragment.settings.getnc('detecting').nil?
21
+ # # unless _setting_existed
22
+ # # Hancock::Pages::Blockset.settings.blocks_whitelist(kind: :text, default: '', label: 'Белый список блоков')
23
+ # # Hancock::Pages::Blockset.settings.unload!
24
+ # # _setting = Hancock::Pages::Blockset.settings.getnc('blocks_whitelist')
25
+ # # if _setting
26
+ # # _setting.for_admin = true
27
+ # # _setting.perform_caching = false
28
+ # # _setting.save
29
+ # # end
30
+ # # end
31
+ # #
32
+ # #
33
+ # # _setting_existed = !Hancock::Cache::Fragment.settings.getnc('detecting').nil?
34
+ # # unless _setting_existed
35
+ # # Hancock::Pages::Blockset.settings.blocks_human_names(default: '', kind: :yaml, label: 'Имена блоков')
36
+ # # Hancock::Pages::Blockset.settings.unload!
37
+ # # _setting = Hancock::Pages::Blockset.settings.getnc('blocks_human_names')
38
+ # # if _setting
39
+ # # _setting.for_admin = true
40
+ # # _setting.perform_caching = false
41
+ # # _setting.save
42
+ # # end
43
+ # # end
44
+ # #
45
+ # # end
46
+ # rescue
47
+ # end
48
+ # end
49
+
50
+ config.after_initialize do
51
+ # Write default email settings to DB so they can be changed.
52
+ begin
53
+ if Settings and Settings.table_exists?
54
+ Settings.hancock_pages_blocks_whitelist(default: '', kind: :text, label: 'Белый список блоков') unless RailsAdminSettings::Setting.ns("main").where(key: "hancock_pages_blocks_whitelist").exists?
55
+ Settings.hancock_pages_blocks_human_names(default: '', kind: :yaml, label: 'Имена блоков') unless RailsAdminSettings::Setting.ns("main").where(key: "hancock_pages_blocks_human_names").exists?
56
+
57
+ Settings.ns('admin').hancock_pages_blocks_blacklist(default: '', kind: :text, label: 'Черный список блоков') unless RailsAdminSettings::Setting.ns("admin").where(key: "hancock_pages_blocks_blacklist").exists?
58
+ end
59
+ rescue
60
+ end
61
+ end
62
+
4
63
  end
5
64
  end
@@ -11,7 +11,8 @@ module Hancock::Pages
11
11
  translates :name
12
12
  end
13
13
 
14
- has_many :page_blocks, class_name: "Hancock::Pages::Blockset"
14
+ has_many :blocks, class_name: "Hancock::Pages::Blockset", inverse_of: :blockset
15
+ accepts_nested_attributes_for :blocks, allow_destroy: true
15
16
  end
16
17
  end
17
18
  end
@@ -6,6 +6,10 @@ module Hancock::Pages
6
6
  include Hancock::Enableable
7
7
  include ManualSlug
8
8
 
9
+ if Hancock::Pages.config.insertions_support
10
+ include Hancock::InsertionField
11
+ end
12
+
9
13
  include Hancock::Pages.orm_specific('Block')
10
14
 
11
15
  included do
@@ -21,6 +25,93 @@ module Hancock::Pages
21
25
  after_initialize do
22
26
  self.file_pathname = Pathname.new(file_path) unless file_path.nil?
23
27
  end
28
+
29
+ def can_render?
30
+ Hancock::Pages::can_render_in_block?(self.file_path)
31
+ end
32
+
33
+ if Hancock::Pages.config.insertions_support
34
+ # insertions_for(:content)
35
+ insertions_for(:content_html)
36
+ alias :block_content :page_content
37
+ alias :block_content_html :page_content_html
38
+ end
39
+ def block_content(clear_insertions = true)
40
+ if clear_insertions.is_a?(Hash)
41
+ clear_insertions = clear_insertions[:clear_insertions]
42
+ end
43
+ if @content_used.nil?
44
+ if content.nil?
45
+ @content_used = true
46
+ ''
47
+ else
48
+ # content.gsub(/\{\{(.*?)\}\}/) do
49
+ # {{"some_text"}} #temporary disabled - need tests
50
+ # _content = content.gsub(/\{\{(['"])(.*?)(\1)\}\}/) do
51
+ # $2
52
+ # end.gsub(/(\{\{(([^\.]*?)\.)?(.*?)\}\})/) do
53
+ _content = content.gsub(/(\{\{(([^\.]*?)\.)?(.*?)\}\})/) do
54
+ if $4 == "FILE" and $3.blank?
55
+ clear_insertions ? "" : $1
56
+ elsif $4 =~ /\ABS\|(.*?)\Z/ and $3.blank?
57
+ clear_insertions ? "" : $1
58
+ elsif $3 == "self" and !$4.blank?
59
+ if clear_insertions
60
+ ""
61
+ elsif Hancock::Pages.config.insertions_support
62
+ get_insertion($4)
63
+ else
64
+ $1
65
+ end
66
+ else
67
+ (Settings and !$4.blank? and $3 != "self") ? Settings.ns($3).get($4).val : "" #temp
68
+ end
69
+ end
70
+ @content_used = true
71
+ _content
72
+ end
73
+ else
74
+ ''
75
+ end
76
+ end
77
+ def block_content_html(clear_insertions = true)
78
+ if clear_insertions.is_a?(Hash)
79
+ clear_insertions = clear_insertions[:clear_insertions]
80
+ end
81
+ if @content_html_used.nil?
82
+ if content_html.nil?
83
+ @content_html_used = true
84
+ ''
85
+ else
86
+ # content.gsub(/\{\{(.*?)\}\}/) do
87
+ # {{"some_text"}} #temporary disabled - need tests
88
+ # _content_html = content_html.gsub(/\{\{(['"])(.*?)(\1)\}\}/) do
89
+ # $2
90
+ # end.gsub(/(\{\{(([^\.]*?)\.)?(.*?)\}\})/) do
91
+ _content_html = content_html.gsub(/(\{\{(([^\.]*?)\.)?(.*?)\}\})/) do
92
+ if $4 == "FILE" and $3.blank?
93
+ clear_insertions ? "" : $1
94
+ elsif $4 =~ /\ABS\|(.*?)\Z/ and $3.blank?
95
+ clear_insertions ? "" : $1
96
+ elsif $3 == "self" and !$4.blank?
97
+ if clear_insertions
98
+ ""
99
+ elsif Hancock::Pages.config.insertions_support
100
+ get_insertion($4)
101
+ else
102
+ $1
103
+ end
104
+ else
105
+ (Settings and !$4.blank? and $3 != "self") ? Settings.ns($3).get($4).val : "" #temp
106
+ end
107
+ end
108
+ @content_html_used = true
109
+ _content_html
110
+ end
111
+ else
112
+ ''
113
+ end
114
+ end
24
115
  end
25
116
 
26
117
  def file_pathname_as_partial
@@ -37,70 +128,97 @@ module Hancock::Pages
37
128
  self.file_pathname_for_fs.to_s
38
129
  end
39
130
 
40
-
41
- def has_content?
42
- @content_used.nil? && !content.blank?
43
- end
44
- def block_content(clear_insertions = true)
45
- if clear_insertions.is_a?(Hash)
46
- clear_insertions = clear_insertions[:clear_insertions]
47
- end
48
- if @content_used.nil?
49
- @content_used = true
50
- if content.nil?
51
- ''
131
+ def rails_admin_label
132
+ if !self.name.blank?
133
+ self.name
134
+ elsif self.render_file and !self.file_path.blank?
135
+ _human_name = Hancock::Pages.whitelist_human_names[self.file_path]
136
+ if _human_name.blank?
137
+ self.file_path_for_fs
52
138
  else
53
- # content.gsub(/\{\{(.*?)\}\}/) do
54
- content.gsub(/\{\{(([^\.]*?)\.)?(.*?)\}\}/) do
55
- if $3 == "FILE" and $2.blank?
56
- clear_insertions ? "" : $0
57
- else
58
- (Settings and !$3.blank?) ? Settings.ns($2).get($3).val : "" #temp
59
- end
60
- end
139
+ _human_name
61
140
  end
62
141
  else
63
- ''
142
+ self.id
64
143
  end
65
144
  end
145
+
146
+ def has_content?
147
+ @content_used.nil? && !content.blank?
148
+ end
66
149
  def has_content_html?
67
150
  @content_html_used.nil? && !content_html.blank?
68
151
  end
69
- def block_content_html(clear_insertions = true)
70
- if clear_insertions.is_a?(Hash)
71
- clear_insertions = clear_insertions[:clear_insertions]
152
+
153
+ def render_or_content_html(view = Hancock::Pages::PagesController.new, opts = {})
154
+ if view.is_a?(Hash)
155
+ view, opts = view.delete(:view) || Hancock::Pages::PagesController.new, view
72
156
  end
73
- if @content_html_used.nil?
74
- @content_html_used = true
75
- if content_html.nil?
76
- ''
77
- else
78
- # content.gsub(/\{\{(.*?)\}\}/) do
79
- content_html.gsub(/\{\{(([^\.]*?)\.)?(.*?)\}\}/) do
80
- if $3 == "FILE" and $2.blank?
81
- clear_insertions ? "" : $0
82
- else
83
- (Settings and !$3.blank?) ? Settings.ns($2).get($3).val : "" #temp
84
- end
157
+ Hancock::Pages.config.renderer_lib_extends.each do |lib_extends|
158
+ unless view.class < lib_extends
159
+ if view.respond_to?(:prepend)
160
+ view.prepend lib_extends
161
+ else
162
+ view.extend lib_extends
85
163
  end
86
164
  end
87
- else
88
- ''
89
165
  end
90
- end
91
166
 
92
- def render_or_content_html(view, opts = {})
93
- if view.is_a?(Hash)
94
- view, opts = view.delete(:view), view
95
- end
96
167
  ret = ""
168
+ hancock_env = {block: self, called_from: [{object: self, method: :render_or_content_html}]}
169
+ hancock_env[:called_from].unshift(opts.delete(:called_from)) if opts and opts[:called_from].present?
170
+ locals = {}
171
+ locals[:hancock_env] = hancock_env
172
+
97
173
  if self.render_file and !self.file_path.blank?
98
- opts.merge!(partial: self.file_path, locals: {hancock_block: self, called_from: :render})
99
- ret = view.render(opts) rescue self.content_html.html_safe
174
+ opts.merge!(partial: self.file_path, locals: locals)
175
+ # ret = view.render_to_string(opts) rescue self.content_html.html_safe
176
+ ret = begin
177
+ view.render_to_string(opts) if can_render?
178
+ rescue Exception => exception
179
+ if Hancock::Pages.config.verbose_render
180
+ Rails.logger.error exception.message
181
+ Rails.logger.error exception.backtrace.join("\n")
182
+ puts exception.message
183
+ puts exception.backtrace.join("\n")
184
+ end
185
+ Raven.capture_exception(exception) if Hancock::Pages.config.raven_support
186
+ self.content_html.html_safe
187
+ end
100
188
  else
101
- opts.merge!(partial: self.file_path, locals: {hancock_block: self, called_from: :content_html})
189
+ opts.merge!(partial: self.file_path, locals: locals)
190
+ # ret = self.block_content_html(false).gsub(/(\{\{(([^\.]*?)\.)?(.*?)\}\})/) do
102
191
  ret = self.block_content_html(false).gsub("{{FILE}}") do
103
- view.render(opts) rescue nil
192
+ # view.render(opts) rescue nil
193
+ begin
194
+ view.render(opts) if can_render?
195
+ rescue Exception => exception
196
+ if Hancock::Pages.config.verbose_render
197
+ Rails.logger.error exception.message
198
+ Rails.logger.error exception.backtrace.join("\n")
199
+ puts exception.message
200
+ puts exception.backtrace.join("\n")
201
+ end
202
+ Raven.capture_exception(exception) if Hancock::Pages.config.raven_support
203
+ nil
204
+ end
205
+ end.gsub(/\{\{BS\|(.*?)\}\}/) do
206
+ bs = Hancock::Pages::Blockset.enabled.where(name: $1).first
207
+ # view.render_blockset(bs, called_from: :render_or_content_html) rescue nil if bs
208
+ if bs
209
+ begin
210
+ view.render_blockset(bs, called_from: {object: self, method: :render_or_content_html})
211
+ rescue Exception => exception
212
+ if Hancock::Pages.config.verbose_render
213
+ Rails.logger.error exception.message
214
+ Rails.logger.error exception.backtrace.join("\n")
215
+ puts exception.message
216
+ puts exception.backtrace.join("\n")
217
+ end
218
+ Raven.capture_exception(exception) if Hancock::Pages.config.raven_support
219
+ nil
220
+ end
221
+ end
104
222
  end.html_safe
105
223
  end
106
224
  if use_wrapper
@@ -111,25 +229,86 @@ module Hancock::Pages
111
229
  ret = view.content_tag wrapper_tag, ret, _attrs
112
230
  end
113
231
  ret = yield ret if block_given?
114
- return ret
232
+ return (ret.is_a?(Array) ? ret.join.html_safe : ret)
233
+ # return ret
115
234
  end
116
235
 
117
- def render_or_content(view, opts = {})
236
+ def render_or_content(view = Hancock::Pages::PagesController.new, opts = {})
118
237
  if view.is_a?(Hash)
119
- view, opts = view.delete(:view), view
238
+ view, opts = view.delete(:view) || Hancock::Pages::PagesController.new, view
239
+ end
240
+ Hancock::Pages.config.renderer_lib_extends.each do |lib_extends|
241
+ unless view.class < lib_extends
242
+ if view.respond_to?(:prepend)
243
+ view.prepend lib_extends
244
+ else
245
+ view.extend lib_extends
246
+ end
247
+ end
120
248
  end
249
+
121
250
  ret = ""
251
+ hancock_env = {block: self, called_from: [{object: self, method: :render_or_content}]}
252
+ hancock_env[:called_from].unshift(opts.delete(:called_from)) if opts and opts[:called_from].present?
253
+ locals = {}
254
+ locals[:hancock_env] = hancock_env
255
+
122
256
  unless self.file_path.blank?
123
- opts.merge!(partial: self.file_path, locals: {hancock_block: self, called_from: :render})
124
- ret = view.render(opts) rescue self.content
257
+ opts.merge!(partial: self.file_path, locals: locals)
258
+
259
+ # ret = view.render_to_string(opts) rescue self.content
260
+ ret = begin
261
+ view.render_to_string(opts) if can_render?
262
+ rescue Exception => exception
263
+ if Hancock::Pages.config.verbose_render
264
+ Rails.logger.error exception.message
265
+ Rails.logger.error exception.backtrace.join("\n")
266
+ puts exception.message
267
+ puts exception.backtrace.join("\n")
268
+ end
269
+ Raven.capture_exception(exception) if Hancock::Pages.config.raven_support
270
+ self.content
271
+ end
272
+ # ret = view.render(opts) rescue self.content
125
273
  else
126
- opts.merge!(partial: self.file_path, locals: {hancock_block: self, called_from: :content})
274
+ opts.merge!(partial: self.file_path, locals: locals)
127
275
  ret = self.block_content(false).gsub("{{FILE}}") do
128
- view.render(opts) rescue nil
276
+ # view.render_to_string(opts) rescue nil
277
+ begin
278
+ view.render_to_string(opts) if can_render?
279
+ rescue Exception => exception
280
+ if Hancock::Pages.config.verbose_render
281
+ Rails.logger.error exception.message
282
+ Rails.logger.error exception.backtrace.join("\n")
283
+ puts exception.message
284
+ puts exception.backtrace.join("\n")
285
+ end
286
+ Raven.capture_exception(exception) if Hancock::Pages.config.raven_support
287
+ nil
288
+ end
289
+ # view.render(opts) rescue nil
290
+ end.gsub(/\{\{BS\|(.*?)\}\}/) do
291
+ bs = Hancock::Pages::Blockset.enabled.where(name: $1).first
292
+ # view.render_blockset(bs, called_from: :render_or_content) rescue nil if bs
293
+ if bs
294
+ begin
295
+ view.render_blockset(bs, called_from: {object: self, method: :render_or_content})
296
+ rescue Exception => exception
297
+ if Hancock::Pages.config.verbose_render
298
+ Rails.logger.error exception.message
299
+ Rails.logger.error exception.backtrace.join("\n")
300
+ puts exception.message
301
+ puts exception.backtrace.join("\n")
302
+ end
303
+ Raven.capture_exception(exception) if Hancock::Pages.config.raven_support
304
+ nil
305
+ end
306
+ end
129
307
  end
130
308
  end
131
309
  ret = yield ret if block_given?
132
- return ret
310
+ return (ret.is_a?(Array) ? ret.join.html_safe : ret)
311
+ # return ret
133
312
  end
134
313
 
135
314
  def file_fullpath(with_ext = false, ext = ".html.slim")