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
@@ -0,0 +1,23 @@
1
+ # A little no-op cache
2
+ module CortexReaver
3
+ class Cache
4
+ class Noop
5
+ include Innate::Cache::API
6
+ def cache_clear; end
7
+
8
+ def cached_delete(key, *keys)
9
+ nil
10
+ end
11
+
12
+ def cache_fetch(key, default = nil)
13
+ default
14
+ end
15
+
16
+ def cache_setup(host, user, app, cache); end
17
+
18
+ def cache_store(key, value, options = {})
19
+ value
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,92 +1,196 @@
1
1
  module CortexReaver
2
2
  # Contains site-specific configuration information for a CortexReaver site.
3
- class Config < Hash
4
- # Pass a YAML file with configuration options. At a minimum, it should specify
5
- # :database = {:proto, :username, :pasword, :host, :database}
6
- # or :database = "sequel_connect_string"
7
- # :root - The directory containing public/, layout/, and view/.
8
- # Defaults to HOME_DIR.
9
- # :log_root - The directory that Cortex Reaver should log to. Defaults to
10
- # HOME_DIR/log. If nil, file logging disabled.
11
- # :plugin_root - The directory that Cortex Reaver plugins live in. Defaults
12
- # to HOME_DIR/plugins.
13
- # :mode - Cortex Reaver mode: either :development or :production
14
- # :daemon - Whether to daemonize or not. Defaults to :true if :mode
15
- # is :production, otherwise nil.
16
- # :adapter - The Ramaze adapter name (default 'thin')
17
- # :cache - The Ramaze cache to use (default: :memory)
18
- # :host - Host to bind to
19
- # :port - Port to bind to (default 7000)
20
- # :pidfile - Process ID file for this server. Defaults to
21
- # HOME_DIR/cortex_reaver_<host>_<port>.pid
22
- # :compile_views - Whether to cache compiled view templates. Defaults to
23
- # true in production mode.
24
- # :plugins - Which plugins to enable. Defaults to [].
25
- #
26
- # Site configuration options
27
- # :site = {
28
- # :name - The name of the site
29
- # :author - The site author's name
30
- # :keywords - Keywords describing the site
31
- # :description - A short description of the site.
32
- # }
33
- def initialize(file)
3
+ class Config < Construct
4
+ def initialize(*args)
5
+ super *args
6
+
34
7
  # Defaults
35
- self[:database] = 'sqlite:////' + File.join(
36
- File.expand_path(CortexReaver::HOME_DIR),
37
- 'cortex_reaver.db'
38
- )
39
- self[:root] = CortexReaver::HOME_DIR
40
- self[:log_root] = File.join(CortexReaver::HOME_DIR, 'log')
41
- self[:plugin_root] = File.join(CortexReaver::HOME_DIR, 'plugins')
42
- self[:mode] = :production
43
- self[:adapter] = 'thin'
44
- self[:cache] = :memory
45
- self[:host] = nil
46
- self[:port] = 7000
47
- self[:plugins] = []
48
-
49
- self[:site] = {
50
- :name => 'Cortex Reaver',
51
- :description => "Stalks the dark corridors of this station, converting humans to Shodan's perfection.",
52
- :keywords => 'Cortex Reaver, blog',
53
- :author => 'Shodan'
54
- }
55
-
56
- # Load from file
57
- if File.exists? file
58
- begin
59
- self.merge!(YAML.load(File.read(file)))
60
- rescue => e
61
- raise RuntimeError.new("unable to load local configuration file #{file}: (#{e.message})")
8
+ define :root,
9
+ :desc => 'The local directory where CortexReaver runs.',
10
+ :default => CortexReaver::HOME_DIR
11
+ define :log_root,
12
+ :desc => 'Directory where logs are stored.',
13
+ :default => File.join(root, 'log')
14
+ define :layout_root,
15
+ :desc => 'Local directory where layouts are found.',
16
+ :default => File.join(root, 'layout')
17
+ define :plugin_root,
18
+ :desc => 'Local directory where plugins are found.',
19
+ :default => File.join(root, 'plugins')
20
+ define :public_root,
21
+ :desc => 'Local directory where public files are found.',
22
+ :default => File.join(root, 'public')
23
+ define :view_root,
24
+ :desc => 'Local directory where views are found.',
25
+ :default => File.join(root, 'view')
26
+
27
+
28
+ define :database, :default => Construct.new
29
+ database.define :adapter,
30
+ :desc => 'Database adapter',
31
+ :default => 'sqlite'
32
+ database.define :username,
33
+ :desc => 'Username',
34
+ :default => nil
35
+ database.define :password,
36
+ :desc => 'Database password',
37
+ :default => nil
38
+ database.define :host,
39
+ :desc => 'Host to connect to for the database.',
40
+ :default => nil
41
+ database.define :port,
42
+ :desc => 'Database port',
43
+ :default => nil
44
+ database.define :database,
45
+ :desc => 'The database on the server to connect to.',
46
+ :default => '/' + File.expand_path(File.join(root, 'cortex_reaver.db'))
47
+ database.define :string,
48
+ :desc => 'A Sequel connection string. If present, overrides the other DB fields.',
49
+ :default => nil
50
+
51
+ def database.str
52
+ if string
53
+ string
54
+ else
55
+ str = ''
56
+ str << adapter + '://' if adapter
57
+ str << username if username
58
+ str << ':' + password if username and password
59
+ str << '@' if username or password
60
+ str << host if host
61
+ str << ':' + port if host and port
62
+ str << '/'
63
+ str << database if database
62
64
  end
