cortex-reaver 0.1.0 → 0.2.0

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 (141) hide show
  1. data/README +1 -1
  2. data/bin/cortex_reaver +3 -4
  3. data/lib/cortex_reaver.rb +270 -110
  4. data/lib/cortex_reaver/cache.rb +23 -0
  5. data/lib/cortex_reaver/config.rb +178 -74
  6. data/lib/cortex_reaver/controller/admin.rb +64 -4
  7. data/lib/cortex_reaver/controller/comment.rb +4 -4
  8. data/lib/cortex_reaver/controller/controller.rb +3 -3
  9. data/lib/cortex_reaver/controller/journal.rb +4 -2
  10. data/lib/cortex_reaver/controller/main.rb +117 -26
  11. data/lib/cortex_reaver/controller/page.rb +7 -0
  12. data/lib/cortex_reaver/controller/photograph.rb +12 -10
  13. data/lib/cortex_reaver/controller/tag.rb +1 -1
  14. data/lib/cortex_reaver/controller/user.rb +7 -2
  15. data/lib/cortex_reaver/helper/attachments.rb +2 -2
  16. data/lib/cortex_reaver/helper/crud.rb +7 -7
  17. data/lib/cortex_reaver/helper/feeds.rb +56 -38
  18. data/lib/cortex_reaver/helper/form.rb +12 -16
  19. data/lib/cortex_reaver/helper/navigation.rb +35 -16
  20. data/lib/cortex_reaver/helper/photographs.rb +2 -2
  21. data/lib/cortex_reaver/helper/sidebar.rb +44 -0
  22. data/lib/cortex_reaver/helper/tags.rb +32 -9
  23. data/lib/cortex_reaver/helper/workflow.rb +2 -14
  24. data/lib/cortex_reaver/layout/blank.rhtml +27 -31
  25. data/lib/cortex_reaver/layout/text.rhtml +54 -67
  26. data/lib/cortex_reaver/migrations/014_convert_projects_to_pages.rb +79 -0
  27. data/lib/cortex_reaver/model/comment.rb +7 -8
  28. data/lib/cortex_reaver/model/page.rb +5 -3
  29. data/lib/cortex_reaver/model/photograph.rb +57 -13
  30. data/lib/cortex_reaver/model/tag.rb +1 -4
  31. data/lib/cortex_reaver/model/user.rb +6 -3
  32. data/lib/cortex_reaver/plugin.rb +1 -1
  33. data/lib/cortex_reaver/plugins/twitter.rb +185 -0
  34. data/lib/cortex_reaver/public/css/actions.css +31 -0
  35. data/lib/cortex_reaver/public/css/admin.css +50 -27
  36. data/lib/cortex_reaver/public/css/attachments.css +11 -0
  37. data/lib/cortex_reaver/public/css/autotags.css +38 -0
  38. data/lib/cortex_reaver/public/css/code.css +10 -2
  39. data/lib/cortex_reaver/public/css/colophon.css +10 -0
  40. data/lib/cortex_reaver/public/css/commments.css +7 -0
  41. data/lib/cortex_reaver/public/css/custom.css +1 -0
  42. data/lib/cortex_reaver/public/css/flash.css +17 -0
  43. data/lib/cortex_reaver/public/css/fonts.css +22 -0
  44. data/lib/cortex_reaver/public/css/form.css +15 -3
  45. data/lib/cortex_reaver/public/css/generics.css +39 -0
  46. data/lib/cortex_reaver/public/css/icons.css +4 -0
  47. data/lib/cortex_reaver/public/css/journals.css +3 -0
  48. data/lib/cortex_reaver/public/css/main.css +30 -312
  49. data/lib/cortex_reaver/public/css/pagination.css +50 -0
  50. data/lib/cortex_reaver/public/css/photo-show.css +87 -0
  51. data/lib/cortex_reaver/public/css/photo.css +28 -97
  52. data/lib/cortex_reaver/public/css/progress.css +35 -0
  53. data/lib/cortex_reaver/public/css/sidebar.css +83 -0
  54. data/lib/cortex_reaver/public/css/table-of-contents.css +26 -0
  55. data/lib/cortex_reaver/public/css/table.css +3 -0
  56. data/lib/cortex_reaver/public/css/tags.css +29 -0
  57. data/lib/cortex_reaver/public/css/text.css +19 -1
  58. data/lib/cortex_reaver/public/css/top_actions.css +50 -0
  59. data/lib/cortex_reaver/public/css/users.css +3 -0
  60. data/lib/cortex_reaver/public/images/admin/icons.png +0 -0
  61. data/lib/cortex_reaver/public/images/admin/icons.xcf +0 -0
  62. data/lib/cortex_reaver/public/images/background_tile.png +0 -0
  63. data/lib/cortex_reaver/public/images/edit_34.png +0 -0
  64. data/lib/cortex_reaver/public/images/edit_34_prelight.png +0 -0
  65. data/lib/cortex_reaver/public/images/elided.png +0 -0
  66. data/lib/cortex_reaver/public/images/grid_34.png +0 -0
  67. data/lib/cortex_reaver/public/images/grid_34_prelight.png +0 -0
  68. data/lib/cortex_reaver/public/images/next_11.png +0 -0
  69. data/lib/cortex_reaver/public/images/next_34.png +0 -0
  70. data/lib/cortex_reaver/public/images/next_34_prelight.png +0 -0
  71. data/lib/cortex_reaver/public/images/prev_11.png +0 -0
  72. data/lib/cortex_reaver/public/images/prev_34.png +0 -0
  73. data/lib/cortex_reaver/public/images/prev_34_prelight.png +0 -0
  74. data/lib/cortex_reaver/public/js/admin.js +15 -22
  75. data/lib/cortex_reaver/public/js/autotags.js +120 -0
  76. data/lib/cortex_reaver/public/js/jquery.autocomplete.js +135 -176
  77. data/lib/cortex_reaver/public/js/jquery.color.js +124 -0
  78. data/lib/cortex_reaver/public/js/jquery.corners.min.js +7 -0
  79. data/lib/cortex_reaver/public/js/jquery.hotkeys-0.7.9.js +244 -0
  80. data/lib/cortex_reaver/public/js/jquery.js +4361 -4
  81. data/lib/cortex_reaver/public/js/jquery.periodicalupdater.js +98 -0
  82. data/lib/cortex_reaver/public/js/photo.js +3 -32
  83. data/lib/cortex_reaver/public/robots.txt +3 -0
  84. data/lib/cortex_reaver/snippets/ramaze/cache/memcached.rb +13 -10
  85. data/lib/cortex_reaver/snippets/range.rb +9 -0
  86. data/lib/cortex_reaver/support/attachments.rb +12 -0
  87. data/lib/cortex_reaver/support/comments.rb +1 -3
  88. data/lib/cortex_reaver/support/renderer.rb +20 -17
  89. data/lib/cortex_reaver/support/sequenceable.rb +6 -6
  90. data/lib/cortex_reaver/support/tags.rb +15 -7
  91. data/lib/cortex_reaver/version.rb +1 -1
  92. data/lib/cortex_reaver/view/admin/configuration.rhtml +7 -0
  93. data/lib/cortex_reaver/view/admin/index.rhtml +3 -0
  94. data/lib/cortex_reaver/view/admin/regenerate_photo_sizes.rhtml +16 -0
  95. data/lib/cortex_reaver/view/adminbox.rhtml +34 -44
  96. data/lib/cortex_reaver/view/comments/comment.rhtml +1 -1
  97. data/lib/cortex_reaver/view/comments/form.rhtml +1 -2
  98. data/lib/cortex_reaver/view/comments/post_form.rhtml +2 -10
  99. data/lib/cortex_reaver/view/head.rhtml +11 -0
  100. data/lib/cortex_reaver/view/journals/journal.rhtml +3 -3
  101. data/lib/cortex_reaver/view/journals/show.rhtml +0 -4
  102. data/lib/cortex_reaver/view/js.rhtml +1 -0
  103. data/lib/cortex_reaver/view/pages/list.rhtml +3 -23
  104. data/lib/cortex_reaver/view/pages/row.rhtml +13 -0
  105. data/lib/cortex_reaver/view/photographs/grid.rhtml +30 -36
  106. data/lib/cortex_reaver/view/photographs/show.rhtml +42 -108
  107. data/lib/cortex_reaver/view/sidebar/explore_photos.rhtml +7 -0
  108. data/lib/cortex_reaver/view/sidebar/photographs.rhtml +15 -0
  109. data/lib/cortex_reaver/view/sidebar/sections.rhtml +4 -0
  110. data/lib/cortex_reaver/view/sidebar/twitter.rhtml +12 -0
  111. data/lib/cortex_reaver/view/tags/show.rhtml +0 -10
  112. data/lib/cortex_reaver/view/tracker.rhtml +0 -0
  113. data/lib/cortex_reaver/view/users/list.rhtml +1 -7
  114. data/lib/cortex_reaver/view/users/login.rhtml +1 -1
  115. metadata +103 -43
  116. data/lib/cortex_reaver/controller/project.rb +0 -53
  117. data/lib/cortex_reaver/helper/template.rb +0 -37
  118. data/lib/cortex_reaver/model/project.rb +0 -57
  119. data/lib/cortex_reaver/public/css/ramaze_error.css +0 -90
  120. data/lib/cortex_reaver/public/images/atom-xml-icon.png +0 -0
  121. data/lib/cortex_reaver/public/images/body.png +0 -0
  122. data/lib/cortex_reaver/public/images/border_bottom.png +0 -0
  123. data/lib/cortex_reaver/public/images/border_bottom_left.png +0 -0
  124. data/lib/cortex_reaver/public/images/border_bottom_right.png +0 -0
  125. data/lib/cortex_reaver/public/images/border_left.png +0 -0
  126. data/lib/cortex_reaver/public/images/border_right.png +0 -0
  127. data/lib/cortex_reaver/public/images/border_top.png +0 -0
  128. data/lib/cortex_reaver/public/images/border_top_left.png +0 -0
  129. data/lib/cortex_reaver/public/images/border_top_right.png +0 -0
  130. data/lib/cortex_reaver/public/images/header.png +0 -0
  131. data/lib/cortex_reaver/public/images/header.xcf +0 -0
  132. data/lib/cortex_reaver/public/images/indicator.gif +0 -0
  133. data/lib/cortex_reaver/public/images/rss-xml-icon.png +0 -0
  134. data/lib/cortex_reaver/public/images/sections.png +0 -0
  135. data/lib/cortex_reaver/public/images/sections_highlight.png +0 -0
  136. data/lib/cortex_reaver/public/js/jquery.autocompletefb.js +0 -125
  137. data/lib/cortex_reaver/view/photographs/sidebar.rhtml +0 -7
  138. data/lib/cortex_reaver/view/projects/form.rhtml +0 -14
  139. data/lib/cortex_reaver/view/projects/list.rhtml +0 -31
  140. data/lib/cortex_reaver/view/projects/show.rhtml +0 -42
  141. data/lib/proto/cortex_reaver.yaml +0 -47
