smartlinks 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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