meme_captain 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,142 @@
1
+ {
2
+ "thumbHeight": 50,
3
+ "thumbSpritesUrl": "http://memecaptain.com/thumbs.jpg",
4
+ "images": [
5
+ {
6
+ "url": "http://memecaptain.com/all_the_things.jpg",
7
+ "thumbWidth": 67
8
+ },
9
+ {
10
+ "url": "http://memecaptain.com/all_the_things2.jpg",
11
+ "thumbWidth": 67
12
+ },
13
+ {
14
+ "url": "http://memecaptain.com/aw_yeah.png",
15
+ "thumbWidth": 50
16
+ },
17
+ {
18
+ "url": "http://memecaptain.com/bear_grylls.jpg",
19
+ "thumbWidth": 45
20
+ },
21
+ {
22
+ "url": "http://memecaptain.com/boromir.jpg",
23
+ "thumbWidth": 85
24
+ },
25
+ {
26
+ "url": "http://memecaptain.com/business_cat.jpg",
27
+ "thumbWidth": 50
28
+ },
29
+ {
30
+ "url": "http://memecaptain.com/cool_story_bro.jpg",
31
+ "thumbWidth": 72
32
+ },
33
+ {
34
+ "url": "http://memecaptain.com/courage_wolf.jpg",
35
+ "thumbWidth": 50
36
+ },
37
+ {
38
+ "url": "http://memecaptain.com/dwight_schrute.jpg",
39
+ "thumbWidth": 73
40
+ },
41
+ {
42
+ "url": "http://memecaptain.com/fry.png",
43
+ "thumbWidth": 67
44
+ },
45
+ {
46
+ "url": "http://memecaptain.com/good_guy_greg.jpg",
47
+ "thumbWidth": 51
48
+ },
49
+ {
50
+ "url": "http://memecaptain.com/grandma.jpg",
51
+ "thumbWidth": 68
52
+ },
53
+ {
54
+ "url": "http://memecaptain.com/insanity_wolf.jpg",
55
+ "thumbWidth": 50
56
+ },
57
+ {
58
+ "url": "http://memecaptain.com/internet_husband.jpg",
59
+ "thumbWidth": 45
60
+ },
61
+ {
62
+ "url": "http://memecaptain.com/joseph_ducreux.jpg",
63
+ "thumbWidth": 38
64
+ },
65
+ {
66
+ "url": "http://memecaptain.com/me_gusta.png",
67
+ "thumbWidth": 50
68
+ },
69
+ {
70
+ "url": "http://memecaptain.com/most_interesting.jpg",
71
+ "thumbWidth": 40
72
+ },
73
+ {
74
+ "url": "http://memecaptain.com/ned_stark.jpg",
75
+ "thumbWidth": 55
76
+ },
77
+ {
78
+ "url": "http://memecaptain.com/ok.png",
79
+ "thumbWidth": 50
80
+ },
81
+ {
82
+ "url": "http://memecaptain.com/philosoraptor.jpg",
83
+ "thumbWidth": 50
84
+ },
85
+ {
86
+ "url": "http://memecaptain.com/rage.png",
87
+ "thumbWidth": 50
88
+ },
89
+ {
90
+ "url": "http://memecaptain.com/sap.jpg",
91
+ "thumbWidth": 50
92
+ },
93
+ {
94
+ "url": "http://memecaptain.com/scumbag_steve.jpg",
95
+ "thumbWidth": 50
96
+ },
97
+ {
98
+ "url": "http://memecaptain.com/seriously.png",
99
+ "thumbWidth": 50
100
+ },
101
+ {
102
+ "url": "http://memecaptain.com/slowpoke.jpg",
103
+ "thumbWidth": 50
104
+ },
105
+ {
106
+ "url": "http://memecaptain.com/success_kid.jpg",
107
+ "thumbWidth": 50
108
+ },
109
+ {
110
+ "url": "http://memecaptain.com/town_crier.jpg",
111
+ "thumbWidth": 75
112
+ },
113
+ {
114
+ "url": "http://memecaptain.com/troll_face.jpg",
115
+ "thumbWidth": 55
116
+ },
117
+ {
118
+ "url": "http://memecaptain.com/trolldad.png",
119
+ "thumbWidth": 50
120
+ },
121
+ {
122
+ "url": "http://memecaptain.com/trolldad_dancing.png",
123
+ "thumbWidth": 50
124
+ },
125
+ {
126
+ "url": "http://memecaptain.com/tyler_durden.jpg",
127
+ "thumbWidth": 50
128
+ },
129
+ {
130
+ "url": "http://memecaptain.com/xzibit.jpg",
131
+ "thumbWidth": 77
132
+ },
133
+ {
134
+ "url": "http://memecaptain.com/y_u_no.jpg",
135
+ "thumbWidth": 67
136
+ },
137
+ {
138
+ "url": "http://memecaptain.com/yao_ming.jpg",
139
+ "thumbWidth": 42
140
+ }
141
+ ]
142
+ }
data/public/thumbs.jpg CHANGED
Binary file
@@ -1,20 +1,33 @@
1
+ require 'json'
1
2
  require 'RMagick'
