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.
- 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
|