63
65
  end
64
66
 
65
- # Pidfile
66
- self[:pidfile] ||= File.join(CortexReaver::HOME_DIR, "cortex_reaver_#{self[:host] ? self[:host].to_s + '_' : ''}#{self[:port]}.pid")
67
+ define :mode,
68
+ :desc => 'Development or production mode.',
69
+ :default => :production
70
+ define :adapter,
71
+ :desc => 'The web server adapter used for Cortex Reaver.',
72
+ :default => 'thin'
73
+ define :cache,
74
+ :desc => 'The caching system used. One of :memory or :memcache',
75
+ :default => :memory
76
+ define :host,
77
+ :desc => 'Host address to bind to.',
78
+ :default => nil
79
+ define :port,
80
+ :desc => 'Port to bind to.',
81
+ :default => 7000
82
+
83
+ define :memcache,
84
+ :desc => "Memcache options",
85
+ :default => Construct.new
86
+
87
+ memcache.define :servers,
88
+ :desc => "Servers to use. An array of strings like 'host:port:weight'",
89
+ :default => ['localhost']
90
+
91
+ define :plugins,
92
+ :desc => 'Plugins configuration space.',
93
+ :default => Construct.new
94
+ plugins.define :enabled,
95
+ :desc => 'Plugin names to enable.',
96
+ :default => []
97
+
98
+ define :site,
99
+ :desc => 'Site configuration options',
100
+ :default => Construct.new
101
+ site.define :url,
102
+ :desc => 'The URL base for the web site. No trailing /.',
103
+ :default => 'http://localhost'
104
+ site.define :name,
105
+ :desc => 'The name of this web site. Used in titles, metadata, etc.',
106
+ :default => 'Cortex Reaver'
107
+ site.define :description,
108
+ :desc => 'A brief description of this site.',
109
+ :default => "Stalks the dark corridors of this station, converting humans to Shodan's perfection."
110
+ site.define :keywords,
111
+ :desc => 'Site keywords',
112
+ :default => 'Cortex Reaver, blog'
113
+ site.define :author,
114
+ :desc => 'The primary author of this site, used in copyright & metadata.',
115
+ :default => 'Shodan'
67
116
 
68
- # Daemon mode
69
- self[:daemon] ||= true if self[:mode] == :production
117
+ define :pidfile,
118
+ :desc => 'Filename which stores the process ID of Cortex Reaver.',
119
+ :default => File.join(root, "cortex_reaver_#{host ? host.to_s + '_' : ''}#{port}.pid")
120
+ define :daemon,
121
+ :desc => "Whether to daemonize. Enabled by default in production mode."
122
+ define :compile_views,
123
+ :desc => 'Whether to compile views. Enabled by default in production.'
70
124
 
