oldskool-gcse 0.0.1

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.
@@ -0,0 +1,100 @@
1
+ module Oldskool
2
+ class GCSE
3
+ attr_reader :querytime
4
+
5
+ include HTTParty
6
+
7
+ def initialize(apikey, cx, apiurl='https://www.googleapis.com/customsearch/v1')
8
+ @cx = cx
9
+ @apikey = apikey
10
+ @api = apiurl
11
+ @lastresult = nil
12
+ @querytime = 0
13
+ @error = nil
14
+ end
15
+
16
+ def search(q, args={})
17
+ args[:start] = (args.delete(:page) * 10 + 1) if args[:page]
18
+
19
+ start = Time.now
20
+ @lastresult = self.class.get(@api, :query => {:q => q, :key => @apikey, :cx => @cx}.merge(args))
21
+
22
+ @querytime = Time.now - start
23
+
24
+ if @lastresult["error"]
25
+ @error = @lastresult["error"]["message"]
26
+ else
27
+ @error = nil
28
+ end
29
+
30
+ self
31
+ end
32
+
33
+ # Array of search results
34
+ def items
35
+ @lastresult["items"]
36
+ end
37
+
38
+ def total
39
+ Integer(@lastresult["queries"]["request"].first["totalResults"])
40
+ end
41
+
42
+ # Custom Search Engine title
43
+ def title
44
+ @lastresult["context"]["title"]
45
+ end
46
+
47
+ # number of total results found in the search
48
+ def total_results
49
+ @lastresults["request"]["totalResults"]
50
+ end
51
+
52
+ def has_previous?
53
+ !!@lastresult["queries"]["previousPage"]
54
+ end
55
+
56
+ def has_next?
57
+ !!@lastresult["queries"]["nextPage"]
58
+ end
59
+
60
+ def next_start
61
+ if has_next?
62
+ return @lastresult["queries"]["nextPage"].first["startIndex"]
63
+ end
64
+ end
65
+
66
+ def previous_start
67
+ if has_previous?
68
+ return @lastresult["queries"]["previousPage"].first["startIndex"]
69
+ end
70
+ end
71
+
72
+ # do search for the previous results
73
+ def previous
74
+ if (r = @lastresult["queries"]["previousPage"])
75
+ return search_by_query_hash(r.first)
76
+ else
77
+ return nil
78
+ end
79
+ end
80
+
81
+ # do a search for the next results
82
+ def next
83
+ if (r = @lastresult["queries"]["nextPage"])
84
+ @previous = @lastresult.clone
85
+
86
+ return search_by_query_hash(r.first)
87
+ else
88
+ return nil
89
+ end
90
+ end
91
+
92
+ def search_by_query_hash(query)
93
+ if query["startIndex"]
94
+ return search(query["searchTerms"], {:start => query["startIndex"]})
95
+ else
96
+ return search(query["searchTerms"])
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,32 @@
1
+ module Oldskool
2
+ class GcseHandler
3
+ include Utils
4
+
5
+ def initialize(params, keyword, config)
6
+ @params = params
7
+ @keyword = keyword
8
+ @config = config
9
+ self
10
+ end
11
+
12
+ def handle_request(keyword, query)
13
+ gcse = GCSE.new(@config[:google_api_key], @keyword[:cx])
14
+
15
+ if @params["page"]
16
+ @params["page"] = Integer(@params["page"])
17
+ else
18
+ @params["page"] = 1
19
+ end
20
+
21
+ args = {:start => ((@params["page"] - 1) * 10 + 1)}
22
+
23
+ gcse.search @params[:q], args
24
+
25
+ sidemenu = [{:title => "Google", :url => "http://google.com/search?q=%s" % [ escape_html((query || keyword)) ]},
26
+ {:title => "Images", :url => "http://google.com/search?q=%s&tbm=isch" % [escape_html query]},
27
+ {:title => "Videos", :url => "http://google.com/search?q=%s&tbm=vid" % [ escape_html query ]} ]
28
+
29
+ {:template => plugin_template(:gcse, __FILE__), :gcse => gcse, :sidemenu => sidemenu}
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,2 @@
1
+ require 'oldskool/gcse'
2
+ require 'oldskool/gcse_handler'
data/views/gcse.erb ADDED
@@ -0,0 +1,59 @@
1
+ <% unless @error %>
2
+ <style type="text/css">
3
+ .gcse_results {
4
+ margin-left: auto;
5
+ margin-right: auto;
6
+ width: 100%;
7
+ background-color:#b0e0e6;
8
+ }
9
+
10
+ .gcse_stats {
11
+ font-size: 75%;
12
+ }
13
+
14
+ .gcse_result {
15
+ padding-bottom: 20px;
16
+ }
17
+
18
+ .gcse_linktext {
19
+ color: green;
20
+ font-size: 80%;
21
+ }
22
+ </style>
23
+ <% if @result[:gcse].items %>
24
+ <div class="gcse_results">
25
+ <% @result[:gcse].items.each do |item| %>
26
+ <div class="gcse_result">
27
+ <div class="gcse_title"><a href="<%= item["link"] %>"><%= item["htmlTitle"] %></a></div>
28
+ <div class="gcse_snippet"><%= item["htmlSnippet"] %></div>
29
+ <div class="gcse_linktext"><%= item["link"] %></div>
30
+ </div>
31
+ <% end %>
32
+ <div class="gcse_stats"><%= @result[:gcse].total %> items found in <%= @result[:gcse].querytime %> seconds</div>
33
+ </div>
34
+ <div class="pagination">
35
+ <ul>
36
+ <% if @result[:gcse].has_previous? %>
37
+ <li class="prev"><a href="/do?q=<%= @params["q"] %>&page=<%= @params[:page] - 1 %>">&larr; Previous</a></li>
38
+ <% else %>
39
+ <li class="prev disabled"><a href="#">&larr; Previous</a></li>
40
+ <% end %>
41
+ <% (1..10).each do |i| %>
42
+ <% break if (i * 10) >= @result[:gcse].total %>
43
+ <% if @params[:page] == i %>
44
+ <li class="active"><a href="/do?q=<%= @params["q"] %>&page=<%= i %>"><%= i %></a></li>
45
+ <% else %>
46
+ <li><a href="/do?q=<%= @params["q"] %>&page=<%= i %>"><%= i %></a></li>
47
+ <% end %>
48
+ <% end %>
49
+ <% if @result[:gcse].has_next? %>
50
+ <li class="next"><a href="/do?q=<%= @params["q"] %>&page=<%= @params[:page] + 1 %>">Next &rarr;</a></li>
51
+ <% else %>
52
+ <li class="next disabled"><a href="#">Next &rarr;</a></li>
53
+ <% end %>
54
+ </ul>
55
+ </div>
56
+ <% else %>
57
+ No results found, daily API limit might have been reached
58
+ <% end %>
59
+ <% end %>
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: oldskool-gcse
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - R.I.Pienaar
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-01-14 00:00:00 +00:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: httparty
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ description: "description: Google Custom Search plugin for Oldskool"
36
+ email: rip@devco.net
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files: []
42
+
43
+ files:
44
+ - lib/oldskool/gcse.rb
45
+ - lib/oldskool/gcse_handler.rb
46
+ - lib/oldskool-gcse.rb
47
+ - views/gcse.erb
48
+ has_rdoc: true
49
+ homepage: http://devco.net/
50
+ licenses: []
51
+
52
+ post_install_message:
53
+ rdoc_options: []
54
+
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ hash: 3
63
+ segments:
64
+ - 0
65
+ version: "0"
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ hash: 3
72
+ segments:
73
+ - 0
74
+ version: "0"
75
+ requirements: []
76
+
77
+ rubyforge_project:
78
+ rubygems_version: 1.3.7
79
+ signing_key:
80
+ specification_version: 3
81
+ summary: oldskool-gcse
82
+ test_files: []
83
+