Permalink
Browse files

initial commit

  • Loading branch information...
0 parents commit 6f12d2112344b43b755ccdd21f25f81f166b8827 @tenderlove committed May 2, 2011
Showing with 559 additions and 0 deletions.
  1. +8 −0 .autotest
  2. +6 −0 CHANGELOG.rdoc
  3. +8 −0 Gemfile
  4. +7 −0 Manifest.txt
  5. +67 −0 README.rdoc
  6. +18 −0 Rakefile
  7. +141 −0 lib/rails_autolink.rb
  8. +304 −0 test/test_rails_autolink.rb
@@ -0,0 +1,8 @@
+# -*- ruby -*-
+
+require 'autotest/restart'
+
+Autotest.add_hook :initialize do |at|
+ at.testlib = 'minitest/autorun'
+ at.find_directories = ARGV unless ARGV.empty?
+end
@@ -0,0 +1,6 @@
+=== 1.0.0 / 2011-05-02
+
+* 1 major enhancement
+
+ * Birthday!
+
@@ -0,0 +1,8 @@
+source 'http://rubygems.org'
+
+gem 'rails', :path => '/Users/aaron/git/rails'
+gem 'arel', :path => '/Users/aaron/git/arel'
+gem 'rack', :path => '/Users/aaron/git/rack'
+gem 'hoe'
+gem 'minitest'
+
@@ -0,0 +1,7 @@
+History.txt
+Manifest.txt
+README.txt
+Rakefile
+bin/rails_autolink
+lib/rails_autolink.rb
+test/test_rails_autolink.rb
@@ -0,0 +1,67 @@
+= rails_autolink
+
+* http://github.com/tenderlove/rails_autolink
+
+== DESCRIPTION:
+
+This is an extraction of the `auto_link` method from rails. The `auto_link`
+method was removed from Rails in version Rails 3.1. This gem is meant to
+bridge the gap for people migrating.
+
+== FEATURES/PROBLEMS:
+
+* May not be safe!
+
+== SYNOPSIS:
+
+ require 'rails_autolink'
+
+ auto_link("Go to http://www.rubyonrails.org and say hello to david@loudthinking.com")
+ # => "Go to <a href=\"http://www.rubyonrails.org\">http://www.rubyonrails.org</a> and
+ # say hello to <a href=\"mailto:david@loudthinking.com\">david@loudthinking.com</a>"
+
+ auto_link("Visit http://www.loudthinking.com/ or e-mail david@loudthinking.com", :link => :urls)
+ # => "Visit <a href=\"http://www.loudthinking.com/\">http://www.loudthinking.com/</a>
+ # or e-mail david@loudthinking.com"
+
+ auto_link("Visit http://www.loudthinking.com/ or e-mail david@loudthinking.com", :link => :email_addresses)
+ # => "Visit http://www.loudthinking.com/ or e-mail <a href=\"mailto:david@loudthinking.com\">david@loudthinking.com</a>"
+
+ post_body = "Welcome to my new blog at http://www.myblog.com/. Please e-mail me at me@email.com."
+ auto_link(post_body, :html => { :target => '_blank' }) do |text|
+ truncate(text, :length => 15)
+ end
+ # => "Welcome to my new blog at <a href=\"http://www.myblog.com/\" target=\"_blank\">http://www.m...</a>.
+
+== REQUIREMENTS:
+
+* rails
+
+== INSTALL:
+
+* gem install rails
+
+== LICENSE:
+
+(The MIT License)
+
+Copyright (c) 2011 DHH
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,18 @@
+# -*- ruby -*-
+
+require 'rubygems'
+require 'hoe'
+
+Hoe.plugins.delete :rubyforge
+Hoe.plugin :minitest
+Hoe.plugin :gemspec # `gem install hoe-gemspec`
+Hoe.plugin :git # `gem install hoe-git`
+
+Hoe.spec 'rails_autolink' do
+ developer('Aaron Patterson', 'aaron@tenderlovemaking.com')
+ self.readme_file = 'README.rdoc'
+ self.history_file = 'CHANGELOG.rdoc'
+ self.extra_rdoc_files = FileList['*.rdoc']
+end
+
+# vim: syntax=ruby
@@ -0,0 +1,141 @@
+require 'active_support/core_ext/object/blank'
+require 'active_support/core_ext/array/extract_options'
+require 'active_support/core_ext/hash/reverse_merge'
+require 'active_support/core_ext/hash/keys'
+
+module RailsAutolink
+ VERSION = '1.0.0'
+end
+
+module ActionView
+ module Helpers # :nodoc:
+ module TextHelper
+ # Turns all URLs and e-mail addresses into clickable links. The <tt>:link</tt> option
+ # will limit what should be linked. You can add HTML attributes to the links using
+ # <tt>:html</tt>. Possible values for <tt>:link</tt> are <tt>:all</tt> (default),
+ # <tt>:email_addresses</tt>, and <tt>:urls</tt>. If a block is given, each URL and
+ # e-mail address is yielded and the result is used as the link text.
+ #
+ # ==== Examples
+ # auto_link("Go to http://www.rubyonrails.org and say hello to david@loudthinking.com")
+ # # => "Go to <a href=\"http://www.rubyonrails.org\">http://www.rubyonrails.org</a> and
+ # # say hello to <a href=\"mailto:david@loudthinking.com\">david@loudthinking.com</a>"
+ #
+ # auto_link("Visit http://www.loudthinking.com/ or e-mail david@loudthinking.com", :link => :urls)
+ # # => "Visit <a href=\"http://www.loudthinking.com/\">http://www.loudthinking.com/</a>
+ # # or e-mail david@loudthinking.com"
+ #
+ # auto_link("Visit http://www.loudthinking.com/ or e-mail david@loudthinking.com", :link => :email_addresses)
+ # # => "Visit http://www.loudthinking.com/ or e-mail <a href=\"mailto:david@loudthinking.com\">david@loudthinking.com</a>"
+ #
+ # post_body = "Welcome to my new blog at http://www.myblog.com/. Please e-mail me at me@email.com."
+ # auto_link(post_body, :html => { :target => '_blank' }) do |text|
+ # truncate(text, :length => 15)
+ # end
+ # # => "Welcome to my new blog at <a href=\"http://www.myblog.com/\" target=\"_blank\">http://www.m...</a>.
+ # Please e-mail me at <a href=\"mailto:me@email.com\">me@email.com</a>."
+ #
+ #
+ # You can still use <tt>auto_link</tt> with the old API that accepts the
+ # +link+ as its optional second parameter and the +html_options+ hash
+ # as its optional third parameter:
+ # post_body = "Welcome to my new blog at http://www.myblog.com/. Please e-mail me at me@email.com."
+ # auto_link(post_body, :urls)
+ # # => "Welcome to my new blog at <a href=\"http://www.myblog.com/\">http://www.myblog.com</a>.
+ # Please e-mail me at me@email.com."
+ #
+ # auto_link(post_body, :all, :target => "_blank")
+ # # => "Welcome to my new blog at <a href=\"http://www.myblog.com/\" target=\"_blank\">http://www.myblog.com</a>.
+ # Please e-mail me at <a href=\"mailto:me@email.com\">me@email.com</a>."
+ def auto_link(text, *args, &block)#link = :all, html = {}, &block)
+ return '' if text.blank?
+
+ options = args.size == 2 ? {} : args.extract_options! # this is necessary because the old auto_link API has a Hash as its last parameter
+ unless args.empty?
+ options[:link] = args[0] || :all
+ options[:html] = args[1] || {}
+ end
+ options.reverse_merge!(:link => :all, :html => {})
+
+ case options[:link].to_sym
+ when :all then auto_link_email_addresses(auto_link_urls(text, options[:html], options, &block), options[:html], &block)
+ when :email_addresses then auto_link_email_addresses(text, options[:html], &block)
+ when :urls then auto_link_urls(text, options[:html], options, &block)
+ end
+ end
+
+ private
+
+ AUTO_LINK_RE = %r{
+ (?: ([0-9A-Za-z+.:-]+:)// | www\. )
+ [^\s<]+
+ }x
+
+ # regexps for determining context, used high-volume
+ AUTO_LINK_CRE = [/<[^>]+$/, /^[^>]*>/, /<a\b.*?>/i, /<\/a>/i]
+
+ AUTO_EMAIL_RE = /[\w.!#\$%+-]+@[\w-]+(?:\.[\w-]+)+/
+
+ BRACKETS = { ']' => '[', ')' => '(', '}' => '{' }
+
+ # Turns all urls into clickable links. If a block is given, each url
+ # is yielded and the result is used as the link text.
+ def auto_link_urls(text, html_options = {}, options = {})
+ link_attributes = html_options.stringify_keys
+ text.gsub(AUTO_LINK_RE) do
+ scheme, href = $1, $&
+ punctuation = []
+
+ if auto_linked?($`, $')
+ # do not change string; URL is already linked
+ href
+ else
+ # don't include trailing punctuation character as part of the URL
+ while href.sub!(/[^\w\/-]$/, '')
+ punctuation.push $&
+ if opening = BRACKETS[punctuation.last] and href.scan(opening).size > href.scan(punctuation.last).size
+ href << punctuation.pop
+ break
+ end
+ end
+
+ link_text = block_given?? yield(href) : href
+ href = 'http://' + href unless scheme
+
+ unless options[:sanitize] == false
+ link_text = sanitize(link_text)
+ href = sanitize(href)
+ end
+ content_tag(:a, link_text, link_attributes.merge('href' => href), !!options[:sanitize]) + punctuation.reverse.join('')
+ end
+ end
+ end
+
+ # Turns all email addresses into clickable links. If a block is given,
+ # each email is yielded and the result is used as the link text.
+ def auto_link_email_addresses(text, html_options = {}, options = {})
+ text.gsub(AUTO_EMAIL_RE) do
+ text = $&
+
+ if auto_linked?($`, $')
+ text.html_safe
+ else
+ display_text = (block_given?) ? yield(text) : text
+
+ unless options[:sanitize] == false
+ text = sanitize(text)
+ display_text = sanitize(display_text) unless text == display_text
+ end
+ mail_to text, display_text, html_options
+ end
+ end
+ end
+
+ # Detects already linked context or position in the middle of a tag
+ def auto_linked?(left, right)
+ (left =~ AUTO_LINK_CRE[0] and right =~ AUTO_LINK_CRE[1]) or
+ (left.rindex(AUTO_LINK_CRE[2]) and $' !~ AUTO_LINK_CRE[3])
+ end
+ end
+ end
+end
Oops, something went wrong.

0 comments on commit 6f12d21

Please sign in to comment.