middleman-emojifire 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b0349e3910318e00736e605cae6c79aa470aefc7
4
+ data.tar.gz: 8e44d94bf476e062406d73aa9cac6d03d0d164be
5
+ SHA512:
6
+ metadata.gz: b5c0f19925ae34acf8fcabc2b41b611b83b890abf8d4237b353cc994c44658d53ef3a51ebce44fb42620f326ec6dc31b55d1f333ea3e2fa8a9ffc70a85ba6a4f
7
+ data.tar.gz: b15bed382e54ac7e1a53da68e3de339c48383cc39058b6b615061ca80d23ac2367eecf03af5bad1281aa2ab33692ecaa974f6fdcb19ba26389258771fd2e8c1d
@@ -0,0 +1,5 @@
1
+ # Ignore bundler lock file
2
+ /Gemfile.lock
3
+
4
+ # Ignore pkg folder
5
+ /pkg
data/Gemfile ADDED
@@ -0,0 +1,18 @@
1
+ # If you do not have OpenSSL installed, update
2
+ # the following line to use "http://" instead
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in middleman-emojifire.gemspec
6
+ gemspec
7
+
8
+ group :development do
9
+ gem 'rake'
10
+ gem 'rdoc'
11
+ gem 'yard'
12
+ end
13
+
14
+ group :test do
15
+ gem 'cucumber'
16
+ gem 'aruba'
17
+ gem 'rspec'
18
+ end
@@ -0,0 +1,101 @@
1
+ # middleman-emojifire 🔥
2
+
3
+ middleman-emojifire is a quite easy-to-use emoji extension for Middleman.
4
+
5
+ Given the below HTML source:
6
+
7
+ ```html
8
+ <h3>The love :cat:</h3>
9
+ <p>I move like cagey :tiger:</p>
10
+ ```
11
+
12
+ middleman-emojifire will convert it into like the following:
13
+
14
+ ```html
15
+ <h3>The love 🐱</h3>
16
+ <p>I move like cagey 🐯</p>
17
+ ```
18
+
19
+ In fact, emojifire wraps emojis with `<span>` tags for future use (as be described later):
20
+
21
+ ```html
22
+ <h3>The love <span class="emoji" data-alias="cat" data-fallback="https://assets-cdn.github.com/images/icons/emoji/unicode/1f431.png">🐱</span></h3>
23
+ ```
24
+
25
+
26
+ Note that these emojis are characters respresented by unicode.
27
+ Unlike the ways of most extensions to display emoji, they are not replaced by images.
28
+ This means that modern OS/browsers can display them without extra downloads.
29
+
30
+ However, what if you want to put popular emoji which does not have unicode representation like :shipit:?
31
+
32
+ When a unicode repsentation for an emoji is not found, emojifire fallbacks it to an image with inline styles:
33
+
34
+ ```html
35
+ <span class="emoji" data-alias="shipit" style="overflow: hidden; display: inline-block; width: 1em; height: 1em; margin: 0 0.1em; background-size: 100% 100%; background-image: url('https://assets-cdn.github.com/images/icons/emoji/shipit.png');"></span>
36
+ ```
37
+
38
+ ## Usage
39
+
40
+ Add the following to Gemfile:
41
+
42
+ ```ruby
43
+ gem "middleman-emojifire"
44
+ ```
45
+
46
+ And add the following to your `config.rb`:
47
+
48
+ ```ruby
49
+ activate :emojifire
50
+ ```
51
+
52
+ That's all.
53
+
54
+ ## Fallback on platforms which do not natively support emoji
55
+
56
+ Since middleman-emojifire set some data-attributes including an image source URL in tag, you can easily write a fallback script to display images instead of characters.
57
+
58
+ Simply adding the below snippet into your JavaScript assets will work:
59
+
60
+ ```javascript
61
+ document.addEventListener('DOMContentLoaded', function() {
62
+ var emojiSupported = (function() {
63
+ var node = document.createElement('canvas');
64
+ if (!node.getContext || !node.getContext('2d') ||
65
+ typeof node.getContext('2d').fillText !== 'function')
66
+ return false;
67
+ var ctx = node.getContext('2d');
68
+ ctx.textBaseline = 'top';
69
+ ctx.font = '32px Arial';
70
+ ctx.fillText('\ud83d\ude03', 0, 0);
71
+ return ctx.getImageData(16, 16, 1, 1).data[0] !== 0;
72
+ })();
73
+
74
+ if (emojiSupported) { return; }
75
+
76
+ var emojiElements = document.getElementsByClassName('emoji');
77
+
78
+ for (var i = 0; i < emojiElements.length; i++) {
79
+ var element = emojiElements[i];
80
+ var srcPath = element.dataset.fallback;
81
+ if (typeof srcPath !== 'undefined') {
82
+ element.innerHTML = '';
83
+ element.style.overflow = 'hidden';
84
+ element.style.display = 'inline-block';
85
+ element.style.width = '1em';
86
+ element.style.height = '1em';
87
+ element.style.margin = '0 0.1em';
88
+ element.style.backgroundSize = '100% 100%';
89
+ element.style.backgroundImage = "url('" + srcPath + "')";
90
+ delete element.dataset.fallback;
91
+ }
92
+ }
93
+ });
94
+ ```
95
+
96
+ It will detect if a platform supports emoji, and fallback to images if it does not.
97
+
98
+ ## Thanks
99
+
100
+ - [middleman-gemoji](https://github.com/yterajima/middleman-gemoji) as reference for both concept and implementation
101
+ - http://crocodillon.com/blog/parsing-emoji-unicode-in-javascript for native emoji support detection snippet in JS
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ end
9
+
10
+ task :default => :test
@@ -0,0 +1,4 @@
1
+ PROJECT_ROOT_PATH = File.dirname(File.dirname(File.dirname(__FILE__)))
2
+ require 'middleman-core'
3
+ require 'middleman-core/step_definitions'
4
+ require File.join(PROJECT_ROOT_PATH, 'lib', 'middleman-emojifire')
@@ -0,0 +1,7 @@
1
+ require "middleman-core"
2
+ require "middleman-emojifire/version"
3
+
4
+ ::Middleman::Extensions.register :emojifire do
5
+ require "middleman-emojifire/extension"
6
+ ::Middleman::Emojifire::Extension
7
+ end
@@ -0,0 +1,25 @@
1
+ module Middleman
2
+ module Emojifire
3
+ class Content
4
+ attr_reader :source
5
+
6
+ def initialize(source)
7
+ @source = source.to_s
8
+ end
9
+
10
+ def include_body?
11
+ source =~ %r{<body.*?>.*?</body>}m ? true : false
12
+ end
13
+
14
+ def body_only
15
+ source.gsub(%r{<body.*?>(.*?)</body>}m) do |match|
16
+ yield match
17
+ end
18
+ end
19
+
20
+ def to_s
21
+ source
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,36 @@
1
+ require "middleman-emojifire/content"
2
+ require "middleman-emojifire/ext/emoji_extension"
3
+
4
+ module Middleman
5
+ module Emojifire
6
+ class Converter
7
+ attr_reader :content
8
+
9
+ using Middleman::Emojifire::EmojiExtension
10
+
11
+ def initialize(content)
12
+ @content = ::Middleman::Emojifire::Content.new(content)
13
+ end
14
+
15
+ def convert
16
+ if content.include_body?
17
+ content.body_only { |body| emojify(body) }
18
+ else
19
+ emojify(content.to_s)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def emojify(source)
26
+ source.gsub(/:([\w+-]+):/) do |match|
27
+ if (emoji = Emoji.find_by_alias(Regexp.last_match[1]))
28
+ emoji.raw ? emoji.raw_unicode_character_html : emoji.fallback_image_html
29
+ else
30
+ match
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,28 @@
1
+ require "gemoji"
2
+
3
+ module Middleman
4
+ module Emojifire
5
+ module EmojiExtension
6
+ refine ::Emoji::Character do
7
+ GITHUB_DOT_COM_ASSET_HOST_URL = "https://assets-cdn.github.com".freeze
8
+ ASSET_PATH = "/images/icons/emoji".freeze
9
+
10
+ def raw_unicode_character_html
11
+ "<span class=\"emoji\" data-alias=\"#{name}\" " \
12
+ "data-fallback=\"#{fallback_source}\">" \
13
+ "#{raw}</span>"
14
+ end
15
+
16
+ def fallback_image_html
17
+ "<span class=\"emoji\" data-alias=\"#{name}\" " \
18
+ "style=\"overflow: hidden; display: inline-block; width: 1em; height: 1em; margin: 0 0.1em; background-size: 100% 100%; " \
19
+ "background-image: url('#{fallback_source}');\"></span>"
20
+ end
21
+
22
+ def fallback_source
23
+ File.join(GITHUB_DOT_COM_ASSET_HOST_URL, ASSET_PATH, image_filename)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,17 @@
1
+ require "middleman-core"
2
+ require "middleman-emojifire/converter"
3
+
4
+ module Middleman
5
+ module Emojifire
6
+ class Extension < ::Middleman::Extension
7
+ def initialize(app, options_hash={}, &block)
8
+ super
9
+ require "gemoji"
10
+
11
+ app.after_render do |content|
12
+ ::Middleman::Emojifire::Converter.new(content).convert
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ module Middleman
2
+ module Emojifire
3
+ VERSION = "1.1.0"
4
+ end
5
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "middleman-emojifire/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "middleman-emojifire"
7
+ spec.version = Middleman::Emojifire::VERSION
8
+ spec.platform = Gem::Platform::RUBY
9
+ spec.authors = ["Hirofumi Wakasugi"]
10
+ spec.email = ["baenej@gmail.com"]
11
+ spec.homepage = "https://github.com/5t111111/middleman-emojifire"
12
+ spec.summary = %q{Middleman emoji extension}
13
+ spec.description = %q{middleman-emojifire is a quite easy-to-use emoji extension for Middleman.}
14
+
15
+ spec.files = `git ls-files`.split("\n")
16
+ spec.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ spec.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_runtime_dependency "middleman-core", ">= 4.2.1"
21
+ spec.add_runtime_dependency "gemoji", ">= 3.0.0"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.10"
24
+ spec.add_development_dependency "rake", "~> 12.0"
25
+ spec.add_development_dependency "minitest", ">= 5.10"
26
+ end
@@ -0,0 +1,89 @@
1
+ require "test_helper"
2
+ require "middleman-emojifire/content"
3
+
4
+ describe Middleman::Emojifire::Content do
5
+ describe "initialize" do
6
+ it "saves stringified content" do
7
+ content = Middleman::Emojifire::Content.new(123)
8
+ expect(content.source).must_be_instance_of String
9
+ end
10
+ end
11
+
12
+ describe "include_body?" do
13
+ it "returns true if including body tag" do
14
+ content = Middleman::Emojifire::Content.new(
15
+ <<~EOS
16
+ <head>
17
+ <title>Test</title>
18
+ </head>
19
+ <body>
20
+ Test
21
+ </body>
22
+ EOS
23
+ )
24
+ expect(content.include_body?).must_equal true
25
+ end
26
+
27
+ it "returns true if including body tag with attributes" do
28
+ content = Middleman::Emojifire::Content.new(
29
+ <<~EOS
30
+ <body class="main">
31
+ Test
32
+ </body>
33
+ EOS
34
+ )
35
+ expect(content.include_body?).must_equal true
36
+ end
37
+
38
+ it "returns false if not including body tag" do
39
+ content = Middleman::Emojifire::Content.new(
40
+ <<~EOS
41
+ <head>
42
+ <title>Test</title>
43
+ </head>
44
+ EOS
45
+ )
46
+ expect(content.include_body?).must_equal false
47
+ end
48
+
49
+ it "returns false if including body but not tag" do
50
+ content = Middleman::Emojifire::Content.new(
51
+ <<~EOS
52
+ body
53
+ /body
54
+ EOS
55
+ )
56
+ expect(content.include_body?).must_equal false
57
+ end
58
+ end
59
+
60
+ describe "body_only" do
61
+ it "yields body of content only" do
62
+ content = Middleman::Emojifire::Content.new(
63
+ <<~EOS
64
+ <head>
65
+ <title>Test</title>
66
+ </head>
67
+ <body>Expect this to be yielded</body>
68
+ EOS
69
+ )
70
+
71
+ content.body_only do |body|
72
+ expect(body).must_equal "<body>Expect this to be yielded</body>"
73
+ end
74
+ end
75
+
76
+ it "returns substituted content" do
77
+ content = Middleman::Emojifire::Content.new("<head></head><body>Expect this to be substituted</body>")
78
+ substituted_content = content.body_only { |body| "<body>substituted!</body>" }
79
+ expect(substituted_content).must_equal "<head></head><body>substituted!</body>"
80
+ end
81
+ end
82
+
83
+ describe "to_s" do
84
+ it "returns source" do
85
+ content = Middleman::Emojifire::Content.new("pewpewpew")
86
+ expect(content.to_s).must_equal "pewpewpew"
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,48 @@
1
+ require "test_helper"
2
+ require "middleman-emojifire/converter"
3
+
4
+ describe Middleman::Emojifire::Converter do
5
+ describe "convert" do
6
+ it "converted emoji aliases in content with body" do
7
+ converter = Middleman::Emojifire::Converter.new(
8
+ <<~EOS
9
+ <head>
10
+ <title>:cat:</title>
11
+ </head>
12
+ <body>
13
+ :cat:
14
+ :shipit:
15
+ </body>
16
+ EOS
17
+ )
18
+
19
+ html = <<~EOS
20
+ <head>
21
+ <title>:cat:</title>
22
+ </head>
23
+ <body>
24
+ <span class="emoji" data-alias="cat" data-fallback="https://assets-cdn.github.com/images/icons/emoji/unicode/1f431.png">🐱</span>
25
+ <span class="emoji" data-alias="shipit" style="overflow: hidden; display: inline-block; width: 1em; height: 1em; margin: 0 0.1em; background-size: 100% 100%; background-image: url('https://assets-cdn.github.com/images/icons/emoji/shipit.png');"></span>
26
+ </body>
27
+ EOS
28
+
29
+ expect(converter.convert).must_equal html
30
+ end
31
+
32
+ it "converted emoji aliases in content without body" do
33
+ converter = Middleman::Emojifire::Converter.new(
34
+ <<~EOS
35
+ :cat:
36
+ :shipit:
37
+ EOS
38
+ )
39
+
40
+ html = <<~EOS
41
+ <span class="emoji" data-alias="cat" data-fallback="https://assets-cdn.github.com/images/icons/emoji/unicode/1f431.png">🐱</span>
42
+ <span class="emoji" data-alias="shipit" style="overflow: hidden; display: inline-block; width: 1em; height: 1em; margin: 0 0.1em; background-size: 100% 100%; background-image: url('https://assets-cdn.github.com/images/icons/emoji/shipit.png');"></span>
43
+ EOS
44
+
45
+ expect(converter.convert).must_equal html
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,39 @@
1
+ require "test_helper"
2
+ require "middleman-emojifire/ext/emoji_extension"
3
+
4
+ class Dummy
5
+ using Middleman::Emojifire::EmojiExtension
6
+
7
+ def initialize
8
+ @emoji = Emoji::Character.new("cat")
9
+ end
10
+
11
+ def raw_unicode_character_html_test
12
+ @emoji.raw_unicode_character_html
13
+ end
14
+
15
+ def fallback_image_html_test
16
+ @emoji.fallback_image_html
17
+ end
18
+ end
19
+
20
+ describe Middleman::Emojifire::EmojiExtension do
21
+ describe "raw_unicode_character_html" do
22
+ it "returns html for displaying raw unicode emoji character" do
23
+ dummy_class = Dummy.new
24
+ html = '<span class="emoji" data-alias="cat" ' \
25
+ 'data-fallback="https://assets-cdn.github.com/images/icons/emoji/cat.png"></span>'
26
+ expect(dummy_class.raw_unicode_character_html_test).must_equal html
27
+ end
28
+ end
29
+
30
+ describe "fallback_image_html" do
31
+ it "returns html for displaying fallback image instead of raw unicode emoji character" do
32
+ dummy_class = Dummy.new
33
+ html = '<span class="emoji" data-alias="cat" style="overflow: hidden; display: ' \
34
+ 'inline-block; width: 1em; height: 1em; margin: 0 0.1em; background-size: 100% 100%; ' \
35
+ 'background-image: url(\'https://assets-cdn.github.com/images/icons/emoji/cat.png\');"></span>'
36
+ expect(dummy_class.fallback_image_html_test).must_equal html
37
+ end
38
+ end
39
+ end
@@ -0,0 +1 @@
1
+ require "minitest/autorun"
metadata ADDED
@@ -0,0 +1,134 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: middleman-emojifire
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Hirofumi Wakasugi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-02-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: middleman-core
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 4.2.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 4.2.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: gemoji
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 3.0.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 3.0.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.10'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.10'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '12.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '12.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '5.10'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '5.10'
83
+ description: middleman-emojifire is a quite easy-to-use emoji extension for Middleman.
84
+ email:
85
+ - baenej@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - Gemfile
92
+ - README.md
93
+ - Rakefile
94
+ - features/support/env.rb
95
+ - lib/middleman-emojifire.rb
96
+ - lib/middleman-emojifire/content.rb
97
+ - lib/middleman-emojifire/converter.rb
98
+ - lib/middleman-emojifire/ext/emoji_extension.rb
99
+ - lib/middleman-emojifire/extension.rb
100
+ - lib/middleman-emojifire/version.rb
101
+ - middleman-emojifire.gemspec
102
+ - test/content_test.rb
103
+ - test/converter_test.rb
104
+ - test/emoji_extension_test.rb
105
+ - test/test_helper.rb
106
+ homepage: https://github.com/5t111111/middleman-emojifire
107
+ licenses: []
108
+ metadata: {}
109
+ post_install_message:
110
+ rdoc_options: []
111
+ require_paths:
112
+ - lib
113
+ required_ruby_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ required_rubygems_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ requirements: []
124
+ rubyforge_project:
125
+ rubygems_version: 2.5.2
126
+ signing_key:
127
+ specification_version: 4
128
+ summary: Middleman emoji extension
129
+ test_files:
130
+ - features/support/env.rb
131
+ - test/content_test.rb
132
+ - test/converter_test.rb
133
+ - test/emoji_extension_test.rb
134
+ - test/test_helper.rb