staticizer 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +16 -2
- data/Rakefile +6 -0
- data/lib/staticizer/crawler.rb +16 -5
- data/lib/staticizer/version.rb +1 -1
- data/staticizer.gemspec +1 -0
- data/tests/crawler_test.rb +75 -10
- data/tests/fake_page.html +288 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e22029f2f0736aeb3c0afa3ea89350ff230197d
|
4
|
+
data.tar.gz: e9989b561397f19d8ccb0dd01f70ab358fd7c8ec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2025749d7cdfa4963fde14b5fdbe82a25779486db1c9aa597eecd73d1309336dbd8ed0a2b8a42c3388804546900fa6c6ee96ef8305813fd665730727eb5fcbd4
|
7
|
+
data.tar.gz: e64a229031fbf15b0b85f0547ea803f67549b237b4d668244c9cad6feee5e52b200b33c032d5784bfb65ab302bffb212ebc997f2c68343fbc570591187216fa3
|
data/README.md
CHANGED
@@ -18,6 +18,20 @@ We wanted the site uploaded to S3 to respond to the *exact* same URLs (where pos
|
|
18
18
|
the existing site. This way when the site goes down incoming links from Google search
|
19
19
|
results etc. will still work.
|
20
20
|
|
21
|
+
## TODO
|
22
|
+
|
23
|
+
* Abillity to specify AWS credentials via file or environment options
|
24
|
+
* Tests!
|
25
|
+
* Decide what to do with URLs with query strings. Currently they are crawled and uploaded to S3, but those keys cannot be accessed. ex http://squaremill.com/file?test=1 will be uploaded with the key file?test=1, but can only be accessed by encoding the ? like this %3Ftest=1
|
26
|
+
* Create a 404 file on S3
|
27
|
+
* Provide the option to rewrite absolute URLs to relative urls so that hosting can work on a different domain.
|
28
|
+
* Multithread the crawler
|
29
|
+
* Check for too many redirects
|
30
|
+
* Provide regex options for what urls are scraped
|
31
|
+
* Better handling of incorrect server mime types (ex. server returns text/plain for css instead of text/css)
|
32
|
+
* Provide more options for uploading (upload via scp, ftp, custom etc.). Split out save/uploading into an interface.
|
33
|
+
* Handle large files in a more memory efficient way by streaming uploads/downloads
|
34
|
+
|
21
35
|
## Installation
|
22
36
|
|
23
37
|
Add this line to your application's Gemfile:
|
@@ -30,7 +44,7 @@ And then execute:
|
|
30
44
|
|
31
45
|
Or install it yourself as:
|
32
46
|
|
33
|
-
$ gem install
|
47
|
+
$ gem install staticizer
|
34
48
|
|
35
49
|
## Command line usage
|
36
50
|
|
@@ -92,7 +106,7 @@ This will only crawl urls in the domain squaremill.com
|
|
92
106
|
)
|
93
107
|
s.crawl
|
94
108
|
|
95
|
-
##
|
109
|
+
## Crawler Options
|
96
110
|
|
97
111
|
* :aws - Hash of connection options passed to aws/sdk gem
|
98
112
|
* :filter_url - proc called to see if a discovered URL should be crawled, return nil to not crawl a url, return the url (can be modified) to crawl
|
data/Rakefile
CHANGED
data/lib/staticizer/crawler.rb
CHANGED
@@ -6,6 +6,9 @@ require 'logger'
|
|
6
6
|
|
7
7
|
module Staticizer
|
8
8
|
class Crawler
|
9
|
+
attr_reader :url_queue
|
10
|
+
attr_accessor :output_dir
|
11
|
+
|
9
12
|
def initialize(initial_page, opts = {})
|
10
13
|
if initial_page.nil?
|
11
14
|
raise ArgumentError, "Initial page required"
|
@@ -14,7 +17,7 @@ module Staticizer
|
|
14
17
|
@opts = opts.dup
|
15
18
|
@url_queue = []
|
16
19
|
@processed_urls = []
|
17
|
-
@opts[:output_dir]
|
20
|
+
@output_dir = @opts[:output_dir] || File.expand_path("crawl/")
|
18
21
|
@log = @opts[:logger] || Logger.new(STDOUT)
|
19
22
|
@log.level = @opts[:log_level] || Logger::INFO
|
20
23
|
|
@@ -32,6 +35,14 @@ module Staticizer
|
|
32
35
|
add_url(initial_page)
|
33
36
|
end
|
34
37
|
|
38
|
+
def log_level
|
39
|
+
@log.level
|
40
|
+
end
|
41
|
+
|
42
|
+
def log_level=(level)
|
43
|
+
@log.level = level
|
44
|
+
end
|
45
|
+
|
35
46
|
def crawl
|
36
47
|
@log.info("Starting crawl")
|
37
48
|
while(@url_queue.length > 0)
|
@@ -59,7 +70,7 @@ module Staticizer
|
|
59
70
|
end
|
60
71
|
|
61
72
|
def extract_css_urls(css, base_uri)
|
62
|
-
css.scan(/url\(([
|
73
|
+
css.scan(/url\(['"]?(.+?)['"]?\)/).map {|src| make_absolute(base_uri, src[0]) }
|
63
74
|
end
|
64
75
|
|
65
76
|
def add_urls(urls, info = {})
|
@@ -69,7 +80,7 @@ module Staticizer
|
|
69
80
|
def make_absolute(base_uri, href)
|
70
81
|
URI::join(base_uri, href).to_s
|
71
82
|
rescue StandardError => e
|
72
|
-
@log.error "Could not make absolute #{base_uri} - #{href}"
|
83
|
+
@log.error "Could not make absolute '#{base_uri}' - '#{href}' - #{e}"
|
73
84
|
end
|
74
85
|
|
75
86
|
def add_url(url, info = {})
|
@@ -101,7 +112,7 @@ module Staticizer
|
|
101
112
|
path_segments = path.scan(%r{[^/]*/})
|
102
113
|
filename = path.include?("/") ? path[path.rindex("/")+1..-1] : path
|
103
114
|
|
104
|
-
current = @
|
115
|
+
current = @output_dir
|
105
116
|
FileUtils.mkdir_p(current) unless File.exist?(current)
|
106
117
|
|
107
118
|
# Create all the directories necessary for this file
|
@@ -175,7 +186,7 @@ module Staticizer
|
|
175
186
|
# TODO: for AWS S3 hosting we could instead create a redirect?
|
176
187
|
def process_redirect(url, destination_url)
|
177
188
|
body = "<html><head><META http-equiv='refresh' content='0;URL=\"#{destination_url}\"'></head><body>You are being redirected to <a href='#{destination_url}'>#{destination_url}</a>.</body></html>"
|
178
|
-
|
189
|
+
save_page(body, url)
|
179
190
|
end
|
180
191
|
|
181
192
|
# Fetch a URI and save it to disk
|
data/lib/staticizer/version.rb
CHANGED
data/staticizer.gemspec
CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
22
|
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "webmock"
|
23
24
|
|
24
25
|
spec.add_runtime_dependency 'nokogiri'
|
25
26
|
spec.add_runtime_dependency 'aws-sdk'
|
data/tests/crawler_test.rb
CHANGED
@@ -1,15 +1,80 @@
|
|
1
1
|
require 'minitest/autorun'
|
2
|
+
require 'ostruct'
|
2
3
|
|
3
|
-
|
4
|
+
lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
|
5
|
+
$LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
|
6
|
+
|
7
|
+
require 'staticizer'
|
4
8
|
|
5
9
|
class TestFilePaths < MiniTest::Unit::TestCase
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
"
|
14
|
-
|
10
|
+
def setup
|
11
|
+
@crawler = Staticizer::Crawler.new("http://test.com")
|
12
|
+
@crawler.log_level = Logger::FATAL
|
13
|
+
@fake_page = File.read(File.expand_path(File.dirname(__FILE__) + "/fake_page.html"))
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_save_page_to_disk
|
17
|
+
fake_response = OpenStruct.new(:read_body => "test", :body => "test")
|
18
|
+
file_paths = {
|
19
|
+
"http://test.com" => "index.html",
|
20
|
+
"http://test.com/" => "index.html",
|
21
|
+
"http://test.com/asdfdf/dfdf" => "/asdfdf/dfdf",
|
22
|
+
"http://test.com/asdfdf/dfdf/" => ["/asdfdf/dfdf","/asdfdf/dfdf/index.html"],
|
23
|
+
"http://test.com/asdfad/asdffd.test" => "/asdfad/asdffd.test",
|
24
|
+
"http://test.com/?asdfsd=12312" => "/?asdfsd=12312",
|
25
|
+
"http://test.com/asdfad/asdffd.test?123=sdff" => "/asdfad/asdffd.test?123=sdff",
|
26
|
+
}
|
27
|
+
|
28
|
+
# TODO: Stub out file system using https://github.com/defunkt/fakefs?
|
29
|
+
outputdir = "/tmp/staticizer_crawl_test"
|
30
|
+
FileUtils.rm_rf(outputdir)
|
31
|
+
@crawler.output_dir = outputdir
|
32
|
+
|
33
|
+
file_paths.each do |k,v|
|
34
|
+
@crawler.save_page_to_disk(fake_response, URI.parse(k))
|
35
|
+
[v].flatten.each do |file|
|
36
|
+
expected = File.expand_path(outputdir + "/#{file}")
|
37
|
+
assert File.exists?(expected), "File #{expected} not created for url #{k}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_save_page_to_aws
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_add_url_with_valid_domains
|
46
|
+
test_url = "http://test.com/test"
|
47
|
+
@crawler.add_url(test_url)
|
48
|
+
assert(@crawler.url_queue[-1] == [test_url, {}], "URL #{test_url} not added to queue")
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_add_url_with_filter
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_initialize_options
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_process_url
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_make_absolute
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_link_extraction
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_href_extraction
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_css_extraction
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_css_url_extraction
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_image_extraction
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_script_extraction
|
79
|
+
end
|
15
80
|
end
|
@@ -0,0 +1,288 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<title>Web Application Design and Development — Square Mill Labs</title>
|
5
|
+
<meta content="authenticity_token" name="csrf-param" />
|
6
|
+
<meta content="LshjtNLXmjVY9NINXYQds+2Ur+jxUtqKVjjbDbVl+9w=" name="csrf-token" />
|
7
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
8
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
9
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
10
|
+
<meta property="og:type" content="website">
|
11
|
+
<meta property="og:url" content="http://squaremill.com/">
|
12
|
+
<meta property="og:image" content="">
|
13
|
+
<meta name="viewport" content="width=device-width, maximum-scale=1.0, initial-scale=1.0">
|
14
|
+
<meta name="description" content="Web Application Design and Development — Square Mill Labs">
|
15
|
+
<link rel="shortcut icon" type="image/png" href="http://squaremill.com/assets/icons/favicon-0fecbe6b20ff5bdf623357a3fac76b4b.png">
|
16
|
+
<link data-turbolinks-track="true" href="/assets/mn_application-5ddad96f16e03ad2137bf02270506e61.css" media="all" rel="stylesheet" />
|
17
|
+
<!--[if lt IE 9]>
|
18
|
+
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
|
19
|
+
<![endif]-->
|
20
|
+
|
21
|
+
<script type="text/javascript" src="//use.typekit.net/cjr4fwy.js"></script>
|
22
|
+
<script type="text/javascript">try{Typekit.load();}catch(e){}</script>
|
23
|
+
</head>
|
24
|
+
|
25
|
+
<body id="public">
|
26
|
+
<script type="text/javascript">
|
27
|
+
|
28
|
+
var _gaq = _gaq || [];
|
29
|
+
_gaq.push(['_setAccount', 'UA-30460332-1']);
|
30
|
+
_gaq.push(['_setDomainName', 'squaremill.com']);
|
31
|
+
_gaq.push(['_trackPageview']);
|
32
|
+
|
33
|
+
(function() {
|
34
|
+
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
35
|
+
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
36
|
+
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
37
|
+
})();
|
38
|
+
|
39
|
+
</script>
|
40
|
+
|
41
|
+
|
42
|
+
<header id="header">
|
43
|
+
<nav class="nav container">
|
44
|
+
<a class="branding" href="http://squaremill.com/" rel="home" title="Square Mill - Digital Products for Web and Mobile">
|
45
|
+
<img alt="Square Mill Logo" class="logo" height="16" src="/assets/m2-wordmark-black-97525464acd136ce26b77e39c7ed2ba3.png" width="128" />
|
46
|
+
<p class="description">
|
47
|
+
Digital Products for Web and Mobile
|
48
|
+
</p>
|
49
|
+
</a> <a class="menu-trigger" href="#">Menu</a>
|
50
|
+
<div class="main-nav">
|
51
|
+
<ul class="container">
|
52
|
+
<li><a href="/projects">Projects</a></li>
|
53
|
+
<li><a href="/about">About Us</a></li>
|
54
|
+
<li><a href="/blog">Blog</a></li>
|
55
|
+
|
56
|
+
<!-- <li class="link-biography"><a href="http://squaremill.com/#biography">People</a></li> -->
|
57
|
+
</ul>
|
58
|
+
</div>
|
59
|
+
|
60
|
+
</nav>
|
61
|
+
|
62
|
+
</header>
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
<div id="site-content">
|
67
|
+
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
<div class="container" id="home-projects">
|
72
|
+
<section class="big-promo">
|
73
|
+
<div class="project" id="project-7">
|
74
|
+
<a href="/projects/bon-voyaging">
|
75
|
+
<div class="devices">
|
76
|
+
<div class="laptop device">
|
77
|
+
<img alt="" class="chrome" src="/assets/projects/macbook-pro-1be04a78f99b40e2c676d78fc24fcc3d.png" />
|
78
|
+
<div class="screenshot">
|
79
|
+
<img alt="" src="/uploads/project/desktop_image/7/bonvoyaging-desktop.jpg" />
|
80
|
+
</div>
|
81
|
+
</div>
|
82
|
+
|
83
|
+
<div class="handheld device">
|
84
|
+
<img alt="" class="chrome" src="/assets/projects/iphone5-c1ea3a16be931f1e80bacab5cfec932d.png" />
|
85
|
+
<div class="screenshot">
|
86
|
+
<img alt="" src="/uploads/project/iphone_image/7/bonvoyagin-handheld.jpg" />
|
87
|
+
</div>
|
88
|
+
</div>
|
89
|
+
</div>
|
90
|
+
|
91
|
+
<div class="project-description">
|
92
|
+
<div class="summary">
|
93
|
+
<h2>Bon Voyaging <i class="icon-play-sign"></i></h2>
|
94
|
+
<p>Bon Voyaging enables discerning travelers to expertly envision their next voyage from inspiration to exploration. Powerful search tools and a interactive javascript interface make planning trips fun.</p>
|
95
|
+
</div>
|
96
|
+
</div>
|
97
|
+
</a>
|
98
|
+
</div>
|
99
|
+
</section>
|
100
|
+
<section class="big-promo">
|
101
|
+
<div class="project" id="project-1">
|
102
|
+
<a href="/projects/kpcb-fellows">
|
103
|
+
<div class="devices">
|
104
|
+
<div class="laptop device">
|
105
|
+
<img alt="" class="chrome" src="/assets/projects/macbook-pro-1be04a78f99b40e2c676d78fc24fcc3d.png" />
|
106
|
+
<div class="screenshot">
|
107
|
+
<img alt="" src="/uploads/project/desktop_image/1/kpcb-fellows-screenshot.jpg" />
|
108
|
+
</div>
|
109
|
+
</div>
|
110
|
+
|
111
|
+
<div class="handheld device">
|
112
|
+
<img alt="" class="chrome" src="/assets/projects/iphone5-c1ea3a16be931f1e80bacab5cfec932d.png" />
|
113
|
+
<div class="screenshot">
|
114
|
+
<img alt="" src="/uploads/project/iphone_image/1/kpcb-fellows-iphone-screenshot.jpg" />
|
115
|
+
</div>
|
116
|
+
</div>
|
117
|
+
</div>
|
118
|
+
|
119
|
+
<div class="project-description">
|
120
|
+
<div class="summary">
|
121
|
+
<h2>KPCB Fellows Website and Brand <i class="icon-play-sign"></i></h2>
|
122
|
+
<p>The Fellows Program is a three-month work-based program that pairs top U.S. Engineering, Design and Product Design students with leading technology companies</p>
|
123
|
+
</div>
|
124
|
+
</div>
|
125
|
+
</a>
|
126
|
+
</div>
|
127
|
+
</section>
|
128
|
+
<section class="big-promo">
|
129
|
+
<div class="project" id="project-2">
|
130
|
+
<a href="/projects/thomson-reuters-messenger">
|
131
|
+
<div class="devices">
|
132
|
+
<div class="laptop device no-handheld">
|
133
|
+
<img alt="" class="chrome" src="/assets/projects/macbook-pro-1be04a78f99b40e2c676d78fc24fcc3d.png" />
|
134
|
+
<div class="screenshot">
|
135
|
+
<img alt="" src="/uploads/project/desktop_image/2/thomson-reuters-messenger-desktop.png" />
|
136
|
+
</div>
|
137
|
+
</div>
|
138
|
+
|
139
|
+
</div>
|
140
|
+
|
141
|
+
<div class="project-description">
|
142
|
+
<div class="summary">
|
143
|
+
<h2>Thomson Reuters Messenger <i class="icon-play-sign"></i></h2>
|
144
|
+
<p>Messenger is an html5 / javascript instant messenger application for financial professionals</p>
|
145
|
+
</div>
|
146
|
+
</div>
|
147
|
+
</a>
|
148
|
+
</div>
|
149
|
+
</section>
|
150
|
+
<section class="big-promo">
|
151
|
+
<div class="project" id="project-3">
|
152
|
+
<a href="/projects/kleiner-perkins-caufield-byers-digital-presence">
|
153
|
+
<div class="devices">
|
154
|
+
<div class="laptop device">
|
155
|
+
<img alt="" class="chrome" src="/assets/projects/macbook-pro-1be04a78f99b40e2c676d78fc24fcc3d.png" />
|
156
|
+
<div class="screenshot">
|
157
|
+
<img alt="" src="/uploads/project/desktop_image/3/kpcb-screenshot.jpg" />
|
158
|
+
</div>
|
159
|
+
</div>
|
160
|
+
|
161
|
+
<div class="handheld device">
|
162
|
+
<img alt="" class="chrome" src="/assets/projects/iphone5-c1ea3a16be931f1e80bacab5cfec932d.png" />
|
163
|
+
<div class="screenshot">
|
164
|
+
<img alt="" src="/uploads/project/iphone_image/3/kpcb-iphone-screenshot.jpg" />
|
165
|
+
</div>
|
166
|
+
</div>
|
167
|
+
</div>
|
168
|
+
|
169
|
+
<div class="project-description">
|
170
|
+
<div class="summary">
|
171
|
+
<h2>Kleiner Perkins Caufield & Byers Digital Presence <i class="icon-play-sign"></i></h2>
|
172
|
+
<p>KPCB is a venture capital stalwart located in Silicon Valley with over 40 years of tech and science investment.</p>
|
173
|
+
</div>
|
174
|
+
</div>
|
175
|
+
</a>
|
176
|
+
</div>
|
177
|
+
</section>
|
178
|
+
</div>
|
179
|
+
|
180
|
+
<section class="clients full-width">
|
181
|
+
<div class="container">
|
182
|
+
<h2>Clients</h2>
|
183
|
+
<ul class="hlist">
|
184
|
+
<li><a href="http://kpcb.com" rel="friend" target="_blank" title="KPCB's Website"><img alt="KPCB" src="/uploads/client/image/1/home_logo_kpcb-logo.png" /></a></li>
|
185
|
+
<li><a href="http://thomsonreuters.com" rel="friend" target="_blank" title="Thomson Reuters's Website"><img alt="Thomson Reuters" src="/uploads/client/image/2/home_logo_thomsonreuters.png" /></a></li>
|
186
|
+
<li><a href="http://sumzero.com" rel="friend" target="_blank" title="SumZero's Website"><img alt="SumZero" src="/uploads/client/image/3/home_logo_sumzero.png" /></a></li>
|
187
|
+
<li><a href="http://marlboroughgallery.com" rel="friend" target="_blank" title="Marlborough Gallery's Website"><img alt="Marlborough Gallery" src="/uploads/client/image/4/home_logo_marlborough.png" /></a></li>
|
188
|
+
<li><a href="http://flurry.com" rel="friend" target="_blank" title="Flurry Analytics's Website"><img alt="Flurry Analytics" src="/uploads/client/image/8/home_logo_flurry.png" /></a></li>
|
189
|
+
</ul>
|
190
|
+
</div>
|
191
|
+
</section>
|
192
|
+
|
193
|
+
<section class="quote">
|
194
|
+
<blockquote>
|
195
|
+
<p>"Square Mill really took the time to understand our business and think strategically about how we want to engage and communicate with our entrepreneurs online. Together, their small team is responsive, nimble and efficient and has the deep design and technical chops to back it up."</p>
|
196
|
+
<small><a href="http://kpcb.com/partner/christina-lee" rel="friend" title="Christina Lee, Operating Partner at KPCB">Christina Lee</a>, <em>Operating Partner at KPCB</em></small>
|
197
|
+
</blockquote>
|
198
|
+
</section>
|
199
|
+
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
</div>
|
204
|
+
|
205
|
+
<footer id="footer">
|
206
|
+
<section class="container">
|
207
|
+
<a class="logo" href="http://squaremill.com/" rel="home">
|
208
|
+
<img alt="Square Mill Logo" height="64" src="/assets/md-logo-black-942423ecfd86c43ec6f13f163ea03f97.png" width="64" />
|
209
|
+
</a> <div class="main-nav">
|
210
|
+
<ul class="container">
|
211
|
+
<li><a href="/projects">Projects</a></li>
|
212
|
+
<li><a href="/about">About Us</a></li>
|
213
|
+
<li><a href="/blog">Blog</a></li>
|
214
|
+
|
215
|
+
<!-- <li class="link-biography"><a href="http://squaremill.com/#biography">People</a></li> -->
|
216
|
+
</ul>
|
217
|
+
</div>
|
218
|
+
|
219
|
+
</section>
|
220
|
+
|
221
|
+
<p class="copyright">
|
222
|
+
© 2014 Square Mill Labs, LLC. All rights reserved.
|
223
|
+
</p>
|
224
|
+
</footer>
|
225
|
+
|
226
|
+
<script type="text/javascript" src="http://code.jquery.com/jquery-2.0.0.js"></script>
|
227
|
+
<script type="text/javascript" src="http://code.jquery.com/jquery-migrate-1.1.1.js"></script>
|
228
|
+
<script src="/assets/mn_application-82f6787dca307be34ec0c9fa6b7ba7d4.js"></script>
|
229
|
+
<script>
|
230
|
+
$(document).ready(function() {
|
231
|
+
|
232
|
+
var controller = $.superscrollorama({
|
233
|
+
triggerAtCenter: true,
|
234
|
+
playoutAnimations: true
|
235
|
+
});
|
236
|
+
|
237
|
+
if ( $(window).width() >= 767 ) {
|
238
|
+
controller.addTween('#project-7',
|
239
|
+
TweenMax.from($('#project-7'), .7, {
|
240
|
+
css:{"opacity":"0"},
|
241
|
+
onComplete: function(){
|
242
|
+
$('#project-7').toggleClass('active-in')
|
243
|
+
}
|
244
|
+
}),
|
245
|
+
300, // duration of scroll in pixel units
|
246
|
+
-100, // scroll offset (from center of viewport)
|
247
|
+
true
|
248
|
+
);
|
249
|
+
controller.addTween('#project-1',
|
250
|
+
TweenMax.from($('#project-1'), .7, {
|
251
|
+
css:{"opacity":"0"},
|
252
|
+
onComplete: function(){
|
253
|
+
$('#project-1').toggleClass('active-in')
|
254
|
+
}
|
255
|
+
}),
|
256
|
+
300, // duration of scroll in pixel units
|
257
|
+
-100, // scroll offset (from center of viewport)
|
258
|
+
true
|
259
|
+
);
|
260
|
+
controller.addTween('#project-2',
|
261
|
+
TweenMax.from($('#project-2'), .7, {
|
262
|
+
css:{"opacity":"0"},
|
263
|
+
onComplete: function(){
|
264
|
+
$('#project-2').toggleClass('active-in')
|
265
|
+
}
|
266
|
+
}),
|
267
|
+
300, // duration of scroll in pixel units
|
268
|
+
-100, // scroll offset (from center of viewport)
|
269
|
+
true
|
270
|
+
);
|
271
|
+
controller.addTween('#project-3',
|
272
|
+
TweenMax.from($('#project-3'), .7, {
|
273
|
+
css:{"opacity":"0"},
|
274
|
+
onComplete: function(){
|
275
|
+
$('#project-3').toggleClass('active-in')
|
276
|
+
}
|
277
|
+
}),
|
278
|
+
300, // duration of scroll in pixel units
|
279
|
+
-100, // scroll offset (from center of viewport)
|
280
|
+
true
|
281
|
+
);
|
282
|
+
}
|
283
|
+
|
284
|
+
});
|
285
|
+
</script>
|
286
|
+
|
287
|
+
</body>
|
288
|
+
</html>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: staticizer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Conor Hunt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: webmock
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: nokogiri
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,6 +101,7 @@ files:
|
|
87
101
|
- lib/staticizer/version.rb
|
88
102
|
- staticizer.gemspec
|
89
103
|
- tests/crawler_test.rb
|
104
|
+
- tests/fake_page.html
|
90
105
|
homepage: https://github.com/SquareMill/staticizer
|
91
106
|
licenses:
|
92
107
|
- MIT
|