orange-more 0.5.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (188) hide show
  1. data/README.markdown +17 -0
  2. data/lib/orange-more.rb +23 -0
  3. data/lib/orange-more/administration.rb +1 -0
  4. data/lib/orange-more/administration/assets/css/admin.css +286 -0
  5. data/lib/orange-more/administration/assets/css/blueprint-ie.css +35 -0
  6. data/lib/orange-more/administration/assets/css/blueprint-print.css +29 -0
  7. data/lib/orange-more/administration/assets/css/blueprint.css +257 -0
  8. data/lib/orange-more/administration/assets/js/jquery.js +152 -0
  9. data/lib/orange-more/administration/cartons/site.rb +7 -0
  10. data/lib/orange-more/administration/cartons/site_carton.rb +12 -0
  11. data/lib/orange-more/administration/cartons/user.rb +27 -0
  12. data/lib/orange-more/administration/middleware/access_control.rb +156 -0
  13. data/lib/orange-more/administration/middleware/site_load.rb +25 -0
  14. data/lib/orange-more/administration/plugin.rb +23 -0
  15. data/lib/orange-more/administration/resources/admin_resource.rb +27 -0
  16. data/lib/orange-more/administration/resources/site_resource.rb +10 -0
  17. data/lib/orange-more/administration/resources/user_resource.rb +40 -0
  18. data/lib/orange-more/administration/templates/admin.haml +25 -0
  19. data/lib/orange-more/administration/views/openid_login.haml +14 -0
  20. data/lib/orange-more/administration/views/users/create.haml +10 -0
  21. data/lib/orange-more/administration/views/users/edit.haml +15 -0
  22. data/lib/orange-more/adverts.rb +1 -0
  23. data/lib/orange-more/adverts/cartons/adverts_carton.rb +14 -0
  24. data/lib/orange-more/adverts/plugin.rb +13 -0
  25. data/lib/orange-more/adverts/resources/adverts_resource.rb +27 -0
  26. data/lib/orange-more/adverts/views/adverts/adverts.haml +2 -0
  27. data/lib/orange-more/analytics.rb +1 -0
  28. data/lib/orange-more/analytics/middleware/analytics.rb +30 -0
  29. data/lib/orange-more/analytics/plugin.rb +11 -0
  30. data/lib/orange-more/analytics/resources/analytics_resource.rb +42 -0
  31. data/lib/orange-more/assets.rb +1 -0
  32. data/lib/orange-more/assets/cartons/asset_carton.rb +27 -0
  33. data/lib/orange-more/assets/plugin.rb +13 -0
  34. data/lib/orange-more/assets/resources/asset_resource.rb +115 -0
  35. data/lib/orange-more/assets/views/assets/change.haml +1 -0
  36. data/lib/orange-more/assets/views/assets/create.haml +13 -0
  37. data/lib/orange-more/assets/views/assets/insert.haml +1 -0
  38. data/lib/orange-more/blog.rb +1 -0
  39. data/lib/orange-more/blog/cartons/blog.rb +8 -0
  40. data/lib/orange-more/blog/cartons/blog_post.rb +60 -0
  41. data/lib/orange-more/blog/plugin.rb +14 -0
  42. data/lib/orange-more/blog/resources/blog_post_resource.rb +54 -0
  43. data/lib/orange-more/blog/resources/blog_resource.rb +104 -0
  44. data/lib/orange-more/blog/views/blog/blog_archive_view.haml +6 -0
  45. data/lib/orange-more/blog/views/blog/blog_offset_list_view.haml +12 -0
  46. data/lib/orange-more/blog/views/blog/blog_post_view.haml +4 -0
  47. data/lib/orange-more/blog/views/blog/sitemap_row.haml +14 -0
  48. data/lib/orange-more/blog/views/blog_posts/edit.haml +8 -0
  49. data/lib/orange-more/blog/views/blog_posts/show.haml +4 -0
  50. data/lib/orange-more/cloud.rb +1 -0
  51. data/lib/orange-more/cloud/plugin.rb +10 -0
  52. data/lib/orange-more/cloud/resources/cloud_resource.rb +21 -0
  53. data/lib/orange-more/contactforms.rb +1 -0
  54. data/lib/orange-more/contactforms/assets/js/jquery.validate.pack.js +15 -0
  55. data/lib/orange-more/contactforms/assets/js/lib/jquery-1.4.2.js +6240 -0
  56. data/lib/orange-more/contactforms/assets/js/lib/jquery.form.js +660 -0
  57. data/lib/orange-more/contactforms/assets/js/lib/jquery.js +4376 -0
  58. data/lib/orange-more/contactforms/assets/js/lib/jquery.metadata.js +122 -0
  59. data/lib/orange-more/contactforms/cartons/contactforms_carton.rb +12 -0
  60. data/lib/orange-more/contactforms/plugin.rb +13 -0
  61. data/lib/orange-more/contactforms/resources/contactforms_resource.rb +56 -0
  62. data/lib/orange-more/contactforms/views/contactforms/contactform.haml +20 -0
  63. data/lib/orange-more/debugger.rb +1 -0
  64. data/lib/orange-more/debugger/assets/css/debug_bar.css +46 -0
  65. data/lib/orange-more/debugger/middleware/debugger.rb +50 -0
  66. data/lib/orange-more/debugger/plugin.rb +12 -0
  67. data/lib/orange-more/debugger/views/debug_bar.haml +87 -0
  68. data/lib/orange-more/disqus.rb +1 -0
  69. data/lib/orange-more/disqus/plugin.rb +11 -0
  70. data/lib/orange-more/disqus/resources/disqus_resource.rb +9 -0
  71. data/lib/orange-more/disqus/views/disqus/comment_thread.haml +7 -0
  72. data/lib/orange-more/donations.rb +1 -0
  73. data/lib/orange-more/donations/cartons/donation_carton.rb +9 -0
  74. data/lib/orange-more/donations/plugin.rb +12 -0
  75. data/lib/orange-more/donations/resources/donations_resource.rb +51 -0
  76. data/lib/orange-more/donations/views/donations/donate_form.haml +21 -0
  77. data/lib/orange-more/donations/views/donations/donate_thanks.haml +2 -0
  78. data/lib/orange-more/donations/views/donations/paypal_form.haml +13 -0
  79. data/lib/orange-more/events.rb +1 -0
  80. data/lib/orange-more/events/assets/js/events.js +55 -0
  81. data/lib/orange-more/events/cartons/orange_calendar.rb +8 -0
  82. data/lib/orange-more/events/cartons/orange_event.rb +60 -0
  83. data/lib/orange-more/events/plugin.rb +14 -0
  84. data/lib/orange-more/events/resources/calendar_resource.rb +33 -0
  85. data/lib/orange-more/events/resources/event_resource.rb +147 -0
  86. data/lib/orange-more/events/views/calendar/calendar.haml +8 -0
  87. data/lib/orange-more/events/views/events/create.haml +55 -0
  88. data/lib/orange-more/events/views/events/edit.haml +59 -0
  89. data/lib/orange-more/events/views/events/list.haml +13 -0
  90. data/lib/orange-more/events/views/events/show.haml +4 -0
  91. data/lib/orange-more/events/views/events/table_row.haml +17 -0
  92. data/lib/orange-more/members.rb +1 -0
  93. data/lib/orange-more/members/cartons/member_carton.rb +38 -0
  94. data/lib/orange-more/members/plugin.rb +13 -0
  95. data/lib/orange-more/members/resources/members_resource.rb +327 -0
  96. data/lib/orange-more/members/views/members/create.haml +12 -0
  97. data/lib/orange-more/members/views/members/edit.haml +15 -0
  98. data/lib/orange-more/members/views/members/live.show.haml +1 -0
  99. data/lib/orange-more/members/views/members/login.haml +17 -0
  100. data/lib/orange-more/members/views/members/logout.haml +1 -0
  101. data/lib/orange-more/members/views/members/profile.haml +50 -0
  102. data/lib/orange-more/members/views/members/register.haml +37 -0
  103. data/lib/orange-more/news.rb +1 -0
  104. data/lib/orange-more/news/cartons/news.rb +12 -0
  105. data/lib/orange-more/news/plugin.rb +13 -0
  106. data/lib/orange-more/news/resources/news_resource.rb +83 -0
  107. data/lib/orange-more/news/views/news/archive.haml +14 -0
  108. data/lib/orange-more/news/views/news/edit.haml +7 -0
  109. data/lib/orange-more/news/views/news/latest.haml +8 -0
  110. data/lib/orange-more/news/views/news/sitemap_row.haml +14 -0
  111. data/lib/orange-more/pages.rb +1 -0
  112. data/lib/orange-more/pages/cartons/page_carton.rb +14 -0
  113. data/lib/orange-more/pages/cartons/page_version_carton.rb +12 -0
  114. data/lib/orange-more/pages/plugin.rb +13 -0
  115. data/lib/orange-more/pages/resources/page_resource.rb +179 -0
  116. data/lib/orange-more/pages/views/pages/edit.haml +34 -0
  117. data/lib/orange-more/pages/views/pages/show.haml +6 -0
  118. data/lib/orange-more/sitemap.rb +1 -0
  119. data/lib/orange-more/sitemap/assets/img/sitemap_down.png +0 -0
  120. data/lib/orange-more/sitemap/assets/img/sitemap_down_d.png +0 -0
  121. data/lib/orange-more/sitemap/assets/img/sitemap_indent.png +0 -0
  122. data/lib/orange-more/sitemap/assets/img/sitemap_indent_d.png +0 -0
  123. data/lib/orange-more/sitemap/assets/img/sitemap_outdent.png +0 -0
  124. data/lib/orange-more/sitemap/assets/img/sitemap_outdent_d.png +0 -0
  125. data/lib/orange-more/sitemap/assets/img/sitemap_up.png +0 -0
  126. data/lib/orange-more/sitemap/assets/img/sitemap_up_d.png +0 -0
  127. data/lib/orange-more/sitemap/assets/js/sitemap.js +11 -0
  128. data/lib/orange-more/sitemap/cartons/route.rb +44 -0
  129. data/lib/orange-more/sitemap/middleware/flex_router.rb +25 -0
  130. data/lib/orange-more/sitemap/plugin.rb +17 -0
  131. data/lib/orange-more/sitemap/resources/sitemap_resource.rb +295 -0
  132. data/lib/orange-more/sitemap/views/default_resource/sitemap_row.haml +30 -0
  133. data/lib/orange-more/sitemap/views/sitemap/breadcrumb.haml +12 -0
  134. data/lib/orange-more/sitemap/views/sitemap/list.haml +4 -0
  135. data/lib/orange-more/sitemap/views/sitemap/one_level.haml +7 -0
  136. data/lib/orange-more/sitemap/views/sitemap/route_actions.haml +15 -0
  137. data/lib/orange-more/sitemap/views/sitemap/sitemap_links.haml +14 -0
  138. data/lib/orange-more/sitemap/views/sitemap/table_row.haml +30 -0
  139. data/lib/orange-more/sitemap/views/sitemap/two_level.haml +13 -0
  140. data/lib/orange-more/slices.rb +1 -0
  141. data/lib/orange-more/slices/middleware/radius_parser.rb +24 -0
  142. data/lib/orange-more/slices/plugin.rb +15 -0
  143. data/lib/orange-more/slices/resources/radius.rb +117 -0
  144. data/lib/orange-more/slices/resources/slices.rb +35 -0
  145. data/lib/orange-more/subsites.rb +1 -0
  146. data/lib/orange-more/subsites/cartons/subsite.rb +8 -0
  147. data/lib/orange-more/subsites/middleware/subsite_load.rb +29 -0
  148. data/lib/orange-more/subsites/plugin.rb +17 -0
  149. data/lib/orange-more/subsites/resources/subsite_resource.rb +54 -0
  150. data/lib/orange-more/subsites/views/subsites/index.haml +2 -0
  151. data/lib/orange-more/testimonials.rb +1 -0
  152. data/lib/orange-more/testimonials/cartons/testimonials_carton.rb +15 -0
  153. data/lib/orange-more/testimonials/plugin.rb +13 -0
  154. data/lib/orange-more/testimonials/resources/testimonials_resource.rb +42 -0
  155. data/lib/orange-more/testimonials/views/testimonials/testimonials.haml +4 -0
  156. data/spec/orange-core/application_spec.rb +183 -0
  157. data/spec/orange-core/carton_spec.rb +136 -0
  158. data/spec/orange-core/core_spec.rb +248 -0
  159. data/spec/orange-core/magick_spec.rb +96 -0
  160. data/spec/orange-core/middleware/base_spec.rb +38 -0
  161. data/spec/orange-core/middleware/globals_spec.rb +3 -0
  162. data/spec/orange-core/middleware/rerouter_spec.rb +3 -0
  163. data/spec/orange-core/middleware/restful_router_spec.rb +3 -0
  164. data/spec/orange-core/middleware/route_context_spec.rb +3 -0
  165. data/spec/orange-core/middleware/route_site_spec.rb +3 -0
  166. data/spec/orange-core/middleware/show_exceptions_spec.rb +3 -0
  167. data/spec/orange-core/middleware/static_file_spec.rb +3 -0
  168. data/spec/orange-core/middleware/static_spec.rb +3 -0
  169. data/spec/orange-core/mock/mock_app.rb +16 -0
  170. data/spec/orange-core/mock/mock_carton.rb +43 -0
  171. data/spec/orange-core/mock/mock_core.rb +2 -0
  172. data/spec/orange-core/mock/mock_middleware.rb +25 -0
  173. data/spec/orange-core/mock/mock_mixins.rb +19 -0
  174. data/spec/orange-core/mock/mock_model_resource.rb +47 -0
  175. data/spec/orange-core/mock/mock_pulp.rb +24 -0
  176. data/spec/orange-core/mock/mock_resource.rb +26 -0
  177. data/spec/orange-core/mock/mock_router.rb +10 -0
  178. data/spec/orange-core/orange_spec.rb +19 -0
  179. data/spec/orange-core/packet_spec.rb +203 -0
  180. data/spec/orange-core/resource_spec.rb +96 -0
  181. data/spec/orange-core/resources/mapper_spec.rb +5 -0
  182. data/spec/orange-core/resources/model_resource_spec.rb +246 -0
  183. data/spec/orange-core/resources/parser_spec.rb +5 -0
  184. data/spec/orange-core/resources/routable_resource_spec.rb +5 -0
  185. data/spec/orange-core/spec_helper.rb +53 -0
  186. data/spec/orange-core/stack_spec.rb +232 -0
  187. data/spec/stats.rb +182 -0
  188. metadata +312 -0