71
- # Compile views
72
- self[:compile_views] ||= true if self[:mode] == :production
125
+ define :view,
126
+ :desc => "Configuration options for content display.",
127
+ :default => Construct.new
128
+ view.define :sections,
129
+ :desc => "A list of top-level sections for navigation. First is the human-readable name, and second is the URI for the link.",
130
+ :default => [
131
+ ['Journals', '/journals'],
132
+ ['Photographs', '/photographs'],
133
+ ['Tags', '/tags'],
134
+ ['Comments', '/comments'],
135
+ ['About', '/about']
136
+ ]
137
+ view.define :sidebar,
138
+ :desc => "An array of sidebars: [path, view]. Path is matched against the current request path. * globs to any non-slash characters, ** globs to all characters. The view is a string referencing the view in view/sidebar/ to render.
139
+
140
+ For example, if you wanted to render view/sidebar/tweet.rhtml using the twitter plugin, but only on the main page, you could do:
141
+
142
+ ['/', 'twitter']
143
+
144
+ Or to render a related entries box on all photograph pages...
145
+
146
+ ['/photographs/show/*', 'related']
147
+
148
+ You can also just provide a regex for the path, in which case it is matched directly against path_info. For example, here's how I show some custom tags on /photographs and other photo index pages:
149
+
150
+ [/^\/photographs(\/(page|tagged))?/, 'explore_photos']
151
+ [/^\/journals(\/(page|tagged))?/, 'explore_journals']
152
+ ",
153
+ :default => [
154
+ ['**', 'sections'],
155
+ ['/', 'photographs']
156
+ ]
157
+
158
+ define :css,
159
+ :desc => "An array of CSS files to load first, in order.",
160
+ :default => []
161
+ define :js,
162
+ :desc => "An array of Javascript files to load first, in order.",
163
+ :default => [
164
+ 'jquery.js',
165
+ 'jquery.color.js',
166
+ 'jquery.dimensions.js',
167
+ 'jquery.corners.min.js',
168
+ 'jquery.hotkeys-0.7.9.js',
169
+ 'cookie.js'
170
+ ]
73
171
  end
74
-
75
- def public_root
76
- if self[:root]
77
- File.join(self[:root], 'public')
172
+
173
+ def compile_views
174
+ if include? :compile_views
175
+ self[:compile_views]
176
+ else
177
+ mode == :production
78
178
  end
79
179
  end
80
180
 
81
- def view_root
82
- if self[:root]
83
- File.join(self[:root], 'view')
181
+ def daemon
182
+ if include? :daemon
183
+ self[:daemon]
184
+ else
185
+ mode == :production
84
186
  end
85
187
  end
86
188
 
87
- def layout_root
88
- if self[:root]
89
- File.join(self[:root], 'layout')
189
+ # Saves self to disk
190
+ def save
191
+ Ramaze::Log.info "Saving config #{to_yaml}"
192
+ File.open(CortexReaver.config_file, 'w') do |file|
193
+ file.write to_yaml
90
194
  end
91
195
  end
92
196
  end
@@ -1,6 +1,5 @@
1
1
  module CortexReaver
2
- class AdminController < Controller
3
-
2
+ class AdminController < Controller
4
3
  map '/admin'
5
4
 
6
5
  layout(:text) do
@@ -13,17 +12,44 @@ module CortexReaver
13
12
  require_roles :admin
14
13
  end
15
14
 
15
+ def self.jobs
16
+ @jobs ||= {}
17
+ end
18
+
16
19
  def index
17
20
  end
18
21
 
22
+ def configuration
23
+ if request.post?
24
+ begin
25
+ # Update config
26
+ # View sections
27
+ CortexReaver.config.view.sections = []
28
+ request['view.sections'].split("\n").each do |line|
29
+ parts = line.strip.split(' ')
30
+ if parts.size > 1
31
+ CortexReaver.config.view.sections << [parts[0..-2].join(' '), parts[-1]]
32
+ end
33
+ end
34
+
35
+ # Save
36
+ CortexReaver.config.save
37
+ flash[:notice] = "Configuration saved."
38
+ rescue => e
39
+ Ramaze::Log.error e.inspect + e.backtrace.join("\n")
40
+ flash[:error] = "Unable to update configuration: #{h e}"
41
+ end
42
+ end
43
+ end
44
+
19
45
  # Recalculate comment counts
20
46
  def update_comments
21
- [Journal, Page, Project, Photograph].each do |klass|
47
+ [Journal, Page, Photograph].each do |klass|
22
48
  klass.refresh_comment_counts
23
49
  end
24
50
 
25
51
  flash[:notice] = "Comment counts updated."
