comfypress 0.1.3
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.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.travis.yml +22 -0
- data/Gemfile +22 -0
- data/Gemfile.lock +175 -0
- data/LICENSE +20 -0
- data/README.md +79 -0
- data/Rakefile +5 -0
- data/app/assets/images/comfypress/arrow_bottom.gif +0 -0
- data/app/assets/images/comfypress/arrow_right.gif +0 -0
- data/app/assets/images/comfypress/bootstrap/glyphicons-halflings-white.png +0 -0
- data/app/assets/images/comfypress/bootstrap/glyphicons-halflings.png +0 -0
- data/app/assets/images/comfypress/checkerboard.gif +0 -0
- data/app/assets/images/comfypress/icon_draft.gif +0 -0
- data/app/assets/images/comfypress/icon_file.gif +0 -0
- data/app/assets/images/comfypress/icon_layout.gif +0 -0
- data/app/assets/images/comfypress/icon_move.gif +0 -0
- data/app/assets/images/comfypress/icon_page.gif +0 -0
- data/app/assets/images/comfypress/icon_site.gif +0 -0
- data/app/assets/images/comfypress/icon_snippet.gif +0 -0
- data/app/assets/images/comfypress/nav_arrow.png +0 -0
- data/app/assets/javascripts/comfypress/admin/application.js +1 -0
- data/app/assets/javascripts/comfypress/application.js.coffee +175 -0
- data/app/assets/javascripts/comfypress/lib/bootstrap-datetimepicker.js +21 -0
- data/app/assets/javascripts/comfypress/lib/bootstrap-wysihtml5.js +492 -0
- data/app/assets/javascripts/comfypress/lib/bootstrap.js +6 -0
- data/app/assets/javascripts/comfypress/lib/codemirror.js +10 -0
- data/app/assets/javascripts/comfypress/lib/wysihtml5.js +261 -0
- data/app/assets/stylesheets/comfypress/admin/application.css +1 -0
- data/app/assets/stylesheets/comfypress/application.css.sass +8 -0
- data/app/assets/stylesheets/comfypress/base.css.sass +333 -0
- data/app/assets/stylesheets/comfypress/bootstrap_overrides.css.sass +45 -0
- data/app/assets/stylesheets/comfypress/codemirror_overrides.css.sass +27 -0
- data/app/assets/stylesheets/comfypress/lib/bootstrap-datetimepicker.css +9 -0
- data/app/assets/stylesheets/comfypress/lib/bootstrap-wysihtml5.css +102 -0
- data/app/assets/stylesheets/comfypress/lib/bootstrap.css +9 -0
- data/app/assets/stylesheets/comfypress/lib/codemirror.css +240 -0
- data/app/assets/stylesheets/comfypress/wysihtml5_overrides.css.sass +5 -0
- data/app/controllers/application_controller.rb +5 -0
- data/app/controllers/cms_admin/base_controller.rb +51 -0
- data/app/controllers/cms_admin/categories_controller.rb +35 -0
- data/app/controllers/cms_admin/files_controller.rb +108 -0
- data/app/controllers/cms_admin/layouts_controller.rb +67 -0
- data/app/controllers/cms_admin/menu_items_controller.rb +65 -0
- data/app/controllers/cms_admin/menus_controller.rb +60 -0
- data/app/controllers/cms_admin/pages_controller.rb +112 -0
- data/app/controllers/cms_admin/revisions_controller.rb +57 -0
- data/app/controllers/cms_admin/sites_controller.rb +64 -0
- data/app/controllers/cms_admin/snippets_controller.rb +64 -0
- data/app/controllers/cms_content_controller.rb +79 -0
- data/app/helpers/application_helper.rb +16 -0
- data/app/models/cms/block.rb +48 -0
- data/app/models/cms/categorization.rb +21 -0
- data/app/models/cms/category.rb +30 -0
- data/app/models/cms/file.rb +75 -0
- data/app/models/cms/layout.rb +99 -0
- data/app/models/cms/menu.rb +26 -0
- data/app/models/cms/menu_item.rb +14 -0
- data/app/models/cms/page.rb +202 -0
- data/app/models/cms/revision.rb +17 -0
- data/app/models/cms/site.rb +113 -0
- data/app/models/cms/snippet.rb +58 -0
- data/app/models/cms.rb +5 -0
- data/app/views/cms_admin/categories/_categories.html.haml +3 -0
- data/app/views/cms_admin/categories/_edit.html.haml +6 -0
- data/app/views/cms_admin/categories/_form.html.haml +8 -0
- data/app/views/cms_admin/categories/_index.html.haml +24 -0
- data/app/views/cms_admin/categories/_show.html.haml +13 -0
- data/app/views/cms_admin/categories/create.js.erb +7 -0
- data/app/views/cms_admin/categories/destroy.js.erb +3 -0
- data/app/views/cms_admin/categories/edit.js.erb +3 -0
- data/app/views/cms_admin/categories/update.js.erb +6 -0
- data/app/views/cms_admin/files/_file.html.haml +13 -0
- data/app/views/cms_admin/files/_form.html.haml +14 -0
- data/app/views/cms_admin/files/_index.html.haml +14 -0
- data/app/views/cms_admin/files/_page_form.html.haml +9 -0
- data/app/views/cms_admin/files/destroy.js.coffee +2 -0
- data/app/views/cms_admin/files/edit.html.haml +5 -0
- data/app/views/cms_admin/files/index.html.haml +28 -0
- data/app/views/cms_admin/files/new.html.haml +5 -0
- data/app/views/cms_admin/layouts/_form.html.haml +17 -0
- data/app/views/cms_admin/layouts/_index_branch.html.haml +23 -0
- data/app/views/cms_admin/layouts/edit.html.haml +9 -0
- data/app/views/cms_admin/layouts/index.html.haml +9 -0
- data/app/views/cms_admin/layouts/new.html.haml +5 -0
- data/app/views/cms_admin/menu_items/_form.html.haml +22 -0
- data/app/views/cms_admin/menu_items/edit.html.haml +8 -0
- data/app/views/cms_admin/menu_items/index.html.haml +24 -0
- data/app/views/cms_admin/menu_items/new.html.haml +5 -0
- data/app/views/cms_admin/menus/_form.html.haml +8 -0
- data/app/views/cms_admin/menus/edit.html.haml +8 -0
- data/app/views/cms_admin/menus/index.html.haml +24 -0
- data/app/views/cms_admin/menus/new.html.haml +5 -0
- data/app/views/cms_admin/pages/_form.html.haml +38 -0
- data/app/views/cms_admin/pages/_form_blocks.html.haml +28 -0
- data/app/views/cms_admin/pages/_index_branch.html.haml +35 -0
- data/app/views/cms_admin/pages/edit.html.haml +9 -0
- data/app/views/cms_admin/pages/form_blocks.js.erb +2 -0
- data/app/views/cms_admin/pages/index.html.haml +11 -0
- data/app/views/cms_admin/pages/new.html.haml +5 -0
- data/app/views/cms_admin/pages/toggle_branch.js.erb +11 -0
- data/app/views/cms_admin/revisions/show.html.haml +28 -0
- data/app/views/cms_admin/sites/_form.html.haml +14 -0
- data/app/views/cms_admin/sites/_mirrors.html.haml +17 -0
- data/app/views/cms_admin/sites/edit.html.haml +5 -0
- data/app/views/cms_admin/sites/index.html.haml +24 -0
- data/app/views/cms_admin/sites/new.html.haml +5 -0
- data/app/views/cms_admin/snippets/_form.html.haml +11 -0
- data/app/views/cms_admin/snippets/edit.html.haml +9 -0
- data/app/views/cms_admin/snippets/index.html.haml +28 -0
- data/app/views/cms_admin/snippets/new.html.haml +5 -0
- data/app/views/cms_content/_menu.html.haml +5 -0
- data/app/views/cms_content/render_sitemap.xml.builder +15 -0
- data/app/views/layouts/cms_admin/_body.html.haml +16 -0
- data/app/views/layouts/cms_admin/_center.html.haml +7 -0
- data/app/views/layouts/cms_admin/_footer.html.haml +3 -0
- data/app/views/layouts/cms_admin/_footer_js.html.haml +7 -0
- data/app/views/layouts/cms_admin/_head.html.haml +12 -0
- data/app/views/layouts/cms_admin/_left.html.haml +11 -0
- data/app/views/layouts/cms_admin/_right.html.haml +1 -0
- data/app/views/layouts/cms_admin.html.haml +4 -0
- data/comfypress.gemspec +28 -0
- data/config/application.rb +69 -0
- data/config/boot.rb +6 -0
- data/config/database.sqlite.yml +47 -0
- data/config/database.yml +47 -0
- data/config/environment.rb +5 -0
- data/config/environments/development.rb +39 -0
- data/config/environments/production.rb +67 -0
- data/config/environments/test.rb +39 -0
- data/config/initializers/comfypress.rb +100 -0
- data/config/initializers/paperclip.rb +3 -0
- data/config/locales/de.yml +236 -0
- data/config/locales/en.yml +285 -0
- data/config/locales/es.yml +236 -0
- data/config/locales/fr.yml +236 -0
- data/config/locales/ja.yml +237 -0
- data/config/locales/pl.yml +236 -0
- data/config/locales/pt-BR.yml +236 -0
- data/config/locales/ru.yml +236 -0
- data/config/locales/sv.yml +236 -0
- data/config/locales/zh-CN.yml +236 -0
- data/config/routes.rb +10 -0
- data/config.ru +4 -0
- data/db/cms_fixtures/sample-site/layouts/default/_default.yml +1 -0
- data/db/cms_fixtures/sample-site/layouts/default/content.html +5 -0
- data/db/cms_fixtures/sample-site/layouts/default/css.css +1 -0
- data/db/cms_fixtures/sample-site/layouts/default/js.js +1 -0
- data/db/cms_fixtures/sample-site/layouts/default/nested/_nested.yml +2 -0
- data/db/cms_fixtures/sample-site/layouts/default/nested/content.html +2 -0
- data/db/cms_fixtures/sample-site/layouts/default/nested/css.css +1 -0
- data/db/cms_fixtures/sample-site/layouts/default/nested/js.js +1 -0
- data/db/cms_fixtures/sample-site/pages/index/_index.yml +2 -0
- data/db/cms_fixtures/sample-site/pages/index/child/_child.yml +3 -0
- data/db/cms_fixtures/sample-site/pages/index/child/left.html +1 -0
- data/db/cms_fixtures/sample-site/pages/index/child/right.html +1 -0
- data/db/cms_fixtures/sample-site/pages/index/content.html +2 -0
- data/db/cms_fixtures/sample-site/snippets/default/_default.yml +1 -0
- data/db/cms_fixtures/sample-site/snippets/default/content.html +1 -0
- data/db/migrate/01_create_cms.rb +163 -0
- data/db/seeds.rb +9 -0
- data/db/upgrade_migrations/02_upgrade_to_1_1_0.rb +19 -0
- data/db/upgrade_migrations/03_upgrade_to_1_2_0.rb +15 -0
- data/db/upgrade_migrations/04_upgrade_to_1_3_0.rb +23 -0
- data/db/upgrade_migrations/05_upgrade_to_1_4_0.rb +33 -0
- data/db/upgrade_migrations/06_upgrade_to_1_5_0.rb +21 -0
- data/db/upgrade_migrations/07_upgrade_to_1_6_0.rb +25 -0
- data/doc/preview.png +0 -0
- data/doc/sofa.png +0 -0
- data/lib/comfypress/authentication/dummy_auth.rb +8 -0
- data/lib/comfypress/authentication/http_auth.rb +18 -0
- data/lib/comfypress/configuration.rb +99 -0
- data/lib/comfypress/engine.rb +18 -0
- data/lib/comfypress/error.rb +24 -0
- data/lib/comfypress/extensions/acts_as_tree.rb +102 -0
- data/lib/comfypress/extensions/has_revisions.rb +64 -0
- data/lib/comfypress/extensions/is_categorized.rb +49 -0
- data/lib/comfypress/extensions/is_mirrored.rb +85 -0
- data/lib/comfypress/extensions/rails.rb +24 -0
- data/lib/comfypress/fixtures.rb +289 -0
- data/lib/comfypress/form_builder.rb +97 -0
- data/lib/comfypress/render_methods.rb +85 -0
- data/lib/comfypress/routing.rb +62 -0
- data/lib/comfypress/sitemap.rb +27 -0
- data/lib/comfypress/tag.rb +154 -0
- data/lib/comfypress/tags/asset.rb +25 -0
- data/lib/comfypress/tags/collection.rb +64 -0
- data/lib/comfypress/tags/field_datetime.rb +17 -0
- data/lib/comfypress/tags/field_integer.rb +17 -0
- data/lib/comfypress/tags/field_rich_text.rb +17 -0
- data/lib/comfypress/tags/field_string.rb +17 -0
- data/lib/comfypress/tags/field_text.rb +17 -0
- data/lib/comfypress/tags/file.rb +29 -0
- data/lib/comfypress/tags/helper.rb +24 -0
- data/lib/comfypress/tags/menu.rb +27 -0
- data/lib/comfypress/tags/page_datetime.rb +13 -0
- data/lib/comfypress/tags/page_file.rb +51 -0
- data/lib/comfypress/tags/page_files.rb +52 -0
- data/lib/comfypress/tags/page_integer.rb +13 -0
- data/lib/comfypress/tags/page_markdown.rb +22 -0
- data/lib/comfypress/tags/page_rich_text.rb +13 -0
- data/lib/comfypress/tags/page_string.rb +13 -0
- data/lib/comfypress/tags/page_text.rb +13 -0
- data/lib/comfypress/tags/partial.rb +23 -0
- data/lib/comfypress/tags/snippet.rb +19 -0
- data/lib/comfypress/version.rb +3 -0
- data/lib/comfypress/view_hooks.rb +32 -0
- data/lib/comfypress/view_methods.rb +52 -0
- data/lib/comfypress.rb +66 -0
- data/lib/generators/comfy/cms/README +10 -0
- data/lib/generators/comfy/cms/cms_generator.rb +57 -0
- data/lib/tasks/comfypress.rake +45 -0
- data/script/rails +6 -0
- data/test/fixtures/cms/blocks.yml +12 -0
- data/test/fixtures/cms/categories.yml +4 -0
- data/test/fixtures/cms/categorizations.yml +3 -0
- data/test/fixtures/cms/files.yml +9 -0
- data/test/fixtures/cms/layouts.yml +40 -0
- data/test/fixtures/cms/menu_items.yml +15 -0
- data/test/fixtures/cms/menus.yml +9 -0
- data/test/fixtures/cms/pages.yml +39 -0
- data/test/fixtures/cms/revisions.yml +21 -0
- data/test/fixtures/cms/sites.yml +6 -0
- data/test/fixtures/cms/snippets.yml +6 -0
- data/test/fixtures/files/data.zip +0 -0
- data/test/fixtures/files/document.pdf +0 -0
- data/test/fixtures/files/image.gif +0 -0
- data/test/fixtures/files/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/fixtures/views/render_test/_test.html.erb +1 -0
- data/test/fixtures/views/render_test/new.html.erb +1 -0
- data/test/fixtures/views/render_test/render_layout.html.erb +1 -0
- data/test/functional/cms_admin/base_controller_test.rb +18 -0
- data/test/functional/cms_admin/categories_controller_test.rb +70 -0
- data/test/functional/cms_admin/files_controller_test.rb +216 -0
- data/test/functional/cms_admin/layouts_controller_test.rb +123 -0
- data/test/functional/cms_admin/pages_controller_test.rb +450 -0
- data/test/functional/cms_admin/revisions_controller_test.rb +138 -0
- data/test/functional/cms_admin/sites_controller_test.rb +105 -0
- data/test/functional/cms_admin/snippets_controller_test.rb +140 -0
- data/test/functional/cms_content_controller_test.rb +205 -0
- data/test/gemfiles/Gemfile.rails.3.1 +16 -0
- data/test/gemfiles/Gemfile.rails.3.2 +16 -0
- data/test/gemfiles/Gemfile.rails.4.0 +16 -0
- data/test/integration/authentication_test.rb +48 -0
- data/test/integration/fixtures_test.rb +61 -0
- data/test/integration/mirrors_test.rb +72 -0
- data/test/integration/render_cms_test.rb +233 -0
- data/test/integration/sites_test.rb +120 -0
- data/test/integration/view_hooks_test.rb +43 -0
- data/test/test_helper.rb +124 -0
- data/test/unit/cms/menu_item_test.rb +7 -0
- data/test/unit/cms/menu_test.rb +7 -0
- data/test/unit/configuration_test.rb +42 -0
- data/test/unit/fixtures_test.rb +357 -0
- data/test/unit/mirrors_test.rb +242 -0
- data/test/unit/models/block_test.rb +199 -0
- data/test/unit/models/categorization_test.rb +76 -0
- data/test/unit/models/category_test.rb +39 -0
- data/test/unit/models/file_test.rb +89 -0
- data/test/unit/models/layout_test.rb +125 -0
- data/test/unit/models/page_test.rb +255 -0
- data/test/unit/models/site_test.rb +152 -0
- data/test/unit/models/snippet_test.rb +49 -0
- data/test/unit/revisions_test.rb +185 -0
- data/test/unit/sitemap_test.rb +20 -0
- data/test/unit/tag_test.rb +308 -0
- data/test/unit/tags/asset_test.rb +56 -0
- data/test/unit/tags/collection_test.rb +116 -0
- data/test/unit/tags/field_datetime_test.rb +50 -0
- data/test/unit/tags/field_integer_test.rb +49 -0
- data/test/unit/tags/field_rich_text_test.rb +49 -0
- data/test/unit/tags/field_string_test.rb +52 -0
- data/test/unit/tags/field_text_test.rb +48 -0
- data/test/unit/tags/file_test.rb +67 -0
- data/test/unit/tags/helper_test.rb +86 -0
- data/test/unit/tags/page_datetime_test.rb +50 -0
- data/test/unit/tags/page_file_test.rb +119 -0
- data/test/unit/tags/page_files_test.rb +113 -0
- data/test/unit/tags/page_integer_test.rb +49 -0
- data/test/unit/tags/page_markdown_test.rb +48 -0
- data/test/unit/tags/page_rich_text_test.rb +49 -0
- data/test/unit/tags/page_string_test.rb +49 -0
- data/test/unit/tags/page_text_test.rb +52 -0
- data/test/unit/tags/partial_test.rb +76 -0
- data/test/unit/tags/snippet_test.rb +45 -0
- data/test/unit/view_methods_test.rb +80 -0
- metadata +457 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
class ComfyPress::Sitemap
|
|
2
|
+
|
|
3
|
+
# we want our callback to include the cms_site and
|
|
4
|
+
# the view so we have whatever routes are available to us
|
|
5
|
+
# xml is an xml_builder which expects a sitemap url definition, e.g:
|
|
6
|
+
# xml.url do
|
|
7
|
+
# xml.loc view.url_for("http://example.org/example")
|
|
8
|
+
# xml.lastmod 2.days.ago.strftime('%Y-%m-%d')
|
|
9
|
+
# end
|
|
10
|
+
def self.process(cms_site, view, xml)
|
|
11
|
+
self.sitemap_extensions.each do |extension|
|
|
12
|
+
extension.call(cms_site, view, xml)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.register_extension(callback)
|
|
17
|
+
self.sitemap_extensions.push(callback)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
# A list of registered sitemap extension methods
|
|
23
|
+
def self.sitemap_extensions
|
|
24
|
+
@@sitemap_extensions ||= []
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'csv'
|
|
4
|
+
|
|
5
|
+
# This module provides all Tag classes with neccessary methods.
|
|
6
|
+
# Example class that will behave as a Tag:
|
|
7
|
+
# class MySpecialTag
|
|
8
|
+
# include ComfyPress::Tag
|
|
9
|
+
# ...
|
|
10
|
+
# end
|
|
11
|
+
module ComfyPress::Tag
|
|
12
|
+
|
|
13
|
+
TOKENIZER_REGEX = /(\{\{\s*cms:[^{}]*\}\})|((?:\{?[^{])+|\{+)/
|
|
14
|
+
IDENTIFIER_REGEX = /\w+[\-\.\w]+\w+/
|
|
15
|
+
|
|
16
|
+
attr_accessor :page,
|
|
17
|
+
:identifier,
|
|
18
|
+
:namespace,
|
|
19
|
+
:params,
|
|
20
|
+
:parent
|
|
21
|
+
|
|
22
|
+
module ClassMethods
|
|
23
|
+
# Regex that is used to match tags in the content
|
|
24
|
+
# Example:
|
|
25
|
+
# /\{\{\s*?cms:page:(\w+)\}\}/
|
|
26
|
+
# will match tags like these:
|
|
27
|
+
# {{cms:page:my_identifier}}
|
|
28
|
+
def regex_tag_signature(identifier = nil)
|
|
29
|
+
nil
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Initializing tag object for a particular Tag type
|
|
33
|
+
# First capture group in the regex is the tag identifier
|
|
34
|
+
# Namespace is the string separated by a dot. So if identifier is:
|
|
35
|
+
# 'sidebar.about' namespace is: 'sidebar'
|
|
36
|
+
def initialize_tag(page, tag_signature)
|
|
37
|
+
if match = tag_signature.match(regex_tag_signature)
|
|
38
|
+
|
|
39
|
+
params = begin
|
|
40
|
+
(CSV.parse_line(match[2].to_s, :col_sep => ':') || []).compact
|
|
41
|
+
rescue
|
|
42
|
+
[]
|
|
43
|
+
end.map{|p| p.gsub(/\\|'/) { |c| "\\#{c}" } }
|
|
44
|
+
|
|
45
|
+
tag = self.new
|
|
46
|
+
tag.page = page
|
|
47
|
+
tag.identifier = match[1]
|
|
48
|
+
tag.namespace = (ns = tag.identifier.split('.')[0...-1].join('.')).blank?? nil : ns
|
|
49
|
+
tag.params = params
|
|
50
|
+
tag
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
module InstanceMethods
|
|
56
|
+
|
|
57
|
+
# String indentifier of the tag
|
|
58
|
+
def id
|
|
59
|
+
"#{self.class.to_s.demodulize.underscore}_#{self.identifier}"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Ancestors of this tag constructed during rendering process.
|
|
63
|
+
def ancestors
|
|
64
|
+
node, nodes = self, []
|
|
65
|
+
nodes << node = node.parent while node.parent
|
|
66
|
+
nodes
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Regex that is used to identify instance of the tag
|
|
70
|
+
# Example:
|
|
71
|
+
# /<\{\s*?cms:page:tag_identifier\}/
|
|
72
|
+
def regex_tag_signature
|
|
73
|
+
self.class.regex_tag_signature(identifier)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Content that is accociated with Tag instance.
|
|
77
|
+
def content
|
|
78
|
+
nil
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Content that is used during page rendering. Outputting existing content
|
|
82
|
+
# as a default.
|
|
83
|
+
def render
|
|
84
|
+
ignore = [ComfyPress::Tag::Partial, ComfyPress::Tag::Helper].member?(self.class)
|
|
85
|
+
ComfyPress::Tag.sanitize_irb(content, ignore)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Find or initialize Cms::Block object
|
|
89
|
+
def block
|
|
90
|
+
page.blocks.detect{|b| b.identifier == self.identifier.to_s} ||
|
|
91
|
+
page.blocks.build(:identifier => self.identifier.to_s)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Checks if this tag is using Cms::Block
|
|
95
|
+
def is_cms_block?
|
|
96
|
+
%w(page field collection).member?(self.class.to_s.demodulize.underscore.split(/_/).first)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Used in displaying form elements for Cms::Block
|
|
100
|
+
def record_id
|
|
101
|
+
block.id
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
private
|
|
106
|
+
|
|
107
|
+
# Initializes a tag. It's handled by one of the tag classes
|
|
108
|
+
def self.initialize_tag(page, tag_signature)
|
|
109
|
+
tag_instance = nil
|
|
110
|
+
tag_classes.find{ |c| tag_instance = c.initialize_tag(page, tag_signature) }
|
|
111
|
+
tag_instance
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Scanning provided content and splitting it into [tag, text] tuples.
|
|
115
|
+
# Tags are processed further and their content is expanded in the same way.
|
|
116
|
+
# Tags are defined in the parent tags are ignored and not rendered.
|
|
117
|
+
def self.process_content(page, content = '', parent_tag = nil)
|
|
118
|
+
tokens = content.to_s.scan(TOKENIZER_REGEX)
|
|
119
|
+
tokens.collect do |tag_signature, text|
|
|
120
|
+
if tag_signature
|
|
121
|
+
if tag = self.initialize_tag(page, tag_signature)
|
|
122
|
+
tag.parent = parent_tag if parent_tag
|
|
123
|
+
if tag.ancestors.select{|a| a.id == tag.id}.blank?
|
|
124
|
+
page.tags << tag
|
|
125
|
+
self.process_content(page, tag.render, tag)
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
else
|
|
129
|
+
text
|
|
130
|
+
end
|
|
131
|
+
end.join('')
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Cleaning content from possible irb stuff. Partial and Helper tags are OK.
|
|
135
|
+
def self.sanitize_irb(content, ignore = false)
|
|
136
|
+
if ComfyPress.config.allow_irb || ignore
|
|
137
|
+
content.to_s
|
|
138
|
+
else
|
|
139
|
+
content.to_s.gsub('<%', '<%').gsub('%>', '%>')
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def self.included(tag)
|
|
144
|
+
tag.send(:include, ComfyPress::Tag::InstanceMethods)
|
|
145
|
+
tag.send(:extend, ComfyPress::Tag::ClassMethods)
|
|
146
|
+
@@tag_classes ||= []
|
|
147
|
+
@@tag_classes << tag
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# A list of registered Tag classes
|
|
151
|
+
def self.tag_classes
|
|
152
|
+
@@tag_classes ||= []
|
|
153
|
+
end
|
|
154
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
class ComfyPress::Tag::Asset
|
|
2
|
+
include ComfyPress::Tag
|
|
3
|
+
|
|
4
|
+
def self.regex_tag_signature(identifier = nil)
|
|
5
|
+
identifier ||= IDENTIFIER_REGEX
|
|
6
|
+
/\{\{\s*cms:asset:(#{identifier}):?(.*?)\s*\}\}/
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def content
|
|
10
|
+
return unless (layout = Cms::Layout.find_by_identifier(identifier))
|
|
11
|
+
type = params[0]
|
|
12
|
+
format = params[1]
|
|
13
|
+
|
|
14
|
+
case type
|
|
15
|
+
when 'css'
|
|
16
|
+
out = "/cms-css/#{page.site.id}/#{identifier}.css"
|
|
17
|
+
out = "<link href='#{out}' media='screen' rel='stylesheet' type='text/css' />" if format == 'html_tag'
|
|
18
|
+
out
|
|
19
|
+
when 'js'
|
|
20
|
+
out = "/cms-js/#{page.site.id}/#{identifier}.js"
|
|
21
|
+
out = "<script src='#{out}' type='text/javascript'></script>" if format == 'html_tag'
|
|
22
|
+
out
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
class ComfyPress::Tag::Collection
|
|
2
|
+
include ComfyPress::Tag
|
|
3
|
+
|
|
4
|
+
# Here's a full tag signature:
|
|
5
|
+
# {{ cms:collection:label:collection_class:collection_partial:collection_title:collection_identifier:collection_params }}
|
|
6
|
+
# Most minimal tag can look like this:
|
|
7
|
+
# {{ cms:collection:album:foo/my_album }}
|
|
8
|
+
# A more complete example of the above:
|
|
9
|
+
# {{ cms:collection:album:foo/my_album:albums/show:title:slug:param_a:param_b }}
|
|
10
|
+
def self.regex_tag_signature(identifier = nil)
|
|
11
|
+
identifier ||= IDENTIFIER_REGEX
|
|
12
|
+
/\{\{\s*cms:collection:(#{identifier}):(.*?)\s*\}\}/
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Class definitition. It's basically `Herp::DerpityDerp.undescore` so an example
|
|
16
|
+
# of valid definition is: `herp/derpity_derp`
|
|
17
|
+
def collection_class
|
|
18
|
+
self.params[0].classify
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Path to the partial. Example: `path/to/partial`
|
|
22
|
+
def collection_partial
|
|
23
|
+
self.params[1] || "partials/#{self.collection_class.underscore.pluralize}"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Title method for the Collection objects. Default is `label`
|
|
27
|
+
def collection_title
|
|
28
|
+
self.params[2] || 'label'
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Identifier that will be used to find selected collection object. Defaults to `id`
|
|
32
|
+
def collection_identifier
|
|
33
|
+
self.params[3] || 'id'
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Extra params that will be passed to the partial AND ALSO will be passed as parameters
|
|
37
|
+
# for the `cms_collection` scope you can define for your Collection object
|
|
38
|
+
def collection_params
|
|
39
|
+
self.params[4..-1] || []
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Array of objects used in the collection
|
|
43
|
+
# You may set up a scope on the model `scope :cms_collection, lambda|*args| do ... end `
|
|
44
|
+
# `args` will be the set of `collection_params`
|
|
45
|
+
def collection_objects
|
|
46
|
+
klass = self.collection_class.constantize
|
|
47
|
+
klass.respond_to?(:cms_collection) ? klass.cms_collection(*collection_params).all : klass.all
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def content
|
|
51
|
+
block.content
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def render
|
|
55
|
+
if self.content.present?
|
|
56
|
+
ps = collection_params.collect_with_index{|p, i| ":param_#{i+1} => '#{p}'"}.join(', ')
|
|
57
|
+
ps = ps.present?? ", #{ps}" : ''
|
|
58
|
+
"<%= render :partial => '#{collection_partial}', :locals => {:model => '#{collection_class}', :identifier => '#{content}'#{ps}} %>"
|
|
59
|
+
else
|
|
60
|
+
''
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class ComfyPress::Tag::FieldDateTime
|
|
2
|
+
include ComfyPress::Tag
|
|
3
|
+
|
|
4
|
+
def self.regex_tag_signature(identifier = nil)
|
|
5
|
+
identifier ||= IDENTIFIER_REGEX
|
|
6
|
+
/\{\{\s*cms:field:(#{identifier}):datetime\s*\}\}/
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def content
|
|
10
|
+
block.content
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def render
|
|
14
|
+
''
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class ComfyPress::Tag::FieldInteger
|
|
2
|
+
include ComfyPress::Tag
|
|
3
|
+
|
|
4
|
+
def self.regex_tag_signature(identifier = nil)
|
|
5
|
+
identifier ||= IDENTIFIER_REGEX
|
|
6
|
+
/\{\{\s*cms:field:(#{identifier}):integer\s*\}\}/
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def content
|
|
10
|
+
block.content
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def render
|
|
14
|
+
''
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class ComfyPress::Tag::FieldRichText
|
|
2
|
+
include ComfyPress::Tag
|
|
3
|
+
|
|
4
|
+
def self.regex_tag_signature(identifier = nil)
|
|
5
|
+
identifier ||= IDENTIFIER_REGEX
|
|
6
|
+
/\{\{\s*cms:field:(#{identifier}):rich_text\s*?\}\}/
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def content
|
|
10
|
+
block.content
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def render
|
|
14
|
+
''
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class ComfyPress::Tag::FieldString
|
|
2
|
+
include ComfyPress::Tag
|
|
3
|
+
|
|
4
|
+
def self.regex_tag_signature(identifier = nil)
|
|
5
|
+
identifier ||= IDENTIFIER_REGEX
|
|
6
|
+
/\{\{\s*cms:field:(#{identifier}):?(?:string)?\s*\}\}/
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def content
|
|
10
|
+
block.content
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def render
|
|
14
|
+
''
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class ComfyPress::Tag::FieldText
|
|
2
|
+
include ComfyPress::Tag
|
|
3
|
+
|
|
4
|
+
def self.regex_tag_signature(identifier = nil)
|
|
5
|
+
identifier ||= IDENTIFIER_REGEX
|
|
6
|
+
/\{\{\s*cms:field:(#{identifier}):?(?:text)?\s*?\}\}/
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def content
|
|
10
|
+
block.content
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def render
|
|
14
|
+
''
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
class ComfyPress::Tag::File
|
|
2
|
+
include ComfyPress::Tag
|
|
3
|
+
|
|
4
|
+
def self.regex_tag_signature(identifier = nil)
|
|
5
|
+
identifier ||= IDENTIFIER_REGEX
|
|
6
|
+
/\{\{\s*cms:file:(#{identifier}):?(.*?)\s*\}\}/
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# Initializing Cms::File object
|
|
10
|
+
def file
|
|
11
|
+
page.site.files.detect{|f| f.file_file_name == self.identifier.to_s}
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def content
|
|
15
|
+
return unless file
|
|
16
|
+
|
|
17
|
+
format = params[0]
|
|
18
|
+
text = params[1] || identifier
|
|
19
|
+
|
|
20
|
+
case format
|
|
21
|
+
when 'link'
|
|
22
|
+
"<a href='#{file.file.url}' target='_blank'>#{text}</a>"
|
|
23
|
+
when 'image'
|
|
24
|
+
"<img src='#{file.file.url}' alt='#{text}' />"
|
|
25
|
+
else
|
|
26
|
+
file.file.url
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
class ComfyPress::Tag::Helper
|
|
2
|
+
include ComfyPress::Tag
|
|
3
|
+
|
|
4
|
+
BLACKLIST = %w(eval class_eval instance_eval render)
|
|
5
|
+
|
|
6
|
+
def self.regex_tag_signature(identifier = nil)
|
|
7
|
+
identifier ||= /[\w\-]+/
|
|
8
|
+
/\{\{\s*cms:helper:(#{identifier}):?(.*?)\s*\}\}/
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def content
|
|
12
|
+
"<%= #{identifier}(#{params.collect{|p| "'#{p}'"}.join(', ')}) %>"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def render
|
|
16
|
+
whitelist = ComfyPress.config.allowed_helpers
|
|
17
|
+
if whitelist.is_a?(Array)
|
|
18
|
+
content if whitelist.map!(&:to_s).member?(identifier)
|
|
19
|
+
else
|
|
20
|
+
content unless BLACKLIST.member?(identifier)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
class ComfyPress::Tag::Menu
|
|
2
|
+
include ComfyPress::Tag
|
|
3
|
+
|
|
4
|
+
def self.regex_tag_signature(identifier = nil)
|
|
5
|
+
# identifier ||= /[\w\-]+/
|
|
6
|
+
# /\{\{\s*cms:menu:(#{identifier})\s*\}\}/
|
|
7
|
+
identifier ||= /[\w\/\-]+/
|
|
8
|
+
/\{\{\s*cms:menu:(#{identifier}):?(.*?)\s*\}\}/
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def content
|
|
12
|
+
# Find or initialize Cms::Menu object
|
|
13
|
+
menu = page.site.menus.detect{|s| s.identifier == self.identifier.to_s}
|
|
14
|
+
if menu
|
|
15
|
+
"<%= render partial: 'cms_content/menu', locals: {menu_id: #{menu.id}} %>"
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def render
|
|
20
|
+
whitelist = ComfyPress.config.allowed_partials
|
|
21
|
+
if whitelist.is_a?(Array)
|
|
22
|
+
content if whitelist.member?(identifier)
|
|
23
|
+
else
|
|
24
|
+
content
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
class ComfyPress::Tag::PageFile
|
|
2
|
+
include ComfyPress::Tag
|
|
3
|
+
|
|
4
|
+
# Signature of a tag:
|
|
5
|
+
# {{ cms:page_file:some_label:type:params }}
|
|
6
|
+
# Simple tag can be:
|
|
7
|
+
# {{ cms:page_file:some_label }}
|
|
8
|
+
def self.regex_tag_signature(identifier = nil)
|
|
9
|
+
identifier ||= IDENTIFIER_REGEX
|
|
10
|
+
/\{\{\s*cms:page_file:(#{identifier}):?(.*?)\s*\}\}/
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Type of the tag controls how file is rendered
|
|
14
|
+
def type
|
|
15
|
+
s = params[0].to_s.gsub(/\[.*?\]/, '')
|
|
16
|
+
%w(partial url image link field).member?(s) ? s : 'url'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def dimensions
|
|
20
|
+
params[0].to_s.match(/\[(.*?)\]/)[1] rescue nil
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def content
|
|
24
|
+
block.files.first
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def render
|
|
28
|
+
file = block.files.first
|
|
29
|
+
case self.type
|
|
30
|
+
when 'url'
|
|
31
|
+
return '' unless file
|
|
32
|
+
file.file.url
|
|
33
|
+
when 'link'
|
|
34
|
+
return '' unless file
|
|
35
|
+
text = params[1] || identifier
|
|
36
|
+
"<a href='#{file.file.url}' target='_blank'>#{text}</a>"
|
|
37
|
+
when 'image'
|
|
38
|
+
return '' unless file
|
|
39
|
+
text = params[1] || identifier
|
|
40
|
+
"<img src='#{file.file.url}' alt='#{text}' />"
|
|
41
|
+
when 'partial'
|
|
42
|
+
path = params[1] || 'partials/page_file'
|
|
43
|
+
ps = (self.params[2..-1] || []).collect_with_index{|p, i| ":param_#{i+1} => '#{p}'"}.join(', ')
|
|
44
|
+
ps = ps.present?? ", #{ps}" : ''
|
|
45
|
+
"<%= render :partial => '#{path}', :locals => {:identifier => #{file.try(:id) || 'nil'}#{ps}} %>"
|
|
46
|
+
when 'field'
|
|
47
|
+
''
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
class ComfyPress::Tag::PageFiles
|
|
2
|
+
include ComfyPress::Tag
|
|
3
|
+
|
|
4
|
+
def self.regex_tag_signature(identifier = nil)
|
|
5
|
+
identifier ||= IDENTIFIER_REGEX
|
|
6
|
+
/\{\{\s*cms:page_files:(#{identifier}):?(.*?)\s*\}\}/
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# Type of the tag controls how file is rendered
|
|
10
|
+
def type
|
|
11
|
+
s = params[0].to_s.gsub(/\[.*?\]/, '')
|
|
12
|
+
%w(partial url image link field).member?(s) ? s : 'url'
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def dimensions
|
|
16
|
+
params[0].to_s.match(/\[(.*?)\]/)[1] rescue nil
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def content
|
|
20
|
+
block.files
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def render
|
|
24
|
+
files = block.files
|
|
25
|
+
case self.type
|
|
26
|
+
when 'url'
|
|
27
|
+
return '' if files.blank?
|
|
28
|
+
files.collect do |file|
|
|
29
|
+
file.file.url
|
|
30
|
+
end.join(', ')
|
|
31
|
+
when 'link'
|
|
32
|
+
return '' if files.blank?
|
|
33
|
+
files.collect do |file|
|
|
34
|
+
"<a href='#{file.file.url}' target='_blank'>#{file.label}</a>"
|
|
35
|
+
end.join(' ')
|
|
36
|
+
when 'image'
|
|
37
|
+
return '' if files.blank?
|
|
38
|
+
files.collect do |file|
|
|
39
|
+
"<img src='#{file.file.url}' alt='#{file.label}' />"
|
|
40
|
+
end.join(' ')
|
|
41
|
+
when 'partial'
|
|
42
|
+
path = params[1] || 'partials/page_files'
|
|
43
|
+
ps = (self.params[2..-1] || []).collect_with_index{|p, i| ":param_#{i+1} => '#{p}'"}.join(', ')
|
|
44
|
+
ps = ps.present?? ", #{ps}" : ''
|
|
45
|
+
ids = files.present?? files.collect(&:id).join(',') : ''
|
|
46
|
+
"<%= render :partial => '#{path}', :locals => {:identifier => [#{ids}]#{ps}} %>"
|
|
47
|
+
when 'field'
|
|
48
|
+
''
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
class ComfyPress::Tag::PageMarkdown
|
|
2
|
+
include ComfyPress::Tag
|
|
3
|
+
|
|
4
|
+
def self.regex_tag_signature(identifier = nil)
|
|
5
|
+
identifier ||= IDENTIFIER_REGEX
|
|
6
|
+
/\{\{\s*cms:page:(#{identifier}):markdown\s*\}\}/
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def content
|
|
10
|
+
block.content
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def render
|
|
14
|
+
md = Redcarpet::Markdown.new(Redcarpet::Render::HTML,
|
|
15
|
+
:autolink => true,
|
|
16
|
+
:no_intra_emphasis => true,
|
|
17
|
+
:fenced_code_blocks => true,
|
|
18
|
+
:lax_spacing => true
|
|
19
|
+
)
|
|
20
|
+
md.render(content.to_s)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class ComfyPress::Tag::PageRichText
|
|
2
|
+
include ComfyPress::Tag
|
|
3
|
+
|
|
4
|
+
def self.regex_tag_signature(identifier = nil)
|
|
5
|
+
identifier ||= IDENTIFIER_REGEX
|
|
6
|
+
/\{\{\s*cms:page:(#{identifier}):rich_text\s*\}\}/
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def content
|
|
10
|
+
block.content
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
class ComfyPress::Tag::Partial
|
|
2
|
+
include ComfyPress::Tag
|
|
3
|
+
|
|
4
|
+
def self.regex_tag_signature(identifier = nil)
|
|
5
|
+
identifier ||= /[\w\/\-]+/
|
|
6
|
+
/\{\{\s*cms:partial:(#{identifier}):?(.*?)\s*\}\}/
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def content
|
|
10
|
+
ps = params.collect_with_index{|p, i| ":param_#{i+1} => '#{p}'"}.join(', ')
|
|
11
|
+
"<%= render :partial => '#{identifier}'#{ps.blank?? nil : ", :locals => {#{ps}}"} %>"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def render
|
|
15
|
+
whitelist = ComfyPress.config.allowed_partials
|
|
16
|
+
if whitelist.is_a?(Array)
|
|
17
|
+
content if whitelist.member?(identifier)
|
|
18
|
+
else
|
|
19
|
+
content
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
class ComfyPress::Tag::Snippet
|
|
2
|
+
include ComfyPress::Tag
|
|
3
|
+
|
|
4
|
+
def self.regex_tag_signature(identifier = nil)
|
|
5
|
+
identifier ||= /[\w\-]+/
|
|
6
|
+
/\{\{\s*cms:snippet:(#{identifier})\s*\}\}/
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# Find or initialize Cms::Snippet object
|
|
10
|
+
def snippet
|
|
11
|
+
page.site.snippets.detect{|s| s.identifier == self.identifier.to_s} ||
|
|
12
|
+
page.site.snippets.build(:identifier => self.identifier.to_s)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def content
|
|
16
|
+
snippet.content
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|