@@ -1,11 +1,25 @@
1
- require 'builder'
1
+ require 'libxml'
2
2
 
3
3
  module CortexReaver
4
4
  class MainController < Controller
5
5
  map '/'
6
6
 
7
7
  layout(:text) do |name, wish|
8
- !request.xhr? and name != 'atom'
8
+ if request.xhr? or name == 'atom' or name == 'sitemap'
9
+ false
10
+ else
11
+ true
12
+ end
13
+ end
14
+
15
+ # We provide an XML sitemap.
16
+ provide(:xml, :type => 'text/xml') do |action, value|
17
+ Ramaze::Log.info action
18
+ if action.method == 'sitemap'
19
+ value
20
+ else
21
+ nil
22
+ end
9
23
  end
10
24
 
11
25
  helper :cache,
@@ -14,9 +28,16 @@ module CortexReaver
14
28
  :feeds,
15
29
  :pages
16
30
 
17
- # cache_action(:method => :index, :ttl => 120) do
18
- # user.id.to_i.to_s + flash.inspect
19
- # end
31
+ cache_action(:method => :index, :ttl => 120) do
32
+ user.id.to_i.to_s + flash.inspect
33
+ end
34
+ cache_action(:method => :sitemap, :ttl => 300) do
35
+ request.path_info
36
+ end
37
+
38
+ def cache
39
+ respond Ramaze::Cache.action.stats
40
+ end
20
41
 
