fontrobot 0.1
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.
- data/.gitignore +18 -0
- data/CHANGELOG.md +26 -0
- data/CONTRIBUTING.md +9 -0
- data/Gemfile +4 -0
- data/Guardfile +15 -0
- data/LICENSES.txt +60 -0
- data/README.md +53 -0
- data/Rakefile +12 -0
- data/bin/fontrobot +5 -0
- data/fontcustom.gemspec +32 -0
- data/lib/fontrobot/cli.rb +32 -0
- data/lib/fontrobot/generator.rb +140 -0
- data/lib/fontrobot/scripts/eotlitetool.py +466 -0
- data/lib/fontrobot/scripts/generate.py +109 -0
- data/lib/fontrobot/scripts/sfnt2woff +0 -0
- data/lib/fontrobot/templates/fontrobot-ie7.css +18 -0
- data/lib/fontrobot/templates/fontrobot.css +69 -0
- data/lib/fontrobot/templates/test.html +101 -0
- data/lib/fontrobot/version.rb +3 -0
- data/lib/fontrobot/watcher.rb +37 -0
- data/lib/fontrobot.rb +21 -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/fontrobot/fontcustom_spec.rb +38 -0
- data/spec/fontrobot/generator_spec.rb +75 -0
- data/spec/fontrobot/watcher_spec.rb.off +34 -0
- data/spec/spec_helper.rb +29 -0
- metadata +205 -0
data/.gitignore
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
## 0.1.4 (2/19/2013)
|
2
|
+
|
3
|
+
* Instructions for stopping watcher ([#46](https://github.com/FontCustom/fontcustom/issues/46))
|
4
|
+
* Dev/contribution instructions ([#45](https://github.com/FontCustom/fontcustom/issues/45))
|
5
|
+
|
6
|
+
## 0.1.3 (2/2/2013)
|
7
|
+
|
8
|
+
* Add --debug CLI option, which shows fontforge output ([#37](https://github.com/FontCustom/fontcustom/issues/37))
|
9
|
+
* Patch for Illustrator CS6 SVG output ([#42](https://github.com/FontCustom/fontcustom/pull/42))
|
10
|
+
* Generate IE7 stylesheet ([#43](https://github.com/FontCustom/fontcustom/pull/43))
|
11
|
+
* Option to set custom font path for @font-face ([#43](https://github.com/FontCustom/fontcustom/pull/43))
|
12
|
+
* Option to generate test HTML file showing all glyphs ([#43](https://github.com/FontCustom/fontcustom/pull/43))
|
13
|
+
* Use eotlite.py instead of mkeot ([#43](https://github.com/FontCustom/fontcustom/pull/43))
|
14
|
+
|
15
|
+
## 0.1.0 (12/2/2012)
|
16
|
+
|
17
|
+
* Changed API to use Thor `class_option`s
|
18
|
+
* Added option to change the name of the font and generated files ([#6](https://github.com/FontCustom/fontcustom/issues/6))
|
19
|
+
* Added option to disable the file name hash ([#13](https://github.com/FontCustom/fontcustom/issues/13))
|
20
|
+
* `fontcustom watch` compiles automatically on the first run
|
21
|
+
* Better help messages
|
22
|
+
|
23
|
+
## 0.0.2 (11/26/2012)
|
24
|
+
|
25
|
+
* Fixed gemspec dependency bug ([#2](https://github.com/FontCustom/fontcustom/pull/2))
|
26
|
+
* Fixed Windows Chrome PUA bug ([#1](https://github.com/FontCustom/fontcustom/issues/1))
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# Fontrobot Contributing Checklist
|
2
|
+
|
3
|
+
## A short list to help you get started:
|
4
|
+
|
5
|
+
* Check out [issues]() for ideas. Is someone else working on something similar?
|
6
|
+
* Fork the repo and work out of a named topic branch, a la `git checkout -b my_sweet_contribution`. Please don't work directly off `master`.
|
7
|
+
* Run tests with `guard`.
|
8
|
+
* Add/improve tests for your contributions.
|
9
|
+
* Submit a pull request!
|
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/fontrobot/(.+)\.rb$}) { |m| "spec/fontrobot/#{m[1]}_spec.rb" }
|
12
|
+
watch('lib/fontrobot.rb') { 'spec/fontrobot/fontrobot_spec.rb' }
|
13
|
+
watch('lib/fontrobot/core.rb') { 'spec/fontrobot/fontrobot_spec.rb' }
|
14
|
+
watch('spec/spec_helper.rb') { 'spec' }
|
15
|
+
end
|
data/LICENSES.txt
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
fontrobot
|
2
|
+
|
3
|
+
Copyright (c) 2013 Tim Barkow
|
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,53 @@
|
|
1
|
+
FontRobot v0.1
|
2
|
+
==========
|
3
|
+
|
4
|
+
**Generate custom icon webfonts from the comfort of the command line.**
|
5
|
+
|
6
|
+
This is a fork of Fontcustom, required so I could make changes and update the gem in a timely fashion. FontRobot extends Fontcustom, adding more control over how the @fontface declaration is created. See command-line options below for more details.
|
7
|
+
|
8
|
+
[Fontcustom documentation](http://fontcustom.github.com/fontcustom/)
|
9
|
+
|
10
|
+
|
11
|
+
Installation
|
12
|
+
------------
|
13
|
+
|
14
|
+
```sh
|
15
|
+
# Requires FontForge
|
16
|
+
brew install fontforge ttfautohint
|
17
|
+
gem install fontrobot
|
18
|
+
```
|
19
|
+
|
20
|
+
|
21
|
+
Usage
|
22
|
+
-----
|
23
|
+
|
24
|
+
```sh
|
25
|
+
fontrobot compile path/to/vectors # Compile icons and css to path/to/fontrobot/*
|
26
|
+
fontrobot watch path/to/vectors # Watch for changes
|
27
|
+
```
|
28
|
+
|
29
|
+
**Note:** the **ENTIRE** contents of the output directory (default '/fontrobot') are **DELETED** when regenerating the font. So, don't put anything else in there.
|
30
|
+
|
31
|
+
|
32
|
+
Command-line options
|
33
|
+
-----
|
34
|
+
|
35
|
+
```sh
|
36
|
+
--output, -o => Specify an output directory. Default: $DIR/fontrobot
|
37
|
+
--name, -n => Specify a font name. This will be used in the generated fonts and CSS. Default: fontrobot
|
38
|
+
--font_path, -f => Specify a path for fonts in css @font-face declaration. Default: none
|
39
|
+
|
40
|
+
--order, -r => Specify font order in css @font-face. Default: "eot,ttf,woff,svg"
|
41
|
+
--inline, -i => Include specified font fomats as data-uri in @font-face. Default: none. Format: "eot,ttf,woff,svg"
|
42
|
+
|
43
|
+
--nohash => (boolean) Disable filename hashes. Default: false
|
44
|
+
--debug => (boolean) Display debug messages. Default: false
|
45
|
+
--html => (boolean) Generate html page with icons. Default: false
|
46
|
+
--scss => (boolean) Output .scss files. Default: false
|
47
|
+
```
|
48
|
+
|
49
|
+
Need help?
|
50
|
+
|
51
|
+
```sh
|
52
|
+
fontrobot --help
|
53
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# require 'rake'
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
require 'rake/testtask'
|
4
|
+
|
5
|
+
Rake::TestTask.new do |t|
|
6
|
+
t.libs = t.libs + ['lib/fontrobot', 'spec', 'spec/fixtures']
|
7
|
+
t.test_files = FileList['spec/fontrobot/*_spec.rb']
|
8
|
+
t.verbose = true
|
9
|
+
end
|
10
|
+
|
11
|
+
task :default => :test
|
12
|
+
|
data/bin/fontrobot
ADDED
data/fontcustom.gemspec
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 'fontrobot/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "fontrobot"
|
8
|
+
gem.version = Fontrobot::VERSION
|
9
|
+
gem.authors = ["Tim Barkow"]
|
10
|
+
gem.email = ["tim@robotloveskitten.com"]
|
11
|
+
gem.summary = %q{Generate custom icon webfonts from the command line.}
|
12
|
+
gem.description = %q{Transforms EPS and SVG vectors into icon webfonts. Generates Bootstrap compatible CSS for easy inclusion in your projects.}
|
13
|
+
gem.homepage = "http://robotloveskitten.github.com/fontrobot/"
|
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
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'fontrobot'
|
3
|
+
|
4
|
+
module Fontrobot
|
5
|
+
class CLI < Thor
|
6
|
+
# duplicated from Fontrobot::Generator so as to also appear under `fontrobot help` command
|
7
|
+
class_option :output, :aliases => '-o', :desc => 'Specify an output directory. Default: $DIR/fontrobot'
|
8
|
+
class_option :name, :aliases => '-n', :desc => 'Specify a font name. This will be used in the generated fonts and CSS. Default: fontrobot'
|
9
|
+
class_option :font_path, :aliases => '-f', :desc => 'Specify a path for fonts in css @font-face declaration. Default: none'
|
10
|
+
|
11
|
+
class_option :order, :aliases => '-r', :desc => 'Specify font order in css @font-face. Default: "eot,ttf,woff,svg"'
|
12
|
+
class_option :inline, :aliases => '-i', :desc => 'Inline font as data-uri in @font-face. Default: none. Format: "eot,ttf,woff,svg"'
|
13
|
+
|
14
|
+
class_option :nohash, :type => :boolean, :default => false, :desc => 'Disable filename hashes. Default: false'
|
15
|
+
class_option :debug, :type => :boolean, :default => false, :desc => 'Display debug messages. Default: false'
|
16
|
+
class_option :html, :type => :boolean, :default => false, :desc => 'Generate html page with icons'
|
17
|
+
class_option :scss, :type => :boolean, :default => false, :desc => 'Output .scss files'
|
18
|
+
|
19
|
+
desc 'compile DIR [options]', 'Generates webfonts and CSS from *.svg and *.eps files in DIR.'
|
20
|
+
def compile(*args)
|
21
|
+
# workaround to pass arguments from one Thor class to another
|
22
|
+
ARGV.shift
|
23
|
+
Fontrobot.compile(*ARGV)
|
24
|
+
end
|
25
|
+
|
26
|
+
desc 'watch DIR [options]', 'Watches DIR for changes and regenerates webfonts and CSS automatically. Ctrl + C to stop.'
|
27
|
+
def watch(*args)
|
28
|
+
ARGV.shift
|
29
|
+
Fontrobot.watch(*ARGV)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'thor/group'
|
3
|
+
require 'base64'
|
4
|
+
|
5
|
+
module Fontrobot
|
6
|
+
class Generator < Thor::Group
|
7
|
+
include Thor::Actions
|
8
|
+
|
9
|
+
desc 'Generates webfonts from given directory of vectors.'
|
10
|
+
|
11
|
+
argument :input, :type => :string
|
12
|
+
class_option :output, :aliases => '-o'
|
13
|
+
class_option :name, :aliases => '-n'
|
14
|
+
class_option :font_path, :aliases => '-f'
|
15
|
+
|
16
|
+
class_option :order, :aliases => '-r' # 'Specify font order in css @font-face. Default: "eot,ttf,woff,svg"'
|
17
|
+
class_option :inline, :aliases => '-i' # 'Inline font as data-uri in @font-face. Default: none. Format: "eot,ttf,woff,svg"'
|
18
|
+
|
19
|
+
class_option :nohash, :type => :boolean, :default => false
|
20
|
+
class_option :debug, :type => :boolean, :default => false
|
21
|
+
class_option :html, :type => :boolean, :default => false
|
22
|
+
class_option :scss, :type => :boolean, :default => false
|
23
|
+
|
24
|
+
|
25
|
+
def self.source_root
|
26
|
+
File.dirname(__FILE__)
|
27
|
+
end
|
28
|
+
|
29
|
+
def verify_fontforge
|
30
|
+
if `which fontforge` == ''
|
31
|
+
raise Thor::Error, 'Please install fontforge first.'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def verify_input_dir
|
36
|
+
if ! File.directory?(input)
|
37
|
+
raise Thor::Error, "#{input} doesn't exist or isn't a directory."
|
38
|
+
elsif Dir[File.join(input, '*.{svg,eps}')].empty?
|
39
|
+
raise Thor::Error, "#{input} doesn't contain any vectors (*.svg or *.eps files)."
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def verify_or_create_output_dir
|
44
|
+
@output = options.output.nil? ? File.join(File.dirname(input), 'fontrobot') : options.output
|
45
|
+
empty_directory(@output) unless File.directory?(@output)
|
46
|
+
end
|
47
|
+
|
48
|
+
def normalize_name
|
49
|
+
@name = if options.name
|
50
|
+
options.name.gsub(/\W/, '-').downcase
|
51
|
+
else
|
52
|
+
'fontrobot'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def cleanup_output_dir
|
57
|
+
# simpler: how about we just delete everything in the dir?
|
58
|
+
old_files = Dir[File.join(@output, '*')]
|
59
|
+
old_files.each {|file| remove_file file }
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
def generate
|
64
|
+
gem_file_path = File.expand_path(File.join(File.dirname(__FILE__)))
|
65
|
+
name = options.name ? ' --name ' + @name : ''
|
66
|
+
nohash = options.nohash ? ' --nohash' : ''
|
67
|
+
|
68
|
+
# suppress fontforge message
|
69
|
+
# TODO get font name and classes from script (without showing fontforge message)
|
70
|
+
cmd = "fontforge -script #{gem_file_path}/scripts/generate.py #{input} #{@output + name + nohash}"
|
71
|
+
unless options.debug
|
72
|
+
cmd += " > /dev/null 2>&1"
|
73
|
+
end
|
74
|
+
`#{cmd}`
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
def show_paths
|
79
|
+
file = Dir[File.join(@output, @name + '*.ttf')].first
|
80
|
+
@path = file.chomp('.ttf')
|
81
|
+
|
82
|
+
['woff','ttf','eot','svg'].each do |type|
|
83
|
+
say_status(:create, @path + '.' + type)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
def fontface_sources
|
89
|
+
order = (options.order) ? options.order.split(",") : ['eot','ttf','woff','svg']
|
90
|
+
inline = (options.inline) ? options.inline.split(",") : []
|
91
|
+
reorder = {}
|
92
|
+
longtype = {
|
93
|
+
'woff' => 'woff',
|
94
|
+
'ttf' => 'truetype',
|
95
|
+
'eot' => 'embedded-opentype',
|
96
|
+
'svg' => 'svg'
|
97
|
+
}
|
98
|
+
|
99
|
+
if(!options.font_path.nil?)
|
100
|
+
font_path = (options.font_path) ? options.font_path : ''
|
101
|
+
@path = File.join(font_path, File.basename(@path))
|
102
|
+
else
|
103
|
+
@path = File.basename(@path)
|
104
|
+
end
|
105
|
+
|
106
|
+
@fontface = {
|
107
|
+
:eot => "url(\"#{@path}.eot?#iefix\") format(\"embedded-opentype\")",
|
108
|
+
:woff => "url(\"#{@path}.woff\") format(\"woff\")",
|
109
|
+
:ttf => "url(\"#{@path}.ttf\") format(\"truetype\")",
|
110
|
+
:svg => "url(\"#{@path}.svg##{@name}\") format(\"svg\")"
|
111
|
+
}
|
112
|
+
|
113
|
+
# reorder the fontface hash
|
114
|
+
order.each do |type|
|
115
|
+
if(inline.include?(type))
|
116
|
+
fontpath = File.expand_path(File.join(@output, File.basename(@path)+"."+type))
|
117
|
+
contents = File.read(fontpath)
|
118
|
+
encoded_contents = Base64.encode64(contents).gsub(/\n/, '') # encode and remove newlines, 1.8.7 compat
|
119
|
+
fontstring = "url(data:application/x-font-#{type};charset=utf-8;base64," + encoded_contents +") format('#{longtype[type]}')"
|
120
|
+
else
|
121
|
+
fontstring = @fontface[type.to_sym]
|
122
|
+
end
|
123
|
+
reorder[type.to_sym] = fontstring
|
124
|
+
end
|
125
|
+
@fonturls = reorder.map{|k,v| v }.join(",\n");
|
126
|
+
end
|
127
|
+
|
128
|
+
|
129
|
+
def create_stylesheet
|
130
|
+
say_status(:create, 'creating stylesheet')
|
131
|
+
extension = (options.scss) ? '.scss' : '.css'
|
132
|
+
files = Dir[File.join(input, '*.{svg,eps}')]
|
133
|
+
@classes = files.map {|file| File.basename(file)[0..-5].gsub(/\W/, '-').downcase }
|
134
|
+
|
135
|
+
template('templates/fontrobot.css', File.join(@output, "fontrobot#{extension}"))
|
136
|
+
template('templates/fontrobot-ie7.css', File.join(@output, "fontrobot-ie7#{extension}"))
|
137
|
+
template('templates/test.html', File.join(@output, 'test.html')) if options.html
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|