26
- redirect Rs()
52
+ redirect rs()
27
53
  end
28
54
 
29
55
  # Recalculate tag counts and vacuum unused tags
@@ -34,5 +60,39 @@ module CortexReaver
34
60
  @deleted << tag.destroy
35
61
  end
36
62
  end
63
+
64
+ def regenerate_caches
65
+ [Journal, Page, Comment].each do |klass|
66
+ klass.refresh_render_caches
67
+ end
68
+ redirect rs()
69
+ end
70
+
71
+ def regenerate_photo_sizes_status
72
+ if job = self.class.jobs[:regenerate_photo_sizes]
73
+ respond "{'i':#{job[:i]},'total':#{job[:total]}}"
74
+ else
75
+ respond '{}'
76
+ end
77
+ end
78
+
79
+ # Regenerates thumbnails on photographs
80
+ def regenerate_photo_sizes
81
+ unless self.class.jobs[:regenerate_photo_sizes]
82
+ self.class.jobs[:regenerate_photo_sizes] = Thread.new do
83
+ Thread.current.priority = -2
84
+ Thread.current[:total] = Photograph.count
85
+ while photo = (photo ? photo.next : Photograph.first)
86
+ Thread.current[:photo] = photo
87
+ Thread.current[:i] = photo.position
88
+ photo.regenerate_sizes
89
+ end
90
+
91
+ # Done
92
+ self.class.jobs[:regenerate_photo_sizes] = nil
93
+ Thread.exit
94
+ end
95
+ end
96
+ end
37
97
  end
38
98
  end
@@ -29,7 +29,6 @@ module CortexReaver
29
29
  comment.comment_id = request[:comment_id]
30
30
  comment.journal_id = request[:journal_id]
31
31
  comment.photograph_id = request[:photograph_id]
32
- comment.project_id = request[:project_id]
33
32
  end
34
33
 
35
34
  on_create do |comment, request|
@@ -49,8 +48,10 @@ module CortexReaver
49
48
  journal.updater = session[:user]
50
49
  end
51
50
 
52
- for_feed do |comment, x|
53
- x.content comment.body_cache, :type => 'html'
51
+ for_feed do |comment, entry|
52
+ entry << (content = LibXML::XML::Node.new('content'))
53
+ entry['type'] = 'html'
54
+ entry << comment.body_cache.to_s
54
55
  end
55
56
 
56
57
  # We only really care about tracking recent comments.
@@ -84,7 +85,6 @@ module CortexReaver
84
85
  @comment.comment_id = request[:comment_id]
85
86
  @comment.journal_id = request[:journal_id]
86
87
  @comment.photograph_id = request[:photograph_id]
87
- @comment.project_id = request[:project_id]
88
88
 
89
89
  if session[:user]
90
90
  # A user is logged in. Use their account.
@@ -1,9 +1,10 @@
1
1
  module CortexReaver
2
2
  class Controller < Ramaze::Controller
3
- trait :app => :cortex_reaver
3
+ # TODO: This breaks now. Why?
4
+ # trait :app => :cortex_reaver
4
5
  engine :Erubis
5
6
  layout :text
6
- helper :form, :auth, :navigation, :template, :workflow, :error
7
+ helper :form, :auth, :navigation, :workflow, :error, :sidebar, :aspect
7
8
  end
8
9
  end
9
10
 
@@ -14,7 +15,6 @@ module CortexReaver
14
15
  require File.join(LIB_DIR, 'controller', 'page')
15
16
  require File.join(LIB_DIR, 'controller', 'journal')
16
17
  require File.join(LIB_DIR, 'controller', 'photograph')
17
- require File.join(LIB_DIR, 'controller', 'project')
18
18
  require File.join(LIB_DIR, 'controller', 'comment')
19
19
  require File.join(LIB_DIR, 'controller', 'tag')
20
20
  require File.join(LIB_DIR, 'controller', 'documentation')
@@ -45,8 +45,10 @@ module CortexReaver
45
45
  journal.updater = session[:user]
46
46
  end
47
47
 
48
- for_feed do |journal, x|
49
- x.content journal.body_cache, :type => 'html'
48
+ for_feed do |journal, entry|
49
+ entry << (content = LibXML::XML::Node.new('content'))
50
+ content << journal.body_cache.to_s
51
+ content['type'] = 'html'
50
52
  end
51
53
  end
52
54
  end