spontaneous 0.2.0.alpha2 → 0.2.0.alpha3

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 (404) hide show
  1. data/Gemfile +3 -40
  2. data/Rakefile +29 -41
  3. data/Readme.markdown +21 -8
  4. data/application/css/add_alias_dialogue.css.scss +79 -0
  5. data/application/css/{v2.scss → core.css.scss} +537 -550
  6. data/application/css/{definitions.scss → definitions.css.scss} +121 -33
  7. data/application/css/dialogue.css.scss +409 -0
  8. data/application/css/{editing.scss → editing.css.scss} +25 -262
  9. data/application/css/font.css.scss +8 -0
  10. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  11. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  12. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_flat_10_000000_40x100.png +0 -0
  13. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  14. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  15. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  16. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  17. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  18. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  19. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_222222_256x240.png +0 -0
  20. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_228ef1_256x240.png +0 -0
  21. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ef8c08_256x240.png +0 -0
  22. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ffd27a_256x240.png +0 -0
  23. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ffffff_256x240.png +0 -0
  24. data/application/css/jquery-ui-1.8.21.custom/ui-lightness.css.scss +565 -0
  25. data/application/css/{login.scss → login.css.scss} +4 -4
  26. data/application/css/meta.css.scss +331 -0
  27. data/application/css/{popover.scss → popover.css.scss} +9 -8
  28. data/application/css/{schema_error.scss → schema_error.css.scss} +4 -4
  29. data/application/css/spontaneous.css +5 -0
  30. data/application/css/unsupported.css.scss +42 -0
  31. data/application/js/add_alias_dialogue.js +72 -10
  32. data/application/js/ajax.js +50 -16
  33. data/application/js/compatibility.js +19 -15
  34. data/application/js/content.js +39 -36
  35. data/application/js/content_area.js +53 -5
  36. data/application/js/dialogue.js +17 -0
  37. data/application/js/dom.js +1 -1
  38. data/application/js/edit_panel.js +23 -8
  39. data/application/js/extensions.js +7 -2
  40. data/application/js/field_preview.js +2 -1
  41. data/application/js/field_types/date_field.js +11 -8
  42. data/application/js/field_types/file_field.js +188 -9
  43. data/application/js/field_types/image_field.js +46 -29
  44. data/application/js/field_types/markdown_field.js +57 -14
  45. data/application/js/field_types/select_field.js +72 -0
  46. data/application/js/field_types/string_field.js +8 -0
  47. data/application/js/field_types/webvideo_field.js +8 -0
  48. data/application/js/init.js +1 -7
  49. data/application/js/location.js +41 -13
  50. data/application/js/login.js +3 -0
  51. data/application/js/meta_view/user_admin.js +543 -0
  52. data/application/js/meta_view.js +1 -0
  53. data/application/js/metadata.js +20 -0
  54. data/application/js/page.js +17 -3
  55. data/application/js/page_browser.js +40 -30
  56. data/application/js/page_entry.js +4 -0
  57. data/application/js/panel/root_menu.js +66 -0
  58. data/application/js/popover.js +2 -2
  59. data/application/js/preview.js +1 -1
  60. data/application/js/publish.js +138 -30
  61. data/application/js/services.js +43 -0
  62. data/application/js/sharded_upload.js +2 -2
  63. data/application/js/spontaneous.js +64 -5
  64. data/application/js/state.js +20 -9
  65. data/application/js/top_bar.js +273 -150
  66. data/application/js/types.js +20 -15
  67. data/application/js/upload.js +1 -2
  68. data/application/js/user.js +18 -4
  69. data/application/js/vendor/date.js +104 -0
  70. data/application/js/vendor/jquery-ui-1.8.18.custom.min.js +356 -0
  71. data/application/js/views/box_view.js +15 -8
  72. data/application/js/views/page_piece_view.js +11 -8
  73. data/application/js/views/page_view.js +21 -3
  74. data/application/js/views/piece_view.js +19 -10
  75. data/application/js/views.js +3 -0
  76. data/application/static/chromelogo-200x52-45c7cbc93be080bea342df5fcda2ef8b.png +0 -0
  77. data/application/static/dot-texture-9eea29e4ac7ad9a772285252078ec127.png +0 -0
  78. data/application/static/editing-textarea-resize-s-b5af62365eb7e19ea4beccf7242d508e.png +0 -0
  79. data/application/static/editing-texture-1-42b06a3439752490988f30f2a06d5e7c.png +0 -0
  80. data/application/static/font/fontawesome-webfont-5c5c21100a346972a82c34c5e96ffcfe.ttf +0 -0
  81. data/application/static/loop_alt1-white-7894b458528e92216196cae26b4c2c96.svg +12 -0
  82. data/application/static/spontaneous-states-e91ec89db525c62da0105b97cdd781ce.png +0 -0
  83. data/application/views/index.erb +2 -2
  84. data/application/views/login.erb +4 -8
  85. data/application/views/schema_modification_error.html.erb +1 -4
  86. data/application/views/unsupported.erb +9 -7
  87. data/bin/spot +1 -1
  88. data/db/migrations/20110209152710_users_and_groups.rb +10 -10
  89. data/db/migrations/20120305112647_site_modification_time.rb +11 -0
  90. data/db/migrations/20120418153903_add_ownership_of_content.rb +14 -0
  91. data/db/migrations/20120423175416_add_pending_modifications.rb +21 -0
  92. data/db/migrations/20120525164947_add_field_versions.rb +27 -0
  93. data/lib/sequel/plugins/scoped_table_name.rb +10 -1
  94. data/lib/spontaneous/asset/file.rb +25 -0
  95. data/lib/spontaneous/asset/source.rb +28 -0
  96. data/lib/spontaneous/asset.rb +75 -0
  97. data/lib/spontaneous/box.rb +6 -4
  98. data/lib/spontaneous/capistrano/deploy.rb +47 -0
  99. data/lib/spontaneous/capistrano/sync.rb +81 -0
  100. data/lib/spontaneous/capistrano.rb +13 -0
  101. data/lib/spontaneous/change.rb +60 -68
  102. data/lib/spontaneous/cli/assets.rb +29 -0
  103. data/lib/spontaneous/cli/base.rb +0 -48
  104. data/lib/spontaneous/cli/console.rb +1 -1
  105. data/lib/spontaneous/cli/server.rb +6 -4
  106. data/lib/spontaneous/cli/site.rb +28 -17
  107. data/lib/spontaneous/cli/user.rb +107 -0
  108. data/lib/spontaneous/cli.rb +100 -4
  109. data/lib/spontaneous/collections/entry_set.rb +2 -2
  110. data/lib/spontaneous/collections/field_set.rb +48 -22
  111. data/lib/spontaneous/collections/prototype_set.rb +20 -13
  112. data/lib/spontaneous/constants.rb +3 -0
  113. data/lib/spontaneous/content.rb +22 -5
  114. data/lib/spontaneous/errors.rb +3 -3
  115. data/lib/spontaneous/extensions/array.rb +12 -0
  116. data/lib/spontaneous/extensions/enumerable.rb +30 -0
  117. data/lib/spontaneous/extensions/nil.rb +3 -1
  118. data/lib/spontaneous/extensions/string.rb +16 -0
  119. data/lib/spontaneous/field_types/date_field.rb +45 -2
  120. data/lib/spontaneous/field_types/field.rb +42 -9
  121. data/lib/spontaneous/field_types/file_field.rb +68 -0
  122. data/lib/spontaneous/field_types/image_field.rb +63 -0
  123. data/lib/spontaneous/field_types/select_field.rb +109 -0
  124. data/lib/spontaneous/field_types/string_field.rb +6 -1
  125. data/lib/spontaneous/field_types/webvideo_field.rb +85 -27
  126. data/lib/spontaneous/field_types.rb +1 -1
  127. data/lib/spontaneous/field_version.rb +8 -0
  128. data/lib/spontaneous/generators/page.rb +1 -1
  129. data/lib/spontaneous/generators/site/Capfile.tt +1 -4
  130. data/lib/spontaneous/generators/site/Gemfile.tt +13 -6
  131. data/lib/spontaneous/generators/site/config/deploy.rb.tt +28 -0
  132. data/lib/spontaneous/generators/site/config/environments/production.rb.tt +7 -2
  133. data/lib/spontaneous/generators/site.rb +1 -0
  134. data/lib/spontaneous/json.rb +34 -11
  135. data/lib/spontaneous/layout.rb +22 -0
  136. data/lib/spontaneous/media/file.rb +4 -0
  137. data/lib/spontaneous/output/assets/compression.rb +58 -0
  138. data/lib/spontaneous/output/assets.rb +32 -0
  139. data/lib/spontaneous/output/context.rb +179 -0
  140. data/lib/spontaneous/output/format/html.rb +5 -0
  141. data/lib/spontaneous/output/format/plain.rb +5 -0
  142. data/lib/spontaneous/output/format.rb +180 -0
  143. data/lib/spontaneous/output/helpers/classes_helper.rb +18 -0
  144. data/lib/spontaneous/{render/helpers/html_helper.rb → output/helpers/conditional_comment_helper.rb} +3 -12
  145. data/lib/spontaneous/output/helpers/script_helper.rb +73 -0
  146. data/lib/spontaneous/output/helpers/stylesheet_helper.rb +61 -0
  147. data/lib/spontaneous/output/helpers.rb +28 -0
  148. data/lib/spontaneous/output/template/engine.rb +59 -0
  149. data/lib/spontaneous/output/template/renderer.rb +153 -0
  150. data/lib/spontaneous/output/template.rb +21 -0
  151. data/lib/spontaneous/output.rb +163 -0
  152. data/lib/spontaneous/page.rb +2 -1
  153. data/lib/spontaneous/paths.rb +6 -1
  154. data/lib/spontaneous/permissions/access_key.rb +5 -5
  155. data/lib/spontaneous/permissions/user.rb +81 -35
  156. data/lib/spontaneous/permissions/user_level.rb +26 -22
  157. data/lib/spontaneous/plugins/aliases.rb +76 -12
  158. data/lib/spontaneous/plugins/allowed_types.rb +60 -18
  159. data/lib/spontaneous/plugins/application/paths.rb +0 -28
  160. data/lib/spontaneous/plugins/application/system.rb +35 -0
  161. data/lib/spontaneous/plugins/boxes.rb +4 -0
  162. data/lib/spontaneous/plugins/content_groups.rb +16 -0
  163. data/lib/spontaneous/plugins/entries.rb +50 -30
  164. data/lib/spontaneous/plugins/fields.rb +15 -0
  165. data/lib/spontaneous/plugins/layouts.rb +8 -2
  166. data/lib/spontaneous/plugins/modifications.rb +228 -0
  167. data/lib/spontaneous/plugins/page/formats.rb +67 -42
  168. data/lib/spontaneous/plugins/page/request.rb +10 -0
  169. data/lib/spontaneous/plugins/page/site_timestamps.rb +28 -0
  170. data/lib/spontaneous/plugins/paths.rb +15 -3
  171. data/lib/spontaneous/plugins/publishing.rb +124 -45
  172. data/lib/spontaneous/plugins/render.rb +13 -8
  173. data/lib/spontaneous/plugins/schema_hierarchy.rb +18 -6
  174. data/lib/spontaneous/plugins/site/helpers.rb +53 -0
  175. data/lib/spontaneous/plugins/site/hooks.rb +50 -0
  176. data/lib/spontaneous/plugins/site/map.rb +1 -1
  177. data/lib/spontaneous/plugins/site/paths.rb +13 -0
  178. data/lib/spontaneous/plugins/site/publishing.rb +6 -2
  179. data/lib/spontaneous/plugins/site/{revisions.rb → state.rb} +5 -1
  180. data/lib/spontaneous/plugins/site/storage.rb +4 -0
  181. data/lib/spontaneous/plugins/site/url.rb +15 -0
  182. data/lib/spontaneous/plugins/site_map.rb +13 -3
  183. data/lib/spontaneous/plugins/styles.rb +5 -1
  184. data/lib/spontaneous/plugins/visibility.rb +39 -12
  185. data/lib/spontaneous/prototypes/box_prototype.rb +4 -0
  186. data/lib/spontaneous/prototypes/field_prototype.rb +15 -10
  187. data/lib/spontaneous/publishing/event_client.rb +46 -0
  188. data/lib/spontaneous/publishing/immediate.rb +81 -44
  189. data/lib/spontaneous/publishing/simultaneous.rb +23 -6
  190. data/lib/spontaneous/publishing.rb +4 -3
  191. data/lib/spontaneous/rack/around_back.rb +1 -5
  192. data/lib/spontaneous/rack/around_front.rb +4 -4
  193. data/lib/spontaneous/rack/around_preview.rb +4 -3
  194. data/lib/spontaneous/rack/assets.rb +81 -54
  195. data/lib/spontaneous/rack/authentication.rb +0 -1
  196. data/lib/spontaneous/rack/back.rb +160 -72
  197. data/lib/spontaneous/rack/cookie_authentication.rb +2 -2
  198. data/lib/spontaneous/rack/css.rb +18 -15
  199. data/lib/spontaneous/rack/event_source.rb +9 -21
  200. data/lib/spontaneous/rack/fiber_pool.rb +26 -0
  201. data/lib/spontaneous/rack/front.rb +12 -4
  202. data/lib/spontaneous/rack/helpers.rb +35 -13
  203. data/lib/spontaneous/rack/js.rb +41 -0
  204. data/lib/spontaneous/rack/public.rb +34 -44
  205. data/lib/spontaneous/rack/sse.rb +18 -0
  206. data/lib/spontaneous/rack/static.rb +3 -0
  207. data/lib/spontaneous/rack/user_admin.rb +100 -0
  208. data/lib/spontaneous/rack/user_helpers.rb +1 -1
  209. data/lib/spontaneous/rack.rb +6 -2
  210. data/lib/spontaneous/schema.rb +31 -4
  211. data/lib/spontaneous/search/index.rb +19 -3
  212. data/lib/spontaneous/search/results.rb +1 -1
  213. data/lib/spontaneous/sequel.rb +17 -0
  214. data/lib/spontaneous/site.rb +11 -4
  215. data/lib/spontaneous/state.rb +11 -0
  216. data/lib/spontaneous/storage/cloud.rb +4 -0
  217. data/lib/spontaneous/storage/local.rb +11 -0
  218. data/lib/spontaneous/style.rb +2 -2
  219. data/lib/spontaneous/tasks/database.rake +21 -22
  220. data/lib/spontaneous/utils/database/mysql_dumper.rb +4 -0
  221. data/lib/spontaneous/utils/database/postgres_dumper.rb +78 -0
  222. data/lib/spontaneous/utils/database.rb +6 -3
  223. data/lib/spontaneous/utils/smart_quotes.rb +499 -0
  224. data/lib/spontaneous/utils/smush_it.rb +66 -0
  225. data/lib/spontaneous/utils.rb +3 -1
  226. data/lib/spontaneous/version.rb +2 -2
  227. data/lib/spontaneous.rb +25 -29
  228. data/spontaneous.gemspec +186 -106
  229. data/test/experimental/test_features.rb +1 -1
  230. data/test/fixtures/asset_pipeline/application/css/basic.css.scss +4 -0
  231. data/test/fixtures/asset_pipeline/application/css/complex.css.scss.erb +6 -0
  232. data/test/fixtures/asset_pipeline/application/css/simple.css +3 -0
  233. data/test/fixtures/asset_pipeline/application/css/spontaneous.css +7 -0
  234. data/test/fixtures/asset_pipeline/application/css/subdir/complex.css.scss.erb +6 -0
  235. data/test/fixtures/asset_pipeline/application/css/subdir/library.css.scss +1 -0
  236. data/test/fixtures/asset_pipeline/application/css/subdir/simple.css +3 -0
  237. data/test/fixtures/asset_pipeline/application/js/basic.js.coffee +1 -0
  238. data/test/fixtures/asset_pipeline/application/js/complex.js.coffee.erb +1 -0
  239. data/test/fixtures/asset_pipeline/application/js/login.js +1 -0
  240. data/test/fixtures/asset_pipeline/application/js/require.js +1 -0
  241. data/test/fixtures/asset_pipeline/application/js/simple.js +1 -0
  242. data/test/fixtures/asset_pipeline/application/js/spontaneous.js +5 -0
  243. data/test/fixtures/asset_pipeline/application/js/subdir/complex.js.coffee.erb +1 -0
  244. data/test/fixtures/asset_pipeline/application/js/subdir/library.js.coffee +1 -0
  245. data/test/fixtures/asset_pipeline/application/js/subdir/simple.js +1 -0
  246. data/test/fixtures/asset_pipeline/application/js/vendor/jquery.js +1 -0
  247. data/test/fixtures/asset_pipeline/application/static/dot-texture.png +0 -0
  248. data/test/fixtures/asset_pipeline/application/static/subdir/px.gif +0 -0
  249. data/test/fixtures/assets/public1/css/a.scss +1 -0
  250. data/test/fixtures/assets/public1/js/a.js +1 -0
  251. data/test/fixtures/assets/public1/js/m.coffee +1 -0
  252. data/test/fixtures/assets/public2/css/b.scss +1 -0
  253. data/test/fixtures/assets/public2/css/c.css +1 -0
  254. data/test/fixtures/assets/public2/js/b.js +1 -0
  255. data/test/fixtures/assets/public2/js/c.js +1 -0
  256. data/test/fixtures/assets/public2/js/n.coffee +1 -0
  257. data/test/fixtures/back/config/user_levels.yml +3 -0
  258. data/test/fixtures/back/public/js/coffeescript.coffee +1 -0
  259. data/test/fixtures/back/templates/layouts/standard.css.cut +1 -0
  260. data/test/fixtures/back/templates/layouts/standard.js.cut +1 -0
  261. data/test/fixtures/example_application/config/database.yml +4 -4
  262. data/test/fixtures/helpers/templates/layouts/standard.html.cut +1 -0
  263. data/test/fixtures/helpers/templates/layouts/standard.mobile.cut +1 -0
  264. data/test/fixtures/images/vimlogo.pdf +0 -0
  265. data/test/fixtures/outputs/templates/layouts/standard.atom.cut +1 -0
  266. data/test/fixtures/permissions/config/user_levels.yml +6 -3
  267. data/test/fixtures/serialisation/class_hash.yaml.erb +1 -0
  268. data/test/fixtures/serialisation/root_hash.yaml.erb +2 -2
  269. data/test/fixtures/templates/extended/grandparent.html.cut +7 -7
  270. data/test/fixtures/templates/extended/main.html.cut +5 -5
  271. data/test/fixtures/templates/extended/parent.html.cut +8 -8
  272. data/test/fixtures/templates/extended/partial_with_locals.html.cut +1 -1
  273. data/test/fixtures/templates/extended/with_includes.html.cut +6 -6
  274. data/test/fixtures/templates/extended/with_includes_and_locals.html.cut +6 -7
  275. data/test/fixtures/templates/layouts/entries.html.cut +4 -4
  276. data/test/fixtures/templates/layouts/standard.html.cut +1 -0
  277. data/test/fixtures/templates/layouts/variables.html.cut +1 -1
  278. data/test/fixtures/templates/publishing/templates/layouts/static.html.cut +1 -1
  279. data/test/fixtures/templates/publishing/templates/layouts/static.rtf.cut +1 -0
  280. data/test/fixtures/templates/template_class/complex_template.html.cut +2 -2
  281. data/test/fixtures/templates/template_class/complex_template.pdf.cut +2 -2
  282. data/test/fixtures/templates/template_class/default_template_style.html.cut +1 -1
  283. data/test/fixtures/templates/template_class/images_with_template.html.cut +2 -2
  284. data/test/fixtures/templates/template_class/slots_template.html.cut +2 -2
  285. data/test/fixtures/templates/template_class/slots_template.pdf.cut +2 -2
  286. data/test/fixtures/user_manager/config/user_levels.yml +9 -0
  287. data/test/functional/test_application.rb +7 -7
  288. data/test/functional/test_back.rb +352 -97
  289. data/test/functional/test_front.rb +71 -20
  290. data/test/functional/test_user_manager.rb +284 -0
  291. data/test/javascript/env.js +13505 -0
  292. data/test/javascript/test_markdown.rb +43 -3
  293. data/test/support/custom_matchers.rb +3 -2
  294. data/test/test_helper.rb +50 -9
  295. data/test/test_javascript.rb +13 -13
  296. data/test/ui_helper.rb +1 -1
  297. data/test/unit/test_alias.rb +79 -8
  298. data/test/unit/test_asset_bundler.rb +220 -0
  299. data/test/unit/test_assets.rb +213 -0
  300. data/test/unit/test_async.rb +55 -0
  301. data/test/unit/test_authentication.rb +52 -39
  302. data/test/unit/test_boxes.rb +20 -15
  303. data/test/unit/test_changesets.rb +261 -0
  304. data/test/unit/test_content.rb +73 -33
  305. data/test/unit/test_content_inheritance.rb +18 -18
  306. data/test/unit/test_extensions.rb +26 -0
  307. data/test/unit/test_fields.rb +303 -16
  308. data/test/unit/test_formats.rb +267 -34
  309. data/test/unit/test_helpers.rb +79 -2
  310. data/test/unit/test_images.rb +10 -0
  311. data/test/unit/test_layouts.rb +21 -13
  312. data/test/unit/test_modifications.rb +648 -0
  313. data/test/unit/test_page.rb +6 -2
  314. data/test/unit/test_permissions.rb +101 -27
  315. data/test/unit/test_piece.rb +4 -4
  316. data/test/unit/test_plugins.rb +3 -2
  317. data/test/unit/test_publishing.rb +332 -0
  318. data/test/unit/test_render.rb +118 -67
  319. data/test/unit/test_revisions.rb +546 -0
  320. data/test/unit/test_schema.rb +83 -1
  321. data/test/unit/test_search.rb +59 -0
  322. data/test/unit/test_serialisation.rb +2 -47
  323. data/test/unit/test_site.rb +217 -108
  324. data/test/unit/test_storage.rb +26 -0
  325. data/test/unit/test_structure.rb +2 -2
  326. data/test/unit/test_styles.rb +90 -75
  327. data/test/unit/test_table_scoping.rb +21 -17
  328. data/test/unit/test_templates.rb +75 -69
  329. data/test/{slow → unit}/test_visibility.rb +78 -22
  330. metadata +528 -221
  331. data/application/css/add_alias_dialogue.scss +0 -27
  332. data/application/css/min/14c2a35812c443001b15d8b12a4780f88c678035.css +0 -1
  333. data/application/css/min/565d4c25e82148acb01c45c8d675b37a08676d77.css +0 -1
  334. data/application/css/min/84dbe894ea96eafd321c30823d630817bfc4b03b.css +0 -1
  335. data/application/css/spontaneous.scss +0 -111
  336. data/application/css/unsupported.scss +0 -16
  337. data/application/css/variables.scss +0 -80
  338. data/application/js/min/2a0c2962537a3181fedfff5c92596ba6d3122dc9.js +0 -3
  339. data/application/js/min/4cf1c493d3379ecba5287758c61238034c0893f9.js +0 -2
  340. data/application/js/min/78ac6b99d96750bb6b9f9aad4cb9cd91cd03f391.js +0 -3
  341. data/application/js/min/b8abf302a824c35385ff517b34111e1710ff3b37.js +0 -2
  342. data/application/js/min/c8efb9b9f7c3f6613fcebc6be60f605b6570a382.js +0 -90
  343. data/application/static/diagonal-texture.png +0 -0
  344. data/application/static/editing-0-noise.png +0 -0
  345. data/application/static/editing-1-noise.png +0 -0
  346. data/application/static/editing-texture-1.png +0 -0
  347. data/application/static/editing-texture.png +0 -0
  348. data/application/static/editing-toolbar-shadow-bottom.png +0 -0
  349. data/application/static/editing-toolbar-shadow-top.png +0 -0
  350. data/application/static/inner-glow.png +0 -0
  351. data/application/static/item-buttons-highlight.png +0 -0
  352. data/application/static/item-buttons.png +0 -0
  353. data/application/static/paper-texture-dark.png +0 -0
  354. data/application/static/plus_alt.svg +0 -8
  355. data/application/static/select-arrow-root.png +0 -0
  356. data/application/static/slot-up-arrow.png +0 -0
  357. data/application/static/spontaneous.png +0 -0
  358. data/lib/cutaneous/context_helper.rb +0 -187
  359. data/lib/cutaneous/preview_context.rb +0 -32
  360. data/lib/cutaneous/preview_renderer.rb +0 -10
  361. data/lib/cutaneous/publish_context.rb +0 -10
  362. data/lib/cutaneous/publish_renderer.rb +0 -14
  363. data/lib/cutaneous/publish_template.rb +0 -62
  364. data/lib/cutaneous/publish_token_parser.rb +0 -8
  365. data/lib/cutaneous/renderer.rb +0 -124
  366. data/lib/cutaneous/request_context.rb +0 -9
  367. data/lib/cutaneous/request_renderer.rb +0 -15
  368. data/lib/cutaneous/request_template.rb +0 -11
  369. data/lib/cutaneous/request_token_parser.rb +0 -9
  370. data/lib/cutaneous/token_parser.rb +0 -125
  371. data/lib/cutaneous.rb +0 -48
  372. data/lib/spontaneous/render/context_base.rb +0 -143
  373. data/lib/spontaneous/render/development_renderer.rb +0 -14
  374. data/lib/spontaneous/render/engine.rb +0 -19
  375. data/lib/spontaneous/render/format/html.rb +0 -5
  376. data/lib/spontaneous/render/format.rb +0 -75
  377. data/lib/spontaneous/render/helpers/script_helper.rb +0 -17
  378. data/lib/spontaneous/render/helpers/stylesheet_helper.rb +0 -16
  379. data/lib/spontaneous/render/helpers.rb +0 -14
  380. data/lib/spontaneous/render/preview_context.rb +0 -8
  381. data/lib/spontaneous/render/preview_renderer.rb +0 -24
  382. data/lib/spontaneous/render/publish_context.rb +0 -22
  383. data/lib/spontaneous/render/published_renderer.rb +0 -53
  384. data/lib/spontaneous/render/publishing_renderer.rb +0 -16
  385. data/lib/spontaneous/render/render_cache.rb +0 -26
  386. data/lib/spontaneous/render/renderer.rb +0 -50
  387. data/lib/spontaneous/render/request_context.rb +0 -8
  388. data/lib/spontaneous/render.rb +0 -214
  389. data/test/experimental/test_cutaneous.rb +0 -309
  390. data/test/fixtures/application/css/test.less +0 -5
  391. data/test/slow/test_publishing.rb +0 -1006
  392. /data/application/css/{developer.scss → developer.css.scss} +0 -0
  393. /data/application/js/vendor/{jquery-1.7.1.min.js → jquery.js} +0 -0
  394. /data/application/static/{location-arrow.png → location-arrow-c1c1d3ca472481c61a0a5f8cb289d743.png} +0 -0
  395. /data/application/static/{missing.png → missing-911ce6dbd9f4602e0f3fbcd7e78846a2.png} +0 -0
  396. /data/application/static/{orange-down-arrow.png → orange-down-arrow-395ae1929e8662b2ff0977daf12c35bb.png} +0 -0
  397. /data/application/static/{page-browser-next.png → page-browser-next-ce781a242c23b980b99b9db7abc20b05.png} +0 -0
  398. /data/application/static/{plus-box.png → plus-box-dcde74a1e496f68298c9b443caa1c5d5.png} +0 -0
  399. /data/application/static/{select-arrow.png → select-arrow-6e7dd3745b00e934b0d7a3250c46558b.png} +0 -0
  400. /data/application/static/{slot-down-arrow.png → slot-down-arrow-59ad5f5ee5b52a7ebd00bca4b3104194.png} +0 -0
  401. /data/application/static/{splash.png → splash-65b493a714df9b8b3ab170103401b53d.png} +0 -0
  402. /data/application/static/{spot.png → spot-71fab1d2f065034f5fc15e7bea2ad36c.png} +0 -0
  403. /data/application/static/{spot.svg → spot-8505041082d8d3bbe8d34c29dddb3b7d.svg} +0 -0
  404. /data/application/static/{texture.png → texture-03f7627e8264b1d607113ab32c593a58.png} +0 -0
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,8 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363) -->
3
- <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
- <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
- width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
6
- <path fill="#231F20" d="M16,0C7.165,0,0,7.164,0,16s7.165,16,16,16c8.837,0,16-7.164,16-16S24.837,0,16,0z M24,18h-6v6h-4v-6H8v-4h6
7
- V8h4v6h6V18z"/>
8
- </svg>
Binary file
Binary file
@@ -1,187 +0,0 @@
1
- # encoding: UTF-8
2
-
3
-
4
- module Cutaneous
5
- module ContextHelper
6
- # include Spontaneous
7
- attr_accessor :_buf, :_engine, :_layout
8
-
9
- ## escape value. this method should be overrided in subclass.
10
- def escape(val)
11
- return val
12
- end
13
-
14
- ## include template. 'template_name' can be filename or short name.
15
- def import(template_name, _append_to_buf=true)
16
- _buf = self._buf
17
- output = self._engine.render(template_name, context=self, layout=false)
18
- _buf << output if _append_to_buf
19
- return output
20
- end
21
-
22
- ## add value into _buf. this is equivarent to '#{value}'.
23
- def echo(value)
24
- self._buf << value
25
- end
26
-
27
- ##
28
- ## start capturing.
29
- ## returns captured string if block given, else return nil.
30
- ## if block is not given, calling stop_capture() is required.
31
- ##
32
- ## ex. list.rbhtml
33
- ## <html><body>
34
- ## <h1><?rb start_capture(:title) do ?>Document Title<?rb end ?></h1>
35
- ## <?rb start_capture(:content) ?>
36
- ## <ul>
37
- ## <?rb for item in list do ?>
38
- ## <li>${item}</li>
39
- ## <?rb end ?>
40
- ## </ul>
41
- ## <?rb stop_capture() ?>
42
- ## </body></html>
43
- ##
44
- ## ex. layout.rbhtml
45
- ## <?xml version="1.0" ?>
46
- ## <html xml:lang="en">
47
- ## <head>
48
- ## <title>${@title}</title>
49
- ## </head>
50
- ## <body>
51
- ## <h1>${@title}</h1>
52
- ## <div id="content">
53
- ## <?rb echo(@content) ?>
54
- ## </div>
55
- ## </body>
56
- ## </html>
57
- ##
58
- def start_capture(varname=nil)
59
- @_capture_varname = varname
60
- @_start_position = self._buf.length
61
- if block_given?
62
- yield
63
- output = stop_capture()
64
- return output
65
- else
66
- return nil
67
- end
68
- end
69
-
70
- ##
71
- ## stop capturing.
72
- ## returns captured string.
73
- ## see start_capture()'s document.
74
- ##
75
- def stop_capture(store_to_context=true)
76
- output = self._buf[@_start_position..-1]
77
- self._buf[@_start_position..-1] = ''
78
- @_start_position = nil
79
- if @_capture_varname
80
- self.instance_variable_set("@#{@_capture_varname}", output) if store_to_context
81
- @_capture_varname = nil
82
- end
83
- return output
84
- end
85
-
86
- ##
87
- ## if captured string is found then add it to _buf and return true,
88
- ## else return false.
89
- ## this is a helper method for layout template.
90
- ##
91
- def captured_as(name)
92
- str = self.instance_variable_get("@#{name}")
93
- return false unless str
94
- @_buf << str
95
- return true
96
- end
97
-
98
-
99
- def extends(parent)
100
- self._layout = parent
101
- end
102
-
103
- def block_super
104
- block_name = @_block_level.last
105
- @_block_super_calls[block_name].push(@_buf.length - @_block_positions[block_name])
106
- end
107
-
108
- def block(block_name)
109
- @_block_super_calls ||= Hash.new { |h, k| h[k] = [] }
110
- @_block_positions ||= {}
111
- @_block_content ||= {}
112
- @_block_level ||= []
113
- block_name = block_name.to_sym
114
- @_block_positions[block_name] = @_buf.length
115
- @_block_level << block_name
116
- if block_given?
117
- yield
118
- output = endblock
119
- end
120
- end
121
-
122
- # the _block_name param is ignored though could throw warning if the two are different
123
- def endblock(_block_name=nil)
124
- block_name = @_block_level.pop
125
- return unless block_name
126
- start_position = @_block_positions[block_name]
127
- output = @_buf[start_position..-1]
128
- @_buf[start_position..-1] = ''
129
- if @_block_content.key?(block_name)
130
- super_calls = @_block_super_calls[block_name]
131
- result = @_block_content[block_name]
132
- if !super_calls.empty?
133
- position = super_calls.pop
134
- result = result[0...position] << output << (result[(position)..-1] || "")
135
- if _layout
136
- if (super_call_position = @_block_super_calls[block_name].last)
137
- @_block_super_calls[block_name][-1] = super_call_position + position
138
- @_block_content[block_name] = result
139
- end
140
- end
141
- end
142
- @_buf << result
143
- else
144
- if _layout.nil?
145
- @_buf << output
146
- else
147
- @_block_content[block_name] = output
148
- end
149
- end
150
- output
151
- end
152
-
153
- def include(filename, locals = {})
154
- import(filename, true, locals)
155
- end
156
-
157
- ## include template. 'template_name' can be filename or short name.
158
- def import(template_name, _append_to_buf=true, locals={})
159
- _buf = self._buf
160
- context=self._dup_with_locals(locals)
161
- output = self._engine.render(template_name, context, layout=false)
162
- _buf << output if _append_to_buf
163
- output
164
- end
165
-
166
- protected
167
-
168
- def _dup_with_locals(locals = {})
169
- self.dup.tap { |context| context._update(locals) }
170
- end
171
-
172
- def _decode_params(param)
173
- unless param.is_a?(String)
174
- @_render_method ||= "to_#{_format}".to_sym
175
- if param.respond_to?(@_render_method)
176
- param = param.send(@_render_method)
177
- else
178
- if param.respond_to?(:render)
179
- param = param.render(_format, self)
180
- end
181
- end
182
- end
183
- # super(param)
184
- param.to_s
185
- end
186
- end
187
- end
@@ -1,32 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- module Cutaneous
4
- class PreviewContext
5
- include ContextHelper
6
- include Spontaneous::Render::PreviewContext
7
-
8
- def include(filename, locals={})
9
- _comment(filename)
10
- import(filename, true, locals)
11
- end
12
-
13
- def _decode_params(param, *args)
14
- if param.respond_to?(:start_inline_edit_marker)
15
- _comment(param.start_inline_edit_marker) << super << _comment(param.end_inline_edit_marker)
16
- else
17
- super
18
- end
19
- end
20
-
21
- def _comment(text)
22
- @_comment_method ||= "_comment_#{_format}".to_sym
23
- if (respond_to?(@_comment_method))
24
- self.send(@_comment_method, text)
25
- end
26
- end
27
-
28
- def _comment_html(text)
29
- "<!-- #{escape(text.to_s.escape_html)} -->\n"
30
- end
31
- end
32
- end
@@ -1,10 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- module Cutaneous
4
- class PreviewRenderer < PublishRenderer
5
-
6
- def context_class
7
- Cutaneous::PreviewContext
8
- end
9
- end
10
- end
@@ -1,10 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- module Cutaneous
4
- class PublishContext
5
- include ContextHelper
6
- include Spontaneous::Render::PublishContext
7
- end
8
- end
9
-
10
-
@@ -1,14 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- module Cutaneous
4
- class PublishRenderer < Renderer
5
-
6
- def template_class
7
- Cutaneous::PublishTemplate
8
- end
9
-
10
- def context_class
11
- Cutaneous::PublishContext
12
- end
13
- end
14
- end
@@ -1,62 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- module Cutaneous
4
- class PublishTemplate
5
- attr_reader :parser
6
- attr_writer :script
7
- attr_accessor :timestamp, :filename
8
-
9
- def initialize(template_file = nil, format=:html)
10
- @format = format
11
- convert_file(template_file) if template_file
12
- end
13
-
14
- def convert_file(template_file)
15
- convert(File.read(template_file), template_file)
16
- end
17
-
18
- def convert(template_string, filepath = nil)
19
- @template_proc = @script = nil
20
- @filename = filepath
21
- @parser = create_parser(template_string)
22
- script
23
- end
24
-
25
- def script
26
- return nil unless @parser or @script
27
- @script ||= @parser.script
28
- end
29
-
30
- # I'm not doing any type checking here as I know exactly where the calls are coming from
31
- def render(context)
32
- begin
33
- context.instance_eval(&template_proc)
34
- rescue => e
35
- if context.show_errors?
36
- raise e
37
- else
38
- logger.warn(e)
39
- ""
40
- end
41
- end
42
- end
43
-
44
- protected
45
-
46
- def template_proc
47
- @template_proc ||= eval(template_proc_src.untaint, nil, @filename || '(cutaneous)')
48
- end
49
-
50
- def template_proc_src
51
- "lambda { |context| self._buf = _buf = ''; #{script}; _buf.to_s }"
52
- end
53
-
54
- def create_parser(template_string)
55
- parser_class.new(template_string)
56
- end
57
-
58
- def parser_class
59
- Cutaneous::PublishTokenParser
60
- end
61
- end
62
- end
@@ -1,8 +0,0 @@
1
- module Cutaneous
2
- PublishTokenParser = Cutaneous::TokenParser.generate({
3
- :comment => %w(!{ }),
4
- :expression => %w(${ }),
5
- :escaped_expression => %w($${ }),
6
- :statement => %w(%{ })
7
- })
8
- end # Cutaneous
@@ -1,124 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- module Cutaneous
4
- class Renderer# < Spontaneous::Renderer
5
- attr_reader :template_root, :cache_root
6
-
7
- def initialize(template_root, cache = nil)
8
- @template_root = template_root
9
- @cache = cache
10
- end
11
-
12
- def use_cache?
13
- @cache
14
- end
15
-
16
- def extension
17
- Cutaneous.extension
18
- end
19
-
20
- def render_string(string, content, format = :html, params = {})
21
- template = string_to_template(string)
22
- render_template(template, content, format, params)
23
- end
24
-
25
- def render_file(file_path, content, format = :html, params = {})
26
- template = get_template(file_path, format)
27
- render_template(template, content, format, params)
28
- end
29
-
30
- def render(filename, context, _layout=true)
31
- hook_context(context)
32
- while true
33
- template = get_template(filename, context.format)
34
- _buf = context._buf
35
- output = template.render(context)
36
- context._buf = _buf
37
- unless context._layout.nil?
38
- layout = context._layout
39
- # context._clean!
40
- context._layout = nil
41
- end
42
- break unless layout
43
- filename = layout
44
- layout = false
45
- end
46
- output
47
- end
48
-
49
- protected
50
-
51
- def render_template(template, content, format, params = {})
52
- context = context_class.new(content, format, params)
53
- render(template, context)
54
- end
55
-
56
-
57
- def create_template(filepath, format)
58
- template = template_class.new(nil, format)
59
- case filepath
60
- when String
61
- template.timestamp = Time.now
62
- template.filename = filepath
63
- if use_cache?
64
- cache_path = filepath[0...(-Cutaneous.extension.length)] + 'rb'
65
- if test(?f, cache_path)
66
- # puts "Using cached template #{cache_path}"
67
- template.filename = cache_path
68
- template.script = File.read(cache_path)
69
- else
70
- template.convert(File.read(filepath), filepath)
71
- File.open(cache_path, 'w') do |f|
72
- f.flock(File::LOCK_EX)
73
- f.write(template.script)
74
- end
75
- end
76
- else
77
- template.convert(File.read(filepath), filepath)
78
- end
79
- when Proc
80
- template = template_class.new(nil, format)
81
- template.convert(filepath.call, filepath.to_s)
82
- end
83
- template
84
- end
85
-
86
- def get_template(template, format)
87
- case template
88
- when String
89
- # if the path is absolute and points to an existing file, just render that
90
- # used by the published renderer
91
- filepath = make_path_absolute(template, format)
92
- create_template(filepath, format)
93
- when Proc
94
- create_template(template, format)
95
- else
96
- template
97
- end
98
- end
99
-
100
- def make_path_absolute(path, format)
101
- if ::File.file?(path)
102
- path
103
- else
104
- Spontaneous::Render.find_template(path, format)
105
- end
106
- end
107
-
108
- def string_to_template(string)
109
- template = template_class.new
110
- template.convert(string)
111
- template
112
- end
113
-
114
-
115
- def hook_context(context)
116
- context._engine = self
117
- context._layout = nil
118
- context
119
- end
120
- end
121
- end
122
-
123
-
124
-
@@ -1,9 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- module Cutaneous
4
- class RequestContext
5
- include ContextHelper
6
- include Spontaneous::Render::RequestContext
7
- end
8
- end
9
-
@@ -1,15 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- module Cutaneous
4
- class RequestRenderer < Renderer
5
-
6
- def template_class
7
- Cutaneous::RequestTemplate
8
- end
9
-
10
- def context_class
11
- Cutaneous::RequestContext
12
- end
13
-
14
- end
15
- end
@@ -1,11 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- module Cutaneous
4
- class RequestTemplate < PublishTemplate
5
- protected
6
-
7
- def parser_class
8
- Cutaneous::RequestTokenParser
9
- end
10
- end
11
- end
@@ -1,9 +0,0 @@
1
- module Cutaneous
2
- RequestTokenParser = Cutaneous::TokenParser.generate({
3
- :comment => %w(!{ }),
4
- :expression => %w({{ }}),
5
- :escaped_expression => %w({$ $}),
6
- :statement => %w({% %})
7
- })
8
- end # Cutaneous
9
-
@@ -1,125 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require 'strscan'
4
-
5
- module Cutaneous
6
- class TokenParser
7
-
8
- class << self
9
- attr_accessor :tags
10
- end
11
-
12
- module ClassMethods
13
- def generate(tag_definitions)
14
- parser_class = Class.new(Cutaneous::TokenParser)
15
- parser_class.tags = tag_definitions
16
- parser_class
17
- end
18
-
19
- def is_dynamic?(text)
20
- !text.index(tag_start_pattern).nil?
21
- end
22
-
23
-
24
- def tag_start_pattern
25
- @tag_start_pattern ||= compile_start_pattern
26
- end
27
-
28
- def compile_start_pattern
29
- openings = self.tags.map { |type, tags| Regexp.escape(tags[0]) }
30
- Regexp.new("#{ openings.join("|") }")
31
- end
32
-
33
- # map the set of tags into a hash used by the parse routine that converts an opening tag into a
34
- # list of: tag type, the number of opening braces in the tag and the length of the closing tag
35
- def token_map
36
- @token_map ||= Hash[tags.map { |type, tags| [tags[0], [type, tags[0].count(?{), tags[1].length]] }]
37
- end
38
- end
39
-
40
- extend ClassMethods
41
-
42
- def initialize(template)
43
- @template = template
44
- end
45
-
46
- def tokens
47
- @tokens ||= parse
48
- end
49
-
50
- def script
51
- @script ||= compile
52
- end
53
-
54
- protected
55
-
56
- BRACES ||= /\{|\}/
57
-
58
- def parse
59
- tokens = []
60
- scanner = StringScanner.new(@template)
61
- tag_start = self.class.tag_start_pattern
62
- tags = self.class.tags
63
- token_map = self.class.token_map
64
- previous = nil
65
-
66
- while (text = scanner.scan_until(tag_start))
67
- tag = scanner.matched
68
- type, brace_count, endtag_length = token_map[tag]
69
- text.slice!(text.length - tag.length, text.length)
70
- expression = ""
71
-
72
- begin
73
- expression << scanner.scan_until(BRACES)
74
- brace = scanner.matched
75
- brace_count += ((123 - brace.ord)+1)
76
- end while (brace_count > 0)
77
-
78
- expression.slice!(expression.length - endtag_length, expression.length)
79
-
80
- tokens << place_text_token(text, previous, type) if text.length > 0
81
- tokens << create_token(type, expression)
82
- previous = type
83
- end
84
- tokens << place_text_token(scanner.rest, previous, nil) unless scanner.eos?
85
- tokens
86
- end
87
-
88
- def create_token(type, expression)
89
- expression.strip! if type == :expression || type == :escaped_expression || type == :statement
90
- [type, expression]
91
- end
92
-
93
- BEGINNING_WHITESPACE ||= /\A\s*?[\r\n]+/
94
- ENDING_WHITESPACE ||= /(\r?\n)[ \t]*\z/
95
- ESCAPE_STRING ||= /[`\\]/
96
-
97
- def place_text_token(expression, preceeding_type, following_type)
98
- if preceeding_type == :statement || preceeding_type == :comment
99
- expression.gsub!(BEGINNING_WHITESPACE, '')
100
- end
101
- if following_type == :statement || following_type == :comment
102
- expression.gsub!(ENDING_WHITESPACE, '\1')
103
- end
104
- expression.gsub!(ESCAPE_STRING, '\\\\\&')
105
- [:text, expression]
106
- end
107
-
108
- def compile
109
- script = ""
110
- tokens.each do |type, expression|
111
- case type
112
- when :expression
113
- script << %{_buf << _decode_params((} << expression << %{))\n}
114
- when :text
115
- script << %(_buf << %Q`) << expression << %(`\n)
116
- when :statement
117
- script << expression << "\n"
118
- when :escaped_expression
119
- script << %{_buf << escape(_decode_params((} << expression << %{)))\n}
120
- end
121
- end
122
- script
123
- end
124
- end
125
- end