icomoon2sass 1.0.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.
- checksums.yaml +7 -0
- data/bin/icomoon2sass +3 -0
- data/lib/icomoon2sass/archive.rb +14 -0
- data/lib/icomoon2sass/cli.rb +56 -0
- data/lib/icomoon2sass/dir.rb +21 -0
- data/lib/icomoon2sass/font.rb +23 -0
- data/lib/icomoon2sass/sass.rb +42 -0
- data/lib/icomoon2sass/templates/list.sass.erb +24 -0
- data/lib/icomoon2sass/templates/map.sass.erb +48 -0
- data/lib/icomoon2sass/version.rb +4 -0
- data/lib/icomoon2sass/zip.rb +22 -0
- data/lib/icomoon2sass.rb +11 -0
- data/lib/run.rb +69 -0
- metadata +100 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c9c2c51780ca9aa2519680c498b3902f2479c08b
|
4
|
+
data.tar.gz: 95af4db26408dc589dc293375abe2b5e4d12e6c6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ff4710638cd3c72b98f71062d522111b614a6f5f83522659a31b25fb1ffa8a1a3812b3826d98c533a406558e2046325d5e73b57f3edfc596c0d0419604fb78e9
|
7
|
+
data.tar.gz: 940d4eebf92396248ced4daf6ee771e20156c3ad0627e02053139754ec5ef1c98485070fcc3972b445fbc654df43c4d96f1150c756bae87503783b2b318d2a03
|
data/bin/icomoon2sass
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
class Icomoon2Sass::Archive
|
2
|
+
attr_reader :files
|
3
|
+
|
4
|
+
EXTRACTABLE_PATTERN = /(fonts\/.*|selection\.js|style\.css)/
|
5
|
+
|
6
|
+
def font_files
|
7
|
+
@_font_files ||= @files.reject {|key| !key.match(/fonts/) }
|
8
|
+
end
|
9
|
+
|
10
|
+
def metadata_file
|
11
|
+
@_metadata_file ||= @files.reject {|key| !key.match(/\.json/) }.values.first
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'thor/group'
|
3
|
+
require 'icomoon2sass'
|
4
|
+
|
5
|
+
class Icomoon2Sass::CLI < Thor::Group
|
6
|
+
include Thor::Actions
|
7
|
+
|
8
|
+
argument :icomoon
|
9
|
+
|
10
|
+
class_option :'font-path', type: :string, default: './', desc: 'Destination path for font files'
|
11
|
+
class_option :'sass-path', type: :string, default: './', desc: 'Destination path for Sass files'
|
12
|
+
class_option :scss, type: :boolean, default: false, desc: 'Use the SCSS syntax'
|
13
|
+
class_option :compatible, aliases: '-c', type: :boolean, default: false, desc: 'Generate code compatible with Sass 3.2'
|
14
|
+
|
15
|
+
def start
|
16
|
+
|
17
|
+
if icomoon.end_with? '.zip'
|
18
|
+
say_status('Reading zip file.', '', :green)
|
19
|
+
|
20
|
+
files = Icomoon2Sass::Zip.new icomoon
|
21
|
+
|
22
|
+
elsif Dir.exists? icomoon
|
23
|
+
say_status('Reading directory.', '', :blue)
|
24
|
+
|
25
|
+
files = Icomoon2Sass::Dir.new icomoon
|
26
|
+
|
27
|
+
else
|
28
|
+
return say_status('WTF?!', 'I have no idea what I\'m doing.', :red)
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
return say_status('You seem to be missing \'selection.json\'.', '', :red) unless files.files['selection.json']
|
33
|
+
|
34
|
+
|
35
|
+
font = Icomoon2Sass::Font.new files.metadata_file
|
36
|
+
|
37
|
+
syntax = options['scss'] ? 'scss' : 'sass'
|
38
|
+
|
39
|
+
compatible = options['compatible'] || false
|
40
|
+
|
41
|
+
sass = Icomoon2Sass::Sass.new font, syntax, compatible
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
# Save the Sass file
|
47
|
+
create_file "#{options['sass-path']}/_icons.#{sass.syntax}", sass.code
|
48
|
+
|
49
|
+
files.font_files.each do |filename, content|
|
50
|
+
|
51
|
+
create_file "#{options['font-path']}/#{filename.sub('fonts/', '')}", content
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Icomoon2Sass::Dir < Icomoon2Sass::Archive
|
2
|
+
|
3
|
+
def initialize(directory)
|
4
|
+
@files = {}
|
5
|
+
|
6
|
+
Dir.glob("#{directory}/**/*", File::FNM_DOTMATCH) do |file|
|
7
|
+
next if ['.','..','.DS_Store'].include? file
|
8
|
+
|
9
|
+
@files[file.sub("#{directory}/", '')] = File.read(file) if extractable? file
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def extractable?(entry)
|
17
|
+
return EXTRACTABLE_PATTERN.match(entry) && File.file?(entry)
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
class Icomoon2Sass::Font
|
4
|
+
attr_reader :icons, :font_family
|
5
|
+
|
6
|
+
def initialize(metadata)
|
7
|
+
@icons = {}
|
8
|
+
|
9
|
+
json = JSON.parse(metadata)
|
10
|
+
|
11
|
+
@font_family = json['preferences']['fontPref']['metadata']['fontFamily']
|
12
|
+
|
13
|
+
json['icons'].each do |icon|
|
14
|
+
@icons[icon['properties']['name']] = {
|
15
|
+
character: [icon['properties']['code']].pack('U'),
|
16
|
+
codepoint: '\%0x' % icon['properties']['code'].ord
|
17
|
+
}
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require 'sass'
|
3
|
+
|
4
|
+
class Icomoon2Sass::Sass
|
5
|
+
attr_reader :code, :syntax
|
6
|
+
|
7
|
+
def initialize(font, syntax = 'sass', compatible = false)
|
8
|
+
@syntax = syntax
|
9
|
+
|
10
|
+
if compatible
|
11
|
+
@code = sass_convert 'sass', syntax, template('list', font)
|
12
|
+
|
13
|
+
else
|
14
|
+
@code = sass_convert 'sass', syntax, template('map', font)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def template(format, font)
|
21
|
+
icons = font.icons
|
22
|
+
font_family = font.font_family
|
23
|
+
|
24
|
+
tmpl = File.read("lib/icomoon2sass/templates/#{format}.sass.erb")
|
25
|
+
|
26
|
+
renderer = ERB.new(tmpl)
|
27
|
+
renderer.result(binding)
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def sass_convert(from_syntax, to_syntax, sass)
|
32
|
+
return sass if from_syntax == to_syntax
|
33
|
+
|
34
|
+
begin
|
35
|
+
Sass::Engine.new(sass, {:from => from_syntax.to_sym, :to => to_syntax.to_sym, :syntax => from_syntax.to_sym}).to_tree.send("to_#{to_syntax}").chomp
|
36
|
+
rescue Sass::SyntaxError => e
|
37
|
+
sass
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<% icons.each do |icon, content|
|
2
|
+
%>$<%= "#{icon}-icon: \'#{content[:codepoint]}\'" %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
%icon-pseudo-content
|
6
|
+
font-family: '<%= font_family %>'
|
7
|
+
speak: none
|
8
|
+
font-style: normal
|
9
|
+
font-weight: normal
|
10
|
+
font-variant: normal
|
11
|
+
text-transform: none
|
12
|
+
line-height: 1
|
13
|
+
|
14
|
+
// Better Font Rendering
|
15
|
+
-webkit-font-smoothing: antialiased
|
16
|
+
-moz-osx-font-smoothing: grayscale
|
17
|
+
|
18
|
+
<% icons.each do |icon, content| %>
|
19
|
+
<%= "%#{icon}-icon" %>:before
|
20
|
+
@extend %icon-pseudo-content
|
21
|
+
|
22
|
+
content: <%= "$#{icon}-icon" %>
|
23
|
+
<% end %>
|
24
|
+
|
@@ -0,0 +1,48 @@
|
|
1
|
+
$icons: ( <%=
|
2
|
+
list = []
|
3
|
+
icons.each do |icon, contents|
|
4
|
+
list.push "#{icon}: '#{contents[:codepoint]}'"
|
5
|
+
end
|
6
|
+
|
7
|
+
list.join(", ")
|
8
|
+
%> )
|
9
|
+
|
10
|
+
|
11
|
+
///**
|
12
|
+
// * Allows you to access an individual icon by name.
|
13
|
+
// *
|
14
|
+
// * @param {String} $name - name of icon
|
15
|
+
// *
|
16
|
+
// * @example scss
|
17
|
+
// * .foo {
|
18
|
+
// * content: icon(github);
|
19
|
+
// * }
|
20
|
+
// *
|
21
|
+
// * @return {String | Null}
|
22
|
+
// */
|
23
|
+
@function icon($name)
|
24
|
+
@return map-get($icons, $name)
|
25
|
+
|
26
|
+
|
27
|
+
%icon-pseudo-content
|
28
|
+
font-family: '<%= font_family %>'
|
29
|
+
speak: none
|
30
|
+
font-style: normal
|
31
|
+
font-weight: normal
|
32
|
+
font-variant: normal
|
33
|
+
text-transform: none
|
34
|
+
line-height: 1
|
35
|
+
vertical-align: middle
|
36
|
+
|
37
|
+
// Better Font Rendering
|
38
|
+
-webkit-font-smoothing: antialiased
|
39
|
+
-moz-osx-font-smoothing: grayscale
|
40
|
+
|
41
|
+
|
42
|
+
@each $placeholder, $content in $icons
|
43
|
+
%#{$placeholder}-icon:before
|
44
|
+
@extend %icon-pseudo-content
|
45
|
+
|
46
|
+
@each $value in $content
|
47
|
+
content: $value
|
48
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'zip'
|
2
|
+
|
3
|
+
class Icomoon2Sass::Zip < Icomoon2Sass::Archive
|
4
|
+
|
5
|
+
def initialize(zip_file)
|
6
|
+
@files = {}
|
7
|
+
|
8
|
+
Zip::File.open(zip_file) do |z|
|
9
|
+
z.each do |entry|
|
10
|
+
@files[entry.name] = z.get_input_stream(entry).read if extractable? entry
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def extractable?(entry)
|
18
|
+
return EXTRACTABLE_PATTERN.match(entry.name) && entry.ftype == :file
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
data/lib/icomoon2sass.rb
ADDED
data/lib/run.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'icomoon2sass/cli'
|
2
|
+
|
3
|
+
|
4
|
+
ARGV << '--help' if ARGV.empty?
|
5
|
+
|
6
|
+
|
7
|
+
help_message = <<-EOT
|
8
|
+
Usage: icomoon2sass path/to/icomoon(.zip) [OPTIONS]
|
9
|
+
|
10
|
+
OPTIONS
|
11
|
+
--font-path PATH Destination path for font files, defaults to current directory
|
12
|
+
--sass-path PATH Destination path for Sass files, defaults to current directory
|
13
|
+
--scss Use the SCSS syntax
|
14
|
+
-c, --compatible Generate code compatible with Sass 3.2
|
15
|
+
|
16
|
+
|
17
|
+
OUTPUT
|
18
|
+
By default icomoon2sass generates Sass code in the indented Sass syntax. Further,
|
19
|
+
the default generated code is only compaitble with Sass 3.3+.
|
20
|
+
|
21
|
+
$icons: (
|
22
|
+
github: \'\\28\',
|
23
|
+
twitter: \'\\29\',
|
24
|
+
gear: \'\\e002\',
|
25
|
+
...
|
26
|
+
)
|
27
|
+
|
28
|
+
@each $placeholder, $content in $icons
|
29
|
+
%\#{$placeholder}-icon
|
30
|
+
@each $value in $content
|
31
|
+
content: $value
|
32
|
+
|
33
|
+
Sass 3.2 doesn't support hash-like maps, so if you're still using 3.2, you'll need
|
34
|
+
to set the '-c' flag, which will generate code like this:
|
35
|
+
|
36
|
+
$github-icon: \'\\28\'
|
37
|
+
$twitter-icon: \'\\29\'
|
38
|
+
$gear-icon: \'\\e002\'
|
39
|
+
|
40
|
+
...
|
41
|
+
|
42
|
+
%github-icon
|
43
|
+
content: $github-icon
|
44
|
+
|
45
|
+
%twitter-icon
|
46
|
+
content: $twitter-icon
|
47
|
+
|
48
|
+
%gear-icon
|
49
|
+
content: $gear-icon
|
50
|
+
EOT
|
51
|
+
|
52
|
+
command = ARGV[0]
|
53
|
+
|
54
|
+
if !(command.nil? || command == '--help')
|
55
|
+
Icomoon2Sass::CLI.start
|
56
|
+
|
57
|
+
|
58
|
+
elsif command == '--help'
|
59
|
+
puts help_message
|
60
|
+
|
61
|
+
else
|
62
|
+
puts "Error: Command '#{command}' not recognized"
|
63
|
+
if %x{rake #{command} --dry-run 2>&1 } && $?.success?
|
64
|
+
puts "Did you mean: `$ rake #{command}` ?\n\n"
|
65
|
+
end
|
66
|
+
puts help_message
|
67
|
+
exit(1)
|
68
|
+
end
|
69
|
+
|
metadata
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: icomoon2sass
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jed Foster
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-08-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: thor
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.19'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.19'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rubyzip
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: sass
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.2.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.2.0
|
55
|
+
description: Utility for using Icomoon icon sets in Sass projects
|
56
|
+
email:
|
57
|
+
- jed@jedfoster.com
|
58
|
+
executables:
|
59
|
+
- icomoon2sass
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- bin/icomoon2sass
|
64
|
+
- lib/icomoon2sass.rb
|
65
|
+
- lib/icomoon2sass/archive.rb
|
66
|
+
- lib/icomoon2sass/cli.rb
|
67
|
+
- lib/icomoon2sass/dir.rb
|
68
|
+
- lib/icomoon2sass/font.rb
|
69
|
+
- lib/icomoon2sass/sass.rb
|
70
|
+
- lib/icomoon2sass/templates/list.sass.erb
|
71
|
+
- lib/icomoon2sass/templates/map.sass.erb
|
72
|
+
- lib/icomoon2sass/version.rb
|
73
|
+
- lib/icomoon2sass/zip.rb
|
74
|
+
- lib/run.rb
|
75
|
+
homepage: https://github.com/jedfoster/icomoon2sass
|
76
|
+
licenses:
|
77
|
+
- MIT
|
78
|
+
metadata: {}
|
79
|
+
post_install_message:
|
80
|
+
rdoc_options: []
|
81
|
+
require_paths:
|
82
|
+
- lib
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
requirements: []
|
94
|
+
rubyforge_project:
|
95
|
+
rubygems_version: 2.2.2
|
96
|
+
signing_key:
|
97
|
+
specification_version: 4
|
98
|
+
summary: Command line utility that extracts fonts and codepoints from an Icomoon .zip
|
99
|
+
file and generates a Sass file with variables and placholders.
|
100
|
+
test_files: []
|