21
42
  # the index action is called automatically when no other action is specified
22
43
  def index(*ids)
@@ -25,10 +46,10 @@ module CortexReaver
25
46
  @title = @page.title
26
47
 
27
48
  if user.can_edit? Page.new
28
- workflow "Edit this page", PageController.r(:edit, @page.id)
49
+ workflow "Edit this page", PageController.r(:edit, @page.id), :edit, :page
29
50
  end
30
51
  if user.can_delete? Page.new
31
- workflow "Delete this page", PageController.r(:delete, @page.id)
52
+ workflow "Delete this page", PageController.r(:delete, @page.id), :delete, :page
32
53
  end
33
54
 
34
55
  PageController.render_view('show')
@@ -37,33 +58,22 @@ module CortexReaver
37
58
  error_404
38
59
  else
39
60
  # Default welcome page
40
- @photographs = Photograph.recent.viewable_by(user)
41
61
  @journals = Journal.recent.viewable_by(user)
42
-
43
- if @photographs.count > 0
44
- # Show sidebar
45
- @sidebar ||= []
46
- @sidebar.unshift PhotographController.render_view('sidebar')
47
- end
48
62
 
49
63
  # Workflows
50
64
  if user.can_create? Journal.new
51
- workflow "New Journal", JournalController.r(:new)
52
- end
53
- if user.can_create? Page.new
54
- workflow "New Page", PageController.r(:new)
65
+ workflow "New Journal", JournalController.r(:new), :new, :journal
55
66
  end
