diff options
author | toshi <toshi@03aab468-d3d2-4883-8b12-f661bbf03fa8> | 2011-08-14 06:35:45 +0000 |
---|---|---|
committer | toshi <toshi@03aab468-d3d2-4883-8b12-f661bbf03fa8> | 2011-08-14 06:35:45 +0000 |
commit | f21ce11bcc7349a1b4a574f024635438aafedab1 (patch) | |
tree | 1247e2aec6108e103ca836bc985c24cb8f4d3e75 /core/messageconverters.rb | |
parent | 057a086509ad0a85e274dfd8f41581db88a36476 (diff) | |
download | mikutter-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.rb | 128 |
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) |