lucy_cms 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +19 -0
- data/Gemfile.lock +88 -0
- data/LICENSE +24 -0
- data/README.md +161 -0
- data/Rakefile +26 -0
- data/VERSION +1 -0
- data/app/controllers/application_controller.rb +5 -0
- data/app/controllers/cms_admin/base_controller.rb +43 -0
- data/app/controllers/cms_admin/layouts_controller.rb +66 -0
- data/app/controllers/cms_admin/pages_controller.rb +111 -0
- data/app/controllers/cms_admin/sessions_controller.rb +25 -0
- data/app/controllers/cms_admin/sites_controller.rb +69 -0
- data/app/controllers/cms_admin/snippets_controller.rb +62 -0
- data/app/controllers/cms_admin/upload_dirs_controller.rb +79 -0
- data/app/controllers/cms_admin/users_controller.rb +129 -0
- data/app/controllers/cms_content_controller.rb +51 -0
- data/app/models/cms_block.rb +28 -0
- data/app/models/cms_layout.rb +118 -0
- data/app/models/cms_page.rb +163 -0
- data/app/models/cms_site.rb +38 -0
- data/app/models/cms_snippet.rb +70 -0
- data/app/models/cms_upload.rb +19 -0
- data/app/models/cms_upload_dir.rb +11 -0
- data/app/models/cms_user.rb +93 -0
- data/app/views/cms_admin/layouts/_form.html.erb +10 -0
- data/app/views/cms_admin/layouts/_index_branch.html.erb +24 -0
- data/app/views/cms_admin/layouts/edit.html.erb +6 -0
- data/app/views/cms_admin/layouts/index.html.erb +6 -0
- data/app/views/cms_admin/layouts/new.html.erb +6 -0
- data/app/views/cms_admin/pages/_form.html.erb +37 -0
- data/app/views/cms_admin/pages/_form_blocks.html.erb +7 -0
- data/app/views/cms_admin/pages/_index_branch.html.erb +40 -0
- data/app/views/cms_admin/pages/edit.html.erb +5 -0
- data/app/views/cms_admin/pages/form_blocks.js.erb +2 -0
- data/app/views/cms_admin/pages/index.html.erb +6 -0
- data/app/views/cms_admin/pages/new.html.erb +5 -0
- data/app/views/cms_admin/pages/toggle_branch.js.erb +11 -0
- data/app/views/cms_admin/sessions/new.html.erb +12 -0
- data/app/views/cms_admin/sites/_form.html.erb +16 -0
- data/app/views/cms_admin/sites/edit.html.erb +6 -0
- data/app/views/cms_admin/sites/new.html.erb +6 -0
- data/app/views/cms_admin/sites/setup.html.erb +16 -0
- data/app/views/cms_admin/snippets/_form.html.erb +4 -0
- data/app/views/cms_admin/snippets/edit.html.erb +6 -0
- data/app/views/cms_admin/snippets/index.html.erb +23 -0
- data/app/views/cms_admin/snippets/new.html.erb +6 -0
- data/app/views/cms_admin/upload_dirs/_file.html.erb +15 -0
- data/app/views/cms_admin/upload_dirs/_form.html.erb +2 -0
- data/app/views/cms_admin/upload_dirs/conflict.html.erb +12 -0
- data/app/views/cms_admin/upload_dirs/index.html.erb +23 -0
- data/app/views/cms_admin/upload_dirs/new.html.erb +6 -0
- data/app/views/cms_admin/upload_dirs/show.html.erb +26 -0
- data/app/views/cms_admin/upload_dirs/uploads_destroy.js.erb +3 -0
- data/app/views/cms_admin/users/_form.html.erb +9 -0
- data/app/views/cms_admin/users/_index_branch.html.erb +16 -0
- data/app/views/cms_admin/users/change_password.html.erb +14 -0
- data/app/views/cms_admin/users/edit.html.erb +17 -0
- data/app/views/cms_admin/users/index.html.erb +6 -0
- data/app/views/cms_admin/users/new.html.erb +14 -0
- data/app/views/layouts/cms_admin.html.erb +52 -0
- data/config/application.rb +48 -0
- data/config/boot.rb +13 -0
- data/config/database.yml +22 -0
- data/config/environment.rb +5 -0
- data/config/environments/development.rb +22 -0
- data/config/environments/production.rb +49 -0
- data/config/environments/test.rb +35 -0
- data/config/initializers/LucyCMS.rb +37 -0
- data/config/initializers/mime_types.rb +5 -0
- data/config/locales/en.yml +5 -0
- data/config/routes.rb +45 -0
- data/config.ru +4 -0
- data/db/cms_seeds/example.local/layouts/default.yml +8 -0
- data/db/cms_seeds/example.local/layouts/nested.yml +6 -0
- data/db/cms_seeds/example.local/pages/child/subchild.yml +14 -0
- data/db/cms_seeds/example.local/pages/child.yml +10 -0
- data/db/cms_seeds/example.local/pages/index.yml +11 -0
- data/db/cms_seeds/example.local/snippets/example.yml +4 -0
- data/db/migrate/01_create_cms.rb +114 -0
- data/db/seeds.rb +7 -0
- data/lib/LucyCMS/acts_as_tree.rb +102 -0
- data/lib/LucyCMS/cms_tag/field_datetime.rb +26 -0
- data/lib/LucyCMS/cms_tag/field_integer.rb +26 -0
- data/lib/LucyCMS/cms_tag/field_string.rb +26 -0
- data/lib/LucyCMS/cms_tag/field_text.rb +26 -0
- data/lib/LucyCMS/cms_tag/helper.rb +20 -0
- data/lib/LucyCMS/cms_tag/page_datetime.rb +22 -0
- data/lib/LucyCMS/cms_tag/page_integer.rb +22 -0
- data/lib/LucyCMS/cms_tag/page_rich_text.rb +22 -0
- data/lib/LucyCMS/cms_tag/page_string.rb +22 -0
- data/lib/LucyCMS/cms_tag/page_text.rb +22 -0
- data/lib/LucyCMS/cms_tag/partial.rb +21 -0
- data/lib/LucyCMS/cms_tag/snippet.rb +22 -0
- data/lib/LucyCMS/cms_tag.rb +119 -0
- data/lib/LucyCMS/configuration.rb +36 -0
- data/lib/LucyCMS/controller_methods.rb +42 -0
- data/lib/LucyCMS/engine.rb +12 -0
- data/lib/LucyCMS/form_builder.rb +129 -0
- data/lib/LucyCMS/rails_extensions.rb +22 -0
- data/lib/LucyCMS/site_form_builder.rb +129 -0
- data/lib/LucyCMS/view_hooks.rb +30 -0
- data/lib/LucyCMS/view_methods.rb +68 -0
- data/lib/LucyCMS.rb +40 -0
- data/lib/generators/README +17 -0
- data/lib/generators/cms_generator.rb +44 -0
- data/lib/tasks/LucyCMS.rake +283 -0
- data/lucy_cms.gemspec +100 -0
- data/public/404.html +26 -0
- data/public/422.html +26 -0
- data/public/500.html +26 -0
- data/public/favicon.ico +0 -0
- data/public/images/LucyCMS/arrow_bottom.gif +0 -0
- data/public/images/LucyCMS/arrow_right.gif +0 -0
- data/public/images/LucyCMS/icon_folder.png +0 -0
- data/public/images/LucyCMS/icon_layout.gif +0 -0
- data/public/images/LucyCMS/icon_move.gif +0 -0
- data/public/images/LucyCMS/icon_regular.gif +0 -0
- data/public/images/LucyCMS/icon_snippet.gif +0 -0
- data/public/images/LucyCMS/icon_upload.png +0 -0
- data/public/images/LucyCMS/icon_user.jpg +0 -0
- data/public/javascripts/LucyCMS/cms.js +204 -0
- data/public/javascripts/LucyCMS/codemirror/codemirror.css +102 -0
- data/public/javascripts/LucyCMS/codemirror/codemirror.js +23 -0
- data/public/javascripts/LucyCMS/codemirror/codemirror_base.js +88 -0
- data/public/javascripts/LucyCMS/codemirror/parse_css.js +4 -0
- data/public/javascripts/LucyCMS/codemirror/parse_html_mixed.js +3 -0
- data/public/javascripts/LucyCMS/codemirror/parse_js.js +12 -0
- data/public/javascripts/LucyCMS/codemirror/parse_xml.js +7 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_222222_256x240.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_2e83ff_256x240.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_454545_256x240.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_888888_256x240.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/public/javascripts/LucyCMS/jquery-ui/jquery-ui.css +362 -0
- data/public/javascripts/LucyCMS/jquery-ui/jquery-ui.js +190 -0
- data/public/javascripts/LucyCMS/jquery.js +154 -0
- data/public/javascripts/LucyCMS/plupload/plupload.full.min.js +1 -0
- data/public/javascripts/LucyCMS/plupload/plupload.html5.min.js +1 -0
- data/public/javascripts/LucyCMS/plupload/plupload.min.js +1 -0
- data/public/javascripts/LucyCMS/rails.js +132 -0
- data/public/javascripts/LucyCMS/tiny_mce/jquery.tinymce.js +1 -0
- data/public/javascripts/LucyCMS/tiny_mce/langs/en.js +170 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/about.htm +54 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/anchor.htm +26 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/charmap.htm +52 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/color_picker.htm +73 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/editor_template.js +1 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/image.htm +80 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/img/icons.gif +0 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/about.js +72 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/anchor.js +37 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/charmap.js +335 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/color_picker.js +253 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/image.js +245 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/link.js +156 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/js/source_editor.js +56 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/langs/en.js +62 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/langs/en_dlg.js +51 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/link.htm +58 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/content.css +36 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/dialog.css +117 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/skins/default/ui.css +213 -0
- data/public/javascripts/LucyCMS/tiny_mce/themes/advanced/source_editor.htm +25 -0
- data/public/javascripts/LucyCMS/tiny_mce/tiny_mce.js +1 -0
- data/public/javascripts/LucyCMS/tiny_mce/tiny_mce_popup.js +5 -0
- data/public/robots.txt +5 -0
- data/public/stylesheets/LucyCMS/content.css +196 -0
- data/public/stylesheets/LucyCMS/form.css +125 -0
- data/public/stylesheets/LucyCMS/reset.css +1 -0
- data/public/stylesheets/LucyCMS/site_form.css +82 -0
- data/public/stylesheets/LucyCMS/structure.css +125 -0
- data/public/stylesheets/LucyCMS/typography.css +25 -0
- data/script/rails +6 -0
- data/test/cms_seeds/test.host/layouts/broken.yml +1 -0
- data/test/cms_seeds/test.host/layouts/default.yml +3 -0
- data/test/cms_seeds/test.host/layouts/nested.yml +4 -0
- data/test/cms_seeds/test.host/pages/broken.yml +1 -0
- data/test/cms_seeds/test.host/pages/child/subchild.yml +10 -0
- data/test/cms_seeds/test.host/pages/child.yml +10 -0
- data/test/cms_seeds/test.host/pages/index.yml +10 -0
- data/test/cms_seeds/test.host/snippets/broken.yml +1 -0
- data/test/cms_seeds/test.host/snippets/default.yml +3 -0
- data/test/fixtures/cms_blocks.yml +12 -0
- data/test/fixtures/cms_layouts.yml +36 -0
- data/test/fixtures/cms_pages.yml +39 -0
- data/test/fixtures/cms_sites.yml +3 -0
- data/test/fixtures/cms_snippets.yml +5 -0
- data/test/fixtures/cms_upload_dirs.yml +9 -0
- data/test/fixtures/cms_uploads.yml +4 -0
- data/test/fixtures/cms_users.yml +11 -0
- data/test/fixtures/files/invalid_file.gif +9 -0
- data/test/fixtures/files/valid_image.jpg +0 -0
- data/test/fixtures/views/_nav_hook.html.erb +1 -0
- data/test/fixtures/views/_nav_hook_2.html.erb +1 -0
- data/test/functional/cms_admin/layouts_controller_test.rb +103 -0
- data/test/functional/cms_admin/pages_controller_test.rb +334 -0
- data/test/functional/cms_admin/sites_controller_test.rb +99 -0
- data/test/functional/cms_admin/snippets_controller_test.rb +102 -0
- data/test/functional/cms_admin/uploads_controller_test.rb +26 -0
- data/test/functional/cms_content_controller_test.rb +134 -0
- data/test/integration/rake_tasks_test.rb +65 -0
- data/test/integration/render_cms_seed_test.rb +34 -0
- data/test/integration/render_cms_test.rb +81 -0
- data/test/integration/sites_test.rb +63 -0
- data/test/integration/view_hooks_test.rb +33 -0
- data/test/test_helper.rb +86 -0
- data/test/unit/cms_block_test.rb +43 -0
- data/test/unit/cms_configuration_test.rb +17 -0
- data/test/unit/cms_layout_test.rb +146 -0
- data/test/unit/cms_page_test.rb +257 -0
- data/test/unit/cms_site_test.rb +41 -0
- data/test/unit/cms_snippet_test.rb +77 -0
- data/test/unit/cms_tag_test.rb +206 -0
- data/test/unit/cms_tags/field_datetime_test.rb +34 -0
- data/test/unit/cms_tags/field_integer_test.rb +33 -0
- data/test/unit/cms_tags/field_string_test.rb +34 -0
- data/test/unit/cms_tags/field_text_test.rb +32 -0
- data/test/unit/cms_tags/helper_test.rb +38 -0
- data/test/unit/cms_tags/page_datetime_test.rb +34 -0
- data/test/unit/cms_tags/page_integer_test.rb +33 -0
- data/test/unit/cms_tags/page_rich_text.rb +33 -0
- data/test/unit/cms_tags/page_string_test.rb +33 -0
- data/test/unit/cms_tags/page_text_test.rb +34 -0
- data/test/unit/cms_tags/partial_test.rb +44 -0
- data/test/unit/cms_tags/snippet_test.rb +33 -0
- data/test/unit/cms_upload_dir_test.rb +8 -0
- data/test/unit/cms_upload_test.rb +26 -0
- data/test/unit/cms_user_test.rb +8 -0
- data/test/unit/view_methods_test.rb +21 -0
- 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('<%', '<%').gsub('%>', '%>')
|
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
|