murlsh 1.4.1 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/.htaccess +0 -3
- data/Gemfile +41 -0
- data/README.textile +68 -6
- data/Rakefile +65 -152
- data/config.ru +13 -2
- data/config.yaml +9 -4
- data/db/migrate/20110213023123_init.rb +20 -0
- data/lib/murlsh/atom_body.rb +78 -0
- data/lib/murlsh/atom_server.rb +38 -0
- data/lib/murlsh/auth.rb +12 -0
- data/lib/murlsh/build_query.rb +1 -1
- data/lib/murlsh/cat_files.rb +17 -0
- data/lib/murlsh/delicious_parse.rb +1 -0
- data/lib/murlsh/dispatch.rb +25 -11
- data/lib/murlsh/etag_add_encoding.rb +1 -1
- data/lib/murlsh/feed_body.rb +36 -0
- data/lib/murlsh/img_store.rb +27 -28
- data/lib/murlsh/install.rb +1 -0
- data/lib/murlsh/json_body.rb +5 -2
- data/lib/murlsh/json_server.rb +9 -13
- data/lib/murlsh/m3u_body.rb +28 -0
- data/lib/murlsh/m3u_server.rb +50 -0
- data/lib/murlsh/markup.rb +1 -1
- data/lib/murlsh/plugin.rb +5 -0
- data/lib/murlsh/podcast_server.rb +44 -0
- data/lib/murlsh/pop_server.rb +78 -0
- data/lib/murlsh/random_server.rb +41 -0
- data/lib/murlsh/rss_body.rb +46 -0
- data/lib/murlsh/rss_server.rb +38 -0
- data/lib/murlsh/search_conditions.rb +2 -2
- data/lib/murlsh/uri_ask.rb +2 -2
- data/lib/murlsh/url_body.rb +21 -6
- data/lib/murlsh/url_result_set.rb +2 -2
- data/lib/murlsh/url_server.rb +19 -16
- data/lib/murlsh/write_ordered_hash.rb +17 -0
- data/lib/murlsh.rb +13 -2
- data/murlsh.gemspec +41 -194
- data/plugins/add_post_60_notify_hubs.rb +3 -2
- data/plugins/add_pre_30_unajax_twitter.rb +1 -1
- data/plugins/add_pre_40_thumbnail_shortcuts.rb +23 -0
- data/plugins/add_pre_45_supplied_thumbnail.rb +4 -9
- data/plugins/add_pre_50_media_thumbnail.rb +4 -9
- data/plugins/add_pre_50_open_graph_image.rb +4 -8
- data/plugins/add_pre_60_github_title.rb +1 -1
- data/plugins/add_pre_65_html_thumb.rb +3 -8
- data/plugins/add_pre_65_img_thumb.rb +4 -9
- data/plugins/avatar_50_gravatar.rb +2 -1
- data/plugins/store_asset_40_s3.rb +40 -0
- data/plugins/store_asset_50_local.rb +22 -0
- data/public/js/js.js +0 -7
- data/spec/auth_spec.rb +7 -0
- data/spec/cat_files_spec.rb +49 -0
- data/spec/img_store_spec.rb +24 -8
- metadata +119 -76
- data/VERSION +0 -1
- data/lib/murlsh/build_md5.rb +0 -12
- data/lib/murlsh/head_from_get.rb +0 -15
- data/plugins/add_post_50_update_feed.rb +0 -84
- data/plugins/add_post_50_update_m3u.rb +0 -35
- data/plugins/add_post_50_update_podcast.rb +0 -44
- data/plugins/add_post_50_update_rss.rb +0 -51
- data/plugins/add_pre_60_s3_image.rb +0 -35
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'rss/maker'
|
2
|
+
|
3
|
+
require 'murlsh'
|
4
|
+
|
5
|
+
module Murlsh
|
6
|
+
|
7
|
+
# Rss feed builder.
|
8
|
+
class RssBody
|
9
|
+
include Murlsh::FeedBody
|
10
|
+
|
11
|
+
# Rss feed builder.
|
12
|
+
def build
|
13
|
+
if defined?(@body)
|
14
|
+
@body
|
15
|
+
else
|
16
|
+
feed = RSS::Maker.make('2.0') do |f|
|
17
|
+
f.channel.title = f.channel.description = feed_title
|
18
|
+
f.channel.link = feed_url
|
19
|
+
|
20
|
+
f.items.do_sort = true
|
21
|
+
|
22
|
+
urls.each do |mu|
|
23
|
+
Murlsh::Plugin.hooks('url_display_pre') do |p|
|
24
|
+
p.run mu, req, config
|
25
|
+
end
|
26
|
+
|
27
|
+
i = f.items.new_item
|
28
|
+
i.title = mu.title_stripped
|
29
|
+
i.link = mu.url
|
30
|
+
i.date = mu.time
|
31
|
+
|
32
|
+
if EnclosureContentTypes.include? mu.content_type
|
33
|
+
i.enclosure.url = mu.url
|
34
|
+
i.enclosure.type = mu.content_type
|
35
|
+
i.enclosure.length = mu.content_length
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
@body = feed
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
3
|
+
require 'rack'
|
4
|
+
|
5
|
+
require 'murlsh'
|
6
|
+
|
7
|
+
module Murlsh
|
8
|
+
|
9
|
+
# Serve RSS feed.
|
10
|
+
class RssServer
|
11
|
+
|
12
|
+
def initialize(config); @config = config; end
|
13
|
+
|
14
|
+
# Respond to a GET request for RSS feed.
|
15
|
+
def get(req)
|
16
|
+
conditions = Murlsh::SearchConditions.new(req['q']).conditions
|
17
|
+
page = 1
|
18
|
+
per_page = config.fetch('num_posts_feed', 25)
|
19
|
+
|
20
|
+
result_set = Murlsh::UrlResultSet.new(conditions, page, per_page)
|
21
|
+
urls = result_set.results
|
22
|
+
|
23
|
+
feed_url = URI.join(config.fetch('root_url'), 'rss.rss')
|
24
|
+
body = Murlsh::RssBody.new(config, req, feed_url, urls)
|
25
|
+
|
26
|
+
resp = Rack::Response.new(body, 200,
|
27
|
+
'Cache-Control' => 'must-revalidate, max-age=0',
|
28
|
+
'Content-Type' => 'application/rss+xml')
|
29
|
+
if u = body.updated
|
30
|
+
resp['Last-Modified'] = u.httpdate
|
31
|
+
end
|
32
|
+
resp
|
33
|
+
end
|
34
|
+
|
35
|
+
attr_reader :config
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -17,8 +17,8 @@ module Murlsh
|
|
17
17
|
likes = []
|
18
18
|
params = []
|
19
19
|
search_cols.product(tokens).each do |col,tok|
|
20
|
-
likes << "#{col} LIKE ?"
|
21
|
-
params << "%#{tok}%"
|
20
|
+
likes << "LOWER(#{col}) LIKE ?"
|
21
|
+
params << "%#{tok.downcase}%"
|
22
22
|
end
|
23
23
|
[likes.join(' OR ')].push(*params)
|
24
24
|
else
|
data/lib/murlsh/uri_ask.rb
CHANGED
@@ -17,14 +17,14 @@ module Murlsh
|
|
17
17
|
# Options:
|
18
18
|
# * :failproof - if true hide all exceptions and return empty string on failure
|
19
19
|
# * :headers - hash of headers to send in request
|
20
|
-
def content_length(options={}); header
|
20
|
+
def content_length(options={}); header('content-length', options); end
|
21
21
|
|
22
22
|
# Get the content type.
|
23
23
|
#
|
24
24
|
# Options:
|
25
25
|
# * :failproof - if true hide all exceptions and return empty string on failure
|
26
26
|
# * :headers - hash of headers to send in request
|
27
|
-
def content_type(options={}); header
|
27
|
+
def content_type(options={}); header('content-type', options); end
|
28
28
|
|
29
29
|
# Get the HTML title.
|
30
30
|
#
|
data/lib/murlsh/url_body.rb
CHANGED
@@ -5,7 +5,6 @@ module Murlsh
|
|
5
5
|
|
6
6
|
# Url list page builder.
|
7
7
|
class UrlBody < Builder::XmlMarkup
|
8
|
-
include Murlsh::BuildMd5
|
9
8
|
include Murlsh::Markup
|
10
9
|
|
11
10
|
def initialize(config, req, result_set, content_type='text/html')
|
@@ -44,18 +43,22 @@ module Murlsh
|
|
44
43
|
@body = html(:lang => 'en') {
|
45
44
|
headd
|
46
45
|
body {
|
47
|
-
|
46
|
+
menu
|
48
47
|
search_form
|
49
48
|
quick_search
|
50
49
|
ul(:id => 'urls') {
|
51
50
|
last = nil
|
52
51
|
|
53
52
|
@result_set.results.each do |mu|
|
53
|
+
Murlsh::Plugin.hooks('url_display_pre') do |p|
|
54
|
+
p.run mu, @req, @config
|
55
|
+
end
|
56
|
+
|
54
57
|
li {
|
55
58
|
unless mu.same_author?(last)
|
56
59
|
avatar_url = Murlsh::Plugin.hooks('avatar').inject(
|
57
60
|
nil) do |url_so_far,plugin|
|
58
|
-
plugin.run
|
61
|
+
plugin.run url_so_far, mu, @config
|
59
62
|
end
|
60
63
|
div(:class => 'icon') {
|
61
64
|
murlsh_img :src => avatar_url, :text => mu.name
|
@@ -119,6 +122,15 @@ module Murlsh
|
|
119
122
|
(@req['q'] ? " /#{@req['q']}" : ''))
|
120
123
|
end
|
121
124
|
|
125
|
+
# Menu builder.
|
126
|
+
def menu
|
127
|
+
self.p(:id => 'menu') {
|
128
|
+
home_link ; text! ' | '
|
129
|
+
feed_link ; text! ' | '
|
130
|
+
random_link
|
131
|
+
}
|
132
|
+
end
|
133
|
+
|
122
134
|
# Home link builder.
|
123
135
|
def home_link; a 'Home', :href => @config.fetch('root_url'); end
|
124
136
|
|
@@ -127,6 +139,9 @@ module Murlsh
|
|
127
139
|
a 'Feed', :href => @config.fetch('feed_file'), :class => 'feed'
|
128
140
|
end
|
129
141
|
|
142
|
+
# Random link builder.
|
143
|
+
def random_link; a 'Random', :href => 'random', :rel => 'nofollow'; end
|
144
|
+
|
130
145
|
# Quick search list builder.
|
131
146
|
def quick_search
|
132
147
|
if @config['quick_search']
|
@@ -148,7 +163,7 @@ module Murlsh
|
|
148
163
|
|
149
164
|
# Search form builder.
|
150
165
|
def search_form
|
151
|
-
form(:action => '', :method => 'get') {
|
166
|
+
form(:action => @config.fetch('root_url'), :method => 'get') {
|
152
167
|
fieldset {
|
153
168
|
form_input :id => 'q', :size => 32, :value => @req['q']
|
154
169
|
form_input :type => 'submit', :value => 'Search'
|
@@ -171,7 +186,7 @@ module Murlsh
|
|
171
186
|
|
172
187
|
# Url add form builder.
|
173
188
|
def add_form
|
174
|
-
form(:action => '', :method => 'post') {
|
189
|
+
form(:action => 'url', :method => 'post') {
|
175
190
|
fieldset(:id => 'add') {
|
176
191
|
self.p { form_input :id => 'url', :label => 'Add URL', :size => 32 }
|
177
192
|
self.p { form_input :id => 'via', :label => 'Via', :size => 32 }
|
@@ -191,7 +206,7 @@ module Murlsh
|
|
191
206
|
def powered_by
|
192
207
|
self.p {
|
193
208
|
text! 'Powered by '
|
194
|
-
a 'murlsh', :href => '
|
209
|
+
a 'murlsh', :href => 'https://github.com/mmb/murlsh'
|
195
210
|
}
|
196
211
|
end
|
197
212
|
|
@@ -23,14 +23,14 @@ module Murlsh
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def prev_page
|
26
|
-
unless instance_variable_defined?
|
26
|
+
unless instance_variable_defined?(:@prev_page)
|
27
27
|
@prev_page = page - 1 if (2..total_pages) === page
|
28
28
|
end
|
29
29
|
@prev_page
|
30
30
|
end
|
31
31
|
|
32
32
|
def next_page
|
33
|
-
unless instance_variable_defined?
|
33
|
+
unless instance_variable_defined?(:@next_page)
|
34
34
|
@next_page = page + 1 if page < total_pages
|
35
35
|
end
|
36
36
|
@next_page
|
data/lib/murlsh/url_server.rb
CHANGED
@@ -6,8 +6,6 @@ module Murlsh
|
|
6
6
|
# Build responses for HTTP requests.
|
7
7
|
class UrlServer
|
8
8
|
|
9
|
-
include HeadFromGet
|
10
|
-
|
11
9
|
def initialize(config); @config = config; end
|
12
10
|
|
13
11
|
# Respond to a GET request. Return a page of urls based on the query
|
@@ -16,28 +14,24 @@ module Murlsh
|
|
16
14
|
conditions = Murlsh::SearchConditions.new(req['q']).conditions
|
17
15
|
page = [req['p'].to_i, 1].max
|
18
16
|
per_page = req['pp'] ? req['pp'].to_i :
|
19
|
-
|
17
|
+
config.fetch('num_posts_page', 25)
|
20
18
|
|
19
|
+
content_type = 'text/html; charset=utf-8'
|
21
20
|
result_set = Murlsh::UrlResultSet.new(conditions, page, per_page)
|
22
21
|
|
23
|
-
|
24
|
-
|
25
|
-
resp['Content-Type'] = 'text/html; charset=utf-8'
|
26
|
-
resp.body = Murlsh::UrlBody.new(@config, req, result_set,
|
27
|
-
resp['Content-Type'])
|
22
|
+
body = Murlsh::UrlBody.new(config, req, result_set, content_type)
|
28
23
|
|
24
|
+
resp = Rack::Response.new
|
25
|
+
resp.write(body.build)
|
29
26
|
resp['Cache-Control'] = 'must-revalidate, max-age=0'
|
30
|
-
resp['
|
27
|
+
resp['Content-Type'] = content_type
|
31
28
|
|
32
29
|
resp
|
33
30
|
end
|
34
31
|
|
35
32
|
# Respond to a POST request. Add the new url and return json.
|
36
33
|
def post(req)
|
37
|
-
|
38
|
-
if user = auth.empty? ? nil : Murlsh::Auth.new(
|
39
|
-
@config.fetch('auth_file')).auth(auth)
|
40
|
-
|
34
|
+
if user = auth_from_req(req)
|
41
35
|
mu = Murlsh::Url.new do |u|
|
42
36
|
u.url = req['url']
|
43
37
|
u.email = user[:email]
|
@@ -45,7 +39,7 @@ module Murlsh
|
|
45
39
|
|
46
40
|
# optional parameters
|
47
41
|
unless req['thumbnail'].to_s.empty?
|
48
|
-
|
42
|
+
u.thumbnail_url = req['thumbnail']
|
49
43
|
end
|
50
44
|
|
51
45
|
u.time = if req['time']
|
@@ -65,9 +59,9 @@ module Murlsh
|
|
65
59
|
begin
|
66
60
|
# validate before add_pre plugins have run and also after (in save!)
|
67
61
|
raise ActiveRecord::RecordInvalid.new(mu) unless mu.valid?
|
68
|
-
Murlsh::Plugin.hooks('add_pre') { |p| p.run mu,
|
62
|
+
Murlsh::Plugin.hooks('add_pre') { |p| p.run mu, config }
|
69
63
|
mu.save!
|
70
|
-
Murlsh::Plugin.hooks('add_post') { |p| p.run mu,
|
64
|
+
Murlsh::Plugin.hooks('add_post') { |p| p.run mu, config }
|
71
65
|
response_body, response_code = [mu], 200
|
72
66
|
rescue ActiveRecord::RecordInvalid => error
|
73
67
|
response_body = {
|
@@ -84,6 +78,15 @@ module Murlsh
|
|
84
78
|
'Content-Type' => 'application/json' })
|
85
79
|
end
|
86
80
|
|
81
|
+
# Authorize a user from a request.
|
82
|
+
def auth_from_req(req)
|
83
|
+
secret = req['auth']
|
84
|
+
|
85
|
+
secret.to_s.empty? ? nil : Murlsh::Auth.new(
|
86
|
+
config.fetch('auth_file')).auth(secret)
|
87
|
+
end
|
88
|
+
|
89
|
+
attr_reader :config
|
87
90
|
end
|
88
91
|
|
89
92
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'murlsh'
|
2
|
+
|
3
|
+
module Murlsh
|
4
|
+
|
5
|
+
module_function
|
6
|
+
|
7
|
+
# Sort a hash by key and write it to a file as YAML.
|
8
|
+
def write_ordered_hash(h, path)
|
9
|
+
h.extend(Murlsh::YamlOrderedHash)
|
10
|
+
h.each_value do |v|
|
11
|
+
v.extend(Murlsh::YamlOrderedHash) if v.is_a?(Hash)
|
12
|
+
end
|
13
|
+
|
14
|
+
open(path, 'w') { |f| YAML.dump(h, f) }
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/lib/murlsh.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
require 'murlsh/head_from_get'
|
2
1
|
require 'murlsh/search_conditions'
|
3
2
|
|
3
|
+
require 'murlsh/atom_server'
|
4
4
|
require 'murlsh/ask'
|
5
5
|
require 'murlsh/auth'
|
6
|
-
require 'murlsh/build_md5'
|
7
6
|
require 'murlsh/build_query'
|
7
|
+
require 'murlsh/cat_files'
|
8
8
|
require 'murlsh/cp_r_safe'
|
9
9
|
require 'murlsh/delicious_parse'
|
10
10
|
require 'murlsh/dispatch'
|
@@ -12,16 +12,24 @@ require 'murlsh/doc'
|
|
12
12
|
require 'murlsh/etag_add_encoding'
|
13
13
|
require 'murlsh/failproof'
|
14
14
|
require 'murlsh/far_future_expires'
|
15
|
+
require 'murlsh/feed_body'
|
15
16
|
require 'murlsh/image_list'
|
16
17
|
require 'murlsh/img_store'
|
17
18
|
require 'murlsh/install'
|
18
19
|
require 'murlsh/json_body'
|
19
20
|
require 'murlsh/json_server'
|
20
21
|
require 'murlsh/jsonp_body'
|
22
|
+
require 'murlsh/m3u_body'
|
23
|
+
require 'murlsh/m3u_server'
|
21
24
|
require 'murlsh/markup'
|
22
25
|
require 'murlsh/must_revalidate'
|
23
26
|
require 'murlsh/openlock'
|
27
|
+
require 'murlsh/podcast_server'
|
24
28
|
require 'murlsh/plugin'
|
29
|
+
require 'murlsh/pop_server'
|
30
|
+
require 'murlsh/random_server'
|
31
|
+
require 'murlsh/rss_body'
|
32
|
+
require 'murlsh/rss_server'
|
25
33
|
require 'murlsh/search_grammar'
|
26
34
|
require 'murlsh/time_ago'
|
27
35
|
require 'murlsh/uri_ask'
|
@@ -31,4 +39,7 @@ require 'murlsh/url_body'
|
|
31
39
|
require 'murlsh/url'
|
32
40
|
require 'murlsh/url_result_set'
|
33
41
|
require 'murlsh/url_server'
|
42
|
+
require 'murlsh/write_ordered_hash'
|
34
43
|
require 'murlsh/yaml_ordered_hash'
|
44
|
+
|
45
|
+
require 'murlsh/atom_body'
|
data/murlsh.gemspec
CHANGED
@@ -1,201 +1,48 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
1
|
# -*- encoding: utf-8 -*-
|
5
2
|
|
6
3
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version =
|
4
|
+
s.name = 'murlsh'
|
5
|
+
s.version = '1.5.0'
|
6
|
+
s.summary = 'Host your bookmarks or maintain a link blog'
|
7
|
+
s.description = s.summary
|
8
|
+
s.homepage = 'https://github.com/mmb/murlsh'
|
9
|
+
s.authors = ['Matthew M. Boedicker']
|
10
|
+
s.email = %w{matthewm@boedicker.org}
|
9
11
|
|
10
|
-
s.required_rubygems_version =
|
11
|
-
s.authors = ["Matthew M. Boedicker"]
|
12
|
-
s.date = %q{2011-02-01}
|
13
|
-
s.default_executable = %q{murlsh}
|
14
|
-
s.description = %q{Host your bookmarks or maintain a link blog}
|
15
|
-
s.email = %q{matthewm@boedicker.org}
|
16
|
-
s.executables = ["murlsh"]
|
17
|
-
s.extra_rdoc_files = [
|
18
|
-
"README.textile"
|
19
|
-
]
|
20
|
-
s.files = [
|
21
|
-
".htaccess",
|
22
|
-
"COPYING",
|
23
|
-
"README.textile",
|
24
|
-
"Rakefile",
|
25
|
-
"VERSION",
|
26
|
-
"bin/murlsh",
|
27
|
-
"config.ru",
|
28
|
-
"config.yaml",
|
29
|
-
"lib/murlsh.rb",
|
30
|
-
"lib/murlsh/ask.rb",
|
31
|
-
"lib/murlsh/auth.rb",
|
32
|
-
"lib/murlsh/build_md5.rb",
|
33
|
-
"lib/murlsh/build_query.rb",
|
34
|
-
"lib/murlsh/cp_r_safe.rb",
|
35
|
-
"lib/murlsh/delicious_parse.rb",
|
36
|
-
"lib/murlsh/dispatch.rb",
|
37
|
-
"lib/murlsh/doc.rb",
|
38
|
-
"lib/murlsh/etag_add_encoding.rb",
|
39
|
-
"lib/murlsh/failproof.rb",
|
40
|
-
"lib/murlsh/far_future_expires.rb",
|
41
|
-
"lib/murlsh/head_from_get.rb",
|
42
|
-
"lib/murlsh/image_list.rb",
|
43
|
-
"lib/murlsh/img_store.rb",
|
44
|
-
"lib/murlsh/install.rb",
|
45
|
-
"lib/murlsh/json_body.rb",
|
46
|
-
"lib/murlsh/json_server.rb",
|
47
|
-
"lib/murlsh/jsonp_body.rb",
|
48
|
-
"lib/murlsh/markup.rb",
|
49
|
-
"lib/murlsh/must_revalidate.rb",
|
50
|
-
"lib/murlsh/openlock.rb",
|
51
|
-
"lib/murlsh/plugin.rb",
|
52
|
-
"lib/murlsh/search_conditions.rb",
|
53
|
-
"lib/murlsh/search_grammar.rb",
|
54
|
-
"lib/murlsh/search_grammar.treetop",
|
55
|
-
"lib/murlsh/time_ago.rb",
|
56
|
-
"lib/murlsh/uri_ask.rb",
|
57
|
-
"lib/murlsh/uri_domain.rb",
|
58
|
-
"lib/murlsh/uri_get_path_query.rb",
|
59
|
-
"lib/murlsh/url.rb",
|
60
|
-
"lib/murlsh/url_body.rb",
|
61
|
-
"lib/murlsh/url_result_set.rb",
|
62
|
-
"lib/murlsh/url_server.rb",
|
63
|
-
"lib/murlsh/yaml_ordered_hash.rb",
|
64
|
-
"murlsh.gemspec",
|
65
|
-
"plugins/add_post_50_update_feed.rb",
|
66
|
-
"plugins/add_post_50_update_m3u.rb",
|
67
|
-
"plugins/add_post_50_update_podcast.rb",
|
68
|
-
"plugins/add_post_50_update_rss.rb",
|
69
|
-
"plugins/add_post_60_notify_hubs.rb",
|
70
|
-
"plugins/add_pre_30_unajax_twitter.rb",
|
71
|
-
"plugins/add_pre_35_url_clean.rb",
|
72
|
-
"plugins/add_pre_40_convert_mobile.rb",
|
73
|
-
"plugins/add_pre_45_supplied_thumbnail.rb",
|
74
|
-
"plugins/add_pre_50_lookup_content_type_title.rb",
|
75
|
-
"plugins/add_pre_50_media_thumbnail.rb",
|
76
|
-
"plugins/add_pre_50_open_graph_image.rb",
|
77
|
-
"plugins/add_pre_60_github_title.rb",
|
78
|
-
"plugins/add_pre_60_google_code_title.rb",
|
79
|
-
"plugins/add_pre_60_imgur.rb",
|
80
|
-
"plugins/add_pre_60_s3_image.rb",
|
81
|
-
"plugins/add_pre_60_twitter.rb",
|
82
|
-
"plugins/add_pre_65_html_thumb.rb",
|
83
|
-
"plugins/add_pre_65_img_thumb.rb",
|
84
|
-
"plugins/avatar_50_gravatar.rb",
|
85
|
-
"plugins/url_display_add_45_audio.rb",
|
86
|
-
"plugins/url_display_add_50_hostrec.rb",
|
87
|
-
"plugins/url_display_add_55_content_type.rb",
|
88
|
-
"plugins/url_display_add_60_via.rb",
|
89
|
-
"plugins/url_display_add_65_time.rb",
|
90
|
-
"public/css/jquery.jgrowl.css",
|
91
|
-
"public/css/screen.css",
|
92
|
-
"public/img/thumb/.gitignore",
|
93
|
-
"public/js/jquery-1.5.min.js",
|
94
|
-
"public/js/jquery.jgrowl_compressed.js",
|
95
|
-
"public/js/js.js",
|
96
|
-
"public/js/twitter-text-1.3.1.js",
|
97
|
-
"spec/auth_spec.rb",
|
98
|
-
"spec/dispatch_spec.rb",
|
99
|
-
"spec/doc_spec.rb",
|
100
|
-
"spec/img_store_spec.rb",
|
101
|
-
"spec/markup_spec.rb",
|
102
|
-
"spec/uri_ask_spec.rb",
|
103
|
-
"spec/uri_domain_spec.rb",
|
104
|
-
"spec/url_spec.rb",
|
105
|
-
"spec/yaml_ordered_hash_spec.rb"
|
106
|
-
]
|
107
|
-
s.homepage = %q{http://github.com/mmb/murlsh}
|
108
|
-
s.require_paths = ["lib"]
|
109
|
-
s.rubygems_version = %q{1.4.2}
|
110
|
-
s.summary = %q{Host your bookmarks or maintain a link blog}
|
111
|
-
s.test_files = [
|
112
|
-
"spec/auth_spec.rb",
|
113
|
-
"spec/dispatch_spec.rb",
|
114
|
-
"spec/doc_spec.rb",
|
115
|
-
"spec/img_store_spec.rb",
|
116
|
-
"spec/markup_spec.rb",
|
117
|
-
"spec/uri_ask_spec.rb",
|
118
|
-
"spec/uri_domain_spec.rb",
|
119
|
-
"spec/url_spec.rb",
|
120
|
-
"spec/yaml_ordered_hash_spec.rb"
|
121
|
-
]
|
12
|
+
s.required_rubygems_version = '>= 1.3.6'
|
122
13
|
|
123
|
-
|
124
|
-
|
14
|
+
%w{
|
15
|
+
activerecord >= 2.3.4
|
16
|
+
aws-s3 ~> 0.6
|
17
|
+
bcrypt-ruby >= 2.1.2
|
18
|
+
builder > 0
|
19
|
+
htmlentities >= 4.2.0
|
20
|
+
json >= 1.2.3
|
21
|
+
nokogiri ~> 1.0
|
22
|
+
plumnailer >= 0.1.3
|
23
|
+
postrank-uri ~> 1.0
|
24
|
+
public_suffix_service ~> 0.0
|
25
|
+
push-notify >= 0.1.0
|
26
|
+
rack >= 1.0.0
|
27
|
+
rack-cache >= 0.5.2
|
28
|
+
rack-rewrite >= 1.0.2
|
29
|
+
rack-throttle >= 0.3.0
|
30
|
+
rmagick >= 1.15.14
|
31
|
+
rmail ~> 1.0
|
32
|
+
sqlite3 ~> 1.3
|
33
|
+
tinyatom >= 0.3.4
|
34
|
+
treetop ~> 1.4
|
35
|
+
twitter >= 0.9.12
|
36
|
+
}.each_slice(3) { |g,o,v| s.add_dependency(g, "#{o} #{v}") }
|
125
37
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
s.add_runtime_dependency(%q<nokogiri>, ["~> 1.0"])
|
133
|
-
s.add_runtime_dependency(%q<plumnailer>, [">= 0.1.0"])
|
134
|
-
s.add_runtime_dependency(%q<postrank-uri>, ["~> 1.0"])
|
135
|
-
s.add_runtime_dependency(%q<public_suffix_service>, ["~> 0.0"])
|
136
|
-
s.add_runtime_dependency(%q<push-notify>, [">= 0.1.0"])
|
137
|
-
s.add_runtime_dependency(%q<rack>, [">= 1.0.0"])
|
138
|
-
s.add_runtime_dependency(%q<rack-cache>, [">= 0.5.2"])
|
139
|
-
s.add_runtime_dependency(%q<rack-rewrite>, [">= 1.0.2"])
|
140
|
-
s.add_runtime_dependency(%q<rack-throttle>, [">= 0.3.0"])
|
141
|
-
s.add_runtime_dependency(%q<rmagick>, [">= 1.15.14"])
|
142
|
-
s.add_runtime_dependency(%q<sqlite3>, ["~> 1.3"])
|
143
|
-
s.add_runtime_dependency(%q<tinyatom>, [">= 0.3.3"])
|
144
|
-
s.add_runtime_dependency(%q<treetop>, ["~> 1.4"])
|
145
|
-
s.add_runtime_dependency(%q<twitter>, [">= 0.9.12"])
|
146
|
-
s.add_development_dependency(%q<fakeweb>, ["~> 1.3"])
|
147
|
-
s.add_development_dependency(%q<flog>, [">= 2.5.0"])
|
148
|
-
s.add_development_dependency(%q<rack-test>, ["~> 0.5"])
|
149
|
-
s.add_development_dependency(%q<rspec>, ["~> 2.0"])
|
150
|
-
else
|
151
|
-
s.add_dependency(%q<activerecord>, [">= 2.3.4"])
|
152
|
-
s.add_dependency(%q<bcrypt-ruby>, [">= 2.1.2"])
|
153
|
-
s.add_dependency(%q<builder>, [">= 2.1.2"])
|
154
|
-
s.add_dependency(%q<htmlentities>, [">= 4.2.0"])
|
155
|
-
s.add_dependency(%q<json>, [">= 1.2.3"])
|
156
|
-
s.add_dependency(%q<nokogiri>, ["~> 1.0"])
|
157
|
-
s.add_dependency(%q<plumnailer>, [">= 0.1.0"])
|
158
|
-
s.add_dependency(%q<postrank-uri>, ["~> 1.0"])
|
159
|
-
s.add_dependency(%q<public_suffix_service>, ["~> 0.0"])
|
160
|
-
s.add_dependency(%q<push-notify>, [">= 0.1.0"])
|
161
|
-
s.add_dependency(%q<rack>, [">= 1.0.0"])
|
162
|
-
s.add_dependency(%q<rack-cache>, [">= 0.5.2"])
|
163
|
-
s.add_dependency(%q<rack-rewrite>, [">= 1.0.2"])
|
164
|
-
s.add_dependency(%q<rack-throttle>, [">= 0.3.0"])
|
165
|
-
s.add_dependency(%q<rmagick>, [">= 1.15.14"])
|
166
|
-
s.add_dependency(%q<sqlite3>, ["~> 1.3"])
|
167
|
-
s.add_dependency(%q<tinyatom>, [">= 0.3.3"])
|
168
|
-
s.add_dependency(%q<treetop>, ["~> 1.4"])
|
169
|
-
s.add_dependency(%q<twitter>, [">= 0.9.12"])
|
170
|
-
s.add_dependency(%q<fakeweb>, ["~> 1.3"])
|
171
|
-
s.add_dependency(%q<flog>, [">= 2.5.0"])
|
172
|
-
s.add_dependency(%q<rack-test>, ["~> 0.5"])
|
173
|
-
s.add_dependency(%q<rspec>, ["~> 2.0"])
|
174
|
-
end
|
175
|
-
else
|
176
|
-
s.add_dependency(%q<activerecord>, [">= 2.3.4"])
|
177
|
-
s.add_dependency(%q<bcrypt-ruby>, [">= 2.1.2"])
|
178
|
-
s.add_dependency(%q<builder>, [">= 2.1.2"])
|
179
|
-
s.add_dependency(%q<htmlentities>, [">= 4.2.0"])
|
180
|
-
s.add_dependency(%q<json>, [">= 1.2.3"])
|
181
|
-
s.add_dependency(%q<nokogiri>, ["~> 1.0"])
|
182
|
-
s.add_dependency(%q<plumnailer>, [">= 0.1.0"])
|
183
|
-
s.add_dependency(%q<postrank-uri>, ["~> 1.0"])
|
184
|
-
s.add_dependency(%q<public_suffix_service>, ["~> 0.0"])
|
185
|
-
s.add_dependency(%q<push-notify>, [">= 0.1.0"])
|
186
|
-
s.add_dependency(%q<rack>, [">= 1.0.0"])
|
187
|
-
s.add_dependency(%q<rack-cache>, [">= 0.5.2"])
|
188
|
-
s.add_dependency(%q<rack-rewrite>, [">= 1.0.2"])
|
189
|
-
s.add_dependency(%q<rack-throttle>, [">= 0.3.0"])
|
190
|
-
s.add_dependency(%q<rmagick>, [">= 1.15.14"])
|
191
|
-
s.add_dependency(%q<sqlite3>, ["~> 1.3"])
|
192
|
-
s.add_dependency(%q<tinyatom>, [">= 0.3.3"])
|
193
|
-
s.add_dependency(%q<treetop>, ["~> 1.4"])
|
194
|
-
s.add_dependency(%q<twitter>, [">= 0.9.12"])
|
195
|
-
s.add_dependency(%q<fakeweb>, ["~> 1.3"])
|
196
|
-
s.add_dependency(%q<flog>, [">= 2.5.0"])
|
197
|
-
s.add_dependency(%q<rack-test>, ["~> 0.5"])
|
198
|
-
s.add_dependency(%q<rspec>, ["~> 2.0"])
|
199
|
-
end
|
200
|
-
end
|
38
|
+
%w{
|
39
|
+
fakeweb ~> 1.3
|
40
|
+
flog >= 2.5.0
|
41
|
+
rack-test ~> 0.5
|
42
|
+
rspec ~> 2.0
|
43
|
+
}.each_slice(3) { |g,o,v| s.add_development_dependency(g, "#{o} #{v}") }
|
201
44
|
|
45
|
+
s.files = `git ls-files`.split("\n")
|
46
|
+
s.test_files = `git ls-files spec/*`.split("\n")
|
47
|
+
s.executables = %w{murlsh}
|
48
|
+
end
|
@@ -15,9 +15,10 @@ module Murlsh
|
|
15
15
|
unless hubs.empty?
|
16
16
|
require 'push-notify'
|
17
17
|
|
18
|
-
feed_url = URI.join(config
|
18
|
+
feed_url = URI.join(config.fetch('root_url'), config.fetch('feed_file'))
|
19
19
|
begin
|
20
|
-
PushNotify::Content.new(feed_url).tell(
|
20
|
+
PushNotify::Content.new(feed_url).tell(
|
21
|
+
*hubs.map { |h| h.fetch('publish_url') })
|
21
22
|
rescue Exception
|
22
23
|
end
|
23
24
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Murlsh
|
2
|
+
|
3
|
+
# Shortcuts for user-specified thumbnail urls.
|
4
|
+
#
|
5
|
+
# These keys can be passed in as the 'thumbnail' parameter when adding a url
|
6
|
+
# and they will be converted to the corresponding url.
|
7
|
+
class AddPre40ThumbnailShortcuts < Plugin
|
8
|
+
|
9
|
+
@hook = 'add_pre'
|
10
|
+
|
11
|
+
Shortcuts = {
|
12
|
+
# 'trollin' => 'http://imagehost.com/trollface.jpg',
|
13
|
+
}
|
14
|
+
|
15
|
+
def self.run(url, config)
|
16
|
+
if Shortcuts.key?(url.thumbnail_url)
|
17
|
+
url.thumbnail_url = Shortcuts[url.thumbnail_url]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|