sinicum 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (176) hide show
  1. checksums.yaml +7 -0
  2. data/.cane +19 -0
  3. data/.gitignore +14 -0
  4. data/.rubocop.yml +30 -0
  5. data/.travis.yml +14 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +24 -0
  8. data/README.md +327 -0
  9. data/Rakefile +37 -0
  10. data/app/assets/javascripts/sinicum/magnolia_client.js.coffee +233 -0
  11. data/app/controllers/sinicum/controller_base.rb +173 -0
  12. data/app/controllers/sinicum/controllers/cache_aware.rb +16 -0
  13. data/app/controllers/sinicum/controllers/global_state_cache.rb +83 -0
  14. data/app/helpers/sinicum/helper_utils.rb +152 -0
  15. data/app/helpers/sinicum/mgnl_helper.rb +145 -0
  16. data/app/helpers/sinicum/mgnl_helper5.rb +7 -0
  17. data/app/helpers/sinicum/mgnl_image_helper.rb +26 -0
  18. data/app/helpers/sinicum/taglib_helper5.rb +166 -0
  19. data/gemfiles/Gemfile-3.2 +6 -0
  20. data/gemfiles/Gemfile-4.0 +6 -0
  21. data/lib/generators/sinicum/install_generator.rb +162 -0
  22. data/lib/generators/sinicum/templates/VersionHandler.java +18 -0
  23. data/lib/generators/sinicum/templates/config/default/log4j-development.xml +203 -0
  24. data/lib/generators/sinicum/templates/config/default/log4j.xml +200 -0
  25. data/lib/generators/sinicum/templates/config/default/magnolia-author.properties +63 -0
  26. data/lib/generators/sinicum/templates/config/default/magnolia-public01.properties +63 -0
  27. data/lib/generators/sinicum/templates/config/default/magnolia.properties +63 -0
  28. data/lib/generators/sinicum/templates/config/repo-conf/jackrabbit-bundle-postgres-search-author.xml +73 -0
  29. data/lib/generators/sinicum/templates/config/repo-conf/jackrabbit-bundle-postgres-search-public01.xml +73 -0
  30. data/lib/generators/sinicum/templates/config/repo-conf/jackrabbit-bundle-postgres-search.xml +70 -0
  31. data/lib/generators/sinicum/templates/magnolia/config.modules.myproject.dialogs.xml +1625 -0
  32. data/lib/generators/sinicum/templates/magnolia/config.modules.myproject.templates.xml +247 -0
  33. data/lib/generators/sinicum/templates/module-config.xml +13 -0
  34. data/lib/generators/sinicum/templates/module-pom.xml +67 -0
  35. data/lib/generators/sinicum/templates/project-pom.xml +104 -0
  36. data/lib/generators/sinicum/templates/rails/_article.html.haml +15 -0
  37. data/lib/generators/sinicum/templates/rails/_content.html.haml +2 -0
  38. data/lib/generators/sinicum/templates/rails/_meta.html.haml +9 -0
  39. data/lib/generators/sinicum/templates/rails/application.html.haml +11 -0
  40. data/lib/generators/sinicum/templates/rails/content_controller.rb +5 -0
  41. data/lib/generators/sinicum/templates/rails/imaging.yml +8 -0
  42. data/lib/generators/sinicum/templates/rails/sinicum_server.yml +15 -0
  43. data/lib/sinicum.rb +53 -0
  44. data/lib/sinicum/content/aggregator.rb +173 -0
  45. data/lib/sinicum/content/website_content_resolver.rb +10 -0
  46. data/lib/sinicum/engine.rb +23 -0
  47. data/lib/sinicum/imaging.rb +29 -0
  48. data/lib/sinicum/imaging/config.rb +133 -0
  49. data/lib/sinicum/imaging/converter.rb +81 -0
  50. data/lib/sinicum/imaging/default_converter.rb +20 -0
  51. data/lib/sinicum/imaging/image_size_converter.rb +52 -0
  52. data/lib/sinicum/imaging/imaging.rb +171 -0
  53. data/lib/sinicum/imaging/imaging_file.rb +115 -0
  54. data/lib/sinicum/imaging/imaging_middleware.rb +56 -0
  55. data/lib/sinicum/imaging/max_size_converter.rb +39 -0
  56. data/lib/sinicum/imaging/resize_crop_converter.rb +35 -0
  57. data/lib/sinicum/jcr/api_client.rb +50 -0
  58. data/lib/sinicum/jcr/api_queries.rb +37 -0
  59. data/lib/sinicum/jcr/cache/global_cache.rb +26 -0
  60. data/lib/sinicum/jcr/dam/document.rb +57 -0
  61. data/lib/sinicum/jcr/dam/image.rb +40 -0
  62. data/lib/sinicum/jcr/jcr_configuration.rb +67 -0
  63. data/lib/sinicum/jcr/mgnl4_compatibility.rb +11 -0
  64. data/lib/sinicum/jcr/node.rb +268 -0
  65. data/lib/sinicum/jcr/node_initializer.rb +16 -0
  66. data/lib/sinicum/jcr/node_queries.rb +101 -0
  67. data/lib/sinicum/jcr/query_sanitizer.rb +24 -0
  68. data/lib/sinicum/jcr/type_translator.rb +38 -0
  69. data/lib/sinicum/jcr/type_translators/component_translator.rb +28 -0
  70. data/lib/sinicum/jcr/type_translators/dam_translator.rb +33 -0
  71. data/lib/sinicum/jcr/type_translators/data_translator.rb +31 -0
  72. data/lib/sinicum/jcr/type_translators/default_translator.rb +13 -0
  73. data/lib/sinicum/jcr/type_translators/translator_base.rb +40 -0
  74. data/lib/sinicum/logger.rb +28 -0
  75. data/lib/sinicum/navigation/default_navigation_element.rb +30 -0
  76. data/lib/sinicum/navigation/navigation_element.rb +39 -0
  77. data/lib/sinicum/navigation/navigation_element_list.rb +33 -0
  78. data/lib/sinicum/navigation/navigation_handler.rb +95 -0
  79. data/lib/sinicum/navigation/navigation_status.rb +27 -0
  80. data/lib/sinicum/templating/area_handler.rb +33 -0
  81. data/lib/sinicum/templating/dialog_resolver.rb +26 -0
  82. data/lib/sinicum/templating/templating_utils.rb +24 -0
  83. data/lib/sinicum/util.rb +12 -0
  84. data/lib/sinicum/version.rb +3 -0
  85. data/script/cibuild +31 -0
  86. data/sinicum.gemspec +29 -0
  87. data/spec/controllers/sinicum/controller_base_spec.rb +53 -0
  88. data/spec/controllers/sinicum/controllers/global_state_cache_spec.rb +35 -0
  89. data/spec/dummy/REVISION +1 -0
  90. data/spec/dummy/Rakefile +7 -0
  91. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  92. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  93. data/spec/dummy/app/views/application/index.html.erb +1 -0
  94. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  95. data/spec/dummy/app/views/layouts/layout_name.html.erb +0 -0
  96. data/spec/dummy/app/views/layouts/my-module/test.html.erb +0 -0
  97. data/spec/dummy/app/views/layouts/my_module/test.html.erb +0 -0
  98. data/spec/dummy/config.ru +4 -0
  99. data/spec/dummy/config/application.rb +45 -0
  100. data/spec/dummy/config/boot.rb +10 -0
  101. data/spec/dummy/config/database.yml +22 -0
  102. data/spec/dummy/config/environment.rb +5 -0
  103. data/spec/dummy/config/environments/development.rb +24 -0
  104. data/spec/dummy/config/environments/production.rb +51 -0
  105. data/spec/dummy/config/environments/test.rb +34 -0
  106. data/spec/dummy/config/imaging.yml +7 -0
  107. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  108. data/spec/dummy/config/initializers/inflections.rb +10 -0
  109. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  110. data/spec/dummy/config/initializers/secret_token.rb +11 -0
  111. data/spec/dummy/config/initializers/session_store.rb +8 -0
  112. data/spec/dummy/config/locales/en.yml +5 -0
  113. data/spec/dummy/config/routes.rb +59 -0
  114. data/spec/dummy/config/sinicum_server.yml +13 -0
  115. data/spec/dummy/public/404.html +26 -0
  116. data/spec/dummy/public/422.html +26 -0
  117. data/spec/dummy/public/500.html +26 -0
  118. data/spec/dummy/public/favicon.ico +0 -0
  119. data/spec/dummy/public/javascripts/application.js +2 -0
  120. data/spec/dummy/public/javascripts/controls.js +965 -0
  121. data/spec/dummy/public/javascripts/dragdrop.js +974 -0
  122. data/spec/dummy/public/javascripts/effects.js +1123 -0
  123. data/spec/dummy/public/javascripts/prototype.js +6001 -0
  124. data/spec/dummy/public/javascripts/rails.js +191 -0
  125. data/spec/dummy/public/stylesheets/.gitkeep +0 -0
  126. data/spec/dummy/script/rails +6 -0
  127. data/spec/fixtures/api/cache_global.json +3 -0
  128. data/spec/fixtures/api/content_mgnl5.json +22 -0
  129. data/spec/fixtures/api/default_json.json.erb +47 -0
  130. data/spec/fixtures/api/default_json_mgnl5.json.erb +27 -0
  131. data/spec/fixtures/api/file.json +73 -0
  132. data/spec/fixtures/api/file_mgnl5.json +51 -0
  133. data/spec/fixtures/api/homepage.json +1497 -0
  134. data/spec/fixtures/api/homepage_parent.json +483 -0
  135. data/spec/fixtures/api/image.json +73 -0
  136. data/spec/fixtures/api/image_mgnl5.json +50 -0
  137. data/spec/fixtures/api/navigation_children.json +3107 -0
  138. data/spec/fixtures/api/navigation_parents.json +25 -0
  139. data/spec/fixtures/api/product.json +2084 -0
  140. data/spec/fixtures/api/query_result.json +61 -0
  141. data/spec/fixtures/mock_content.rb +6 -0
  142. data/spec/fixtures/mock_image.gif +0 -0
  143. data/spec/helpers/sinicum/helper_utils_spec.rb +55 -0
  144. data/spec/helpers/sinicum/mgnl_helper_spec.rb +315 -0
  145. data/spec/helpers/sinicum/mgnl_image_helper_spec.rb +103 -0
  146. data/spec/sinicum/content/aggregator_spec.rb +91 -0
  147. data/spec/sinicum/content/website_content_resolver_spec.rb +14 -0
  148. data/spec/sinicum/imaging/config_spec.rb +50 -0
  149. data/spec/sinicum/imaging/converter_spec.rb +41 -0
  150. data/spec/sinicum/imaging/image_size_converter_spec.rb +27 -0
  151. data/spec/sinicum/imaging/imaging.yml +15 -0
  152. data/spec/sinicum/imaging/imaging_file_spec.rb +125 -0
  153. data/spec/sinicum/imaging/imaging_middleware_spec.rb +79 -0
  154. data/spec/sinicum/imaging/max_size_converter_spec.rb +52 -0
  155. data/spec/sinicum/imaging/resize_crop_converter_spec.rb +18 -0
  156. data/spec/sinicum/imaging_spec.rb +13 -0
  157. data/spec/sinicum/jcr/api_client_spec.rb +69 -0
  158. data/spec/sinicum/jcr/cache/global_cache_spec.rb +29 -0
  159. data/spec/sinicum/jcr/dam/document_spec.rb +81 -0
  160. data/spec/sinicum/jcr/dam/image_spec.rb +46 -0
  161. data/spec/sinicum/jcr/jcr_configuration_spec.rb +57 -0
  162. data/spec/sinicum/jcr/mgnl4_compatibility_spec.rb +10 -0
  163. data/spec/sinicum/jcr/node_queries_spec.rb +113 -0
  164. data/spec/sinicum/jcr/node_spec.rb +261 -0
  165. data/spec/sinicum/jcr/query_sanitizer_spec.rb +26 -0
  166. data/spec/sinicum/jcr/type_translator_spec.rb +42 -0
  167. data/spec/sinicum/jcr/type_translators/component_translator_spec.rb +71 -0
  168. data/spec/sinicum/jcr/type_translators/data_translator_spec.rb +38 -0
  169. data/spec/sinicum/jcr/type_translators/default_translator_spec.rb +19 -0
  170. data/spec/sinicum/navigation/default_navigation_element_spec.rb +45 -0
  171. data/spec/sinicum/navigation/navigation_handler_spec.rb +71 -0
  172. data/spec/sinicum/templating/dialog_resolver_spec.rb +13 -0
  173. data/spec/sinicum/util_spec.rb +34 -0
  174. data/spec/spec_helper.rb +42 -0
  175. data/spec/support/default_node_reader.rb +40 -0
  176. metadata +434 -0
