link_thumbnailer 2.2.3 → 2.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 362e43015d5e30ac6a6979ef894024f7a64946df
4
- data.tar.gz: 3639139383696d799b3d0b568aa796e3e6ff6fd8
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZTlmNDRkNWViMjFlMjY3NzQwNTg5MzYwMWJmN2Q4M2QxMjdjMDJkNA==
5
+ data.tar.gz: !binary |-
6
+ Y2RlMmRlM2UxYmY3YTEyOGJiNWI2MzJjZWY1MDEzYTEzMzc5ZWNiMQ==
5
7
  SHA512:
6
- metadata.gz: d75fd8cada9464fa84837a86f09bbc603aa025bb3f20b5f1917061508b87853360f6a3b913f4740a39ed00c30735fbfcc4298a00987abe1434384d39735d8c69
7
- data.tar.gz: e9124ddc900fb5390248f3ea9def7d0da1b53b6795a30a5d030681c46d8c4aa005f8b1918bca5b2adc8efcd38f07aee98f93936c7b6c25771e98e448f48f9823
8
+ metadata.gz: !binary |-
9
+ ZWM4NjJmZWM5YjAyZDdiYWIzMmQ4YjU5NTcxNmNkNzczNmJjMzhiMzFlZTFm
10
+ YzYzNzk3YzRlZjE3MWM4NzQ0ODYyNjU0ZTk3ODBhNmEwYmFlYjM5N2E0MTMz
11
+ YzNhNjI4ZjY5MzNiNTI4OGQ1NDVmYjEzMzI3OTkxOTUzNzY3ZjA=
12
+ data.tar.gz: !binary |-
13
+ NTE0MThjNzhkNDIwY2UxYmYwMTIwNDE5Y2ZmYWMyMWVmMGI4NjBhODZkMjNi
14
+ YjBhN2RmN2ExMDQ2YTMzMTYyNWE1NDg1MGM3Zjg1NTFhMGYyZjRlZmM0YWI2
15
+ OWI4NDE3M2Q3MjY2ODgyOWRlYzM2ZTZkMzQwZjEyNzEzM2VhOWE=
data/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ # 2.3.0
2
+
3
+ - Add requested favicon scraper [#40](https://github.com/gottfrois/link_thumbnailer/issues/40)
4
+
5
+ Add `:favicon` to `config.attributes` in LinkThumbnailer initializer:
6
+
7
+ ```ruby
8
+ config.attributes = [:title, :images, :description, :videos, :favicon]
9
+ ```
10
+
11
+ Then
12
+
13
+ ```ruby
14
+ o = LinkThumbnailer.generate('https://github.com')
15
+ o.favicon
16
+ => "https://github.com/fluidicon.png"
17
+ ```
18
+
1
19
  # 2.2.3
2
20
 
3
21
  - Fixes [#41](https://github.com/gottfrois/link_thumbnailer/issues/41)
data/README.md CHANGED
@@ -58,6 +58,9 @@ The gem handle regular website but also website that use the [Opengraph](http://
58
58
  object.title
59
59
  => "Stack Overflow"
60
60
 
61
+ object.favicon
62
+ => "//cdn.sstatic.net/stackoverflow/img/favicon.ico?v=038622610830"
63
+
61
64
  object.description
62
65
  => "Q&A for professional and enthusiast programmers"
63
66
 
@@ -108,7 +111,7 @@ In `config/initializers/link_thumbnailer.rb`
108
111
 
109
112
  # List of attributes you want LinkThumbnailer to fetch on a website.
110
113
  #
111
- # config.attributes = [:title, :images, :description, :videos]
114
+ # config.attributes = [:title, :images, :description, :videos, :favicon]
112
115
 
113
116
  # List of procedures used to rate the website description. Add you custom class
114
117
  # here. Note that the order matter to compute the score. See wiki for more details
@@ -31,7 +31,7 @@ LinkThumbnailer.configure do |config|
31
31
 
32
32
  # List of attributes you want LinkThumbnailer to fetch on a website.
33
33
  #
34
- # config.attributes = [:title, :images, :description, :videos]
34
+ # config.attributes = [:title, :images, :description, :videos, :favicon]
35
35
 
36
36
  # List of procedures used to rate the website description. Add you custom class
37
37
  # here. Note that the order matter to compute the score. See wiki for more details
@@ -41,7 +41,7 @@ module LinkThumbnailer
41
41
  %r{^http://pixel\.quantserve\.com/},
42
42
  %r{^http://s7\.addthis\.com/}
43
43
  ]
44
- @attributes = [:title, :images, :description, :videos]
44
+ @attributes = [:title, :images, :description, :videos, :favicon]
45
45
  @graders = [
46
46
  ->(description) { ::LinkThumbnailer::Graders::Length.new(description) },
47
47
  ->(description) { ::LinkThumbnailer::Graders::HtmlAttribute.new(description, :class) },
@@ -0,0 +1,25 @@
1
+ require 'link_thumbnailer/model'
2
+
3
+ module LinkThumbnailer
4
+ module Models
5
+ class Favicon < ::LinkThumbnailer::Model
6
+
7
+ attr_reader :uri
8
+
9
+ def initialize(uri)
10
+ @uri = uri
11
+ end
12
+
13
+ def to_s
14
+ uri.to_s
15
+ end
16
+
17
+ def as_json(*)
18
+ {
19
+ src: to_s
20
+ }
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -4,7 +4,7 @@ module LinkThumbnailer
4
4
  module Models
5
5
  class Website < ::LinkThumbnailer::Model
6
6
 
7
- attr_accessor :url, :title, :description, :images, :videos
7
+ attr_accessor :url, :title, :description, :images, :videos, :favicon
8
8
 
9
9
  def initialize
10
10
  @images = []
@@ -39,6 +39,7 @@ module LinkThumbnailer
39
39
  def as_json(*)
40
40
  {
41
41
  url: url.to_s,
42
+ favicon: favicon,
42
43
  title: title,
43
44
  description: description,
44
45
  images: images,
@@ -12,6 +12,8 @@ require 'link_thumbnailer/scrapers/default/images'
12
12
  require 'link_thumbnailer/scrapers/opengraph/images'
13
13
  require 'link_thumbnailer/scrapers/default/videos'
14
14
  require 'link_thumbnailer/scrapers/opengraph/videos'
15
+ require 'link_thumbnailer/scrapers/default/favicon'
16
+ require 'link_thumbnailer/scrapers/opengraph/favicon'
15
17
 
16
18
  module LinkThumbnailer
17
19
  class Scraper < ::SimpleDelegator
@@ -0,0 +1,36 @@
1
+ require 'link_thumbnailer/scrapers/default/base'
2
+ require 'link_thumbnailer/models/favicon'
3
+
4
+ module LinkThumbnailer
5
+ module Scrapers
6
+ module Default
7
+ class Favicon < ::LinkThumbnailer::Scrapers::Default::Base
8
+
9
+ def value
10
+ modelize(to_uri(href)).to_s
11
+ end
12
+
13
+ private
14
+
15
+ def to_uri(href)
16
+ ::URI.parse(href)
17
+ rescue ::URI::InvalidURIError
18
+ nil
19
+ end
20
+
21
+ def href
22
+ node.attributes['href'].value.to_s if node
23
+ end
24
+
25
+ def node
26
+ document.xpath("//link[contains(@rel, 'icon')]").first
27
+ end
28
+
29
+ def modelize(uri)
30
+ model_class.new(uri)
31
+ end
32
+
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,15 @@
1
+ require 'link_thumbnailer/scrapers/opengraph/base'
2
+
3
+ module LinkThumbnailer
4
+ module Scrapers
5
+ module Opengraph
6
+ class Favicon < ::LinkThumbnailer::Scrapers::Opengraph::Base
7
+
8
+ def value
9
+ nil
10
+ end
11
+
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,3 +1,3 @@
1
1
  module LinkThumbnailer
2
- VERSION = '2.2.3'
2
+ VERSION = '2.3.0'
3
3
  end
@@ -9,7 +9,7 @@ describe LinkThumbnailer::Configuration do
9
9
  it { expect(instance.verify_ssl).to eq(true) }
10
10
  it { expect(instance.http_timeout).to eq(5) }
11
11
  it { expect(instance.blacklist_urls).to_not be_empty }
12
- it { expect(instance.attributes).to eq([:title, :images, :description, :videos]) }
12
+ it { expect(instance.attributes).to eq([:title, :images, :description, :videos, :favicon]) }
13
13
  it { expect(instance.graders).to_not be_empty }
14
14
  it { expect(instance.description_min_length).to eq(25) }
15
15
  it { expect(instance.positive_regex).to_not be_nil }
data/spec/fixture_spec.rb CHANGED
@@ -5,6 +5,7 @@ describe 'Fixture' do
5
5
  let(:url) { 'http://foo.com' }
6
6
  let(:png_url) { 'http://foo.com/foo.png' }
7
7
  let(:video_url) { 'http://foo.com/foo.swf' }
8
+ let(:favicon) { 'http://foo.com/foo.ico' }
8
9
  let(:png) { File.open(File.dirname(__FILE__) + '/fixtures/foo.png') }
9
10
  let(:action) { LinkThumbnailer.generate(url) }
10
11
 
@@ -22,6 +23,7 @@ describe 'Fixture' do
22
23
 
23
24
  let(:html) { File.open(File.dirname(__FILE__) + '/fixtures/og_valid_example.html').read() }
24
25
 
26
+ it { expect(action.favicon).to eq(favicon) }
25
27
  it { expect(action.title).to eq(title) }
26
28
  it { expect(action.description).to eq(description) }
27
29
  it { expect(action.images.count).to eq(1) }
@@ -42,6 +44,7 @@ describe 'Fixture' do
42
44
  stub_request(:get, png_url_2).to_return(status: 200, body: png_2, headers: {})
43
45
  end
44
46
 
47
+ it { expect(action.favicon).to eq('') }
45
48
  it { expect(action.title).to eq(title) }
46
49
  it { expect(action.description).to eq(description) }
47
50
  it { expect(action.images.count).to eq(2) }
@@ -55,6 +58,7 @@ describe 'Fixture' do
55
58
  let(:video_url_2) { 'http://foo.com/bar.swf' }
56
59
  let(:html) { File.open(File.dirname(__FILE__) + '/fixtures/og_valid_multi_video_example.html').read() }
57
60
 
61
+ it { expect(action.favicon).to eq('') }
58
62
  it { expect(action.title).to eq(title) }
59
63
  it { expect(action.description).to eq(description) }
60
64
  it { expect(action.videos.count).to eq(2) }
@@ -84,6 +88,7 @@ describe 'Fixture' do
84
88
  let(:title) { 'Title from meta' }
85
89
  let(:description) { 'Description from meta' }
86
90
 
91
+ it { expect(action.favicon).to eq(favicon) }
87
92
  it { expect(action.title).to eq(title) }
88
93
  it { expect(action.description).to eq(description) }
89
94
 
@@ -94,6 +99,7 @@ describe 'Fixture' do
94
99
  let(:html) { File.open(File.dirname(__FILE__) + '/fixtures/default_from_body.html').read() }
95
100
  let(:description) { 'Description from body' }
96
101
 
102
+ it { expect(action.favicon).to eq(favicon) }
97
103
  it { expect(action.description).to eq(description) }
98
104
  it { expect(action.images.count).to eq(1) }
99
105
  it { expect(action.images.first.src.to_s).to eq(png_url) }
@@ -1,6 +1,7 @@
1
1
  <html>
2
2
  <head>
3
3
  <title>Title from meta</title>
4
+ <link rel="shortcut icon" href="http://foo.com/foo.ico">
4
5
  </head>
5
6
  <body>
6
7
 
@@ -2,6 +2,7 @@
2
2
  <head>
3
3
  <title>Title from meta</title>
4
4
  <meta content="Description from meta" name="description">
5
+ <link rel="icon whatever" href="http://foo.com/foo.ico">
5
6
  </head>
6
7
  <body>
7
8
 
@@ -9,6 +9,7 @@
9
9
  <meta property="og:image:width" content="100">
10
10
  <meta property="og:image:height" content="100">
11
11
  <meta property="og:video" content="http://foo.com/foo.swf">
12
+ <link rel="icon" href="http://foo.com/foo.ico">
12
13
  <title>Title</title>
13
14
  </head>
14
15
 
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe LinkThumbnailer::Models::Favicon do
4
+
5
+ let(:uri) { URI.parse('http://foo.com') }
6
+ let(:instance) { described_class.new(uri) }
7
+
8
+ it { expect(instance.to_s).to eq('http://foo.com') }
9
+
10
+ end
metadata CHANGED
@@ -1,34 +1,34 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: link_thumbnailer
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.3
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pierre-Louis Gottfrois
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-19 00:00:00.000000000 Z
11
+ date: 2014-09-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ! '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '3.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ! '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: json
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ! '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.7.7
34
34
  - - ~>
@@ -38,7 +38,7 @@ dependencies:
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
- - - '>='
41
+ - - ! '>='
42
42
  - !ruby/object:Gem::Version
43
43
  version: 1.7.7
44
44
  - - ~>
@@ -48,14 +48,14 @@ dependencies:
48
48
  name: rake
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - '>='
51
+ - - ! '>='
52
52
  - !ruby/object:Gem::Version
53
53
  version: '0.9'
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - '>='
58
+ - - ! '>='
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0.9'
61
61
  - !ruby/object:Gem::Dependency
@@ -149,6 +149,7 @@ files:
149
149
  - lib/link_thumbnailer/image_validator.rb
150
150
  - lib/link_thumbnailer/model.rb
151
151
  - lib/link_thumbnailer/models/description.rb
152
+ - lib/link_thumbnailer/models/favicon.rb
152
153
  - lib/link_thumbnailer/models/image.rb
153
154
  - lib/link_thumbnailer/models/title.rb
154
155
  - lib/link_thumbnailer/models/video.rb
@@ -161,11 +162,13 @@ files:
161
162
  - lib/link_thumbnailer/scrapers/base.rb
162
163
  - lib/link_thumbnailer/scrapers/default/base.rb
163
164
  - lib/link_thumbnailer/scrapers/default/description.rb
165
+ - lib/link_thumbnailer/scrapers/default/favicon.rb
164
166
  - lib/link_thumbnailer/scrapers/default/images.rb
165
167
  - lib/link_thumbnailer/scrapers/default/title.rb
166
168
  - lib/link_thumbnailer/scrapers/default/videos.rb
167
169
  - lib/link_thumbnailer/scrapers/opengraph/base.rb
168
170
  - lib/link_thumbnailer/scrapers/opengraph/description.rb
171
+ - lib/link_thumbnailer/scrapers/opengraph/favicon.rb
169
172
  - lib/link_thumbnailer/scrapers/opengraph/image.rb
170
173
  - lib/link_thumbnailer/scrapers/opengraph/images.rb
171
174
  - lib/link_thumbnailer/scrapers/opengraph/title.rb
@@ -175,12 +178,10 @@ files:
175
178
  - lib/link_thumbnailer/video_parser.rb
176
179
  - link_thumbnailer.gemspec
177
180
  - spec/configuration_spec.rb
178
- - spec/examples/empty_og_image_example.html
179
181
  - spec/fixture_spec.rb
180
182
  - spec/fixtures/bar.png
181
183
  - spec/fixtures/default_from_body.html
182
184
  - spec/fixtures/default_from_meta.html
183
- - spec/fixtures/example.html
184
185
  - spec/fixtures/foo.png
185
186
  - spec/fixtures/og_not_valid_example.html
186
187
  - spec/fixtures/og_valid_example.html
@@ -197,6 +198,7 @@ files:
197
198
  - spec/image_validator_spec.rb
198
199
  - spec/model_spec.rb
199
200
  - spec/models/description_spec.rb
201
+ - spec/models/favicon_spec.rb
200
202
  - spec/models/image_spec.rb
201
203
  - spec/models/title_spec.rb
202
204
  - spec/models/video_spec.rb
@@ -217,12 +219,12 @@ require_paths:
217
219
  - lib
218
220
  required_ruby_version: !ruby/object:Gem::Requirement
219
221
  requirements:
220
- - - '>='
222
+ - - ! '>='
221
223
  - !ruby/object:Gem::Version
222
224
  version: '0'
223
225
  required_rubygems_version: !ruby/object:Gem::Requirement
224
226
  requirements:
225
- - - '>='
227
+ - - ! '>='
226
228
  - !ruby/object:Gem::Version
227
229
  version: '0'
228
230
  requirements: []
@@ -234,12 +236,10 @@ summary: Ruby gem ranking images from a given URL returning an object containing
234
236
  and website informations.
235
237
  test_files:
236
238
  - spec/configuration_spec.rb
237
- - spec/examples/empty_og_image_example.html
238
239
  - spec/fixture_spec.rb
239
240
  - spec/fixtures/bar.png
240
241
  - spec/fixtures/default_from_body.html
241
242
  - spec/fixtures/default_from_meta.html
242
- - spec/fixtures/example.html
243
243
  - spec/fixtures/foo.png
244
244
  - spec/fixtures/og_not_valid_example.html
245
245
  - spec/fixtures/og_valid_example.html
@@ -256,6 +256,7 @@ test_files:
256
256
  - spec/image_validator_spec.rb
257
257
  - spec/model_spec.rb
258
258
  - spec/models/description_spec.rb
259
+ - spec/models/favicon_spec.rb
259
260
  - spec/models/image_spec.rb
260
261
  - spec/models/title_spec.rb
261
262
  - spec/models/video_spec.rb
@@ -1,9 +0,0 @@
1
- <html xmlns:og="http://opengraphprotocol.org/schema/">
2
- <head>
3
- <meta charset="utf-8"/>
4
- <meta property="og:title" content="Foo Title">
5
- <meta property="og:image" content="">
6
- <title>Foo</title>
7
- </head>
8
-
9
- </html>
@@ -1,363 +0,0 @@
1
- <!DOCTYPE html>
2
- <!-- saved from url=(0019)http://www.foo.com/ -->
3
- <html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4
- <meta charset="UTF-8">
5
- <title>Title</title>
6
- <link href="./example_files/style-3706572431311a3a4cf5c6f3266c9bce.css" media="all" rel="stylesheet" type="text/css">
7
- <link href="./example_files/belt_layout1_google-1c8ee8bd905a6121e7a7ac73b7ffb888.css" media="all" rel="stylesheet" type="text/css">
8
- <script src="./example_files/application-e8b3208729190cb9cc8a800ff3283fd8.js" type="text/javascript"></script>
9
- <link href="./example_files/load_style.css" media="all" rel="stylesheet" type="text/css">
10
- <meta content="authenticity_token" name="csrf-param">
11
- <meta content="Mh9Ervhd7HlDNhhJdZ+nKec9RE0sn2FO8nyJXUrKUng=" name="csrf-token">
12
- </head>
13
- <body>
14
-
15
-
16
- <style>
17
- .listing .sitelinks{
18
- padding:5px 15px;
19
- }
20
-
21
- .listing .sitelinks td{
22
- padding-right:16px;
23
-
24
- }
25
- .listing .sitelinks a, .listing .ratings a{
26
- color:#0000DE;
27
- }
28
- .listing .url a:hover{
29
- color:#a02934;
30
- }
31
- .ratings{
32
- color: #666666;
33
- }
34
- .listing{
35
- margin-bottom:15px;
36
- }
37
- .listing .url {
38
- font-size:16px;
39
- }
40
- .listing .host {
41
- color:#a02934;
42
- display:block;
43
- font-size:16px;
44
- text-decoration:none;
45
- }
46
-
47
- .listing .url a{
48
- color:#0000DE;
49
- line-height:auto;
50
- }
51
- .listing .description a{
52
- text-decoration:none;
53
- color:black;
54
- font-size:16px;
55
- line-height:12pt;
56
- }
57
- .listing .host a{
58
- text-decoration:none;
59
- color:#008000;
60
- font-size:16px;
61
- line-height:12pt;
62
- }
63
- </style>
64
- <script src="./example_files/jquery-1.5.js"></script>
65
- <script>
66
- var google_about_url = '';
67
- var ads_array = new Array();
68
- var bottom_ads_array = new Array();
69
- var webSearch = "";
70
- var google_tag = "";
71
-
72
- var genCatSearches_array=new Array();
73
- var relatedSearches_array=new Array();
74
- var popularCategories_array = new Array();
75
- var digi_keyword_links_array = new Array();
76
- var global_afd_response = "";
77
-
78
- var call_num = 1;
79
- function redirect(){
80
- document.getElementById('results').innerHTML = "No results found";
81
- }
82
-
83
- function jscript_log(name, severity, message, page){
84
- $.ajax({
85
- type: "POST",
86
- url: "/log_error",
87
- data: {
88
- name: name,
89
- severity: severity,
90
- domain: window.location.hostname,
91
- message: message,
92
- tag: google_tag,
93
- page: page
94
- },
95
- context: document.body
96
- })
97
- }
98
-
99
- function token_link(keyword){
100
- window.location = '/results' + '?q=' + encodeURIComponent(keyword) + '&token=' + global_afd_response.token;
101
- return false;
102
- }
103
-
104
- function link_to_google(){
105
- if(google_about_url!=''){
106
- window.open(google_about_url,'_blank');
107
- }
108
- }
109
-
110
- function gadlink(ga, inner_text, visible_url){
111
- visible_url = visible_url.replace(/<b>/gi,'')
112
- visible_url = visible_url.replace(/<\/b>/gi,'')
113
- return '<a ' +
114
- 'href="http://' + visible_url + '"' +
115
- ' onclick="window.open(\'' + ga.url + '\');return false;"' +
116
- ' target="_blank" ' +
117
- '>' +
118
- inner_text + '</a>';
119
-
120
- }
121
-
122
- function google_afd_ad_request_done(google_afd_response) {
123
- if(google_afd_response.faillisted==true){
124
- jscript_log('faillisted', 10, JSON.stringify(google_afd_response), "/")
125
- }
126
- if(google_afd_response.token || google_afd_response.ads){
127
-
128
- global_afd_response = google_afd_response;
129
- if(google_afd_response.feedback_url){
130
- google_about_url = google_afd_response.feedback_url;
131
- }
132
-
133
- if (google_afd_response.ads && google_afd_response.ads.length > 0) {
134
- var google_ads = google_afd_response.ads;
135
- for (var i = 0; i < google_ads.length; i++) {
136
- seller_ratings = google_ads[i].seller_ratings;
137
- site_links = google_ads[i].sitelinks;
138
- ads="";
139
- ads +=
140
- '<div class="listing"><div class="url">' +
141
- gadlink(google_ads[i], google_ads[i].line1, google_ads[i].visible_url) +
142
- '</div>';
143
- if (seller_ratings) {
144
- ads += '<div class="ratings">'+seller_ratings.advertiser_info+' <img src="/assets/'+seller_ratings.rating+'star.gif" border="0"> <a href="'+seller_ratings.source_url+'" target="_blank">('+seller_ratings.review_count+')</a></div>';
145
- }
146
- ads +=
147
- '<div class="description">' + google_ads[i].line2 + ' ' +
148
- (google_ads[i].line3 != undefined ? google_ads[i].line3 + '' : '') +
149
- '</div>' +
150
- '<div class="host">' +
151
- gadlink(google_ads[i], google_ads[i].visible_url, google_ads[i].visible_url) +
152
- '</div>';
153
- if (site_links && site_links.length > 0) {
154
- ads += '<table class="sitelinks" cellpadding=0 cellspacing=0 border=0>';
155
- for (var x = 0; x < site_links.length; x++) {
156
- if(x % 2 == 0){
157
- ads += '<tr>';
158
- }
159
- ads +=
160
- '<td class="sitelink">' +
161
- gadlink(site_links[x], site_links[x].link_text, google_ads[i].visible_url) +
162
- '</td>';
163
- if(x % 2 == 1){
164
- ads += '</tr>';
165
- }
166
- }
167
- if(x % 2 == 0){
168
- ads += '</tr>';
169
- }
170
- ads += '</table>';
171
- }
172
-
173
- ads += '</div>';
174
- if(google_ads[i].position=="Top"){
175
- ads_array.push(ads);
176
- }else{
177
- bottom_ads_array.push(ads);
178
- }
179
- }
180
- }
181
-
182
- if (google_afd_response.categories && google_afd_response.categories.length > 0) {
183
- var google_categories = google_afd_response.categories;
184
- for (var i = 0; i < google_categories.length; i++) {
185
- subcats = google_categories[i].subcategories;
186
- popularCategories =
187
- '<div class="termgroup">' +
188
- '<h3><a class="popular_category" ' +
189
- 'href="/#' + google_categories[i].term + '"' +
190
- ' onclick="window.location=\'/results' +
191
- '?q=' + encodeURIComponent(google_categories[i].term) +
192
- '&token=' + google_categories[i].token + '\';return false;"' +
193
- '>' +
194
- google_categories[i].term +
195
- '</a></h3>';
196
- for(var gci =0; gci < subcats.length; gci++){
197
- popularCategories = popularCategories +
198
- '<div class="term">' +
199
- '<a class="popular_category" ' +
200
- 'href="/#' + subcats[gci].term + '"' +
201
- ' onclick="window.location=\'/results' +
202
- '?q=' + encodeURIComponent(subcats[gci].term) +
203
- '&token=' + subcats[gci].token + '\';return false;"' +
204
- '>' +
205
- subcats[gci].term +
206
- '</a></div>';
207
- }
208
- popularCategories = popularCategories + '</div>';
209
- popularCategories_array.push(popularCategories);
210
- }
211
- }
212
-
213
- if (google_afd_response.link_units && google_afd_response.link_units.length > 0) {
214
- var google_link_units = google_afd_response.link_units;
215
- for (var i = 0; i < google_link_units.length; i++) {
216
- relatedSearches =
217
- '<div class="term">' +
218
- '<a class="related_searches" ' +
219
- 'href="/#' + google_link_units[i].term + '"' +
220
- ' onclick="window.location=\'/results' +
221
- '?q=' + encodeURIComponent(google_link_units[i].term) +
222
- '&token=' + google_link_units[i].token + '\';return false;"' +
223
- '>' +
224
- google_link_units[i].term +
225
- '</a>' +
226
- '</div>';
227
- relatedSearches_array.push(relatedSearches);
228
- }
229
-
230
- }
231
- if (google_afd_response.link_units && google_afd_response.link_units.length > 0) {
232
- var google_link_units = google_afd_response.link_units;
233
- for (var i = 0; i < google_link_units.length; i++) {
234
- relatedSearches = "";
235
- if(i % 5 == 0){
236
- relatedSearches += "<div class='termgroup'>";
237
- }
238
- relatedSearches +=
239
- '<div class="term">' +
240
- '<a class="related_searches" ' +
241
- 'href="/#' + google_link_units[i].term + '"' +
242
- ' onclick="window.location=\'/results' +
243
- '?q=' + encodeURIComponent(google_link_units[i].term) +
244
- '&token=' + google_link_units[i].token + '\';return false;"' +
245
- '>' +
246
- google_link_units[i].term +
247
- '</a>' +
248
- '</div>';
249
- if(((i % 5) == 4) || ((i-1)==google_link_units.length)){
250
- relatedSearches += "</div>";
251
- }
252
- if(((i+1) % 10 == 0)){
253
- relatedSearches += "<div class='clear'>&nbsp;</div>";
254
- }
255
- genCatSearches_array.push(relatedSearches);
256
- }
257
-
258
- }
259
- try{document.getElementById('results').innerHTML = ads_array.join("\n");}catch(error){}
260
- try{document.getElementById('bottomresults').innerHTML = bottom_ads_array.join("\n");}catch(error){}
261
-
262
- if(ads_array.length>1){
263
- document.getElementById('sponsoredresults').style.display='block';
264
- }
265
- if(bottom_ads_array.length>1){
266
- document.getElementById('bottomsponsoredresults').style.display='block';
267
- }
268
-
269
- try{document.getElementById('keywords').innerHTML = relatedSearches_array.join("\n");}catch(error){}
270
- try{document.getElementById('gencats').innerHTML = genCatSearches_array.join("\n");}catch(error){}
271
- // if(genCatSearches_array.length==0){
272
- // try{
273
- // document.getElementById('gencats').innerHTML = popularCategories_array.join("\n");
274
- // }catch(error){}
275
- // }
276
- try{document.getElementById('popcats').innerHTML = popularCategories_array.join("\n");}catch(error){}
277
- try{document.getElementById('token').value = google_afd_response.search_token;}catch(error){}
278
- console.log(google_afd_response);
279
- try{document.getElementById('token2').value = google_afd_response.search_token;}catch(error){}
280
- }
281
- }
282
-
283
- function getParam(name) {
284
- var match = new RegExp('[\?&]' + name + "=([^&]+)","i").exec(location.search);
285
- if (match==null) return null;
286
- else return decodeURIComponent(match[1]).replace(/\+/g,' ');
287
- }
288
- </script>
289
-
290
-
291
-
292
- <center>
293
- <div id="container">
294
- <div id="header">
295
- <div class="logo">
296
- <a href="./example_files/example.html">Foo.com</a>
297
- </div>
298
- </div>
299
-
300
-
301
-
302
-
303
-
304
-
305
-
306
- <div id="main">
307
- <div class="image">
308
- <img alt="Cordovabeach" border="0" src="./example_files/cordovabeach.jpg">
309
- </div>
310
- <div class="search">
311
- <div class="catch_phrase">
312
- <div id="wysiwyg_id_322" class="mercury-region" data-type="editable">Search FOO.com
313
- </div>
314
- </div>
315
- <div id="search">
316
- <form action="http://www.foo.com/results" method="/get">
317
- <input class="search_field" name="q" type="text">
318
- <input id="token" name="token" type="hidden" value="AG06ipADDhq1IogUPtnbN7KiSVdr6HlXngoTCITm8PO41bICFSENtAodnwEA0RgDIAA4AUCwAlCUjqIBUIO6sAhQ4a65DlDN_pgPUOK53A9Qqo3jD1C1q_YPUM3B_g9QivCIEVCU-qcTUIfrhBtQx4yNHVCsxv8eUPD02SBQ1PXZIFDd2ZEhUIOcrSlQu5ytKVDSsa0pUPKxrSlQ3KCvKVCTnKYtULKU5y1QsKX8U1CTtJSVAVDL74OWAVDqp6KyAVCslfPAAVC6lfPAAVCOl_PAAVCYrMGbA1DlhNOdA2iUjqIBcQL5qk1K1hZJggETCOW09_O41bICFfILtAodzTkAq5EBp8Lq2utL_VI">
319
- <input class="search_button" type="submit" value="Search">
320
- </form>
321
- </div>
322
-
323
- </div>
324
- </div>
325
-
326
- <div id="footer">
327
- <a href="http://www.foo.com/digimedia_privacy_policy.html" target="_blank">Privacy Policy</a>
328
- -
329
- © 2012 Digimedia.com, L.P.
330
- </div>
331
-
332
- </div>
333
- </center>
334
- <script type="text/javascript">
335
- var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
336
- document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
337
- </script><script src="./example_files/ga.js" type="text/javascript"></script>
338
- <script type="text/javascript">
339
- var pageTracker = _gat._getTracker('UA-1726084-83');
340
- pageTracker._initData();
341
- pageTracker._setDomainName('foo.com');
342
- pageTracker._trackPageview('/');
343
- </script>
344
-
345
- <script>
346
- google_tag = 'dp-digimedia_js';
347
- var google_afd_request = {
348
- client: 'ca-dp-digimedia-rs_js',
349
- domain_name: 'www.foo.com',
350
- num_ads: 0,
351
- num_radlinks: 10,
352
- token: getParam('token'),
353
- q: getParam('q'),
354
- kw: 'foo',
355
- channel: 'afsonly'
356
- }
357
- </script>
358
- <script language="JavaScript" src="./example_files/show_afd_ads.js" type="text/javascript"></script><script src="./example_files/domainpark.cgi"></script>
359
-
360
-
361
-
362
-
363
- </body></html>