merbiful-release 0.0.1

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 (49) hide show
  1. data/Rakefile +44 -0
  2. data/lib/merbiful-release/admin.rb +281 -0
  3. data/lib/merbiful-release/admin.rb~ +12 -0
  4. data/lib/merbiful-release/body.rb +36 -0
  5. data/lib/merbiful-release/body.rb~ +15 -0
  6. data/lib/merbiful-release/controller.rb +55 -0
  7. data/lib/merbiful-release/controller.rb~ +12 -0
  8. data/lib/merbiful-release/css.rb +70 -0
  9. data/lib/merbiful-release/css.rb~ +62 -0
  10. data/lib/merbiful-release/erubis.rb +13 -0
  11. data/lib/merbiful-release/erubis.rb~ +11 -0
  12. data/lib/merbiful-release/eruby.rb~ +11 -0
  13. data/lib/merbiful-release/filters.rb +22 -0
  14. data/lib/merbiful-release/haml.rb +23 -0
  15. data/lib/merbiful-release/haml.rb~ +11 -0
  16. data/lib/merbiful-release/images.rb +28 -0
  17. data/lib/merbiful-release/js.rb +69 -0
  18. data/lib/merbiful-release/js.rb~ +62 -0
  19. data/lib/merbiful-release/layout.rb +49 -0
  20. data/lib/merbiful-release/layout.rb~ +21 -0
  21. data/lib/merbiful-release/merbiful.rb~ +8 -0
  22. data/lib/merbiful-release/page.rb +98 -0
  23. data/lib/merbiful-release/page.rb~ +57 -0
  24. data/lib/merbiful-release/relative_time.rb +116 -0
  25. data/lib/merbiful-release/relative_time.rb~ +78 -0
  26. data/lib/merbiful-release/routes.rb +42 -0
  27. data/lib/merbiful-release/routes.rb~ +4 -0
  28. data/lib/merbiful-release/version.rb~ +45 -0
  29. data/lib/merbiful-release.rb +29 -0
  30. data/lib/merbiful-release.rb~ +2 -0
  31. data/templates/admin.css +17 -0
  32. data/templates/admin.css~ +3 -0
  33. data/templates/admin_layout.html.haml +11 -0
  34. data/templates/admin_layout.html.haml~ +9 -0
  35. data/templates/admin_layout.html.rhtml~ +10 -0
  36. data/templates/css.html.haml +29 -0
  37. data/templates/css.html.haml.orig +28 -0
  38. data/templates/css.html.haml~ +29 -0
  39. data/templates/images.html.haml +17 -0
  40. data/templates/index.html.haml +2 -0
  41. data/templates/index.html.haml~ +2 -0
  42. data/templates/js.html.haml +26 -0
  43. data/templates/js.html.haml~ +29 -0
  44. data/templates/layouts.html.haml +23 -0
  45. data/templates/layouts.html.haml~ +0 -0
  46. data/templates/page_form.html.haml +41 -0
  47. data/templates/page_form.html.haml~ +1 -0
  48. data/templates/pages.html.haml~ +3 -0
  49. metadata +120 -0