56
67
  if user.can_create? Photograph.new
57
- workflow "New Photograph", PhotographController.r(:new)
68
+ workflow "New Photograph", PhotographController.r(:new), :new, :photograph
69
+ end
70
+ if user.can_create? Page.new
71
+ workflow "New Page", PageController.r(:new), :new, :page
58
72
  end
59
- # if user.can_create? Project.new
60
- # workflow "New Project", ProjectController.r(:new)
61
- # end
62
73
 
63
74
  # Feeds
64
75
  feed 'Photographs', PhotographController.r(:atom)
65
76
  feed 'Journals', JournalController.r(:atom)
66
- # feed 'Projects', ProjectController.r(:atom)
67
77
  feed 'Comments', CommentController.r(:atom)
68
78
 
69
79
  JournalController.render_view('list', :journals => @journals)
@@ -75,9 +85,90 @@ module CortexReaver
75
85
  error_404
76
86
  end
77
87
 
78
- def clear
79
- Ramaze::Cache.action.clear
80
- respond "cache cleared"
88
+ # XML sitemap.
89
+ def sitemap
90
+ error_404 unless request.path_info =~ /\.xml$/
91
+
92
+ doc = LibXML::XML::Document.new
93
+ doc.root = (root = LibXML::XML::Node.new('urlset'))
94
+ root['xmlns'] = "http://www.sitemaps.org/schemas/sitemap/0.9"
95
+
96
+ # Front page
97
+ root << (url = LibXML::XML::Node.new('url'))
98
+ url << (loc = LibXML::XML::Node.new('loc'))
99
+ loc << full_url('/')
100
+ url << (lastmod = LibXML::XML::Node.new('lastmod'))
101
+ lastmod << Time.parse(Journal.dataset.min(:updated_on).to_s).xmlschema
102
+ url << (changefreq = LibXML::XML::Node.new('changefreq'))
103
+ changefreq << 'hourly'
104
+ url << (priority = LibXML::XML::Node.new('priority'))
105
+ priority << '1.0'
106
+
107
+ # Indexes
108
+ [JournalController, PhotographController].each do |c|
109
+ root << (url = LibXML::XML::Node.new('url'))
110
+ url << (loc = LibXML::XML::Node.new('loc'))
111
+ url << (lastmod = LibXML::XML::Node.new('lastmod'))
112
+ url << (changefreq = LibXML::XML::Node.new('changefreq'))
113
+ url << (priority = LibXML::XML::Node.new('priority'))
114
+
115
+ loc << full_url(c.r)
116
+ lastmod << Time.parse(c::MODEL.dataset.min(:updated_on).to_s).xmlschema
117
+ changefreq << 'hourly'
118
+ priority << '0.9'
119
+ end
120
+
121
+ # Comments
122
+ root << (url = LibXML::XML::Node.new('url'))
123
+ url << (loc = LibXML::XML::Node.new('loc'))
124
+ url << (lastmod = LibXML::XML::Node.new('lastmod'))
125
+ url << (changefreq = LibXML::XML::Node.new('changefreq'))
126
+ url << (priority = LibXML::XML::Node.new('priority'))
127
+
128
+ loc << full_url('/comments')
129
+ lastmod << Time.parse(Comment.dataset.min(:updated_on).to_s).xmlschema
130
+ changefreq << 'always'
131
+ priority << '0.5'
132
+
133
+ # Individual pages
134
+ Page.all.each do |page|
135
+ root << (url = LibXML::XML::Node.new('url'))
136
+ url << (loc = LibXML::XML::Node.new('loc'))
137
+ url << (lastmod = LibXML::XML::Node.new('lastmod'))
138
+ url << (changefreq = LibXML::XML::Node.new('changefreq'))
139
+ url << (priority = LibXML::XML::Node.new('priority'))
140
+
141
+ loc << full_url(page.url)
142
+ lastmod << page.updated_on.xmlschema
143
+ changefreq << 'weekly'
144
+ priority << '0.9'
145
+ end
146
+ Journal.all.each do |journal|
147
+ root << (url = LibXML::XML::Node.new('url'))
148
+ url << (loc = LibXML::XML::Node.new('loc'))
149
+ url << (lastmod = LibXML::XML::Node.new('lastmod'))
150
+ url << (changefreq = LibXML::XML::Node.new('changefreq'))
151
+ url << (priority = LibXML::XML::Node.new('priority'))
152
+
153
+ loc << full_url(journal.url)
154
+ lastmod << journal.updated_on.xmlschema
155
+ changefreq << 'weekly'
156
+ priority << '0.8'
157
+ end
158
+ Photograph.all.each do |photograph|
159
+ root << (url = LibXML::XML::Node.new('url'))
160
+ url << (loc = LibXML::XML::Node.new('loc'))
161
+ url << (lastmod = LibXML::XML::Node.new('lastmod'))
162
+ url << (changefreq = LibXML::XML::Node.new('changefreq'))
163
+ url << (priority = LibXML::XML::Node.new('priority'))
164
+
165
+ loc << full_url(photograph.url)
166
+ lastmod << photograph.updated_on.xmlschema
167
+ changefreq << 'weekly'
168
+ priority << '0.8'
169
+ end
170
+
171
+ doc
81
172
  end
