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
@@ -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