2
3
 
3
4
  # make a combined thumbnail image from a list of images for use in CSS sprites
5
+ # generate source images description json
4
6
 
5
- puts 'images = ['
7
+ url_prefix = 'http://memecaptain.com/'
8
+
9
+ data = {
10
+ :thumbHeight => 50,
11
+ :thumbSpritesUrl => "#{url_prefix}thumbs.jpg",
12
+ :images => [],
13
+ }
6
14
 
7
15
  thumbs = Magick::ImageList.new
8
16
 
9
17
  ARGV.sort.each do |file|
10
18
  image = Magick::ImageList.new(file)
11
- image.resize_to_fit!(0, 50)
19
+ image.resize_to_fit!(0, data[:thumbHeight])
12
20
  image.each do |frame|
13
21
  thumbs.push frame
14
- puts " ['#{File.basename(file)}', #{frame.columns}],"
22
+ data[:images] << {
23
+ :url => "#{url_prefix}#{File.basename(file)}",
24
+ :thumbWidth => frame.columns
25
+ }
15
26
  end
16
27
  end
17
28
 
18
- puts ']'
29
+ open('source_images.json', 'w') do |f|
30
+ f.write(JSON.pretty_generate(data))
31
+ end
19
32
 
20
33
  thumbs.append(false).write('thumbs.jpg')
data/views/404.erb ADDED
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+ <title>Meme Captain meme generator - Not Found</title>
7
+ </head>
8
+
9
+ <body>
10
+
11
+ <h1>Not Found</h1>
12
+
13
+ <p><a href="<%= h @root_url %>"><%= h @root_url %></a></p>
14
+
15
+ </body>
16
+
17
+ </html>
data/views/index.erb CHANGED
@@ -1,28 +1,35 @@
1
1
  <!DOCTYPE html>
2
- <html lan="en" xmlns:fb="https://www.facebook.com/2008/fbml">
2
+ <html lang="en" xmlns:fb="https://www.facebook.com/2008/fbml">
3
3
 
4
4
  <head>
5
- <title>Meme Captain</title>
6
5
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+ <title>Meme Captain meme generator</title>
7
7
  <style type="text/css">
8
+ body {
9
+ font-family : verdana, helvetica, arial, sans-serif;
10
+ }
11
+
8
12
  #sourceImages {
9
13
  background-color : #eee;
10
- border-top : 1px solid #ccc;
11
- border-bottom : 1px solid #ccc;
14
+ border : 1px solid #ccc;
12
15
  padding : 0em 1em 0.5em 1em;
13
16
  margin : 1em 0em 1em 0em;
14
17
  }
15
18
 
16
19
  img.thumb {
17
- background-image : url('thumbs.jpg');
18
- height : 50px;
20
+ margin : 2px;
21
+ }
22
+
23
+ #heading {
24
+ font-size : 1em;
25
+ font-weight : normal;
19
26
  }
20
27
  </style>
21
28
  </head>
22
29
 
23
30
  <body>
24
31
 
