merbiful-release 0.2.9 → 0.2.10

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ require 'pathname'
5
5
 
6
6
  PLUGIN = "merbiful-release"
7
7
  NAME = "merbiful-release"
8
- GEM_VERSION = "0.2.9"
8
+ GEM_VERSION = "0.2.10"
9
9
  AUTHOR = "Martin Kihlgren"
10
10
  EMAIL = "martin@wemind.se"
11
11
  HOMEPAGE = ""
@@ -31,6 +31,10 @@ module Merbiful
31
31
 
32
32
  def_delegators :latest, :render, :body, :filter
33
33
 
34
+ def id_to_s
35
+ id.to_s
36
+ end
37
+
34
38
  class Version
35
39
 
36
40
  include DataMapper::Resource
@@ -20,7 +20,7 @@
20
20
  %td= select(:name => "version[filter]", :collection => Merbiful::Filter.filters, :selected => @form_version.filter) + errors(@form_version, :filter)
21
21
  %tr{:class => "layout"}
22
22
  %td Layout
23
- %td= select(:name => "version[layout_id]", :collection => Merbiful::Layout.all, :include_blank => true, :text_method => :name, :value_method => :id, :selected => @form_version.layout_id) + errors(@form_version, :layout)
23
+ %td= select(:name => "version[layout_id]", :collection => Merbiful::Layout.all, :include_blank => true, :text_method => :name, :value_method => :id_to_s, :selected => @form_version.layout_id.to_s) + errors(@form_version, :layout)
24
24
  %tr{:class => "cached"}
25
25
  %td Cached (not versioned)
26
26
  %td= check_box(:name => "page[cached]", :checked => @form_page.cached) + errors(@form_page, :cached)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: merbiful-release
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.9
4
+ version: 0.2.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Kihlgren
@@ -9,7 +9,7 @@ autorequire: merbiful-release
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-02-19 00:00:00 +01:00
12
+ date: 2009-08-31 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -24,51 +24,31 @@ extra_rdoc_files: []
24
24
  files:
25
25
  - Rakefile
26
26
  - LICENSE
27
- - lib/merbiful-release
27
+ - lib/merbiful-release.rb
28
28
  - lib/merbiful-release/admin.rb
29
- - lib/merbiful-release/admin.rb~
30
29
  - lib/merbiful-release/body.rb
31
- - lib/merbiful-release/body.rb~
32
30
  - lib/merbiful-release/controller.rb
33
- - lib/merbiful-release/controller.rb~
34
31
  - lib/merbiful-release/css.rb
35
- - lib/merbiful-release/css.rb~
36
- - lib/merbiful-release/erubis.rb~
37
32
  - lib/merbiful-release/filters.rb
38
- - lib/merbiful-release/filters.rb~
39
- - lib/merbiful-release/haml.rb~
40
33
  - lib/merbiful-release/images.rb
41
- - lib/merbiful-release/images.rb~
42
34
  - lib/merbiful-release/js.rb
43
- - lib/merbiful-release/js.rb~
44
35
  - lib/merbiful-release/layout.rb
45
- - lib/merbiful-release/layout.rb~
46
36
  - lib/merbiful-release/page.rb
47
- - lib/merbiful-release/page.rb~
48
37
  - lib/merbiful-release/relative_time.rb
49
38
  - lib/merbiful-release/routes.rb
50
- - lib/merbiful-release/routes.rb~
51
39
  - lib/merbiful-release/string.rb
52
- - lib/merbiful-release/string.rb~
53
- - lib/merbiful-release.rb
54
- - lib/merbiful-release.rb~
55
40
  - templates/admin.css
56
- - templates/admin.css~
57
41
  - templates/admin_layout.html.haml
58
- - templates/admin_layout.html.haml~
59
42
  - templates/css.html.haml
60
- - templates/css.html.haml~
61
43
  - templates/images.html.haml
62
- - templates/images.html.haml~
63
44
  - templates/index.html.haml
64
45
  - templates/js.html.haml
65
- - templates/js.html.haml~
66
46
  - templates/layouts.html.haml
67
- - templates/layouts.html.haml~
68
47
  - templates/page_form.html.haml
69
- - templates/page_form.html.haml~
70
48
  has_rdoc: true
71
49
  homepage: ""
50
+ licenses: []
51
+
72
52
  post_install_message:
73
53
  rdoc_options: []
74
54
 
@@ -89,9 +69,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
69
  requirements: []
90
70
 
91
71
  rubyforge_project:
92
- rubygems_version: 1.2.0
72
+ rubygems_version: 1.3.4
93
73
  signing_key:
94
- specification_version: 2
74
+ specification_version: 3
95
75
  summary: Merb plugin that provides a simple CMS
96
76
  test_files: []
97
77
 
