comatose-rubyisbeautiful 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (192) hide show
  1. data/CHANGELOG +198 -0
  2. data/Gemfile +29 -0
  3. data/Gemfile.lock +130 -0
  4. data/INSTALL +14 -0
  5. data/LICENSE +20 -0
  6. data/Manifest +188 -0
  7. data/README +0 -0
  8. data/README.markdown +113 -0
  9. data/Rakefile +5 -0
  10. data/SPECS +61 -0
  11. data/app/controllers/application_controller.rb +3 -0
  12. data/app/controllers/comatose/admin_controller.rb +425 -0
  13. data/app/controllers/comatose/application_controller.rb +30 -0
  14. data/app/controllers/comatose/base_controller.rb +167 -0
  15. data/app/helpers/application_helper.rb +2 -0
  16. data/app/helpers/comatose/admin_helper.rb +78 -0
  17. data/app/helpers/comatose/application_helper.rb +2 -0
  18. data/app/helpers/comatose/base_helper.rb +5 -0
  19. data/app/models/comatose/page.rb +166 -0
  20. data/app/views/comatose/admin/_form.html.erb +108 -0
  21. data/app/views/comatose/admin/_page_list_item.html.erb +62 -0
  22. data/app/views/comatose/admin/delete.html.erb +18 -0
  23. data/app/views/comatose/admin/edit.html.erb +5 -0
  24. data/app/views/comatose/admin/index.html.erb +34 -0
  25. data/app/views/comatose/admin/new.html.erb +5 -0
  26. data/app/views/comatose/admin/reorder.html.erb +30 -0
  27. data/app/views/comatose/admin/versions.html.erb +40 -0
  28. data/app/views/layouts/application.html.erb +14 -0
  29. data/app/views/layouts/comatose/admin.html.erb +44 -0
  30. data/app/views/layouts/comatose/base.html.erb +14 -0
  31. data/comatose-rubyisbeautiful.gemspec +65 -0
  32. data/config/environment.rb +5 -0
  33. data/config/environments/development.rb +26 -0
  34. data/config/environments/production.rb +49 -0
  35. data/config/environments/test.rb +35 -0
  36. data/config/locales/en.yml +5 -0
  37. data/config.ru +4 -0
  38. data/db/seeds.rb +11 -0
  39. data/lib/comatose/configuration.rb +87 -0
  40. data/lib/comatose/drop.rb +45 -0
  41. data/lib/comatose/engine.rb +28 -0
  42. data/lib/comatose/filters/inline_filter.rb +15 -0
  43. data/lib/comatose/filters/timeago_filter.rb +14 -0
  44. data/lib/comatose/filters/translation_filter.rb +11 -0
  45. data/lib/comatose/locale_constraint.rb +15 -0
  46. data/lib/comatose/logger.rb +10 -0
  47. data/lib/comatose/page_wrapper.rb +147 -0
  48. data/lib/comatose/processing_context.rb +103 -0
  49. data/lib/comatose/routes.rb +70 -0
  50. data/lib/comatose/tasks/admin.rb +57 -0
  51. data/lib/comatose/tasks/data.rb +79 -0
  52. data/lib/comatose/tasks/setup.rb +118 -0
  53. data/lib/comatose/text_filters.rb +148 -0
  54. data/lib/comatose/version.rb +9 -0
  55. data/lib/comatose.rb +88 -0
  56. data/lib/generators/comatose/USAGE +7 -0
  57. data/lib/generators/comatose/comatose_generator.rb +37 -0
  58. data/lib/generators/comatose/templates/comatose.rb +33 -0
  59. data/lib/generators/comatose/templates/migration.erb +32 -0
  60. data/lib/generators/comatose/templates/seeds.erb +2 -0
  61. data/lib/support/class_options.rb +36 -0
  62. data/lib/support/inline_rendering.rb +48 -0
  63. data/lib/support/route_mapper.rb +51 -0
  64. data/lib/tasks/comatose.rake +9 -0
  65. data/lib/text_filters/markdown.rb +14 -0
  66. data/lib/text_filters/markdown_smartypants.rb +15 -0
  67. data/lib/text_filters/none.rb +8 -0
  68. data/lib/text_filters/rdoc.rb +13 -0
  69. data/lib/text_filters/simple.rb +8 -0
  70. data/lib/text_filters/textile.rb +15 -0
  71. data/public/404.html +26 -0
  72. data/public/422.html +26 -0
  73. data/public/500.html +26 -0
  74. data/public/favicon.ico +0 -0
  75. data/public/images/comatose/collapsed.gif +0 -0
  76. data/public/images/comatose/expanded.gif +0 -0
  77. data/public/images/comatose/no-children.gif +0 -0
  78. data/public/images/comatose/page.gif +0 -0
  79. data/public/images/comatose/rails.png +0 -0
  80. data/public/images/comatose/spinner.gif +0 -0
  81. data/public/images/comatose/title-hover-bg.gif +0 -0
  82. data/public/javascripts/comatose/admin.js +406 -0
  83. data/public/javascripts/comatose/application.js +2 -0
  84. data/public/javascripts/comatose/dragdrop.js +974 -0
  85. data/public/javascripts/editor.js +452 -0
  86. data/public/javascripts/jquery/GPL-LICENSE.txt +278 -0
  87. data/public/javascripts/jquery/MIT-LICENSE.txt +20 -0
  88. data/public/javascripts/jquery/README +67 -0
  89. data/public/javascripts/jquery/jquery.js +11 -0
  90. data/public/javascripts/jquery/jquery.ui.draggable.js +1 -0
  91. data/public/javascripts/jquery/jquery.ui.js +1 -0
  92. data/public/javascripts/jquery/jquery.ui.resizable.js +1 -0
  93. data/public/javascripts/jquery/jquery.ui.sortable.js +1 -0
  94. data/public/javascripts/wymeditor/iframe/default/lbl-blockquote.png +0 -0
  95. data/public/javascripts/wymeditor/iframe/default/lbl-h1.png +0 -0
  96. data/public/javascripts/wymeditor/iframe/default/lbl-h2.png +0 -0
  97. data/public/javascripts/wymeditor/iframe/default/lbl-h3.png +0 -0
  98. data/public/javascripts/wymeditor/iframe/default/lbl-h4.png +0 -0
  99. data/public/javascripts/wymeditor/iframe/default/lbl-h5.png +0 -0
  100. data/public/javascripts/wymeditor/iframe/default/lbl-h6.png +0 -0
  101. data/public/javascripts/wymeditor/iframe/default/lbl-p.png +0 -0
  102. data/public/javascripts/wymeditor/iframe/default/lbl-pre.png +0 -0
  103. data/public/javascripts/wymeditor/iframe/default/wymiframe.css +90 -0
  104. data/public/javascripts/wymeditor/iframe/default/wymiframe.html +26 -0
  105. data/public/javascripts/wymeditor/jquery.wymeditor.js +4688 -0
  106. data/public/javascripts/wymeditor/jquery.wymeditor.min.js +1 -0
  107. data/public/javascripts/wymeditor/jquery.wymeditor.pack.js +1 -0
  108. data/public/javascripts/wymeditor/lang/bg.js +45 -0
  109. data/public/javascripts/wymeditor/lang/ca.js +45 -0
  110. data/public/javascripts/wymeditor/lang/cs.js +45 -0
  111. data/public/javascripts/wymeditor/lang/cy.js +45 -0
  112. data/public/javascripts/wymeditor/lang/de.js +45 -0
  113. data/public/javascripts/wymeditor/lang/en.js +45 -0
  114. data/public/javascripts/wymeditor/lang/es.js +45 -0
  115. data/public/javascripts/wymeditor/lang/fa.js +46 -0
  116. data/public/javascripts/wymeditor/lang/fi.js +44 -0
  117. data/public/javascripts/wymeditor/lang/fr.js +45 -0
  118. data/public/javascripts/wymeditor/lang/gl.js +45 -0
  119. data/public/javascripts/wymeditor/lang/he.js +45 -0
  120. data/public/javascripts/wymeditor/lang/hr.js +45 -0
  121. data/public/javascripts/wymeditor/lang/hu.js +45 -0
  122. data/public/javascripts/wymeditor/lang/it.js +45 -0
  123. data/public/javascripts/wymeditor/lang/nb.js +45 -0
  124. data/public/javascripts/wymeditor/lang/nl.js +45 -0
  125. data/public/javascripts/wymeditor/lang/nn.js +45 -0
  126. data/public/javascripts/wymeditor/lang/pl.js +45 -0
  127. data/public/javascripts/wymeditor/lang/pt-br.js +45 -0
  128. data/public/javascripts/wymeditor/lang/pt.js +45 -0
  129. data/public/javascripts/wymeditor/lang/ru.js +45 -0
  130. data/public/javascripts/wymeditor/lang/sv.js +45 -0
  131. data/public/javascripts/wymeditor/lang/tr.js +45 -0
  132. data/public/javascripts/wymeditor/lang/zh_cn.js +47 -0
  133. data/public/javascripts/wymeditor/plugins/embed/jquery.wymeditor.embed.js +52 -0
  134. data/public/javascripts/wymeditor/plugins/fullscreen/icon_fullscreen.gif +0 -0
  135. data/public/javascripts/wymeditor/plugins/fullscreen/jquery.wymeditor.fullscreen.js +127 -0
  136. data/public/javascripts/wymeditor/plugins/hovertools/jquery.wymeditor.hovertools.js +57 -0
  137. data/public/javascripts/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js +91 -0
  138. data/public/javascripts/wymeditor/plugins/resizable/readme.txt +124 -0
  139. data/public/javascripts/wymeditor/plugins/tidy/README +19 -0
  140. data/public/javascripts/wymeditor/plugins/tidy/jquery.wymeditor.tidy.js +82 -0
  141. data/public/javascripts/wymeditor/plugins/tidy/tidy.php +36 -0
  142. data/public/javascripts/wymeditor/plugins/tidy/wand.png +0 -0
  143. data/public/javascripts/wymeditor/skins/compact/icons.png +0 -0
  144. data/public/javascripts/wymeditor/skins/compact/skin.css +134 -0
  145. data/public/javascripts/wymeditor/skins/compact/skin.js +35 -0
  146. data/public/javascripts/wymeditor/skins/default/icons.png +0 -0
  147. data/public/javascripts/wymeditor/skins/default/skin.css +133 -0
  148. data/public/javascripts/wymeditor/skins/default/skin.js +40 -0
  149. data/public/javascripts/wymeditor/skins/minimal/images/bg.header.gif +0 -0
  150. data/public/javascripts/wymeditor/skins/minimal/images/bg.selector.silver.gif +0 -0
  151. data/public/javascripts/wymeditor/skins/minimal/images/bg.wymeditor.png +0 -0
  152. data/public/javascripts/wymeditor/skins/minimal/images/icons.silver.gif +0 -0
  153. data/public/javascripts/wymeditor/skins/minimal/skin.css +131 -0
  154. data/public/javascripts/wymeditor/skins/minimal/skin.js +30 -0
  155. data/public/javascripts/wymeditor/skins/silver/COPYING +674 -0
  156. data/public/javascripts/wymeditor/skins/silver/README +27 -0
  157. data/public/javascripts/wymeditor/skins/silver/images/bg.header.gif +0 -0
  158. data/public/javascripts/wymeditor/skins/silver/images/bg.selector.silver.gif +0 -0
  159. data/public/javascripts/wymeditor/skins/silver/images/bg.wymeditor.png +0 -0
  160. data/public/javascripts/wymeditor/skins/silver/images/icons.silver.gif +0 -0
  161. data/public/javascripts/wymeditor/skins/silver/skin.css +297 -0
  162. data/public/javascripts/wymeditor/skins/silver/skin.js +61 -0
  163. data/public/javascripts/wymeditor/skins/twopanels/icons.png +0 -0
  164. data/public/javascripts/wymeditor/skins/twopanels/skin.css +134 -0
  165. data/public/javascripts/wymeditor/skins/twopanels/skin.js +39 -0
  166. data/public/javascripts/wymeditor/skins/wymeditor_icon.png +0 -0
  167. data/public/javascripts/wymeditor.tar +0 -0
  168. data/public/robots.txt +5 -0
  169. data/public/stylesheets/comatose/admin.css +488 -0
  170. data/public/stylesheets/comatose/base.css +9 -0
  171. data/spec/controllers/comatose/base_controller_spec.rb +14 -0
  172. data/spec/controllers/foos_controller_spec.rb +5 -0
  173. data/spec/helpers/foos_helper_spec.rb +15 -0
  174. data/spec/routing/base_routing_spec.rb +12 -0
  175. data/spec/spec_helper.rb +27 -0
  176. data/test/behaviors.rb +106 -0
  177. data/test/fixtures/comatose_pages.yml +96 -0
  178. data/test/functional/comatose_admin_controller_test.rb +114 -0
  179. data/test/functional/comatose_controller_test.rb +45 -0
  180. data/test/integration/comatose_routing_test.rb +17 -0
  181. data/test/javascripts/test.html +26 -0
  182. data/test/javascripts/test_runner.js +307 -0
  183. data/test/old_test_helper.rb +43 -0
  184. data/test/performance/browsing_test.rb +9 -0
  185. data/test/test_helper.rb +13 -0
  186. data/test/unit/class_options_test.rb +52 -0
  187. data/test/unit/comatose_page_test.rb +128 -0
  188. data/test/unit/processing_context_test.rb +108 -0
  189. data/test/unit/text_filters_test.rb +52 -0
  190. data.tar.gz.sig +1 -0
  191. metadata +379 -0
  192. metadata.gz.sig +0 -0