@@ -0,0 +1,37 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+ Bundler::GemHelper.install_tasks
7
+
8
+ require 'rake'
9
+ require 'rdoc/task'
10
+
11
+ require 'rspec/core/rake_task'
12
+ RSpec::Core::RakeTask.new(:spec)
13
+
14
+ require 'rubocop/rake_task'
15
+ Rubocop::RakeTask.new(:rubocop) do |task|
16
+ # don't abort rake on failure
17
+ task.fail_on_error = false
18
+ end
19
+
20
+ task default: [:spec, :rubocop]
21
+
22
+ desc "Create Sinicum plugin documentation"
23
+ task :doc do |doc|
24
+
25
+ require 'yard'
26
+
27
+ gem_root = File.dirname(__FILE__)
28
+
29
+ docdir = ENV['docdir'] || File.join(gem_root, "doc")
30
+ rm_r Dir.glob(docdir + "/*") if File.exists?(docdir)
31
+ YARD::Rake::YardocTask.new do |t|
32
+ t.files = [File.join(gem_root, "lib", "**", "*.rb")] # optional
33
+ t.options = ['-m', 'markdown', '--protected', '-o', docdir,
34
+ '-r', File.join(gem_root, "README.md")]
35
+ end
36
+ Rake::Task[:yard].invoke
37
+ end
@@ -0,0 +1,233 @@
1
+ sinicum = sinicum ? { }
2
+
3
+ sinicum.renderDocumentReady = true
4
+
5
+
6
+ class sinicum.MagnoliaClient
7
+ setMainBar: (elements) ->
8
+ jQuery.each(elements, (index, value) ->
9
+ element = jQuery(value)
10
+ config = {}
11
+ config['dialog'] = element.data("dialog")
12
+ config['label'] = element.data("label")
13
+ config['adminButtonVisible'] = element.data("admin-button-visible")
14
+ config['repository'] = element.data("repository")
15
+ config['nodePath'] = element.data("node-path")
16
+ element.wrapInner(new sinicum.MainBar(config).render())
17
+ )
18
+
19
+ setMainBarPreview: (elements) ->
20
+ jQuery.each(elements, (index, value) ->
21
+ element = jQuery(value)
22
+ element.wrapInner(new sinicum.MainBarPreview().render())
23
+ )
24
+
25
+ setNewBar: (elements) ->
26
+ jQuery.each(elements, (index, value) ->
27
+ element = jQuery(value)
28
+ config = {}
29
+ config['contentNodeCollectionName'] = element.data("content-node-collection-name")
30
+ config['contentNodeName'] = element.data("content-node-name")
31
+ config['label'] = element.data("label")
32
+ config['paragraph'] = element.data("paragraph")
33
+ config['repository'] = element.data("repository")
34
+ config['nodePath'] = element.data("node-path")
35
+ element.wrapInner(new sinicum.NewBar(config).render())
36
+ )
37
+
38
+ setEditBar: (elements) ->
39
+ jQuery.each(elements, (index, value) ->
40
+ element = jQuery(value)
41
+ config = {}
42
+ config['repository'] = element.data("repository")
43
+ config['nodePath'] = element.data("node-path")
44
+ config['paragraph'] = element.data("paragraph")
45
+ config['contentNodeCollectionName'] = element.data("content-node-collection-name")
46
+ config['contentNodeIteratorIndex'] = element.attr("data-content-node-iterator-index")
47
+ config['contentNodeIteratorPath'] = element.data("content-node-iterator-path")
48
+ config['deleteLabel'] = element.data("delete-label")
49
+ config['editLabel'] = element.data("edit-label")
50
+ config['moveLabel'] = element.data("move-label")
51
+ element.wrapInner(new sinicum.EditBar(config).render())
52
+ )
53
+
54
+
55
+ class sinicum.MainBar
56
+ constructor: (options) ->
57
+ @label = "Properties"
58
+ @adminButtonVisible = true
59
+ if options
60
+ @dialog = options['dialog']
61
+ @repository = options['repository']
62
+ @nodePath = options['nodePath']
63
+ if options['label']
64
+ @label = options['label']
65
+ if options['adminButtonVisible'] == false || options['adminButtonVisible'] == 'false'
66
+ @adminButtonVisible = false
67
+
68
+ render: ->
69
+ wrapper = jQuery("<div class\"mgnlMainBar\" style=\"top:0px;left:0px;width:100%;\"></div>")
70
+ wrapper.append(this.renderControlBarTable())
71
+
72
+ renderControlBarTable: ->
73
+ # left
74
+ leftColumn = jQuery("<td class=\"mgnlBtnsLeft\"></td>")
75
+ leftColumn.append(btn.render()) for btn in this.leftButtons()
76
+ # right
77
+ rightColumn = jQuery("<td class=\"mgnlBtnsRight\"></td>")
78
+ rightColumn.append(btn.render()) for btn in this.rightButtons()
79
+ # table structure
80
+ row = jQuery("<tr></tr>").append(leftColumn).append(rightColumn)
81
+ body = jQuery("<tbody></tbody>").append(row)
82
+ table = jQuery("<table class=\"mgnlControlBar\"></table>").append(body)
83
+ table
84
+
85
+ leftButtons: ->
86
+ buttons = []
87
+ buttons.push(new sinicum.MgnlButton("« Preview", "mgnlPreview(true)"))
88
+ if @adminButtonVisible
89
+ buttons.push(new sinicum.MgnlButton("AdminCentral",
90
+ "MgnlAdminCentral.showTree(\'#{this.escJs(@repository)}\'," +
91
+ "\'#{this.escJs(@nodePath)}\')"))
92
+ buttons
93
+
94
+ rightButtons: ->
95
+ [
96
+ new sinicum.MgnlButton(@label,
97
+ "mgnlOpenDialog(\'#{this.escJs(@nodePath)}\',\'\',\'\',\'#{this.escJs(@dialog)}\'," +
98
+ "\'#{this.escJs(@repository)}\',null, null, null)")
99
+ ]
100
+
101
+ escJs: (string) ->
102
+ if string
103
+ string.replace(/\'/g, "\\'")
104
+
105
+ class sinicum.MainBarPreview
106
+ render: ->
107
+ html = "<div class=\"mgnlMainbarPreview\" style=\"top:4px;left:4px;\">" +
108
+ "<span onmousedown=\"mgnlShiftPushButtonDown(this);\" " +
109
+ "onmouseout=\"mgnlShiftPushButtonOut(this);\" " +
110
+ "onclick=\"mgnlShiftPushButtonClick(this);mgnlPreview(false);\" " +
111
+ "class=\"mgnlControlButton\" style=\"\">»</span>" +
112
+ "</div>"
113
+ jQuery(html)
114
+
115
+
116
+ class sinicum.NewBar
117
+ constructor: (options) ->
118
+ @contentNodeCollectionName = options['contentNodeCollectionName']
119
+ @contentNodeName = options['contentNodeName']
120
+ @label = "New" || options['label']
121
+ @paragraph = options['paragraph']
122
+ @repository = options['repository']
123
+ @nodePath = options['nodePath']
124
+
125
+ render: ->
126
+ html = "<table onmousedown=\"mgnlMoveNodeEnd(this,'#{@nodePath}');\" " +
127
+ "onmouseout=\"mgnlMoveNodeReset(this);\" onmouseover=\"mgnlMoveNodeHigh(this);\" " +
128
+ "class=\"mgnlControlBarSmall\" id=\"#{@contentNodeCollectionName}__mgnlNew\" cellspacing=\"0\">" +
129
+ "<tbody><tr><td class=\"mgnlBtnsLeft\">" +
130
+ "<span onmousedown=\"mgnlShiftPushButtonDown(this);\" " +
131
+ "onmouseout=\"mgnlShiftPushButtonOut(this);\" " +
132
+ "onclick=\"mgnlShiftPushButtonClick(this);" +
133
+ "mgnlOpenDialog('#{@nodePath}',"
134
+ if @contentNodeCollectionName
135
+ html += "'#{@contentNodeCollectionName}','mgnlNew',"
136
+ else if @contentNodeName
137
+ html += "'','#{@contentNodeName}',"
138
+ html += "'#{@paragraph}','#{@repository}'," +
139
+ "'.magnolia/dialogs/#{this.editPageName()}', null, null);\" " +
140
+ "class=\"mgnlControlButtonSmall\" style=\"background-color: transparent; " +
141
+ "background-position: initial initial; background-repeat: initial initial; \">" +
142
+ "New</span></td></tr></tbody></table>"
143
+ wrapper = jQuery(html)
144
+ wrapper
145
+
146
+ editPageName: ->
147
+ pageName = "editParagraph.html"
148
+ if @paragraph && @paragraph.indexOf(",") > 0
149
+ pageName = "selectParagraph.html"
150
+ pageName
151
+
152
+
153
+ class sinicum.EditBar
154
+ constructor: (options) ->
155
+ @repository = options['repository']
156
+ @nodePath = options['nodePath']
157
+ @paragraph = options['paragraph']
158
+ @deleteLabel = options['deleteLabel'] || "Delete"
159
+ @editLabel = options['editLabel'] || "Edit"
160
+ @moveLabel = options['moveLabel'] || "Move"
161
+ @contentNodeCollectionName = options['contentNodeCollectionName']
162
+ @contentNodeIteratorIndex = options['contentNodeIteratorIndex']
163
+ @contentNodeIteratorPath = options['contentNodeIteratorPath']
164
+
165
+ render: ->
166
+ html = "<table onmousedown=\"mgnlMoveNodeEnd(this,'#{@nodePath}');\" " +
167
+ "onmouseout=\"mgnlMoveNodeReset(this);\" onmouseover=\"mgnlMoveNodeHigh(this);\" " +
168
+ "class=\"mgnlControlBarSmall\" id=\"__#{@contentNodeIteratorIndex || 0}\" cellspacing=\"0\">" +
169
+ "<tbody><tr><td class=\"mgnlBtnsLeft\">" +
170
+
171
+ "<span onmousedown=\"mgnlShiftPushButtonDown(this);\" " +
172
+ "onmouseout=\"mgnlShiftPushButtonOut(this);\" " +
173
+ "onclick=\"mgnlShiftPushButtonClick(this);mgnlOpenDialog("
174
+ if @contentNodeCollectionName
175
+ html += "'#{@nodePath}','','#{@contentNodeIteratorIndex}',"
176
+ else
177
+ html += "'#{@nodePath}','','',"
178
+ html += "'#{@paragraph}','#{@repository}'," +
179
+ "'.magnolia/dialogs/#{this.editPageName()}', null, null);\" " +
180
+ "class=\"mgnlControlButtonSmall\" style=\"background:transparent;\">#{@editLabel}</span>"
181
+
182
+ if @contentNodeCollectionName
183
+ html += "<span onmousedown=\"mgnlShiftPushButtonDown(this);\" " +
184
+ "onmouseout=\"mgnlShiftPushButtonOut(this);\" " +
185
+ "onclick=\"mgnlShiftPushButtonClick(this);mgnlMoveNodeStart('','#{@contentNodeIteratorIndex}','__#{@contentNodeIteratorIndex}');\" " +
186
+ "class=\"mgnlControlButtonSmall\" style=\"background:transparent;\">#{@moveLabel}</span></td>"
187
+
188
+ html += "<td class=\"mgnlBtnsRight\"><span onmousedown=\"mgnlShiftPushButtonDown(this);\" " +
189
+ "onmouseout=\"mgnlShiftPushButtonOut(this);\" onclick=\"mgnlShiftPushButtonClick(this);"
190
+ if @contentNodeCollectionName
191
+ html += "mgnlDeleteNode('#{@nodePath}','','#{@contentNodeIteratorIndex}');\" "
192
+ else
193
+ html += "mgnlDeleteNode('#{@nodePath}');\" "
194
+ html += "class=\"mgnlControlButtonSmall\" style=\"background:transparent;\">#{@deleteLabel}" +
195
+ "</span></td></tr></tbody></table>"
196
+ wrapper = jQuery(html)
197
+ wrapper
198
+
199
+ editPageName: ->
200
+ pageName = "editParagraph.html"
201
+ if @paragraph && @paragraph.indexOf(",") > 0
202
+ pageName = "selectParagraph.html"
203
+ pageName
204
+
205
+
206
+ class sinicum.MgnlButton
207
+ constructor: (@text, @onclickAction) ->
208
+
209
+ render: ->
210
+ button = jQuery("<span></span>")
211
+ button.addClass("mgnlControlButton")
212
+ button = button.attr("onmousedown", "mgnlShiftPushButtonDown(this);")
213
+ button = button.attr("onmouseout", "mgnlShiftPushButtonOut(this);")
214
+ button = button.attr("onclick", "mgnlShiftPushButtonClick(this);#{@onclickAction};")
215
+ button = button.css("background", "transparent")
216
+ button = button.text(@text)
217
+ button
218
+
219
+ sinicum.renderBars = ->
220
+ client = new sinicum.MagnoliaClient()
221
+ client.setMainBar(jQuery(".sinicum-mgnl-main-bar"))
222
+ client.setMainBarPreview(jQuery(".sinicum-mgnl-main-bar-preview"))
223
+ client.setEditBar(jQuery(".sinicum-mgnl-edit-bar"))
224
+ client.setNewBar(jQuery(".sinicum-mgnl-new-bar"))
225
+
226
+ sinicum.preventDefaultRender = ->
227
+ sinicum.renderDocumentReady = false
228
+
229
+ window.sinicum = sinicum
230
+
231
+ jQuery ->
232
+ if sinicum.renderDocumentReady
233
+ sinicum.renderBars()
@@ -0,0 +1,173 @@
1
+ # encoding: utf-8
2
+
3
+ module Sinicum
4
+ module ControllerBase
5
+ HTML_SUFFIX = ".html"
6
+ extend ActiveSupport::Concern
7
+ include Controllers::CacheAware
8
+
9
+ included do
10
+ prepend_before_filter ::Sinicum::Controllers::GlobalStateCache
11
+ prepend_before_filter :remove_html_suffix
12
+ after_filter ::Sinicum::Controllers::GlobalStateCache
13
+ end
14
+
15
+ def index
16
+ cms_render
17
+ end
18
+
19
+ def render(options = {}, locals = {}, &block)
20
+ find_original_content_for_path(content_path)
21
+ unless redirect_redirect_page
22
+ check_for_content!
23
+ options[:layout] = layout_file_name_or_fallback
24
+ block_given? ? super(options, locals, block) : super(options, locals)
25
+ end
26
+ end
27
+
28
+ # Deprecated!
29
+ def cms_render
30
+ client_cache_control
31
+ render inline: "", use_sinicum_template_layout: true
32
+ end
33
+
34
+ protected
35
+
36
+ def content_path
37
+ request.path
38
+ end
39
+
40
+ def find_original_content_for_path(path = nil)
41
+ path ||= content_path
42
+ original_content = Content::WebsiteContentResolver.find_for_path(path)
43
+ Content::Aggregator.original_content = original_content
44
+ end
45
+
46
+ # Constructs the name of the layout file. Per default: Name of the template without special
47
+ # characters and spaces. Override in subclasses.
48
+ #
49
+ # @return [String] the layout filename (without 'html.erb')
50
+ def layout_file_name
51
+ layout = "application"
52
+ fail unless Content::Aggregator.original_content
53
+ prepare_layout(layout)
54
+ end
55
+
56
+ private
57
+
58
+ def prepare_layout(layout)
59
+ if Content::Aggregator.original_content &&
60
+ Content::Aggregator.original_content.mgnl_template
61
+ layout = Content::Aggregator.original_content.mgnl_template.dup
62
+ end
63
+ layout = handle_mgnl45_names(layout)
64
+ layout = handle_umlauts(layout)
65
+ layout.downcase!
66
+ layout.gsub!(/\s/, '_')
67
+ layout.gsub!(/[^\w\/-]/, '')
68
+ add_sinicum_layout_prefix(layout)
69
+ end
70
+
71
+ def add_sinicum_layout_prefix(layout)
72
+ if self.class.sinicum_layout_prefix.present?
73
+ layout = self.class.sinicum_layout_prefix + "/" + layout
74
+ end
75
+ layout
76
+ end
77
+
78
+ def check_for_content!
79
+ unless Sinicum::Content::Aggregator.content_data
80
+ fail ActionController::RoutingError.new("Page not found.")
81
+ end
82
+ end
83
+
84
+ def handle_mgnl45_names(layout_name)
85
+ result = layout_name
86
+ if result.index(":pages/")
87
+ parts = layout_name.split(":")
88
+ result = parts[0] + "/"
89
+ result << parts[1][":pages/".size - 1, parts[1].size]
90
+ end
91
+ result
92
+ end
93
+
94
+ def redirect_redirect_page
95
+ return false if request.headers["HTTP_X_MGNL_ADMIN"].present?
96
+ page = ::Sinicum::Content::Aggregator.content_data
97
+ if redirect_page_45?(page) || redirect_page_44?(page)
98
+ redirect_target = page[:redirect_link]
99
+ if Sinicum::Util.is_a_uuid?(redirect_target)
100
+ redirect_target = Sinicum::Jcr::Node.find_by_uuid("website", redirect_target).try(:path)
101
+ end
102
+ redirect_to redirect_target
103
+ true
104
+ end
105
+ false
106
+ end
107
+
108
+ def redirect_page_44?(page)
109
+ template_exists?(page) && page.mgnl_template == "redirect" && page[:redirect_link]
110
+ end
111
+
112
+ def redirect_page_45?(page)
113
+ template_exists?(page) && page.mgnl_template.index("pages/redirect") && page[:redirect_link]
114
+ end
115
+
116
+ def template_exists?(page)
117
+ page && page.mgnl_template
118
+ end
119
+
120
+ # Determines the name of the layout file that is _actually_ used by the controller.
121
+ # By default it's the result of `layout_file_name`. If this file cannot be found, a
122
+ # default replacement (`application`) is used
123
+ #
124
+ # @return [String] the name of the layout file actually used
125
+ def layout_file_name_or_fallback
126
+ ActionController::Base.view_paths.each do |path|
127
+ ActionView::Template::Handlers.extensions.each do |engine_suffix|
128
+ format = params[:format].presence || "html"
129
+ file_in_path = File.join(
130
+ path.to_s, "layouts", "#{layout_file_name}.#{format}.#{engine_suffix}"
131
+ )
132
+ return layout_file_name if File.exist?(file_in_path)
133
+ end
134
+ end
135
+ fallback = "application"
136
+ if self.class.sinicum_layout_prefix.present?
137
+ fallback = self.class.sinicum_layout_prefix + "/" + fallback
138
+ end
139
+ fallback
140
+ end
141
+
142
+ def remove_html_suffix
143
+ if request.get? && request.path =~ /#{HTML_SUFFIX}$/i
144
+ new_path = request.path[0, request.path.length - HTML_SUFFIX.length]
145
+ if request.query_string && !request.query_string.blank?
146
+ new_path << "?#{request.query_string}"
147
+ end
148
+ redirect_to new_path
149
+ end
150
+ end
151
+
152
+ def find_content_for_request
153
+ find_original_content_for_path(content_path)
154
+ yield
155
+ end
156
+
157
+ def handle_umlauts(layout)
158
+ if !layout.respond_to?(:encode)
159
+ @_iconv ||= Iconv.new("US-ASCII//IGNORE", "UTF-8")
160
+ layout = @_iconv.iconv(layout)
161
+ elsif layout
162
+ layout = layout.encode(
163
+ "US-ASCII", undef: :replace, invalid: :replace, replace: '-'
164
+ )
165
+ end
166
+ layout
167
+ end
168
+
169
+ module ClassMethods
170
+ attr_accessor :sinicum_layout_prefix
171
+ end
172
+ end
173
+ end
@@ -0,0 +1,16 @@
1
+ module Sinicum
2
+ module Controllers
3
+ module CacheAware
4
+ DEFAULT_CACHE_EXPIRATION_TIME = 10.minutes
5
+ TIMESTAMP_ASSET_EXPIRATION_TIME = 30.days
6
+
7
+ # Sets the HTTP cache parameters. By default, an expiration time of 10 minutes and a
8
+ # public cache is used when `Rails.env` is `production`
9
+ def client_cache_control
10
+ if Rails.application.config.action_controller.perform_caching
11
+ expires_in(DEFAULT_CACHE_EXPIRATION_TIME, public: true)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end