lucy_cms 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 (245) hide show
  1. data/Gemfile +19 -0
  2. data/Gemfile.lock +88 -0
  3. data/LICENSE +24 -0
  4. data/README.md +161 -0
  5. data/Rakefile +26 -0
  6. data/VERSION +1 -0
  7. data/app/controllers/application_controller.rb +5 -0
  8. data/app/controllers/cms_admin/base_controller.rb +43 -0
  9. data/app/controllers/cms_admin/layouts_controller.rb +66 -0
  10. data/app/controllers/cms_admin/pages_controller.rb +111 -0
  11. data/app/controllers/cms_admin/sessions_controller.rb +25 -0
  12. data/app/controllers/cms_admin/sites_controller.rb +69 -0
  13. data/app/controllers/cms_admin/snippets_controller.rb +62 -0
  14. data/app/controllers/cms_admin/upload_dirs_controller.rb +79 -0
  15. data/app/controllers/cms_admin/users_controller.rb +129 -0
  16. data/app/controllers/cms_content_controller.rb +51 -0
  17. data/app/models/cms_block.rb +28 -0
  18. data/app/models/cms_layout.rb +118 -0
  19. data/app/models/cms_page.rb +163 -0
  20. data/app/models/cms_site.rb +38 -0
  21. data/app/models/cms_snippet.rb +70 -0
  22. data/app/models/cms_upload.rb +19 -0
  23. data/app/models/cms_upload_dir.rb +11 -0
  24. data/app/models/cms_user.rb +93 -0
  25. data/app/views/cms_admin/layouts/_form.html.erb +10 -0
  26. data/app/views/cms_admin/layouts/_index_branch.html.erb +24 -0
  27. data/app/views/cms_admin/layouts/edit.html.erb +6 -0
  28. data/app/views/cms_admin/layouts/index.html.erb +6 -0
  29. data/app/views/cms_admin/layouts/new.html.erb +6 -0
  30. data/app/views/cms_admin/pages/_form.html.erb +37 -0
  31. data/app/views/cms_admin/pages/_form_blocks.html.erb +7 -0
  32. data/app/views/cms_admin/pages/_index_branch.html.erb +40 -0
  33. data/app/views/cms_admin/pages/edit.html.erb +5 -0
  34. data/app/views/cms_admin/pages/form_blocks.js.erb +2 -0
  35. data/app/views/cms_admin/pages/index.html.erb +6 -0
  36. data/app/views/cms_admin/pages/new.html.erb +5 -0
  37. data/app/views/cms_admin/pages/toggle_branch.js.erb +11 -0
  38. data/app/views/cms_admin/sessions/new.html.erb +12 -0
  39. data/app/views/cms_admin/sites/_form.html.erb +16 -0
  40. data/app/views/cms_admin/sites/edit.html.erb +6 -0
  41. data/app/views/cms_admin/sites/new.html.erb +6 -0
  42. data/app/views/cms_admin/sites/setup.html.erb +16 -0
  43. data/app/views/cms_admin/snippets/_form.html.erb +4 -0
  44. data/app/views/cms_admin/snippets/edit.html.erb +6 -0
  45. data/app/views/cms_admin/snippets/index.html.erb +23 -0
  46. data/app/views/cms_admin/snippets/new.html.erb +6 -0
  47. data/app/views/cms_admin/upload_dirs/_file.html.erb +15 -0
  48. data/app/views/cms_admin/upload_dirs/_form.html.erb +2 -0
  49. data/app/views/cms_admin/upload_dirs/conflict.html.erb +12 -0
  50. data/app/views/cms_admin/upload_dirs/index.html.erb +23 -0
  51. data/app/views/cms_admin/upload_dirs/new.html.erb +6 -0
  52. data/app/views/cms_admin/upload_dirs/show.html.erb +26 -0
  53. data/app/views/cms_admin/upload_dirs/uploads_destroy.js.erb +3 -0
  54. data/app/views/cms_admin/users/_form.html.erb +9 -0
  55. data/app/views/cms_admin/users/_index_branch.html.erb +16 -0
  56. data/app/views/cms_admin/users/change_password.html.erb +14 -0
  57. data/app/views/cms_admin/users/edit.html.erb +17 -0
  58. data/app/views/cms_admin/users/index.html.erb +6 -0
  59. data/app/views/cms_admin/users/new.html.erb +14 -0
  60. data/app/views/layouts/cms_admin.html.erb +52 -0
  61. data/config/application.rb +48 -0
  62. data/config/boot.rb +13 -0
  63. data/config/database.yml +22 -0
  64. data/config/environment.rb +5 -0
  65. data/config/environments/development.rb +22 -0
  66. data/config/environments/production.rb +49 -0
  67. data/config/environments/test.rb +35 -0
  68. data/config/initializers/LucyCMS.rb +37 -0
  69. data/config/initializers/mime_types.rb +5 -0
  70. data/config/locales/en.yml +5 -0
  71. data/config/routes.rb +45 -0
  72. data/config.ru +4 -0
  73. data/db/cms_seeds/example.local/layouts/default.yml +8 -0
  74. data/db/cms_seeds/example.local/layouts/nested.yml +6 -0
  75. data/db/cms_seeds/example.local/pages/child/subchild.yml +14 -0
  76. data/db/cms_seeds/example.local/pages/child.yml +10 -0
  77. data/db/cms_seeds/example.local/pages/index.yml +11 -0
  78. data/db/cms_seeds/example.local/snippets/example.yml +4 -0
  79. data/db/migrate/01_create_cms.rb +114 -0
  80. data/db/seeds.rb +7 -0
  81. data/lib/LucyCMS/acts_as_tree.rb +102 -0
  82. data/lib/LucyCMS/cms_tag/field_datetime.rb +26 -0
  83. data/lib/LucyCMS/cms_tag/field_integer.rb +26 -0
  84. data/lib/LucyCMS/cms_tag/field_string.rb +26 -0
  85. data/lib/LucyCMS/cms_tag/field_text.rb +26 -0
  86. data/lib/LucyCMS/cms_tag/helper.rb +20 -0
  87. data/lib/LucyCMS/cms_tag/page_datetime.rb +22 -0
  88. data/lib/LucyCMS/cms_tag/page_integer.rb +22 -0
  89. data/lib/LucyCMS/cms_tag/page_rich_text.rb +22 -0
  90. data/lib/LucyCMS/cms_tag/page_string.rb +22 -0
  91. data/lib/LucyCMS/cms_tag/page_text.rb +22 -0
  92. data/lib/LucyCMS/cms_tag/partial.rb +21 -0
  93. data/lib/LucyCMS/cms_tag/snippet.rb +22 -0
  94. data/lib/LucyCMS/cms_tag.rb +119 -0
  95. data/lib/LucyCMS/configuration.rb +36 -0
  96. data/lib/LucyCMS/controller_methods.rb +42 -0
  97. data/lib/LucyCMS/engine.rb +12 -0
  98. data/lib/LucyCMS/form_builder.rb +129 -0
  99. data/lib/LucyCMS/rails_extensions.rb +22 -0
  100. data/lib/LucyCMS/site_form_builder.rb +129 -0
  101. data/lib/LucyCMS/view_hooks.rb +30 -0
  102. data/lib/LucyCMS/view_methods.rb +68 -0
  103. data/lib/LucyCMS.rb +40 -0
  104. data/lib/generators/README +17 -0
  105. data/lib/generators/cms_generator.rb +44 -0
  106. data/lib/tasks/LucyCMS.rake +283 -0
  107. data/lucy_cms.gemspec +100 -0
  108. data/public/404.html +26 -0
  109. data/public/422.html +26 -0
  110. data/public/500.html +26 -0
  111. data/public/favicon.ico +0 -0
  112. data/public/images/LucyCMS/arrow_bottom.gif +0 -0
  113. data/public/images/LucyCMS/arrow_right.gif +0 -0
  114. data/public/images/LucyCMS/icon_folder.png +0 -0
  115. data/public/images/LucyCMS/icon_layout.gif +0 -0
  116. data/public/images/LucyCMS/icon_move.gif +0 -0
  117. data/public/images/LucyCMS/icon_regular.gif +0 -0
  118. data/public/images/LucyCMS/icon_snippet.gif +0 -0
  119. data/public/images/LucyCMS/icon_upload.png +0 -0
  120. data/public/images/LucyCMS/icon_user.jpg +0 -0
  121. data/public/javascripts/LucyCMS/cms.js +204 -0
  122. data/public/javascripts/LucyCMS/codemirror/codemirror.css +102 -0
  123. data/public/javascripts/LucyCMS/codemirror/codemirror.js +23 -0
  124. data/public/javascripts/LucyCMS/codemirror/codemirror_base.js +88 -0
  125. data/public/javascripts/LucyCMS/codemirror/parse_css.js +4 -0
  126. data/public/javascripts/LucyCMS/codemirror/parse_html_mixed.js +3 -0
  127. data/public/javascripts/LucyCMS/codemirror/parse_js.js +12 -0
  128. data/public/javascripts/LucyCMS/codemirror/parse_xml.js +7 -0
  129. data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  130. data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  131. data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  132. data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  133. data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  134. data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  135. data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  136. data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  137. data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_222222_256x240.png +0 -0
  138. data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_2e83ff_256x240.png +0 -0
  139. data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_454545_256x240.png +0 -0
  140. data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_888888_256x240.png +0 -0
  141. data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_cd0a0a_256x240.png +0 -0
  142. data/public/javascripts/LucyCMS/jquery-ui/jquery-ui.css +362 -0
  143. data/public/javascripts/LucyCMS/jquery-ui/jquery-ui.js +190 -0
  144. data/public/javascripts/LucyCMS/jquery.js +154 -0
  145. data/public/javascripts/LucyCMS/plupload/plupload.full.min.js +1 -0
  146. data/public/javascripts/LucyCMS/plupload/plupload.html5.min.js +1 -0
  147. data/public/javascripts/LucyCMS/plupload/plupload.min.js +1 -0
  148. data/public/javascripts/LucyCMS/rails.js +132 -0
  149. data/public/javascripts/LucyCMS/tiny_mce/jquery.tinymce.js +1 -0
  150. data/public/javascripts/LucyCMS/tiny_mce/langs/en.js +170 -0
  151. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/about.htm +54 -0
  152. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/anchor.htm +26 -0
  153. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/charmap.htm +52 -0
  154. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/color_picker.htm +73 -0
  155. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/editor_template.js +1 -0
  156. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/image.htm +80 -0
  157. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
  158. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/img/icons.gif +0 -0
  159. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/about.js +72 -0
  160. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/anchor.js +37 -0
  161. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/charmap.js +335 -0
  162. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/color_picker.js +253 -0
  163. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/image.js +245 -0
  164. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/link.js +156 -0
  165. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/source_editor.js +56 -0
  166. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/langs/en.js +62 -0
  167. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/langs/en_dlg.js +51 -0
  168. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/link.htm +58 -0
  169. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/content.css +36 -0
  170. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/dialog.css +117 -0
  171. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
  172. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
  173. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
  174. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
  175. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
  176. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
  177. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/ui.css +213 -0
  178. data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/source_editor.htm +25 -0
  179. data/public/javascripts/LucyCMS/tiny_mce/tiny_mce.js +1 -0
  180. data/public/javascripts/LucyCMS/tiny_mce/tiny_mce_popup.js +5 -0
  181. data/public/robots.txt +5 -0
  182. data/public/stylesheets/LucyCMS/content.css +196 -0
  183. data/public/stylesheets/LucyCMS/form.css +125 -0
  184. data/public/stylesheets/LucyCMS/reset.css +1 -0
  185. data/public/stylesheets/LucyCMS/site_form.css +82 -0
  186. data/public/stylesheets/LucyCMS/structure.css +125 -0
  187. data/public/stylesheets/LucyCMS/typography.css +25 -0
  188. data/script/rails +6 -0
  189. data/test/cms_seeds/test.host/layouts/broken.yml +1 -0
  190. data/test/cms_seeds/test.host/layouts/default.yml +3 -0
  191. data/test/cms_seeds/test.host/layouts/nested.yml +4 -0
  192. data/test/cms_seeds/test.host/pages/broken.yml +1 -0
  193. data/test/cms_seeds/test.host/pages/child/subchild.yml +10 -0
  194. data/test/cms_seeds/test.host/pages/child.yml +10 -0
  195. data/test/cms_seeds/test.host/pages/index.yml +10 -0
  196. data/test/cms_seeds/test.host/snippets/broken.yml +1 -0
  197. data/test/cms_seeds/test.host/snippets/default.yml +3 -0
  198. data/test/fixtures/cms_blocks.yml +12 -0
  199. data/test/fixtures/cms_layouts.yml +36 -0
  200. data/test/fixtures/cms_pages.yml +39 -0
  201. data/test/fixtures/cms_sites.yml +3 -0
  202. data/test/fixtures/cms_snippets.yml +5 -0
  203. data/test/fixtures/cms_upload_dirs.yml +9 -0
  204. data/test/fixtures/cms_uploads.yml +4 -0
  205. data/test/fixtures/cms_users.yml +11 -0
  206. data/test/fixtures/files/invalid_file.gif +9 -0
  207. data/test/fixtures/files/valid_image.jpg +0 -0
  208. data/test/fixtures/views/_nav_hook.html.erb +1 -0
  209. data/test/fixtures/views/_nav_hook_2.html.erb +1 -0
  210. data/test/functional/cms_admin/layouts_controller_test.rb +103 -0
  211. data/test/functional/cms_admin/pages_controller_test.rb +334 -0
  212. data/test/functional/cms_admin/sites_controller_test.rb +99 -0
  213. data/test/functional/cms_admin/snippets_controller_test.rb +102 -0
  214. data/test/functional/cms_admin/uploads_controller_test.rb +26 -0
  215. data/test/functional/cms_content_controller_test.rb +134 -0
  216. data/test/integration/rake_tasks_test.rb +65 -0
  217. data/test/integration/render_cms_seed_test.rb +34 -0
  218. data/test/integration/render_cms_test.rb +81 -0
  219. data/test/integration/sites_test.rb +63 -0
  220. data/test/integration/view_hooks_test.rb +33 -0
  221. data/test/test_helper.rb +86 -0
  222. data/test/unit/cms_block_test.rb +43 -0
  223. data/test/unit/cms_configuration_test.rb +17 -0
  224. data/test/unit/cms_layout_test.rb +146 -0
  225. data/test/unit/cms_page_test.rb +257 -0
  226. data/test/unit/cms_site_test.rb +41 -0
  227. data/test/unit/cms_snippet_test.rb +77 -0
  228. data/test/unit/cms_tag_test.rb +206 -0
  229. data/test/unit/cms_tags/field_datetime_test.rb +34 -0
  230. data/test/unit/cms_tags/field_integer_test.rb +33 -0
  231. data/test/unit/cms_tags/field_string_test.rb +34 -0
  232. data/test/unit/cms_tags/field_text_test.rb +32 -0
  233. data/test/unit/cms_tags/helper_test.rb +38 -0
  234. data/test/unit/cms_tags/page_datetime_test.rb +34 -0
  235. data/test/unit/cms_tags/page_integer_test.rb +33 -0
  236. data/test/unit/cms_tags/page_rich_text.rb +33 -0
  237. data/test/unit/cms_tags/page_string_test.rb +33 -0
  238. data/test/unit/cms_tags/page_text_test.rb +34 -0
  239. data/test/unit/cms_tags/partial_test.rb +44 -0
  240. data/test/unit/cms_tags/snippet_test.rb +33 -0
  241. data/test/unit/cms_upload_dir_test.rb +8 -0
  242. data/test/unit/cms_upload_test.rb +26 -0
  243. data/test/unit/cms_user_test.rb +8 -0
  244. data/test/unit/view_methods_test.rb +21 -0
  245. metadata +488 -0