@@ -0,0 +1,148 @@
1
+ require 'support/class_options'
2
+ module Comatose
3
+ class TextFilters
4
+
5
+ define_option :default_processor, :erb
6
+ define_option :default_filter, :none
7
+ define_option :logger, Comatose.logger
8
+
9
+ @registered_filters = { }
10
+ @registered_titles = { }
11
+
12
+ attr_reader :name
13
+ attr_reader :title
14
+
15
+
16
+ def initialize(name, title)
17
+ @name = name
18
+ @title = title
19
+ end
20
+
21
+
22
+ # The default create_link method...
23
+ # Override for your specific filter, if needed, in the #define block
24
+ def create_link(title, url)
25
+ %Q|<a href="#{url}">#{title}</a>|
26
+ end
27
+
28
+
29
+ # Process the text with using the specified context
30
+ def process_text(text, context, processor=TextFilters.default_processor)
31
+ processed_text = nil
32
+ #Comatose.logger.debug "text before process: #{text}"
33
+ case
34
+ when processor == :erb
35
+ processed_text = process_with_erb(text, context)
36
+ when processor == :liquid
37
+ processed_text = process_with_liquid(text, context)
38
+ else
39
+ raise "Unknown Text Processor '#{processor.to_s}'"
40
+ end
41
+ #Comatose.logger.debug "text after process: #{processed_text}"
42
+ return processed_text
43
+ end
44
+
45
+
46
+ class << self
47
+ private :new
48
+ attr_reader :registered_filters
49
+ attr_reader :registered_titles
50
+
51
+ # Use this to create and register your TextFilters
52
+ def define(name, title, &block)
53
+ begin
54
+ p = new(name, title)
55
+ p.instance_eval(&block)
56
+ if p.respond_to? :render_text
57
+ registered_titles[title] = name
58
+ registered_filters[name] = p
59
+ else
60
+ raise "#render_text isn't implemented in this class"
61
+ end
62
+ rescue LoadError
63
+ #Comatose.logger.debug "Filter '#{name}' was not included: #{$!}" unless TextFilters.logger.nil?
64
+ rescue
65
+ #Comatose.logger.debug "Filter '#{name}' was not included: #{$!}" unless TextFilters.logger.nil?
66
+ end
67
+ end
68
+
69
+
70
+ def get_filter(name)
71
+ #Comatose.logger.debug "get_filter: #{name}"
72
+ name = TextFilters.default_filter if name.nil?
73
+ name = registered_titles[name] if name.is_a? String
74
+ registered_filters[name]
75
+ end
76
+
77
+
78
+ def [](name)
79
+ get_filter(name)
80
+ end
81
+
82
+
83
+ def all
84
+ registered_filters
85
+ end
86
+
87
+
88
+ def all_titles
89
+ registered_titles.keys
90
+ end
91
+
92
+
93
+ def render_text(text, name=nil)
94
+ get_filter(name).render_text(text)
95
+ end
96
+
97
+
98
+ def process_text(text, context=nil, name=nil, processor=nil)
99
+ get_filter(name).process_text(text, context, processor)
100
+ end
101
+
102
+
103
+ # Call
104
+ def transform(text, context=nil, name=nil, processor=nil)
105
+ #Comatose.logger.debug "transform with text #{text}"
106
+ #Comatose.logger.debug "transform with context #{context}"
107
+ #Comatose.logger.debug "transform with name #{name}"
108
+ #Comatose.logger.debug "transform with processor #{processor}"
109
+ render_text process_text(text, context, name, processor), name
110
+ end
111
+ end
112
+
113
+ private
114
+
115
+ # This is an instance method so that it won't puke on requiring
116
+ # a non-existant library until it's being registered -- the only
117
+ # place I can really capture the LoadError
118
+ def require(name)
119
+ Kernel.require name
120
+ end
121
+
122
+
123
+
124
+ def process_with_erb(text, context)
125
+ Comatose.logger.debug "process erb before: #{text}"
126
+ output = ERB.new(text).result(context.get_binding)
127
+ Comatose.logger.debug "process erb after: #{output}"
128
+ return output
129
+ rescue => e
130
+ Comatose.logger.debug e.backtrace.join("\n")
131
+ raise "ERB Error: #{$!}"
132
+ end
133
+
134
+
135
+
136
+ def process_with_liquid(text, context={})
137
+ #Comatose.logger.debug "process liquid before: text: #{text}"
138
+ #Comatose.logger.debug "process liquid before: context: #{context}"
139
+ #context = context.stringify_keys if context.respond_to? :stringify_keys
140
+ Liquid::Template.parse(text).render(context)
141
+ rescue => e
142
+ Comatose.logger.debug e.backtrace.join("\n")
143
+ raise "Liquid Error: #{$!}"
144
+ end
145
+
146
+
147
+ end
148
+ end
@@ -0,0 +1,9 @@
1
+ module Comatose
2
+ VERSION = "3.0.0"
3
+ VERSION_STRING = "#{VERSION} (beta)"
4
+
5
+ def self.version
6
+ VERSION
7
+ end
8
+
9
+ end
data/lib/comatose.rb ADDED
@@ -0,0 +1,88 @@
1
+ require 'acts_as_versioned'
2
+ require 'acts_as_list'
3
+ require 'acts_as_tree_rails3'
4
+ require 'redcloth'
5
+ require 'liquid'
6
+ require 'i18n'
7
+
8
+
9
+ require 'comatose/logger'
10
+
11
+ module Comatose
12
+
13
+ class <<self
14
+
15
+ def logger
16
+ comatose_logger = nil
17
+ begin
18
+ comatose_logger = Rails.logger
19
+ rescue
20
+ end
21
+
22
+ if comatose_logger.blank?
23
+ comatose_logger = Comatose::Logger.new(File.join(self.root, 'comatose.log'))
24
+ comatose_logger.level = Logger::DEBUG
25
+ comatose_logger.formatter = Logger::Formatter.new
26
+ end
27
+ return comatose_logger
28
+ end
29
+
30
+
31
+ def gem_root
32
+ gem_root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
33
+ end
34
+
35
+
36
+ def root
37
+ comatose_root = nil
38
+ begin
39
+ comatose_root = Rails.root
40
+ rescue
41
+ end
42
+
43
+ if comatose_root.blank?
44
+ comatose_root = Comatose.gem_root
45
+ end
46
+ return comatose_root
47
+ end
48
+
49
+ end
50
+
51
+ class ConfigurationError < StandardError; end
52
+
53
+ end
54
+
55
+ require 'comatose/engine'
56
+ require 'comatose/locale_constraint'
57
+ require 'comatose/routes'
58
+
59
+ require 'support/class_options'
60
+
61
+ require 'comatose/configuration'
62
+ require 'comatose/drop'
63
+ require 'comatose/page_wrapper'
64
+ require 'comatose/processing_context'
65
+ require 'comatose/text_filters'
66
+ require 'comatose/version'
67
+
68
+ require 'support/inline_rendering'
69
+
70
+ Dir[File.join(File.dirname(__FILE__), 'text_filters', '*.rb')].each do |path|
71
+ require "text_filters/#{File.basename(path)}"
72
+ end
73
+
74
+ Dir[File.join(File.dirname(__FILE__), 'comatose/filters', '*.rb')].each do |path|
75
+ require "comatose/filters/#{File.basename(path)}"
76
+ end
77
+
78
+
79
+
80
+
81
+ #require 'support/route_mapper'
82
+ #
83
+ #
84
+ #
85
+ ## BCT - TODO: some hook into the greater Rails events it seems
86
+ ##::Dispatcher.to_prepare :comatose do
87
+ # Comatose.config.after_setup.call
88
+ ##end
@@ -0,0 +1,7 @@
1
+ Description:
2
+ The comatose generator creates a migration for the comatose model and adds routes.
3
+
4
+ The generator creates a migration class in db/migrate.
5
+
6
+ Example:
7
+ ./script/generate comatose
@@ -0,0 +1,37 @@
1
+ require 'rails/generators/base'
2
+ require 'rails/generators/active_record'
3
+ require 'rails/generators/migration'
4
+
5
+ module Comatose
6
+ module Generators
7
+ class ComatoseGenerator < Rails::Generators::NamedBase
8
+
9
+ namespace :comatose
10
+ source_root File.expand_path("../templates", __FILE__)
11
+
12
+ include Rails::Generators::Migration
13
+ extend ActiveRecord::Generators::Migration
14
+
15
+
16
+ def create_migration_file
17
+ migration_template "migration.erb", "db/migrate/add_comatose_support.rb"
18
+ end
19
+
20
+
21
+ def create_init_file
22
+ template "comatose.rb", "config/initializers/comatose.rb"
23
+ end
24
+
25
+
26
+ def copy_rake_files
27
+ # TODO
28
+ end
29
+
30
+
31
+ def copy_assets
32
+ # TODO
33
+ end
34
+
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,33 @@
1
+ Comatose.configure do |config|
2
+ config.admin_title = 'Comatose'
3
+ config.admin_includes = []
4
+ config.admin_helpers = []
5
+ config.admin_sub_title = 'The Micro CMS'
6
+ config.content_type = 'utf-8'
7
+ config.default_filter = 'None'
8
+ config.default_processor = :erb
9
+ config.default_tree_level = 2
10
+ config.disable_caching = false
11
+ config.hidden_meta_fields = []
12
+ config.helpers = []
13
+ config.includes = []
14
+ config.allow_import_export = true
15
+ end
16
+
17
+ class Hash
18
+ # Having the method_missing catchall in conjunction with get_binding
19
+ # allows us to use the hash as a Context for ERB
20
+ def method_missing(meth, *arg)
21
+ if self.has_key? meth.to_s
22
+ self[meth.to_s]
23
+ else
24
+ super
25
+ end
26
+ end
27
+
28
+
29
+ # Gets the binding object for use with ERB
30
+ def get_binding
31
+ binding
32
+ end
33
+ end
@@ -0,0 +1,32 @@
1
+ # class Comatose::Page < ActiveRecord::Base
2
+ # set_table_name 'comatose_pages'
3
+ # acts_as_versioned :table_name =>'comatose_page_versions', :if_changed => [ :title, :slug, :keywords, :body ]
4
+ # end
5
+
6
+ class AddComatoseSupport < ActiveRecord::Migration
7
+
8
+ # Schema for Comatose version 3.0.0+
9
+ def self.up
10
+ create_table :comatose_pages do |t|
11
+ t.integer "parent_id"
12
+ t.text "full_path", :default => ''
13
+ t.string "title", :limit => 255
14
+ t.string "slug", :limit => 255
15
+ t.string "keywords", :limit => 255
16
+ t.string "layout"
17
+ t.text "body"
18
+ t.string "filter_type", :limit => 25, :default => "Textile"
19
+ t.string "author", :limit => 255
20
+ t.integer "position", :default => 0
21
+ t.integer "version"
22
+ t.timestamps
23
+ end
24
+
25
+ Comatose::Page.create_versioned_table rescue "Skipping Comatose::Page.create_versioned_table"
26
+ end
27
+
28
+ def self.down
29
+ Comatose::Page.drop_versioned_table rescue "Skipping Comatose::Page.drop_versioned_table"
30
+ drop_table :comatose_pages
31
+ end
32
+ end
@@ -0,0 +1,2 @@
1
+ puts "Creating the default 'Home Page'..."
2
+ Comatose::Page.create( :title=>'Home Page', :body=>"h1. Welcome\n\nYour content goes here...", :author=>'System' )
@@ -0,0 +1,36 @@
1
+ class Class
2
+ def define_option(name, default=nil)
3
+ sym = name.to_sym
4
+ cattr_reader(sym)
5
+ cattr_writer(sym)
6
+ send("#{name.to_s}=", default)
7
+ end
8
+
9
+ def blockable_attr_accessor(sym)
10
+ module_eval(<<-EVAL, __FILE__, __LINE__)
11
+ def #{sym}(&block)
12
+ if block_given?
13
+ @#{sym} = block
14
+ else
15
+ @#{sym}
16
+ end
17
+ end
18
+ def #{sym}=(value)
19
+ @#{sym} = value
20
+ end
21
+ EVAL
22
+ end
23
+ end
24
+
25
+ class Module
26
+ def attr_accessor_with_default(sym, default = nil, &block)
27
+ raise 'Default value or block required' unless !default.nil? || block
28
+ define_method(sym, block_given? ? block : Proc.new { default })
29
+ module_eval(<<-EVAL, __FILE__, __LINE__)
30
+ def #{sym}=(value)
31
+ class << self; attr_reader :#{sym} end
32
+ @#{sym} = value
33
+ end
34
+ EVAL
35
+ end
36
+ end
@@ -0,0 +1,48 @@
1
+ # Extends the view to support rendering inline comatose pages...
2
+ ActionView::Base.class_eval do
3
+ alias_method :render_otherwise, :render
4
+
5
+ def render(options = {}, old_local_assigns = {}, &block) #:nodoc:
6
+ if options.is_a?(Hash) && page_name = options.delete(:comatose)
7
+ render_comatose(page_name, options[:params] || options)
8
+ else
9
+ render_otherwise(options, old_local_assigns, &block)
10
+ end
11
+ end
12
+
13
+ def render_comatose(page_path, params = {})
14
+ params = {
15
+ :silent => false,
16
+ :use_cache => true,
17
+ :locals => {}
18
+ }.merge(params)
19
+ if params[:use_cache] and params[:locals].empty?
20
+ render_cached_comatose_page(page_path, params)
21
+ else
22
+ render_comatose_page(page_path, params)
23
+ end
24
+ end
25
+
26
+ protected
27
+
28
+ def render_cached_comatose_page(page_path, params)
29
+ key = page_path.gsub(/\//, '+')
30
+ unless html = controller.read_fragment(key)
31
+ html = render_comatose_page( page_path, params )
32
+ controller.write_fragment(key, html) unless Comatose.config.disable_caching
33
+ end
34
+ html
35
+ end
36
+
37
+ def render_comatose_page(page_path, params)
38
+ if page = Comatose::Page.find_by_path(page_path)
39
+ # Add the request params to the context...
40
+ params[:locals]['params'] = controller.params
41
+ html = page.to_html( params[:locals] )
42
+ else
43
+ html = params[:silent] ? '' : "<p><tt>#{page_path}</tt> not found</p>"
44
+ end
45
+ end
46
+
47
+ end
48
+
@@ -0,0 +1,51 @@
1
+ #class ActionController::Routing::RouteSet::Mapper
2
+ #
3
+ # # For mounting a page to a path
4
+ # def comatose_root(path, options={ })
5
+ # opts = {
6
+ # :index => '',
7
+ # :layout => 'base.html.erb',
8
+ # :use_cache => 'true',
9
+ # :cache_path => nil,
10
+ # :named_route => nil
11
+ # }.merge(options)
12
+ # # Ensure the controller is aware of the mount point...
13
+ # Comatose.add_mount_point(path, opts)
14
+ # # Add the route...
15
+ # opts[:controller] = 'comatose'
16
+ # opts[:action] ='show'
17
+ # route_name = opts.delete(:named_route)
18
+ # unless route_name.nil?
19
+ # named_route(route_name, "#{path}/*page", opts)
20
+ # else
21
+ # if opts[:index] == '' # if it maps to the root site URI, name it comatose_root
22
+ # named_route('comatose_root', "#{path}/*page", opts)
23
+ # else
24
+ # connect("#{path}/*page", opts)
25
+ # end
26
+ # end
27
+ # end
28
+ #
29
+ #
30
+ # # For mounting the admin
31
+ # def comatose_admin(path='comatose_admin', options={ })
32
+ # opts = {
33
+ # :controller => 'comatose_admin',
34
+ # :named_route => 'comatose_admin'
35
+ # }.merge(options)
36
+ # route_name = opts.delete(:named_route)
37
+ # named_route(route_name, "#{path}/:action/:id", opts)
38
+ # end
39
+ #
40
+ #
41
+ # def method_missing(name, *args, &proc)
42
+ # if name.to_s.starts_with?('comatose_')
43
+ # opts = (args.last.is_a?(Hash)) ? args.pop : { }
44
+ # opts[:named_route] = name.to_s #[9..-1]
45
+ # comatose_root(*(args << opts))
46
+ # else
47
+ # super unless args.length >= 1 && proc.nil?
48
+ # #Rails.routes.add_named_route(name, *args)
49
+ # end
50
+ # end
51
+ #end
@@ -0,0 +1,9 @@
1
+ begin
2
+ require 'comatose/version'
3
+ rescue LoadError
4
+ $: << File.join(File.dirname(__FILE__), '..', 'lib')
5
+ end
6
+
7
+ require 'comatose/tasks/admin'
8
+ require 'comatose/tasks/setup'
9
+ require 'comatose/tasks/data'
@@ -0,0 +1,14 @@
1
+ #
2
+ # MARKDOWN
3
+ #
4
+ Comatose::TextFilters.define :markdown, "Markdown" do
5
+ require 'bluecloth'
6
+
7
+ def render_text(text)
8
+ BlueCloth.new(text).to_html
9
+ end
10
+
11
+ def create_link(title, url)
12
+ "[#{title}](#{url})"
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ #
2
+ # MARKDOWN + SMARTYPANTS
3
+ #
4
+ Comatose::TextFilters.define :markdown_smartypants, "Markdown + SmartyPants" do
5
+ require 'bluecloth'
6
+ require 'rubypants'
7
+
8
+ def render_text(text)
9
+ RubyPants.new( BlueCloth.new(text).to_html ).to_html
10
+ end
11
+
12
+ def create_link(title, url)
13
+ "[#{title}](#{url})"
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ #
2
+ # NONE
3
+ #
4
+ Comatose::TextFilters.define :none, "[No Filter]" do
5
+ def render_text(text)
6
+ text
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ #
2
+ # RDOC
3
+ #
4
+ Comatose::TextFilters.define :rdoc, "RDoc" do
5
+ require 'rdoc/markup/simple_markup'
6
+ require 'rdoc/markup/simple_markup/to_html'
7
+
8
+ def render_text(text)
9
+ p = SM::SimpleMarkup.new
10
+ h = SM::ToHtml.new
11
+ p.convert(text, h)
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ #
2
+ # SIMPLE
3
+ #
4
+ Comatose::TextFilters.define :simple, "Simple" do
5
+ def render_text(text)
6
+ text.gsub("\n", '<br/>')
7
+ end
8
+ end
@@ -0,0 +1,15 @@
1
+ #
2
+ # TEXTILE
3
+ #
4
+ Comatose::TextFilters.define :textile, "Textile" do
5
+ require 'redcloth'
6
+
7
+ def render_text(text)
8
+ RedCloth.new(text).to_html(:refs_markdown, :textile, :markdown)
9
+ end
10
+
11
+ def create_link(title, url)
12
+ %Q|"#{title}":#{url}|
13
+ end
14
+
15
+ end
data/public/404.html ADDED
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/404.html -->
21
+ <div class="dialog">
22
+ <h1>The page you were looking for doesn't exist.</h1>
23
+ <p>You may have mistyped the address or the page may have moved.</p>
24
+ </div>
25
+ </body>
26
+ </html>
data/public/422.html ADDED
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/422.html -->
21
+ <div class="dialog">
22
+ <h1>The change you wanted was rejected.</h1>
23
+ <p>Maybe you tried to change something you didn't have access to.</p>
24
+ </div>
25
+ </body>
26
+ </html>
data/public/500.html ADDED
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/500.html -->
21
+ <div class="dialog">
22
+ <h1>We're sorry, but something went wrong.</h1>
23
+ <p>We've been notified about this issue and we'll take a look at it shortly.</p>
24
+ </div>
25
+ </body>
26
+ </html>
File without changes
Binary file
Binary file