muck-raker 0.1.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 (172) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +24 -0
  3. data/Rakefile +76 -0
  4. data/VERSION +1 -0
  5. data/app/controllers/admin/recommender/feeds_controller.rb +174 -0
  6. data/app/controllers/recommender/default_controller.rb +15 -0
  7. data/app/controllers/recommender/entries_controller.rb +79 -0
  8. data/app/controllers/recommender/recommendations_controller.rb +46 -0
  9. data/app/controllers/recommender/search_controller.rb +82 -0
  10. data/app/helpers/muck_raker_helper.rb +29 -0
  11. data/app/models/click.rb +2 -0
  12. data/app/models/cloud_cache.rb +9 -0
  13. data/app/models/entry.rb +274 -0
  14. data/app/models/feed.rb +29 -0
  15. data/app/models/language.rb +2 -0
  16. data/app/models/oai_endpoint.rb +2 -0
  17. data/app/models/recommendation.rb +2 -0
  18. data/app/models/service.rb +2 -0
  19. data/app/models/subject.rb +2 -0
  20. data/app/models/user.rb +36 -0
  21. data/app/views/default/_advertisements.html.erb +30 -0
  22. data/app/views/default/_language_list.html.erb +5 -0
  23. data/app/views/default/index.html.erb +3 -0
  24. data/app/views/default/tour.html.erb +15 -0
  25. data/app/views/default/widgets.html.erb +4 -0
  26. data/app/views/documents/.tmp_not_found.html +0 -0
  27. data/app/views/entries/_cloud_type_selector.html.erb +9 -0
  28. data/app/views/entries/_result.html.erb +10 -0
  29. data/app/views/entries/_tag_cloud.html.erb +4 -0
  30. data/app/views/entries/_tags.html.erb +7 -0
  31. data/app/views/entries/browse_by_tags.html.erb +33 -0
  32. data/app/views/entries/collections.html.erb +28 -0
  33. data/app/views/entries/details.html.erb +39 -0
  34. data/app/views/entries/index.html.erb +8 -0
  35. data/app/views/entries/search.html.erb +21 -0
  36. data/app/views/entries/show.html.erb +19 -0
  37. data/app/views/entries/track_clicks.html.erb +0 -0
  38. data/app/views/feeds/_feed_selection.html.erb +1 -0
  39. data/app/views/feeds/edit.html.erb +107 -0
  40. data/app/views/feeds/harvest_now.html.erb +3 -0
  41. data/app/views/feeds/index.html.erb +95 -0
  42. data/app/views/feeds/new.html.erb +109 -0
  43. data/app/views/feeds/unban.html.erb +3 -0
  44. data/app/views/layouts/_flashes.html.erb +5 -0
  45. data/app/views/layouts/default.html.erb +35 -0
  46. data/app/views/layouts/default_old.html.erb +43 -0
  47. data/app/views/layouts/global/_header.html.erb +16 -0
  48. data/app/views/layouts/global/_search_box.html.erb +13 -0
  49. data/app/views/layouts/recommendations.html.erb +17 -0
  50. data/app/views/recommendations/document_not_found.html.erb +13 -0
  51. data/app/views/recommendations/index.pjs.erb +44 -0
  52. data/app/views/recommendations/index.rss.builder +37 -0
  53. data/app/views/recommendations/index.xml.builder +34 -0
  54. data/app/views/recommendations/index_js.pjs.erb +35 -0
  55. data/app/views/search/_languages.html.erb +6 -0
  56. data/app/views/search/_result.html.erb +9 -0
  57. data/app/views/search/_search_box.html.erb +9 -0
  58. data/app/views/search/index.html.erb +5 -0
  59. data/app/views/search/results.atom.builder +27 -0
  60. data/app/views/search/results.html.erb +35 -0
  61. data/app/views/search/results.pjs.erb +13 -0
  62. data/app/views/search/results.rdf.builder +24 -0
  63. data/app/views/search/results.rss.builder +31 -0
  64. data/app/views/search/results.xml.builder +19 -0
  65. data/config/muck_raker_routes.rb +39 -0
  66. data/config/solr/README.txt +0 -0
  67. data/config/solr/cores/de/conf/protwords.txt +21 -0
  68. data/config/solr/cores/de/conf/schema.xml +81 -0
  69. data/config/solr/cores/de/conf/solrconfig.xml +304 -0
  70. data/config/solr/cores/de/conf/stopwords.txt +341 -0
  71. data/config/solr/cores/de/conf/synonyms.txt +31 -0
  72. data/config/solr/cores/en/conf/protwords.txt +21 -0
  73. data/config/solr/cores/en/conf/schema.xml +83 -0
  74. data/config/solr/cores/en/conf/solrconfig.xml +304 -0
  75. data/config/solr/cores/en/conf/stopwords.txt +341 -0
  76. data/config/solr/cores/en/conf/synonyms.txt +31 -0
  77. data/config/solr/cores/es/conf/protwords.txt +21 -0
  78. data/config/solr/cores/es/conf/schema.xml +81 -0
  79. data/config/solr/cores/es/conf/solrconfig.xml +304 -0
  80. data/config/solr/cores/es/conf/stopwords.txt +206 -0
  81. data/config/solr/cores/es/conf/synonyms.txt +31 -0
  82. data/config/solr/cores/fr/conf/protwords.txt +21 -0
  83. data/config/solr/cores/fr/conf/schema.xml +82 -0
  84. data/config/solr/cores/fr/conf/solrconfig.xml +304 -0
  85. data/config/solr/cores/fr/conf/stopwords.txt +57 -0
  86. data/config/solr/cores/fr/conf/synonyms.txt +31 -0
  87. data/config/solr/cores/ja/conf/protwords.txt +21 -0
  88. data/config/solr/cores/ja/conf/schema.xml +69 -0
  89. data/config/solr/cores/ja/conf/solrconfig.xml +304 -0
  90. data/config/solr/cores/ja/conf/stopwords.txt +341 -0
  91. data/config/solr/cores/ja/conf/synonyms.txt +31 -0
  92. data/config/solr/cores/nl/conf/protwords.txt +21 -0
  93. data/config/solr/cores/nl/conf/schema.xml +78 -0
  94. data/config/solr/cores/nl/conf/solrconfig.xml +304 -0
  95. data/config/solr/cores/nl/conf/stopwords.txt +45691 -0
  96. data/config/solr/cores/nl/conf/synonyms.txt +31 -0
  97. data/config/solr/cores/ru/conf/protwords.txt +21 -0
  98. data/config/solr/cores/ru/conf/schema.xml +78 -0
  99. data/config/solr/cores/ru/conf/solrconfig.xml +304 -0
  100. data/config/solr/cores/ru/conf/stopwords.txt +341 -0
  101. data/config/solr/cores/ru/conf/synonyms.txt +31 -0
  102. data/config/solr/cores/zh/conf/protwords.txt +21 -0
  103. data/config/solr/cores/zh/conf/schema.xml +72 -0
  104. data/config/solr/cores/zh/conf/solrconfig.xml +304 -0
  105. data/config/solr/cores/zh/conf/stopwords.txt +341 -0
  106. data/config/solr/cores/zh/conf/synonyms.txt +31 -0
  107. data/config/solr/solr.xml +50 -0
  108. data/db/bootstrap/feeds.yml +4268 -0
  109. data/db/bootstrap/oai_endpoints.yml +6 -0
  110. data/db/bootstrap/services.yml +172 -0
  111. data/db/migrate/20090602191243_create_muck_raker.rb +304 -0
  112. data/install.rb +1 -0
  113. data/lib/muck_raker/initialize_routes.rb +8 -0
  114. data/lib/muck_raker/languages.rb +53 -0
  115. data/lib/muck_raker.rb +6 -0
  116. data/locales/en.yml +42 -0
  117. data/rails/init.rb +27 -0
  118. data/raker/lib/aggregatord.jar +0 -0
  119. data/raker/lib/aggregatord.properties +45 -0
  120. data/raker/lib/apache-solr-common-1.3.0.jar +0 -0
  121. data/raker/lib/apache-solr-core-1.3.0.jar +0 -0
  122. data/raker/lib/apache-solr-dataimporthandler-1.3.0.jar +0 -0
  123. data/raker/lib/axis.jar +0 -0
  124. data/raker/lib/commons-codec-1.3.jar +0 -0
  125. data/raker/lib/commons-csv-1.0-SNAPSHOT-r609327.jar +0 -0
  126. data/raker/lib/commons-daemon.jar +0 -0
  127. data/raker/lib/commons-dbcp-1.2.1.jar +0 -0
  128. data/raker/lib/commons-discovery-0.2.jar +0 -0
  129. data/raker/lib/commons-fileupload-1.2.jar +0 -0
  130. data/raker/lib/commons-httpclient-3.1.jar +0 -0
  131. data/raker/lib/commons-io-1.3.1.jar +0 -0
  132. data/raker/lib/commons-logging-1.0.4.jar +0 -0
  133. data/raker/lib/commons-pool-1.3.jar +0 -0
  134. data/raker/lib/delicious-1.13.jar +0 -0
  135. data/raker/lib/flickrapi-1.0a9.jar +0 -0
  136. data/raker/lib/geronimo-stax-api_1.0_spec-1.0.1.jar +0 -0
  137. data/raker/lib/javax.jms.jar +0 -0
  138. data/raker/lib/jaxrpc.jar +0 -0
  139. data/raker/lib/jdom.jar +0 -0
  140. data/raker/lib/jericho.jar +0 -0
  141. data/raker/lib/junit-4.3.jar +0 -0
  142. data/raker/lib/log4j-1.2.8.jar +0 -0
  143. data/raker/lib/lucene-analyzers-2.4-dev.jar +0 -0
  144. data/raker/lib/lucene-core-2.4-dev.jar +0 -0
  145. data/raker/lib/lucene-highlighter-2.4-dev.jar +0 -0
  146. data/raker/lib/lucene-memory-2.4-dev.jar +0 -0
  147. data/raker/lib/lucene-queries-2.4-dev.jar +0 -0
  148. data/raker/lib/lucene-snowball-2.4-dev.jar +0 -0
  149. data/raker/lib/lucene-spellchecker-2.4-dev.jar +0 -0
  150. data/raker/lib/mail.jar +0 -0
  151. data/raker/lib/mysql-connector-java-5.1.7-bin.jar +0 -0
  152. data/raker/lib/recommenderd.jar +0 -0
  153. data/raker/lib/recommenderd.properties +64 -0
  154. data/raker/lib/rome-1.0.jar +0 -0
  155. data/raker/lib/rome.properties +90 -0
  156. data/raker/lib/solr-commons-csv-pom.xml.template +36 -0
  157. data/raker/lib/solr-lucene-analyzers-pom.xml.template +35 -0
  158. data/raker/lib/solr-lucene-contrib-pom.xml.template +48 -0
  159. data/raker/lib/solr-lucene-core-pom.xml.template +36 -0
  160. data/raker/lib/solr-lucene-highlighter-pom.xml.template +38 -0
  161. data/raker/lib/solr-lucene-queries-pom.xml.template +38 -0
  162. data/raker/lib/solr-lucene-snowball-pom.xml.template +36 -0
  163. data/raker/lib/solr-lucene-spellchecker-pom.xml.template +36 -0
  164. data/raker/lib/stax-utils.jar +0 -0
  165. data/raker/lib/wsdl4j-1.5.1.jar +0 -0
  166. data/raker/lib/wstx-asl-3.2.7.jar +0 -0
  167. data/tasks/bootstrap.rake +18 -0
  168. data/tasks/raker.rake +68 -0
  169. data/test/recommender_test.rb +8 -0
  170. data/test/test_helper.rb +20 -0
  171. data/uninstall.rb +1 -0
  172. metadata +253 -0
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 [name of plugin creator]
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,24 @@
1
+ Recommender
2
+ ===========
3
+ The recommender adds the ability to aggregate, search and analyze data from many different web sources.
4
+
5
+ Installation
6
+ ===========
7
+ Install gem dependencies:
8
+
9
+ sudo gem install mbleigh-acts-as-taggable-on
10
+ sudo gem install mislav-will_paginate
11
+
12
+ After install acts-as-taggable-on be sure to include the helper in application_helper.rb:
13
+
14
+ module ApplicationHelper
15
+ include TagsHelper
16
+ end
17
+
18
+
19
+
20
+ Example
21
+ =======
22
+
23
+
24
+ Copyright (c) 2009 Justin Ball and Joel Duffin, released under the MIT license
data/Rakefile ADDED
@@ -0,0 +1,76 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ desc 'Default: run unit tests.'
6
+ task :default => :test
7
+
8
+ desc 'Test the recommender plugin.'
9
+ Rake::TestTask.new(:test) do |t|
10
+ t.libs << 'lib'
11
+ t.libs << 'test'
12
+ t.pattern = 'test/**/*_test.rb'
13
+ t.verbose = true
14
+ end
15
+
16
+ desc 'Generate documentation for the recommender plugin.'
17
+ Rake::RDocTask.new(:rdoc) do |rdoc|
18
+ rdoc.rdoc_dir = 'rdoc'
19
+ rdoc.title = 'Recommender'
20
+ rdoc.options << '--line-numbers' << '--inline-source'
21
+ rdoc.rdoc_files.include('README')
22
+ rdoc.rdoc_files.include('lib/**/*.rb')
23
+ end
24
+
25
+ begin
26
+ require 'jeweler'
27
+ Jeweler::Tasks.new do |gemspec|
28
+ gemspec.name = "muck-raker"
29
+ gemspec.summary = "The aggregation and recommendation engine for the muck system"
30
+ gemspec.email = "justinball@gmail.com"
31
+ gemspec.homepage = "http://github.com/jbasdf/muck_raker"
32
+ gemspec.description = "The aggregation and recommendation engine for the muck system."
33
+ gemspec.authors = ["Joel Duffin Justin Ball"]
34
+ gemspec.rubyforge_project = 'muck-raker'
35
+ gemspec.add_dependency "muck-engine"
36
+ gemspec.add_dependency "muck-users"
37
+ gemspec.add_dependency "muck-solr"
38
+ gemspec.files.include %w( tasks/*
39
+ db/migrate/*.rb
40
+ app/**/**/**/*
41
+ config/*
42
+ locales/*
43
+ rails/*
44
+ test/*
45
+ lib/**/*
46
+ public/javascripts/* )
47
+ end
48
+ rescue LoadError
49
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
50
+ end
51
+ # rubyforge tasks
52
+ begin
53
+ require 'rake/contrib/sshpublisher'
54
+ namespace :rubyforge do
55
+
56
+ desc "Release gem and RDoc documentation to RubyForge"
57
+ task :release => ["rubyforge:release:gem", "rubyforge:release:docs"]
58
+
59
+ namespace :release do
60
+ desc "Publish RDoc to RubyForge."
61
+ task :docs => [:rdoc] do
62
+ config = YAML.load(
63
+ File.read(File.expand_path('~/.rubyforge/user-config.yml'))
64
+ )
65
+
66
+ host = "#{config['username']}@rubyforge.org"
67
+ remote_dir = "/var/www/gforge-projects/muck-comments/"
68
+ local_dir = 'rdoc'
69
+
70
+ Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
71
+ end
72
+ end
73
+ end
74
+ rescue LoadError
75
+ puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
76
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,174 @@
1
+ class Admin::Recommender::FeedsController < ApplicationController
2
+
3
+ layout "default"
4
+
5
+ before_filter :login_required, :only => [:index, :edit, :ban, :unban, :destroy, :update, :new]
6
+
7
+ # GET /feeds
8
+ # GET /feeds.xml
9
+ def index
10
+ @feeds = Feed.find(:all, :conditions => "status >= 0", :order => "title")
11
+ @banned_feeds = Feed.find(:all, :conditions => "status < 0", :order => "title")
12
+
13
+ respond_to do |format|
14
+ format.html # index.rhtml
15
+ format.xml { render :xml => @feeds.to_xml }
16
+ end
17
+ end
18
+
19
+ def entries
20
+ @new_feed = params[:new_feed]
21
+ @feed = Feed.find(params[:id])
22
+ @courses = @feed.entries.find(:all, :order => "title")
23
+
24
+ respond_to do |format|
25
+ format.html { render :partial => "courses", :layout => "default" }
26
+ format.xml { render :xml => @courses.to_xml }
27
+ end
28
+ end
29
+
30
+ # GET /feeds/selection_list
31
+ def selection_list
32
+ @feeds = Feed.find(:all, :order => "short_title")
33
+ render :partial => "feed_selection", :collection => @feeds, :layout => false
34
+ end
35
+
36
+ # GET /feeds/1
37
+ # GET /feeds/1.xml
38
+ def show
39
+ redirect_to "/feeds/" + params[:id] + "/entries"
40
+ end
41
+
42
+ # GET /feeds/new
43
+ def new
44
+ @no_follow = true
45
+ @feeds = Feed.find(:all, :conditions => "status >= 0", :order => "title")
46
+ @feed = Feed.new
47
+ render :layout => "default"
48
+ end
49
+
50
+ # GET /feeds/1;edit
51
+ def edit
52
+ @feed = Feed.find(params[:id])
53
+ render :layout => "default"
54
+ end
55
+
56
+ # # GET /feeds/1;reharvest
57
+ # def harvest_now
58
+ # @no_index = true
59
+ # @feed = Feed.find(params[:id])
60
+ # @feed.entries.destroy_all
61
+ # @feed.failed_requests = "0"
62
+ # @feed.refreshed_at = "2001"
63
+ # @feed.save!
64
+ # end
65
+
66
+ # GET /feeds/1;ban
67
+ def ban
68
+ @feed = Feed.find(params[:id])
69
+ @feed.entries.destroy_all
70
+ @feed.status = -1
71
+ @feed.save!
72
+ #redirect_to feeds_path
73
+ redirect_to "/feeds"
74
+ end
75
+
76
+ # GET /feeds/1;unban
77
+ def unban
78
+ @feed = Feed.find(params[:id])
79
+ @feed.unban = true
80
+ @feed.status = 0
81
+ @feed.refreshed_at = "2001"
82
+ @feed.save!
83
+ #redirect_to feeds_path
84
+ redirect_to "/feeds"
85
+ end
86
+
87
+ # def notification_feed_added(feed)
88
+ # begin
89
+ # FeedNotify.deliver_feed_added(feed)
90
+ # return
91
+ # rescue Exception => e
92
+ # # unble to send activation email. Activate the user anyway which means
93
+ # # letting flow continue below
94
+ # logger.error 'Unable to send feed added notification E-Mail:'
95
+ # logger.error e
96
+ # end
97
+ # end
98
+ #
99
+ # def notification_feed_updated(feed)
100
+ # begin
101
+ # FeedNotify.deliver_feed_updated(feed)
102
+ # return
103
+ # rescue Exception => e
104
+ # # unble to send activation email. Activate the user anyway which means
105
+ # # letting flow continue below
106
+ # logger.error 'Unable to send feed added notification E-Mail:'
107
+ # logger.error e
108
+ # end
109
+ # end
110
+
111
+ # POST /feeds
112
+ # POST /feeds.xml
113
+ def create
114
+ @feed = Feed.new(params[:feed])
115
+ @feed.harvested_from_display_uri = @feed.display_uri
116
+ @feed.entries_count = 0
117
+ @feed.last_requested_at = Time.now - 2592000
118
+ @feed.last_harvested_at = Time.now - 2592000
119
+
120
+ respond_to do |format|
121
+ if @feed.save
122
+ flash[:notice] = 'Feed was successfully created.'
123
+
124
+ # email the admin to let them know a feed has been added
125
+ # notification_feed_added(@feed)
126
+
127
+ # redirect to a page letting them know the feed has been created
128
+ #format.html { redirect_to entries_path(@feed) + "?new_feed=true" }
129
+ format.html { redirect_to "/feeds/" }
130
+ format.xml { head :created, :location => feed_url(@feed) }
131
+ else
132
+ format.html { render :action => "new" }
133
+ format.xml { render :xml => @feed.errors.to_xml }
134
+ end
135
+ end
136
+ end
137
+
138
+ # PUT /feeds/1
139
+ # PUT /feeds/1.xml
140
+ def update
141
+ @feed = Feed.find(params[:id])
142
+
143
+ # force a harvest now
144
+ # harvest_now
145
+
146
+ respond_to do |format|
147
+ if @feed.update_attributes(params[:feed])
148
+ # notification_feed_updated(@feed)
149
+ flash[:notice] = 'Feed was successfully updated.'
150
+ format.html {
151
+ redirect_to "/feeds/"
152
+ return
153
+ }
154
+ format.xml { head :ok }
155
+ else
156
+ format.html { render :action => "edit" }
157
+ format.xml { render :xml => @feed.errors.to_xml }
158
+ end
159
+ end
160
+ end
161
+
162
+ # # DELETE /feeds/1
163
+ # # DELETE /feeds/1.xml
164
+ # def destroy
165
+ # @feed = Feed.find(params[:id])
166
+ # @feed.destroy
167
+ #
168
+ # respond_to do |format|
169
+ # format.html { redirect_to feeds_url }
170
+ # format.xml { head :ok }
171
+ # end
172
+ # end
173
+
174
+ end
@@ -0,0 +1,15 @@
1
+ class Recommender::DefaultController < ApplicationController
2
+
3
+ def widgets
4
+ respond_to do |format|
5
+ format.html { render :template => 'default/widgets' }
6
+ end
7
+ end
8
+
9
+ def tour
10
+ respond_to do |format|
11
+ format.html { render :template => 'default/tour' }
12
+ end
13
+ end
14
+
15
+ end
@@ -0,0 +1,79 @@
1
+ class Recommender::EntriesController < ApplicationController
2
+
3
+ def initialize
4
+ @no_index = true
5
+ end
6
+
7
+ def index
8
+ @tags = CloudCache.language_tags('en') unless fragment_exist?({:controller => 'entries', :action => 'index'})
9
+ respond_to do |format|
10
+ format.html { render :template => 'entries/index' }
11
+ end
12
+ end
13
+
14
+ def browse_by_tags
15
+ @browse_tags = params[:tags]
16
+ @top_tags = Entry.top_tags(@browse_tags)
17
+ @search = @browse_tags.join(' ') if (!@browse_tags.nil? && !@browse_tags.empty?)
18
+ _search
19
+ respond_to do |format|
20
+ format.html { render :template => 'entries/browse_by_tags' }
21
+ end
22
+ end
23
+
24
+ def show
25
+ @search = params[:q]
26
+ _search
27
+ respond_to do |format|
28
+ format.html { render :template => 'entries/search' }
29
+ end
30
+ end
31
+
32
+ def _search
33
+ @offset = (params[:offset] || 0).to_i
34
+ @limit = (params[:limit] || 10).to_i
35
+ @term_list = URI.escape(@search) if !@search.nil?
36
+ if !@search.nil?
37
+ results = Entry.search(@search, 'en', @limit, @offset)
38
+ @results = results.results
39
+ @hit_count = results.total
40
+ end
41
+ end
42
+
43
+ def show_old
44
+ @languages = Language.find(:all, :order => "name")
45
+ @page_title = "Related Resources"
46
+ @entry = Entry.find(params[:id], :include => :feed)
47
+ if @entry.nil?
48
+ render_text "Unable to find the specified document"
49
+ return
50
+ end
51
+ @entry_title = @entry.title + " (" + @entry.feed.short_title + ")"
52
+ I18n.locale = @entry.language[0..1]
53
+ @limit = params[:limit] ? params[:limit].to_i : 20
54
+ @limit = 40 if @limit > 40
55
+
56
+ respond_to do |format|
57
+ format.html {
58
+ if params[:details] == 'true'
59
+ render :template => "documents/details", :layout => "default"
60
+ else
61
+ render :template => "documents/show", :layout => "default"
62
+ end
63
+ }# show.html.erb
64
+ format.xml { render :xml => @entry }
65
+ end
66
+ end
67
+
68
+ def track_clicks
69
+ user_agent = request.env['HTTP_USER_AGENT']
70
+ redirect_to Entry.track_click(session, params[:id], request.env['HTTP_REFERER'], params[:target], request.env['HTTP_X_FORWARDED_FOR'], user_agent) if !/Googlebot/.match(user_agent)
71
+ end
72
+
73
+ def collections
74
+ @feeds = Feed.find(:all, :order => "harvested_from_title, title")
75
+ @languages = Language.find(:all, :order => "name")
76
+ render :template => "documents/collections", :layout => "default"
77
+ end
78
+
79
+ end
@@ -0,0 +1,46 @@
1
+ class Recommender::EntriesController < ApplicationController
2
+
3
+ # GET /recommendations
4
+ # GET /recommendations.xml
5
+ def index
6
+ @details = params[:details] == "true"
7
+
8
+ @referrer = request.env['HTTP_REFERER']
9
+ @uri = params[:u] || @referrer
10
+
11
+ if params[:educommons]
12
+ @uri = @uri[%r=http://.*?/.*?/[^/]+=] || @uri
13
+ params[:title] = true
14
+ params[:more_link] = true
15
+ end
16
+
17
+ Entry.track_time_on_page(session, @uri)
18
+ @document = Entry.recommender_entry(@uri)
19
+ I18n.locale = @document.language[0..1] if !@document.nil?
20
+
21
+ @limit = params[:limit] ? params[:limit].to_i : 5
22
+ @limit = 25 if @limit > 25
23
+
24
+ respond_to do |format|
25
+ format.html {
26
+ @languages = Language.find(:all, :order => "name")
27
+ order = params[:order] || "mixed"
28
+ redirect_to "/documents/" + @document.id.to_s + "?limit=" + @limit.to_s + "&order=" + order + "&details=" + @details.to_s if !@document.nil?
29
+ render(:template => '/recommendations/document_not_found.html.erb', :layout => false) if @document.nil?
30
+ }
31
+ format.xml {
32
+ render(:template => '/recommendations/index.xml.builder', :layout => false)
33
+ }
34
+ format.pjs {
35
+ if @document.nil?
36
+ render_text ""
37
+ else
38
+ @host = "http://" + URI.parse(@uri).host
39
+ render(:template => 'recommendations/index.pjs.erb', :layout => false)
40
+ end
41
+ }
42
+ format.rss { render(:template => 'recommendations/index.rss.builder', :layout => false) }
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,82 @@
1
+ class Recommender::SearchController < ApplicationController
2
+
3
+ def initialize
4
+ @limit = 50
5
+ @no_index = true
6
+ end
7
+
8
+ #########################################################
9
+ # Show search page if there is nothing specified to search for
10
+ # or if there are searchable params search for them
11
+ def index
12
+ if request.post?
13
+ if params[:form_terms].nil? or params[:form_terms].empty?
14
+ flash[:message] = 'Please enter something to search for.'
15
+ else
16
+ redirect_to '/search/results?terms=' + URI.escape(params[:form_terms])
17
+ end
18
+ end
19
+ end
20
+
21
+ #########################################################
22
+ # search all fields for the given terms
23
+ def results
24
+ @page_title = "Search"
25
+ @language = params[:locale] || 'en'
26
+ @languages = Language.find(:all, :order => "name")
27
+ @limit = params[:limit] ? params[:limit].to_i : 10
28
+ @limit = 25 if @limit > 25
29
+ @offset = params[:offset] ? params[:offset].to_i : 0
30
+ @term_list = ''
31
+ if !params[:terms].nil? && !params[:terms].empty?
32
+ @term_list += URI.escape(params[:terms])
33
+ end
34
+
35
+ if request.post?
36
+ if params[:form_terms].nil? or params[:form_terms].empty?
37
+ flash[:message] = 'Please enter something to search for.'
38
+ redirect_to '/'
39
+ else
40
+ redirect_to '/search/results?terms=' + URI.escape(params[:form_terms]) + (@language.nil? ? "" : "&locale=" + @language)
41
+ end
42
+ else
43
+ @current_uri = '/search/results'
44
+ if params[:terms]
45
+ @url_terms = '?terms=' + @term_list
46
+ results = Entry.search(URI.unescape(params[:terms]), @language, @limit, @offset)
47
+ @results = results.records
48
+ @hit_count = results.total
49
+ @terms = URI.unescape(params[:terms])
50
+ else
51
+ @url_terms = ''
52
+ @results = []
53
+ @terms = ''
54
+ end
55
+
56
+ respond_to do |format|
57
+ format.html
58
+ format.xml { render :layout=>false }
59
+ format.rss { render :layout=>false }
60
+ format.pjs {
61
+ @json_results = ActiveSupport::JSON.encode(@results)
62
+ render(:template => 'search/results.pjs.erb', :layout => false)
63
+ }
64
+ format.atom { render :layout=>false }
65
+ format.rdf { render :layout=>false }
66
+ end
67
+ end
68
+ end
69
+
70
+ #########################################################
71
+ # all the results are rendered the same
72
+ def render_search
73
+ respond_to do |format|
74
+ format.html { render :template => '/search/index' }
75
+ format.xml { render :xml => flash.to_xml }
76
+ format.rss { render :xml => flash.to_xml }
77
+ format.atom { render :xml => flash.to_xml }
78
+ format.rdf { render :xml => flash.to_xml }
79
+ end
80
+ end
81
+
82
+ end
@@ -0,0 +1,29 @@
1
+ module MuckRakerHelper
2
+
3
+ def tag_cloud(tag_list, classes)
4
+ tag_list.split(',').each_slice(2){|tag,index| yield tag, classes[index.to_i]}
5
+ end
6
+
7
+ def round(flt)
8
+ return (((flt.to_f*100).to_i.round).to_f)/100.0
9
+ end
10
+
11
+ def truncate_on_word(text, length = 270, end_string = ' ...')
12
+ if text.length > length
13
+ stop_index = text.rindex(' ', length)
14
+ stop_index = length - 10 if stop_index < length-10
15
+ text[0,stop_index] + (text.length > 260 ? end_string : '')
16
+ else
17
+ text
18
+ end
19
+ end
20
+
21
+ def truncate_words(text, length = 40, end_string = ' ...')
22
+ words = text.split()
23
+ words[0..(length-1)].join(' ') + (words.length > length ? end_string : '')
24
+ end
25
+
26
+ def feed_query_uri(feed)
27
+ "/search/results?terms=feed_id:" + feed.id.to_s + "&locale=en"
28
+ end
29
+ end
@@ -0,0 +1,2 @@
1
+ class Click < ActiveRecord::Base
2
+ end
@@ -0,0 +1,9 @@
1
+ class CloudCache < ActiveRecord::Base
2
+
3
+ def self.language_tags language
4
+ english_id = 38
5
+ results = CloudCache.find(:all, :conditions => ["language_id = ? AND filter = 'all'", english_id])
6
+ results.empty? ? '' : results[0].tag_list
7
+ end
8
+
9
+ end