prerender_rails_embedded 0.1.1 → 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.
- checksums.yaml +8 -8
- data/README.md +8 -1
- data/lib/prerender_rails_embedded.js +81 -52
- data/prerender_rails_embedded.gemspec +2 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MmQ5YjlhZGVlNThiOTcwZDczNzNlMTRiNmEwMzA1YWFkOTQxNjMzMA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NTFlYzNmOGM2Mzc0MmQxMmM3OTM3NzdmYTAwZDk4NTMwZmMwNmJkNA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YmEyNmE3ZWE3ZWQ4MWM2NTgzN2VmZjljY2IwNjRhNWUyOWUxNGMzMmVhYzZl
|
10
|
+
MTNiMmI2YjE3Zjc5NjE0YmU4MTBjYzAyODM5ZWYyN2Y2NGU5YWNjOTc5ZDY4
|
11
|
+
ZDJlODExMDMyMThmZDY1OTQ2MDEwMTc2YWQ0YmI4ODkyYmU5NTY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YzA3ZTljYWNjNTRhODg4ZDE5MDU1MDc0MWM0NjYyMTllMTgxY2E1MjUwZDBk
|
14
|
+
ZjdhZjE4ZDNmMTgyZGVlMTQyOTI2NjEyYzEyYThjYzlhYWVhN2ZkYjU2NWJk
|
15
|
+
N2RlMzUwMTZjOWI2ZTBiMjQwNzZhYjczODQ3ODRiZTdkMDRhNGU=
|
data/README.md
CHANGED
@@ -38,7 +38,7 @@ To test the correct functioning of the `prerender_rails_embedded` gem just start
|
|
38
38
|
with `rails s` and launch a curl to a (js generated) url like this:
|
39
39
|
|
40
40
|
curl -H "User-Agent: Mozilla/5.0 baiduspider" \
|
41
|
-
"http://localhost:
|
41
|
+
"http://localhost:3000/articles/a0af82a84-d386-4690-9f68-81ac768bc6d3"
|
42
42
|
|
43
43
|
It should show a completely rendered page in standard output.
|
44
44
|
|
@@ -85,6 +85,13 @@ and launch the web server with the command:
|
|
85
85
|
bundle exec unicorn -p 3000 -c ./config/unicorn.rb
|
86
86
|
```
|
87
87
|
|
88
|
+
To test the actual invokation
|
89
|
+
```shell
|
90
|
+
$ curl -H 'User-Agent: baiduspider' https://dev.etalia.net/articles/a6c37930c-a3df-482d-b9e5-b4333473e1ae
|
91
|
+
```
|
92
|
+
|
93
|
+
|
94
|
+
|
88
95
|
### <a id='todos'></a>
|
89
96
|
## TODOs
|
90
97
|
|
@@ -8,46 +8,60 @@ var EVALUATE_JAVASCRIPT_CHECK_TIMEOUT = 50;
|
|
8
8
|
|
9
9
|
var page = require('webpage').create(),
|
10
10
|
system = require('system');
|
11
|
-
|
12
11
|
var surrender = {};
|
12
|
+
page.viewportSize = {
|
13
|
+
width: 1024,
|
14
|
+
height: 800
|
15
|
+
};
|
13
16
|
|
14
17
|
surrender.params = function() {
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
18
|
+
if (system.args.length === 1) {
|
19
|
+
throw 'Usage: googlizer.js <some URL>';
|
20
|
+
}
|
21
|
+
return { address: system.args[1]};
|
19
22
|
};
|
20
23
|
|
24
|
+
|
21
25
|
surrender.javascriptToExecuteOnPage = function() {
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
if (html && html[0]) {
|
36
|
-
return {
|
37
|
-
html: doctype + html[0].outerHTML,
|
38
|
-
shouldWaitForPrerenderReady: typeof window.prerenderReady === 'boolean',
|
39
|
-
prerenderReady: window.prerenderReady
|
40
|
-
};
|
41
|
-
}
|
42
|
-
|
43
|
-
} catch (e) {
|
44
|
-
return {
|
45
|
-
html: '',
|
46
|
-
shouldWaitForPrerenderReady: false,
|
47
|
-
prerenderReady: window.prerenderReady
|
48
|
-
};
|
26
|
+
var processHtml = function() {
|
27
|
+
if (!window.prerenderRailsEmbedded || !window.prerenderRailsEmbedded.filterHtmlOutput || typeof(window.prerenderRailsEmbedded.filterHtmlOutput) !== "function") {
|
28
|
+
return document.documentElement.innerHTML;
|
29
|
+
} else {
|
30
|
+
return window.prerenderRailsEmbedded.filterHtmlOutput.call(this);
|
31
|
+
}
|
32
|
+
}
|
33
|
+
|
34
|
+
try {
|
35
|
+
|
36
|
+
if (!document) {
|
37
|
+
throw 'document is undefined. this function must be called inside page.evaluate ';
|
49
38
|
}
|
39
|
+
var html = processHtml();
|
40
|
+
var doctype = '';
|
50
41
|
|
42
|
+
if(document && document.doctype) {
|
43
|
+
doctype = "<!DOCTYPE "
|
44
|
+
+ document.doctype.name
|
45
|
+
+ (document.doctype.publicId ? ' PUBLIC "' + document.doctype.publicId + '"' : '')
|
46
|
+
+ (!document.doctype.publicId && document.doctype.systemId ? ' SYSTEM' : '')
|
47
|
+
+ (document.doctype.systemId ? ' "' + document.doctype.systemId + '"' : '')
|
48
|
+
+ '>';
|
49
|
+
}
|
50
|
+
|
51
|
+
return {
|
52
|
+
html: doctype + html,
|
53
|
+
shouldWaitForPrerenderReady: typeof window.prerenderReady === 'boolean',
|
54
|
+
prerenderReady: window.prerenderReady
|
55
|
+
};
|
56
|
+
|
57
|
+
} catch (e) {
|
58
|
+
console.log('ERROR: ', e);
|
59
|
+
return {
|
60
|
+
html: '',
|
61
|
+
shouldWaitForPrerenderReady: false,
|
62
|
+
prerenderReady: window.prerenderReady
|
63
|
+
};
|
64
|
+
}
|
51
65
|
};
|
52
66
|
|
53
67
|
surrender.serveHtml = function(html) {
|
@@ -56,31 +70,46 @@ surrender.serveHtml = function(html) {
|
|
56
70
|
};
|
57
71
|
|
58
72
|
surrender.evaluateJavascriptOnPage = function(t) {
|
59
|
-
|
60
|
-
|
73
|
+
var _this = t || this
|
74
|
+
, out = page.evaluate(_this.javascriptToExecuteOnPage);
|
61
75
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
76
|
+
if(!out.shouldWaitForPrerenderReady || (out.shouldWaitForPrerenderReady && out.prerenderReady)) {
|
77
|
+
_this.serveHtml(out.html);
|
78
|
+
} else {
|
79
|
+
setTimeout(function(){_this.evaluateJavascriptOnPage(_this)}, EVALUATE_JAVASCRIPT_CHECK_TIMEOUT);
|
80
|
+
}
|
81
|
+
return _this;
|
68
82
|
};
|
69
83
|
|
70
84
|
surrender.run = function() {
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
85
|
+
try {
|
86
|
+
var _this = this;
|
87
|
+
page.address = this.params().address;
|
88
|
+
page.settings.userAgent = 'EtaliaBotAgent';
|
89
|
+
page.open(page.address, function (st) {
|
90
|
+
if (st !== 'success') throw 'FAIL to load the address';
|
91
|
+
_this.evaluateJavascriptOnPage();
|
92
|
+
});
|
93
|
+
} catch(e) {
|
94
|
+
console.log(e);
|
95
|
+
phantom.exit(1);
|
96
|
+
}
|
97
|
+
|
98
|
+
page.onError = function(msg, trace) {
|
99
|
+
var msgStack = ['ERROR: ' + msg];
|
100
|
+
if (trace && trace.length) {
|
101
|
+
msgStack.push('TRACE:');
|
102
|
+
trace.forEach(function(t) {
|
103
|
+
msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function +'")' : ''));
|
104
|
+
});
|
83
105
|
}
|
106
|
+
console.log(msgStack.join('\n'));
|
107
|
+
};
|
108
|
+
|
109
|
+
page.onConsoleMessage = function(msg, lineNum, sourceId) {
|
110
|
+
console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")');
|
111
|
+
};
|
112
|
+
|
84
113
|
};
|
85
114
|
|
86
115
|
surrender.run();
|
@@ -2,8 +2,8 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = 'prerender_rails_embedded'
|
5
|
-
spec.version = '0.
|
6
|
-
spec.authors = ['Gian Carlo Pace']
|
5
|
+
spec.version = '0.2.0'
|
6
|
+
spec.authors = ['Gian Carlo Pace', 'Luca Mirra']
|
7
7
|
spec.email = %w(giancarlo.pace@etalia.net)
|
8
8
|
spec.description = %q{A plugin for prerender_rails middleware to render JavaScript web app on the fly calling phantomjs directly}
|
9
9
|
spec.summary = %q{Prerender your backbone/angular/javascript rendered application on the fly when search engines crawl}
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prerender_rails_embedded
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gian Carlo Pace
|
8
|
+
- Luca Mirra
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2014-
|
12
|
+
date: 2014-11-14 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: bundler
|
@@ -81,4 +82,3 @@ specification_version: 4
|
|
81
82
|
summary: Prerender your backbone/angular/javascript rendered application on the fly
|
82
83
|
when search engines crawl
|
83
84
|
test_files: []
|
84
|
-
has_rdoc:
|