murlsh 1.4.1 → 1.5.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.
- 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
|