murlsh 0.10.0 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +31 -0
- data/Rakefile +17 -2
- data/VERSION +1 -1
- data/config.yaml +9 -3
- data/lib/murlsh/config_server.rb +2 -0
- data/lib/murlsh/dispatch.rb +5 -0
- data/lib/murlsh/doc.rb +2 -2
- data/lib/murlsh/flickr_server.rb +2 -0
- data/lib/murlsh/head_from_get.rb +15 -0
- data/lib/murlsh/sqlite3_adapter.rb +1 -1
- data/lib/murlsh/twitter_server.rb +2 -0
- data/lib/murlsh/uri_ask.rb +16 -7
- data/lib/murlsh/url.rb +1 -0
- data/lib/murlsh/url_body.rb +5 -1
- data/lib/murlsh/url_server.rb +30 -26
- data/lib/murlsh.rb +2 -0
- data/murlsh.gemspec +4 -2
- data/plugins/add_pre_50_lookup_content_type_title.rb +5 -2
- data/plugins/add_pre_60_github_title.rb +1 -1
- data/plugins/add_pre_60_google_code_title.rb +27 -0
- data/plugins/via_50_domain.rb +1 -1
- data/public/css/screen.css +2 -3
- data/public/js/comments.json +1 -12
- data/public/js/js.js +36 -31
- metadata +6 -4
data/README.textile
CHANGED
@@ -84,4 +84,35 @@ subscribe_url is what gets put in the feed as link rel="hub"
|
|
84
84
|
|
85
85
|
This will make updates to your feed show up in Google Reader instantly.
|
86
86
|
|
87
|
+
h1. Thumbnail Locators
|
88
|
+
|
89
|
+
If the url for a thumbnail image can be generated by regex search and replace
|
90
|
+
on a posted url, a rule can be added to the configuration to automatically
|
91
|
+
show a thumbnail image for it. The 'thumb_locators' config key is a hash
|
92
|
+
of Javascript regex to Javascript replacement string (which can include
|
93
|
+
captured groups). The hash key is wrapped in ^ and $ before compilation so
|
94
|
+
it must match the entire url. The regex is compiled case-insensitive.
|
95
|
+
|
96
|
+
For example:
|
97
|
+
|
98
|
+
* Show the GitHub octocat Apple touch icon
|
99
|
+
(http://github.com/apple-touch-icon.png) as a thumbnail for GitHub links
|
100
|
+
* Show a friend's Gravatar for the thumbnails of links to his blog
|
101
|
+
|
102
|
+
<pre>
|
103
|
+
<code>
|
104
|
+
thumb_locators:
|
105
|
+
(http:\/\/github\.com\/).*: $1apple-touch-icon.png
|
106
|
+
http:\/\/myfriend\.com\/.*: http://gravatar.com/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</code>
|
107
|
+
</pre>
|
108
|
+
|
109
|
+
h1. Design Goals
|
110
|
+
|
111
|
+
* make site fast and very cacheable, caching wrapper around calls to third party JSON APIs
|
112
|
+
* low effort required to add a url, get metadata programatically instead of requiring user to specify
|
113
|
+
* heavy lifting on the client side
|
114
|
+
* allow customization with config and plugins
|
115
|
+
* full regex search for finding saved urls
|
116
|
+
* simple security (no sessions, no cookies)
|
117
|
+
|
87
118
|
Questions and comments: "matthewm@boedicker.org":mailto:matthewm@boedicker.org
|
data/Rakefile
CHANGED
@@ -15,6 +15,11 @@ sqlite3
|
|
15
15
|
murlsh
|
16
16
|
}.each { |d| require d }
|
17
17
|
|
18
|
+
# optional libraries
|
19
|
+
%w{
|
20
|
+
metric_fu
|
21
|
+
}.each { |d| Murlsh::failproof { require d } }
|
22
|
+
|
18
23
|
config = YAML.load_file('config.yaml')
|
19
24
|
|
20
25
|
desc 'Initialize a new installation.'
|
@@ -261,6 +266,8 @@ directory 'public/js'
|
|
261
266
|
|
262
267
|
namespace :js do
|
263
268
|
|
269
|
+
MURLSH_JS = %w{public/js/js.js}
|
270
|
+
|
264
271
|
desc 'Combine and compress javascript.'
|
265
272
|
task :compress => ['public/js'] do
|
266
273
|
combined = cat(config['js_files'].map { |x| "public/#{x}" } )
|
@@ -293,13 +300,21 @@ namespace :js do
|
|
293
300
|
end
|
294
301
|
|
295
302
|
desc 'Run javascript through jslint.'
|
296
|
-
task :
|
297
|
-
|
303
|
+
task :jslint do
|
304
|
+
MURLSH_JS.each do |jsf|
|
298
305
|
puts jsf
|
299
306
|
puts `rhino http://www.jslint.com/rhino/jslint.js #{jsf}`
|
300
307
|
end
|
301
308
|
end
|
302
309
|
|
310
|
+
desc "Run javascript through Google's Closure Linter."
|
311
|
+
task :gjslint do
|
312
|
+
MURLSH_JS.each do |jsf|
|
313
|
+
puts jsf
|
314
|
+
puts `gjslint #{jsf}`
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
303
318
|
end
|
304
319
|
|
305
320
|
def ask(prompt, sep=':')
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.11.0
|
data/config.yaml
CHANGED
@@ -1,11 +1,9 @@
|
|
1
1
|
---
|
2
|
-
apple_icon_hosts: []
|
3
|
-
|
4
2
|
auth_file: murlsh_users
|
5
3
|
cache_entitystore: file:tmp/cache/rack/body
|
6
4
|
cache_metastore: file:tmp/cache/rack/meta
|
7
5
|
config_js:
|
8
|
-
-
|
6
|
+
- thumb_locators
|
9
7
|
css_files:
|
10
8
|
- css/jquery.jgrowl.css
|
11
9
|
- css/screen.css
|
@@ -27,3 +25,11 @@ pubsubhubbub_hubs: []
|
|
27
25
|
|
28
26
|
root_url: http://urls.matthewm.boedicker.org/
|
29
27
|
show_names: true
|
28
|
+
thumb_locators:
|
29
|
+
(http:\/\/(cgi\.)?ebay\.(com|co\.uk)\/).*: $1apple-touch-icon.png
|
30
|
+
(http:\/\/blog\.makezine\.com\/).*: $1apple-touch-icon.png
|
31
|
+
(http:\/\/en\.wikipedia\.org\/).*: $1apple-touch-icon.png
|
32
|
+
(http:\/\/github\.com\/).*: $1apple-touch-icon.png
|
33
|
+
(http:\/\/stackoverflow\.com\/).*: $1apple-touch-icon.png
|
34
|
+
(http:\/\/www\.nytimes\.com\/).*: $1apple-touch-icon.png
|
35
|
+
(http:\/\/www\.wired\.com\/).*: $1apple-touch-icon.png
|
data/lib/murlsh/config_server.rb
CHANGED
data/lib/murlsh/dispatch.rb
CHANGED
@@ -16,6 +16,7 @@ module Murlsh
|
|
16
16
|
|
17
17
|
ActiveRecord::Base.establish_connection(
|
18
18
|
:adapter => 'sqlite3', :database => @config.fetch('db_file'))
|
19
|
+
ActiveRecord::Base.include_root_in_json = false
|
19
20
|
|
20
21
|
db = ActiveRecord::Base.connection.instance_variable_get(:@connection)
|
21
22
|
|
@@ -27,10 +28,14 @@ module Murlsh
|
|
27
28
|
root_path = URI(@config.fetch('root_url')).path
|
28
29
|
|
29
30
|
@dispatch = [
|
31
|
+
[%r{^HEAD #{root_path}(url)?$}, url_server.method(:head)],
|
30
32
|
[%r{^GET #{root_path}(url)?$}, url_server.method(:get)],
|
31
33
|
[%r{^POST #{root_path}(url)?$}, url_server.method(:post)],
|
34
|
+
[%r{^HEAD #{root_path}config$}, config_server.method(:head)],
|
32
35
|
[%r{^GET #{root_path}config$}, config_server.method(:get)],
|
36
|
+
[%r{^HEAD #{root_path}flickr$}, flickr_server.method(:head)],
|
33
37
|
[%r{^GET #{root_path}flickr$}, flickr_server.method(:get)],
|
38
|
+
[%r{^HEAD #{root_path}twitter/.+$}, twitter_server.method(:head)],
|
34
39
|
[%r{^GET #{root_path}twitter/.+$}, twitter_server.method(:get)],
|
35
40
|
]
|
36
41
|
end
|
data/lib/murlsh/doc.rb
CHANGED
@@ -18,8 +18,8 @@ module Murlsh
|
|
18
18
|
nil
|
19
19
|
end
|
20
20
|
|
21
|
-
# Check a list of xpaths in order and return the
|
22
|
-
# one that is not nil
|
21
|
+
# Check a list of xpaths in order and yield and return the node matching
|
22
|
+
# the first one that is not nil
|
23
23
|
def xpath_search(xpaths)
|
24
24
|
[*xpaths].each do |xpath|
|
25
25
|
selection = (self/xpath).first
|
data/lib/murlsh/flickr_server.rb
CHANGED
@@ -7,7 +7,7 @@ class ActiveRecord::ConnectionAdapters::SQLite3Adapter
|
|
7
7
|
# Add MATCH function for regex matching.
|
8
8
|
def initialize(connection, logger, config)
|
9
9
|
super
|
10
|
-
@connection.create_function('
|
10
|
+
@connection.create_function('MURLSHMATCH', 2) do |func,search_in,search_for|
|
11
11
|
func.result = search_in.to_s.match(/#{search_for}/i) ? 1 : nil
|
12
12
|
end
|
13
13
|
end
|
data/lib/murlsh/uri_ask.rb
CHANGED
@@ -4,6 +4,7 @@ net/https
|
|
4
4
|
open-uri
|
5
5
|
uri
|
6
6
|
|
7
|
+
hpricot
|
7
8
|
htmlentities
|
8
9
|
iconv
|
9
10
|
}.each { |m| require m }
|
@@ -22,19 +23,23 @@ module Murlsh
|
|
22
23
|
return @content_type if defined?(@content_type)
|
23
24
|
options[:headers] = default_headers.merge(options.fetch(:headers, {}))
|
24
25
|
|
25
|
-
|
26
|
+
content_type = ''
|
26
27
|
Murlsh::failproof(options) do
|
27
28
|
# try head first to save bandwidth
|
28
29
|
http = Net::HTTP.new(host, port)
|
29
30
|
http.use_ssl = (scheme == 'https')
|
30
31
|
|
31
32
|
resp = http.request_head(path_query, options[:headers])
|
32
|
-
|
33
|
-
|
34
|
-
|
33
|
+
|
34
|
+
if Net::HTTPSuccess === resp
|
35
|
+
content_type = resp['content-type']
|
36
|
+
end
|
37
|
+
|
38
|
+
if not content_type or content_type.empty?
|
39
|
+
content_type = self.open(options[:headers]) { |f| f.content_type }
|
35
40
|
end
|
36
41
|
end
|
37
|
-
@content_type
|
42
|
+
@content_type = content_type
|
38
43
|
end
|
39
44
|
|
40
45
|
# Get the HTML title.
|
@@ -91,8 +96,12 @@ module Murlsh
|
|
91
96
|
if html?(options)
|
92
97
|
Murlsh::failproof(options) do
|
93
98
|
self.open(options[:headers]) do |f|
|
94
|
-
|
95
|
-
|
99
|
+
html_parse_plugins = Murlsh::Plugin.hooks('html_parse')
|
100
|
+
@doc = if html_parse_plugins.empty?
|
101
|
+
Hpricot(f).extend(Murlsh::Doc)
|
102
|
+
else
|
103
|
+
html_parse_plugins.first.run(f).extend(Murlsh::Doc)
|
104
|
+
end
|
96
105
|
|
97
106
|
@charset = @doc.charset || f.charset
|
98
107
|
end
|
data/lib/murlsh/url.rb
CHANGED
data/lib/murlsh/url_body.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
%w{
|
2
|
+
builder
|
3
|
+
}.each { |m| require m }
|
4
|
+
|
1
5
|
module Murlsh
|
2
6
|
|
3
7
|
# Url list page builder.
|
@@ -20,7 +24,7 @@ module Murlsh
|
|
20
24
|
def search_conditions
|
21
25
|
if @q
|
22
26
|
search_cols = %w{name title url}
|
23
|
-
[search_cols.map { |x| "
|
27
|
+
[search_cols.map { |x| "MURLSHMATCH(#{x}, ?)" }.join(' OR ')].push(
|
24
28
|
*[@q] * search_cols.size)
|
25
29
|
else
|
26
30
|
[]
|
data/lib/murlsh/url_server.rb
CHANGED
@@ -8,6 +8,8 @@ module Murlsh
|
|
8
8
|
# Build responses for HTTP requests.
|
9
9
|
class UrlServer
|
10
10
|
|
11
|
+
include HeadFromGet
|
12
|
+
|
11
13
|
def initialize(config, db)
|
12
14
|
@config, @db = config, db
|
13
15
|
ActiveRecord::Base.default_timezone = :utc
|
@@ -34,38 +36,40 @@ module Murlsh
|
|
34
36
|
|
35
37
|
# Respond to a POST request. Add the new url and return json.
|
36
38
|
def post(req)
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
end
|
39
|
+
auth = req.params['auth']
|
40
|
+
if user = auth.empty? ? nil : Murlsh::Auth.new(
|
41
|
+
@config.fetch('auth_file')).auth(auth)
|
42
|
+
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3',
|
43
|
+
:database => @config.fetch('db_file'))
|
44
|
+
|
45
|
+
mu = Murlsh::Url.new do |u|
|
46
|
+
u.time = Time.now.gmtime
|
47
|
+
u.url = req.params['url']
|
48
|
+
u.email = user[:email]
|
49
|
+
u.name = user[:name]
|
50
|
+
u.via = req.params['via'] unless (req.params['via'] || []).empty?
|
51
|
+
end
|
51
52
|
|
53
|
+
begin
|
54
|
+
# validate before add_pre plugins have run and also after (in save!)
|
55
|
+
raise ActiveRecord::RecordInvalid.new(mu) unless mu.valid?
|
52
56
|
Murlsh::Plugin.hooks('add_pre') { |p| p.run(mu, @config) }
|
53
|
-
|
54
|
-
mu.save
|
55
|
-
|
57
|
+
mu.save!
|
56
58
|
Murlsh::Plugin.hooks('add_post') { |p| p.run(@config) }
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
'Content-Type' => 'text/plain' })
|
59
|
+
response_body, response_code = [mu], 200
|
60
|
+
rescue ActiveRecord::RecordInvalid => error
|
61
|
+
response_body = {
|
62
|
+
'url' => error.record,
|
63
|
+
'errors' => error.record.errors,
|
64
|
+
}
|
65
|
+
response_code = 500
|
65
66
|
end
|
66
67
|
else
|
67
|
-
|
68
|
+
response_body, response_code = '', 403
|
68
69
|
end
|
70
|
+
|
71
|
+
Rack::Response.new(response_body.to_json, response_code, {
|
72
|
+
'Content-Type' => 'application/json' })
|
69
73
|
end
|
70
74
|
|
71
75
|
end
|
data/lib/murlsh.rb
CHANGED
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 = "0.
|
8
|
+
s.version = "0.11.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-09-21}
|
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}
|
@@ -36,6 +36,7 @@ Gem::Specification.new do |s|
|
|
36
36
|
"lib/murlsh/failproof.rb",
|
37
37
|
"lib/murlsh/far_future_expires.rb",
|
38
38
|
"lib/murlsh/flickr_server.rb",
|
39
|
+
"lib/murlsh/head_from_get.rb",
|
39
40
|
"lib/murlsh/markup.rb",
|
40
41
|
"lib/murlsh/must_revalidate.rb",
|
41
42
|
"lib/murlsh/openlock.rb",
|
@@ -57,6 +58,7 @@ Gem::Specification.new do |s|
|
|
57
58
|
"plugins/add_post_60_notify_hubs.rb",
|
58
59
|
"plugins/add_pre_50_lookup_content_type_title.rb",
|
59
60
|
"plugins/add_pre_60_github_title.rb",
|
61
|
+
"plugins/add_pre_60_google_code_title.rb",
|
60
62
|
"plugins/hostrec_50_redundant.rb",
|
61
63
|
"plugins/hostrec_60_skip.rb",
|
62
64
|
"plugins/html_parse_50_hpricot.rb",
|
@@ -11,8 +11,11 @@ module Murlsh
|
|
11
11
|
|
12
12
|
def self.run(url, config)
|
13
13
|
ask = URI(url.url).extend(Murlsh::UriAsk)
|
14
|
-
|
15
|
-
|
14
|
+
headers = {
|
15
|
+
'User-Agent' => 'murlsh (http://github.com/mmb/murlsh)'
|
16
|
+
}
|
17
|
+
url.content_type = ask.content_type(:headers => headers)
|
18
|
+
url.title = ask.title(:headers => headers)
|
16
19
|
end
|
17
20
|
|
18
21
|
end
|
@@ -11,7 +11,7 @@ module Murlsh
|
|
11
11
|
@hook = 'add_pre'
|
12
12
|
|
13
13
|
def self.run(url, config)
|
14
|
-
if url.url[%r{http://github
|
14
|
+
if url.url[%r{^http://github\.com/\w+/[\w.-]+$}]
|
15
15
|
ask = URI(url.url).extend(Murlsh::UriAsk)
|
16
16
|
url.title << " - #{ask.description}" unless ask.description.empty?
|
17
17
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
%w{
|
2
|
+
murlsh
|
3
|
+
}.each { |m| require m }
|
4
|
+
|
5
|
+
module Murlsh
|
6
|
+
|
7
|
+
# Google Code project page titles are not very descriptive so add summary
|
8
|
+
# from page
|
9
|
+
class AddPre60GoogleCodeTitle < Plugin
|
10
|
+
|
11
|
+
@hook = 'add_pre'
|
12
|
+
|
13
|
+
def self.run(url, config)
|
14
|
+
if url.url[%r{^http://code\.google\.com/p/[\w-]+/$}]
|
15
|
+
puts 'xxx'
|
16
|
+
ask = URI(url.url).extend(Murlsh::UriAsk)
|
17
|
+
ask.doc.xpath_search("//a[@id='project_summary_link']") do |node|
|
18
|
+
summary = node ? node.inner_html : nil
|
19
|
+
url.title << " - #{ask.decode(summary)}" unless !summary or
|
20
|
+
summary.empty?
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
data/plugins/via_50_domain.rb
CHANGED
@@ -21,7 +21,7 @@ module Murlsh
|
|
21
21
|
"#{m[1]}.reddit"
|
22
22
|
when m = search.match(%r{^delicious\.com/(\w+)}i)
|
23
23
|
"delicious/#{m[1]}"
|
24
|
-
when m = search.match(%r{^twitter\.com/(\w+)
|
24
|
+
when m = search.match(%r{^twitter\.com/(\w+)}i)
|
25
25
|
"twitter/#{m[1]}"
|
26
26
|
when m = search.match(%r{^([a-z\d][a-z\d-]{0,61}[a-z\d])\.tumblr\.com/}i)
|
27
27
|
"#{m[1]}.tumblr"
|
data/public/css/screen.css
CHANGED
data/public/js/comments.json
CHANGED
@@ -1,12 +1 @@
|
|
1
|
-
{
|
2
|
-
"http://url/being/commented/on": [
|
3
|
-
{
|
4
|
-
"authorAvatar": "http://url/of/your/avatar/image",
|
5
|
-
"authorName": "yourname",
|
6
|
-
"authorUrl": "http://url/of/your/site",
|
7
|
-
"comment": "your comment",
|
8
|
-
"createdTime": 1275005075,
|
9
|
-
"updatedTime": 1275005075
|
10
|
-
},
|
11
|
-
],
|
12
|
-
}
|
1
|
+
{"http://www.youtube.com/watch?v=KrfpnbGXL70":[{"createdTime":1277520298,"updatedTime":1277520298,"authorAvatar":"http://www.gravatar.com/avatar/355af1bc931baca530e66571923286b4?s=16","authorName":"mmb","authorUrl":"http://matthewm.boedicker.org/","comment":"Through SOAP!"},{"createdTime":1277520298,"updatedTime":1277520298,"authorAvatar":"http://www.gravatar.com/avatar/355af1bc931baca530e66571923286b4?s=16","authorName":"mmb","authorUrl":"http://matthewm.boedicker.org/","comment":"dead, can be seen at http://jz10.java.no/java-4-ever-trailer.html"}]}
|
data/public/js/js.js
CHANGED
@@ -3,6 +3,15 @@
|
|
3
3
|
"use strict";
|
4
4
|
|
5
5
|
var Murlsh = function (config, $, navigator, window) {
|
6
|
+
function compileRegexMap(regexMap) {
|
7
|
+
var result = {};
|
8
|
+
$.each(regexMap, function (reStr) {
|
9
|
+
result[reStr] = new RegExp('^' + reStr + '$', 'i');
|
10
|
+
});
|
11
|
+
|
12
|
+
return result;
|
13
|
+
}
|
14
|
+
|
6
15
|
var my = {},
|
7
16
|
hrefRes = {
|
8
17
|
flickr :
|
@@ -10,7 +19,7 @@ var Murlsh = function (config, $, navigator, window) {
|
|
10
19
|
imageshack :
|
11
20
|
/^(http:\/\/img\d+\.imageshack\.us\/img\d+\/\d+\/\w+\.)(jpe?g|gif|png)$/i,
|
12
21
|
imgur :
|
13
|
-
/^(http:\/\/(?:i\.)?imgur\.com\/[a-z\d]+)(\.(?:jpe?g|gif|png))$/i,
|
22
|
+
/^(http:\/\/(?:i\.)?imgur\.com\/)([a-z\d]+)(\.(?:jpe?g|gif|png))$/i,
|
14
23
|
mp3 :
|
15
24
|
/\.mp3$/i,
|
16
25
|
s3 :
|
@@ -22,7 +31,7 @@ var Murlsh = function (config, $, navigator, window) {
|
|
22
31
|
youtube :
|
23
32
|
/^http:\/\/(?:(?:www|uk)\.)?youtube\.com\/watch\?v=([\w\-]+)(?:&|$)/i
|
24
33
|
},
|
25
|
-
|
34
|
+
thumbLocatorsCompiled = compileRegexMap(config.thumb_locators);
|
26
35
|
|
27
36
|
function autoLink(s) {
|
28
37
|
// turn urls into links
|
@@ -75,11 +84,6 @@ var Murlsh = function (config, $, navigator, window) {
|
|
75
84
|
return result;
|
76
85
|
}
|
77
86
|
|
78
|
-
function appleThumb(host) {
|
79
|
-
return img('http://' + host + '/apple-touch-icon.png', '').addClass(
|
80
|
-
'thumb apple');
|
81
|
-
}
|
82
|
-
|
83
87
|
function closerAdd(x, header) {
|
84
88
|
var html = (typeof x === 'object') ? $('<div />').append(x).html() : x;
|
85
89
|
|
@@ -226,16 +230,15 @@ var Murlsh = function (config, $, navigator, window) {
|
|
226
230
|
.append($('<span />').append(comment.authorName).addClass(
|
227
231
|
'comment-name'))
|
228
232
|
.append(' : ')
|
229
|
-
.append($('<span />').append(autoLink(comment.comment))
|
230
|
-
addClass('comment-comment'))
|
233
|
+
.append($('<span />').append(autoLink(comment.comment))
|
234
|
+
.addClass('comment-comment'))
|
231
235
|
.appendTo(ul);
|
232
236
|
}
|
233
237
|
};
|
234
238
|
|
235
239
|
my.addExtra = function () {
|
236
|
-
var
|
237
|
-
|
238
|
-
href = $(this).attr('href'),
|
240
|
+
var thisA = $(this),
|
241
|
+
href = thisA.attr('href'),
|
239
242
|
match = {},
|
240
243
|
swf = 'swf/player_mp3_mini.swf',
|
241
244
|
thumb;
|
@@ -258,18 +261,19 @@ var Murlsh = function (config, $, navigator, window) {
|
|
258
261
|
success : function (d) {
|
259
262
|
thumbInsert(flickrThumb(d), flickrClick, $(this));
|
260
263
|
},
|
261
|
-
context :
|
264
|
+
context : thisA,
|
262
265
|
jsonpCallback : 'flickrCallback' + match.flickr[1]
|
263
266
|
});
|
264
267
|
} else if (match.imageshack) {
|
265
268
|
thumbInsert(imgThumb(match.imageshack[1], 'th.',
|
266
269
|
match.imageshack[2]).data('href', match.imageshack[0]),
|
267
|
-
imgClick,
|
270
|
+
imgClick, thisA.html('imageshack.us'));
|
268
271
|
} else if (match.imgur) {
|
269
|
-
thumbInsert(imgThumb(match.imgur[1],
|
270
|
-
'href', match.imgur[0]), imgClick,
|
272
|
+
thumbInsert(imgThumb(match.imgur[1], match.imgur[2], 's',
|
273
|
+
match.imgur[3]).data('href', match.imgur[0]), imgClick,
|
274
|
+
thisA.html('imgur/' + match.imgur[2] + match.imgur[3]));
|
271
275
|
} else if (match.mp3) {
|
272
|
-
|
276
|
+
thisA.before(objectTag(swf, 20, 200, [
|
273
277
|
{ name : 'bgcolor', value : '#000000' },
|
274
278
|
{ name : 'FlashVars', value : 'mp3=' + href },
|
275
279
|
{ name : 'movie', value : swf }
|
@@ -278,13 +282,13 @@ var Murlsh = function (config, $, navigator, window) {
|
|
278
282
|
thumb = imgThumb(match.s3[1], 'th.', match.s3[2]);
|
279
283
|
|
280
284
|
if (match.s3[2].match(/^pdf$/i)) {
|
281
|
-
|
285
|
+
thisA.before(thumb).html('pdf');
|
282
286
|
} else {
|
283
287
|
if (my.isIphone()) {
|
284
|
-
|
288
|
+
thisA.html(thumb);
|
285
289
|
} else {
|
286
|
-
|
287
|
-
|
290
|
+
thisA.html('link');
|
291
|
+
thisA.before(thumb.data('href', match.s3[0]).click(
|
288
292
|
imgClick));
|
289
293
|
}
|
290
294
|
}
|
@@ -308,7 +312,7 @@ var Murlsh = function (config, $, navigator, window) {
|
|
308
312
|
|
309
313
|
$(this).replaceWith(tweet);
|
310
314
|
},
|
311
|
-
context :
|
315
|
+
context : thisA,
|
312
316
|
jsonpCallback : 'twitterCallback' + match.twitter[1]
|
313
317
|
});
|
314
318
|
} else if (match.vimeo) {
|
@@ -326,20 +330,21 @@ var Murlsh = function (config, $, navigator, window) {
|
|
326
330
|
{ name : 'movie', value : movie }
|
327
331
|
])), vimeoClick, $(this));
|
328
332
|
},
|
329
|
-
context :
|
333
|
+
context : thisA,
|
330
334
|
jsonpCallback : 'vimeoCallback' + match.vimeo[1]
|
331
335
|
});
|
332
336
|
} else if (match.youtube) {
|
333
|
-
thumbInsert(youtubeThumb(match.youtube[1]), youtubeClick,
|
337
|
+
thumbInsert(youtubeThumb(match.youtube[1]), youtubeClick, thisA);
|
334
338
|
} else {
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
339
|
+
$.each(config.thumb_locators, function (reStr) {
|
340
|
+
var re = thumbLocatorsCompiled[reStr];
|
341
|
+
if (href.match(re)) {
|
342
|
+
thumbInsert(img(href.replace(re,
|
343
|
+
config.thumb_locators[reStr])).addClass(
|
344
|
+
'thumb locator'), null, thisA);
|
345
|
+
return false;
|
341
346
|
}
|
342
|
-
}
|
347
|
+
});
|
343
348
|
}
|
344
349
|
};
|
345
350
|
|
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: 51
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 11
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.11.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-09-21 00:00:00 -04:00
|
19
19
|
default_executable: murlsh
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -237,6 +237,7 @@ files:
|
|
237
237
|
- lib/murlsh/failproof.rb
|
238
238
|
- lib/murlsh/far_future_expires.rb
|
239
239
|
- lib/murlsh/flickr_server.rb
|
240
|
+
- lib/murlsh/head_from_get.rb
|
240
241
|
- lib/murlsh/markup.rb
|
241
242
|
- lib/murlsh/must_revalidate.rb
|
242
243
|
- lib/murlsh/openlock.rb
|
@@ -258,6 +259,7 @@ files:
|
|
258
259
|
- plugins/add_post_60_notify_hubs.rb
|
259
260
|
- plugins/add_pre_50_lookup_content_type_title.rb
|
260
261
|
- plugins/add_pre_60_github_title.rb
|
262
|
+
- plugins/add_pre_60_google_code_title.rb
|
261
263
|
- plugins/hostrec_50_redundant.rb
|
262
264
|
- plugins/hostrec_60_skip.rb
|
263
265
|
- plugins/html_parse_50_hpricot.rb
|