aslakjo-comatose 2.0.5.2
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.
- data/CHANGELOG +195 -0
- data/INSTALL +20 -0
- data/LICENSE +20 -0
- data/MANIFEST +91 -0
- data/README.markdown +159 -0
- data/Rakefile +176 -0
- data/SPECS +61 -0
- data/about.yml +7 -0
- data/bin/comatose +112 -0
- data/comatose.gemspec +113 -0
- data/generators/comatose_migration/USAGE +15 -0
- data/generators/comatose_migration/comatose_migration_generator.rb +74 -0
- data/generators/comatose_migration/templates/migration.rb +35 -0
- data/generators/comatose_migration/templates/v4_upgrade.rb +15 -0
- data/generators/comatose_migration/templates/v6_upgrade.rb +23 -0
- data/generators/comatose_migration/templates/v7_upgrade.rb +22 -0
- data/init.rb +2 -0
- data/install.rb +18 -0
- data/lib/acts_as_versioned.rb +543 -0
- data/lib/comatose/comatose_drop.rb +79 -0
- data/lib/comatose/configuration.rb +69 -0
- data/lib/comatose/page_wrapper.rb +119 -0
- data/lib/comatose/processing_context.rb +69 -0
- data/lib/comatose/tasks/admin.rb +60 -0
- data/lib/comatose/tasks/data.rb +82 -0
- data/lib/comatose/tasks/setup.rb +52 -0
- data/lib/comatose/version.rb +4 -0
- data/lib/comatose.rb +33 -0
- data/lib/comatose_admin_controller.rb +395 -0
- data/lib/comatose_admin_helper.rb +37 -0
- data/lib/comatose_controller.rb +138 -0
- data/lib/comatose_helper.rb +3 -0
- data/lib/comatose_page.rb +141 -0
- data/lib/liquid/block.rb +96 -0
- data/lib/liquid/context.rb +190 -0
- data/lib/liquid/document.rb +17 -0
- data/lib/liquid/drop.rb +48 -0
- data/lib/liquid/errors.rb +7 -0
- data/lib/liquid/extensions.rb +53 -0
- data/lib/liquid/file_system.rb +62 -0
- data/lib/liquid/htmltags.rb +64 -0
- data/lib/liquid/standardfilters.rb +111 -0
- data/lib/liquid/standardtags.rb +399 -0
- data/lib/liquid/strainer.rb +42 -0
- data/lib/liquid/tag.rb +25 -0
- data/lib/liquid/template.rb +88 -0
- data/lib/liquid/variable.rb +39 -0
- data/lib/liquid.rb +52 -0
- data/lib/redcloth.rb +1129 -0
- data/lib/support/class_options.rb +36 -0
- data/lib/support/inline_rendering.rb +48 -0
- data/lib/support/route_mapper.rb +50 -0
- data/lib/text_filters/markdown.rb +14 -0
- data/lib/text_filters/markdown_smartypants.rb +15 -0
- data/lib/text_filters/none.rb +8 -0
- data/lib/text_filters/rdoc.rb +13 -0
- data/lib/text_filters/simple.rb +8 -0
- data/lib/text_filters/textile.rb +15 -0
- data/lib/text_filters.rb +140 -0
- data/rails/init.rb +3 -0
- data/resources/layouts/comatose_admin_template.html.erb +28 -0
- data/resources/public/images/collapsed.gif +0 -0
- data/resources/public/images/expanded.gif +0 -0
- data/resources/public/images/no-children.gif +0 -0
- data/resources/public/images/page.gif +0 -0
- data/resources/public/images/spinner.gif +0 -0
- data/resources/public/images/title-hover-bg.gif +0 -0
- data/resources/public/javascripts/comatose_admin.js +401 -0
- data/resources/public/stylesheets/comatose_admin.css +404 -0
- data/tasks/comatose.rake +9 -0
- data/test/behaviors.rb +106 -0
- data/test/fixtures/comatose_pages.yml +96 -0
- data/test/functional/comatose_admin_controller_test.rb +114 -0
- data/test/functional/comatose_controller_test.rb +44 -0
- data/test/javascripts/test.html +26 -0
- data/test/javascripts/test_runner.js +307 -0
- data/test/test_helper.rb +55 -0
- data/test/unit/class_options_test.rb +52 -0
- data/test/unit/comatose_page_test.rb +136 -0
- data/test/unit/processing_context_test.rb +108 -0
- data/test/unit/text_filters_test.rb +52 -0
- data/views/comatose_admin/_form.html.erb +96 -0
- data/views/comatose_admin/_page_list_item.html.erb +60 -0
- data/views/comatose_admin/delete.html.erb +18 -0
- data/views/comatose_admin/edit.html.erb +5 -0
- data/views/comatose_admin/index.html.erb +29 -0
- data/views/comatose_admin/new.html.erb +5 -0
- data/views/comatose_admin/reorder.html.erb +30 -0
- data/views/comatose_admin/versions.html.erb +40 -0
- data/views/layouts/comatose_admin.html.erb +837 -0
- data/views/layouts/comatose_admin_customize.html.erb +28 -0
- data/views/layouts/comatose_content.html.erb +17 -0
- metadata +148 -0
@@ -0,0 +1,119 @@
|
|
1
|
+
# Giving direct access to the AR model is disconcerting, so this wraps the AR
|
2
|
+
# Model to prevent access to certain, destructive behavior
|
3
|
+
class Comatose::PageWrapper
|
4
|
+
|
5
|
+
@@allowed_methods = %w(id full_path uri slug keywords title to_html filter_type author updated_on created_on)
|
6
|
+
@@custom_methods = %w(link content parent next previous children rchildren first_child last_child has_keyword)
|
7
|
+
|
8
|
+
attr_accessor :page
|
9
|
+
private :page
|
10
|
+
|
11
|
+
def initialize( page, locals={} )
|
12
|
+
@page = page
|
13
|
+
@keyword_lst = []
|
14
|
+
@keyword_hsh = {}
|
15
|
+
unless page.nil?
|
16
|
+
@keyword_lst = (page.keywords || '').downcase.split(',').map {|k| k.strip }
|
17
|
+
@keyword_lst.each {|kw| @keyword_hsh[kw] = true}
|
18
|
+
end
|
19
|
+
@locals = locals
|
20
|
+
end
|
21
|
+
|
22
|
+
def has_keyword?(keyword)
|
23
|
+
@page.has_keyword?(keyword)
|
24
|
+
end
|
25
|
+
|
26
|
+
def has_keyword
|
27
|
+
@keyword_hsh
|
28
|
+
end
|
29
|
+
|
30
|
+
def next
|
31
|
+
@next_page ||= begin
|
32
|
+
if @page.lower_item.nil?
|
33
|
+
nil
|
34
|
+
else
|
35
|
+
Comatose::PageWrapper.new( @page.lower_item )
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def previous
|
41
|
+
@prev_page ||= begin
|
42
|
+
if @page.higher_item.nil?
|
43
|
+
nil
|
44
|
+
else
|
45
|
+
Comatose::PageWrapper.new( @page.higher_item )
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def first_child
|
51
|
+
children.first
|
52
|
+
end
|
53
|
+
|
54
|
+
def def last_child
|
55
|
+
children.last
|
56
|
+
end
|
57
|
+
|
58
|
+
# Generates a link to this page... You can pass in the link text,
|
59
|
+
# otherwise it will default to the page title.
|
60
|
+
def link( title=nil )
|
61
|
+
title = @page.title if title.nil?
|
62
|
+
TextFilters[@page.filter_type].create_link(title, @page.uri)
|
63
|
+
end
|
64
|
+
|
65
|
+
def content
|
66
|
+
@page.to_html( @locals )
|
67
|
+
end
|
68
|
+
|
69
|
+
def parent
|
70
|
+
@parent ||= begin
|
71
|
+
if @page.parent.nil?
|
72
|
+
nil
|
73
|
+
else
|
74
|
+
Comatose::PageWrapper.new( @page.parent )
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def children
|
80
|
+
# Cache the results so that you can have multiple calls to #children without a penalty
|
81
|
+
@children ||= @page.children.to_a.collect {|child| Comatose::PageWrapper.new( child, @locals )}
|
82
|
+
end
|
83
|
+
|
84
|
+
# Children, in reverse order
|
85
|
+
def rchildren
|
86
|
+
children.reverse
|
87
|
+
end
|
88
|
+
|
89
|
+
def [](key)
|
90
|
+
if @@allowed_methods.include? key.to_s #or page.attributes.has_key? key.to_s
|
91
|
+
page.send( key )
|
92
|
+
elsif @@custom_methods.include? key
|
93
|
+
self.send(key.to_sym)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def has_key?(key)
|
98
|
+
@@allowed_methods.include? key or @@custom_methods.include? key
|
99
|
+
end
|
100
|
+
|
101
|
+
def to_s
|
102
|
+
@page.title
|
103
|
+
end
|
104
|
+
|
105
|
+
def to_liquid
|
106
|
+
self
|
107
|
+
end
|
108
|
+
|
109
|
+
def method_missing(method_id, *args)
|
110
|
+
#STDERR.puts "Looking for method: #{method_id} (#{method_id.class.to_s}) in [#{@@allowed_methods.join(', ')}] or [#{page.attributes.keys.join(', ')}]"
|
111
|
+
if @@allowed_methods.include? method_id.to_s or page.attributes.has_key? method_id.to_s
|
112
|
+
page.send( method_id, *args)
|
113
|
+
else
|
114
|
+
# Access nazi says: NO ACCESS FOR YOU!!
|
115
|
+
# but he says it silently...
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# This is the rendering context object you have access to in text processing...
|
2
|
+
class Comatose::ProcessingContext
|
3
|
+
@@supported_methods = %w(page include)
|
4
|
+
|
5
|
+
def initialize( page, locals={} )
|
6
|
+
@locals = locals.stringify_keys if locals.respond_to? :stringify_keys
|
7
|
+
@page = Comatose::PageWrapper.new(page, @locals)
|
8
|
+
end
|
9
|
+
|
10
|
+
def page
|
11
|
+
@page
|
12
|
+
end
|
13
|
+
|
14
|
+
def include(path, locals={})
|
15
|
+
begin
|
16
|
+
page = ComatosePage.find_by_path(path)
|
17
|
+
page.to_html( @locals.merge(locals) )
|
18
|
+
rescue
|
19
|
+
"<p>Page at <tt>#{path}</tt> could not be found.</p>"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def find_by_path(path)
|
24
|
+
begin
|
25
|
+
page = ComatosePage.find_by_path(path)
|
26
|
+
Comatose::PageWrapper.new(page, @locals)
|
27
|
+
rescue
|
28
|
+
"<p>Page at <tt>#{path}</tt> could not be found.</p>"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def [](key)
|
33
|
+
if key.to_s.downcase == 'page'
|
34
|
+
@page
|
35
|
+
elsif @locals.has_key? key
|
36
|
+
@locals[key]
|
37
|
+
elsif Comatose.registered_drops.has_key? key
|
38
|
+
Comatose.registered_drops[key]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def has_key?(key)
|
43
|
+
@@supported_methods.include?(key) or @locals.has_key?(key) or Comatose.registered_drops.has_key?(key)
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_liquid
|
47
|
+
self
|
48
|
+
end
|
49
|
+
|
50
|
+
def get_binding
|
51
|
+
binding
|
52
|
+
end
|
53
|
+
|
54
|
+
def method_missing(method_id, *args)
|
55
|
+
method_name = method_id.to_s
|
56
|
+
if @locals.has_key? method_name
|
57
|
+
@locals[method_name]
|
58
|
+
elsif Comatose.registered_drops.has_key? method_name
|
59
|
+
Comatose.registered_drops[method_name].context = self
|
60
|
+
Comatose.registered_drops[method_name]
|
61
|
+
else
|
62
|
+
"<!-- ProcessingContext: Couldn't find #{method_id} -->"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/tasklib'
|
3
|
+
|
4
|
+
namespace :comatose do
|
5
|
+
#
|
6
|
+
# Customization Tasks
|
7
|
+
#
|
8
|
+
namespace :admin do
|
9
|
+
|
10
|
+
desc "Create Comatose views, layouts, and public files..."
|
11
|
+
task :customize do
|
12
|
+
puts "Copying public files..."
|
13
|
+
plugin_dir = File.join(File.dirname(__FILE__), '../../..')
|
14
|
+
FileUtils.cp(
|
15
|
+
Dir[File.join(plugin_dir, 'resources', 'public', 'stylesheets', '*.css')],
|
16
|
+
File.join(RAILS_ROOT, 'public', 'stylesheets'),
|
17
|
+
:verbose => true
|
18
|
+
)
|
19
|
+
FileUtils.cp(
|
20
|
+
Dir[File.join(plugin_dir, 'resources', 'public', 'javascripts', '*.js')],
|
21
|
+
File.join(RAILS_ROOT, 'public', 'javascripts'),
|
22
|
+
:verbose => true
|
23
|
+
)
|
24
|
+
puts "Copying application views..."
|
25
|
+
FileUtils.mkdir_p(File.join(RAILS_ROOT, 'app', 'views', 'comatose_admin'))
|
26
|
+
FileUtils.cp(
|
27
|
+
Dir[File.join(plugin_dir, 'views', 'comatose_admin', '*.html.erb')],
|
28
|
+
File.join(RAILS_ROOT, 'app', 'views', 'comatose_admin'),
|
29
|
+
:verbose => true
|
30
|
+
)
|
31
|
+
puts "Copying application layout..."
|
32
|
+
FileUtils.cp(
|
33
|
+
File.join(plugin_dir, 'views', 'layouts', 'comatose_admin_customize.html.erb'),
|
34
|
+
File.join(RAILS_ROOT, 'app', 'views', 'layouts', 'comatose_admin.html.erb'),
|
35
|
+
:verbose => true
|
36
|
+
)
|
37
|
+
puts "Finished."
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
desc "Removes the customized files... It doesn't ask for any confirmation, nor is it Subversion-safe -- so be warned!"
|
42
|
+
task :teardown do
|
43
|
+
puts "Removing public files..."
|
44
|
+
FileUtils.rm(
|
45
|
+
File.join(RAILS_ROOT, 'public', 'stylesheets', 'comatose_admin.css')
|
46
|
+
)
|
47
|
+
FileUtils.rm(
|
48
|
+
File.join(RAILS_ROOT, 'public', 'javascripts', 'comatose_admin.js')
|
49
|
+
)
|
50
|
+
|
51
|
+
puts "Removing application views..."
|
52
|
+
FileUtils.rm_rf(
|
53
|
+
File.join(RAILS_ROOT, 'app', 'views', 'comatose_admin')
|
54
|
+
)
|
55
|
+
FileUtils.rm(
|
56
|
+
File.join(RAILS_ROOT, 'app', 'views', 'layouts', 'comatose_admin.html.erb')
|
57
|
+
)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/tasklib'
|
3
|
+
|
4
|
+
namespace :comatose do
|
5
|
+
#
|
6
|
+
# Data Migration Tasks
|
7
|
+
#
|
8
|
+
namespace :data do
|
9
|
+
|
10
|
+
def page_to_hash(page)
|
11
|
+
data = page.attributes.clone
|
12
|
+
# Pull out the specific, or unnecessary fields
|
13
|
+
%w(id parent_id updated_on author position version created_on full_path).each {|key| data.delete(key)}
|
14
|
+
if !page.children.empty?
|
15
|
+
data['children'] = []
|
16
|
+
page.children.each do |child|
|
17
|
+
data['children'] << page_to_hash(child)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
data
|
21
|
+
end
|
22
|
+
|
23
|
+
def hash_to_page_tree(hsh, page)
|
24
|
+
child_ary = hsh.delete 'children'
|
25
|
+
page.update_attributes(hsh)
|
26
|
+
page.save
|
27
|
+
child_ary.each do |child_hsh|
|
28
|
+
if child_pg = page.children.find_by_slug( child_hsh['slug'] )
|
29
|
+
hash_to_page_tree( child_hsh, child_pg )
|
30
|
+
else
|
31
|
+
hash_to_page_tree( child_hsh, page.children.create )
|
32
|
+
end
|
33
|
+
end if child_ary
|
34
|
+
end
|
35
|
+
|
36
|
+
desc "Saves a page tree from page FROM or '' to file TO_FILE or db/comatose-pages.yml"
|
37
|
+
task :export do
|
38
|
+
require "#{RAILS_ROOT}/config/environment"
|
39
|
+
|
40
|
+
root = ENV['FROM'] || ''
|
41
|
+
target = ENV['TO_FILE'] || 'db/comatose-pages.yml'
|
42
|
+
# Nested hash of the page tree...
|
43
|
+
from = ComatosePage.find_by_path(root)
|
44
|
+
if from
|
45
|
+
data = page_to_hash( from )
|
46
|
+
File.open(target, 'w') {|f| f.write data.to_yaml }
|
47
|
+
else
|
48
|
+
puts "Could not find the page at '#{root}', export aborted!"
|
49
|
+
end
|
50
|
+
|
51
|
+
puts "Finished."
|
52
|
+
end
|
53
|
+
|
54
|
+
desc "Loads page tree data FROM_FILE or db/comatose-pages.yml in to TO or ComatosePage.root"
|
55
|
+
task :import do
|
56
|
+
require "#{RAILS_ROOT}/config/environment"
|
57
|
+
|
58
|
+
src = ENV['FROM_FILE'] || 'db/comatose-pages.yml'
|
59
|
+
root = ENV['TO'] || ''
|
60
|
+
target = (root == '') ? ComatosePage.root : ComatosePage.find_by_path(root)
|
61
|
+
data = YAML::load( File.open(src) )
|
62
|
+
#hash_to_page(data, target)
|
63
|
+
if target
|
64
|
+
if root == ''
|
65
|
+
hash_to_page_tree(data, target)
|
66
|
+
else
|
67
|
+
if page = target.children.find_by_slug(data['slug'])
|
68
|
+
hash_to_page_tree(data, page)
|
69
|
+
else
|
70
|
+
hash_to_page_tree(data, target.children.create)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
else
|
74
|
+
puts "Could not find the page at '#{root}', import aborted!"
|
75
|
+
# TODO: Ask to create the specified path if it doesn't exist?
|
76
|
+
end
|
77
|
+
puts "Finished."
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/tasklib'
|
3
|
+
|
4
|
+
namespace :comatose do
|
5
|
+
#
|
6
|
+
# Setup Task...
|
7
|
+
#
|
8
|
+
namespace :setup do
|
9
|
+
|
10
|
+
desc "If the installation didn't add the images correctly, use this task"
|
11
|
+
task :copy_images do
|
12
|
+
plugin_dir = File.join(File.dirname(__FILE__), '..')
|
13
|
+
unless FileTest.exist? File.join(RAILS_ROOT, 'public', 'images', 'comatose')
|
14
|
+
FileUtils.mkdir( File.join(RAILS_ROOT, 'public', 'images', 'comatose') )
|
15
|
+
end
|
16
|
+
FileUtils.cp(
|
17
|
+
Dir[File.join(plugin_dir, 'resources', 'public', 'images', '*.gif')],
|
18
|
+
File.join(RAILS_ROOT, 'public', 'images', 'comatose'),
|
19
|
+
:verbose => true
|
20
|
+
)
|
21
|
+
puts "Finished."
|
22
|
+
end
|
23
|
+
|
24
|
+
# For use when upgrading...
|
25
|
+
|
26
|
+
def move(args)
|
27
|
+
if ENV['USE_SVN'] == 'true'
|
28
|
+
`svn move #{args}`
|
29
|
+
else
|
30
|
+
`mv #{args}`
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def delete(args)
|
35
|
+
if ENV['USE_SVN'] == 'true'
|
36
|
+
`svn delete #{args}`
|
37
|
+
else
|
38
|
+
`rm -rf #{args}`
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# TODO: Test the setup:restructure_customization task...
|
43
|
+
desc "[EXPERIMENTAL] Restructures customized admin folder to version 0.6 from older version -- Only run this if you have customized the admin. USE_SVN=true if you want to update subversion"
|
44
|
+
task :restructure_customization do
|
45
|
+
ENV['USE_SVN'] ||= 'false'
|
46
|
+
move 'public/javscripts/comatose.js public/javscripts/comatose_admin.js'
|
47
|
+
move 'public/stylesheets/comatose.css public/stylesheets/comatose_admin.css'
|
48
|
+
move 'app/views/comatose app/views/comatose_admin'
|
49
|
+
delete 'app/views/layouts/comatose_content.html.erb'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/comatose.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
module Comatose
|
3
|
+
|
4
|
+
# DEPRECATED
|
5
|
+
# Loads extensions from RAILS_ROOT/lib/comatose/*.rb
|
6
|
+
def self.load_extensions
|
7
|
+
Dir[File.join(RAILS_ROOT, 'lib', 'comatose', '*.rb')].each do |path|
|
8
|
+
require "comatose/#{File.basename(path)}"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
require 'acts_as_versioned'
|
15
|
+
require 'redcloth' unless defined?(RedCloth)
|
16
|
+
require 'liquid' unless defined?(Liquid)
|
17
|
+
|
18
|
+
require 'support/class_options'
|
19
|
+
require 'text_filters'
|
20
|
+
|
21
|
+
require 'comatose/configuration'
|
22
|
+
require 'comatose/comatose_drop'
|
23
|
+
require 'comatose/processing_context'
|
24
|
+
require 'comatose/page_wrapper'
|
25
|
+
require 'comatose/version'
|
26
|
+
|
27
|
+
require 'support/inline_rendering'
|
28
|
+
require 'support/route_mapper'
|
29
|
+
|
30
|
+
require 'dispatcher' unless defined?(::Dispatcher)
|
31
|
+
::Dispatcher.to_prepare :comatose do
|
32
|
+
Comatose.config.after_setup.call
|
33
|
+
end
|