82
173
 
83
174
  private
@@ -24,6 +24,7 @@ module CortexReaver
24
24
  end
25
25
 
26
26
  on_second_save do |page, request|
27
+ Ramaze::Log.info request[:tags]
27
28
  page.tags = request[:tags]
28
29
  add_attachments(page, request[:attachments])
29
30
  end
@@ -43,5 +44,11 @@ module CortexReaver
43
44
  on_update do |page, request|
44
45
  page.updater = session[:user]
45
46
  end
47
+
48
+ def index
49
+ @models = @pages = Page.select(:id, :name, :title)
50
+ workflow 'New Page', rs(:new), :new, :page
51
+ render_view :list
52
+ end
46
53
  end
47
54
  end
@@ -7,12 +7,12 @@ module CortexReaver
7
7
  map '/photographs'
8
8
 
9
9
  layout do |name, wish|
10
- if ['index', 'edit', 'new', 'page'].include? name
11
- :text
10
+ if ['show'].include? name
11
+ :blank
12
12
  elsif request.xhr? or name == 'atom'
13
13
  nil
14
14
  else
15
- :blank
15
+ :text
16
16
  end
17
17
  end
18
18
 
@@ -32,6 +32,10 @@ module CortexReaver
32
32
  user.id.to_i.to_s + flash.inspect
