aboutsummaryrefslogtreecommitdiffstats
path: root/core/messageconverters.rb
diff options
context:
space:
mode:
authortoshi <toshi@03aab468-d3d2-4883-8b12-f661bbf03fa8>2011-08-14 06:35:45 +0000
committertoshi <toshi@03aab468-d3d2-4883-8b12-f661bbf03fa8>2011-08-14 06:35:45 +0000
commitf21ce11bcc7349a1b4a574f024635438aafedab1 (patch)
tree1247e2aec6108e103ca836bc985c24cb8f4d3e75 /core/messageconverters.rb
parent057a086509ad0a85e274dfd8f41581db88a36476 (diff)
downloadmikutter-f21ce11bcc7349a1b4a574f024635438aafedab1.tar.gz
URLを再帰的に展開 closes #273
git-svn-id: svn://toshia.dip.jp/mikutter/branches/0.0.3@459 03aab468-d3d2-4883-8b12-f661bbf03fa8
Diffstat (limited to 'core/messageconverters.rb')
-rw-r--r--core/messageconverters.rb128
1 files changed, 70 insertions, 58 deletions
diff --git a/core/messageconverters.rb b/core/messageconverters.rb
index 4e56aab6..a591b48c 100644
--- a/core/messageconverters.rb
+++ b/core/messageconverters.rb
@@ -6,69 +6,81 @@ require 'uri'
=end
class MessageConverters
- @@shrinked_cache = {} # { shrinked => expanded }
-
- def self.regist
- converter = self.new
- plugin = Plugin.create(converter.plugin_name)
- [:shrink, :expand].each{ |convert|
- plugin.add_event_filter("#{convert}_url"){ |url, &cont|
- converted = converter.__send__("#{convert}_url", url)
- if(converted)
- cont.call([converted])
+ class << self
+
+ @@shrinked_cache = {} # { shrinked => expanded }
+
+ def regist
+ converter = self.new
+ plugin = Plugin.create(converter.plugin_name)
+ [:shrink, :expand].each{ |convert|
+ plugin.add_event_filter("#{convert}_url"){ |url, &cont|
+ converted = converter.__send__("#{convert}_url", url)
+ if(converted)
+ cont.call([converted])
+ else
+ [url] end } }
+ plugin.add_event_filter(:is_expanded){ |url, &cont|
+ if(converter.shrinked_url?(url))
+ cont.call([false])
else
- [url] end } }
- plugin.add_event_filter(:is_expanded){ |url, &cont|
- if(converter.shrinked_url?(url))
- cont.call([false])
- else
- [url] end }
- end
+ [url] end }
+ end
- # textからURLを抜き出してすべて短縮したテキストを返す
- def self.shrink_url_all(text)
- urls = text.matches(shrinkable_url_regexp)
- return text if(urls.empty?)
- table = self.shrink_url(urls)
- text.gsub(shrinkable_url_regexp){ |k| table[k] } if table end
-
- # textからURLを抜き出してすべて展開したテキストを返す
- def self.expand_url_all(text)
- urls = text.matches(shrinkable_url_regexp)
- return text if(urls.empty?)
- table = self.expand_url(urls)
- text.gsub(shrinkable_url_regexp){ |k| table[k] } if table end
-
- # URL _url_ を短縮する。urlは配列で渡す。
- # { 渡されたURL => 短縮後URL }の配列を返す
- def self.shrink_url(urls)
- result = Hash.new
- urls.each{ |url|
- url.freeze
- if shrinked_url?(url)
- result[url] = url
- else
- result[url] = @@shrinked_cache.key(url) || Plugin.filtering(:shrink_url, url).first.tap{ |s| @@shrinked_cache[s.freeze] = url } end }
- result.freeze end
-
- # URL _url_ を展開する。urlは配列で渡す。
- # { 渡されたURL => 展開後URL }の配列を返す
-
- def self.expand_url(urls)
- result = Hash.new
- urls.each{ |url|
- url.freeze
- if shrinked_url?(url)
- result[url] = @@shrinked_cache[url] ||= Plugin.filtering(:expand_url, url).first.freeze
+ # textからURLを抜き出してすべて短縮したテキストを返す
+ def shrink_url_all(text)
+ urls = text.matches(shrinkable_url_regexp)
+ return text if(urls.empty?)
+ table = self.shrink_url(urls)
+ text.gsub(shrinkable_url_regexp){ |k| table[k] } if table end
+
+ # textからURLを抜き出してすべて展開したテキストを返す
+ def expand_url_all(text)
+ urls = text.matches(shrinkable_url_regexp)
+ return text if(urls.empty?)
+ table = self.expand_url(urls)
+ text.gsub(shrinkable_url_regexp){ |k| table[k] } if table end
+
+ # URL _url_ を短縮する。urlは配列で渡す。
+ # { 渡されたURL => 短縮後URL }の配列を返す
+ def shrink_url(urls)
+ result = Hash.new
+ urls.each{ |url|
+ url.freeze
+ if shrinked_url?(url)
+ result[url] = url
+ else
+ result[url] = @@shrinked_cache.key(url) || Plugin.filtering(:shrink_url, url).first.tap{ |s| @@shrinked_cache[s.freeze] = url } end }
+ result.freeze end
+
+ # URL _url_ を展開する。urlは配列で渡す。
+ # { 渡されたURL => 展開後URL }の配列を返す
+ def expand_url(urls)
+ result = Hash.new
+ urls.each{ |url|
+ result[url] = expand_url_one(url) }
+ result.freeze end
+
+ # urlを一つだけ受け取り、再帰的に展開する。
+ # ただし再帰的展開は4段までしか行わず、展開系が渡されたURLと同じになるか
+ # それ以上展開できなくなれば直ちにそれを返す。
+ def expand_url_one(url, recur=0)
+ if recur < 4 and shrinked_url?(url)
+ expanded = @@shrinked_cache[url] ||= Plugin.filtering(:expand_url, url).first.freeze
+ if(expanded == url)
+ url
+ else
+ expand_url_one(expanded, recur + 1) end
else
- result[url] = url end }
- result.freeze end
+ url end end
- def self.shrinkable_url_regexp
- URI.regexp(['http','https']) end
+ def shrinkable_url_regexp
+ URI.regexp(['http','https']) end
+
+ def shrinked_url?(url)
+ not Plugin.filtering(:is_expanded, url).first
+ end
- def self.shrinked_url?(url)
- not Plugin.filtering(:is_expanded, url).first
end
def shrink_url(url)