cortex-reaver 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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