@@ -0,0 +1,30 @@
1
+ - if route
2
+ .sitemap_item{:class => "sitemap_level_#{route.level}"}
3
+ - if route.level > 0
4
+ .move_actions.dent_actions
5
+ = form_link('Outdent', route_to(:sitemap, route.id, 'outdent'), false, {:method => 'post', :class => 'outdent arrow'}) if route.level > 1
6
+ %p= ' '
7
+ .move_actions
8
+ - if route.previous_sibling
9
+ = form_link('Up', route_to(:sitemap, route.id, 'higher'), false, {:method => 'post', :class => 'up arrow'})
10
+ - else
11
+ %p.disabled_up.arrow= ' '
12
+ - if route.next_sibling
13
+ = form_link('Down', route_to(:sitemap, route.id, 'lower'), false, {:method => 'post', :class => 'down arrow'})
14
+ - else
15
+ %p.disabled_down.arrow= ' '
16
+ .move_actions.dent_actions
17
+ = form_link('Indent', route_to(:sitemap, route.id, 'indent'), false, {:method => 'post', :class => 'indent arrow'}) if route.previous_sibling && route.previous_sibling.level == route.level
18
+ %p= ' '
19
+ %h4 #{route.link_text} <span>(#{route.full_path})</span>
20
+ .linked_to
21
+ %p
22
+ Linked to:
23
+ %a{:href => route.resource.blank? ? '#' : route_to(route.resource, route.resource_id, 'edit')} [#{route.resource}] ##{route.resource_id}
24
+ %p
25
+ Views:
26
+ = orange[:analytics].pageviews(route.full_path)
27
+ .actions
28
+ = form_link('Delete', route_to(:sitemap, route.id, 'delete'), 'Are you sure you want to delete this?', {:method => 'delete'})
29
+ %a{:href => route_to(:sitemap, route.id, 'edit')} Edit
30
+ %br.clear
@@ -0,0 +1,12 @@
1
+ - if model
2
+ %p
3
+ - for a in model.ancestors
4
+ %a{:href => a.full_path}= a.link_text
5
+ &gt;
6
+ %span.here= model.link_text
7
+ - else # Possibly a restful route
8
+ %p
9
+ - home = orange[:sitemap].home(packet)
10
+ %a{:href => home.full_path}= home.link_text
11
+ &gt;
12
+ %span.here= packet['route.resource'].to_s.capitalize
@@ -0,0 +1,4 @@
1
+ #sitemap_list
2
+ - for obj in list
3
+ = view_table_row(model_name, :model => obj)
4
+ %a{:href => route_to(model_name, 'create')} New
@@ -0,0 +1,7 @@
1
+ %ul.nav
2
+ %li.first
3
+ %a{:href => model.full_path} Home
4
+ - for item in model.children
5
+ - next unless item.show_in_nav
6
+ %li
7
+ %a{:href => item.full_path}= orange[:sitemap].link_text_for(item)
@@ -0,0 +1,15 @@
1
+ .move_actions.dent_actions
2
+ = form_link('Outdent', route_to(:sitemap, model.id, 'outdent'), false, {:method => 'post', :class => 'outdent arrow'}) if model.level > 1
3
+ %p= '&nbsp;'
4
+ .move_actions
5
+ - if model.previous_sibling
6
+ = form_link('Up', route_to(:sitemap, model.id, 'higher'), false, {:method => 'post', :class => 'up arrow'})
7
+ - else
8
+ %p.disabled_up.arrow= '&nbsp;'
9
+ - if model.next_sibling
10
+ = form_link('Down', route_to(:sitemap, model.id, 'lower'), false, {:method => 'post', :class => 'down arrow'})
11
+ - else
12
+ %p.disabled_down.arrow= '&nbsp;'
13
+ .move_actions.dent_actions
14
+ = form_link('Indent', route_to(:sitemap, model.id, 'indent'), false, {:method => 'post', :class => 'indent arrow'}) if model.previous_sibling && model.previous_sibling.level == model.level
15
+ %p= '&nbsp;'
@@ -0,0 +1,14 @@
1
+ - if list.empty?
2
+ .sitemap_links_info.notice
3
+ %p
4
+ This resource is not in the sitemap.
5
+ %a{:href => add_route_link + '/' + slug_me} Add one?
6
+ - else
7
+ .sitemap_links_info.success
8
+ %h4 Current Route: #{list.first.full_path} #{list.size > 1 ? '(and ' + (list.size - 1).to_s + ' others)' : ''}
9
+ %a.more_info{:href=>'#'} More Info
10
+ .sitemap_links{:style => 'display:none'}
11
+ - for obj in list
12
+ .sitemap_link
13
+ %span Path: #{obj.full_path}
14
+ %a{:href => add_route_link + '/' + slug_me} Add another?
@@ -0,0 +1,30 @@
1
+ - if model
2
+ .sitemap_item{:class => "sitemap_level_#{model.level}"}
3
+ - if model.level > 0
4
+ .move_actions.dent_actions
5
+ = form_link('Outdent', route_to(model_name, model.id, 'outdent'), false, {:method => 'post', :class => 'outdent arrow'}) if model.level > 1
6
+ %p= '&nbsp;'
7
+ .move_actions
8
+ - if model.previous_sibling
9
+ = form_link('Up', route_to(model_name, model.id, 'higher'), false, {:method => 'post', :class => 'up arrow'})
10
+ - else
11
+ %p.disabled_up.arrow= '&nbsp;'
12
+ - if model.next_sibling
13
+ = form_link('Down', route_to(model_name, model.id, 'lower'), false, {:method => 'post', :class => 'down arrow'})
14
+ - else
15
+ %p.disabled_down.arrow= '&nbsp;'
16
+ .move_actions.dent_actions
17
+ = form_link('Indent', route_to(model_name, model.id, 'indent'), false, {:method => 'post', :class => 'indent arrow'}) if model.previous_sibling && model.previous_sibling.level == model.level
18
+ %p= '&nbsp;'
19
+ %h4 #{orange[:sitemap].link_text_for(model)} <span>(#{model.full_path})</span>
20
+ .linked_to
21
+ %p
22
+ Linked to:
23
+ %a{:href => model.resource.blank? ? '#' : route_to(model.resource, model.resource_id, 'edit')} [#{model.resource}] ##{model.resource_id}
24
+ %p
25
+ Views:
26
+ = orange[:analytics].pageviews(route.full_path)
27
+ .actions
28
+ = form_link('Delete', route_to(model_name, model.id, 'delete'), 'Are you sure you want to delete this?', {:method => 'delete'})
29
+ %a{:href => route_to(model_name, model.id, 'edit')} Edit
30
+ %br.clear
@@ -0,0 +1,13 @@
1
+ %ul.nav
2
+ %li.first
3
+ %a{:href => model.full_path} Home
4
+ - for item in model.children
5
+ - next unless item.show_in_nav
6
+ %li
7
+ %a{:href => item.full_path}= orange[:sitemap].link_text_for(item)
8
+ - unless item.descendants.empty?
9
+ %ul.subnav
10
+ - for x in item.children
11
+ - next unless x.show_in_nav
12
+ %li
13
+ %a{:href => x.full_path}= orange[:sitemap].link_text_for(x)
@@ -0,0 +1 @@
1
+ require File.join('orange-more', 'slices', 'plugin')
@@ -0,0 +1,24 @@
1
+ require 'orange-core/middleware/base'
2
+
3
+ module Orange::Middleware
4
+ # The RadiusParser middleware will parse all outgoing content with
5
+ # Radius.
6
+ #
7
+ # For more details on how Radius works, see http://radius.rubyforge.org/
8
+ # This middleware also loads a resource: "Orange::Radius", for the
9
+ # purpose of exposing the context object.
10
+ class RadiusParser < Base
11
+ def init(opts = {})
12
+ @contexts = opts[:radius_contexts] || [:live]
13
+ # orange.load Orange::Radius.new, :radius
14
+ end
15
+
16
+ # Passes packet then parses the return
17
+ def packet_call(packet)
18
+ pass packet
19
+ orange[:radius].parse packet if @contexts.include? packet['route.context']
20
+ packet.finish
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ Dir.glob(File.join(File.dirname(__FILE__), 'resources', '*.rb')).each {|f| require f }
2
+ Dir.glob(File.join(File.dirname(__FILE__), 'middleware', '*.rb')).each {|f| require f }
3
+
4
+ module Orange::Plugins
5
+ class Slices < Base
6
+ resource Orange::Radius.new
7
+ resource Orange::Slices.new
8
+
9
+ postrouter Orange::Middleware::RadiusParser
10
+
11
+ end
12
+ end
13
+
14
+ Orange.plugin(Orange::Plugins::Slices.new)
15
+
@@ -0,0 +1,117 @@
1
+ require 'radius'
2
+
3
+ module Orange
4
+ # Radius resource is for exposing the Radius context
5
+ # and allowing parsing.
6
+ class Radius < Resource
7
+ call_me :radius
8
+ def afterLoad
9
+ @context = ::Radius::PacketContext.new
10
+ @defined_tags = []
11
+ orange.fire(:radius_loaded, self)
12
+ end
13
+
14
+ def context
15
+ @context
16
+ end
17
+
18
+ def defined_tags
19
+ @defined_tags
20
+ end
21
+
22
+ def define_tag(*args, &block)
23
+ @defined_tags << args.first unless @defined_tags.include? args.first
24
+ @context.define_tag(*args, &block)
25
+ end
26
+
27
+ def parse_text(packet, text = false)
28
+ content = text
29
+ unless content.blank?
30
+ parser = ::Radius::PacketParser.new(context, :tag_prefix => 'o')
31
+ parser.parse(content, packet)
32
+ end
33
+ end
34
+
35
+ def parse(packet)
36
+ content = packet[:content, false]
37
+ unless content.blank?
38
+ parser = ::Radius::PacketParser.new(context, :tag_prefix => 'o')
39
+ packet[:content] = parser.parse(content, packet)
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ module Radius
46
+ #
47
+ # The Radius parser. Initialize a parser with a Context object that
48
+ # defines how tags should be expanded. See the QUICKSTART[link:files/QUICKSTART.html]
49
+ # for a detailed explaination of its usage.
50
+ #
51
+ class PacketParser < Parser
52
+ def parse(string, packet = false)
53
+ @stack = [ParseContainerTag.new { |t| t.contents.to_s }]
54
+ tokenize(string)
55
+ stack_up(packet)
56
+ @stack.last.to_s
57
+ end
58
+
59
+ protected
60
+
61
+ def stack_up(packet = false)
62
+ @tokens.each do |t|
63
+ if t.is_a? String
64
+ @stack.last.contents << t
65
+ next
66
+ end
67
+ case t[:flavor]
68
+ when :open
69
+ @stack.push(ParseContainerTag.new(t[:name], t[:attrs]))
70
+ when :self
71
+ @stack.last.contents << ParseTag.new {@context.render_tag(t[:name], t[:attrs], packet)}
72
+ when :close
73
+ popped = @stack.pop
74
+ raise WrongEndTagError.new(popped.name, t[:name], @stack) if popped.name != t[:name]
75
+ popped.on_parse { |b| @context.render_tag(popped.name, popped.attributes, packet) { b.contents.to_s } }
76
+ @stack.last.contents << popped
77
+ when :tasteless
78
+ raise TastelessTagError.new(t, @stack)
79
+ else
80
+ raise UndefinedFlavorError.new(t, @stack)
81
+ end
82
+ end
83
+ raise MissingEndTagError.new(@stack.last.name, @stack) if @stack.length != 1
84
+ end
85
+ end
86
+ class PacketContext < Context
87
+
88
+ # Returns the value of a rendered tag. Used internally by Parser#parse.
89
+ def render_tag(name, attributes = {}, packet = false, &block)
90
+ if name =~ /^(.+?):(.+)$/
91
+ render_tag($1) { render_tag($2, attributes, packet, &block) }
92
+ else
93
+ tag_definition_block = @definitions[qualified_tag_name(name.to_s)]
94
+ if tag_definition_block
95
+ stack(name, attributes, packet, block) do |tag|
96
+ tag_definition_block.call(tag).to_s
97
+ end
98
+ else
99
+ tag_missing(name, attributes, &block)
100
+ end
101
+ end
102
+ end
103
+ # A convienence method for managing the various parts of the
104
+ # tag binding stack.
105
+ def stack(name, attributes, packet, block)
106
+ previous = @tag_binding_stack.last
107
+ previous_locals = previous.nil? ? @globals : previous.locals
108
+ locals = DelegatingOpenStruct.new(previous_locals)
109
+ locals.packet = packet
110
+ binding = TagBinding.new(self, locals, name, attributes, block)
111
+ @tag_binding_stack.push(binding)
112
+ result = yield(binding)
113
+ @tag_binding_stack.pop
114
+ result
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,35 @@
1
+ module Orange
2
+ class Slices < Orange::Resource
3
+ call_me :slices
4
+ def stack_init
5
+ orange[:radius].define_tag "slice" do |tag|
6
+ content = ''
7
+ resource = (tag.attr['resource'] || :slices).to_sym
8
+ id = tag.attr['id'] || nil
9
+ mode = (tag.attr['mode'] || tag.attr['chunk'] || (id ? :show : :index )).to_sym
10
+ if orange.loaded?(resource)
11
+ if orange[resource].respond_to?(mode) || resource == :slices
12
+ content << (id ? orange[resource].__send__(mode, tag.locals.packet, :id => id) : orange[resource].__send__(mode, tag.locals.packet, {:attrs => tag.attr}))
13
+ else
14
+ content << "resource #{resource} doesn't respond to #{mode}"
15
+ end
16
+ else
17
+ content << "resource #{resource} not loaded"
18
+ end
19
+ content
20
+ end
21
+ end
22
+
23
+ def view(packet, *args)
24
+ mode = packet['route.resource_action']
25
+ do_view(packet, mode, args.extract_options!)
26
+ end
27
+
28
+ def method_missing(mode, *args)
29
+ packet = args.first if args.first.kind_of? Orange::Packet
30
+ opts = args.extract_options!
31
+ opts[:resource_name] = 'slices'
32
+ do_view(packet, mode, opts)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1 @@
1
+ require File.join('orange-more', 'subsites', 'plugin')
@@ -0,0 +1,8 @@
1
+ class OrangeSite < Orange::Carton
2
+ property :type, Discriminator
3
+ has n, :subsites, 'OrangeSubsite'
4
+ end
5
+
6
+ class OrangeSubsite < OrangeSite
7
+ belongs_to :orange_site, :required => false
8
+ end
@@ -0,0 +1,29 @@
1
+ require 'orange-core/middleware/base'
2
+ module Orange::Middleware
3
+ # This will load information about the site to into the orange env
4
+ # - packet['site'] will be an instance of the site object
5
+ #
6
+ class SubsiteLoad < Base
7
+ def packet_call(packet)
8
+ if packet['site']
9
+ site = packet['site']
10
+ path = packet['route.path'] || packet.request.path_info
11
+
12
+ # Find the subsite in the sitemap table
13
+ extras, matched = orange[:sitemap].find_route_info(packet, path)
14
+
15
+ # If matched, update the loaded site and trim the path down a bit
16
+ if !matched.resource.blank? && matched.resource.to_sym == :subsites
17
+ if(m = site.subsites.first(:id => matched.resource_id))
18
+ packet['route.main_site_route'] = matched
19
+ packet['route.path'] = extras
20
+ packet['subsite'] = m
21
+ end
22
+ end
23
+ end
24
+ pass packet
25
+ end
26
+ end
27
+
28
+ end
29
+
@@ -0,0 +1,17 @@
1
+ Dir.glob(File.join(File.dirname(__FILE__), 'cartons', '*.rb')).each {|f| require f }
2
+ Dir.glob(File.join(File.dirname(__FILE__), 'resources', '*.rb')).each {|f| require f }
3
+ Dir.glob(File.join(File.dirname(__FILE__), 'middleware', '*.rb')).each {|f| require f }
4
+
5
+ module Orange::Plugins
6
+ class Subsites < Base
7
+ views_dir File.join(File.dirname(__FILE__), 'views')
8
+
9
+ resource Orange::SubsiteResource.new
10
+
11
+ prerouter Orange::Middleware::SubsiteLoad
12
+
13
+ end
14
+ end
15
+
16
+ Orange.plugin(Orange::Plugins::Subsites.new)
17
+
@@ -0,0 +1,54 @@
1
+ module Orange
2
+ class SubsiteResource < Orange::ModelResource
3
+ use OrangeSubsite
4
+ call_me :subsites
5
+ def stack_init
6
+ orange[:admin, true].add_link("Settings", :resource => @my_orange_name, :text => 'Subsites')
7
+ end
8
+
9
+ # Creates a new model object and saves it (if a post), then reroutes to the main page
10
+ # @param [Orange::Packet] packet the packet being routed
11
+ def new(packet, *opts)
12
+ if packet.request.post?
13
+ m = packet['site'].subsites.new(packet.request.params[@my_orange_name.to_s])
14
+ m.save
15
+ orange[:sitemap].add_route_for(packet,
16
+ :orange_site_id => packet['site'].id,
17
+ :resource => :subsites,
18
+ :resource_id => m.id,
19
+ :slug => 'subsite',
20
+ :link_text => 'Orange Subsite'
21
+ )
22
+ end
23
+ packet.reroute(@my_orange_name, :orange)
24
+ end
25
+
26
+ def url_for(packet, opts = {})
27
+ orange[:sitemap].url_for(packet, {:resource => 'subsites', :resource_id => (opts.is_a?(model_class) ? opts.id : packet['subsite'].id)})
28
+ end
29
+
30
+ def subsite_nav(packet, opts = {})
31
+ orange[:sitemap].one_level(packet, :model => orange[:sitemap].home(packet, :subsite => true))
32
+ end
33
+
34
+ def sitemap_row(packet, opts = {})
35
+ do_view(packet, :sitemap_row, opts)
36
+ end
37
+
38
+ end
39
+
40
+ class Mapper < Resource
41
+ def route_to(packet, resource, *args)
42
+ opts = args.extract_options!
43
+ packet = DefaultHash.new unless packet
44
+ context = opts[:context]
45
+ context = packet['route.context', nil] unless (context || (packet['route.context'] == :live))
46
+ site = packet['route.faked_site'] ? packet['route.site_url', nil] : nil
47
+ args.unshift(resource)
48
+ args.unshift(orange[:subsites].url_for(packet).gsub(/^\//, '').gsub(/\/$/, '')) if(packet['subsite'])
49
+ args.unshift(context)
50
+ args.unshift(site)
51
+ '/'+args.compact.join('/')
52
+ end
53
+ end
54
+ end