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.
Files changed (289) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.travis.yml +22 -0
  4. data/Gemfile +22 -0
  5. data/Gemfile.lock +175 -0
  6. data/LICENSE +20 -0
  7. data/README.md +79 -0
  8. data/Rakefile +5 -0
  9. data/app/assets/images/comfypress/arrow_bottom.gif +0 -0
  10. data/app/assets/images/comfypress/arrow_right.gif +0 -0
  11. data/app/assets/images/comfypress/bootstrap/glyphicons-halflings-white.png +0 -0
  12. data/app/assets/images/comfypress/bootstrap/glyphicons-halflings.png +0 -0
  13. data/app/assets/images/comfypress/checkerboard.gif +0 -0
  14. data/app/assets/images/comfypress/icon_draft.gif +0 -0
  15. data/app/assets/images/comfypress/icon_file.gif +0 -0
  16. data/app/assets/images/comfypress/icon_layout.gif +0 -0
  17. data/app/assets/images/comfypress/icon_move.gif +0 -0
  18. data/app/assets/images/comfypress/icon_page.gif +0 -0
  19. data/app/assets/images/comfypress/icon_site.gif +0 -0
  20. data/app/assets/images/comfypress/icon_snippet.gif +0 -0
  21. data/app/assets/images/comfypress/nav_arrow.png +0 -0
  22. data/app/assets/javascripts/comfypress/admin/application.js +1 -0
  23. data/app/assets/javascripts/comfypress/application.js.coffee +175 -0
  24. data/app/assets/javascripts/comfypress/lib/bootstrap-datetimepicker.js +21 -0
  25. data/app/assets/javascripts/comfypress/lib/bootstrap-wysihtml5.js +492 -0
  26. data/app/assets/javascripts/comfypress/lib/bootstrap.js +6 -0
  27. data/app/assets/javascripts/comfypress/lib/codemirror.js +10 -0
  28. data/app/assets/javascripts/comfypress/lib/wysihtml5.js +261 -0
  29. data/app/assets/stylesheets/comfypress/admin/application.css +1 -0
  30. data/app/assets/stylesheets/comfypress/application.css.sass +8 -0
  31. data/app/assets/stylesheets/comfypress/base.css.sass +333 -0
  32. data/app/assets/stylesheets/comfypress/bootstrap_overrides.css.sass +45 -0
  33. data/app/assets/stylesheets/comfypress/codemirror_overrides.css.sass +27 -0
  34. data/app/assets/stylesheets/comfypress/lib/bootstrap-datetimepicker.css +9 -0
  35. data/app/assets/stylesheets/comfypress/lib/bootstrap-wysihtml5.css +102 -0
  36. data/app/assets/stylesheets/comfypress/lib/bootstrap.css +9 -0
  37. data/app/assets/stylesheets/comfypress/lib/codemirror.css +240 -0
  38. data/app/assets/stylesheets/comfypress/wysihtml5_overrides.css.sass +5 -0
  39. data/app/controllers/application_controller.rb +5 -0
  40. data/app/controllers/cms_admin/base_controller.rb +51 -0
  41. data/app/controllers/cms_admin/categories_controller.rb +35 -0
  42. data/app/controllers/cms_admin/files_controller.rb +108 -0
  43. data/app/controllers/cms_admin/layouts_controller.rb +67 -0
  44. data/app/controllers/cms_admin/menu_items_controller.rb +65 -0
  45. data/app/controllers/cms_admin/menus_controller.rb +60 -0
  46. data/app/controllers/cms_admin/pages_controller.rb +112 -0
  47. data/app/controllers/cms_admin/revisions_controller.rb +57 -0
  48. data/app/controllers/cms_admin/sites_controller.rb +64 -0
  49. data/app/controllers/cms_admin/snippets_controller.rb +64 -0
  50. data/app/controllers/cms_content_controller.rb +79 -0
  51. data/app/helpers/application_helper.rb +16 -0
  52. data/app/models/cms/block.rb +48 -0
  53. data/app/models/cms/categorization.rb +21 -0
  54. data/app/models/cms/category.rb +30 -0
  55. data/app/models/cms/file.rb +75 -0
  56. data/app/models/cms/layout.rb +99 -0
  57. data/app/models/cms/menu.rb +26 -0
  58. data/app/models/cms/menu_item.rb +14 -0
  59. data/app/models/cms/page.rb +202 -0
  60. data/app/models/cms/revision.rb +17 -0
  61. data/app/models/cms/site.rb +113 -0
  62. data/app/models/cms/snippet.rb +58 -0
  63. data/app/models/cms.rb +5 -0
  64. data/app/views/cms_admin/categories/_categories.html.haml +3 -0
  65. data/app/views/cms_admin/categories/_edit.html.haml +6 -0
  66. data/app/views/cms_admin/categories/_form.html.haml +8 -0
  67. data/app/views/cms_admin/categories/_index.html.haml +24 -0
  68. data/app/views/cms_admin/categories/_show.html.haml +13 -0
  69. data/app/views/cms_admin/categories/create.js.erb +7 -0
  70. data/app/views/cms_admin/categories/destroy.js.erb +3 -0
  71. data/app/views/cms_admin/categories/edit.js.erb +3 -0
  72. data/app/views/cms_admin/categories/update.js.erb +6 -0
  73. data/app/views/cms_admin/files/_file.html.haml +13 -0
  74. data/app/views/cms_admin/files/_form.html.haml +14 -0
  75. data/app/views/cms_admin/files/_index.html.haml +14 -0
  76. data/app/views/cms_admin/files/_page_form.html.haml +9 -0
  77. data/app/views/cms_admin/files/destroy.js.coffee +2 -0
  78. data/app/views/cms_admin/files/edit.html.haml +5 -0
  79. data/app/views/cms_admin/files/index.html.haml +28 -0
  80. data/app/views/cms_admin/files/new.html.haml +5 -0
  81. data/app/views/cms_admin/layouts/_form.html.haml +17 -0
  82. data/app/views/cms_admin/layouts/_index_branch.html.haml +23 -0
  83. data/app/views/cms_admin/layouts/edit.html.haml +9 -0
  84. data/app/views/cms_admin/layouts/index.html.haml +9 -0
  85. data/app/views/cms_admin/layouts/new.html.haml +5 -0
  86. data/app/views/cms_admin/menu_items/_form.html.haml +22 -0
  87. data/app/views/cms_admin/menu_items/edit.html.haml +8 -0
  88. data/app/views/cms_admin/menu_items/index.html.haml +24 -0
  89. data/app/views/cms_admin/menu_items/new.html.haml +5 -0
  90. data/app/views/cms_admin/menus/_form.html.haml +8 -0
  91. data/app/views/cms_admin/menus/edit.html.haml +8 -0
  92. data/app/views/cms_admin/menus/index.html.haml +24 -0
  93. data/app/views/cms_admin/menus/new.html.haml +5 -0
  94. data/app/views/cms_admin/pages/_form.html.haml +38 -0
  95. data/app/views/cms_admin/pages/_form_blocks.html.haml +28 -0
  96. data/app/views/cms_admin/pages/_index_branch.html.haml +35 -0
  97. data/app/views/cms_admin/pages/edit.html.haml +9 -0
  98. data/app/views/cms_admin/pages/form_blocks.js.erb +2 -0
  99. data/app/views/cms_admin/pages/index.html.haml +11 -0
  100. data/app/views/cms_admin/pages/new.html.haml +5 -0
  101. data/app/views/cms_admin/pages/toggle_branch.js.erb +11 -0
  102. data/app/views/cms_admin/revisions/show.html.haml +28 -0
  103. data/app/views/cms_admin/sites/_form.html.haml +14 -0
  104. data/app/views/cms_admin/sites/_mirrors.html.haml +17 -0
  105. data/app/views/cms_admin/sites/edit.html.haml +5 -0
  106. data/app/views/cms_admin/sites/index.html.haml +24 -0
  107. data/app/views/cms_admin/sites/new.html.haml +5 -0
  108. data/app/views/cms_admin/snippets/_form.html.haml +11 -0
  109. data/app/views/cms_admin/snippets/edit.html.haml +9 -0
  110. data/app/views/cms_admin/snippets/index.html.haml +28 -0
  111. data/app/views/cms_admin/snippets/new.html.haml +5 -0
  112. data/app/views/cms_content/_menu.html.haml +5 -0
  113. data/app/views/cms_content/render_sitemap.xml.builder +15 -0
  114. data/app/views/layouts/cms_admin/_body.html.haml +16 -0
  115. data/app/views/layouts/cms_admin/_center.html.haml +7 -0
  116. data/app/views/layouts/cms_admin/_footer.html.haml +3 -0
  117. data/app/views/layouts/cms_admin/_footer_js.html.haml +7 -0
  118. data/app/views/layouts/cms_admin/_head.html.haml +12 -0
  119. data/app/views/layouts/cms_admin/_left.html.haml +11 -0
  120. data/app/views/layouts/cms_admin/_right.html.haml +1 -0
  121. data/app/views/layouts/cms_admin.html.haml +4 -0
  122. data/comfypress.gemspec +28 -0
  123. data/config/application.rb +69 -0
  124. data/config/boot.rb +6 -0
  125. data/config/database.sqlite.yml +47 -0
  126. data/config/database.yml +47 -0
  127. data/config/environment.rb +5 -0
  128. data/config/environments/development.rb +39 -0
  129. data/config/environments/production.rb +67 -0
  130. data/config/environments/test.rb +39 -0
  131. data/config/initializers/comfypress.rb +100 -0
  132. data/config/initializers/paperclip.rb +3 -0
  133. data/config/locales/de.yml +236 -0
  134. data/config/locales/en.yml +285 -0
  135. data/config/locales/es.yml +236 -0
  136. data/config/locales/fr.yml +236 -0
  137. data/config/locales/ja.yml +237 -0
  138. data/config/locales/pl.yml +236 -0
  139. data/config/locales/pt-BR.yml +236 -0
  140. data/config/locales/ru.yml +236 -0
  141. data/config/locales/sv.yml +236 -0
  142. data/config/locales/zh-CN.yml +236 -0
  143. data/config/routes.rb +10 -0
  144. data/config.ru +4 -0
  145. data/db/cms_fixtures/sample-site/layouts/default/_default.yml +1 -0
  146. data/db/cms_fixtures/sample-site/layouts/default/content.html +5 -0
  147. data/db/cms_fixtures/sample-site/layouts/default/css.css +1 -0
  148. data/db/cms_fixtures/sample-site/layouts/default/js.js +1 -0
  149. data/db/cms_fixtures/sample-site/layouts/default/nested/_nested.yml +2 -0
  150. data/db/cms_fixtures/sample-site/layouts/default/nested/content.html +2 -0
  151. data/db/cms_fixtures/sample-site/layouts/default/nested/css.css +1 -0
  152. data/db/cms_fixtures/sample-site/layouts/default/nested/js.js +1 -0
  153. data/db/cms_fixtures/sample-site/pages/index/_index.yml +2 -0
  154. data/db/cms_fixtures/sample-site/pages/index/child/_child.yml +3 -0
  155. data/db/cms_fixtures/sample-site/pages/index/child/left.html +1 -0
  156. data/db/cms_fixtures/sample-site/pages/index/child/right.html +1 -0
  157. data/db/cms_fixtures/sample-site/pages/index/content.html +2 -0
  158. data/db/cms_fixtures/sample-site/snippets/default/_default.yml +1 -0
  159. data/db/cms_fixtures/sample-site/snippets/default/content.html +1 -0
  160. data/db/migrate/01_create_cms.rb +163 -0
  161. data/db/seeds.rb +9 -0
  162. data/db/upgrade_migrations/02_upgrade_to_1_1_0.rb +19 -0
  163. data/db/upgrade_migrations/03_upgrade_to_1_2_0.rb +15 -0
  164. data/db/upgrade_migrations/04_upgrade_to_1_3_0.rb +23 -0
  165. data/db/upgrade_migrations/05_upgrade_to_1_4_0.rb +33 -0
  166. data/db/upgrade_migrations/06_upgrade_to_1_5_0.rb +21 -0
  167. data/db/upgrade_migrations/07_upgrade_to_1_6_0.rb +25 -0
  168. data/doc/preview.png +0 -0
  169. data/doc/sofa.png +0 -0
  170. data/lib/comfypress/authentication/dummy_auth.rb +8 -0
  171. data/lib/comfypress/authentication/http_auth.rb +18 -0
  172. data/lib/comfypress/configuration.rb +99 -0
  173. data/lib/comfypress/engine.rb +18 -0
  174. data/lib/comfypress/error.rb +24 -0
  175. data/lib/comfypress/extensions/acts_as_tree.rb +102 -0
  176. data/lib/comfypress/extensions/has_revisions.rb +64 -0
  177. data/lib/comfypress/extensions/is_categorized.rb +49 -0
  178. data/lib/comfypress/extensions/is_mirrored.rb +85 -0
  179. data/lib/comfypress/extensions/rails.rb +24 -0
  180. data/lib/comfypress/fixtures.rb +289 -0
  181. data/lib/comfypress/form_builder.rb +97 -0
  182. data/lib/comfypress/render_methods.rb +85 -0
  183. data/lib/comfypress/routing.rb +62 -0
  184. data/lib/comfypress/sitemap.rb +27 -0
  185. data/lib/comfypress/tag.rb +154 -0
  186. data/lib/comfypress/tags/asset.rb +25 -0
  187. data/lib/comfypress/tags/collection.rb +64 -0
  188. data/lib/comfypress/tags/field_datetime.rb +17 -0
  189. data/lib/comfypress/tags/field_integer.rb +17 -0
  190. data/lib/comfypress/tags/field_rich_text.rb +17 -0
  191. data/lib/comfypress/tags/field_string.rb +17 -0
  192. data/lib/comfypress/tags/field_text.rb +17 -0
  193. data/lib/comfypress/tags/file.rb +29 -0
  194. data/lib/comfypress/tags/helper.rb +24 -0
  195. data/lib/comfypress/tags/menu.rb +27 -0
  196. data/lib/comfypress/tags/page_datetime.rb +13 -0
  197. data/lib/comfypress/tags/page_file.rb +51 -0
  198. data/lib/comfypress/tags/page_files.rb +52 -0
  199. data/lib/comfypress/tags/page_integer.rb +13 -0
  200. data/lib/comfypress/tags/page_markdown.rb +22 -0
  201. data/lib/comfypress/tags/page_rich_text.rb +13 -0
  202. data/lib/comfypress/tags/page_string.rb +13 -0
  203. data/lib/comfypress/tags/page_text.rb +13 -0
  204. data/lib/comfypress/tags/partial.rb +23 -0
  205. data/lib/comfypress/tags/snippet.rb +19 -0
  206. data/lib/comfypress/version.rb +3 -0
  207. data/lib/comfypress/view_hooks.rb +32 -0
  208. data/lib/comfypress/view_methods.rb +52 -0
  209. data/lib/comfypress.rb +66 -0
  210. data/lib/generators/comfy/cms/README +10 -0
  211. data/lib/generators/comfy/cms/cms_generator.rb +57 -0
  212. data/lib/tasks/comfypress.rake +45 -0
  213. data/script/rails +6 -0
  214. data/test/fixtures/cms/blocks.yml +12 -0
  215. data/test/fixtures/cms/categories.yml +4 -0
  216. data/test/fixtures/cms/categorizations.yml +3 -0
  217. data/test/fixtures/cms/files.yml +9 -0
  218. data/test/fixtures/cms/layouts.yml +40 -0
  219. data/test/fixtures/cms/menu_items.yml +15 -0
  220. data/test/fixtures/cms/menus.yml +9 -0
  221. data/test/fixtures/cms/pages.yml +39 -0
  222. data/test/fixtures/cms/revisions.yml +21 -0
  223. data/test/fixtures/cms/sites.yml +6 -0
  224. data/test/fixtures/cms/snippets.yml +6 -0
  225. data/test/fixtures/files/data.zip +0 -0
  226. data/test/fixtures/files/document.pdf +0 -0
  227. data/test/fixtures/files/image.gif +0 -0
  228. data/test/fixtures/files/image.jpg +0 -0
  229. data/test/fixtures/views/_nav_hook.html.erb +1 -0
  230. data/test/fixtures/views/_nav_hook_2.html.erb +1 -0
  231. data/test/fixtures/views/render_test/_test.html.erb +1 -0
  232. data/test/fixtures/views/render_test/new.html.erb +1 -0
  233. data/test/fixtures/views/render_test/render_layout.html.erb +1 -0
  234. data/test/functional/cms_admin/base_controller_test.rb +18 -0
  235. data/test/functional/cms_admin/categories_controller_test.rb +70 -0
  236. data/test/functional/cms_admin/files_controller_test.rb +216 -0
  237. data/test/functional/cms_admin/layouts_controller_test.rb +123 -0
  238. data/test/functional/cms_admin/pages_controller_test.rb +450 -0
  239. data/test/functional/cms_admin/revisions_controller_test.rb +138 -0
  240. data/test/functional/cms_admin/sites_controller_test.rb +105 -0
  241. data/test/functional/cms_admin/snippets_controller_test.rb +140 -0
  242. data/test/functional/cms_content_controller_test.rb +205 -0
  243. data/test/gemfiles/Gemfile.rails.3.1 +16 -0
  244. data/test/gemfiles/Gemfile.rails.3.2 +16 -0
  245. data/test/gemfiles/Gemfile.rails.4.0 +16 -0
  246. data/test/integration/authentication_test.rb +48 -0
  247. data/test/integration/fixtures_test.rb +61 -0
  248. data/test/integration/mirrors_test.rb +72 -0
  249. data/test/integration/render_cms_test.rb +233 -0
  250. data/test/integration/sites_test.rb +120 -0
  251. data/test/integration/view_hooks_test.rb +43 -0
  252. data/test/test_helper.rb +124 -0
  253. data/test/unit/cms/menu_item_test.rb +7 -0
  254. data/test/unit/cms/menu_test.rb +7 -0
  255. data/test/unit/configuration_test.rb +42 -0
  256. data/test/unit/fixtures_test.rb +357 -0
  257. data/test/unit/mirrors_test.rb +242 -0
  258. data/test/unit/models/block_test.rb +199 -0
  259. data/test/unit/models/categorization_test.rb +76 -0
  260. data/test/unit/models/category_test.rb +39 -0
  261. data/test/unit/models/file_test.rb +89 -0
  262. data/test/unit/models/layout_test.rb +125 -0
  263. data/test/unit/models/page_test.rb +255 -0
  264. data/test/unit/models/site_test.rb +152 -0
  265. data/test/unit/models/snippet_test.rb +49 -0
  266. data/test/unit/revisions_test.rb +185 -0
  267. data/test/unit/sitemap_test.rb +20 -0
  268. data/test/unit/tag_test.rb +308 -0
  269. data/test/unit/tags/asset_test.rb +56 -0
  270. data/test/unit/tags/collection_test.rb +116 -0
  271. data/test/unit/tags/field_datetime_test.rb +50 -0
  272. data/test/unit/tags/field_integer_test.rb +49 -0
  273. data/test/unit/tags/field_rich_text_test.rb +49 -0
  274. data/test/unit/tags/field_string_test.rb +52 -0
  275. data/test/unit/tags/field_text_test.rb +48 -0
  276. data/test/unit/tags/file_test.rb +67 -0
  277. data/test/unit/tags/helper_test.rb +86 -0
  278. data/test/unit/tags/page_datetime_test.rb +50 -0
  279. data/test/unit/tags/page_file_test.rb +119 -0
  280. data/test/unit/tags/page_files_test.rb +113 -0
  281. data/test/unit/tags/page_integer_test.rb +49 -0
  282. data/test/unit/tags/page_markdown_test.rb +48 -0
  283. data/test/unit/tags/page_rich_text_test.rb +49 -0
  284. data/test/unit/tags/page_string_test.rb +49 -0
  285. data/test/unit/tags/page_text_test.rb +52 -0
  286. data/test/unit/tags/partial_test.rb +76 -0
  287. data/test/unit/tags/snippet_test.rb +45 -0
  288. data/test/unit/view_methods_test.rb +80 -0
  289. 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('<%', '&lt;%').gsub('%>', '%&gt;')
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,13 @@
1
+ class ComfyPress::Tag::PageDateTime
2
+ include ComfyPress::Tag
3
+
4
+ def self.regex_tag_signature(identifier = nil)
5
+ identifier ||= IDENTIFIER_REGEX
6
+ /\{\{\s*cms:page:(#{identifier}):datetime\s*\}\}/
7
+ end
8
+
9
+ def content
10
+ block.content
11
+ end
12
+
13
+ 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,13 @@
1
+ class ComfyPress::Tag::PageInteger
2
+ include ComfyPress::Tag
3
+
4
+ def self.regex_tag_signature(identifier = nil)
5
+ identifier ||= IDENTIFIER_REGEX
6
+ /\{\{\s*cms:page:(#{identifier}):integer\s*\}\}/
7
+ end
8
+
9
+ def content
10
+ block.content
11
+ end
12
+
13
+ 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,13 @@
1
+ class ComfyPress::Tag::PageString
2
+ include ComfyPress::Tag
3
+
4
+ def self.regex_tag_signature(identifier = nil)
5
+ identifier ||= IDENTIFIER_REGEX
6
+ /\{\{\s*cms:page:(#{identifier}):string\s*\}\}/
7
+ end
8
+
9
+ def content
10
+ block.content
11
+ end
12
+
13
+ end
@@ -0,0 +1,13 @@
1
+ class ComfyPress::Tag::PageText
2
+ include ComfyPress::Tag
3
+
4
+ def self.regex_tag_signature(identifier = nil)
5
+ identifier ||= IDENTIFIER_REGEX
6
+ /\{\{\s*cms:page:(#{identifier}):?(?: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