emoji 1.0.1 → 1.0.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5a5314dfa9bd2b9fefb8db7cd2c5b52643a11615
4
- data.tar.gz: ce8ef4dfdbf6044d5864f2ab5a4846d19bc3b36e
3
+ metadata.gz: 1a107032c52334744a9ea531dc52687ad3734542
4
+ data.tar.gz: 02a61e602aafe01ed88f7f536f35e06846463854
5
5
  SHA512:
6
- metadata.gz: 9dea51512846eb336698457bd4a12f6898c8b9906261b913cc720303a24f03c5c67e7666053ad00f26be58626479f71ba93642911c1a2fb33d37a45a2344630f
7
- data.tar.gz: 847d2edef664e9949e59c71112b369d0af4ab5cdd91277d9de02fd05a35908466f1e465372e0413d4aedd188ffdc4231e1122d5f7fdfe7fce06d9f8d9e8255a3
6
+ metadata.gz: 109658ab8eb1bf45b80cbbe27e3eed081bb702d68b16f6e2a05e95a4de14811556ad915ffbc6e23fc5e19d37d335d8b77ae2f47554329dd1f4e149077ab09a73
7
+ data.tar.gz: 1bdfd0c4687546ff3ba1a6676e93eab048471ac0e19220c576d5b1f9841db71279c97e4a078680938a5cccc6ac9c994c29737d4250c6689875e31b830603e902
@@ -0,0 +1,15 @@
1
+ language: ruby
2
+ sudo: false
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - 2.1.0
7
+ - jruby-19mode
8
+ - rbx-2
9
+ - ruby-head
10
+ - jruby-head
11
+
12
+ matrix:
13
+ allow_failures:
14
+ - rvm: ruby-head
15
+ - rvm: jruby-head
@@ -1,5 +1,11 @@
1
1
  # Releases / Changes
2
2
 
3
+ ## 1.0.2
4
+
5
+ * Improved Emoji.asset_host configuration/handling
6
+ * Emoji::Index cleanup and find_by_unicode
7
+ * Plaintext alt tags (optional)
8
+
3
9
  ## 1.0.1
4
10
 
5
11
  * Important html_safe security fix.
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  A Ruby gem. For emoji. For everyone. :heart:
4
4
 