@@ -0,0 +1,102 @@
1
+ module LucyCMS::ActsAsTree
2
+
3
+ def self.included(base)
4
+ base.extend(ClassMethods)
5
+ end
6
+
7
+ module ClassMethods
8
+ def acts_as_tree(options = {})
9
+ configuration = {
10
+ :foreign_key => 'parent_id',
11
+ :order => nil,
12
+ :counter_cache => nil,
13
+ :dependent => :destroy,
14
+ :touch => false }
15
+ configuration.update(options) if options.is_a?(Hash)
16
+
17
+ belongs_to :parent,
18
+ :class_name => name,
19
+ :foreign_key => configuration[:foreign_key],
20
+ :counter_cache => configuration[:counter_cache],
21
+ :touch => configuration[:touch]
22
+
23
+ has_many :children,
24
+ :class_name => name,
25
+ :foreign_key => configuration[:foreign_key],
26
+ :order => configuration[:order],
27
+ :dependent => configuration[:dependent]
28
+
29
+ class_eval <<-EOV
30
+ include LucyCMS::ActsAsTree::InstanceMethods
31
+
32
+ scope :roots,
33
+ :conditions => "#{configuration[:foreign_key]} IS NULL",
34
+ :order => #{configuration[:order].nil? ? "nil" : %Q{"#{configuration[:order]}"}}
35
+
36
+ def self.root
37
+ roots.first
38
+ end
39
+
40
+ validates_each "#{configuration[:foreign_key]}" do |record, attr, value|
41
+ if value
42
+ if record.id == value
43
+ record.errors.add attr, "cannot be it's own id"
44
+ elsif record.descendants.map {|c| c.id}.include?(value)
45
+ record.errors.add attr, "cannot be a descendant's id"
46
+ end
47
+ end
48
+ end
49
+
50
+ EOV
51
+ end
52
+ end
53
+
54
+ module InstanceMethods
55
+ # Returns list of ancestors, starting from parent until root.
56
+ #
57
+ # subchild1.ancestors # => [child1, root]
58
+ def ancestors
59
+ node, nodes = self, []
60
+ nodes << node = node.parent while node.parent
61
+ nodes
62
+ end
63
+
64
+ # Returns all children and children of children
65
+ def descendants
66
+ nodes = []
67
+ self.children.each do |c|
68
+ nodes << c
69
+ nodes << c.descendants
70
+ end
71
+ nodes.flatten
72
+ end
73
+
74
+ # Returns the root node of the tree.
75
+ def root
76
+ node = self
77
+ node = node.parent while node.parent
78
+ node
79
+ end
80
+
81
+ # Checks if this node is a root
82
+ def root?
83
+ !self.parent
84
+ end
85
+
86
+ # Returns all siblings of the current node.
87
+ #
88
+ # subchild1.siblings # => [subchild2]
89
+ def siblings
90
+ self_and_siblings - [self]
91
+ end
92
+
93
+ # Returns all siblings and a reference to the current node.
94
+ #
95
+ # subchild1.self_and_siblings # => [subchild1, subchild2]
96
+ def self_and_siblings
97
+ parent ? parent.children : self.class.roots
98
+ end
99
+ end
100
+ end
101
+
102
+ ActiveRecord::Base.send :include, LucyCMS::ActsAsTree
@@ -0,0 +1,26 @@
1
+ class CmsTag::FieldDateTime < CmsBlock
2
+
3
+ include CmsTag
4
+
5
+ def self.regex_tag_signature(label = nil)
6
+ label ||= /[\w\-]+/
7
+ /\{\{\s*cms:field:(#{label}):datetime\s*\}\}/
8
+ end
9
+
10
+ def regex_tag_signature
11
+ self.class.regex_tag_signature(label)
12
+ end
13
+
14
+ def content=(value)
15
+ write_attribute(:content, value)
16
+ end
17
+
18
+ def content
19
+ read_attribute(:content)
20
+ end
21
+
22
+ def render
23
+ ''
24
+ end
25
+
26
+ end
@@ -0,0 +1,26 @@
1
+ class CmsTag::FieldInteger < CmsBlock
2
+
3
+ include CmsTag
4
+
5
+ def self.regex_tag_signature(label = nil)
6
+ label ||= /[\w\-]+/
7
+ /\{\{\s*cms:field:(#{label}):integer\s*\}\}/
8
+ end
9
+
10
+ def regex_tag_signature
11
+ self.class.regex_tag_signature(label)
12
+ end
13
+
14
+ def content=(value)
15
+ write_attribute(:content, value)
16
+ end
17
+
18
+ def content
19
+ read_attribute(:content)
20
+ end
21
+
22
+ def render
23
+ ''
24
+ end
25
+
26
+ end
@@ -0,0 +1,26 @@
1
+ class CmsTag::FieldString < CmsBlock
2
+
3
+ include CmsTag
4
+
5
+ def self.regex_tag_signature(label = nil)
6
+ label ||= /[\w\-]+/
7
+ /\{\{\s*cms:field:(#{label}):?(?:string)?\s*\}\}/
8
+ end
9
+
10
+ def regex_tag_signature
11
+ self.class.regex_tag_signature(label)
12
+ end
13
+
14
+ def content=(value)
15
+ write_attribute(:content, value)
16
+ end
17
+
18
+ def content
19
+ read_attribute(:content)
20
+ end
21
+
22
+ def render
23
+ ''
24
+ end
25
+
26
+ end
@@ -0,0 +1,26 @@
1
+ class CmsTag::FieldText < CmsBlock
2
+
3
+ include CmsTag
4
+
5
+ def self.regex_tag_signature(label = nil)
6
+ label ||= /[\w\-]+/
7
+ /\{\{\s*cms:field:(#{label}):?(?:text)?\s*?\}\}/
8
+ end
9
+
10
+ def regex_tag_signature
11
+ self.class.regex_tag_signature(label)
12
+ end
13
+
14
+ def content=(value)
15
+ write_attribute(:content, value)
16
+ end
17
+
18
+ def content
19
+ read_attribute(:content)
20
+ end
21
+
22
+ def render
23
+ ''
24
+ end
25
+
26
+ end
@@ -0,0 +1,20 @@
1
+ class CmsTag::Helper
2
+
3
+ attr_accessor :label
4
+
5
+ include CmsTag
6
+
7
+ def self.regex_tag_signature(label = nil)
8
+ label ||= /[\w\-]+/
9
+ /\{\{\s*cms:helper:(#{label}):?(.*?)\s*\}\}/
10
+ end
11
+
12
+ def regex_tag_signature
13
+ self.class.regex_tag_signature(label)
14
+ end
15
+
16
+ def content
17
+ "<%= #{label}(#{params.split(':').collect{|p| "'#{p}'"}.join(', ')}) %>"
18
+ end
19
+
20
+ end
@@ -0,0 +1,22 @@
1
+ class CmsTag::PageDateTime < CmsBlock
2
+
3
+ include CmsTag
4
+
5
+ def self.regex_tag_signature(label = nil)
6
+ label ||= /[\w\-]+/
7
+ /\{\{\s*cms:page:(#{label}):datetime\s*\}\}/
8
+ end
9
+
10
+ def regex_tag_signature
11
+ self.class.regex_tag_signature(label)
12
+ end
13
+
14
+ def content=(value)
15
+ write_attribute(:content, value)
16
+ end
17
+
18
+ def content
19
+ read_attribute(:content)
20
+ end
21
+
22
+ end
@@ -0,0 +1,22 @@
1
+ class CmsTag::PageInteger < CmsBlock
2
+
3
+ include CmsTag
4
+
5
+ def self.regex_tag_signature(label = nil)
6
+ label ||= /[\w\-]+/
7
+ /\{\{\s*cms:page:(#{label}):integer\s*\}\}/
8
+ end
9
+
10
+ def regex_tag_signature
11
+ self.class.regex_tag_signature(label)
12
+ end
13
+
14
+ def content=(value)
15
+ write_attribute(:content, value)
16
+ end
17
+
18
+ def content
19
+ read_attribute(:content)
20
+ end
21
+
22
+ end
@@ -0,0 +1,22 @@
1
+ class CmsTag::PageRichText < CmsBlock
2
+
3
+ include CmsTag
4
+
5
+ def self.regex_tag_signature(label = nil)
6
+ label ||= /[\w\-]+/
7
+ /\{\{\s*cms:page:(#{label}):rich_text\s*\}\}/
8
+ end
9
+
10
+ def regex_tag_signature
11
+ self.class.regex_tag_signature(label)
12
+ end
13
+
14
+ def content=(value)
15
+ write_attribute(:content, value)
16
+ end
17
+
18
+ def content
19
+ read_attribute(:content)
20
+ end
21
+
22
+ end
@@ -0,0 +1,22 @@
1
+ class CmsTag::PageString < CmsBlock
2
+
3
+ include CmsTag
4
+
5
+ def self.regex_tag_signature(label = nil)
6
+ label ||= /[\w\-]+/
7
+ /\{\{\s*cms:page:(#{label}):string\s*\}\}/
8
+ end
9
+
10
+ def regex_tag_signature
11
+ self.class.regex_tag_signature(label)
12
+ end
13
+
14
+ def content=(value)
15
+ write_attribute(:content, value)
16
+ end
17
+
18
+ def content
19
+ read_attribute(:content)
20
+ end
21
+
22
+ end
@@ -0,0 +1,22 @@
1
+ class CmsTag::PageText < CmsBlock
2
+
3
+ include CmsTag
4
+
5
+ def self.regex_tag_signature(label = nil)
6
+ label ||= /[\w\-]+/
7
+ /\{\{\s*cms:page:(#{label}):?(?:text)?\s*\}\}/
8
+ end
9
+
10
+ def regex_tag_signature
11
+ self.class.regex_tag_signature(label)
12
+ end
13
+
14
+ def content=(value)
15
+ write_attribute(:content, value)
16
+ end
17
+
18
+ def content
19
+ read_attribute(:content)
20
+ end
21
+
22
+ end
@@ -0,0 +1,21 @@
1
+ class CmsTag::Partial
2
+
3
+ attr_accessor :label
4
+
5
+ include CmsTag
6
+
7
+ def self.regex_tag_signature(label = nil)
8
+ label ||= /[\w\/\-]+/
9
+ /\{\{\s*cms:partial:(#{label}):?(.*?)\s*\}\}/
10
+ end
11
+
12
+ def regex_tag_signature
13
+ self.class.regex_tag_signature(label)
14
+ end
15
+
16
+ def content
17
+ ps = params.split(':').collect_with_index{|p, i| ":param_#{i+1} => '#{p}'"}.join(', ')
18
+ "<%= render :partial => '#{label}'#{ps.blank?? nil : ", :locals => {#{ps}}"} %>"
19
+ end
20
+
21
+ end
@@ -0,0 +1,22 @@
1
+ class CmsTag::Snippet < CmsSnippet
2
+
3
+ include CmsTag
4
+
5
+ def identifier
6
+ "#{self.class.name.underscore}_#{self.slug}"
7
+ end
8
+
9
+ def self.regex_tag_signature(label = nil)
10
+ label ||= /[\w\-]+/
11
+ /\{\{\s*cms:snippet:(#{label})\s*\}\}/
12
+ end
13
+
14
+ def regex_tag_signature
15
+ self.class.regex_tag_signature(label)
16
+ end
17
+
18
+ def content
19
+ self.read_attribute(:content)
20
+ end
21
+
22
+ end
@@ -0,0 +1,119 @@
1
+ # This module provides all Tag classes with neccessary methods.
2
+ # Example class that will behave as a Tag:
3
+ # class MySpecialTag
4
+ # include CmsTag
5
+ # ...
6
+ # end
7
+ module CmsTag
8
+
9
+ TOKENIZER_REGEX = /(\{\{\s*cms:[^{}]*\}\})|((?:\{?[^{])+|\{+)/
10
+
11
+ attr_accessor :params,
12
+ :parent,
13
+ :record_id
14
+
15
+ module ClassMethods
16
+ # Regex that is used to match tags in the content
17
+ # Example:
18
+ # /\{\{\s*?cms:page:(\w+)\}\}/
19
+ # will match tags like these:
20
+ # {{cms:page:my_label}}
21
+ def regex_tag_signature
22
+ nil
23
+ end
24
+
25
+ # Initializing tag object for a particular Tag type
26
+ # First capture group in the regex is the tag label
27
+ def initialize_tag(cms_page, tag_signature)
28
+ if match = tag_signature.match(regex_tag_signature)
29
+ if self.respond_to?(:initialize_or_find)
30
+ self.initialize_or_find(cms_page, match[1])
31
+ else
32
+ tag = self.new
33
+ tag.label = match[1]
34
+ tag.params = match[2]
35
+ tag
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ module InstanceMethods
42
+
43
+ # String indentifier of the tag
44
+ def identifier
45
+ "#{self.class.name.underscore}_#{self.label}"
46
+ end
47
+
48
+ # Ancestors of this tag constructed during rendering process.
49
+ def ancestors
50
+ node, nodes = self, []
51
+ nodes << node = node.parent while node.parent
52
+ nodes
53
+ end
54
+
55
+ # Regex that is used to identify instance of the tag
56
+ # Example:
57
+ # /<\{\s*?cms:page:tag_label\}/
58
+ def regex_tag_signature
59
+ nil
60
+ end
61
+
62
+ # Content that is accociated with Tag instance.
63
+ def content
64
+ nil
65
+ end
66
+
67
+ # Content that is used during page rendering. Outputting existing content
68
+ # as a default.
69
+ def render
70
+ # cleaning content from possible irb stuff. Partial and Helper tags are OK.
71
+ if LucyCMS.config.disable_irb && ![CmsTag::Partial, CmsTag::Helper].member?(self.class)
72
+ content.to_s.gsub('<%', '&lt;%').gsub('%>', '%&gt;')
73
+ else
74
+ content.to_s
75
+ end
76
+ end
77
+ end
78
+
79
+ private
80
+
81
+ # Initializes a tag. It's handled by one of the tag classes
82
+ def self.initialize_tag(cms_page, tag_signature)
83
+ tag_instance = nil
84
+ tag_classes.find{ |c| tag_instance = c.initialize_tag(cms_page, tag_signature) }
85
+ tag_instance
86
+ end
87
+
88
+ # Scanning provided content and splitting it into [tag, text] tuples.
89
+ # Tags are processed further and their content is expanded in the same way.
90
+ # Tags are defined in the parent tags are ignored and not rendered.
91
+ def self.process_content(cms_page, content = '', parent_tag = nil)
92
+ tokens = content.to_s.scan(TOKENIZER_REGEX)
93
+ tokens.collect do |tag_signature, text|
94
+ if tag_signature
95
+ if tag = self.initialize_tag(cms_page, tag_signature)
96
+ tag.parent = parent_tag if parent_tag
97
+ if tag.ancestors.select{|a| a.identifier == tag.identifier}.blank?
98
+ cms_page.cms_tags << tag
99
+ self.process_content(cms_page, tag.render, tag)
100
+ end
101
+ end
102
+ else
103
+ text
104
+ end
105
+ end.join('')
106
+ end
107
+
108
+ def self.included(tag)
109
+ tag.send(:include, CmsTag::InstanceMethods)
110
+ tag.send(:extend, CmsTag::ClassMethods)
111
+ @@tag_classes ||= []
112
+ @@tag_classes << tag
113
+ end
114
+
115
+ # A list of registered Tag classes
116
+ def self.tag_classes
117
+ @@tag_classes ||= []
118
+ end
119
+ end
@@ -0,0 +1,36 @@
1
+ class LucyCMS::Configuration
2
+
3
+ # Location of YAML files that can be used to render pages instead of pulling
4
+ # data from the database. Not active if not specified.
5
+ attr_accessor :seed_data_path
6
+
7
+ attr_accessor :version
8
+
9
+ attr_accessor :cms_upload_directory
10
+
11
+ # Default url to access admin area is http://yourhost/cms-admin/
12
+ # You can change 'cms-admin' to 'admin', for example.
13
+ attr_accessor :admin_route_prefix
14
+
15
+ # /cms-admin redirects to /cms-admin/pages but you can change it
16
+ # to something else
17
+ attr_accessor :admin_route_redirect
18
+
19
+ # Not allowing irb code to be run inside page content. True by default.
20
+ attr_accessor :disable_irb
21
+
22
+ # Caching for css/js. For admin layout and ones for cms content. Enabled by default.
23
+ attr_accessor :enable_caching
24
+
25
+ # Configuration defaults
26
+ def initialize
27
+ @seed_data_path = nil
28
+ @version = '0.0.2'
29
+ @cms_upload_directory = 'common'
30
+ @admin_route_prefix = 'cms-admin'
31
+ @admin_route_redirect = "/#{@admin_route_prefix}/pages"
32
+ @disable_irb = true
33
+ @enable_caching = true
34
+ end
35
+
36
+ end
@@ -0,0 +1,42 @@
1
+ module LucyCMS::ControllerMethods
2
+
3
+ def self.included(base)
4
+
5
+ # If application controller doesn't have template associated with it
6
+ # CMS will attempt to find one. This is so you don't have to explicitly
7
+ # call render :cms_page => '/something'
8
+ base.rescue_from 'ActionView::MissingTemplate' do |e|
9
+ begin
10
+ render :cms_page => request.path
11
+ rescue ActionView::MissingTemplate
12
+ raise e
13
+ end
14
+ end
15
+
16
+ # Now you can render cms_page simply by calling:
17
+ # render :cms_page => '/path/to/page'
18
+ # This way application controllers can use CMS content while populating
19
+ # instance variables that can be used in partials (that are included by
20
+ # by the cms page and/or layout)
21
+ def render(options = {}, locals = {}, &block)
22
+ if options.is_a?(Hash) && path = options.delete(:cms_page)
23
+ site = CmsSite.find_by_hostname(request.host.downcase)
24
+ page = CmsPage.load_from_file(site, path) if site && LucyCMS.configuration.seed_data_path
25
+ page ||= site && site.cms_pages.find_by_full_path(path)
26
+ if page
27
+ cms_app_layout = page.cms_layout.try(:app_layout)
28
+ options[:layout] ||= cms_app_layout.blank?? nil : cms_app_layout
29
+ options[:inline] = page.content
30
+ @cms_page = page
31
+ super(options, locals, &block)
32
+ else
33
+ raise ActionView::MissingTemplate.new([path], path, "CMS page not found", nil)
34
+ end
35
+ else
36
+ super(options, locals, &block)
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ ActionController::Base.send :include, LucyCMS::ControllerMethods
@@ -0,0 +1,12 @@
1
+ require 'LucyCMS'
2
+ require 'rails'
3
+ require 'paperclip'
4
+ require 'active_link_to'
5
+ require 'mime/types'
6
+
7
+ module LucyCMS
8
+ class Engine < ::Rails::Engine
9
+
10
+ end
11
+ end
12
+