emojidex 0.0.10 β 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +0 -1
- data/Gemfile +1 -1
- data/Guardfile +26 -1
- data/emojidex.gemspec +3 -2
- data/lib/emojidex.rb +1 -0
- data/lib/emojidex/cache.rb +16 -15
- data/lib/emojidex/client.rb +1 -1
- data/lib/emojidex/collection_checker.rb +91 -0
- data/lib/emojidex/extended.rb +1 -1
- data/lib/emojidex/service.rb +3 -3
- data/lib/emojidex/utf.rb +2 -2
- data/spec/collection_checker_spec.rb +67 -0
- data/spec/spec_helper.rb +6 -0
- data/spec/support/sample_collections/good/emoji.json +30 -0
- data/spec/support/sample_collections/good/mouth.svg +49 -0
- data/spec/support/sample_collections/good/nut_and_bolt.svg +372 -0
- data/spec/support/sample_collections/good/purple_heart.svg +24 -0
- data/spec/support/sample_collections/good/px32/mouth.png +0 -0
- data/spec/support/sample_collections/good/px32/nut_and_bolt.png +0 -0
- data/spec/support/sample_collections/good/px32/purple_heart.png +0 -0
- data/spec/support/sample_collections/good/px32/woman_with_bunny_ears.png +0 -0
- data/spec/support/sample_collections/good/woman_with_bunny_ears.svg +90 -0
- data/spec/support/sample_collections/missing_assets/emoji.json +30 -0
- data/spec/support/sample_collections/missing_assets/mouth.svg +49 -0
- data/spec/support/sample_collections/missing_assets/purple_heart.svg +24 -0
- data/spec/support/sample_collections/missing_assets/px32/mouth.png +0 -0
- data/spec/support/sample_collections/missing_assets/px32/nut_and_bolt.png +0 -0
- data/spec/support/sample_collections/missing_assets/px32/woman_with_bunny_ears.png +0 -0
- data/spec/support/sample_collections/missing_assets/woman_with_bunny_ears.svg +90 -0
- data/spec/support/sample_collections/missing_index/emoji.json +23 -0
- data/spec/support/sample_collections/missing_index/mouth.svg +49 -0
- data/spec/support/sample_collections/missing_index/nut_and_bolt.svg +372 -0
- data/spec/support/sample_collections/missing_index/purple_heart.svg +24 -0
- data/spec/support/sample_collections/missing_index/px32/mouth.png +0 -0
- data/spec/support/sample_collections/missing_index/px32/nut_and_bolt.png +0 -0
- data/spec/support/sample_collections/missing_index/px32/purple_heart.png +0 -0
- data/spec/support/sample_collections/missing_index/px32/woman_with_bunny_ears.png +0 -0
- data/spec/support/sample_collections/missing_index/woman_with_bunny_ears.svg +90 -0
- data/spec/utf_spec.rb +2 -1
- metadata +29 -7
- data/Rakefile +0 -8
- data/spec/support/test1/animation.json +0 -6
- data/spec/support/test2/animation.json +0 -6
- data/spec/support/test3/animation.json +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4630fa81f0b4c20f7934cc0f5266e413ca7112a1
|
4
|
+
data.tar.gz: bfc71b18f0cfcc880d68bdefc3a7a27af1fa9592
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2edf4d9472f06706872132dfdbc5b2c1abf41fb2bd5f79f6ee7bcc0daf1887f5ef150bbb70828e8d6e46b71d9a23566808e736b36b8afe4389c97482b5d8d499
|
7
|
+
data.tar.gz: a5e307c155ef9a1e78e1d89d812a147d2cd0a485d064fb585ad7a4204ddd0f1d28ea59fbfcd534329d66cda2fcf71bc109bda69865511b47be76d345eef993c7
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -9,7 +9,6 @@ group :development do
|
|
9
9
|
gem 'guard-rspec'
|
10
10
|
gem 'rubocop'
|
11
11
|
gem 'guard-rubocop'
|
12
|
-
#gem 'emojidex-vectors', path: '../emojidex-vectors'
|
13
12
|
end
|
14
13
|
|
15
14
|
group :test do
|
@@ -17,4 +16,5 @@ group :test do
|
|
17
16
|
gem 'rspec'
|
18
17
|
gem 'webmock'
|
19
18
|
gem 'emojidex-vectors', github: 'emojidex/emojidex-vectors'
|
19
|
+
gem 'emojidex-rasters', github: 'emojidex/emojidex-rasters'
|
20
20
|
end
|
data/Guardfile
CHANGED
@@ -1,12 +1,37 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
# Note: The cmd option is now required due to the increasing number of ways
|
5
|
+
# rspec may be run, below are examples of the most common uses.
|
6
|
+
# * bundler: 'bundle exec rspec'
|
7
|
+
# * bundler binstubs: 'bin/rspec'
|
8
|
+
# * spring: 'bin/rsspec' (This will use spring if running and you have
|
9
|
+
# installed the spring binstubs per the docs)
|
10
|
+
# * zeus: 'zeus rspec' (requires the server to be started separetly)
|
11
|
+
# * 'just' rspec: 'rspec'
|
1
12
|
guard :rubocop do
|
2
13
|
watch(%r{.+\.rb$})
|
3
14
|
watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
|
4
15
|
end
|
5
16
|
|
6
|
-
guard :rspec do
|
17
|
+
guard :rspec, cmd: 'bundle exec rspec' do
|
7
18
|
watch(%r{^spec/.+_spec\.rb$})
|
8
19
|
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
9
20
|
watch('spec/spec_helper.rb') { "spec" }
|
10
21
|
|
22
|
+
# Rails example
|
23
|
+
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
24
|
+
watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
25
|
+
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
11
26
|
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
27
|
+
watch('config/routes.rb') { "spec/routing" }
|
28
|
+
watch('app/controllers/application_controller.rb') { "spec/controllers" }
|
29
|
+
watch('spec/rails_helper.rb') { "spec" }
|
30
|
+
|
31
|
+
# Capybara features specs
|
32
|
+
watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
|
33
|
+
|
34
|
+
# Turnip features and steps
|
35
|
+
watch(%r{^spec/acceptance/(.+)\.feature$})
|
36
|
+
watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
|
12
37
|
end
|
data/emojidex.gemspec
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'emojidex'
|
3
|
-
s.version = '0.0.
|
3
|
+
s.version = '0.0.11'
|
4
4
|
s.license = 'GPL-3, AGPL-3'
|
5
5
|
s.summary = 'emojidex Ruby tools'
|
6
|
-
s.description = 'emojidex emoji handling, search and lookup, listing and caching functionality
|
6
|
+
s.description = 'emojidex emoji handling, search and lookup, listing and caching functionality' \
|
7
|
+
' and user info (favorites/etc).'
|
7
8
|
s.authors = ['Rei Kagetsuki', 'Jun Tohyama', 'Vassil Kalkov', 'Rika Yoshida']
|
8
9
|
s.email = 'info@emojidex.com'
|
9
10
|
s.files = `git ls-files`.split("\n")
|
data/lib/emojidex.rb
CHANGED
data/lib/emojidex/cache.rb
CHANGED
@@ -5,28 +5,29 @@ require 'fileutils'
|
|
5
5
|
module Emojidex
|
6
6
|
# local caching functionality for collections
|
7
7
|
module Cache
|
8
|
-
attr_reader :
|
8
|
+
attr_reader :cache_path
|
9
9
|
|
10
10
|
def setup_cache(path = nil)
|
11
11
|
# check if cache dir is already set
|
12
|
-
return @
|
12
|
+
return @cache_path if @cache_path && path.nil?
|
13
13
|
# setup cache
|
14
|
-
@
|
15
|
-
|
14
|
+
@cache_path = File.expand_path(path || ENV['EMOJI_CACHE'] || "#{ENV['HOME']}/.emojidex/cache")
|
15
|
+
ENV['EMOJI_CACHE'] = @cache_path
|
16
|
+
FileUtils.mkdir_p(@cache_path)
|
16
17
|
Emojidex::Defaults.sizes.keys.each do |size|
|
17
|
-
FileUtils.mkdir_p(@
|
18
|
+
FileUtils.mkdir_p(@cache_path + "/#{size}")
|
18
19
|
end
|
19
|
-
@
|
20
|
+
@cache_path
|
20
21
|
end
|
21
22
|
|
22
23
|
# Caches emoji to local emoji storage cache
|
23
24
|
# Options:
|
24
|
-
#
|
25
|
+
# cache_path: manually specify cache location
|
25
26
|
# (default is ENV['EMOJI_CACHE'] or '$HOME/.emoji_cache')
|
26
27
|
# formats: formats to cache (default is SVG only)
|
27
28
|
# sizes: sizes to cache (default is px32, but this is irrelivant for SVG)
|
28
29
|
def cache!(options = {})
|
29
|
-
setup_cache options[:
|
30
|
+
setup_cache options[:cache_path]
|
30
31
|
formats = options[:formats] || [:svg, :png]
|
31
32
|
sizes = options[:sizes] || [:px32]
|
32
33
|
@emoji.values.each do |moji|
|
@@ -37,7 +38,7 @@ module Emojidex
|
|
37
38
|
end
|
38
39
|
|
39
40
|
def cache_index(destination = nil)
|
40
|
-
destination
|
41
|
+
destination ||= @cache_path
|
41
42
|
idx = Emojidex::Collection.new
|
42
43
|
idx.load_local_collection(destination) if FileTest.exist? "#{destination}/emoji.json"
|
43
44
|
idx.add_emoji @emoji.values
|
@@ -51,19 +52,19 @@ module Emojidex
|
|
51
52
|
def _svg_check_copy(moji)
|
52
53
|
src = @source_path + "/#{moji.code}"
|
53
54
|
if File.exist? "#{src}.svg"
|
54
|
-
unless File.exist?("#{@
|
55
|
-
FileUtils.compare_file("#{src}.svg", "#{@
|
56
|
-
FileUtils.cp("#{src}.svg", @
|
55
|
+
unless File.exist?("#{@cache_path}/#{moji.code}.svg") &&
|
56
|
+
FileUtils.compare_file("#{src}.svg", "#{@cache_path}/#{moji.code}.svg")
|
57
|
+
FileUtils.cp("#{src}.svg", @cache_path)
|
57
58
|
end
|
58
59
|
end
|
59
|
-
FileUtils.cp_r src, @
|
60
|
+
FileUtils.cp_r src, @cache_path if File.directory? src
|
60
61
|
end
|
61
62
|
|
62
63
|
def _raster_check_copy(moji, format, sizes)
|
63
64
|
sizes.each do |size|
|
64
65
|
src = @source_path + "/#{size}/#{moji.code}"
|
65
|
-
FileUtils.cp "src.#{format}", (@
|
66
|
-
FileUtils.cp_r src, @
|
66
|
+
FileUtils.cp "#{src}.#{format}", (@cache_path + "/#{size}") if FileTest.exist? "#{src}.#{format}"
|
67
|
+
FileUtils.cp_r src, @cache_path if File.directory? src
|
67
68
|
end
|
68
69
|
end
|
69
70
|
end
|
data/lib/emojidex/client.rb
CHANGED
@@ -0,0 +1,91 @@
|
|
1
|
+
|
2
|
+
require 'find'
|
3
|
+
require_relative 'defaults.rb'
|
4
|
+
|
5
|
+
module Emojidex
|
6
|
+
# Check collections for presence of image assets and discrepencies in emoji indexes.
|
7
|
+
class CollectionChecker
|
8
|
+
attr_reader :index_only, :asset_only
|
9
|
+
|
10
|
+
def initialize(collections, options = {})
|
11
|
+
collections = *collections
|
12
|
+
@index_only = {}
|
13
|
+
@asset_only = {}
|
14
|
+
asset_path = options[:asset_path] || collections.first.source_path
|
15
|
+
sizes = options[:sizes] || Defaults.sizes.keys
|
16
|
+
formats = options[:formats] || Defaults.formats
|
17
|
+
|
18
|
+
asset_files = create_asset_file_list(asset_path, sizes, formats)
|
19
|
+
check_for_index_only(collections, asset_files, sizes, formats)
|
20
|
+
check_for_asset_only(collections, asset_files)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def create_asset_file_list(dir, sizes, formats)
|
26
|
+
result = {}
|
27
|
+
result.merge!(create_file_list(dir, '.svg', '')) if formats.include?(':svg')
|
28
|
+
if formats.include?(':png')
|
29
|
+
sizes.each do |size|
|
30
|
+
result.merge!(create_file_list("#{dir}/#{size}", '.png', "#{size}/"))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
result
|
34
|
+
end
|
35
|
+
|
36
|
+
def create_file_list(dir, ext, prefix)
|
37
|
+
result = {}
|
38
|
+
Dir.foreach(dir) do |file|
|
39
|
+
result["#{prefix}#{File.basename(file, '.*')}".to_sym] =
|
40
|
+
"#{prefix}#{file}" if File.extname(file) == ext
|
41
|
+
end
|
42
|
+
result
|
43
|
+
end
|
44
|
+
|
45
|
+
def check_for_index_only(collections, asset_files, sizes, formats)
|
46
|
+
collections.each do |collection|
|
47
|
+
collection.emoji.values.each do |emoji|
|
48
|
+
tmp = []
|
49
|
+
tmp += create_svg_array(emoji, asset_files) if formats.include?(':svg')
|
50
|
+
tmp += create_png_array(emoji, asset_files, sizes) if formats.include?(':png')
|
51
|
+
@index_only[emoji.code.to_sym] = tmp unless tmp.empty?
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def create_svg_array(emoji, asset_files)
|
57
|
+
result = []
|
58
|
+
result << emoji.code if asset_files[emoji.code.to_sym].nil?
|
59
|
+
result
|
60
|
+
end
|
61
|
+
|
62
|
+
def create_png_array(emoji, asset_files, sizes)
|
63
|
+
result = []
|
64
|
+
sizes.each do |size|
|
65
|
+
name = "#{size}/#{emoji.code}"
|
66
|
+
result << name if asset_files[name.to_sym].nil?
|
67
|
+
end
|
68
|
+
result
|
69
|
+
end
|
70
|
+
|
71
|
+
def check_for_asset_only(collections, asset_files)
|
72
|
+
asset_files.each do |_key, value|
|
73
|
+
code = File.basename(value, '.*')
|
74
|
+
|
75
|
+
next if find_emoji_from_collections(collections, code)
|
76
|
+
|
77
|
+
symbol = code.to_sym
|
78
|
+
@asset_only[symbol] = [] if @asset_only[symbol].nil?
|
79
|
+
@asset_only[symbol] << value
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def find_emoji_from_collections(collections, code)
|
84
|
+
symbol = code.to_sym
|
85
|
+
collections.each do |collection|
|
86
|
+
return true unless collection.emoji[symbol].nil?
|
87
|
+
end
|
88
|
+
false
|
89
|
+
end
|
90
|
+
end # class CollectionChecker
|
91
|
+
end # module Emojidex
|
data/lib/emojidex/extended.rb
CHANGED
data/lib/emojidex/service.rb
CHANGED
@@ -13,12 +13,12 @@ module Emojidex
|
|
13
13
|
# sends an API search, adding results with add_emoji
|
14
14
|
# returns a collection, and adds results to the @emoji array
|
15
15
|
def search(criteria = {})
|
16
|
-
# TODO *NOTE try and replicate regex search functionality by passing regex to server
|
16
|
+
# TODO: *NOTE try and replicate regex search functionality by passing regex to server
|
17
17
|
end
|
18
18
|
|
19
19
|
# directly retrieves the emoji with the given code
|
20
20
|
def find_by_code(code)
|
21
|
-
# TODO
|
21
|
+
# TODO: perform a query on emojidex API
|
22
22
|
end
|
23
23
|
|
24
24
|
# emoji on the emojidex service make no language distinctions
|
@@ -27,6 +27,6 @@ module Emojidex
|
|
27
27
|
find_by_code(code)
|
28
28
|
end
|
29
29
|
|
30
|
-
# TODO override or add caching functionality to retrieve sized png or svg from service
|
30
|
+
# TODO: override or add caching functionality to retrieve sized png or svg from service
|
31
31
|
end
|
32
32
|
end
|
data/lib/emojidex/utf.rb
CHANGED
@@ -4,11 +4,11 @@ module Emojidex
|
|
4
4
|
# listing and search of standard UTF emoji
|
5
5
|
class UTF < Collection
|
6
6
|
def initialize
|
7
|
-
super
|
7
|
+
super
|
8
8
|
if defined? Emojidex::Vectors
|
9
9
|
load_local_collection Emojidex::Vectors.path + '/utf'
|
10
10
|
else
|
11
|
-
# TODO load from service
|
11
|
+
# TODO: load from service
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Emojidex::CollectionChecker do
|
5
|
+
|
6
|
+
before(:all) do
|
7
|
+
@sizes = [:px32]
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
let(:col_good) do
|
14
|
+
sample_collection 'good'
|
15
|
+
end
|
16
|
+
|
17
|
+
let(:col_missing_assets) do
|
18
|
+
sample_collection 'missing_assets'
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:col_missing_index) do # just missing entries in index, not missing the actual index
|
22
|
+
sample_collection 'missing_index'
|
23
|
+
end
|
24
|
+
|
25
|
+
describe 'Spec Collections' do
|
26
|
+
it 'load cleanly' do
|
27
|
+
expect(col_good).to be_an_instance_of(Emojidex::Collection)
|
28
|
+
expect(col_missing_assets).to be_an_instance_of(Emojidex::Collection)
|
29
|
+
expect(col_missing_index).to be_an_instance_of(Emojidex::Collection)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '.new' do
|
34
|
+
it 'creates a valid CollectionChecker instance and checks a valid collection' do
|
35
|
+
checker = Emojidex::CollectionChecker.new(col_good, {sizes: @sizes})
|
36
|
+
|
37
|
+
expect(checker).to be_an_instance_of(Emojidex::CollectionChecker)
|
38
|
+
expect(checker.index_only).to be_empty
|
39
|
+
expect(checker.asset_only).to be_empty
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'checks for and identifies missing assets' do
|
43
|
+
checker = Emojidex::CollectionChecker.new(col_missing_assets, {sizes: @sizes})
|
44
|
+
|
45
|
+
expect(checker.asset_only).to be_empty
|
46
|
+
expect(checker.index_only.size).to eq(2)
|
47
|
+
expect(checker.index_only).to eq(
|
48
|
+
{:nut_and_bolt=>["nut_and_bolt"], :purple_heart=>["px32/purple_heart"]})
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'checks for and identifies missing index entries' do
|
52
|
+
checker = Emojidex::CollectionChecker.new(col_missing_index, {sizes: @sizes})
|
53
|
+
|
54
|
+
expect(checker.index_only).to be_empty
|
55
|
+
expect(checker.asset_only.size).to eq(1)
|
56
|
+
expect(checker.asset_only).to eq(
|
57
|
+
{purple_heart: ["purple_heart.svg", "px32/purple_heart.png"]})
|
58
|
+
end
|
59
|
+
it 'checks collections against a specified asset directory' do
|
60
|
+
checker = Emojidex::CollectionChecker.new([col_missing_index, col_missing_assets],
|
61
|
+
{sizes: @sizes, asset_path: col_good.source_path})
|
62
|
+
|
63
|
+
expect(checker.index_only).to be_empty
|
64
|
+
expect(checker.asset_only).to be_empty
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,30 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"moji": "π",
|
4
|
+
"code": "mouth",
|
5
|
+
"code_ja": "ε£",
|
6
|
+
"category": "people",
|
7
|
+
"unicode": "1f444"
|
8
|
+
},
|
9
|
+
{
|
10
|
+
"moji": "π©",
|
11
|
+
"code": "nut_and_bolt",
|
12
|
+
"code_ja": "γγ«γοΌγγγ",
|
13
|
+
"category": "tools",
|
14
|
+
"unicode": "1f529"
|
15
|
+
},
|
16
|
+
{
|
17
|
+
"moji": "π",
|
18
|
+
"code": "purple_heart",
|
19
|
+
"code_ja": "γγΌγ(η΄«)",
|
20
|
+
"category": "abstract",
|
21
|
+
"unicode": "1f49c"
|
22
|
+
},
|
23
|
+
{
|
24
|
+
"moji": "π―",
|
25
|
+
"code": "woman_with_bunny_ears",
|
26
|
+
"code_ja": "γγγΌγ¬γΌγ«",
|
27
|
+
"category": "people",
|
28
|
+
"unicode": "1f46f"
|
29
|
+
}
|
30
|
+
]
|
@@ -0,0 +1,49 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
4
|
+
<svg version="1.1" id="γ¬γ€γ€γΌ_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
|
5
|
+
y="0px" width="64px" height="64px" viewBox="0 0 64 64" enable-background="new 0 0 64 64" xml:space="preserve">
|
6
|
+
<polygon fill="#661222" points="9.333,35.667 8.167,29.833 18.667,19.167 46,22.581 55.167,31.666 46.333,38 "/>
|
7
|
+
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="17.8975" y1="24.9985" x2="52.2147" y2="26.0599">
|
8
|
+
<stop offset="0" style="stop-color:#9C9C9C"/>
|
9
|
+
<stop offset="0.0142" style="stop-color:#A9A9A9"/>
|
10
|
+
<stop offset="0.0497" style="stop-color:#C4C4C4"/>
|
11
|
+
<stop offset="0.0905" style="stop-color:#DADADA"/>
|
12
|
+
<stop offset="0.1381" style="stop-color:#EBEBEB"/>
|
13
|
+
<stop offset="0.197" style="stop-color:#F6F6F6"/>
|
14
|
+
<stop offset="0.2797" style="stop-color:#FDFDFD"/>
|
15
|
+
<stop offset="0.5091" style="stop-color:#FFFFFF"/>
|
16
|
+
<stop offset="0.6532" style="stop-color:#FDFDFD"/>
|
17
|
+
<stop offset="0.7265" style="stop-color:#F5F5F5"/>
|
18
|
+
<stop offset="0.7838" style="stop-color:#E8E8E8"/>
|
19
|
+
<stop offset="0.8329" style="stop-color:#D5D5D5"/>
|
20
|
+
<stop offset="0.8766" style="stop-color:#BCBCBC"/>
|
21
|
+
<stop offset="0.9166" style="stop-color:#9E9E9E"/>
|
22
|
+
<stop offset="0.9537" style="stop-color:#7A7A7A"/>
|
23
|
+
<stop offset="0.9876" style="stop-color:#525252"/>
|
24
|
+
<stop offset="1" style="stop-color:#414141"/>
|
25
|
+
</linearGradient>
|
26
|
+
<path fill="url(#SVGID_1_)" d="M12.833,24.991c0,0,11.146,4.919,19.284,4.919s21.407-3.876,21.407-3.876l-10.438-4.55l-20.345-0.818
|
27
|
+
L12.833,24.991z"/>
|
28
|
+
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="28.4619" y1="12.6665" x2="32.6284" y2="33.6665">
|
29
|
+
<stop offset="0" style="stop-color:#FF9FB0"/>
|
30
|
+
<stop offset="0.2186" style="stop-color:#FF7D94"/>
|
31
|
+
<stop offset="0.5773" style="stop-color:#FF4A6A"/>
|
32
|
+
<stop offset="0.849" style="stop-color:#FF2B51"/>
|
33
|
+
<stop offset="1" style="stop-color:#FF1F47"/>
|
34
|
+
</linearGradient>
|
35
|
+
<path fill="url(#SVGID_2_)" stroke="#BC001B" stroke-miterlimit="10" d="M3.426,29.167c1.833-4.219,8.689-12.639,16.023-16.472
|
36
|
+
s9.811,3.021,12.811,3.021c3,0,7.528-7.002,13.668-2.384c6.28,4.723,15.503,15.396,15.003,16.896s-3.035,5.341-8.701,2.007
|
37
|
+
s-7.124-7.073-10.946-6.852C38.5,25.544,38,27.667,32,27.667c-6.5,0-7.711-3.631-11.878-2.606S8.679,34.47,5.913,33.563
|
38
|
+
C3.881,32.897,2.297,31.763,3.426,29.167z"/>
|
39
|
+
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="32.0557" y1="35.5488" x2="34.3892" y2="57.8818">
|
40
|
+
<stop offset="0" style="stop-color:#FF9FB0"/>
|
41
|
+
<stop offset="0.2186" style="stop-color:#FF7D94"/>
|
42
|
+
<stop offset="0.5773" style="stop-color:#FF4A6A"/>
|
43
|
+
<stop offset="0.849" style="stop-color:#FF2B51"/>
|
44
|
+
<stop offset="1" style="stop-color:#FF1F47"/>
|
45
|
+
</linearGradient>
|
46
|
+
<path fill="url(#SVGID_3_)" stroke="#BC001B" stroke-miterlimit="10" d="M5.885,32.888c10.333-3.5,16.333,1.668,27,1.334
|
47
|
+
s14.833-4.167,25.167-1.751c3.644,0.852,1.747,5.584-1.834,9.047c-2.797,2.705-14.5,7.87-23.333,7.87
|
48
|
+
c-8.833,0-22.333-5-25.833-8.666C4.679,38.236,2.14,34.156,5.885,32.888z"/>
|
49
|
+
</svg>
|