25
- <p><a href="/">Meme Captain</a> - add text to images from the internet</p>
32
+ <h1 id="heading"><a href="<%= h @root_url %>">Meme Captain</a> - make memes with images and text</h1>
26
33
 
27
34
  <div id="img"></div>
28
35
 
@@ -31,17 +38,17 @@ img.thumb {
31
38
  <table>
32
39
 
33
40
  <tr>
34
- <td><label for="u" />Source image URL: </label></td>
41
+ <td><label for="u">Source image URL: </label></td>
35
42
  <td><input type="text" id="u" name="u" size="64" value="<%= h @u %>"/></td>
36
43
  </tr>
37
44
 
38
45
  <tr>
39
- <td><label for="tt" />Top text: </label></td>
46
+ <td><label for="tt">Top text: </label></td>
40
47
  <td><input type="text" id="tt" name="tt" size="64" value="<%= h @tt %>" /></td>
41
48
  </tr>
42
49
 
43
50
  <tr>
44
- <td><label for="tb" />Bottom text: </label></td>
51
+ <td><label for="tb">Bottom text: </label></td>
45
52
  <td><input type="text" id="tb" name="tb" size="64" value="<%= h @tb %>" /></td>
46
53
  </tr>
47
54
 
@@ -56,73 +63,31 @@ img.thumb {
56
63
 
57
64
  <div id="sourceImages">
58
65
 
59
- <p>Locally hosted source images or search Bing for source images (click thumbnail to use):</p>
60
-
61
- <%
62
-
63
- images = [
64
- ['all_the_things.jpg', 67],
65
- ['bear_grylls.jpg', 45],
66
- ['business_cat.jpg', 50],
67
- ['courage_wolf.jpg', 50],
68
- ['dwight_schrute.jpg', 73],
69
- ['fry.png', 67],
70
- ['good_guy_greg.jpg', 51],
71
- ['grandma.jpg', 68],
72
- ['insanity_wolf.jpg', 50],
73
- ['internet_husband.jpg', 45],
74
- ['joseph_ducreux.jpg', 38],
75
- ['me_gusta.png', 50],
76
- ['most_interesting.jpg', 40],
77
- ['ok.png', 50],
78
- ['philosoraptor.jpg', 50],
79
- ['rage.png', 50],
80
- ['sap.jpg', 50],
81
- ['scumbag_steve.jpg', 50],
82
- ['seriously.png', 50],
83
- ['slowpoke.jpg', 50],
84
- ['success_kid.jpg', 50],
85
- ['town_crier.jpg', 75],
86
- ['troll_face.jpg', 55],
87
- ['trolldad.png', 50],
88
- ['trolldad_dancing.png', 50],
89
- ['tyler_durden.jpg', 50],
90
- ['xzibit.jpg', 77],
91
- ['y_u_no.jpg', 67],
92
- ['yao_ming.jpg', 42],
93
- ]
94
-
95
- pos = 0
96
- images.each do |name, offset|
97
- %>
98
- <img src="1.gif" class="thumb" style="width : <%= offset %>px; background-position : <%= pos %>px 0px;" onClick="$('#u').val('http://memecaptain.com/<%= name %>'); return false;" />
99
- <%
100
- pos -= offset
101
- end
102
- %>
103
-
104
- <div id="bingImageResults"></div>
66
+ <p>Locally hosted source images or search for source images (click thumbnail to use):</p>
67
+
68
+ <div id="imageSearchResults"></div>
105
69
 
106
70
  <form action="" method="get">
107
- <input type="text" id="bingSearch" />
108
- <input type="button" id="bingButton" value="Bing Image Search" />
71
+ <input type="text" id="imageSearch" />
72
+ <input type="button" id="imageSearchButton" value="Image Search" /> powered by Bing and Google
109
73
  </form>
110
74
 
111
75
  </div>
112
76
 
113
- <p>by Matthew M. Boedicker <a href="mailto:matthewm@boedicker.org">matthewm@boedicker.org</a></p>
77
+ <p>
78
+ Contact: Matthew M. Boedicker <a href="mailto:matthewm@boedicker.org">matthewm@boedicker.org</a> |
79
+ <a href="http://twitter.com/memecaptain">@memecaptain</a>
80
+ </p>
114
81
 
115
82
  <p><a href="https://github.com/mmb/meme_captain">source code and API</a></p>
116
83
 
117
- <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js"></script>
84
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
118
85
  <script>
119
86
  function showBingImages(resp) {
120
- var div = $('#bingImageResults'),
87
+ var div = $('#imageSearchResults'),
121
88
  searchResponse = resp.SearchResponse,
122
89
  image = searchResponse.Image;
123
90
 
124
- div.empty();
125
-
126
91
  if (image.Total > 0) {
127
92
  $.each(image.Results, function (i, img) {
128
93
  div.append($('<img />').attr('src', img.Thumbnail.Url).click(
@@ -131,23 +96,39 @@ function showBingImages(resp) {
131
96
  });
132
97
  } else {
133
98
  div.append($('<p />').append(
134
- 'No results for "' + searchResponse.Query.SearchTerms + '".'));
99
+ 'No Bing results for "' + searchResponse.Query.SearchTerms + '".'));
100
+ }
101
+ }
102
+
103
+ function showGoogleImages(resp) {
104
+ var div = $('#imageSearchResults'),
105
+ searchResults = resp.responseData.results;
106
+
107
+ if (searchResults.length > 0) {
108
+ $.each(searchResults, function (i, img) {
109
+ div.append($('<img />').attr('src', img.tbUrl).click(
110
+ function () { $('#u').val(img.url); }
111
+ ));
112
+ });
113
+ } else {
114
+ div.append($('<p />').append('No Google results.'));
135
115
  }
136
116
  }
137
117
 
138
- function bingImageSearch() {
139
- var bingSearch = $('#bingSearch'),
140
- bingSearchVal = bingSearch.val();
118
+ function imageSearch() {
119
+ var imageSearch = $('#imageSearch'),
120
+ imageSearchVal = imageSearch.val();
141
121
 
142
- if (bingSearchVal.match(/[^\s]/)) {
143
- bingSearch.val('');
122
+ if (imageSearchVal.match(/[^\s]/)) {
123
+ imageSearch.val('');
124
+ $('#imageSearchResults').empty();
144
125
 
145
126
  $.ajax({
146
127
  type : 'GET',
147
128
  url : 'http://api.bing.net/json.aspx',
148
129
  data : {
149
130
  AppId : 'A120380275E87F0071F163210211F0592D0E964C',
150
- Query : bingSearchVal + ' imagesize:Medium',
131
+ Query : imageSearchVal + ' imagesize:Medium',
151
132
  Sources : 'Image',
152
133
  Version : '2.0',
153
134
  Market : 'en-us',
@@ -159,14 +140,49 @@ function bingImageSearch() {
159
140
  jsonpCallback : 'showBingImages',
160
141
  jsonp : 'JsonCallback'
161
142
  });
143
+
144
+ $.ajax({
145
+ type : 'GET',
146
+ url : 'http://ajax.googleapis.com/ajax/services/search/images',
147
+ data : {
148
+ imgsz : 'large',
149
+ key : 'ABQIAAAA-E0uJIHoMJX6M6atCgYANRS1DzXPXMqKnKNRJm2Z_PRWxvtqGBSOvBqyXOwxGZU5jLxExg_5ym69rw',
150
+ q : imageSearchVal,
151
+ rsz : '5',
152
+ v : '1.0',
153
+ },
154
+ dataType : 'jsonp',
155
+ jsonpCallback : 'showGoogleImages',
156
+ });
162
157
  }
163
158
  }
164
159
 
160
+ function loadSourceImages() {
161
+ $.get('source_images.json', function(data) {
162
+ var pos = 0,
163
+ div = $('#imageSearchResults');
164
+
165
+ $.each(data.images, function (i, img) {
166
+ div.before($('<img />').attr('src', '1.gif').addClass('thumb').css({
167
+ 'background-image' : 'url(' + data.thumbSpritesUrl + ')',
168
+ 'background-position' : pos + 'px 0px',
169
+ height : data.thumbHeight,
170
+ width : img.thumbWidth + 'px',
171
+ }).click(function() {
172
+ $('#u').val(img.url);
173
+ }));
174
+
175
+ pos -= img.thumbWidth;
176
+ });
177
+ });
178
+ }
179
+
165
180
  $(function () {
166
- var bingSearch,
167
- bingSearchVal,
181
+ var image,
168
182
  imgDiv;
169
183
 
184
+ loadSourceImages();
185
+
170
186
  if (window.location.search.match(/u=[^&$]/)) {
171
187
  $('#tt').focus();
172
188
 
@@ -175,9 +191,10 @@ $(function () {
175
191
  imgDiv.append($('<p />').append('Creating image ...'));
176
192
 
177
193
  $.get('/g' + window.location.search, function (data) {
178
- var img = $('<img />').attr('src', data.tempUrl),
179
- tempLink = $('<a />').attr('href', data.tempUrl).append(data.tempUrl),
180
- permLink = $('<a />').attr('href', data.permUrl).append(data.permUrl),
194
+ var img = $('<img />').attr('src', data.permUrl),
195
+ imgLink = $('<a />').attr('href', data.permUrl).append(data.permUrl),
196
+ templateLink = $('<a />').attr('href', data.templateUrl).append(
197
+ data.templateUrl),
181
198
  tweetLink = $('<a />').attr({
182
199
  href : 'http://twitter.com/share',
183
200
  'class' : 'twitter-share-button',
@@ -188,9 +205,9 @@ $(function () {
188
205
 
189
206
  imgDiv.empty().append(
190
207
  img).append(
191
- $('<p />').append('Temporary image url: ').append(tempLink)).append(
192
- $('<p />').append('Permanent image url: ').append(permLink)).append(
193
- $('<p />').append('Temporary url not guaranteed to work forever. Permanent url should work as long as source image exists.')).append(
208
+ $('<p />').append('Image: ').append(imgLink)).append(
209
+ $('<p />').append('Template: ').append(
210
+ templateLink)).append(
194
211
  $('<p />').append(tweetLink).append($('<script />').attr('src',
195
212
  'http://platform.twitter.com/widgets.js')));
196
213
 
@@ -198,7 +215,7 @@ $(function () {
198
215
  imgDiv.append(
199
216
  $('<div />').attr('id', 'fb-root')).append(
200
217
  $('<fb:like />').attr({
201
- href : data.tempUrl,
218
+ href : data.permUrl,
202
219
  send : 'true',
203
220
  width : '450',
204
221
  show_faces : 'true',
@@ -223,14 +240,14 @@ $(function () {
223
240
  $('#u').focus();
224
241
  }
225
242
 
226
- $('#bingSearch').keypress(function (event) {
227
- if (event.which == 13) {
243
+ $('#imageSearch').keypress(function (event) {
244
+ if (event.which === 13) {
228
245
  event.preventDefault();
229
- bingImageSearch();
246
+ imageSearch();
230
247
  }
231
248
  });
232
249
 
233
- $('#bingButton').click(bingImageSearch);
250
+ $('#imageSearchButton').click(imageSearch);
234
251
  });
235
252
  </script>
236
253
 
data/watermark.png ADDED
Binary file
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: meme_captain
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15
4
+ hash: 13
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 8
10
- version: 0.0.8
9
+ - 9
10
+ version: 0.0.9
11
11
  platform: ruby
12
12
  authors:
13
13
  - Matthew M. Boedicker
@@ -15,11 +15,11 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-11-23 00:00:00 -05:00
18
+ date: 2012-01-19 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: curb
22
+ name: bson_ext
23
23
  prerelease: false
24
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
25
  none: false
@@ -33,7 +33,7 @@ dependencies:
33
33
  type: :runtime
34
34
  version_requirements: *id001
35
35
  - !ruby/object:Gem::Dependency
36
- name: json
36
+ name: curb
37
37
  prerelease: false
38
38
  requirement: &id002 !ruby/object:Gem::Requirement
39
39
  none: false
@@ -47,7 +47,7 @@ dependencies:
47
47
  type: :runtime
48
48
  version_requirements: *id002
49
49
  - !ruby/object:Gem::Dependency
50
- name: mime-types
50
+ name: json
51
51
  prerelease: false
52
52
  requirement: &id003 !ruby/object:Gem::Requirement
53
53
  none: false
@@ -61,7 +61,7 @@ dependencies:
61
61
  type: :runtime
62
62
  version_requirements: *id003
63
63
  - !ruby/object:Gem::Dependency
64
- name: rack
64
+ name: mime-types
65
65
  prerelease: false
66
66
  requirement: &id004 !ruby/object:Gem::Requirement
67
67
  none: false
@@ -75,7 +75,7 @@ dependencies:
75
75
  type: :runtime
76
76
  version_requirements: *id004
77
77
  - !ruby/object:Gem::Dependency
78
- name: rmagick
78
+ name: mongo
79
79
  prerelease: false
80
80
  requirement: &id005 !ruby/object:Gem::Requirement
81
81
  none: false
@@ -89,7 +89,7 @@ dependencies:
89
89
  type: :runtime
90
90
  version_requirements: *id005
91
91
  - !ruby/object:Gem::Dependency
92
- name: sinatra
92
+ name: mongo_mapper
93
93
  prerelease: false
94
94
  requirement: &id006 !ruby/object:Gem::Requirement
95
95
  none: false
@@ -102,11 +102,53 @@ dependencies:
102
102
  version: "0"
103
103
  type: :runtime
104
104
  version_requirements: *id006
105
+ - !ruby/object:Gem::Dependency
106
+ name: rack
107
+ prerelease: false
108
+ requirement: &id007 !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ hash: 3
114
+ segments:
115
+ - 0
116
+ version: "0"
117
+ type: :runtime
118
+ version_requirements: *id007
119
+ - !ruby/object:Gem::Dependency
120
+ name: rmagick
121
+ prerelease: false
122
+ requirement: &id008 !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ hash: 3
128
+ segments:
129
+ - 0
130
+ version: "0"
131
+ type: :runtime
132
+ version_requirements: *id008
133
+ - !ruby/object:Gem::Dependency
134
+ name: sinatra
135
+ prerelease: false
136
+ requirement: &id009 !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ hash: 3
142
+ segments:
143
+ - 0
144
+ version: "0"
145
+ type: :runtime
146
+ version_requirements: *id009
105
147
  description: create meme images
106
148
  email:
107
149
  - matthewm@boedicker.org
108
- executables: []
109
-
150
+ executables:
151
+ - memecaptain
110
152
  extensions: []
111
153
 
112
154
  extra_rdoc_files: []
@@ -116,24 +158,31 @@ files:
116
158
  - COPYING
117
159
  - ChangeLog
118
160
  - README.md
161
+ - bin/memecaptain
119
162
  - config.ru
120
- - img_cache/source/.gitignore
121
163
  - lib/meme_captain.rb
122
164
  - lib/meme_captain/caption.rb
123
165
  - lib/meme_captain/caption_choice.rb
124
166
  - lib/meme_captain/draw.rb
125
167
  - lib/meme_captain/file_body.rb
126
- - lib/meme_captain/filesystem_cache.rb
168
+ - lib/meme_captain/image_list.rb
169
+ - lib/meme_captain/image_list/cache.rb
170
+ - lib/meme_captain/image_list/fetch.rb
171
+ - lib/meme_captain/image_list/source_image.rb
172
+ - lib/meme_captain/image_list/watermark.rb
127
173
  - lib/meme_captain/meme.rb
128
- - lib/meme_captain/mime_type.rb
174
+ - lib/meme_captain/meme_data.rb
129
175
  - lib/meme_captain/server.rb
130
176
  - lib/meme_captain/version.rb
131
177
  - meme_captain.gemspec
132
178
  - public/1.gif
179
+ - public/source_images.json
133
180
  - public/thumbs.jpg
134
181
  - public/tmp/.gitignore
135
182
  - script/thumb_sprites.rb
183
+ - views/404.erb
136
184
  - views/index.erb
185
+ - watermark.png
137
186
  has_rdoc: true
138
187
  homepage: https://github.com/mmb/meme_captain
139
188
  licenses: []
File without changes