data/Rakefile ADDED
@@ -0,0 +1,44 @@
1
+ require 'rubygems'
2
+ require 'rake/gempackagetask'
3
+ require 'spec'
4
+ require 'spec/rake/spectask'
5
+ require 'pathname'
6
+
7
+ PLUGIN = "merbiful-release"
8
+ NAME = "merbiful-release"
9
+ GEM_VERSION = "0.0.1"
10
+ AUTHOR = "Martin Kihlgren"
11
+ EMAIL = "martin@wemind.se"
12
+ HOMEPAGE = ""
13
+ SUMMARY = "Merb plugin that provides a simple CMS"
14
+
15
+ spec = Gem::Specification.new do |s|
16
+ s.name = NAME
17
+ s.version = GEM_VERSION
18
+ s.platform = Gem::Platform::RUBY
19
+ s.has_rdoc = true
20
+ s.summary = SUMMARY
21
+ s.description = s.summary
22
+ s.author = AUTHOR
23
+ s.email = EMAIL
24
+ s.homepage = HOMEPAGE
25
+ s.add_dependency('merb-core', '>= 0.9.5')
26
+ s.add_dependency('dm-core', '>= 0.9.5')
27
+ s.require_path = 'lib'
28
+ s.autorequire = PLUGIN
29
+ s.files = %w(Rakefile) + Dir.glob("{lib,specs,templates}/**/*")
30
+ end
31
+
32
+ Rake::GemPackageTask.new(spec) do |pkg|
33
+ pkg.gem_spec = spec
34
+ end
35
+
36
+ task :install => [:package] do
37
+ sh %{sudo gem install pkg/#{NAME}-#{GEM_VERSION} --no-update-sources --no-update-sources}
38
+ end
39
+
40
+ desc "Run specifications"
41
+ Spec::Rake::SpecTask.new('spec') do |t|
42
+ t.spec_opts = ["--format", "specdoc", "--colour"]
43
+ t.spec_files = Pathname.glob(Pathname.new(__FILE__).parent.join("spec").join("**").join("*_spec.rb"))
44
+ end
@@ -0,0 +1,281 @@
1
+
2
+ module Merbiful
3
+
4
+ class Admin < Merb::Controller
5
+
6
+ include RelativeTimeHelpers
7
+
8
+ def index
9
+ render_template_with_layout("index.html.haml")
10
+ end
11
+
12
+ def layouts
13
+ @form_layout = Layout.get(params[:layout_id])
14
+ if request.post?
15
+ @form_layout.update_attributes(params[:layout])
16
+ if @form_layout.valid?
17
+ @form_layout.save
18
+ @form_version = Layout::Version.new(params[:version].merge(:layout => @form_layout))
19
+ if @form_version.valid?
20
+ @form_version.save
21
+ redirect url(:merbiful_admin, :action => "layouts", :layout_id => @form_layout.id)
22
+ end
23
+ end
24
+ else
25
+ @form_version = @form_layout.latest if @form_layout
26
+ end
27
+ render_template_with_layout("layouts.html.haml")
28
+ end
29
+
30
+ def js
31
+ @form_js = Js.get(params[:js_id])
32
+ if request.post?
33
+ params[:js][:cached] = !!params[:js][:cached]
34
+ @form_js.update_attributes(params[:js])
35
+ if @form_js.valid?
36
+ @form_js.save
37
+ @form_version = Js::Version.new(params[:version].merge(:js => @form_js))
38
+ if @form_version.valid?
39
+ @form_version.save
40
+ redirect url(:merbiful_admin, :action => "js", :js_id => @form_js.id)
41
+ end
42
+ end
43
+ else
44
+ @form_version = @form_layout.latest if @form_layout
45
+ end
46
+ render_template_with_layout("js.html.haml")
47
+ end
48
+
49
+ def images
50
+ if request.post?
51
+ end
52
+ render_template_with_layout("images.html.haml")
53
+ end
54
+
55
+ def css
56
+ @form_css = Css.get(params[:css_id])
57
+ if request.post?
58
+ params[:css][:cached] = !!params[:css][:cached]
59
+ @form_css.update_attributes(params[:css])
60
+ if @form_css.valid?
61
+ @form_css.save
62
+ @form_version = Css::Version.new(params[:version].merge(:css => @form_css))
63
+ if @form_version.valid?
64
+ @form_version.save
65
+ redirect url(:merbiful_admin, :action => "css", :css_id => @form_css.id)
66
+ end
67
+ end
68
+ else
69
+ @form_version = @form_layout.latest if @form_layout
70
+ end
71
+ render_template_with_layout("css.html.haml")
72
+ end
73
+
74
+ def pages
75
+ if Page.count == 0
76
+ new_root = Page.create(:path => "/")
77
+ new_root_version = Page::Version.create(:page => new_root, :body => "Here be Dagon")
78
+ end
79
+ @form_page = Page.get(params[:page_id])
80
+ if request.post?
81
+ params[:page][:cached] = !!params[:page][:cached]
82
+ @form_page.update_attributes(params[:page])
83
+ if @form_page.valid?
84
+ @form_page.save
85
+ version_csses = params[:version].delete(:css)
86
+ version_jses = params[:version].delete(:js)
87
+ @form_version = Page::Version.new(params[:version].merge(:page => @form_page))
88
+ version_csses.each do |css|
89
+ @form_version.add_css(Css.get(css))
90
+ end if version_csses
91
+ version_jses.each do |js|
92
+ @form_version.add_js(Js.get(js))
93
+ end if version_jses
94
+ if @form_version.valid?
95
+ @form_version.save
96
+ redirect url(:merbiful_admin, :action => "pages", :page_id => @form_page.id)
97
+ end
98
+ end
99
+ else
100
+ @form_version = @form_page.latest if @form_page
101
+ end
102
+ render_with_layout(Page.all(:parent_id => nil).collect do |page|
103
+ "<ul class='root'>\n#{render_page(page)}\n</ul>"
104
+ end.join("\n"))
105
+ end
106
+
107
+ def render_css
108
+ read_template("admin.css")
109
+ end
110
+
111
+ def destroy_page
112
+ page = Page.get(params[:page_id])
113
+ page.versions.each do |version|
114
+ version.css_nesses.destroy!
115
+ version.js_nesses.destroy!
116
+ version.destroy
117
+ end
118
+ page.destroy
119
+ redirect url(:merbiful_admin, :action => "pages")
120
+ end
121
+
122
+ def upload_image
123
+ path = Pathname.new(File.join(Merb.root, "public", "images", File.basename(params[:image][:filename])))
124
+ Pathname.new(params[:image][:tempfile].path).rename(path)
125
+ redirect url(:merbiful_admin, :action => "images")
126
+ end
127
+
128
+ def delete_image
129
+ path = Pathname.new(File.join(Merb.root, "public", params[:path])).expand_path
130
+ raise "H4xx0r" unless path.to_s.index(Pathname.new(Merb.root).expand_path.to_s) == 0
131
+ path.unlink
132
+ redirect url(:merbiful_admin, :action => "images")
133
+ end
134
+
135
+ def destroy_layout
136
+ layout = Layout.get(params[:layout_id])
137
+ layout.page_versions.each do |page_version|
138
+ page_version.layout = nil
139
+ page_version.save
140
+ end
141
+ layout.layout_versions.destroy!
142
+ layout.destroy
143
+ redirect url(:merbiful_admin, :action => "layouts")
144
+ end
145
+
146
+ def destroy_css
147
+ css = Css.get(params[:css_id])
148
+ css.css_nesses.destroy!
149
+ css.css_versions.destroy!
150
+ css.destroy
151
+ redirect url(:merbiful_admin, :action => "css")
152
+ end
153
+
154
+ def destroy_js
155
+ js = Js.get(params[:js_id])
156
+ js.js_nesses.destroy!
157
+ js.js_versions.destroy!
158
+ js.destroy
159
+ redirect url(:merbiful_admin, :action => "js")
160
+ end
161
+
162
+ def create_page
163
+ parent = Page.get(params[:parent_id])
164
+ new_page = Page.create(:parent => parent, :path => next_path(parent.path))
165
+ new_page_version = Page::Version.create(:page => new_page)
166
+ redirect url(:merbiful_admin, :action => "pages", :page_id => new_page.id)
167
+ end
168
+
169
+ def create_css
170
+ new_css = Css.create(:name => next_name(Css))
171
+ new_css_version = Css::Version.create(:css => new_css)
172
+ redirect url(:merbiful_admin, :action => 'css')
173
+ end
174
+
175
+ def create_js
176
+ new_js = Js.create(:name => next_name(Js))
177
+ new_js_version = Js::Version.create(:js => new_js)
178
+ redirect url(:merbiful_admin, :action => 'js')
179
+ end
180
+
181
+ def create_layout
182
+ new_layout = Layout.create(:name => next_name(Layout))
183
+ new_layout_version = Layout::Version.create(:layout => new_layout)
184
+ redirect url(:merbiful_admin, :action => 'layouts')
185
+ end
186
+
187
+ def move_page_up
188
+ page = Page.get(params[:page_id])
189
+ page.position -= 1
190
+ page.save
191
+ redirect url(:merbiful_admin, :action => "pages")
192
+ end
193
+
194
+ def move_page_down
195
+ page = Page.get(params[:page_id])
196
+ page.position += 1
197
+ page.save
198
+ redirect url(:merbiful_admin, :action => "pages")
199
+ end
200
+
201
+ private
202
+
203
+ def text_area_rows
204
+ 20
205
+ end
206
+
207
+ def next_path(parent_path)
208
+ index = 0
209
+ while Page.first(:path => File.join(parent_path, index.to_s))
210
+ index += 1
211
+ end
212
+ return File.join(parent_path, index.to_s)
213
+ end
214
+
215
+ def next_name(klass)
216
+ index = 0
217
+ while klass.first(:name => index.to_s)
218
+ index += 1
219
+ end
220
+ return index.to_s
221
+ end
222
+
223
+ def errors(obj, meth)
224
+ return ""
225
+ if obj.errors.on(meth)
226
+ obj.errors.on(meth).join(", ")
227
+ else
228
+ ""
229
+ end
230
+ end
231
+
232
+ def render_children(page, ind = "")
233
+ rval = []
234
+ rval << "<ul class='children'>"
235
+ page.children(:order => [:position, :id]).each do |child|
236
+ rval << render_page(child, ind + " ")
237
+ end
238
+ rval << "</ul>"
239
+ return rval.collect do |line| ind + line end.join("\n")
240
+ end
241
+
242
+ def render_page(page, ind = "")
243
+ rval = []
244
+ rval << "<li class='page'>"
245
+ rval << "<ul class='page_info info'>"
246
+ rval << "<a href='#{url(:merbiful_admin, :action => 'pages', :page_id => page.id)}'>"
247
+ rval << "<li class='page_path'>#{page.path}</li>"
248
+ rval << "<li class='page_title'>#{page.title || "untitled"}</li>"
249
+ rval << "<li class='page_version'>ver##{page.latest.id} (#{time_ago_in_words(page.latest.created_at)} ago)</li>"
250
+ rval << "</a>"
251
+ rval << "<li class='up'><a href='#{url(:merbiful_admin, :action => 'move_page_up', :page_id => page.id)}'>&uarr;</a></li>"
252
+ rval << "<li class='down'><a href='#{url(:merbiful_admin, :action => 'move_page_down', :page_id => page.id)}'>&darr;</a></li>"
253
+ rval << "<li class='remove'><a href='#{url(:merbiful_admin, :action => 'destroy_page', :page_id => page.id)}'>-</a></li>" unless page.parent_id.nil?
254
+ rval << "<li class='append'><a href='#{url(:merbiful_admin, :action => 'create_page', :parent_id => page.id)}'>+</a></li>"
255
+ rval << "</ul>"
256
+ rval << render_template_without_layout("page_form.html.haml") if params[:page_id].to_s == page.id.to_s
257
+ rval << render_children(page, ind) unless page.children.empty?
258
+ rval << "</li>"
259
+ return rval.collect do |line| ind + line end.join("\n")
260
+ end
261
+
262
+ def read_template(template)
263
+ Pathname.new(__FILE__).parent.parent.parent.join("templates").join(template).read
264
+ end
265
+
266
+ def render_with_layout(text)
267
+ throw_content :for_layout, text
268
+ ::Haml::Engine.new(read_template("admin_layout.html.haml")).render(self)
269
+ end
270
+
271
+ def render_template_with_layout(template)
272
+ render_with_layout(::Haml::Engine.new(read_template(template)).render(self))
273
+ end
274
+
275
+ def render_template_without_layout(template)
276
+ ::Haml::Engine.new(read_template(template)).render(self)
277
+ end
278
+
279
+ end
280
+
281
+ end
@@ -0,0 +1,12 @@
1
+
2
+ module Merbiful
3
+
4
+ class Controller < Merb::Controller
5
+
6
+ def display(what)
7
+ render what.inspect
8
+ end
9
+
10
+ end
11
+
12
+ end
@@ -0,0 +1,36 @@
1
+
2
+ module Merbiful
3
+
4
+ module Body
5
+
6
+ def render(controller, caches = {})
7
+ rval = if self.filter.blank?
8
+ self.body
9
+ else
10
+ filter_class = Merbiful.const_get(self.filter.to_sym)
11
+ filter_class.new.render(self.body, controller)
12
+ end
13
+ unless Merb.environment == "development"
14
+ caches.each do |destination, to_cache|
15
+ if to_cache
16
+ path = Pathname.new(File.join(Merb.root, "public", destination))
17
+ Merb.logger.info("Flushing to #{path.inspect}")
18
+ path.parent.mkpath
19
+ path.open("w") do |out|
20
+ out.write(rval)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ return rval
26
+ end
27
+
28
+ def clear_cache(target)
29
+ return if target == "/"
30
+ path = Pathname.new(File.join(Merb.root, "public", target))
31
+ path.unlink if path.exist?
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,15 @@
1
+
2
+ module Merbiful
3
+
4
+ module Body
5
+ def to_html(controller)
6
+ if self.filter.nil?
7
+ self.body
8
+ else
9
+ filter_class = Merbiful.const_get(self.filter.to_sym)
10
+ filter_class.new.render(self.body, controller)
11
+ end
12
+ end
13
+ end
14
+
15
+ end
@@ -0,0 +1,55 @@
1
+
2
+ module Merbiful
3
+
4
+ class Controller < Merb::Controller
5
+
6
+ class MissingPageError < RuntimeError
7
+ end
8
+
9
+ class MissingLayoutError < RuntimeError
10
+ end
11
+
12
+ class MissingCssError < RuntimeError
13
+ end
14
+
15
+ class MissingJsError < RuntimeError
16
+ end
17
+
18
+ def css(id)
19
+ css_version = Css::Version.get(id)
20
+ raise MissingCssError.new(id) unless css_version
21
+ css_version.render(self, css_version.css.path => css_version.css.cached)
22
+ end
23
+
24
+ def js(id)
25
+ js_version = Js::Version.get(id)
26
+ raise MissingJsError.new(id) unless js_version
27
+ js_version.render(self, js_version.js.path => js_version.js.cached)
28
+ end
29
+
30
+ def display(what)
31
+ @page = Page.first(:path => what)
32
+ raise NotFound.new(what.inspect) unless @page
33
+ unless @page.jses.empty?
34
+ throw_content(:for_js, @page.jses.inject([]) do |sum, frozen_js|
35
+ js = Js.get(frozen_js.id)
36
+ sum << "<script src='#{js.path}' type='text/javascript'></script>"
37
+ end.join("\n"))
38
+ end
39
+ unless @page.csses.empty?
40
+ throw_content(:for_css, @page.csses.inject([]) do |sum, frozen_css|
41
+ css = Css.get(frozen_css.id)
42
+ sum << "<link href='#{css.path}' #{css.media.blank? ? "" : "media='#{css.media}' "}rel='Stylesheet' type='text/css' />"
43
+ end.join("\n"))
44
+ end
45
+ if @page.layout
46
+ throw_content :for_layout, @page.render(self)
47
+ @page.layout.render(self, @page.path => @page.cached)
48
+ else
49
+ @page.render(self, @page.path => @page.cached)
50
+ end
51
+ end
52
+
53
+ end
54
+
55
+ end
@@ -0,0 +1,12 @@
1
+
2
+ module Merbiful
3
+
4
+ class Controller < Merb::Controller
5
+
6
+ def display(what)
7
+ render what.inspect
8
+ end
9
+
10
+ end
11
+
12
+ end
@@ -0,0 +1,70 @@
1
+
2
+ module Merbiful
3
+
4
+ class Css
5
+
6
+ include DataMapper::Resource
7
+ include DataMapper::Validate
8
+ extend Forwardable
9
+
10
+ property :id, Serial
11
+
12
+ property :name, DataMapper::Types::Text, :nullable => false
13
+ property :media, DataMapper::Types::Text
14
+ property :cached, Boolean, :default => true, :nullable => false
15
+
16
+ property :created_at, DateTime
17
+ property :updated_at, DateTime
18
+
19
+ has n, :css_nesses, :class_name => "Merbiful::Css::Ness"
20
+ has n, :page_versions, :through => :css_nesses, :class_name => "Merbiful::Page::Version"
21
+ has n, :css_versions, :class_name => "Merbiful::Css::Version"
22
+
23
+ def latest
24
+ css_versions.first(:css_id => self.id, :order => [:id.desc])
25
+ end
26
+
27
+ def_delegators :latest, :render, :body, :filter
28
+
29
+ def path
30
+ "/stylesheets/#{latest.id}"
31
+ end
32
+
33
+ class Ness
34
+ include DataMapper::Resource
35
+ include DataMapper::Validate
36
+
37
+ property :id, Serial
38
+
39
+ belongs_to :css, :class_name => "Merbiful::Css"
40
+ belongs_to :page_version, :class_name => "Merbiful::Page::Version"
41
+ end
42
+
43
+ class Version
44
+
45
+ include DataMapper::Resource
46
+ include DataMapper::Validate
47
+ include Merbiful::Body
48
+
49
+ property :id, Serial
50
+
51
+ property :css_id, Integer, :index => true, :nullable => false
52
+
53
+ property :body, DataMapper::Types::Text
54
+ property :filter, DataMapper::Types::Text
55
+
56
+ property :created_at, DateTime
57
+ property :updated_at, DateTime
58
+
59
+ belongs_to :css, :class_name => "Merbiful::Css"
60
+
61
+ before :save do
62
+ clear_cache(css.path) if css.latest
63
+ end
64
+
65
+ end
66
+
67
+ end
68
+
69
+
70
+ end
@@ -0,0 +1,62 @@
1
+
2
+ module Merbiful
3
+
4
+ class Css
5
+
6
+ include DataMapper::Resource
7
+ include DataMapper::Validate
8
+ extend Forwardable
9
+
10
+ property :id, Serial
11
+
12
+ property :name, DataMapper::Types::Text, :nullable => false
13
+ property :media, DataMapper::Types::Text
14
+ property :cached, Boolean, :default => true, :nullable => false
15
+
16
+ property :created_at, DateTime
17
+ property :updated_at, DateTime
18
+
19
+ has n, :css_nesses, :class_name => "Merbiful::Css::Ness"
20
+ has n, :page_versions, :through => :css_nesses, :class_name => "Merbiful::Page::Version"
21
+ has n, :css_versions, :class_name => "Merbiful::Css::Version"
22
+
23
+ def latest
24
+ css_versions.first(:order => [:id.desc])
25
+ end
26
+
27
+ def_delegators :latest, :render
28
+
29
+ class Ness
30
+ include DataMapper::Resource
31
+ include DataMapper::Validate
32
+
33
+ property :id, Serial
34
+
35
+ belongs_to :css, :class_name => "Merbiful::Css"
36
+ belongs_to :page_version, :class_name => "Merbiful::Page::Version"
37
+ end
38
+
39
+ class Version
40
+
41
+ include DataMapper::Resource
42
+ include DataMapper::Validate
43
+ include Merbiful::Body
44
+
45
+ property :id, Serial
46
+
47
+ property :css_id, Integer, :index => true, :nullable => false
48
+
49
+ property :body, DataMapper::Types::Text
50
+ property :filter, DataMapper::Types::Text
51
+
52
+ property :created_at, DateTime
53
+ property :updated_at, DateTime
54
+
55
+ belongs_to :css, :class_name => "Merbiful::Css"
56
+
57
+ end
58
+
59
+ end
60
+
61
+
62
+ end
@@ -0,0 +1,13 @@
1
+ module Merbiful
2
+
3
+ class Erubis
4
+
5
+ def render(text, scope)
6
+ ::Erubis::Eruby.new(text).result(scope.instance_eval do binding end)
7
+ end
8
+
9
+ end
10
+
11
+ Filter.register_filter(Erubis)
12
+
13
+ end
@@ -0,0 +1,11 @@
1
+ module Merbiful
2
+
3
+ class Eruby
4
+
5
+ def render(text, scope)
6
+ ERB.new(text).result(scope)
7
+ end
8
+
9
+ end
10
+
11
+ end
@@ -0,0 +1,11 @@
1
+ module Merbiful
2
+
3
+ class Eruby
4
+
5
+ def render(text, scope)
6
+ ::Haml::Engine.new(text).render(scope)
7
+ end
8
+
9
+ end
10
+
11
+ end
@@ -0,0 +1,22 @@
1
+
2
+ module Merbiful
3
+
4
+ module Filter
5
+
6
+ @filters = []
7
+
8
+ def self.register_filter(filter)
9
+ @filters << filter
10
+ end
11
+
12
+ def self.filters
13
+ @filters.inject([[nil, "Verbatim"]]) do |sum, filter|
14
+ filter_name = filter.name.gsub(/^Merbiful::/, "")
15
+ sum + [[filter_name, filter_name]]
16
+ end
17
+ end
18
+
19
+ end
20
+
21
+ end
22
+
@@ -0,0 +1,23 @@
1
+
2
+ module Merbiful
3
+
4
+ class Haml
5
+
6
+ def render(text, scope)
7
+ ::Haml::Engine.new(text).render(scope)
8
+ end
9
+
10
+ end
11
+
12
+ class Sass
13
+
14
+ def render(text, scope)
15
+ ::Sass::Engine.new(text).render
16
+ end
17
+
18
+ end
19
+
20
+ Filter.register_filter(Haml)
21
+ Filter.register_filter(Sass)
22
+
23
+ end
@@ -0,0 +1,11 @@
1
+
2
+ module Merbiful
3
+
4
+ class Haml
5
+
6
+ def render(text)
7
+ end
8
+
9
+ end
10
+
11
+ end