fontcustomtoadstool 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +18 -0
- data/CHANGELOG.md +12 -0
- data/Gemfile +4 -0
- data/Guardfile +15 -0
- data/LICENSES.txt +60 -0
- data/README.md +28 -0
- data/Rakefile +10 -0
- data/bin/fontcustom +5 -0
- data/fontcustomToadstool.gemspec +32 -0
- data/lib/fontcustom.rb +21 -0
- data/lib/fontcustom/cli.rb +24 -0
- data/lib/fontcustom/generator.rb +87 -0
- data/lib/fontcustom/scripts/generate.py +78 -0
- data/lib/fontcustom/scripts/sfnt2woff +0 -0
- data/lib/fontcustom/templates/fontcustom.css +72 -0
- data/lib/fontcustom/templates/fontcustom.scss +65 -0
- data/lib/fontcustom/version.rb +3 -0
- data/lib/fontcustom/watcher.rb +36 -0
- data/spec/fixtures/empty/no_vectors_here.txt +0 -0
- data/spec/fixtures/vectors/C.svg +4 -0
- data/spec/fixtures/vectors/D.svg +3 -0
- data/spec/fixtures/vectors/a_R3ally-eXotic f1Le Name.svg +3 -0
- data/spec/fontcustom/fontcustom_spec.rb +42 -0
- data/spec/fontcustom/generator_spec.rb +75 -0
- data/spec/fontcustom/watcher_spec.rb.off +34 -0
- data/spec/spec_helper.rb +29 -0
- metadata +261 -0
data/.gitignore
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
## 0.1.0 (12/2/2012)
|
2
|
+
|
3
|
+
* Changed API to use Thor `class_option`s
|
4
|
+
* Added option to change the name of the font and generated files ([#6](https://github.com/endtwist/fontcustom/issues/6))
|
5
|
+
* Added option to disable the file name hash ([#13](https://github.com/endtwist/fontcustom/issues/13))
|
6
|
+
* `fontcustom watch` compiles automatically on the first run
|
7
|
+
* Better help messages
|
8
|
+
|
9
|
+
## 0.0.2 (11/26/2012)
|
10
|
+
|
11
|
+
* Fixed gemspec dependency bug ([#2](https://github.com/endtwist/fontcustom/pull/2))
|
12
|
+
* Fixed Windows Chrome PUA bug ([#1](https://github.com/endtwist/fontcustom/issues/1))
|
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'spork' do
|
5
|
+
watch('Gemfile.lock')
|
6
|
+
watch('spec/spec_helper.rb') { :rspec }
|
7
|
+
end
|
8
|
+
|
9
|
+
guard 'rspec', :cli => '--color --drb' do
|
10
|
+
watch(%r{^spec/.+_spec\.rb$})
|
11
|
+
watch(%r{^lib/fontcustom/(.+)\.rb$}) { |m| "spec/fontcustom/#{m[1]}_spec.rb" }
|
12
|
+
watch('lib/fontcustom.rb') { 'spec/fontcustom/fontcustom_spec.rb' }
|
13
|
+
watch('lib/fontcustom/core.rb') { 'spec/fontcustom/fontcustom_spec.rb' }
|
14
|
+
watch('spec/spec_helper.rb') { 'spec' }
|
15
|
+
end
|
data/LICENSES.txt
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
fontcustom
|
2
|
+
|
3
|
+
Copyright (c) 2012 Yifei Zhang, Joshua Gross
|
4
|
+
|
5
|
+
MIT License
|
6
|
+
|
7
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
8
|
+
a copy of this software and associated documentation files (the
|
9
|
+
"Software"), to deal in the Software without restriction, including
|
10
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
11
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
12
|
+
permit persons to whom the Software is furnished to do so, subject to
|
13
|
+
the following conditions:
|
14
|
+
|
15
|
+
The above copyright notice and this permission notice shall be
|
16
|
+
included in all copies or substantial portions of the Software.
|
17
|
+
|
18
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
19
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
20
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
21
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
22
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
23
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
24
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
25
|
+
|
26
|
+
|
27
|
+
sfnt2woff
|
28
|
+
|
29
|
+
Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
30
|
+
|
31
|
+
The contents of this file are subject to the Mozilla Public License Version
|
32
|
+
1.1 (the "License"); you may not use this file except in compliance with
|
33
|
+
the License. You may obtain a copy of the License at
|
34
|
+
http://www.mozilla.org/MPL/
|
35
|
+
|
36
|
+
Software distributed under the License is distributed on an "AS IS" basis,
|
37
|
+
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
38
|
+
for the specific language governing rights and limitations under the
|
39
|
+
License.
|
40
|
+
|
41
|
+
The Original Code is WOFF font packaging code.
|
42
|
+
|
43
|
+
The Initial Developer of the Original Code is Mozilla Corporation.
|
44
|
+
Portions created by the Initial Developer are Copyright (C) 2009
|
45
|
+
the Initial Developer. All Rights Reserved.
|
46
|
+
|
47
|
+
Contributor(s):
|
48
|
+
Jonathan Kew <jfkthame@gmail.com>
|
49
|
+
|
50
|
+
Alternatively, the contents of this file may be used under the terms of
|
51
|
+
either the GNU General Public License Version 2 or later (the "GPL"), or
|
52
|
+
the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
53
|
+
in which case the provisions of the GPL or the LGPL are applicable instead
|
54
|
+
of those above. If you wish to allow use of your version of this file only
|
55
|
+
under the terms of either the GPL or the LGPL, and not to allow others to
|
56
|
+
use your version of this file under the terms of the MPL, indicate your
|
57
|
+
decision by deleting the provisions above and replace them with the notice
|
58
|
+
and other provisions required by the GPL or the LGPL. If you do not delete
|
59
|
+
the provisions above, a recipient may use your version of this file under
|
60
|
+
the terms of any one of the MPL, the GPL or the LGPL.
|
data/README.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
#FontCustom v0.1.2
|
2
|
+
|
3
|
+
**Generate custom icon webfonts from the comfort of the command line.**
|
4
|
+
|
5
|
+
[Full documentation](http://endtwist.github.com/fontcustom/)<br/>
|
6
|
+
[Feedback and issues](https://github.com/endtwist/fontcustom/issues) to the core app.
|
7
|
+
|
8
|
+
|
9
|
+
##What is FontCustom.sass?
|
10
|
+
There are two difference between FontCustom and FontCustom.sass. The main difference is that I converted the [template files](http://goo.gl/GZ53q) from old vanilla CSS to Sass. Nothing really magical there.
|
11
|
+
|
12
|
+
The next difference is that I beat up on the [generator.rb](http://goo.gl/IGZi0) file so that this better suits the Toadstool framework. Specific placement of the generated font files and a generated Sass partial as well.
|
13
|
+
|
14
|
+
##Installation
|
15
|
+
```sh
|
16
|
+
# Requires FontForge
|
17
|
+
brew install fontforge eot-utils ttfautohint
|
18
|
+
gem install fontcustom
|
19
|
+
```
|
20
|
+
|
21
|
+
##Usage
|
22
|
+
```sh
|
23
|
+
fontcustom compile path/to/vectors # Compile icons and css to path/to/fontcustom/*
|
24
|
+
fontcustom watch path/to/vectors # Watch for changes
|
25
|
+
```
|
26
|
+
|
27
|
+
##To-do
|
28
|
+
See [project issues](http://goo.gl/RfCKl) for an updated list.
|
data/Rakefile
ADDED
data/bin/fontcustom
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'fontcustom/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "fontcustomtoadstool"
|
8
|
+
gem.version = Fontcustomtoadstool::VERSION
|
9
|
+
gem.authors = ["Yifei Zhang", "Joshua Gross", "Dale Sande"]
|
10
|
+
gem.email = ["yz@yifei.co", "joshua@gross.is", "dale.sande@gmail.com"]
|
11
|
+
gem.summary = %q{Generate custom icon webfonts from the comfort of the command line.}
|
12
|
+
gem.description = %q{Transforms EPS and SVG vectors into icon webfonts. Generates compatible CSS for Toadstool framework}
|
13
|
+
gem.homepage = "https://github.com/blackfalcon/fontcustom.sass"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.add_dependency 'json'
|
21
|
+
gem.add_dependency 'thor'
|
22
|
+
gem.add_dependency 'listen'
|
23
|
+
|
24
|
+
gem.add_development_dependency 'rake'
|
25
|
+
gem.add_development_dependency 'bundler'
|
26
|
+
gem.add_development_dependency 'rspec'
|
27
|
+
gem.add_development_dependency 'fakefs'
|
28
|
+
gem.add_development_dependency 'spork'
|
29
|
+
gem.add_development_dependency 'guard-spork'
|
30
|
+
gem.add_development_dependency 'guard-rspec'
|
31
|
+
gem.add_development_dependency 'rb-fsevent', '~> 0.9.1'
|
32
|
+
end
|
data/lib/fontcustom.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'fontcustom/version'
|
2
|
+
require 'fontcustom/generator'
|
3
|
+
require 'fontcustom/watcher'
|
4
|
+
|
5
|
+
module Fontcustom
|
6
|
+
# Usage:
|
7
|
+
# Fontcustom.compile 'path/to/vectors', '-o', 'path/to/output'
|
8
|
+
def compile(*args)
|
9
|
+
Fontcustom::Generator.start(args) # as array
|
10
|
+
end
|
11
|
+
|
12
|
+
def watch(*args)
|
13
|
+
Fontcustom::Watcher.watch(*args)
|
14
|
+
end
|
15
|
+
|
16
|
+
def stop
|
17
|
+
Fontcustom::Watcher.stop
|
18
|
+
end
|
19
|
+
|
20
|
+
module_function :compile, :watch, :stop
|
21
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'fontcustom'
|
3
|
+
|
4
|
+
module Fontcustom
|
5
|
+
class CLI < Thor
|
6
|
+
# duplicated from Fontcustom::Generator so as to also appear under `fontcustom help` command
|
7
|
+
class_option :output, :aliases => '-o', :desc => 'Specify an output directory. Default: $DIR/fontcustom'
|
8
|
+
class_option :name, :aliases => '-n', :desc => 'Specify a font name. This will be used in the generated fonts and CSS. Default: fontcustom'
|
9
|
+
class_option :nohash, :type => :boolean, :default => false, :desc => 'Disable filename hashes. Default: false'
|
10
|
+
|
11
|
+
desc 'compile DIR [options]', 'Generates webfonts and CSS from *.svg and *.eps files in DIR.'
|
12
|
+
def compile(*args)
|
13
|
+
# workaround to pass arguments from one Thor class to another
|
14
|
+
ARGV.shift
|
15
|
+
Fontcustom.compile(*ARGV)
|
16
|
+
end
|
17
|
+
|
18
|
+
desc 'watch DIR [options]', 'Watches DIR for changes and regenerates webfonts and CSS automatically.'
|
19
|
+
def watch(*args)
|
20
|
+
ARGV.shift
|
21
|
+
Fontcustom.watch(*ARGV)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'thor/group'
|
3
|
+
|
4
|
+
module Fontcustom
|
5
|
+
class Generator < Thor::Group
|
6
|
+
include Thor::Actions
|
7
|
+
|
8
|
+
desc 'Generates webfonts from given directory of vectors.'
|
9
|
+
|
10
|
+
argument :input, :type => :string
|
11
|
+
class_option :output, :aliases => '-o'
|
12
|
+
class_option :name, :aliases => '-n'
|
13
|
+
class_option :nohash, :type => :boolean, :default => false
|
14
|
+
|
15
|
+
def self.source_root
|
16
|
+
File.dirname(__FILE__)
|
17
|
+
end
|
18
|
+
|
19
|
+
def verify_fontforge
|
20
|
+
if `which fontforge` == ''
|
21
|
+
raise Thor::Error, 'Please install fontforge first.'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def verify_input_dir
|
26
|
+
if ! File.directory?(input)
|
27
|
+
raise Thor::Error, "#{input} doesn't exist or isn't a directory."
|
28
|
+
elsif Dir[File.join(input, '*.{svg,eps}')].empty?
|
29
|
+
raise Thor::Error, "#{input} doesn't contain any vectors (*.svg or *.eps files)."
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def verify_or_create_output_dir
|
34
|
+
@output = options.output.nil? ? File.join(File.dirname(input), 'public/fonts/') : options.output
|
35
|
+
empty_directory(@output) unless File.directory?(@output)
|
36
|
+
end
|
37
|
+
|
38
|
+
def normalize_name
|
39
|
+
@name = if options.name
|
40
|
+
options.name.gsub(/\W/, '-').downcase
|
41
|
+
else
|
42
|
+
'fontcustom'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def cleanup_output_dir
|
47
|
+
css = File.join(@output, 'fontcustom.scss')
|
48
|
+
old_name = if File.exists? css
|
49
|
+
line = IO.readlines(css)[5] # font-family: "Example Font";
|
50
|
+
line.scan(/".+"/)[0][1..-2].gsub(/\W/, '-').downcase # => 'example-font'
|
51
|
+
else
|
52
|
+
'fontcustom'
|
53
|
+
end
|
54
|
+
|
55
|
+
old_files = Dir[File.join(@output, old_name + '-*.{woff,ttf,eot,svg}')]
|
56
|
+
old_files << css if File.exists?(css)
|
57
|
+
old_files.each {|file| remove_file file }
|
58
|
+
end
|
59
|
+
|
60
|
+
def generate
|
61
|
+
gem_file_path = File.expand_path(File.join(File.dirname(__FILE__)))
|
62
|
+
name = options.name ? ' --name ' + @name : ''
|
63
|
+
nohash = options.nohash ? ' --nohash' : ''
|
64
|
+
|
65
|
+
# suppress fontforge message
|
66
|
+
# TODO get font name and classes from script (without showing fontforge message)
|
67
|
+
`fontforge -script #{gem_file_path}/scripts/generate.py #{input} #{@output + name + nohash} > /dev/null 2>&1`
|
68
|
+
end
|
69
|
+
|
70
|
+
def show_paths
|
71
|
+
file = Dir[File.join(@output, @name + '*.ttf')].first
|
72
|
+
@path = file.chomp('.ttf')
|
73
|
+
|
74
|
+
['woff','ttf','eot','svg'].each do |type|
|
75
|
+
say_status(:create, @path + '.' + type)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def create_stylesheet
|
80
|
+
files = Dir[File.join(input, '*.{svg,eps}')]
|
81
|
+
@classes = files.map {|file| File.basename(file)[0..-5].gsub(/\W/, '-').downcase }
|
82
|
+
@path = File.basename(@path)
|
83
|
+
|
84
|
+
template('templates/fontcustom.scss', File.join(@output, '../../sass/typography/_fontcustom.scss'))
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
import fontforge
|
2
|
+
import os
|
3
|
+
import argparse
|
4
|
+
import md5
|
5
|
+
import json
|
6
|
+
import subprocess
|
7
|
+
|
8
|
+
parser = argparse.ArgumentParser(description='Convert a directory of svg and eps files into a unified font file.')
|
9
|
+
parser.add_argument('dir', metavar='directory', type=unicode, nargs=2, help='directory of vector files')
|
10
|
+
parser.add_argument('--name', metavar='fontname', type=unicode, nargs='?', default='fontcustom', help='reference name of the font (no spaces)')
|
11
|
+
parser.add_argument('--nohash', '-n', action='store_true', help='disable hash fingerprinting of font files')
|
12
|
+
args = parser.parse_args()
|
13
|
+
|
14
|
+
f = fontforge.font()
|
15
|
+
f.encoding = 'UnicodeFull'
|
16
|
+
|
17
|
+
m = md5.new()
|
18
|
+
cp = 0xf100
|
19
|
+
files = []
|
20
|
+
|
21
|
+
KERNING = 15
|
22
|
+
|
23
|
+
for dirname, dirnames, filenames in os.walk(args.dir[0]):
|
24
|
+
for filename in filenames:
|
25
|
+
name, ext = os.path.splitext(filename)
|
26
|
+
filePath = os.path.join(dirname, filename)
|
27
|
+
size = os.path.getsize(filePath)
|
28
|
+
|
29
|
+
if ext in ['.svg', '.eps']:
|
30
|
+
m.update(filename + str(size) + ';')
|
31
|
+
glyph = f.createChar(cp)
|
32
|
+
glyph.importOutlines(filePath)
|
33
|
+
|
34
|
+
glyph.left_side_bearing = KERNING
|
35
|
+
glyph.right_side_bearing = KERNING
|
36
|
+
|
37
|
+
# possible optimization?
|
38
|
+
# glyph.simplify()
|
39
|
+
# glyph.round()
|
40
|
+
|
41
|
+
files.append(name)
|
42
|
+
cp += 1
|
43
|
+
|
44
|
+
if args.nohash:
|
45
|
+
fontfile = args.dir[1] + '/' + args.name
|
46
|
+
else:
|
47
|
+
hashStr = m.hexdigest()
|
48
|
+
fontfile = args.dir[1] + '/' + args.name + '-' + hashStr
|
49
|
+
|
50
|
+
f.fontname = args.name
|
51
|
+
f.familyname = args.name
|
52
|
+
f.fullname = args.name
|
53
|
+
f.generate(fontfile + '.ttf')
|
54
|
+
f.generate(fontfile + '.svg')
|
55
|
+
|
56
|
+
# Fix SVG header for webkit
|
57
|
+
# from: https://github.com/fontello/font-builder/blob/master/bin/fontconvert.py
|
58
|
+
svgfile = open(fontfile + '.svg', 'r+')
|
59
|
+
svgtext = svgfile.read()
|
60
|
+
svgfile.seek(0)
|
61
|
+
svgfile.write(svgtext.replace('''<svg>''', '''<svg xmlns="http://www.w3.org/2000/svg">'''))
|
62
|
+
svgfile.close()
|
63
|
+
|
64
|
+
scriptPath = os.path.dirname(os.path.realpath(__file__))
|
65
|
+
p = subprocess.Popen([scriptPath + '/sfnt2woff', fontfile + '.ttf'], stdout=subprocess.PIPE)
|
66
|
+
out, err = p.communicate()
|
67
|
+
if err is not None:
|
68
|
+
out += err
|
69
|
+
# If the local version of sfnt2woff fails (i.e., on Linux), try to use the
|
70
|
+
# global version. This allows us to avoid forcing OS X users to compile
|
71
|
+
# sfnt2woff from source, simplifying install.
|
72
|
+
if 'OSError' in out:
|
73
|
+
subprocess.call(['sfnt2woff', fontfile + '.ttf'])
|
74
|
+
|
75
|
+
subprocess.call('mkeot ' + fontfile + '.ttf > ' + fontfile + '.eot', shell=True)
|
76
|
+
|
77
|
+
# Hint the TTF file
|
78
|
+
subprocess.call('ttfautohint -s -n ' + fontfile + '.ttf ' + fontfile + '-hinted.ttf && mv ' + fontfile + '-hinted.ttf ' + fontfile + '.ttf', shell=True)
|
Binary file
|
@@ -0,0 +1,72 @@
|
|
1
|
+
/*
|
2
|
+
Font Custom - icon webfonts made simple
|
3
|
+
*/
|
4
|
+
|
5
|
+
@font-face {
|
6
|
+
font-family: "<%= @name %>";
|
7
|
+
src: url("<%= @path %>.eot?#iefix") format("embedded-opentype"),
|
8
|
+
url("<%= @path %>.woff") format("woff"),
|
9
|
+
url("<%= @path %>.ttf") format("truetype"),
|
10
|
+
url("<%= @path %>.svg#<%= @name %>") format("svg");
|
11
|
+
font-weight: normal;
|
12
|
+
font-style: normal;
|
13
|
+
}
|
14
|
+
|
15
|
+
/*
|
16
|
+
Bootstrap Overrides
|
17
|
+
*/
|
18
|
+
|
19
|
+
[class^="icon-"]:before, [class*=" icon-"]:before {
|
20
|
+
font-family: "<%= @name %>";
|
21
|
+
font-weight: normal;
|
22
|
+
font-style: normal;
|
23
|
+
display: inline-block;
|
24
|
+
text-decoration: inherit;
|
25
|
+
}
|
26
|
+
|
27
|
+
a [class^="icon-"], a [class*=" icon-"] {
|
28
|
+
display: inline-block;
|
29
|
+
text-decoration: inherit;
|
30
|
+
}
|
31
|
+
|
32
|
+
/* makes the font 33% larger relative to the icon container */
|
33
|
+
.icon-large:before {
|
34
|
+
vertical-align: top;
|
35
|
+
font-size: 1.333em;
|
36
|
+
}
|
37
|
+
|
38
|
+
/* keeps button heights with and without icons the same */
|
39
|
+
.btn [class^="icon-"], .btn [class*=" icon-"] {
|
40
|
+
line-height: 0.9em;
|
41
|
+
}
|
42
|
+
|
43
|
+
li [class^="icon-"], li [class*=" icon-"] {
|
44
|
+
display: inline-block;
|
45
|
+
width: 1.25em;
|
46
|
+
text-align: center;
|
47
|
+
}
|
48
|
+
|
49
|
+
/* 1.5 increased font size for icon-large * 1.25 width */
|
50
|
+
li .icon-large[class^="icon-"], li .icon-large[class*=" icon-"] {
|
51
|
+
width: 1.875em;
|
52
|
+
}
|
53
|
+
|
54
|
+
li[class^="icon-"], li[class*=" icon-"] {
|
55
|
+
margin-left: 0;
|
56
|
+
list-style-type: none;
|
57
|
+
}
|
58
|
+
|
59
|
+
li[class^="icon-"]:before, li[class*=" icon-"]:before {
|
60
|
+
text-indent: -2em;
|
61
|
+
text-align: center;
|
62
|
+
}
|
63
|
+
|
64
|
+
li[class^="icon-"].icon-large:before, li[class*=" icon-"].icon-large:before {
|
65
|
+
text-indent: -1.333em;
|
66
|
+
}
|
67
|
+
|
68
|
+
/*
|
69
|
+
Icon Classes
|
70
|
+
*/
|
71
|
+
<% @classes.each_with_index do |name, index| %>
|
72
|
+
.icon-<%= name %>:before { content: "\<%= (61696+index).to_s(16) %>"; }<% end %>
|
@@ -0,0 +1,65 @@
|
|
1
|
+
// *Font Custom - icon webfonts made simple */
|
2
|
+
|
3
|
+
@font-face {
|
4
|
+
font-family: "<%= @name %>";
|
5
|
+
src: url("public/fonts/<%= @path %>.eot?#iefix") format("embedded-opentype"),
|
6
|
+
url("public/fonts/<%= @path %>.woff") format("woff"),
|
7
|
+
url("public/fonts/<%= @path %>.ttf") format("truetype"),
|
8
|
+
url("public/fonts/<%= @path %>.svg#<%= @name %>") format("svg");
|
9
|
+
font-weight: normal;
|
10
|
+
font-style: normal;
|
11
|
+
}
|
12
|
+
|
13
|
+
|
14
|
+
[class^="icon-"]:before, [class*=" icon-"]:before {
|
15
|
+
font-family: "<%= @name %>";
|
16
|
+
font-weight: normal;
|
17
|
+
font-style: normal;
|
18
|
+
display: inline-block;
|
19
|
+
text-decoration: inherit;
|
20
|
+
}
|
21
|
+
|
22
|
+
a [class^="icon-"], a [class*=" icon-"] {
|
23
|
+
display: inline-block;
|
24
|
+
text-decoration: inherit;
|
25
|
+
}
|
26
|
+
|
27
|
+
// * makes the font 33% larger relative to the icon container */
|
28
|
+
// .icon-large:before {
|
29
|
+
// vertical-align: top;
|
30
|
+
// font-size: 1.333em;
|
31
|
+
// }
|
32
|
+
|
33
|
+
// * keeps button heights with and without icons the same */
|
34
|
+
// .btn [class^="icon-"], .btn [class*=" icon-"] {
|
35
|
+
// line-height: 0.9em;
|
36
|
+
// }
|
37
|
+
|
38
|
+
// li [class^="icon-"], li [class*=" icon-"] {
|
39
|
+
// display: inline-block;
|
40
|
+
// width: 1.25em;
|
41
|
+
// text-align: center;
|
42
|
+
// }
|
43
|
+
|
44
|
+
// * 1.5 increased font size for icon-large * 1.25 width */
|
45
|
+
// li .icon-large[class^="icon-"], li .icon-large[class*=" icon-"] {
|
46
|
+
// width: 1.875em;
|
47
|
+
// }
|
48
|
+
|
49
|
+
// li[class^="icon-"], li[class*=" icon-"] {
|
50
|
+
// margin-left: 0;
|
51
|
+
// list-style-type: none;
|
52
|
+
// }
|
53
|
+
|
54
|
+
// li[class^="icon-"]:before, li[class*=" icon-"]:before {
|
55
|
+
// text-indent: -2em;
|
56
|
+
// text-align: center;
|
57
|
+
// }
|
58
|
+
|
59
|
+
// li[class^="icon-"].icon-large:before, li[class*=" icon-"].icon-large:before {
|
60
|
+
// text-indent: -1.333em;
|
61
|
+
// }
|
62
|
+
|
63
|
+
// *Icon Classes */
|
64
|
+
<% @classes.each_with_index do |name, index| %>
|
65
|
+
%icon-<%= name %>:before { content: "\<%= (61696+index).to_s(16) %>"; }<% end %>
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'listen'
|
2
|
+
|
3
|
+
module Fontcustom
|
4
|
+
class Watcher
|
5
|
+
def self.watch(*args)
|
6
|
+
callback = Proc.new do |modified, added, removed|
|
7
|
+
puts ' >> Changed: ' + modified.join(' ') unless modified.empty?
|
8
|
+
puts ' >> Added: ' + added.join(' ') unless added.empty?
|
9
|
+
puts ' >> Removed: ' + removed.join(' ') unless removed.empty?
|
10
|
+
|
11
|
+
changed = modified + added + removed
|
12
|
+
Fontcustom.compile(*args) unless changed.empty?
|
13
|
+
end
|
14
|
+
|
15
|
+
dir = args.first
|
16
|
+
@listener = Listen.to(dir).filter(/\.(eps|svg)$/).change(&callback)
|
17
|
+
|
18
|
+
begin
|
19
|
+
puts "Fontcustom is watching your icons at " + dir
|
20
|
+
Fontcustom.compile(*args)
|
21
|
+
@listener.start()
|
22
|
+
|
23
|
+
# Catches Cmd/Ctrl + C
|
24
|
+
# Does listen gem have a better way of handling this?
|
25
|
+
rescue SignalException
|
26
|
+
stop
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.stop
|
31
|
+
# Newline exists so message is not prepended with ^C on SIGTERM
|
32
|
+
puts "\nFontcustom is signing off. Goodnight and good luck."
|
33
|
+
@listener.stop
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
File without changes
|
@@ -0,0 +1,4 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" width="100px" height="100px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
|
2
|
+
<path d="M50,0C22.389,0,0,22.383,0,49.994V100h100V49.994C100,22.383,77.617,0,50,0z M96.667,96.667H3.333V49.994 c0-25.729,20.938-46.66,46.667-46.66c25.729,0,46.667,20.931,46.667,46.66V96.667z"/>
|
3
|
+
<path d="M50,10c-22.083,0-40,17.91-40,39.994V90l30-30V50c0-5.521,4.479-10,10-10c5.521,0,10,4.479,10,10v10l30,30V49.994 C90,27.91,72.09,10,50,10z"/>
|
4
|
+
</svg>
|
@@ -0,0 +1,3 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" width="100px" height="100px" viewBox="0 0 100 100" style="enable-background:new 0 0 100 100;" xml:space="preserve">
|
2
|
+
<path style="fill:#010101;" d="M87.5,75c-3.039,0-5.725,1.221-7.886,3.016l-19.056-13.6c1.209-2.49,1.941-5.225,1.941-8.166 c0-4.041-1.318-7.775-3.491-10.828l22.29-22.302C83.154,24.207,85.193,25,87.5,25c6.909,0,12.5-5.591,12.5-12.5S94.409,0,87.5,0 S75,5.591,75,12.5c0,2.307,0.793,4.346,1.88,6.201L54.59,41.004c-3.076-2.197-6.787-3.504-10.84-3.504 c-7.153,0-13.306,4.064-16.467,9.973l-15.052-5.029C11.621,39.637,9.24,37.5,6.25,37.5C2.795,37.5,0,40.295,0,43.75 S2.795,50,6.25,50c1.574,0,2.979-0.635,4.077-1.6l14.966,4.993C25.146,54.334,25,55.273,25,56.25C25,66.602,33.398,75,43.75,75 c5.151,0,9.826-2.088,13.221-5.457l18.933,13.514C75.366,84.448,75,85.926,75,87.5c0,6.896,5.591,12.5,12.5,12.5 S100,94.396,100,87.5S94.409,75,87.5,75z"/>
|
3
|
+
</svg>
|
@@ -0,0 +1,3 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny" id="Layer_1" x="0px" y="0px" width="100px" height="100px" viewBox="0 0 100 100" xml:space="preserve">
|
2
|
+
<path fill="#000000" d="M96.897,37.513c1.921,0,3.478-1.558,3.478-3.479c0-1.92-1.557-3.478-3.478-3.478s-3.478,1.558-3.478,3.478 c0,0.422,0.079,0.825,0.217,1.2l-10.153,8.649l-12.864-7.567c0.073-0.297,0.116-0.607,0.116-0.927c0-2.142-1.736-3.878-3.878-3.878 c-0.869,0-1.668,0.289-2.314,0.772L52.92,23.054c0.054-0.22,0.086-0.448,0.086-0.684c0-1.581-1.281-2.861-2.861-2.861 s-2.861,1.281-2.861,2.861c0,0.729,0.275,1.393,0.724,1.898l-5.835,12.488c-0.26-0.045-0.526-0.074-0.8-0.074 c-0.86,0-1.662,0.239-2.351,0.647l-15.438-6.915c0.036-0.225,0.06-0.454,0.06-0.689c0-2.38-1.929-4.309-4.309-4.309 c-2.379,0-4.309,1.929-4.309,4.309s1.929,4.309,4.309,4.309c1.352,0,2.556-0.623,3.346-1.596l14.682,6.576 c-0.384,0.674-0.607,1.452-0.607,2.284c0,0.852,0.293,1.605,0.694,2.29l-8.233,8.237c-1.136-0.811-2.506-1.294-4.003-1.294 c-2.642,0-4.915,1.501-6.082,3.684l-0.096-0.032c-0.001,0.012-0.004,0.023-0.005,0.035L7.553,49.002 c0.016-0.134,0.025-0.271,0.025-0.409c0-1.989-1.612-3.601-3.601-3.601s-3.601,1.612-3.601,3.601s1.612,3.601,3.601,3.601 c1.054,0,1.999-0.455,2.657-1.177l11.723,5.329c-0.005,0.013-0.009,0.025-0.015,0.037l0.056,0.019 c-0.054,0.348-0.108,0.694-0.108,1.055c0,1.954,0.813,3.716,2.115,4.975l-0.017,0.013c0.004,0.005,0.008,0.01,0.012,0.014 l-5.973,8.802c-0.155-0.027-0.314-0.044-0.478-0.044c-1.479,0-2.678,1.198-2.678,2.678c0,1.479,1.199,2.678,2.678,2.678 c1.479,0,2.678-1.199,2.678-2.678c0-0.501-0.14-0.969-0.38-1.37l5.364-7.904l0.71-0.877c0.881,0.407,1.859,0.641,2.894,0.641 c1.902,0,3.629-0.771,4.883-2.016l6.993,4.991c-0.199,0.514-0.334,1.06-0.334,1.641c0,2.548,2.065,4.617,4.617,4.617 c2.159,0,3.965-1.483,4.471-3.482l15.916-4.923c0.977,1.815,2.893,3.05,5.099,3.05c1.273,0,2.447-0.417,3.403-1.114l7.12,6.611 c-0.038,0.193-0.059,0.393-0.059,0.597c0,1.734,1.406,3.14,3.14,3.14s3.139-1.405,3.139-3.14c0-1.733-1.405-3.139-3.139-3.139 c-0.707,0-1.358,0.236-1.883,0.631l-6.811-6.323c0.552-0.887,0.893-1.93,0.893-3.05c0-2.815-1.661-5.16-4.661-5.677V39.104 c1-0.172,1.082-0.478,1.513-0.878l13.332,7.848l11.179,15.655c-0.092,0.23-0.146,0.481-0.146,0.745c0,1.125,0.91,2.037,2.035,2.037 s2.037-0.912,2.037-2.037s-0.913-2.037-2.038-2.037c-0.03,0-0.06,0.003-0.09,0.005L85.094,45.422l9.931-8.459 C95.565,37.31,96.207,37.513,96.897,37.513z M61.07,62.474c0,0.21,0.013,0.416,0.035,0.62l-15.275,4.724 c-0.522-1.975-2.316-3.435-4.458-3.435c-1.123,0-2.114,0.451-2.913,1.113l-7.038-5.022c0.447-0.92,0.717-1.93,0.717-3.017 c0-1.492-0.487-2.871-1.29-3.999l8.233-8.237c0.686,0.401,1.438,0.694,2.291,0.694c1.642,0,3.079-0.857,3.897-2.147l17.222,14.914 C61.609,59.699,61.07,61.022,61.07,62.474z M66,56.797c-1,0.1-1.135,0.273-1.596,0.502l-18.36-15.846 c0.002-0.052-0.023-0.102-0.023-0.154c0-1.485-0.718-2.802-1.806-3.646l5.799-12.428c0.046,0.002,0.088,0.007,0.134,0.007 c0.53,0,1.023-0.147,1.449-0.399l11.621,9.229c-0.151,0.415-0.113,0.861-0.113,1.328c0,1.757,0.895,3.238,2.895,3.715V56.797z"/>
|
3
|
+
</svg>
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Fontcustom do
|
4
|
+
let(:input_dir) { 'spec/fixtures/vectors' }
|
5
|
+
let(:output_dir) { 'tmp' }
|
6
|
+
let(:fake_file) { output_dir + '/non-vector.txt' }
|
7
|
+
|
8
|
+
context 'when ouput_dir already contains files' do
|
9
|
+
# Compile, add non-fontcustom file, change input vectors, recompile
|
10
|
+
before(:all) do
|
11
|
+
# originals
|
12
|
+
Fontcustom.compile(input_dir, '-o', output_dir, '-n', 'Original Font')
|
13
|
+
FileUtils.touch(fake_file, :verbose => true)
|
14
|
+
@original_fonts = Dir[output_dir + '/fontcustom-*.{woff,eot,ttf,svg}']
|
15
|
+
@original_css = File.read(output_dir + '/fontcustom.css')
|
16
|
+
|
17
|
+
FileUtils.mv(input_dir + '/C.svg', input_dir + '/E.svg', :verbose => true)
|
18
|
+
Fontcustom.compile(input_dir, '-o', output_dir)
|
19
|
+
end
|
20
|
+
|
21
|
+
after(:all) do
|
22
|
+
cleanup(output_dir)
|
23
|
+
FileUtils.mv(input_dir + '/E.svg', input_dir + '/C.svg', :verbose => true)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should delete previous fontcustom generated files' do
|
27
|
+
new_files = Dir[output_dir + '/*']
|
28
|
+
@original_fonts.each do |original|
|
29
|
+
new_files.should_not include(original)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should not delete non-fontcustom generated files' do
|
34
|
+
File.exists?(fake_file).should be_true
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should generate different css' do
|
38
|
+
new_css = File.read(output_dir + '/fontcustom.css')
|
39
|
+
new_css.should_not equal(@original_css)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Fontcustom::Generator do
|
4
|
+
let(:input_dir) { 'spec/fixtures/vectors' }
|
5
|
+
let(:output_dir) { 'tmp' }
|
6
|
+
|
7
|
+
context 'normally' do
|
8
|
+
before(:all) { Fontcustom::Generator.start([input_dir, '-o', output_dir]) }
|
9
|
+
after(:all) { cleanup(output_dir) }
|
10
|
+
|
11
|
+
it 'should create webfonts' do
|
12
|
+
exts = %w( .woff .eot .ttf .svg )
|
13
|
+
files = Dir[output_dir + '/*']
|
14
|
+
files.map! { |file| File.extname(file) }
|
15
|
+
|
16
|
+
exts.each { |ext| files.should include(ext) }
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should print font-face declarations in fontcustom.css' do
|
20
|
+
stylesheet = File.read(output_dir + '/fontcustom.css')
|
21
|
+
files = Dir[output_dir + '/*.{woff,eot,ttf,svg}']
|
22
|
+
|
23
|
+
files.each do |file|
|
24
|
+
stylesheet.should include(File.basename(file))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should print icon-* CSS classes in fontcustom.css' do
|
29
|
+
stylesheet = File.read(output_dir + '/fontcustom.css')
|
30
|
+
icon_names = Dir[input_dir + '/*'].map { |file| File.basename(file)[0..-5].gsub(/\W/, '-').downcase }
|
31
|
+
|
32
|
+
icon_names.each do |name|
|
33
|
+
stylesheet.should include('.icon-' + name)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'when input_dir does not exist' do
|
39
|
+
let(:fake_input_dir) { 'does/not/exist' }
|
40
|
+
|
41
|
+
it 'should raise an error' do
|
42
|
+
results = capture(:stderr) { Fontcustom::Generator.start([fake_input_dir, '-o', output_dir]) }
|
43
|
+
results.should =~ /doesn't exist or isn't a directory/
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'when input_dir does not contain vectors' do
|
48
|
+
let(:empty_input_dir) { 'spec/fixtures/empty' }
|
49
|
+
|
50
|
+
it 'should raise an error' do
|
51
|
+
results = capture(:stderr) { Fontcustom::Generator.start([empty_input_dir, output_dir]) }
|
52
|
+
results.should =~ /doesn't contain any vectors/
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'when flags are passed' do
|
57
|
+
it 'should save output files with a custom name' do
|
58
|
+
Fontcustom::Generator.start([input_dir, '-o', output_dir, '-n', 'customname'])
|
59
|
+
|
60
|
+
file = Dir[File.join(output_dir, 'customname-*.ttf')].first
|
61
|
+
File.exists?(file).should be_true
|
62
|
+
|
63
|
+
cleanup(output_dir)
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should exclude the filename hash' do
|
67
|
+
Fontcustom::Generator.start([input_dir, '-o', output_dir, '--nohash'])
|
68
|
+
|
69
|
+
file = File.join(output_dir, 'fontcustom.ttf')
|
70
|
+
File.exists?(file).should be_true
|
71
|
+
|
72
|
+
cleanup(output_dir)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Fontcustom do
|
4
|
+
let (:input_dir) { 'spec/fixtures/vectors' }
|
5
|
+
let (:output_dir) { 'tmp' }
|
6
|
+
let (:fontcustom) { Fontcustom }
|
7
|
+
|
8
|
+
before(:all) do
|
9
|
+
fontcustom.watch(input_dir, output_dir)
|
10
|
+
end
|
11
|
+
|
12
|
+
context '#watch' do
|
13
|
+
it 'should detect when a vector file changes' do
|
14
|
+
`mv spec/fixtures/vectors/B.svg spec/fixtures/vectors/E.svg`
|
15
|
+
sleep 1
|
16
|
+
fontcustom.should_receive(:compile).with(input_dir, output_dir)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should detect when a vector file is added' do
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should detect when a vector file is removed' do
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should send complain if the dir has no vectors' do
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
after(:all) do
|
30
|
+
Fontcustom.stop
|
31
|
+
`mv spec/fixtures/vectors/E.svg spec/fixtures/vectors/B.svg`
|
32
|
+
cleanup(output_dir)
|
33
|
+
end
|
34
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spork'
|
2
|
+
|
3
|
+
Spork.prefork do
|
4
|
+
require 'rspec'
|
5
|
+
require 'fileutils'
|
6
|
+
|
7
|
+
RSpec.configure do |c|
|
8
|
+
def cleanup(dir)
|
9
|
+
FileUtils.rm_r(dir, :verbose => true) if File.exists?(dir)
|
10
|
+
end
|
11
|
+
|
12
|
+
def capture(stream)
|
13
|
+
begin
|
14
|
+
stream = stream.to_s
|
15
|
+
eval "$#{stream} = StringIO.new"
|
16
|
+
yield
|
17
|
+
result = eval("$#{stream}").string
|
18
|
+
ensure
|
19
|
+
eval("$#{stream} = #{stream.upcase}")
|
20
|
+
end
|
21
|
+
|
22
|
+
result
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
Spork.each_run do
|
28
|
+
require File.expand_path('../../lib/fontcustom.rb', __FILE__)
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,261 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fontcustomtoadstool
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Yifei Zhang
|
9
|
+
- Joshua Gross
|
10
|
+
- Dale Sande
|
11
|
+
autorequire:
|
12
|
+
bindir: bin
|
13
|
+
cert_chain: []
|
14
|
+
date: 2012-12-05 00:00:00.000000000 Z
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: json
|
18
|
+
requirement: !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ! '>='
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: '0'
|
24
|
+
type: :runtime
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
28
|
+
requirements:
|
29
|
+
- - ! '>='
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: '0'
|
32
|
+
- !ruby/object:Gem::Dependency
|
33
|
+
name: thor
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
35
|
+
none: false
|
36
|
+
requirements:
|
37
|
+
- - ! '>='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: listen
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
type: :runtime
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ! '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
- !ruby/object:Gem::Dependency
|
65
|
+
name: rake
|
66
|
+
requirement: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
type: :development
|
73
|
+
prerelease: false
|
74
|
+
version_requirements: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ! '>='
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: bundler
|
82
|
+
requirement: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
none: false
|
92
|
+
requirements:
|
93
|
+
- - ! '>='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
- !ruby/object:Gem::Dependency
|
97
|
+
name: rspec
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ! '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
108
|
+
requirements:
|
109
|
+
- - ! '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: fakefs
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
116
|
+
requirements:
|
117
|
+
- - ! '>='
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
type: :development
|
121
|
+
prerelease: false
|
122
|
+
version_requirements: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ! '>='
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '0'
|
128
|
+
- !ruby/object:Gem::Dependency
|
129
|
+
name: spork
|
130
|
+
requirement: !ruby/object:Gem::Requirement
|
131
|
+
none: false
|
132
|
+
requirements:
|
133
|
+
- - ! '>='
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: '0'
|
136
|
+
type: :development
|
137
|
+
prerelease: false
|
138
|
+
version_requirements: !ruby/object:Gem::Requirement
|
139
|
+
none: false
|
140
|
+
requirements:
|
141
|
+
- - ! '>='
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
144
|
+
- !ruby/object:Gem::Dependency
|
145
|
+
name: guard-spork
|
146
|
+
requirement: !ruby/object:Gem::Requirement
|
147
|
+
none: false
|
148
|
+
requirements:
|
149
|
+
- - ! '>='
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
type: :development
|
153
|
+
prerelease: false
|
154
|
+
version_requirements: !ruby/object:Gem::Requirement
|
155
|
+
none: false
|
156
|
+
requirements:
|
157
|
+
- - ! '>='
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
- !ruby/object:Gem::Dependency
|
161
|
+
name: guard-rspec
|
162
|
+
requirement: !ruby/object:Gem::Requirement
|
163
|
+
none: false
|
164
|
+
requirements:
|
165
|
+
- - ! '>='
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: '0'
|
168
|
+
type: :development
|
169
|
+
prerelease: false
|
170
|
+
version_requirements: !ruby/object:Gem::Requirement
|
171
|
+
none: false
|
172
|
+
requirements:
|
173
|
+
- - ! '>='
|
174
|
+
- !ruby/object:Gem::Version
|
175
|
+
version: '0'
|
176
|
+
- !ruby/object:Gem::Dependency
|
177
|
+
name: rb-fsevent
|
178
|
+
requirement: !ruby/object:Gem::Requirement
|
179
|
+
none: false
|
180
|
+
requirements:
|
181
|
+
- - ~>
|
182
|
+
- !ruby/object:Gem::Version
|
183
|
+
version: 0.9.1
|
184
|
+
type: :development
|
185
|
+
prerelease: false
|
186
|
+
version_requirements: !ruby/object:Gem::Requirement
|
187
|
+
none: false
|
188
|
+
requirements:
|
189
|
+
- - ~>
|
190
|
+
- !ruby/object:Gem::Version
|
191
|
+
version: 0.9.1
|
192
|
+
description: Transforms EPS and SVG vectors into icon webfonts. Generates compatible
|
193
|
+
CSS for Toadstool framework
|
194
|
+
email:
|
195
|
+
- yz@yifei.co
|
196
|
+
- joshua@gross.is
|
197
|
+
- dale.sande@gmail.com
|
198
|
+
executables:
|
199
|
+
- fontcustom
|
200
|
+
extensions: []
|
201
|
+
extra_rdoc_files: []
|
202
|
+
files:
|
203
|
+
- .gitignore
|
204
|
+
- CHANGELOG.md
|
205
|
+
- Gemfile
|
206
|
+
- Guardfile
|
207
|
+
- LICENSES.txt
|
208
|
+
- README.md
|
209
|
+
- Rakefile
|
210
|
+
- bin/fontcustom
|
211
|
+
- fontcustomToadstool.gemspec
|
212
|
+
- lib/fontcustom.rb
|
213
|
+
- lib/fontcustom/cli.rb
|
214
|
+
- lib/fontcustom/generator.rb
|
215
|
+
- lib/fontcustom/scripts/generate.py
|
216
|
+
- lib/fontcustom/scripts/sfnt2woff
|
217
|
+
- lib/fontcustom/templates/fontcustom.css
|
218
|
+
- lib/fontcustom/templates/fontcustom.scss
|
219
|
+
- lib/fontcustom/version.rb
|
220
|
+
- lib/fontcustom/watcher.rb
|
221
|
+
- spec/fixtures/empty/no_vectors_here.txt
|
222
|
+
- spec/fixtures/vectors/C.svg
|
223
|
+
- spec/fixtures/vectors/D.svg
|
224
|
+
- spec/fixtures/vectors/a_R3ally-eXotic f1Le Name.svg
|
225
|
+
- spec/fontcustom/fontcustom_spec.rb
|
226
|
+
- spec/fontcustom/generator_spec.rb
|
227
|
+
- spec/fontcustom/watcher_spec.rb.off
|
228
|
+
- spec/spec_helper.rb
|
229
|
+
homepage: https://github.com/blackfalcon/fontcustom.sass
|
230
|
+
licenses: []
|
231
|
+
post_install_message:
|
232
|
+
rdoc_options: []
|
233
|
+
require_paths:
|
234
|
+
- lib
|
235
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
236
|
+
none: false
|
237
|
+
requirements:
|
238
|
+
- - ! '>='
|
239
|
+
- !ruby/object:Gem::Version
|
240
|
+
version: '0'
|
241
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
242
|
+
none: false
|
243
|
+
requirements:
|
244
|
+
- - ! '>='
|
245
|
+
- !ruby/object:Gem::Version
|
246
|
+
version: '0'
|
247
|
+
requirements: []
|
248
|
+
rubyforge_project:
|
249
|
+
rubygems_version: 1.8.24
|
250
|
+
signing_key:
|
251
|
+
specification_version: 3
|
252
|
+
summary: Generate custom icon webfonts from the comfort of the command line.
|
253
|
+
test_files:
|
254
|
+
- spec/fixtures/empty/no_vectors_here.txt
|
255
|
+
- spec/fixtures/vectors/C.svg
|
256
|
+
- spec/fixtures/vectors/D.svg
|
257
|
+
- spec/fixtures/vectors/a_R3ally-eXotic f1Le Name.svg
|
258
|
+
- spec/fontcustom/fontcustom_spec.rb
|
259
|
+
- spec/fontcustom/generator_spec.rb
|
260
|
+
- spec/fontcustom/watcher_spec.rb.off
|
261
|
+
- spec/spec_helper.rb
|