5
+ [![Build Status](https://travis-ci.org/steveklabnik/emoji.svg?branch=master)](https://travis-ci.org/steveklabnik/emoji)
6
+
5
7
  This gem exposes the [Phantom Open Emoji library](https://github.com/Genshin/PhantomOpenEmoji) unicode/image assets and APIs for working with them.
6
8
 
7
9
  Easily lookup emoji name, unicode character, or image assets and convert emoji representations.
@@ -67,6 +69,7 @@ Default configuration integrates with Rails, but you can change it with an initi
67
69
  # config/initializers/emoji.rb
68
70
  Emoji.asset_host = "emoji.cdn.com"
69
71
  Emoji.asset_path = '/assets/emoji'
72
+ Emoji.use_plaintext_alt_tags = true
70
73
  ```
71
74
 
72
75
  String Helper Methods:
@@ -109,6 +112,10 @@ gem 'escape_utils'
109
112
  * [@mikowitz](https://github.com/mikowitz): `String` ext helpers
110
113
  * [@semanticart](https://github.com/semanticart): Cleanup/Ruby 1.9.3 support
111
114
  * [@parndt](https://github.com/parndt): README doc fixes
115
+ * [@neuegram](https://github.com/neuegram): XSS Security Audit
116
+ * [@tumes](https://github.com/tumes): Plaintext Emoji Alt Tags
117
+ * [@poporul](https://github.com/poporul): Emoji::Index Refactoring
118
+ * [@dilkhush](https://github.com/dilkhush): Emoji::Index Search by Unicode
112
119
 
113
120
  ## Contributing
114
121
 
@@ -21,7 +21,6 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency "json"
22
22
 
23
23
  spec.add_development_dependency "bundler", "~> 1.3"
24
- spec.add_development_dependency "debugger"
25
24
  spec.add_development_dependency "rake"
26
25
  spec.add_development_dependency "minitest"
27
26
  end
@@ -1,5 +1,6 @@
1
1
  require 'emoji/version'
2
2
  require 'json'
3
+ require 'uri'
3
4
 
4
5
  # Optionally load EscapeUtils if it's available
5
6
  begin
@@ -15,14 +16,48 @@ require "emoji/railtie" if defined?(Rails)
15
16
  module Emoji
16
17
  @asset_host = nil
17
18
  @asset_path = nil
19
+ @use_plaintext_alt_tags = nil
18
20
  @escaper = defined?(EscapeUtils) ? EscapeUtils : CGI
19
21
 
20
22
  def self.asset_host
21
23
  @asset_host || 'http://localhost:3000'
22
24
  end
23
25
 
24
- def self.asset_host=(host)
25
- @asset_host = host
26
+ def self.asset_host=(asset_host)
27
+ @asset_host = parse_and_validate_asset_host(asset_host)
28
+ end
29
+
30
+ def self.parse_and_validate_asset_host(asset_host_spec)
31
+ begin
32
+ uri = URI.parse(asset_host_spec)
33
+ scheme_string = extract_uri_scheme_string(asset_host_spec, uri)
34
+ hostname = uri.hostname || uri.path
35
+ port_string = extract_port_string(uri)
36
+
37
+ return "#{ scheme_string }#{ hostname }#{ port_string }"
38
+ rescue URI::InvalidURIError
39
+ raise 'Invalid Emoji.asset_host, should be a hostname or URL prefix'
40
+ end
41
+ end
42
+
43
+ def self.extract_uri_scheme_string(asset_host_spec, uri)
44
+ # Special Case for Protocol Relative Scheme: //hostname.com/
45
+ if asset_host_spec.size >= 2 && asset_host_spec[0..1] == '//'
46
+ return '//'
47
+ end
48
+
49
+ # Extract Protocol from asset_host_spec URI or default to HTTP
50
+ scheme = uri.scheme || 'http'
51
+
52
+ "#{ scheme }://"
53
+ end
54
+
55
+ def self.extract_port_string(uri)
56
+ return nil unless uri.port
57
+ return nil if uri.port == 80 && uri.scheme == 'http'
58
+ return nil if uri.port == 443 && uri.scheme == 'https'
59
+
60
+ return ":#{uri.port}"
26
61
  end
27
62
 
28
63
  def self.asset_path
@@ -33,6 +68,14 @@ module Emoji
33
68
  @asset_path = path
34
69
  end
35
70
 
71
+ def self.use_plaintext_alt_tags
72
+ @use_plaintext_alt_tags || false
73
+ end
74
+
75
+ def self.use_plaintext_alt_tags=(bool)
76
+ @use_plaintext_alt_tags = bool
77
+ end
78
+
36
79
  def self.image_url_for_name(name)
37
80
  "#{asset_host}#{ File.join(asset_path, name) }.png"
38
81
  end
@@ -42,6 +85,12 @@ module Emoji
42
85
  image_url_for_name(emoji['name'])
43
86
  end
44
87
 
88
+ def self.alt_tag_for_moji(moji)
89
+ return moji unless use_plaintext_alt_tags
90
+ emoji = index.find_by_moji(moji)
91
+ emoji['name']
92
+ end
93
+
45
94
  def self.replace_unicode_moji_with_images(string)
46
95
  return string unless string
47
96
  unless string.match(index.unicode_moji_regex)
@@ -50,7 +99,7 @@ module Emoji
50
99
 
51
100
  safe_string = safe_string(string.dup)
52
101
  safe_string.gsub!(index.unicode_moji_regex) do |moji|
53
- %Q{<img alt="#{moji}" class="emoji" src="#{ image_url_for_unicode_moji(moji) }">}
102
+ %Q{<img alt="#{alt_tag_for_moji(moji)}" class="emoji" src="#{ image_url_for_unicode_moji(moji) }">}
54
103
  end
55
104
  safe_string = safe_string.html_safe if safe_string.respond_to?(:html_safe)
56
105
 
@@ -1,13 +1,24 @@
1
+ require 'forwardable'
2
+
1
3
  module Emoji
2
4
  class Index
5
+ extend Forwardable
6
+
7
+ attr_reader :unicode_moji_regex
8
+
9
+ def_delegator :@emoji_by_moji, :[], :find_by_moji
10
+ def_delegator :@emoji_by_name, :[], :find_by_name
11
+ def_delegator :@emoji_by_unicode, :[], :find_by_unicode
12
+
3
13
  def initialize(emoji_list=nil)
4
14
  emoji_list ||= begin
5
15
  emoji_json = File.read(File.absolute_path(File.dirname(__FILE__) + '/../../config/index.json'))
6
16
  JSON.parse(emoji_json)
7
17
  end
8
-
18
+
9
19
  @emoji_by_name = {}
10
20
  @emoji_by_moji = {}
21
+ @emoji_by_unicode = {}
11
22
 
12
23
  emoji_list.each do |emoji_hash|
13
24
  name = emoji_hash['name']
@@ -15,20 +26,12 @@ module Emoji
15
26
 
16
27
  moji = emoji_hash['moji']
17
28
  @emoji_by_moji[moji] = emoji_hash if moji
18
- end
19
- @emoji_moji_regex = /#{@emoji_by_moji.keys.join('|')}/
20
- end
21
-
22
- def find_by_moji(moji)
23
- @emoji_by_moji[moji]
24
- end
25
29
 
26
- def find_by_name(name)
27
- @emoji_by_name[name]
28
- end
30
+ unicode = emoji_hash['unicode']
31
+ @emoji_by_unicode[unicode] = emoji_hash if unicode
32
+ end
29
33
 
30
- def unicode_moji_regex
31
- @emoji_moji_regex
34
+ @unicode_moji_regex = /#{@emoji_by_moji.keys.join('|')}/
32
35
  end
33
36
  end
34
37
  end
@@ -6,10 +6,11 @@ module Emoji
6
6
  initializer "emoji.defaults" do
7
7
  Emoji.asset_host = ActionController::Base.asset_host
8
8
  Emoji.asset_path = '/assets/emoji'
9
+ Emoji.use_plaintext_alt_tags = false
9
10
  end
10
11
 
11
12
  rake_tasks do
12
13
  load File.absolute_path(File.dirname(__FILE__) + '/tasks/install.rake')
13
14
  end
14
15
  end
15
- end
16
+ end
@@ -1,3 +1,3 @@
1
1
  module Emoji
2
- VERSION = "1.0.1"
2
+ VERSION = "1.0.2"
3
3
  end
@@ -20,9 +20,34 @@ describe Emoji do
20
20
  assert_equal 'http://localhost:3000', Emoji.asset_host
21
21
  end
22
22
 
23
- it 'should be configurable' do
23
+ it 'should allow hostname only and default scheme to http' do
24
24
  with_emoji_config(:asset_host, 'emoji') do
25
- assert_equal 'emoji', Emoji.asset_host
25
+ assert_equal 'http://emoji', Emoji.asset_host
26
+ end
27
+ end
28
+
29
+ it 'should allow protocol relative URL' do
30
+ with_emoji_config(:asset_host, '//emoji') do
31
+ assert_equal '//emoji', Emoji.asset_host
32
+ end
33
+ end
34
+
35
+ it 'should respect protocol scheme' do
36
+ with_emoji_config(:asset_host, 'https://emoji') do
37
+ assert_equal 'https://emoji', Emoji.asset_host
38
+ end
39
+ end
40
+
41
+ it 'should allow setting port' do
42
+ with_emoji_config(:asset_host, 'http://emoji:3000') do
43
+ assert_equal 'http://emoji:3000', Emoji.asset_host
44
+ end
45
+
46
+ end
47
+
48
+ it 'should validate hostname' do
49
+ assert_raises(RuntimeError) do
50
+ with_emoji_config(:asset_host, nil) {}
26
51
  end
27
52
  end
28
53
  end
@@ -39,6 +64,18 @@ describe Emoji do
39
64
  end
40
65
  end
41
66
 
67
+ describe "use_plaintext_alt_tags" do
68
+ it 'should default to false' do
69
+ refute Emoji.use_plaintext_alt_tags
70
+ end
71
+
72
+ it 'should be configurable' do
73
+ with_emoji_config(:use_plaintext_alt_tags, true) do
74
+ assert Emoji.use_plaintext_alt_tags
75
+ end
76
+ end
77
+ end
78
+
42
79
  describe "replace_unicode_moji_with_images" do
43
80
  it 'should return original string without emoji' do
44
81
  assert_equal "foo", Emoji.replace_unicode_moji_with_images('foo')
@@ -55,6 +92,14 @@ describe Emoji do
55
92
  assert_equal "I <img alt=\"❤\" class=\"emoji\" src=\"http://localhost:3000/heart.png\"> Emoji", replaced_string
56
93
  end
57
94
 
95
+ it 'should use plaintext alt tags if configured to do so' do
96
+ with_emoji_config(:use_plaintext_alt_tags, true) do
97
+ base_string = "I ❤ Emoji"
98
+ replaced_string = Emoji.replace_unicode_moji_with_images(base_string)
99
+ assert_equal "I <img alt=\"heart\" class=\"emoji\" src=\"http://localhost:3000/heart.png\"> Emoji", replaced_string
100
+ end
101
+ end
102
+
58
103
  it 'should handle nil string' do
59
104
  assert_equal nil, Emoji.replace_unicode_moji_with_images(nil)
60
105
  end
@@ -126,5 +171,4 @@ describe Emoji do
126
171
  Emoji.send("#{name}=", original_value)
127
172
  end
128
173
  end
129
-
130
174
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: emoji
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Klabnik
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-03-13 00:00:00.000000000 Z
12
+ date: 2015-04-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json
@@ -39,20 +39,6 @@ dependencies:
39
39
  - - ~>
40
40
  - !ruby/object:Gem::Version
41
41
  version: '1.3'
42
- - !ruby/object:Gem::Dependency
43
- name: debugger
44
- requirement: !ruby/object:Gem::Requirement
45
- requirements:
46
- - - '>='
47
- - !ruby/object:Gem::Version
48
- version: '0'
49
- type: :development
50
- prerelease: false
51
- version_requirements: !ruby/object:Gem::Requirement
52
- requirements:
53
- - - '>='
54
- - !ruby/object:Gem::Version
55
- version: '0'
56
42
  - !ruby/object:Gem::Dependency
57
43
  name: rake
58
44
  requirement: !ruby/object:Gem::Requirement
@@ -91,6 +77,7 @@ extra_rdoc_files: []
91
77
  files:
92
78
  - .gitignore
93
79
  - .rvmrc
80
+ - .travis.yml
94
81
  - CHANGELOG.md
95
82
  - Gemfile
96
83
  - LICENSE.txt
@@ -618,7 +605,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
618
605
  version: '0'
619
606
  requirements: []
620
607
  rubyforge_project:
621
- rubygems_version: 2.0.3
608
+ rubygems_version: 2.4.6
622
609
  signing_key:
623
610
  specification_version: 4
624
611
  summary: 'A Ruby gem. For emoji. For everyone. :heart:'