smartlinks 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,23 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
19
+
20
+ # VIM tmp files
21
+ *.swp
22
+ *.swo
23
+ ~*
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color --tty
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in smartlink.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,24 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ smartlinks (0.0.1)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ diff-lcs (1.1.3)
10
+ rspec (2.12.0)
11
+ rspec-core (~> 2.12.0)
12
+ rspec-expectations (~> 2.12.0)
13
+ rspec-mocks (~> 2.12.0)
14
+ rspec-core (2.12.2)
15
+ rspec-expectations (2.12.1)
16
+ diff-lcs (~> 1.1.3)
17
+ rspec-mocks (2.12.2)
18
+
19
+ PLATFORMS
20
+ ruby
21
+
22
+ DEPENDENCIES
23
+ rspec
24
+ smartlinks!
data/README.md ADDED
@@ -0,0 +1,46 @@
1
+ # SmartLinks
2
+
3
+ Gem for linkifying text
4
+
5
+ ## Installation
6
+
7
+ Just as usual. If you're using bundler - just this to your Gemfile:
8
+
9
+ gem 'smartlinks'
10
+
11
+ And then execute:
12
+
13
+ bundle install
14
+
15
+ Or install it yourself:
16
+
17
+ gem install smartlinks
18
+
19
+ ## Usage
20
+
21
+ This gem is very simple. You have only one method, that you need. For example:
22
+
23
+ ```ruby
24
+ text = "@sqrel and @troyanryller just made a cool gem!"
25
+
26
+ Smartlinks.linkify text
27
+ ```
28
+
29
+ That's it! Now you have linkified text:
30
+
31
+ <a href="https://twitter.com/sqrel">@sqrel</a> and <a href="https://twitter.com/troyanryller">@troyanryller</a> just made a cool gem!
32
+
33
+ By default, gem interprets @user and #hash as twitter user and hashtag, but you can explicitly define domain to user and hashtag:
34
+
35
+ Smartlinks.linkify text, account: "http://example.com/%s", hashtag: "http://example.com/search/%s"
36
+
37
+ `%s` will be replaced to username or hash
38
+
39
+ Also you can define additional links params, for example:
40
+
41
+ Smartlinks.linkify text, params: { class: "some-link-class", rel: "nofollow" }
42
+
43
+ ## Credits
44
+
45
+ * Vasilij Melnychuk ([@SqREL](https://twitter.com/sqrel))
46
+ * Igor Petruh ([@Troyanryller](https://twitter.com/troyanryller))
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
@@ -0,0 +1,11 @@
1
+ module Smartlinks
2
+
3
+ def self.linkify(text, attrs={})
4
+ linkificator = Linkificator.new text, attrs
5
+
6
+ # NOTE: Order matters!
7
+ [:email, :link, :account, :hashtag].each { |method| linkificator.send method }
8
+
9
+ linkificator.text
10
+ end
11
+ end
@@ -0,0 +1,67 @@
1
+ module Smartlinks
2
+ class Linkificator
3
+
4
+ attr_reader :text
5
+
6
+ # ---------- Regex patterns ----------
7
+ PAT_LINK = %r{
8
+ (?: ((?:ed2k|ftp|http|https|irc|news|gopher|nntp|telnet|webcal|xmpp|callto|feed|svn|urn|aim|rsync|tag|ssh|sftp|rtsp|afs):)// | www\. )
9
+ [^\s<]+
10
+ }x
11
+ PAT_EMAIL = %r{
12
+ [a-z0-9!#$\%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$\%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
13
+ }x
14
+ PAT_ACCOUNT = %r{(^|\s)@(\w+)}
15
+ PAT_HASH = %r{#(\w+)}
16
+ # ------------------------------------
17
+
18
+ def initialize(text, attrs={})
19
+ @text = text
20
+ @attrs = attrs
21
+ end
22
+
23
+ def email
24
+ @text.gsub! PAT_EMAIL do |email|
25
+ "<a href=\"mailto:#{email}\">#{email}</a>"
26
+ end
27
+ end
28
+
29
+ def link
30
+ @text.gsub! PAT_LINK do |url|
31
+ if @attrs[:params]
32
+ params = @attrs[:params].map{|k, v| " #{k}=\"#{v}\""}.join''
33
+ "<a href=\"#{url}\"#{params}>#{url}</a>"
34
+ else
35
+ "<a href=\"#{url}\">#{url}</a>"
36
+ end
37
+ end
38
+ end
39
+
40
+ def account
41
+ @text.gsub!(PAT_ACCOUNT) do
42
+ space, account = $~[1], $~[2]
43
+
44
+ if @attrs[:account]
45
+ url = @attrs[:account].sub "%s", account
46
+ "#{space}<a href=\"#{url}\">@#{account}</a>"
47
+ else
48
+ "#{space}<a href=\"https://twitter.com/#{account}\">@#{account}</a>"
49
+ end
50
+ end
51
+ end
52
+
53
+ def hashtag
54
+ @text.gsub!(PAT_HASH) do
55
+ hashtag = $~[1]
56
+
57
+ if @attrs[:hashtag]
58
+ url = @attrs[:hashtag].sub "%s", hashtag
59
+ "<a href=\"#{url}\">##{hashtag}</a>"
60
+ else
61
+ "<a href=\"https://twitter.com/search?q=%23#{hashtag}&src=hash\">##{hashtag}</a>"
62
+ end
63
+ end
64
+ end
65
+
66
+ end
67
+ end
@@ -0,0 +1,3 @@
1
+ module Smartlinks
2
+ VERSION = "0.1.0"
3
+ end
data/lib/smartlinks.rb ADDED
@@ -0,0 +1,5 @@
1
+ require 'smartlinks/linkificator'
2
+ require 'smartlinks/base'
3
+
4
+ module Smartlinks
5
+ end
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'smartlinks/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "smartlinks"
8
+ gem.version = Smartlinks::VERSION
9
+ gem.authors = ["Vasilij Melnychuck", "Igor Petruh"]
10
+ gem.email = ["isqrel@gmail.com", "pro100igor@gmail.com"]
11
+ gem.description = %q{ Gem for linkfying your text }
12
+ gem.summary = %q{ Smartlinks converts your palin-text urls, twitter-like accounts and hashtag links to html a tags }
13
+ gem.homepage = "https://github.com/SqREL/smartlinks"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
17
+ gem.require_paths = ["lib"]
18
+
19
+ ['rspec'].each do |dep|
20
+ gem.add_development_dependency(dep)
21
+ end
22
+ end
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ describe Smartlinks do
4
+
5
+ it "modifies http url" do
6
+ text, result = data "http"
7
+ Smartlinks.linkify(text).should eql(result)
8
+ end
9
+ it "modifies https url" do
10
+ text, result = data "https"
11
+ Smartlinks.linkify(text).should eql(result)
12
+ end
13
+ it "modifies ftp url" do
14
+ text, result = data "ftp"
15
+ Smartlinks.linkify(text).should eql(result)
16
+ end
17
+ it "modifies http url" do
18
+ text, result = data "http"
19
+ Smartlinks.linkify(text).should eql(result)
20
+ end
21
+
22
+ it "do not modifyes if allready link" do
23
+ text = "Allready <a href=\"http://google.com\">linkifyed</a> url"
24
+ Smartlinks.linkify(text).should eql(text)
25
+ end
26
+
27
+ it "modifyes plaintext mail account to link" do
28
+ text = "Reply to admin@test.com and check user@gmail.com account"
29
+ result = "Reply to <a href=\"mailto:admin@test.com\">admin@test.com</a> and check <a href=\"mailto:user@gmail.com\">user@gmail.com</a> account"
30
+ Smartlinks.linkify(text).should eql(result)
31
+ end
32
+
33
+ it "creates twitter links" do
34
+ text = "@sqrel, check out @dht twitter"
35
+ result = "<a href=\"https://twitter.com/sqrel\">@sqrel</a>, check out <a href=\"https://twitter.com/dht\">@dht</a> twitter"
36
+ Smartlinks.linkify(text).should eql(result)
37
+ end
38
+
39
+ it "creates twitter-like links with custom domain" do
40
+ text = "@sqrel, check out @dht account"
41
+ result = "<a href=\"http://test.com/sqrel\">@sqrel</a>, check out <a href=\"http://test.com/dht\">@dht</a> account"
42
+ Smartlinks.linkify(text, account: "http://test.com/%s").should eql(result)
43
+ end
44
+
45
+ it "creates twitter hash links" do
46
+ text = "#dude, check out #rails framework"
47
+ result = "<a href=\"https://twitter.com/search?q=%23dude&src=hash\">#dude</a>, check out <a href=\"https://twitter.com/search?q=%23rails&src=hash\">#rails</a> framework"
48
+ Smartlinks.linkify(text).should eql(result)
49
+ end
50
+
51
+ it "creates twitter-like links with custom domain" do
52
+ text = "#dude, check out #rails framework"
53
+ result = "<a href=\"http://example.com/dude?src=hash\">#dude</a>, check out <a href=\"http://example.com/rails?src=hash\">#rails</a> framework"
54
+ Smartlinks.linkify(text, hashtag: "http://example.com/%s?src=hash").should eql(result)
55
+ end
56
+
57
+ it "converts url to link with some link params" do
58
+ text = "http://example.com/3 Word http://lorem.com/id/1 seperator http://test.com/foo/bar Foo"
59
+ result = "<a href=\"http://example.com/3\" class=\"main\" rel=\"nofollow\">http://example.com/3</a> Word <a href=\"http://lorem.com/id/1\" class=\"main\" rel=\"nofollow\">http://lorem.com/id/1</a> seperator <a href=\"http://test.com/foo/bar\" class=\"main\" rel=\"nofollow\">http://test.com/foo/bar</a> Foo"
60
+ Smartlinks.linkify(text, params: { class: "main", rel: "nofollow" }).should eql(result)
61
+ end
62
+
63
+ private
64
+ def data(protocol)
65
+ text = "#{protocol}://example.com/3 Word #{protocol}://lorem.com/id/1 seperator #{protocol}://test.com/foo/bar Foo"
66
+ result = "<a href=\"#{protocol}://example.com/3\">#{protocol}://example.com/3</a> Word <a href=\"#{protocol}://lorem.com/id/1\">#{protocol}://lorem.com/id/1</a> seperator <a href=\"#{protocol}://test.com/foo/bar\">#{protocol}://test.com/foo/bar</a> Foo"
67
+ [text, result]
68
+ end
69
+
70
+ end
@@ -0,0 +1,6 @@
1
+ require 'smartlinks'
2
+ require 'rspec'
3
+
4
+ RSpec.configure do |config|
5
+ config.include RSpec::Matchers
6
+ end
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: smartlinks
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.0
6
+ platform: ruby
7
+ authors:
8
+ - Vasilij Melnychuck
9
+ - Igor Petruh
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2013-02-16 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ prerelease: false
17
+ type: :development
18
+ name: rspec
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ! '>='
23
+ - !ruby/object:Gem::Version
24
+ version: '0'
25
+ requirement: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ description: ! ' Gem for linkfying your text '
32
+ email:
33
+ - isqrel@gmail.com
34
+ - pro100igor@gmail.com
35
+ executables: []
36
+ extensions: []
37
+ extra_rdoc_files: []
38
+ files:
39
+ - .gitignore
40
+ - .rspec
41
+ - Gemfile
42
+ - Gemfile.lock
43
+ - README.md
44
+ - Rakefile
45
+ - lib/smartlinks.rb
46
+ - lib/smartlinks/base.rb
47
+ - lib/smartlinks/linkificator.rb
48
+ - lib/smartlinks/version.rb
49
+ - smartlinks.gemspec
50
+ - spec/lib/smartlinks/smartlinks_spec.rb
51
+ - spec/spec_helper.rb
52
+ homepage: https://github.com/SqREL/smartlinks
53
+ licenses: []
54
+ post_install_message:
55
+ rdoc_options: []
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ requirements: []
71
+ rubyforge_project:
72
+ rubygems_version: 1.8.25
73
+ signing_key:
74
+ specification_version: 3
75
+ summary: Smartlinks converts your palin-text urls, twitter-like accounts and hashtag
76
+ links to html a tags
77
+ test_files:
78
+ - spec/lib/smartlinks/smartlinks_spec.rb
79
+ - spec/spec_helper.rb