@@ -1,26 +0,0 @@
1
-
2
- require 'merb-core'
3
- require 'merb-action-args'
4
- require 'merb_helpers'
5
- require 'merb-assets'
6
- require 'dm-core'
7
- require 'dm-validations'
8
- require 'dm-timestamps'
9
- require 'dm-aggregates'
10
- require 'forwardable'
11
- require 'pathname'
12
- require 'pp'
13
- require 'digest/sha1'
14
-
15
- require File.join(File.dirname(__FILE__), 'merbiful-release', 'filters.rb')
16
- require File.join(File.dirname(__FILE__), 'merbiful-release', 'string.rb')
17
- require File.join(File.dirname(__FILE__), 'merbiful-release', 'relative_time.rb')
18
- require File.join(File.dirname(__FILE__), 'merbiful-release', 'images.rb')
19
- require File.join(File.dirname(__FILE__), 'merbiful-release', 'controller.rb')
20
- require File.join(File.dirname(__FILE__), 'merbiful-release', 'body.rb')
21
- require File.join(File.dirname(__FILE__), 'merbiful-release', 'admin.rb')
22
- require File.join(File.dirname(__FILE__), 'merbiful-release', 'routes.rb')
23
- require File.join(File.dirname(__FILE__), 'merbiful-release', 'css.rb')
24
- require File.join(File.dirname(__FILE__), 'merbiful-release', 'js.rb')
25
- require File.join(File.dirname(__FILE__), 'merbiful-release', 'page.rb')
26
- require File.join(File.dirname(__FILE__), 'merbiful-release', 'layout.rb')
@@ -1,313 +0,0 @@
1
-
2
- module Merbiful
3
-
4
- class Admin < Merb::Controller
5
-
6
- include RelativeTimeHelpers
7
-
8
- before :authorize!
9
-
10
- def authorize!
11
- unless authorized?
12
- redirect login_url
13
- throw :halt, "Access denied"
14
- end
15
- end
16
-
17
- def logged_in_user
18
- nil
19
- end
20
-
21
- def login_url
22
- ""
23
- end
24
-
25
- def logout_url
26
- ""
27
- end
28
-
29
- def authorized?
30
- true
31
- end
32
-
33
- def index
34
- render_template_with_layout("index.html.haml")
35
- end
36
-
37
- def layouts
38
- @form_layout = Layout.get(params[:layout_id])
39
- if request.post?
40
- @form_layout.update_attributes(params[:layout])
41
- if @form_layout.valid?
42
- @form_layout.save
43
- @form_version = Layout::Version.new(params[:version].merge(:layout => @form_layout))
44
- if @form_version.valid?
45
- @form_version.save
46
- redirect url(:merbiful_admin, :action => "layouts", :layout_id => @form_layout.id)
47
- end
48
- end
49
- else
50
- if @form_layout
51
- @form_version = Layout::Version.get(params[:version_id])
52
- @form_version = @form_layout.latest unless @form_version
53
- end
54
- end
55
- render_template_with_layout("layouts.html.haml")
56
- end
57
-
58
- def js
59
- @form_js = Js.get(params[:js_id])
60
- if request.post?
61
- params[:js][:cached] = !!params[:js][:cached]
62
- @form_js.update_attributes(params[:js])
63
- if @form_js.valid?
64
- @form_js.save
65
- @form_version = Js::Version.new(params[:version].merge(:js => @form_js))
66
- if @form_version.valid?
67
- @form_version.save
68
- redirect url(:merbiful_admin, :action => "js", :js_id => @form_js.id)
69
- end
70
- end
71
- else
72
- if @form_js
73
- @form_version = Js::Version.get(params[:version_id])
74
- @form_version = @form_js.latest unless @form_version
75
- end
76
- end
77
- render_template_with_layout("js.html.haml")
78
- end
79
-
80
- def images
81
- if request.post?
82
- end
83
- render_template_with_layout("images.html.haml")
84
- end
85
-
86
- def css
87
- @form_css = Css.get(params[:css_id])
88
- if request.post?
89
- params[:css][:cached] = !!params[:css][:cached]
90
- @form_css.update_attributes(params[:css])
91
- if @form_css.valid?
92
- @form_css.save
93
- @form_version = Css::Version.new(params[:version].merge(:css => @form_css))
94
- if @form_version.valid?
95
- @form_version.save
96
- redirect url(:merbiful_admin, :action => "css", :css_id => @form_css.id)
97
- end
98
- end
99
- else
100
- if @form_css
101
- @form_version = Css::Version.get(params[:version_id])
102
- @form_version = @form_css.latest unless @form_version
103
- end
104
- end
105
- render_template_with_layout("css.html.haml")
106
- end
107
-
108
- def pages
109
- if Page.count == 0
110
- new_root = Page.create(:path => "/")
111
- new_root_version = Page::Version.create(:page => new_root, :body => "Here be Dagon")
112
- end
113
- @form_page = Page.get(params[:page_id])
114
- if request.post?
115
- params[:page][:cached] = !!params[:page][:cached]
116
-
117
- @form_page.update_attributes(params[:page])
118
-
119
- version_csses = params[:version].delete(:css)
120
- version_jses = params[:version].delete(:js)
121
-
122
- @form_version = Page::Version.new(params[:version].merge(:page => @form_page))
123
-
124
- version_csses.each do |css|
125
- @form_version.add_css(Css.get(css))
126
- end if version_csses
127
- version_jses.each do |js|
128
- @form_version.add_js(Js.get(js))
129
- end if version_jses
130
-
131
- if @form_page.valid?
132
- @form_page.save
133
- if @form_version.valid?
134
- @form_version.save
135
- redirect url(:merbiful_admin, :action => "pages", :page_id => @form_page.id)
136
- end
137
- end
138
- else
139
- if @form_page
140
- @form_version = Page::Version.get(params[:version_id])
141
- @form_version = @form_page.latest unless @form_version
142
- end
143
- end
144
- render_with_layout(Page.all(:parent_id => nil).collect do |page|
145
- "<ul class='root'>\n#{render_page(page)}\n</ul>"
146
- end.join("\n"))
147
- end
148
-
149
- def render_css
150
- read_template("admin.css")
151
- end
152
-
153
- def destroy_page
154
- page = Page.get(params[:page_id])
155
- page.destroy
156
- redirect url(:merbiful_admin, :action => "pages")
157
- end
158
-
159
- def upload_image
160
- path = Pathname.new(File.join(Merb.root, "public", "images", File.basename(params[:image][:filename])))
161
- raise "H4xx0r" unless path.to_s.index(Pathname.new(Merb.root).expand_path.to_s) == 0
162
- Pathname.new(params[:image][:tempfile].path).rename(path)
163
- redirect url(:merbiful_admin, :action => "images")
164
- end
165
-
166
- def delete_image
167
- path = Pathname.new(File.join(Merb.root, "public", params[:path])).expand_path
168
- raise "H4xx0r" unless path.to_s.index(Pathname.new(Merb.root).expand_path.to_s) == 0
169
- path.unlink
170
- redirect url(:merbiful_admin, :action => "images")
171
- end
172
-
173
- def destroy_layout
174
- layout = Layout.get(params[:layout_id])
175
- layout.destroy
176
- redirect url(:merbiful_admin, :action => "layouts")
177
- end
178
-
179
- def destroy_css
180
- css = Css.get(params[:css_id])
181
- css.destroy
182
- redirect url(:merbiful_admin, :action => "css")
183
- end
184
-
185
- def destroy_js
186
- js = Js.get(params[:js_id])
187
- js.destroy
188
- redirect url(:merbiful_admin, :action => "js")
189
- end
190
-
191
- def create_page
192
- parent = Page.get(params[:parent_id])
193
- new_page = Page.create(:parent => parent, :path => next_path(parent.path))
194
- new_page_version = Page::Version.create(:page => new_page)
195
- redirect url(:merbiful_admin, :action => "pages", :page_id => new_page.id)
196
- end
197
-
198
- def create_css
199
- new_css = Css.create(:name => next_name(Css))
200
- new_css_version = Css::Version.create(:css => new_css)
201
- redirect url(:merbiful_admin, :action => 'css', :css_id => new_css.id)
202
- end
203
-
204
- def create_js
205
- new_js = Js.create(:name => next_name(Js))
206
- new_js_version = Js::Version.create(:js => new_js)
207
- redirect url(:merbiful_admin, :action => 'js', :js_id => new_js.id)
208
- end
209
-
210
- def create_layout
211
- new_layout = Layout.create(:name => next_name(Layout))
212
- new_layout_version = Layout::Version.create(:layout => new_layout)
213
- redirect url(:merbiful_admin, :action => 'layouts', :layout_id => new_layout.id)
214
- end
215
-
216
- def move_page_up
217
- page = Page.get(params[:page_id])
218
- page.position -= 1
219
- page.save
220
- redirect url(:merbiful_admin, :action => "pages")
221
- end
222
-
223
- def move_page_down
224
- page = Page.get(params[:page_id])
225
- page.position += 1
226
- page.save
227
- redirect url(:merbiful_admin, :action => "pages")
228
- end
229
-
230
- private
231
-
232
- def confirm(message)
233
- "return confirm('#{message}');"
234
- end
235
-
236
- def text_area_rows
237
- 20
238
- end
239
-
240
- def next_path(parent_path)
241
- index = 0
242
- while Page.first(:path => File.join(parent_path, index.to_s))
243
- index += 1
244
- end
245
- return File.join(parent_path, index.to_s)
246
- end
247
-
248
- def next_name(klass)
249
- index = 0
250
- while klass.first(:name => index.to_s)
251
- index += 1
252
- end
253
- return index.to_s
254
- end
255
-
256
- def errors(obj, meth)
257
- if obj.errors.on(meth)
258
- "<div class='error'>#{obj.errors.on(meth).join(", ")}</div>"
259
- else
260
- ""
261
- end
262
- end
263
-
264
- def render_children(page, ind = "")
265
- rval = []
266
- rval << "<ul class='children'>"
267
- page.children(:order => [:position, :id]).each do |child|
268
- rval << render_page(child, ind + " ")
269
- end
270
- rval << "</ul>"
271
- return rval.collect do |line| ind + line end.join("\n")
272
- end
273
-
274
- def render_page(page, ind = "")
275
- rval = []
276
- rval << "<li class='page'>"
277
- rval << "<ul class='page_info info'>"
278
- rval << "<a href='#{url(:merbiful_admin, :action => 'pages', :page_id => page.id)}'>"
279
- rval << "<li class='page_path'>#{page.path}</li>"
280
- rval << "<li class='page_title'>#{page.title || "untitled"}</li>"
281
- rval << "<li class='page_version'>ver##{page.latest.id} (#{time_ago_in_words(page.latest.created_at)} ago)</li>"
282
- rval << "</a>"
283
- rval << "<li class='up'><a href='#{url(:merbiful_admin, :action => 'move_page_up', :page_id => page.id)}'>&uarr;</a></li>"
284
- rval << "<li class='down'><a href='#{url(:merbiful_admin, :action => 'move_page_down', :page_id => page.id)}'>&darr;</a></li>"
285
- rval << "<li class='remove'><a href='#{url(:merbiful_admin, :action => 'destroy_page', :page_id => page.id)}' onclick=\"#{confirm("Are you absolutely certain that you want to destroy the page at #{page.path}? All versions will be irreversibly destroyed.")}\">-</a></li>" unless page.parent_id.nil?
286
- rval << "<li class='append'><a href='#{url(:merbiful_admin, :action => 'create_page', :parent_id => page.id)}'>+</a></li>"
287
- rval << "</ul>"
288
- rval << render_template_without_layout("page_form.html.haml") if params[:page_id].to_s == page.id.to_s
289
- rval << render_children(page, ind) unless page.children.empty?
290
- rval << "</li>"
291
- return rval.collect do |line| ind + line end.join("\n")
292
- end
293
-
294
- def read_template(template)
295
- Pathname.new(__FILE__).parent.parent.parent.join("templates").join(template).read
296
- end
297
-
298
- def render_with_layout(text)
299
- throw_content :for_layout, text
300
- ::Haml::Engine.new(read_template("admin_layout.html.haml")).render(self)
301
- end
302
-
303
- def render_template_with_layout(template)
304
- render_with_layout(::Haml::Engine.new(read_template(template)).render(self))
305
- end
306
-
307
- def render_template_without_layout(template)
308
- ::Haml::Engine.new(read_template(template)).render(self)
309
- end
310
-
311
- end
312
-
313
- end
@@ -1,48 +0,0 @@
1
-
2
- module Merbiful
3
-
4
- module Body
5
-
6
- FAKE_IO_CLASS = Struct.new(:read, :path)
7
-
8
- def render_id
9
- Merb::Template.template_name("#{self.class}##{self.id}")
10
- end
11
-
12
- def render(controller, caches = {})
13
- rval = if self.filter.blank?
14
- self.body
15
- else
16
- controller.send(Merb::Template::METHOD_LIST[render_id] ||=
17
- begin
18
- filter = Merb::Template::EXTENSIONS[self.filter]
19
- if filter.method(:compile_template).arity == 3
20
- Merb::Template::EXTENSIONS[self.filter].compile_template(FAKE_IO_CLASS.new(self.body, render_id),
21
- render_id,
22
- Merb::InlineTemplates)
23
- elsif filter.method(:compile_template).arity == 4
24
- Merb::Template::EXTENSIONS[self.filter].compile_template(FAKE_IO_CLASS.new(self.body, render_id),
25
- render_id,
26
- [],
27
- Merb::InlineTemplates)
28
- end
29
- end)
30
- end
31
- unless Merb.environment == "development"
32
- caches.each do |destination, to_cache|
33
- if to_cache
34
- path = destination.cached_path
35
- Merb.logger.info("Flushing to #{path.inspect}")
36
- path.parent.mkpath
37
- path.open("w") do |out|
38
- out.write(rval)
39
- end
40
- end
41
- end
42
- end
43
- return rval
44
- end
45
-
46
- end
47
-
48
- end
@@ -1,61 +0,0 @@
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 root
19
- Page.root
20
- end
21
-
22
- def css(id)
23
- css_version = Css::Version.get(id)
24
- raise MissingCssError.new(id) unless css_version
25
- headers["Content-Type"] = "text/css"
26
- css_version.render(self, css_version.css.path => css_version.css.cached)
27
- end
28
-
29
- def js(id)
30
- js_version = Js::Version.get(id)
31
- raise MissingJsError.new(id) unless js_version
32
- headers["Content-Type"] = "text/javascript"
33
- js_version.render(self, js_version.js.path => js_version.js.cached)
34
- end
35
-
36
- def plur(what)
37
- @page = Page.first(:path => what)
38
- raise NotFound.new(what.inspect) unless @page
39
- unless @page.jses.empty?
40
- throw_content(:for_js, @page.jses.inject([]) do |sum, frozen_js|
41
- js = Js.get(frozen_js.id)
42
- sum << "<script src='#{js.path}' type='text/javascript'></script>"
43
- end.join("\n"))
44
- end
45
- unless @page.csses.empty?
46
- throw_content(:for_css, @page.csses.inject([]) do |sum, frozen_css|
47
- css = Css.get(frozen_css.id)
48
- sum << "<link href='#{css.path}' #{css.media.blank? ? "" : "media='#{css.media}' "}rel='Stylesheet' type='text/css' />"
49
- end.join("\n"))
50
- end
51
- if @page.layout
52
- throw_content :for_layout, @page.render(self)
53
- @page.layout.render(self, @page.path => @page.cached)
54
- else
55
- @page.render(self, @page.path => @page.cached)
56
- end
57
- end
58
-
59
- end
60
-
61
- end
@@ -1,77 +0,0 @@
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", :child_key => [:css_id]
21
- has n, :css_versions, :class_name => "Merbiful::Css::Version"
22
-
23
- before :destroy do
24
- css_nesses.destroy!
25
- css_versions.destroy!
26
- end
27
-
28
- def latest
29
- css_versions.first(:css_id => self.id, :order => [:id.desc])
30
- end
31
-
32
- def_delegators :latest, :render, :body, :filter
33
-
34
- def path
35
- "/stylesheets/#{latest.id}"
36
- end
37
-
38
- class Ness
39
- include DataMapper::Resource
40
- include DataMapper::Validate
41
-
42
- property :id, Serial
43
- property :page_version_id, Integer
44
- property :css_id, Integer
45
-
46
- belongs_to :css, :class_name => "Merbiful::Css", :child_key => [:css_id]
47
- belongs_to :page_version, :class_name => "Merbiful::Page::Version", :child_key => [:page_version_id]
48
- end
49
-
50
- class Version
51
-
52
- include DataMapper::Resource
53
- include DataMapper::Validate
54
- include Merbiful::Body
55
-
56
- property :id, Serial
57
-
58
- property :css_id, Integer, :index => true, :nullable => false
59
-
60
- property :body, DataMapper::Types::Text
61
- property :filter, DataMapper::Types::Text
62
-
63
- property :created_at, DateTime
64
- property :updated_at, DateTime
65
-
66
- belongs_to :css, :class_name => "Merbiful::Css"
67
-
68
- before :save do
69
- css.path.clear_cache! if css.latest
70
- end
71
-
72
- end
73
-
74
- end
75
-
76
-
77
- end
@@ -1,13 +0,0 @@
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
- FILTERS << Erubis
12
-
13
- end
@@ -1,22 +0,0 @@
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
-
@@ -1,23 +0,0 @@
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
- FILTERS << Haml
21
- FILTERS << Sass
22
-
23
- end
@@ -1,14 +0,0 @@
1
-
2
- module Merbiful
3
-
4
- class ImageHandler
5
-
6
- IMAGE_REGEXP = /\.(gif|jpg|jpeg|png|bmp)$/
7
-
8
- def images
9
-
10
- end
11
-
12
- end
13
-
14
- end
@@ -1,76 +0,0 @@
1
-
2
- module Merbiful
3
-
4
- class Js
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 :cached, Boolean, :default => true, :nullable => false
14
-
15
- property :created_at, DateTime
16
- property :updated_at, DateTime
17
-
18
- has n, :js_nesses, :class_name => "Merbiful::Js::Ness"
19
- has n, :page_versions, :through => :js_nesses, :class_name => "Merbiful::Page::Version", :child_key => [:js_id]
20
- has n, :js_versions, :class_name => "Merbiful::Js::Version"
21
-
22
- before :destroy do
23
- js_nesses.destroy!
24
- js_versions.destroy!
25
- end
26
-
27
- def latest
28
- js_versions.first(:js_id => self.id, :order => [:id.desc])
29
- end
30
-
31
- def_delegators :latest, :render, :body, :filter
32
-
33
- def path
34
- "/javascripts/#{latest.id}"
35
- end
36
-
37
- class Ness
38
- include DataMapper::Resource
39
- include DataMapper::Validate
40
-
41
- property :id, Serial
42
- property :page_version_id, Integer
43
- property :js_id, Integer
44
-
45
- belongs_to :js, :class_name => "Merbiful::Js", :child_key => [:js_id]
46
- belongs_to :page_version, :class_name => "Merbiful::Page::Version", :child_key => [:page_version_id]
47
- end
48
-
49
- class Version
50
-
51
- include DataMapper::Resource
52
- include DataMapper::Validate
53
- include Merbiful::Body
54
-
55
- property :id, Serial
56
-
57
- property :js_id, Integer, :index => true, :nullable => false
58
-
59
- property :body, DataMapper::Types::Text
60
- property :filter, DataMapper::Types::Text
61
-
62
- property :created_at, DateTime
63
- property :updated_at, DateTime
64
-
65
- belongs_to :js, :class_name => "Merbiful::Js"
66
-
67
- before :save do
68
- js.path.clear_cache! if js.latest
69
- end
70
-
71
- end
72
-
73
- end
74
-
75
-
76
- end
@@ -1,49 +0,0 @@
1
-
2
- module Merbiful
3
-
4
- class Layout
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
-
14
- property :created_at, DateTime
15
- property :updated_at, DateTime
16
-
17
- has n, :layout_versions, :class_name => "Merbiful::Layout::Version"
18
- has n, :page_versions, :class_name => "Merbiful::Page::Version"
19
-
20
- def latest
21
- layout_versions.first(:layout_id => self.id, :order => [:id.desc])
22
- end
23
-
24
- def_delegators :latest, :render, :body, :filter
25
-
26
- class Version
27
-
28
- include DataMapper::Resource
29
- include DataMapper::Validate
30
- include Merbiful::Body
31
-
32
- property :id, Serial
33
-
34
- property :layout_id, Integer, :index => true, :nullable => false
35
-
36
- property :body, DataMapper::Types::Text
37
- property :filter, DataMapper::Types::Text
38
-
39
- property :created_at, DateTime
40
- property :updated_at, DateTime
41
-
42
- belongs_to :layout, :class_name => "Merbiful::Layout"
43
-
44
- end
45
-
46
- end
47
-
48
-
49
- end
@@ -1,109 +0,0 @@
1
-
2
- module Merbiful
3
-
4
- class Page
5
-
6
- class NoSuchFilterError < RuntimeError
7
- end
8
-
9
- include DataMapper::Resource
10
- include DataMapper::Validate
11
- extend Forwardable
12
-
13
- property :id, Serial
14
- property :parent_id, Integer, :index => true
15
-
16
- property :path, DataMapper::Types::Text, :unique_index => true, :nullable => false
17
- property :position, Integer
18
- property :cached, Boolean, :default => true, :nullable => false
19
-
20
- property :created_at, DateTime
21
- property :updated_at, DateTime
22
-
23
- belongs_to :parent, :class_name => "Merbiful::Page", :child_key => [:parent_id]
24
- has n, :children, :class_name => "Merbiful::Page", :child_key => [:parent_id]
25
- has n, :versions, :class_name => "Merbiful::Page::Version"
26
-
27
- validates_is_unique :path
28
-
29
- before :destroy do
30
- versions.each do |version|
31
- version.destroy
32
- end
33
- end
34
-
35
- before :save do
36
- if self.position.nil?
37
- last_position = self.class.first(:parent_id => self.parent_id, :id.not => self.id)
38
- if last_position.nil?
39
- self.position = 0
40
- else
41
- self.position = last_position.position + 1
42
- end
43
- end
44
- end
45
-
46
- def latest
47
- versions.first(:page_id => self.id, :order => [:id.desc])
48
- end
49
-
50
- def_delegators :latest, :render, :layout, :csses, :add_css, :remove_css, :jses, :add_js, :remove_js, :body, :filter, :title, :keywords
51
-
52
- class Version
53
-
54
- include DataMapper::Resource
55
- include DataMapper::Validate
56
- include Merbiful::Body
57
-
58
- property :id, Serial
59
-
60
- property :page_id, Integer, :nullable => false, :index => true
61
- property :layout_id, Integer, :index => true
62
-
63
- property :body, DataMapper::Types::Text
64
- property :filter, DataMapper::Types::Text
65
- property :title, DataMapper::Types::Text
66
- property :keywords, DataMapper::Types::Text
67
-
68
- property :created_at, DateTime
69
- property :updated_at, DateTime
70
-
71
- belongs_to :page, :class_name => "Merbiful::Page"
72
- belongs_to :layout, :class_name => "Merbiful::Layout"
73
-
74
- has n, :css_nesses, :class_name => "Merbiful::Css::Ness"
75
- has n, :csses, :through => :css_nesses, :class_name => "Merbiful::Css", :remote_name => :css, :child_key => [:page_version_id]
76
-
77
- has n, :js_nesses, :class_name => "Merbiful::Js::Ness"
78
- has n, :jses, :through => :js_nesses, :class_name => "Merbiful::Js", :remote_name => :js, :child_key => [:page_version_id]
79
-
80
- before :destroy do
81
- css_nesses.destroy!
82
- js_nesses.destroy!
83
- end
84
-
85
- before :save do
86
- clear_cache(page.path) if page.latest
87
- end
88
-
89
- def add_css(css)
90
- Merbiful::Css::Ness.create(:css => css, :page_version => self)
91
- end
92
-
93
- def remove_css(css)
94
- css_nesses.first(:css_id => css.id).destroy
95
- end
96
-
97
- def add_js(js)
98
- Merbiful::Js::Ness.create(:js => js, :page_version => self)
99
- end
100
-
101
- def remove_js(js)
102
- js_nesses.first(:js_id => js.id).destroy
103
- end
104
-
105
- end
106
-
107
- end
108
-
109
- end
@@ -1,42 +0,0 @@
1
-
2
- Merb.logger.info("Compiling merbiful routes...")
3
- Merb::Router.append do |r|
4
- r.match("/merbiful_admin").to(:controller => "admin", :namespace => "merbiful", :action => "index").name(:merbiful_admin_index)
5
- r.match("/merbiful_admin/:action").to(:controller => "admin", :namespace => "merbiful").name(:merbiful_admin)
6
- r.match("/stylesheets/admin").to(:controller => "admin", :namespace => "merbiful", :action => "render_css").name(:merbiful_admin_css)
7
- r.match("/stylesheets/:id.css").to(:controller => "controller", :namespace => "merbiful", :action => "css")
8
- r.match("/javascripts/:id.js").to(:controller => "controller", :namespace => "merbiful", :action => "js")
9
- r.match(/(.*)/).to(:controller => "controller", :namespace => "merbiful", :action => "page", :what => "[1]")
10
- end
11
-
12
- module Merbiful
13
-
14
- PREPEND_ROUTES = Merb::Router.routes[0..4]
15
- APPEND_ROUTES = Merb::Router.routes[5..-1]
16
-
17
- end
18
-
19
- module Merb
20
-
21
- class Router
22
-
23
- class << self
24
-
25
- alias :merbiful_old_prepare :prepare
26
-
27
- def prepare(first = [], last = [], &block)
28
- merbiful_old_prepare(first + ::Merbiful::PREPEND_ROUTES, last + ::Merbiful::APPEND_ROUTES, &block)
29
- end
30
-
31
- alias :merbiful_old_compile :compile
32
-
33
- def compile
34
- merbiful_old_compile unless compiled_statement.blank?
35
- end
36
-
37
- end
38
-
39
- end
40
-
41
- end
42
-
@@ -1,16 +0,0 @@
1
-
2
- String.class_eval do
3
-
4
- def cached_path
5
- path = Pathname.new(File.join(Merb.root, "public", self))
6
- raise "H4xx0r" unless path.to_s.index(Pathname.new(Merb.root).join("public").expand_path.to_s) == 0
7
- if path.parent.file?
8
- path.parent.unlink
9
- elsif path.directory?
10
- path = path.join("index.html")
11
- end
12
- path
13
- end
14
-
15
-
16
- end
@@ -1,14 +0,0 @@
1
- ul.info {
2
- }
3
-
4
- ul.info li {
5
- list-style: none none inside;
6
- display: inline;
7
- margin: 1px;
8
- padding: 1px;
9
- }
10
-
11
- li.page_title {
12
- font-weight: bold;
13
- }
14
-
@@ -1,11 +0,0 @@
1
- %html
2
- %link{:href => url(:merbiful_admin_css), :rel => 'Stylesheet', :type => 'text/css'}
3
- %body
4
- %h1= link_to("Merbiful Release Administration Interface", url(:merbiful_admin_index))
5
- %ul.menu
6
- %li= link_to("Pages", url(:merbiful_admin, :action => "pages"))
7
- %li= link_to("Layouts", url(:merbiful_admin, :action => "layouts"))
8
- %li= link_to("Css", url(:merbiful_admin, :action => "css"))
9
- %li= link_to("Js", url(:merbiful_admin, :action => "js"))
10
- %li= link_to("Images", url(:merbiful_admin, :action => "images"))
11
- = catch_content :for_layout
@@ -1,32 +0,0 @@
1
- %a{:href => url(:merbiful_admin, :action => "create_css")} New css
2
- %ul{:class => "css"}
3
- - Merbiful::Css.all.each do |css|
4
- %li{:class => "css"}
5
- %ul{:class => "css_info info"}
6
- %a{:href => url(:merbiful_admin, :action => "css", :css_id => css.id)}
7
- %li{:class => "css_name"}= css.name
8
- %li{:class => "css_version"}= "ver##{css.latest.id} (#{time_ago_in_words(css.latest.created_at)} ago)"
9
- %li= link_to("-", url(:merbiful_admin, :action => "destroy_css", :css_id => css.id), :onclick => confirm("Are you absolutely certain that you want to destroy the css named #{css.name}? All versions will be irreversibly destroyed."))
10
- - if params[:css_id].to_s == css.id.to_s
11
- %table.css
12
- %form{:action => url(:merbiful_admin, :action => "css", :css_id => css.id), :method => "post"}
13
- %tr{:class => "version"}
14
- %td Viewing version
15
- %td= @form_css.css_versions(:order => [:id.desc]).collect do |v| "<a class='#{v.id == @form_version.id ? 'active' : 'inactive'}' href='#{url(:merbiful_admin, :action => "css", :css_id => @form_css.id, :version_id => v.id)}'>#{v.id}</a>" end.join(", ")
16
- %tr
17
- %td Name (not versioned)
18
- %td= text_field(:name => "css[name]", :value => @form_css.name) + errors(@form_css, :name)
19
- %tr
20
- %td Body
21
- %td~ text_area(@form_version.body, :name => "version[body]", :cols => 80, :rows => text_area_rows) + errors(@form_version, :body)
22
- %tr{:class => "filter"}
23
- %td Filter
24
- %td= select(:name => "version[filter]", :collection => Merbiful::Filter.filters, :selected => @form_version.filter) + errors(@form_version, :filter)
25
- %tr
26
- %td Media (not versioned)
27
- %td= text_field(:name => "css[media]", :value => @form_css.media) + errors(@form_css, :media)
28
- %tr{:class => "cached"}
29
- %td Cached (not versioned)
30
- %td= check_box(:name => "css[cached]", :checked => @form_css.cached) + errors(@form_css, :cached)
31
- %tr{:class => "submit"}
32
- %td{:colspan => "2"}= submit("Save as new version")
@@ -1,17 +0,0 @@
1
- - if Merbiful::Images.upload_possible?
2
- %form{:action => url(:merbiful_admin, :action => "upload_image"), :enctype => "multipart/form-data", :method => "post"}
3
- Upload new image
4
- %input{:name => "image", :size => "30", :type => "file"}
5
- %input{:type => "submit", :value => "Upload"}
6
- - else
7
- %p Upload seems to be impossible, perhaps the 'public/images' directory is not writable?
8
- %ul{:class => "images"}
9
- - Merbiful::Images.images.each do |image|
10
- %li{:class => "image"}
11
- %ul{:class => "image_info info"}
12
- %a{:href => image}
13
- %li{:class => "picture"}
14
- %img{:height => 20, :src => image.to_s, :alt => image.to_s}
15
- %li{:class => "path"}= image
16
- - if Merbiful::Images.delete_possible?(image)
17
- %a{:href => url(:merbiful_admin, :action => "delete_image", :path => image)} -
@@ -1,29 +0,0 @@
1
- %a{:href => url(:merbiful_admin, :action => "create_js")} New js
2
- %ul{:class => "js"}
3
- - Merbiful::Js.all.each do |js|
4
- %li{:class => "js"}
5
- %ul{:class => "js_info info"}
6
- %a{:href => url(:merbiful_admin, :action => "js", :js_id => js.id)}
7
- %li{:class => "js_name"}= js.name
8
- %li{:class => "js_version"}= "ver##{js.latest.id} (#{time_ago_in_words(js.latest.created_at)} ago)"
9
- %li= link_to("-", url(:merbiful_admin, :action => "destroy_js", :js_id => js.id))
10
- - if params[:js_id].to_s == js.id.to_s
11
- %table.js
12
- %form{:action => url(:merbiful_admin, :action => "js", :js_id => js.id), :method => "post"}
13
- %tr{:class => "version"}
14
- %td Viewing version
15
- %td= @form_js.js_versions(:order => [:id.desc]).collect do |v| "<a class='#{v.id == @form_version.id ? 'active' : 'inactive'}' href='#{url(:merbiful_admin, :action => "js", :js_id => @form_js.id, :version_id => v.id)}'>#{v.id}</a>" end.join(", ")
16
- %tr
17
- %td Name (not versioned)
18
- %td= text_field(:name => "js[name]", :value => @form_js.name) + errors(@form_js, :name)
19
- %tr
20
- %td Body
21
- %td~ text_area(@form_version.body, :name => "version[body]", :cols => 80, :rows => text_area_rows) + errors(@form_version, :body)
22
- %tr{:class => "filter"}
23
- %td Filter
24
- %td= select(:name => "version[filter]", :collection => Merbiful::Filter.filters, :selected => @form_version.filter) + errors(@form_version, :filter)
25
- %tr{:class => "cached"}
26
- %td Cached (not versioned)
27
- %td= check_box(:name => "js[cached]", :checked => @form_js.cached) + errors(@form_js, :cached)
28
- %tr{:class => "submit"}
29
- %td{:colspan => "2"}= submit("Save as new version")
@@ -1,26 +0,0 @@
1
- %a{:href => url(:merbiful_admin, :action => "create_layout")} New layout
2
- %ul{:class => "layouts"}
3
- - Merbiful::Layout.all.each do |layout|
4
- %li{:class => "layout"}
5
- %ul{:class => "layout_info info"}
6
- %a{:href => url(:merbiful_admin, :action => "layouts", :layout_id => layout.id)}
7
- %li{:class => "layout_name"}= layout.name
8
- %li{:class => "layout_version"}= "ver##{layout.latest.id} (#{time_ago_in_words(layout.latest.created_at)} ago)"
9
- %li= link_to("-", url(:merbiful_admin, :action => "destroy_layout", :layout_id => layout.id))
10
- - if params[:layout_id].to_s == layout.id.to_s
11
- %table.layout
12
- %form{:action => url(:merbiful_admin, :action => "layouts", :layout_id => layout.id), :method => "post"}
13
- %tr{:class => "version"}
14
- %td Viewing version
15
- %td= @form_layout.layout_versions(:order => [:id.desc]).collect do |v| "<a class='#{v.id == @form_version.id ? 'active' : 'inactive'}' href='#{url(:merbiful_admin, :action => "layouts", :layout_id => @form_layout.id, :version_id => v.id)}'>#{v.id}</a>" end.join(", ")
16
- %tr
17
- %td Name (not versioned)
18
- %td= text_field(:name => "layout[name]", :value => @form_layout.name) + errors(@form_layout, :name)
19
- %tr
20
- %td Body
21
- %td~ text_area(@form_version.body, :name => "version[body]", :cols => 80, :rows => text_area_rows) + errors(@form_version, :body)
22
- %tr{:class => "filter"}
23
- %td Filter
24
- %td= select(:name => "version[filter]", :collection => Merbiful::Filter.filters, :selected => @form_version.filter) + errors(@form_version, :filter)
25
- %tr{:class => "submit"}
26
- %td{:colspan => "2"}= submit("Save as new version")
@@ -1,41 +0,0 @@
1
- %table.page
2
- %form{:action => url(:merbiful_admin, :action => "pages", :page_id => @form_page.id), :method => "post"}
3
- %tr{:class => "path"}
4
- %td Path
5
- %td= text_field(:name => "page[path]", :value => @form_page.path) + errors(@form_page, :path)
6
- %tr{:class => "title"}
7
- %td Title
8
- %td= text_field(:name => "version[title]", :value => @form_page.title) + errors(@form_version, :title)
9
- %tr{:class => "keywords"}
10
- %td Keywords
11
- %td= text_field(:name => "version[keywords]", :value => @form_page.keywords) + errors(@form_version, :keywords)
12
- %tr{:class => "body"}
13
- %td Body
14
- %td~ text_area(@form_page.body, :name => "version[body]", :cols => 80, :rows => text_area_rows) + errors(@form_version, :body)
15
- %tr{:class => "filter"}
16
- %td Filter
17
- %td= select(:name => "version[filter]", :collection => Merbiful::filters, :selected => @form_page.latest.filter) + errors(@form_version, :filter)
18
- %tr{:class => "layout"}
19
- %td Layout
20
- %td= select(:name => "version[layout_id]", :collection => Merbiful::Layout.all, :include_blank => true, :text_method => :name, :value_method => :id, :selected => @form_page.latest.layout_id) + errors(@form_version, :layout)
21
- %tr{:class => "cached"}
22
- %td Cached
23
- %td= check_box(:name => "page[cached]", :checked => @form_page.cached) + errors(@form_page, :cached)
24
- - Merbiful::Css.all.each_with_index do |css, index|
25
- - if index == 0
26
- %tr{:class => "css"}
27
- %td{:rowspan => Merbiful::Css.count, :valign => "top"} Css
28
- %td= check_box(:name => "version[css][]", :value => css.id, :checked => @form_page.csses.include?(css)) + css.name
29
- - else
30
- %tr{:class => "css"}
31
- %td= check_box(:name => "version[css][]", :value => css.id, :checked => @form_page.csses.include?(css)) + css.name
32
- - Merbiful::Js.all.each_with_index do |js, index|
33
- - if index == 0
34
- %tr{:class => "js"}
35
- %td{:rowspan => Merbiful::Js.count, :valign => "top"} Js
36
- %td= check_box(:name => "version[js][]", :value => js.id, :checked => @form_page.jses.include?(js)) + js.name
37
- - else
38
- %tr{:class => "js"}
39
- %td= check_box(:name => "version[js][]", :value => js.id, :checked => @form_page.jses.include?(js)) + js.name
40
- %tr{:class => "submit"}
41
- %td{:colspan => 2}= submit("Save")