33
33
  end
34
34
 
35
+ before :index, :show, :page, :list, :tagged do
36
+ @body_class = "photographs"
37
+ end
38
+
35
39
  on_save do |photograph, request|
36
40
  photograph.title = request[:title]
37
41
  photograph.name = Photograph.canonicalize request[:name], :id => photograph.id
@@ -54,13 +58,11 @@ module CortexReaver
54
58
  photograph.updater = session[:user]
55
59
  end
56
60
 
57
- for_feed do |photograph, x|
58
- p photograph
59
- x.content(
60
- #render_view('atom_fragment.rhtml', :photograph => photograph),
61
- "a",
62
- :type => 'html'
63
- )
61
+ for_feed do |photograph, entry|
62
+ entry << (content = LibXML::XML::Node.new('content'))
63
+ entry << render_view(:atom_fragment, :photograph => photograph)
64
+ entry['type'] = 'html'
64
65
  end
66
+
65
67
  end
66
68
  end
@@ -45,7 +45,7 @@ module CortexReaver
45
45
  if q.empty?
46
46
  respond ''
47
47
  else
48
- respond Tag.filter(:title.like(/^#{q}/i)).limit(8).map(:title).join("\n")
48
+ respond Tag.filter(:title.like(/^#{q}/i)).limit(8).select(:name, :title).map(:title).join("\n")
49
49
  end
50
50
  end
51
51
 
@@ -35,12 +35,17 @@ module CortexReaver
35
35
  end
36
36
 
37
37
  # Listing users outright is a little dodgy.
38
- before :index do
38
+ before(:index, :page) do
39
39
  for_auth do |u|
40
40
  u.admin?
41
41
  end
42
42
  end
43
43
 
44
+ def index
45
+ @models = @users = User.select(:name, :id, :login)
46
+ render_view :list
47
+ end
48
+
44
49
  def login
45
50
  @title = "Login"
46
51
 
@@ -66,7 +71,7 @@ module CortexReaver
66
71
 
67
72
  def logout
68
73
  if user = do_logout
69
- flash[:notice] = "Goodbye, #{user.name}"
74
+ flash[:notice] = "Goodbye, #{user.name}."
70
75
  end
71
76
  redirect '/'
72
77
  end
@@ -26,7 +26,7 @@ module Ramaze
26
26
  def delete_attachment(id, name)
27
27
  unless @model = model_class.get(id)
28
28
  flash[:error] = "No such #{model_class.to_s.downcase} (#{h id}) exists."
29
- redirect Rs()
29
+ redirect rs()
30
30
  end
31
31
 
32
32
  # You need to be able to edit the model before removing attachments!
@@ -57,7 +57,7 @@ module Ramaze
57
57
  def attachment_form(model)
58
58
  s = "<div id=\"files\" class=\"files\">\n <ul>\n "
59
59
  model.attachments.each do |attachment|
60
- s << "<li><a href=\"#{attachment.public_path}\">#{attachment.name}</a> (#{A('delete', :href => Rs(:delete_attachment, model.name, attachment.name))})</li>\n"
60
+ s << "<li><a href=\"#{attachment.public_path}\">#{attachment.name}</a> (#{a('delete', :href => rs(:delete_attachment, model.name, attachment.name))})</li>\n"
61
61
  end
62
62
  s << "</ul>\n</div>\n\n"
63
63
 
@@ -96,7 +96,7 @@ module Ramaze
96
96
  u.can_create? model_class.new
97
97
  end
98
98
 
99
- @title = "New #{h model_class.to_s.demodulize.titleize}"
99
+ @title = "New #{model_class.to_s.demodulize.titleize}"
100
100
  @form_action = :new
101
101
 
102
102
  if request.post?
@@ -221,7 +221,7 @@ module Ramaze
221
221
  u.can_edit? @model
222
222
  end
223
223
 
224
- @title = "Edit #{model_class.to_s.demodulize.downcase} #{h @model.to_s}"
224
+ @title = "Edit #{model_class.to_s.demodulize.downcase} #{@model.to_s}"
225
225
  @form_action = "edit/#{@model.id}"
226
226
 
227
227
  set_singular_model_var @model
@@ -315,7 +315,7 @@ module Ramaze
315
315
  set_plural_model_var @models
316
316
 
317
317
  if user.can_create? model_class.new
318
- workflow "New #{model_class.to_s.demodulize}", rs(:new)
318
+ workflow "New #{model_class.to_s.demodulize}", rs(:new), :new, model_class.to_s.demodulize.downcase
319
319
  end
320
320
 
321
321
  render_view(:list)
@@ -332,7 +332,7 @@ module Ramaze
332
332
  # Redirect IDs to names
333
333
  raw_redirect(@model.url, :status => 301) if id =~ /^\d+$/
334
334
 
335
- @title = h @model.to_s
335
+ @title = @model.to_s
336
336
  set_singular_model_var @model
337
337
 
338
338
  if @model.class.associations.include? :comments
@@ -351,13 +351,13 @@ module Ramaze
351
351
  end
352
352
 
353
353
  if user.can_create? model_class.new
354
- workflow "New #{model_class.to_s.demodulize}", rs(:new)
354
+ workflow "New #{model_class.to_s.demodulize}", rs(:new), :new, model_class.to_s.demodulize.downcase
355
355
  end
356
356
  if user.can_edit? @model
357
- workflow "Edit this #{model_class.to_s.demodulize}", rs(:edit, @model.id)
357
+ workflow "Edit this #{model_class.to_s.demodulize}", rs(:edit, @model.id), :edit, model_class.to_s.demodulize.downcase
358
358
  end
359
359
  if user.can_delete? @model
360
- workflow "Delete this #{model_class.to_s.demodulize}", rs(:delete, @model.id)
360
+ workflow "Delete this #{model_class.to_s.demodulize}", rs(:delete, @model.id), :delete, model_class.to_s.demodulize.downcase
361
361
  end
362
362
  elsif id
363
363
  # Didn't find that model
@@ -6,7 +6,7 @@ module Ramaze
6
6
  #
7
7
  # Requires crud. Will attempt to cache feeds if the cache helper is available.
8
8
  module Feeds
9
- require 'builder'
9
+ require 'libxml'
10
10
 
11
11
  Helper::LOOKUP << self
12
12
 
@@ -36,9 +36,6 @@ module Ramaze
36
36
  def atom_builder(params = {:model_class => self.class.const_get('MODEL')})
37
37
  response['Content-Type'] = 'application/atom+xml'
38
38
 
39
- x = Builder::XmlMarkup.new(:indent => 2)
40
- x.instruct!
41
-
42
39
  # Get model class to work with
43
40
  model_class = params[:model_class]
44
41
 
@@ -52,42 +49,63 @@ module Ramaze
52
49
  updated = Time.now.xmlschema
53
50
  end
54
51
 
55
- # Construct URL base
56
- port = CortexReaver.config[:port]
57
- url_base = "#{request.scheme}://#{request.host}"
58
- url_base << ":#{port}" unless port == 80
59
-
60
- x.feed(:xmlns => 'http://www.w3.org/2005/Atom') do
61
- x.id url_base + model_class.url
62
- x.title "#{CortexReaver.config[:site][:name]} - #{model_class.to_s.demodulize.titleize}"
63
- # x.subtitle
64
- x.updated updated
65
- x.link :href => url_base + model_class.url
66
- x.link :href => (url_base + model_class.atom_url), :rel => 'self'
67
-
68
- recent.all do |model|
69
- x.entry do
70
- x.id url_base + model.url
71
- x.title model.title
72
- x.published model.created_on.xmlschema
73
- x.updated model.updated_on.xmlschema
74
- x.link :href => (url_base + model.url), :rel => 'alternate'
75
-
76
- x.author do
77
- x.name model.creator.name
78
-
79
- if model.creator.http
80
- x.uri model.creator.http
81
- end
82
- end
83
-
84
- # Any additional controller-specific info
85
- if self.class.for_feed_block
86
- self.class.for_feed_block.call(model, x)
87
- end
88
- end
52
+ # Doc
53
+ doc = LibXML::XML::Document.new
54
+ doc.root = (root = LibXML::XML::Node.new('feed'))
55
+ root['xmlns'] = 'http://www.w3.org/2005/Atom'
56
+
57
+ # Global opts
58
+ root << (id = LibXML::XML::Node.new('id'))
59
+ id << CortexReaver.config.site.url.to_s
60
+
61
+ root << (title = LibXML::XML::Node.new('title'))
62
+ title << "#{CortexReaver.config.site.name} - #{model_class.to_s.demodulize.titleize}"
63
+
64
+ root << (updated_node = LibXML::XML::Node.new('updated'))
65
+ updated_node << updated.to_s
66
+
67
+ root << (link = LibXML::XML::Node.new('link'))
68
+ link['href'] = full_url('/')
69
+
70
+ root << (link = LibXML::XML::Node.new('link'))
71
+ link['href'] = full_url(model_class.atom_url)
72
+ link['rel'] = 'self'
73
+
74
+ recent.all do |model|
75
+ root << (entry = LibXML::XML::Node.new('entry'))
76
+
77
+ entry << (id = LibXML::XML::Node.new('id'))
78
+ id << full_url(model.url)
79
+
80
+ entry << (title = LibXML::XML::Node.new('title'))
81
+ title << model.title.to_s
82
+
83
+ entry << (published = LibXML::XML::Node.new('published'))
84
+ published << model.created_on.xmlschema
85
+
86
+ entry << (updated = LibXML::XML::Node.new('updated'))
87
+ updated << model.updated_on.xmlschema
88
+
89
+ entry << (link = LibXML::XML::Node.new('link'))
90
+ link['href'] = full_url(model.url)
91
+ link['rel'] = 'alternate'
92
+
93
+ entry << (author = LibXML::XML::Node.new('author'))
94
+ author << (name = LibXML::XML::Node.new('name'))
95
+ name << model.creator.name.to_s
96
+
97
+ if model.creator.http
98
+ author << (uri = LibXML::XML::Node.new('uri'))
99
+ uri << model.creator.http.to_s
100
+ end
101
+
102
+ # Any additional controller-specific info
103
+ if self.class.for_feed_block
104
+ self.class.for_feed_block.call(model, entry)
89
105
  end
90
106
  end
107
+
108
+ doc
91
109
  end
92
110
 
93
111
  def feeds