murlsh 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +1 -0
- data/Rakefile +2 -1
- data/VERSION +1 -1
- data/config.ru +3 -0
- data/lib/murlsh/build_query.rb +10 -0
- data/lib/murlsh/dispatch.rb +18 -12
- data/lib/murlsh/doc.rb +1 -1
- data/lib/murlsh/markup.rb +0 -27
- data/lib/murlsh/plugin.rb +2 -0
- data/lib/murlsh/uri_ask.rb +4 -3
- data/lib/murlsh/uri_domain.rb +22 -0
- data/lib/murlsh/uri_get_path_query.rb +11 -0
- data/lib/murlsh/url.rb +7 -0
- data/lib/murlsh/url_body.rb +9 -7
- data/lib/murlsh/url_server.rb +3 -8
- data/lib/murlsh.rb +3 -1
- data/murlsh.gemspec +17 -10
- data/plugins/add_post_50_update_feed.rb +1 -1
- data/plugins/add_pre_50_lookup_content_type_title.rb +3 -4
- data/plugins/add_pre_50_media_thumbnail.rb +36 -0
- data/plugins/add_pre_50_open_graph_image.rb +36 -0
- data/plugins/add_pre_60_github_title.rb +3 -2
- data/plugins/add_pre_60_google_code_title.rb +3 -4
- data/plugins/avatar_50_gravatar.rb +22 -0
- data/plugins/html_parse_50_nokogiri.rb +16 -0
- data/plugins/url_display_add_50_hostrec.rb +4 -1
- data/plugins/url_display_add_60_via.rb +1 -1
- data/spec/doc_spec.rb +3 -3
- data/spec/markup_spec.rb +0 -48
- data/spec/uri_ask_spec.rb +1 -1
- data/spec/uri_domain_spec.rb +22 -0
- metadata +67 -49
- data/lib/murlsh/uri.rb +0 -16
- data/plugins/add_pre_60_youtube.rb +0 -32
- data/plugins/html_parse_50_hpricot.rb +0 -19
- data/spec/uri_spec.rb +0 -14
data/README.textile
CHANGED
@@ -56,6 +56,7 @@ Plugin hooks
|
|
56
56
|
|Hook|Description|run() arguments|Returns|
|
57
57
|
|add_pre|called before a new url is saved|url, config hash|undefined|
|
58
58
|
|add_post|called after a new url is saved|url, config hash|undefined|
|
59
|
+
|avatar|called to get an avatar url from an email md5 sum|avatar url, url, config hash|avatar url|
|
59
60
|
|html_parse|parse HTML using something like Hpricot or Nokogiri|parseable|parsed HTML, only first plugin is run (cannot be chained)|
|
60
61
|
|url_display_add|called to display additional information after urls|markup builder, url, config hash|undefined|
|
61
62
|
|
data/Rakefile
CHANGED
@@ -404,10 +404,11 @@ begin
|
|
404
404
|
bcrypt-ruby >= 2.1.2
|
405
405
|
builder >= 2.1.2
|
406
406
|
flickraw >= 0.8.3
|
407
|
-
hpricot >= 0.8.1
|
408
407
|
htmlentities >= 4.2.0
|
409
408
|
json >= 1.2.3
|
409
|
+
nokogiri ~> 1.0
|
410
410
|
plumnailer >= 0.1.0
|
411
|
+
public_suffix_service ~> 0.0
|
411
412
|
push-notify >= 0.1.0
|
412
413
|
rack >= 1.0.0
|
413
414
|
rack-cache >= 0.5.2
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0
|
data/config.ru
CHANGED
data/lib/murlsh/dispatch.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
1
3
|
require 'active_record'
|
2
4
|
require 'rack'
|
3
5
|
|
@@ -12,29 +14,32 @@ module Murlsh
|
|
12
14
|
def initialize(config)
|
13
15
|
@config = config
|
14
16
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
db = ActiveRecord::Base.connection.instance_variable_get(:@connection)
|
20
|
-
|
21
|
-
url_server = Murlsh::UrlServer.new(@config, db)
|
22
|
-
config_server = Murlsh::ConfigServer.new(@config)
|
23
|
-
|
24
|
-
root_path = URI(@config.fetch('root_url')).path
|
17
|
+
url_server = Murlsh::UrlServer.new(config)
|
18
|
+
config_server = Murlsh::ConfigServer.new(config)
|
19
|
+
root_path = URI(config.fetch('root_url')).path
|
25
20
|
|
26
|
-
@
|
21
|
+
@routes = [
|
27
22
|
[%r{^HEAD #{root_path}(url)?$}, url_server.method(:head)],
|
28
23
|
[%r{^GET #{root_path}(url)?$}, url_server.method(:get)],
|
29
24
|
[%r{^POST #{root_path}(url)?$}, url_server.method(:post)],
|
30
25
|
[%r{^HEAD #{root_path}config$}, config_server.method(:head)],
|
31
26
|
[%r{^GET #{root_path}config$}, config_server.method(:get)],
|
32
27
|
]
|
28
|
+
|
29
|
+
db_init
|
30
|
+
end
|
31
|
+
|
32
|
+
def db_init
|
33
|
+
ActiveRecord::Base.establish_connection(
|
34
|
+
:adapter => 'sqlite3', :database => @config.fetch('db_file'))
|
35
|
+
|
36
|
+
ActiveRecord::Base.default_timezone = :utc
|
37
|
+
ActiveRecord::Base.include_root_in_json = false
|
33
38
|
end
|
34
39
|
|
35
40
|
# Figure out which method will handle request.
|
36
41
|
def dispatch(req)
|
37
|
-
method_match =
|
42
|
+
method_match = routes.find do |rule|
|
38
43
|
rule[0].match("#{req.request_method} #{req.path}")
|
39
44
|
end
|
40
45
|
|
@@ -56,6 +61,7 @@ module Murlsh
|
|
56
61
|
404, { 'Content-Type' => 'text/html' }
|
57
62
|
end
|
58
63
|
|
64
|
+
attr_accessor :routes
|
59
65
|
end
|
60
66
|
|
61
67
|
end
|
data/lib/murlsh/doc.rb
CHANGED
data/lib/murlsh/markup.rb
CHANGED
@@ -65,33 +65,6 @@ module Murlsh
|
|
65
65
|
tags.each { |k,v| meta :name => k, :content => v }
|
66
66
|
end
|
67
67
|
|
68
|
-
# Gravatar builder. Takes MD5 hash of email address.
|
69
|
-
# Options:
|
70
|
-
# * 'd' - default Gravatar (identicon, monsterid, or wavatar)
|
71
|
-
# * 's' - size (0 - 512)
|
72
|
-
# * 'r' - rating (g, pg, r or x)
|
73
|
-
def gravatar(email_hash, options={})
|
74
|
-
query = options.reject do |k,v|
|
75
|
-
not ((k == 'd' and %w{identicon monsterid wavatar}.include?(v)) or
|
76
|
-
(k =='s' and (0..512).include?(v)) or
|
77
|
-
(k == 'r' and %w{g pg r x}.include?(v)))
|
78
|
-
end
|
79
|
-
|
80
|
-
return if query['s'] and query['s'] < 1
|
81
|
-
|
82
|
-
options.reject! { |k,v| %w{d s r}.include? k }
|
83
|
-
options[:src] = URI.join('http://www.gravatar.com/avatar/',
|
84
|
-
email_hash + build_query(query))
|
85
|
-
|
86
|
-
murlsh_img options
|
87
|
-
end
|
88
|
-
|
89
|
-
# Query string builder. Takes hash of query string variables.
|
90
|
-
def build_query(h)
|
91
|
-
h.empty? ? '' :
|
92
|
-
'?' + h.map { |k,v| URI.escape "#{k}=#{v}" }.join('&')
|
93
|
-
end
|
94
|
-
|
95
68
|
# Form input builder.
|
96
69
|
def form_input(options)
|
97
70
|
if options[:id]
|
data/lib/murlsh/plugin.rb
CHANGED
@@ -7,6 +7,8 @@ module Murlsh
|
|
7
7
|
# run arguments (url, config hash)
|
8
8
|
# * add_post - called after a new url is saved
|
9
9
|
# run arguments (config hash)
|
10
|
+
# * avatar - called to get an avatar url from an email md5 sum
|
11
|
+
# run arguments (avatar url, url, config hash)
|
10
12
|
# * html_parse - called to parse HTML using something like Hpricot or Nokogiri
|
11
13
|
# run arguments (parseable)
|
12
14
|
# * url_display_add - called to display additional information after urls
|
data/lib/murlsh/uri_ask.rb
CHANGED
@@ -3,7 +3,7 @@ require 'net/https'
|
|
3
3
|
require 'open-uri'
|
4
4
|
require 'uri'
|
5
5
|
|
6
|
-
require '
|
6
|
+
require 'nokogiri'
|
7
7
|
require 'htmlentities'
|
8
8
|
require 'iconv'
|
9
9
|
|
@@ -80,7 +80,7 @@ module Murlsh
|
|
80
80
|
self.open(options[:headers]) do |f|
|
81
81
|
html_parse_plugins = Murlsh::Plugin.hooks('html_parse')
|
82
82
|
@doc = if html_parse_plugins.empty?
|
83
|
-
|
83
|
+
Nokogiri(f).extend(Murlsh::Doc)
|
84
84
|
else
|
85
85
|
html_parse_plugins.first.run(f).extend(Murlsh::Doc)
|
86
86
|
end
|
@@ -145,7 +145,8 @@ module Murlsh
|
|
145
145
|
http = Net::HTTP.new(host, port)
|
146
146
|
http.use_ssl = (scheme == 'https')
|
147
147
|
|
148
|
-
|
148
|
+
extend(Murlsh::URIGetPathQuery)
|
149
|
+
resp = http.request_head(get_path_query, request_headers)
|
149
150
|
|
150
151
|
if Net::HTTPSuccess === resp
|
151
152
|
response_headers = resp.to_hash
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'public_suffix_service'
|
2
|
+
|
3
|
+
require 'murlsh'
|
4
|
+
|
5
|
+
# URI mixin that adds method to get domain.
|
6
|
+
module Murlsh
|
7
|
+
|
8
|
+
module URIDomain
|
9
|
+
|
10
|
+
# Return the domain.
|
11
|
+
def domain
|
12
|
+
if host
|
13
|
+
Murlsh::failproof do
|
14
|
+
parsed = PublicSuffixService.parse(host.downcase)
|
15
|
+
"#{parsed.sld}.#{parsed.tld}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
data/lib/murlsh/url.rb
CHANGED
data/lib/murlsh/url_body.rb
CHANGED
@@ -6,9 +6,9 @@ module Murlsh
|
|
6
6
|
class UrlBody < Builder::XmlMarkup
|
7
7
|
include Murlsh::Markup
|
8
8
|
|
9
|
-
def initialize(config,
|
10
|
-
@config, @
|
11
|
-
config,
|
9
|
+
def initialize(config, req, content_type='text/html')
|
10
|
+
@config, @req, @q, @content_type =
|
11
|
+
config, req, req.params['q'], content_type
|
12
12
|
super(:indent => @config['html_indent'] || 0)
|
13
13
|
end
|
14
14
|
|
@@ -40,15 +40,17 @@ module Murlsh
|
|
40
40
|
ul(:id => 'urls') {
|
41
41
|
li { feed_icon ; search_form }
|
42
42
|
|
43
|
-
gravatar_size = @config.fetch('gravatar_size', 0)
|
44
|
-
|
45
43
|
last = nil
|
46
44
|
urls.each do |mu|
|
47
45
|
li {
|
48
46
|
unless mu.same_author?(last)
|
47
|
+
avatar_url = Murlsh::Plugin.hooks('avatar').inject(
|
48
|
+
nil) do |url_so_far,plugin|
|
49
|
+
plugin.run(url_so_far, mu, @config)
|
50
|
+
end
|
49
51
|
div(:class => 'icon') {
|
50
|
-
|
51
|
-
} if
|
52
|
+
murlsh_img :src => avatar_url, :text => mu.name
|
53
|
+
} if avatar_url
|
52
54
|
div(mu.name, :class => 'name') if
|
53
55
|
@config.fetch('show_names', false) and mu.name
|
54
56
|
end
|
data/lib/murlsh/url_server.rb
CHANGED
@@ -8,11 +8,8 @@ module Murlsh
|
|
8
8
|
|
9
9
|
include HeadFromGet
|
10
10
|
|
11
|
-
def initialize(config
|
12
|
-
@config
|
13
|
-
ActiveRecord::Base.default_timezone = :utc
|
14
|
-
|
15
|
-
Dir['plugins/*.rb'].each { |p| load p }
|
11
|
+
def initialize(config)
|
12
|
+
@config = config
|
16
13
|
end
|
17
14
|
|
18
15
|
# Respond to a GET request. Return a page of urls based on the query
|
@@ -27,7 +24,7 @@ module Murlsh
|
|
27
24
|
resp['ETag'] = "W/\"#{last_db_update.to_i}#{req.params.sort}\""
|
28
25
|
resp['Last-Modified'] = last_db_update.httpdate
|
29
26
|
|
30
|
-
resp.body = Murlsh::UrlBody.new(@config,
|
27
|
+
resp.body = Murlsh::UrlBody.new(@config, req, resp['Content-Type'])
|
31
28
|
|
32
29
|
resp
|
33
30
|
end
|
@@ -37,8 +34,6 @@ module Murlsh
|
|
37
34
|
auth = req.params['auth']
|
38
35
|
if user = auth.empty? ? nil : Murlsh::Auth.new(
|
39
36
|
@config.fetch('auth_file')).auth(auth)
|
40
|
-
ActiveRecord::Base.establish_connection :adapter => 'sqlite3',
|
41
|
-
:database => @config.fetch('db_file')
|
42
37
|
|
43
38
|
mu = Murlsh::Url.new do |u|
|
44
39
|
u.time = Time.now.gmtime
|
data/lib/murlsh.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'murlsh/head_from_get'
|
2
2
|
|
3
3
|
require 'murlsh/auth'
|
4
|
+
require 'murlsh/build_query'
|
4
5
|
require 'murlsh/config_server'
|
5
6
|
require 'murlsh/dispatch'
|
6
7
|
require 'murlsh/doc'
|
@@ -16,7 +17,8 @@ require 'murlsh/plugin'
|
|
16
17
|
require 'murlsh/sqlite3_adapter'
|
17
18
|
require 'murlsh/time_ago'
|
18
19
|
require 'murlsh/uri_ask'
|
19
|
-
require 'murlsh/
|
20
|
+
require 'murlsh/uri_domain'
|
21
|
+
require 'murlsh/uri_get_path_query'
|
20
22
|
require 'murlsh/url_body'
|
21
23
|
require 'murlsh/url'
|
22
24
|
require 'murlsh/url_server'
|
data/murlsh.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{murlsh}
|
8
|
-
s.version = "1.
|
8
|
+
s.version = "1.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Matthew M. Boedicker"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-12-16}
|
13
13
|
s.default_executable = %q{murlsh}
|
14
14
|
s.description = %q{url sharing site framework with easy adding, title lookup, atom feed, thumbnails and embedding}
|
15
15
|
s.email = %q{matthewm@boedicker.org}
|
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
|
|
28
28
|
"config.yaml",
|
29
29
|
"lib/murlsh.rb",
|
30
30
|
"lib/murlsh/auth.rb",
|
31
|
+
"lib/murlsh/build_query.rb",
|
31
32
|
"lib/murlsh/config_server.rb",
|
32
33
|
"lib/murlsh/dispatch.rb",
|
33
34
|
"lib/murlsh/doc.rb",
|
@@ -43,8 +44,9 @@ Gem::Specification.new do |s|
|
|
43
44
|
"lib/murlsh/plugin.rb",
|
44
45
|
"lib/murlsh/sqlite3_adapter.rb",
|
45
46
|
"lib/murlsh/time_ago.rb",
|
46
|
-
"lib/murlsh/uri.rb",
|
47
47
|
"lib/murlsh/uri_ask.rb",
|
48
|
+
"lib/murlsh/uri_domain.rb",
|
49
|
+
"lib/murlsh/uri_get_path_query.rb",
|
48
50
|
"lib/murlsh/url.rb",
|
49
51
|
"lib/murlsh/url_body.rb",
|
50
52
|
"lib/murlsh/url_server.rb",
|
@@ -56,6 +58,8 @@ Gem::Specification.new do |s|
|
|
56
58
|
"plugins/add_post_60_notify_hubs.rb",
|
57
59
|
"plugins/add_pre_40_convert_mobile.rb",
|
58
60
|
"plugins/add_pre_50_lookup_content_type_title.rb",
|
61
|
+
"plugins/add_pre_50_media_thumbnail.rb",
|
62
|
+
"plugins/add_pre_50_open_graph_image.rb",
|
59
63
|
"plugins/add_pre_60_flickr.rb",
|
60
64
|
"plugins/add_pre_60_github_title.rb",
|
61
65
|
"plugins/add_pre_60_google_code_title.rb",
|
@@ -63,10 +67,10 @@ Gem::Specification.new do |s|
|
|
63
67
|
"plugins/add_pre_60_s3_image.rb",
|
64
68
|
"plugins/add_pre_60_twitter.rb",
|
65
69
|
"plugins/add_pre_60_vimeo.rb",
|
66
|
-
"plugins/add_pre_60_youtube.rb",
|
67
70
|
"plugins/add_pre_65_html_thumb.rb",
|
68
71
|
"plugins/add_pre_65_img_thumb.rb",
|
69
|
-
"plugins/
|
72
|
+
"plugins/avatar_50_gravatar.rb",
|
73
|
+
"plugins/html_parse_50_nokogiri.rb",
|
70
74
|
"plugins/url_display_add_45_audio.rb",
|
71
75
|
"plugins/url_display_add_50_hostrec.rb",
|
72
76
|
"plugins/url_display_add_55_content_type.rb",
|
@@ -86,7 +90,7 @@ Gem::Specification.new do |s|
|
|
86
90
|
"spec/img_store_spec.rb",
|
87
91
|
"spec/markup_spec.rb",
|
88
92
|
"spec/uri_ask_spec.rb",
|
89
|
-
"spec/
|
93
|
+
"spec/uri_domain_spec.rb",
|
90
94
|
"spec/url_spec.rb",
|
91
95
|
"spec/yaml_ordered_hash_spec.rb"
|
92
96
|
]
|
@@ -101,7 +105,7 @@ Gem::Specification.new do |s|
|
|
101
105
|
"spec/img_store_spec.rb",
|
102
106
|
"spec/markup_spec.rb",
|
103
107
|
"spec/uri_ask_spec.rb",
|
104
|
-
"spec/
|
108
|
+
"spec/uri_domain_spec.rb",
|
105
109
|
"spec/url_spec.rb",
|
106
110
|
"spec/yaml_ordered_hash_spec.rb"
|
107
111
|
]
|
@@ -115,10 +119,11 @@ Gem::Specification.new do |s|
|
|
115
119
|
s.add_runtime_dependency(%q<bcrypt-ruby>, [">= 2.1.2"])
|
116
120
|
s.add_runtime_dependency(%q<builder>, [">= 2.1.2"])
|
117
121
|
s.add_runtime_dependency(%q<flickraw>, [">= 0.8.3"])
|
118
|
-
s.add_runtime_dependency(%q<hpricot>, [">= 0.8.1"])
|
119
122
|
s.add_runtime_dependency(%q<htmlentities>, [">= 4.2.0"])
|
120
123
|
s.add_runtime_dependency(%q<json>, [">= 1.2.3"])
|
124
|
+
s.add_runtime_dependency(%q<nokogiri>, ["~> 1.0"])
|
121
125
|
s.add_runtime_dependency(%q<plumnailer>, [">= 0.1.0"])
|
126
|
+
s.add_runtime_dependency(%q<public_suffix_service>, ["~> 0.0"])
|
122
127
|
s.add_runtime_dependency(%q<push-notify>, [">= 0.1.0"])
|
123
128
|
s.add_runtime_dependency(%q<rack>, [">= 1.0.0"])
|
124
129
|
s.add_runtime_dependency(%q<rack-cache>, [">= 0.5.2"])
|
@@ -136,10 +141,11 @@ Gem::Specification.new do |s|
|
|
136
141
|
s.add_dependency(%q<bcrypt-ruby>, [">= 2.1.2"])
|
137
142
|
s.add_dependency(%q<builder>, [">= 2.1.2"])
|
138
143
|
s.add_dependency(%q<flickraw>, [">= 0.8.3"])
|
139
|
-
s.add_dependency(%q<hpricot>, [">= 0.8.1"])
|
140
144
|
s.add_dependency(%q<htmlentities>, [">= 4.2.0"])
|
141
145
|
s.add_dependency(%q<json>, [">= 1.2.3"])
|
146
|
+
s.add_dependency(%q<nokogiri>, ["~> 1.0"])
|
142
147
|
s.add_dependency(%q<plumnailer>, [">= 0.1.0"])
|
148
|
+
s.add_dependency(%q<public_suffix_service>, ["~> 0.0"])
|
143
149
|
s.add_dependency(%q<push-notify>, [">= 0.1.0"])
|
144
150
|
s.add_dependency(%q<rack>, [">= 1.0.0"])
|
145
151
|
s.add_dependency(%q<rack-cache>, [">= 0.5.2"])
|
@@ -158,10 +164,11 @@ Gem::Specification.new do |s|
|
|
158
164
|
s.add_dependency(%q<bcrypt-ruby>, [">= 2.1.2"])
|
159
165
|
s.add_dependency(%q<builder>, [">= 2.1.2"])
|
160
166
|
s.add_dependency(%q<flickraw>, [">= 0.8.3"])
|
161
|
-
s.add_dependency(%q<hpricot>, [">= 0.8.1"])
|
162
167
|
s.add_dependency(%q<htmlentities>, [">= 4.2.0"])
|
163
168
|
s.add_dependency(%q<json>, [">= 1.2.3"])
|
169
|
+
s.add_dependency(%q<nokogiri>, ["~> 1.0"])
|
164
170
|
s.add_dependency(%q<plumnailer>, [">= 0.1.0"])
|
171
|
+
s.add_dependency(%q<public_suffix_service>, ["~> 0.0"])
|
165
172
|
s.add_dependency(%q<push-notify>, [">= 0.1.0"])
|
166
173
|
s.add_dependency(%q<rack>, [">= 1.0.0"])
|
167
174
|
s.add_dependency(%q<rack-cache>, [">= 0.5.2"])
|
@@ -10,17 +10,16 @@ module Murlsh
|
|
10
10
|
@hook = 'add_pre'
|
11
11
|
|
12
12
|
def self.run(url, config)
|
13
|
-
ask = URI(url.url).extend(Murlsh::UriAsk)
|
14
13
|
headers = {}
|
15
14
|
headers['User-Agent'] = config['user_agent'] if config['user_agent']
|
16
15
|
|
17
|
-
content_length = ask.content_length(:headers => headers)
|
16
|
+
content_length = url.ask.content_length(:headers => headers)
|
18
17
|
if content_length and not content_length.empty?
|
19
18
|
url.content_length = content_length
|
20
19
|
end
|
21
20
|
|
22
|
-
url.content_type = ask.content_type(:headers => headers)
|
23
|
-
url.title = ask.title(:headers => headers)
|
21
|
+
url.content_type = url.ask.content_type(:headers => headers)
|
22
|
+
url.title = url.ask.title(:headers => headers)
|
24
23
|
end
|
25
24
|
|
26
25
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
|
3
|
+
require 'murlsh'
|
4
|
+
|
5
|
+
module Murlsh
|
6
|
+
|
7
|
+
# If document has <meta rel="media:thumbnail"> use it as the thumbnail.
|
8
|
+
class AddPre50MediaThumbnail < Plugin
|
9
|
+
|
10
|
+
@hook = 'add_pre'
|
11
|
+
|
12
|
+
StorageDir = File.join(File.dirname(__FILE__), '..', 'public', 'img',
|
13
|
+
'thumb')
|
14
|
+
|
15
|
+
def self.run(url, config)
|
16
|
+
if not url.thumbnail_url and url.ask.doc
|
17
|
+
url.ask.doc.xpath_search("//meta[@rel='media:thumbnail']") do |node|
|
18
|
+
if node and node['href'] and not node['href'].empty?
|
19
|
+
Murlsh::failproof do
|
20
|
+
thumb_storage = Murlsh::ImgStore.new(StorageDir,
|
21
|
+
:user_agent => config['user_agent'])
|
22
|
+
|
23
|
+
stored_filename = thumb_storage.store_url(node['href']) do |i|
|
24
|
+
max_side = config.fetch('thumbnail_max_side', 90)
|
25
|
+
i.extend(Murlsh::ImageList).resize_down!(max_side)
|
26
|
+
end
|
27
|
+
url.thumbnail_url = "img/thumb/#{CGI.escape(stored_filename)}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
|
3
|
+
require 'murlsh'
|
4
|
+
|
5
|
+
module Murlsh
|
6
|
+
|
7
|
+
# If document has <meta property="og:image"> use it as the thumbnail.
|
8
|
+
class AddPre50OpenGraphImage < Plugin
|
9
|
+
|
10
|
+
@hook = 'add_pre'
|
11
|
+
|
12
|
+
StorageDir = File.join(File.dirname(__FILE__), '..', 'public', 'img',
|
13
|
+
'thumb')
|
14
|
+
|
15
|
+
def self.run(url, config)
|
16
|
+
if not url.thumbnail_url and url.ask.doc
|
17
|
+
url.ask.doc.xpath_search("//meta[@property='og:image']") do |node|
|
18
|
+
if node and node['content'] and not node['content'].empty?
|
19
|
+
Murlsh::failproof do
|
20
|
+
thumb_storage = Murlsh::ImgStore.new(StorageDir,
|
21
|
+
:user_agent => config['user_agent'])
|
22
|
+
|
23
|
+
stored_filename = thumb_storage.store_url(node['content']) do |i|
|
24
|
+
max_side = config.fetch('thumbnail_max_side', 90)
|
25
|
+
i.extend(Murlsh::ImageList).resize_down!(max_side)
|
26
|
+
end
|
27
|
+
url.thumbnail_url = "img/thumb/#{CGI.escape(stored_filename)}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -14,8 +14,9 @@ module Murlsh
|
|
14
14
|
|
15
15
|
def self.run(url, config)
|
16
16
|
if url.url[GithubRe]
|
17
|
-
|
18
|
-
|
17
|
+
unless url.ask.description.empty?
|
18
|
+
url.title << " - #{url.ask.description}"
|
19
|
+
end
|
19
20
|
end
|
20
21
|
end
|
21
22
|
|
@@ -13,11 +13,10 @@ module Murlsh
|
|
13
13
|
GoogleCodeRe = %r{^http://code\.google\.com/p/[\w-]+/$}i
|
14
14
|
|
15
15
|
def self.run(url, config)
|
16
|
-
if url.url[GoogleCodeRe]
|
17
|
-
|
18
|
-
ask.doc.xpath_search("//a[@id='project_summary_link']") do |node|
|
16
|
+
if url.url[GoogleCodeRe] and url.ask.doc
|
17
|
+
url.ask.doc.xpath_search("//a[@id='project_summary_link']") do |node|
|
19
18
|
summary = node ? node.inner_html : nil
|
20
|
-
url.title << " - #{ask.decode(summary)}" unless not summary or
|
19
|
+
url.title << " - #{url.ask.decode(summary)}" unless not summary or
|
21
20
|
summary.empty?
|
22
21
|
end
|
23
22
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
3
|
+
require 'murlsh'
|
4
|
+
|
5
|
+
module Murlsh
|
6
|
+
|
7
|
+
# Get Gravatar url from a url.
|
8
|
+
class Avatar50Gravatar < Plugin
|
9
|
+
|
10
|
+
@hook = 'avatar'
|
11
|
+
|
12
|
+
def self.run(avatar_url, url, config)
|
13
|
+
if url.email and not url.email.empty? and
|
14
|
+
(gravatar_size = config.fetch('gravatar_size', 0)) > 0
|
15
|
+
query = { :s => gravatar_size }
|
16
|
+
URI.join('http://www.gravatar.com/avatar/', url.email, Murlsh::build_query(query))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -21,7 +21,10 @@ module Murlsh
|
|
21
21
|
|
22
22
|
# Show the domain of the url.
|
23
23
|
def self.run(markup, url, config)
|
24
|
-
|
24
|
+
domain = Murlsh::failproof do
|
25
|
+
URI(url.url).extend(Murlsh::URIDomain).domain
|
26
|
+
end
|
27
|
+
if domain
|
25
28
|
# show domain if not already contained in title and not on skip list
|
26
29
|
unless (url.title and url.title.downcase.index(domain)) or
|
27
30
|
SkipDomains.include?(domain)
|
@@ -29,7 +29,7 @@ module Murlsh
|
|
29
29
|
when m = search.match(DeliciousRe); "delicious/#{m[1]}"
|
30
30
|
when m = search.match(TwitterRe); "twitter/#{m[1]}"
|
31
31
|
when m = search.match(TumblrRe); "#{m[1]}.tumblr"
|
32
|
-
else via_uri.domain || via_uri_s
|
32
|
+
else via_uri.extend(Murlsh::URIDomain).domain || via_uri_s
|
33
33
|
end
|
34
34
|
|
35
35
|
markup.span(:class => 'via') do
|
data/spec/doc_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'nokogiri'
|
2
2
|
|
3
3
|
require 'murlsh'
|
4
4
|
|
@@ -18,7 +18,7 @@ describe Murlsh::Doc do
|
|
18
18
|
</body>
|
19
19
|
</html>
|
20
20
|
eos
|
21
|
-
|
21
|
+
Nokogiri(html).extend(Murlsh::Doc)
|
22
22
|
end
|
23
23
|
|
24
24
|
its(:charset) { should == 'utf-8' }
|
@@ -37,7 +37,7 @@ eos
|
|
37
37
|
</body>
|
38
38
|
</html>
|
39
39
|
eos
|
40
|
-
|
40
|
+
Nokogiri(html).extend(Murlsh::Doc)
|
41
41
|
end
|
42
42
|
|
43
43
|
its(:charset) { should be_nil }
|
data/spec/markup_spec.rb
CHANGED
@@ -80,52 +80,4 @@ describe MarkupMixer do
|
|
80
80
|
].each { |r| @m.target!.should match(/#{r}/) }
|
81
81
|
end
|
82
82
|
|
83
|
-
it 'should correctly render a gravatar tag' do
|
84
|
-
@m.gravatar 'xxx'
|
85
|
-
@m.target!.should == '<img src="http://www.gravatar.com/avatar/xxx"/>'
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'should correctly render a gravatar tag with a valid default' do
|
89
|
-
@m.gravatar 'xxx', 'd' => 'identicon'
|
90
|
-
@m.target!.should ==
|
91
|
-
'<img src="http://www.gravatar.com/avatar/xxx?d=identicon"/>'
|
92
|
-
end
|
93
|
-
|
94
|
-
it 'should not pass the default parameter to gravatar if the default is invalid' do
|
95
|
-
@m.gravatar 'xxx', 'd' => 'bad'
|
96
|
-
@m.target!.should == '<img src="http://www.gravatar.com/avatar/xxx"/>'
|
97
|
-
end
|
98
|
-
|
99
|
-
it 'should correctly render a gravatar tag with a valid rating' do
|
100
|
-
@m.gravatar 'xxx', 'r' => 'x'
|
101
|
-
@m.target!.should == '<img src="http://www.gravatar.com/avatar/xxx?r=x"/>'
|
102
|
-
end
|
103
|
-
|
104
|
-
it 'should not pass the rating parameter to gravatar if the rating is invalid' do
|
105
|
-
@m.gravatar 'xxx', 'r' => 'foo'
|
106
|
-
@m.target!.should == '<img src="http://www.gravatar.com/avatar/xxx"/>'
|
107
|
-
end
|
108
|
-
|
109
|
-
it 'should correctly render a gravatar tag with a valid size' do
|
110
|
-
@m.gravatar 'xxx', 's' => 100
|
111
|
-
@m.target!.should ==
|
112
|
-
'<img src="http://www.gravatar.com/avatar/xxx?s=100"/>'
|
113
|
-
end
|
114
|
-
|
115
|
-
it 'should not pass the size parameter to gravatar if the size is invalid' do
|
116
|
-
@m.gravatar 'xxx', 's' => 1000
|
117
|
-
@m.target!.should == '<img src="http://www.gravatar.com/avatar/xxx"/>'
|
118
|
-
end
|
119
|
-
|
120
|
-
it 'should return an empty string for a gravatar with size 0' do
|
121
|
-
@m.gravatar 'xxx', 's' => 0
|
122
|
-
@m.target!.should be_empty
|
123
|
-
end
|
124
|
-
|
125
|
-
it 'should correctly render a gravatar tag with an href' do
|
126
|
-
@m.gravatar 'xxx', :href => '/test/'
|
127
|
-
@m.target!.should ==
|
128
|
-
'<a href="/test/"><img src="http://www.gravatar.com/avatar/xxx"/></a>'
|
129
|
-
end
|
130
|
-
|
131
83
|
end
|
data/spec/uri_ask_spec.rb
CHANGED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
3
|
+
require 'murlsh'
|
4
|
+
|
5
|
+
describe Murlsh::URIDomain do
|
6
|
+
|
7
|
+
def uri_domain(s); URI(s).extend(Murlsh::URIDomain).domain; end
|
8
|
+
|
9
|
+
it 'should have its domain set to the domain of its URI if it is a valid HTTP URI' do
|
10
|
+
uri_domain('http://foo.com/').should == 'foo.com'
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should have its domain set nil if it is not a valid HTTP URI' do
|
14
|
+
uri_domain('foo').should be_nil
|
15
|
+
uri_domain('http://foo.bar/').should be_nil
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should handle two letter top-level domains' do
|
19
|
+
uri_domain('http://www.linux.fm/').should == 'linux.fm'
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: murlsh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 31
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 1.
|
10
|
+
version: 1.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Matthew M. Boedicker
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-12-16 00:00:00 -05:00
|
19
19
|
default_executable: murlsh
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -83,51 +83,50 @@ dependencies:
|
|
83
83
|
type: :runtime
|
84
84
|
version_requirements: *id004
|
85
85
|
- !ruby/object:Gem::Dependency
|
86
|
-
name:
|
86
|
+
name: htmlentities
|
87
87
|
prerelease: false
|
88
88
|
requirement: &id005 !ruby/object:Gem::Requirement
|
89
89
|
none: false
|
90
90
|
requirements:
|
91
91
|
- - ">="
|
92
92
|
- !ruby/object:Gem::Version
|
93
|
-
hash:
|
93
|
+
hash: 55
|
94
94
|
segments:
|
95
|
+
- 4
|
96
|
+
- 2
|
95
97
|
- 0
|
96
|
-
|
97
|
-
- 1
|
98
|
-
version: 0.8.1
|
98
|
+
version: 4.2.0
|
99
99
|
type: :runtime
|
100
100
|
version_requirements: *id005
|
101
101
|
- !ruby/object:Gem::Dependency
|
102
|
-
name:
|
102
|
+
name: json
|
103
103
|
prerelease: false
|
104
104
|
requirement: &id006 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ">="
|
108
108
|
- !ruby/object:Gem::Version
|
109
|
-
hash:
|
109
|
+
hash: 25
|
110
110
|
segments:
|
111
|
-
-
|
111
|
+
- 1
|
112
112
|
- 2
|
113
|
-
-
|
114
|
-
version:
|
113
|
+
- 3
|
114
|
+
version: 1.2.3
|
115
115
|
type: :runtime
|
116
116
|
version_requirements: *id006
|
117
117
|
- !ruby/object:Gem::Dependency
|
118
|
-
name:
|
118
|
+
name: nokogiri
|
119
119
|
prerelease: false
|
120
120
|
requirement: &id007 !ruby/object:Gem::Requirement
|
121
121
|
none: false
|
122
122
|
requirements:
|
123
|
-
- -
|
123
|
+
- - ~>
|
124
124
|
- !ruby/object:Gem::Version
|
125
|
-
hash:
|
125
|
+
hash: 15
|
126
126
|
segments:
|
127
127
|
- 1
|
128
|
-
-
|
129
|
-
|
130
|
-
version: 1.2.3
|
128
|
+
- 0
|
129
|
+
version: "1.0"
|
131
130
|
type: :runtime
|
132
131
|
version_requirements: *id007
|
133
132
|
- !ruby/object:Gem::Dependency
|
@@ -147,9 +146,24 @@ dependencies:
|
|
147
146
|
type: :runtime
|
148
147
|
version_requirements: *id008
|
149
148
|
- !ruby/object:Gem::Dependency
|
150
|
-
name:
|
149
|
+
name: public_suffix_service
|
151
150
|
prerelease: false
|
152
151
|
requirement: &id009 !ruby/object:Gem::Requirement
|
152
|
+
none: false
|
153
|
+
requirements:
|
154
|
+
- - ~>
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
hash: 11
|
157
|
+
segments:
|
158
|
+
- 0
|
159
|
+
- 0
|
160
|
+
version: "0.0"
|
161
|
+
type: :runtime
|
162
|
+
version_requirements: *id009
|
163
|
+
- !ruby/object:Gem::Dependency
|
164
|
+
name: push-notify
|
165
|
+
prerelease: false
|
166
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
153
167
|
none: false
|
154
168
|
requirements:
|
155
169
|
- - ">="
|
@@ -161,11 +175,11 @@ dependencies:
|
|
161
175
|
- 0
|
162
176
|
version: 0.1.0
|
163
177
|
type: :runtime
|
164
|
-
version_requirements: *
|
178
|
+
version_requirements: *id010
|
165
179
|
- !ruby/object:Gem::Dependency
|
166
180
|
name: rack
|
167
181
|
prerelease: false
|
168
|
-
requirement: &
|
182
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
169
183
|
none: false
|
170
184
|
requirements:
|
171
185
|
- - ">="
|
@@ -177,11 +191,11 @@ dependencies:
|
|
177
191
|
- 0
|
178
192
|
version: 1.0.0
|
179
193
|
type: :runtime
|
180
|
-
version_requirements: *
|
194
|
+
version_requirements: *id011
|
181
195
|
- !ruby/object:Gem::Dependency
|
182
196
|
name: rack-cache
|
183
197
|
prerelease: false
|
184
|
-
requirement: &
|
198
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
185
199
|
none: false
|
186
200
|
requirements:
|
187
201
|
- - ">="
|
@@ -193,11 +207,11 @@ dependencies:
|
|
193
207
|
- 2
|
194
208
|
version: 0.5.2
|
195
209
|
type: :runtime
|
196
|
-
version_requirements: *
|
210
|
+
version_requirements: *id012
|
197
211
|
- !ruby/object:Gem::Dependency
|
198
212
|
name: rack-rewrite
|
199
213
|
prerelease: false
|
200
|
-
requirement: &
|
214
|
+
requirement: &id013 !ruby/object:Gem::Requirement
|
201
215
|
none: false
|
202
216
|
requirements:
|
203
217
|
- - ">="
|
@@ -209,11 +223,11 @@ dependencies:
|
|
209
223
|
- 2
|
210
224
|
version: 1.0.2
|
211
225
|
type: :runtime
|
212
|
-
version_requirements: *
|
226
|
+
version_requirements: *id013
|
213
227
|
- !ruby/object:Gem::Dependency
|
214
228
|
name: rack-throttle
|
215
229
|
prerelease: false
|
216
|
-
requirement: &
|
230
|
+
requirement: &id014 !ruby/object:Gem::Requirement
|
217
231
|
none: false
|
218
232
|
requirements:
|
219
233
|
- - ">="
|
@@ -225,11 +239,11 @@ dependencies:
|
|
225
239
|
- 0
|
226
240
|
version: 0.3.0
|
227
241
|
type: :runtime
|
228
|
-
version_requirements: *
|
242
|
+
version_requirements: *id014
|
229
243
|
- !ruby/object:Gem::Dependency
|
230
244
|
name: rmagick
|
231
245
|
prerelease: false
|
232
|
-
requirement: &
|
246
|
+
requirement: &id015 !ruby/object:Gem::Requirement
|
233
247
|
none: false
|
234
248
|
requirements:
|
235
249
|
- - ">="
|
@@ -241,11 +255,11 @@ dependencies:
|
|
241
255
|
- 14
|
242
256
|
version: 1.15.14
|
243
257
|
type: :runtime
|
244
|
-
version_requirements: *
|
258
|
+
version_requirements: *id015
|
245
259
|
- !ruby/object:Gem::Dependency
|
246
260
|
name: sqlite3-ruby
|
247
261
|
prerelease: false
|
248
|
-
requirement: &
|
262
|
+
requirement: &id016 !ruby/object:Gem::Requirement
|
249
263
|
none: false
|
250
264
|
requirements:
|
251
265
|
- - ">="
|
@@ -257,11 +271,11 @@ dependencies:
|
|
257
271
|
- 1
|
258
272
|
version: 1.2.1
|
259
273
|
type: :runtime
|
260
|
-
version_requirements: *
|
274
|
+
version_requirements: *id016
|
261
275
|
- !ruby/object:Gem::Dependency
|
262
276
|
name: tinyatom
|
263
277
|
prerelease: false
|
264
|
-
requirement: &
|
278
|
+
requirement: &id017 !ruby/object:Gem::Requirement
|
265
279
|
none: false
|
266
280
|
requirements:
|
267
281
|
- - ">="
|
@@ -273,11 +287,11 @@ dependencies:
|
|
273
287
|
- 3
|
274
288
|
version: 0.3.3
|
275
289
|
type: :runtime
|
276
|
-
version_requirements: *
|
290
|
+
version_requirements: *id017
|
277
291
|
- !ruby/object:Gem::Dependency
|
278
292
|
name: twitter
|
279
293
|
prerelease: false
|
280
|
-
requirement: &
|
294
|
+
requirement: &id018 !ruby/object:Gem::Requirement
|
281
295
|
none: false
|
282
296
|
requirements:
|
283
297
|
- - ">="
|
@@ -289,11 +303,11 @@ dependencies:
|
|
289
303
|
- 12
|
290
304
|
version: 0.9.12
|
291
305
|
type: :runtime
|
292
|
-
version_requirements: *
|
306
|
+
version_requirements: *id018
|
293
307
|
- !ruby/object:Gem::Dependency
|
294
308
|
name: vimeo
|
295
309
|
prerelease: false
|
296
|
-
requirement: &
|
310
|
+
requirement: &id019 !ruby/object:Gem::Requirement
|
297
311
|
none: false
|
298
312
|
requirements:
|
299
313
|
- - ">="
|
@@ -305,11 +319,11 @@ dependencies:
|
|
305
319
|
- 2
|
306
320
|
version: 1.2.2
|
307
321
|
type: :runtime
|
308
|
-
version_requirements: *
|
322
|
+
version_requirements: *id019
|
309
323
|
- !ruby/object:Gem::Dependency
|
310
324
|
name: flog
|
311
325
|
prerelease: false
|
312
|
-
requirement: &
|
326
|
+
requirement: &id020 !ruby/object:Gem::Requirement
|
313
327
|
none: false
|
314
328
|
requirements:
|
315
329
|
- - ">="
|
@@ -321,11 +335,11 @@ dependencies:
|
|
321
335
|
- 0
|
322
336
|
version: 2.5.0
|
323
337
|
type: :development
|
324
|
-
version_requirements: *
|
338
|
+
version_requirements: *id020
|
325
339
|
- !ruby/object:Gem::Dependency
|
326
340
|
name: rspec
|
327
341
|
prerelease: false
|
328
|
-
requirement: &
|
342
|
+
requirement: &id021 !ruby/object:Gem::Requirement
|
329
343
|
none: false
|
330
344
|
requirements:
|
331
345
|
- - ~>
|
@@ -336,7 +350,7 @@ dependencies:
|
|
336
350
|
- 3
|
337
351
|
version: "1.3"
|
338
352
|
type: :development
|
339
|
-
version_requirements: *
|
353
|
+
version_requirements: *id021
|
340
354
|
description: url sharing site framework with easy adding, title lookup, atom feed, thumbnails and embedding
|
341
355
|
email: matthewm@boedicker.org
|
342
356
|
executables:
|
@@ -356,6 +370,7 @@ files:
|
|
356
370
|
- config.yaml
|
357
371
|
- lib/murlsh.rb
|
358
372
|
- lib/murlsh/auth.rb
|
373
|
+
- lib/murlsh/build_query.rb
|
359
374
|
- lib/murlsh/config_server.rb
|
360
375
|
- lib/murlsh/dispatch.rb
|
361
376
|
- lib/murlsh/doc.rb
|
@@ -371,8 +386,9 @@ files:
|
|
371
386
|
- lib/murlsh/plugin.rb
|
372
387
|
- lib/murlsh/sqlite3_adapter.rb
|
373
388
|
- lib/murlsh/time_ago.rb
|
374
|
-
- lib/murlsh/uri.rb
|
375
389
|
- lib/murlsh/uri_ask.rb
|
390
|
+
- lib/murlsh/uri_domain.rb
|
391
|
+
- lib/murlsh/uri_get_path_query.rb
|
376
392
|
- lib/murlsh/url.rb
|
377
393
|
- lib/murlsh/url_body.rb
|
378
394
|
- lib/murlsh/url_server.rb
|
@@ -384,6 +400,8 @@ files:
|
|
384
400
|
- plugins/add_post_60_notify_hubs.rb
|
385
401
|
- plugins/add_pre_40_convert_mobile.rb
|
386
402
|
- plugins/add_pre_50_lookup_content_type_title.rb
|
403
|
+
- plugins/add_pre_50_media_thumbnail.rb
|
404
|
+
- plugins/add_pre_50_open_graph_image.rb
|
387
405
|
- plugins/add_pre_60_flickr.rb
|
388
406
|
- plugins/add_pre_60_github_title.rb
|
389
407
|
- plugins/add_pre_60_google_code_title.rb
|
@@ -391,10 +409,10 @@ files:
|
|
391
409
|
- plugins/add_pre_60_s3_image.rb
|
392
410
|
- plugins/add_pre_60_twitter.rb
|
393
411
|
- plugins/add_pre_60_vimeo.rb
|
394
|
-
- plugins/add_pre_60_youtube.rb
|
395
412
|
- plugins/add_pre_65_html_thumb.rb
|
396
413
|
- plugins/add_pre_65_img_thumb.rb
|
397
|
-
- plugins/
|
414
|
+
- plugins/avatar_50_gravatar.rb
|
415
|
+
- plugins/html_parse_50_nokogiri.rb
|
398
416
|
- plugins/url_display_add_45_audio.rb
|
399
417
|
- plugins/url_display_add_50_hostrec.rb
|
400
418
|
- plugins/url_display_add_55_content_type.rb
|
@@ -414,7 +432,7 @@ files:
|
|
414
432
|
- spec/img_store_spec.rb
|
415
433
|
- spec/markup_spec.rb
|
416
434
|
- spec/uri_ask_spec.rb
|
417
|
-
- spec/
|
435
|
+
- spec/uri_domain_spec.rb
|
418
436
|
- spec/url_spec.rb
|
419
437
|
- spec/yaml_ordered_hash_spec.rb
|
420
438
|
has_rdoc: true
|
@@ -458,6 +476,6 @@ test_files:
|
|
458
476
|
- spec/img_store_spec.rb
|
459
477
|
- spec/markup_spec.rb
|
460
478
|
- spec/uri_ask_spec.rb
|
461
|
-
- spec/
|
479
|
+
- spec/uri_domain_spec.rb
|
462
480
|
- spec/url_spec.rb
|
463
481
|
- spec/yaml_ordered_hash_spec.rb
|
data/lib/murlsh/uri.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
require 'uri'
|
2
|
-
|
3
|
-
# Extra methods added to URI class.
|
4
|
-
class URI::Generic
|
5
|
-
|
6
|
-
# Return the domain.
|
7
|
-
def domain
|
8
|
-
if (host and (d = host[/[a-z\d-]+\.[a-z]{2,}(\.[a-z]{2})?$/]))
|
9
|
-
d.downcase
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
# Return the path and query string.
|
14
|
-
def path_query; path + (query ? "?#{query}" : ''); end
|
15
|
-
|
16
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
require 'cgi'
|
2
|
-
|
3
|
-
require 'murlsh'
|
4
|
-
|
5
|
-
module Murlsh
|
6
|
-
|
7
|
-
# Set the thumbnail url for youtube urls.
|
8
|
-
class AddPre60Youtube < Plugin
|
9
|
-
|
10
|
-
@hook = 'add_pre'
|
11
|
-
|
12
|
-
YoutubeRe =
|
13
|
-
%r{^http://(?:(?:www|uk)\.)?youtube\.com/watch\?v=([\w\-]+)(?:&|$)}i
|
14
|
-
StorageDir = File.join(File.dirname(__FILE__), '..', 'public', 'img',
|
15
|
-
'thumb')
|
16
|
-
|
17
|
-
def self.run(url, config)
|
18
|
-
if youtube_id = url.url[YoutubeRe, 1]
|
19
|
-
thumb_storage = Murlsh::ImgStore.new(StorageDir,
|
20
|
-
:user_agent => config['user_agent'])
|
21
|
-
stored_filename = thumb_storage.store_url(
|
22
|
-
"http://img.youtube.com/vi/#{youtube_id}/default.jpg") do |i|
|
23
|
-
max_side = config.fetch('thumbnail_max_side', 90)
|
24
|
-
i.extend(Murlsh::ImageList).resize_down!(max_side)
|
25
|
-
end
|
26
|
-
url.thumbnail_url = "img/thumb/#{CGI.escape(stored_filename)}"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require 'hpricot'
|
2
|
-
|
3
|
-
require 'murlsh'
|
4
|
-
|
5
|
-
module Murlsh
|
6
|
-
|
7
|
-
# Parse HTML with Hpricot and return an Hpricot doc.
|
8
|
-
class HtmlParse50Hpricot < Plugin
|
9
|
-
|
10
|
-
@hook = 'html_parse'
|
11
|
-
|
12
|
-
def self.run(x)
|
13
|
-
Hpricot(x)
|
14
|
-
# Nokogiri(x) also works.
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
data/spec/uri_spec.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
require 'murlsh'
|
2
|
-
|
3
|
-
describe URI do
|
4
|
-
|
5
|
-
it 'should have its domain set to the domain of its URI if it is a valid HTTP URI' do
|
6
|
-
URI('http://foo.com/').domain.should == 'foo.com'
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'should have its domain set nil if it is not a valid HTTP URI' do
|
10
|
-
URI('foo').domain.should be_nil
|
11
|
-
URI('http://foo.com.').domain.should be_nil
|
12
|
-
end
|
13
|
-
|
14
|
-
end
|