fontcustom 1.3.8 → 2.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 +4 -4
- data/.travis.yml +27 -5
- data/CHANGELOG.md +15 -0
- data/CONTRIBUTING.md +1 -1
- data/README.md +90 -4
- data/fontcustom.gemspec +2 -2
- data/gemfiles/Gemfile.listen_2 +6 -0
- data/lib/fontcustom.rb +3 -1
- data/lib/fontcustom/base.rb +14 -2
- data/lib/fontcustom/cli.rb +9 -1
- data/lib/fontcustom/generator/template.rb +14 -2
- data/lib/fontcustom/options.rb +6 -2
- data/lib/fontcustom/scripts/eotlitetool.py +13 -13
- data/lib/fontcustom/scripts/generate.py +18 -5
- data/lib/fontcustom/scripts/sfnt2woff.exe +0 -0
- data/lib/fontcustom/templates/_fontcustom-rails.scss +2 -2
- data/lib/fontcustom/templates/_fontcustom.scss +2 -2
- data/lib/fontcustom/templates/fontcustom.css +2 -2
- data/lib/fontcustom/templates/fontcustom.yml +3 -0
- data/lib/fontcustom/version.rb +1 -1
- data/lib/fontcustom/watcher.rb +1 -1
- metadata +11 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc2597df3b94e7657fbaa82856e909f1b762baa7
|
4
|
+
data.tar.gz: 8f6437cb607c18c0c47228abc212058af9d58769
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3faa26c666038c1e5b9ad4436ec849005fb5c32d2c8d255dc39065b08d4ea60a0e8faf10c1b4d606f63f7593b7a4019312e6f6823b830478ae7b124cb3fe4a08
|
7
|
+
data.tar.gz: afef84481d791bba0492fe284dffdb9331aeebae95ad03385ecc9e5a07fe53ea9c687e9b7a3baf8ec5b8ba74e9d98f43dd2f88d3e79514ed7e1b81e44028b95e
|
data/.travis.yml
CHANGED
@@ -1,20 +1,42 @@
|
|
1
|
+
sudo: required
|
1
2
|
language: ruby
|
3
|
+
addons:
|
4
|
+
apt:
|
5
|
+
sources:
|
6
|
+
- ubuntu-toolchain-r-test
|
7
|
+
packages:
|
8
|
+
- fontforge-nox
|
9
|
+
- gcc-4.8
|
10
|
+
- g++-4.8
|
2
11
|
before_install:
|
3
|
-
- sudo apt-get update -qq
|
4
|
-
- sudo apt-get install -qq fontforge
|
5
12
|
- wget http://people.mozilla.com/~jkew/woff/woff-code-latest.zip
|
6
|
-
- unzip woff-code-latest.zip -d sfnt2woff && cd sfnt2woff && make &&
|
13
|
+
- unzip woff-code-latest.zip -d sfnt2woff && cd sfnt2woff && make && mkdir -p bin && mv sfnt2woff bin && cd ..
|
14
|
+
- export PATH=$PATH:$PWD/sfnt2woff/bin/
|
15
|
+
- if [ $TRAVIS_OS_NAME == "linux" ]; then
|
16
|
+
export CC="gcc-4.8";
|
17
|
+
export CXX="g++-4.8";
|
18
|
+
export LINK="gcc-4.8";
|
19
|
+
export LINKXX="g++-4.8";
|
20
|
+
fi
|
21
|
+
- git clone --recursive https://github.com/google/woff2.git && cd woff2 && make clean all && sudo mv woff2_compress /usr/local/bin/ && sudo mv woff2_decompress /usr/local/bin/
|
7
22
|
- bundle
|
8
23
|
rvm:
|
24
|
+
- 2.2.2
|
9
25
|
- 2.1.1
|
10
26
|
- 2.0.0
|
11
27
|
- 1.9.3
|
12
|
-
- 1.9.2
|
13
28
|
gemfile:
|
14
29
|
- Gemfile
|
15
30
|
- gemfiles/Gemfile.listen_1
|
31
|
+
- gemfiles/Gemfile.listen_2
|
16
32
|
matrix:
|
17
33
|
exclude:
|
18
34
|
- gemfile: Gemfile
|
19
|
-
rvm: 1.9.
|
35
|
+
rvm: 1.9.3
|
36
|
+
- gemfile: Gemfile
|
37
|
+
rvm: 2.0.0
|
38
|
+
- gemfile: gemfiles/Gemfile.listen_2
|
39
|
+
rvm: 1.9.3
|
40
|
+
- gemfile: gemfiles/Gemfile.listen_2
|
41
|
+
rvm: 2.0.0
|
20
42
|
script: bundle exec rake
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
## 2.0.0 (6/14/2017)
|
2
|
+
|
3
|
+
* Adds support for Woff2 ([#313](https://github.com/FontCustom/fontcustom/pull/313))
|
4
|
+
* Minimum ruby version bumped to 1.9.3
|
5
|
+
* Support listen 3 ([#283](https://github.com/FontCustom/fontcustom/pull/283))
|
6
|
+
* Support Python 3 ([#276](https://github.com/FontCustom/fontcustom/pull/276))
|
7
|
+
* Compatible with Windows ([#289](https://github.com/FontCustom/fontcustom/pull/289))
|
8
|
+
* Set glyph name when creating char in fontforge ([#286](https://github.com/FontCustom/fontcustom/pull/286))
|
9
|
+
* Allow specification of copyright information ([#287](https://github.com/FontCustom/fontcustom/pull/287))
|
10
|
+
* Enable CSS3 pseudo selectors '::' vs ':' ([#310](https://github.com/FontCustom/fontcustom/pull/310))
|
11
|
+
* Update installation instructions with zlib for linux machines ([#224](https://github.com/FontCustom/fontcustom/pull/224))
|
12
|
+
* Works with updated Travis CI configuration
|
13
|
+
* Fix issue with relative paths in check_template_paths
|
14
|
+
* Be more Unix-y and fail when there is an error ([#295](https://github.com/FontCustom/fontcustom/pull/295))
|
15
|
+
|
1
16
|
## 1.3.4 (10/11/2014)
|
2
17
|
|
3
18
|
* Updates rspec tests to be compatible with rspec v3.1.6
|
data/CONTRIBUTING.md
CHANGED
@@ -30,7 +30,7 @@ us know. No such thing as too small of an improvement.
|
|
30
30
|
You'll need:
|
31
31
|
|
32
32
|
* Fontforge with Python scripting (easiest via [Homebrew](http://brew.sh/) on Mac)
|
33
|
-
* Ruby 1.9.
|
33
|
+
* Ruby 1.9.3+ (via [rbenv](https://github.com/sstephenson/rbenv), [RVM](https://rvm.io/), etc.)
|
34
34
|
* Rubygems
|
35
35
|
* Bundler
|
36
36
|
* Rake
|
data/README.md
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
**Icon fonts from the command line.**
|
8
8
|
|
9
9
|
Generate cross-browser icon fonts and supporting files (@font-face CSS, etc.)
|
10
|
-
from a collection of SVGs
|
10
|
+
from a collection of SVGs
|
11
11
|
([example](https://rawgit.com/FontCustom/fontcustom/master/spec/fixtures/example/example-preview.html)).
|
12
12
|
|
13
13
|
[Changelog](https://github.com/FontCustom/fontcustom/blob/master/CHANGELOG.md)<br>
|
@@ -16,20 +16,34 @@ from a collection of SVGs
|
|
16
16
|
|
17
17
|
### Installation
|
18
18
|
|
19
|
-
Requires **Ruby 1.9.
|
19
|
+
Requires **Ruby 1.9.3+**, **WOFF2**, **FontForge** with Python scripting.
|
20
20
|
|
21
21
|
```sh
|
22
22
|
# On Mac
|
23
|
+
brew tap bramstein/webfonttools
|
24
|
+
brew update
|
25
|
+
brew install woff2
|
26
|
+
|
23
27
|
brew install fontforge --with-python
|
24
28
|
brew install eot-utils
|
25
29
|
gem install fontcustom
|
26
30
|
|
27
31
|
# On Linux
|
28
|
-
sudo apt-get install fontforge
|
32
|
+
sudo apt-get install zlib1g-dev fontforge
|
29
33
|
wget http://people.mozilla.com/~jkew/woff/woff-code-latest.zip
|
30
34
|
unzip woff-code-latest.zip -d sfnt2woff && cd sfnt2woff && make && sudo mv sfnt2woff /usr/local/bin/
|
35
|
+
git clone --recursive https://github.com/google/woff2.git && cd woff2 && make clean all && sudo mv woff2_compress /usr/local/bin/ && sudo mv woff2_decompress /usr/local/bin/
|
31
36
|
gem install fontcustom
|
32
37
|
```
|
38
|
+
####Note for windows:
|
39
|
+
|
40
|
+
1. Install fontforge: http://fontforge.github.io/en-US/downloads/windows/
|
41
|
+
- Install to a path without spaces, eg c:\FontForgeBuilds
|
42
|
+
- At the end of the installer check the 'run fontforge' box. It finishes some set up.
|
43
|
+
2. Add the installation path to your System PATH variable (c:\FontForgeBuilds\bin)
|
44
|
+
3. Open up a new command prompt and test it. `fontforge -help`
|
45
|
+
4. gem install fontcustom
|
46
|
+
|
33
47
|
|
34
48
|
### Quick Start
|
35
49
|
|
@@ -66,11 +80,82 @@ compatible font-url() helper. You'll most likely also need to set
|
|
66
80
|
`preprocessor_path` as the relative path from your compiled CSS to your output
|
67
81
|
directory.
|
68
82
|
|
83
|
+
**Example Use in Rails**
|
84
|
+
|
85
|
+
Add `gem 'fontcustom'` to your gem file.
|
86
|
+
```
|
87
|
+
bundle
|
88
|
+
```
|
89
|
+
Create a `fontcustom.yml` file with something like this:
|
90
|
+
```yml
|
91
|
+
# config/fontcustom.yml
|
92
|
+
|
93
|
+
font_name: icons
|
94
|
+
css_selector: .icon-{{glyph}}
|
95
|
+
preprocessor_path: ""
|
96
|
+
autowidth: false
|
97
|
+
no_hash: true
|
98
|
+
force: false
|
99
|
+
debug: false
|
100
|
+
quiet: false
|
101
|
+
|
102
|
+
input:
|
103
|
+
vectors: app/assets/icons
|
104
|
+
|
105
|
+
output:
|
106
|
+
fonts: app/assets/fonts
|
107
|
+
css: app/assets/stylesheets
|
108
|
+
|
109
|
+
templates:
|
110
|
+
- scss
|
111
|
+
```
|
112
|
+
|
113
|
+
This tells the gem to take the vectors from `app/assets/icons` and create fonts and stylesheets for them.
|
114
|
+
|
115
|
+
Create a file in lib/tasks called `icons.rake` :
|
116
|
+
|
117
|
+
```ruby
|
118
|
+
namespace :icons do
|
119
|
+
task :compile do
|
120
|
+
puts "Compiling icons..."
|
121
|
+
puts %x(fontcustom compile)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
```
|
125
|
+
|
126
|
+
Load up the icons directory and test it out.
|
127
|
+
|
128
|
+
Run this command with
|
129
|
+
```sh
|
130
|
+
rake icons:compile
|
131
|
+
```
|
132
|
+
|
133
|
+
This should run the installed and configured gem to create your icons:
|
134
|
+
|
135
|
+
```sh
|
136
|
+
Compiling icons...
|
137
|
+
create .fontcustom-manifest.json
|
138
|
+
create app/assets/fonts
|
139
|
+
create app/assets/fonts/icons.ttf
|
140
|
+
app/assets/fonts/icons.svg
|
141
|
+
app/assets/fonts/icons.woff
|
142
|
+
app/assets/fonts/icons.eot
|
143
|
+
create app/assets/stylesheets/_icons.scss
|
144
|
+
```
|
145
|
+
Access these new icons by creating a tag with the class `icon-{{glyph}}` where the {{glyph}} is the name of the svg you put in the icon folder.
|
146
|
+
For example, if you added a file called 'cars54' icon would look something like this:
|
147
|
+
|
148
|
+
```html
|
149
|
+
<i class="icon-cars54"</i>
|
150
|
+
```
|
151
|
+
|
152
|
+
Now the font is adjustable to css 'font-size' and 'color'.
|
153
|
+
|
69
154
|
**Save CSS and fonts to different locations**
|
70
155
|
|
71
156
|
You can save generated fonts, CSS, and other files to different locations by
|
72
157
|
using `fontcustom.yml`. Font Custom can also read input vectors and templates
|
73
|
-
from different places.
|
158
|
+
from different places.
|
74
159
|
|
75
160
|
Just edit the `input` and `output` YAML hashes and their corresponding keys.
|
76
161
|
|
@@ -101,6 +186,7 @@ helpers:
|
|
101
186
|
* `@manifest`: a hash of options, generated file paths, code points, and just about everything else Font Custom knows.
|
102
187
|
* `@font_path`: the path from CSS to font files (without an extension)
|
103
188
|
* `@font_path_alt`: if `preprocessor_path` was set, this is the modified path
|
189
|
+
* `pseudo_element`: if `css3` was set to true, then it will print `::before`. Otherwise the PseudoElement will be `:before`
|
104
190
|
|
105
191
|
`font_face` accepts a hash that modifies the CSS url() function and the path of
|
106
192
|
the font files (`font_face(url: "font-url", path: @font_path_alt)`).
|
data/fontcustom.gemspec
CHANGED
@@ -20,9 +20,9 @@ Gem::Specification.new do |gem|
|
|
20
20
|
|
21
21
|
gem.add_dependency "json", "~>1.4"
|
22
22
|
gem.add_dependency "thor", "~>0.14"
|
23
|
-
gem.add_dependency "listen", ">=1.0","<
|
23
|
+
gem.add_dependency "listen", ">=1.0","<4.0"
|
24
24
|
|
25
|
-
gem.add_development_dependency "rake"
|
25
|
+
gem.add_development_dependency "rake", "~> 10"
|
26
26
|
gem.add_development_dependency "bundler"
|
27
27
|
gem.add_development_dependency "rspec", "~>3.1.0"
|
28
28
|
end
|
data/lib/fontcustom.rb
CHANGED
data/lib/fontcustom/base.rb
CHANGED
@@ -6,7 +6,8 @@ module Fontcustom
|
|
6
6
|
|
7
7
|
def initialize(raw_options)
|
8
8
|
check_fontforge
|
9
|
-
|
9
|
+
check_woff2
|
10
|
+
manifest = '.fontcustom-manifest.json'
|
10
11
|
raw_options[:manifest] = manifest
|
11
12
|
@options = Fontcustom::Options.new(raw_options).options
|
12
13
|
@manifest = Fontcustom::Manifest.new(manifest, @options)
|
@@ -30,12 +31,23 @@ module Fontcustom
|
|
30
31
|
private
|
31
32
|
|
32
33
|
def check_fontforge
|
33
|
-
|
34
|
+
if !Gem.win_platform?
|
35
|
+
fontforge = `which fontforge`
|
36
|
+
else
|
37
|
+
fontforge = `where fontforge`
|
38
|
+
end
|
34
39
|
if fontforge == "" || fontforge == "fontforge not found"
|
35
40
|
raise Fontcustom::Error, "Please install fontforge first. Visit <http://fontcustom.com> for instructions."
|
36
41
|
end
|
37
42
|
end
|
38
43
|
|
44
|
+
def check_woff2
|
45
|
+
woff2 = `which woff2_compress`
|
46
|
+
if woff2 == "" || woff2 == "woff2_compress not found"
|
47
|
+
fail Fontcustom::Error, "Please install woff2 first. Visit <https://github.com/google/woff2> for instructions."
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
39
51
|
# Calculates a hash of vectors, options, and templates (content and filenames)
|
40
52
|
def checksum
|
41
53
|
files = Dir.glob(File.join(@options[:input][:vectors], "*.svg")).select { |fn| File.file?(fn) }
|
data/lib/fontcustom/cli.rb
CHANGED
@@ -25,7 +25,7 @@ module Fontcustom
|
|
25
25
|
class_option :font_name, :aliases => %w|--name -n|, :type => :string,
|
26
26
|
:desc => "The font's name. Also determines the file names of generated templates.",
|
27
27
|
:default => DEFAULT_OPTIONS[:font_name]
|
28
|
-
|
28
|
+
|
29
29
|
class_option :font_design_size, :aliases => %s|--size -s|, :type => :numeric,
|
30
30
|
:desc => "Size (in pica points) for which this font is designed.",
|
31
31
|
:default => DEFAULT_OPTIONS[:font_design_size]
|
@@ -52,6 +52,9 @@ module Fontcustom
|
|
52
52
|
class_option :autowidth, :aliases => "-A", :type => :boolean,
|
53
53
|
:desc => "Horizontally fit glyphs to their individual vector widths."
|
54
54
|
|
55
|
+
class_option :css3, :type => :boolean,
|
56
|
+
:desc => "Use CSS3 Pseudo Elements"
|
57
|
+
|
55
58
|
class_option :no_hash, :aliases => "-h", :type => :boolean,
|
56
59
|
:desc => "Generate fonts without asset-busting hashes."
|
57
60
|
|
@@ -67,6 +70,9 @@ module Fontcustom
|
|
67
70
|
class_option :quiet, :aliases => "-q", :type => :boolean,
|
68
71
|
:desc => "Hide status messages."
|
69
72
|
|
73
|
+
class_option :copyright, :aliases => %w|--copyright -r|, :type => :string,
|
74
|
+
:desc => "Copyright information."
|
75
|
+
|
70
76
|
# Required for Thor::Actions#template
|
71
77
|
def self.source_root
|
72
78
|
File.join Fontcustom.gem_lib, "templates"
|
@@ -78,6 +84,7 @@ module Fontcustom
|
|
78
84
|
rescue Fontcustom::Error => e
|
79
85
|
say_status :error, e.message, :red
|
80
86
|
puts e.backtrace.join("\n") if options[:debug]
|
87
|
+
exit 1
|
81
88
|
end
|
82
89
|
|
83
90
|
desc "watch [INPUT] [OPTIONS]", "Watches INPUT for changes and regenerates files automatically. Ctrl + C to stop. Default: `pwd`"
|
@@ -90,6 +97,7 @@ module Fontcustom
|
|
90
97
|
Watcher.new(opts).watch
|
91
98
|
rescue Fontcustom::Error => e
|
92
99
|
say_status :error, e.message, :red
|
100
|
+
exit 1
|
93
101
|
end
|
94
102
|
|
95
103
|
desc "config [DIR]", "Generates a starter configuration file (fontcustom.yml) in DIR. Default: `pwd`"
|
@@ -12,6 +12,12 @@ module Fontcustom
|
|
12
12
|
def initialize(manifest)
|
13
13
|
@manifest = Fontcustom::Manifest.new manifest
|
14
14
|
@options = @manifest.get :options
|
15
|
+
|
16
|
+
@pseudo_element = ':before';
|
17
|
+
if @options[:css3]
|
18
|
+
@pseudo_element = '::before';
|
19
|
+
end
|
20
|
+
|
15
21
|
end
|
16
22
|
|
17
23
|
def generate
|
@@ -146,6 +152,7 @@ module Fontcustom
|
|
146
152
|
@font-face {
|
147
153
|
font-family: "#{font_name}";
|
148
154
|
src: url("data:application/x-font-woff;charset=utf-8;base64,#{woff_base64}") format("woff"),
|
155
|
+
#{url}("#{path}.woff2") format("woff2"),
|
149
156
|
#{url}("#{path}.ttf") format("truetype"),
|
150
157
|
#{url}("#{path}.svg##{font_name}") format("svg");
|
151
158
|
font-weight: normal;
|
@@ -156,6 +163,7 @@ module Fontcustom
|
|
156
163
|
font-family: "#{font_name}";
|
157
164
|
src: #{url}("#{path}.eot");
|
158
165
|
src: #{url}("#{path}.eot?#iefix") format("embedded-opentype"),
|
166
|
+
#{url}("#{path}.woff2") format("woff2"),
|
159
167
|
#{url}("#{path}.woff") format("woff"),
|
160
168
|
#{url}("#{path}.ttf") format("truetype"),
|
161
169
|
#{url}("#{path}.svg##{font_name}") format("svg");
|
@@ -183,7 +191,7 @@ module Fontcustom
|
|
183
191
|
|
184
192
|
def glyph_selectors
|
185
193
|
output = @glyphs.map do |name, value|
|
186
|
-
@options[:css_selector].sub("{{glyph}}", name.to_s) +
|
194
|
+
@options[:css_selector].sub("{{glyph}}", name.to_s) + @pseudo_element
|
187
195
|
end
|
188
196
|
output.join ",\n"
|
189
197
|
end
|
@@ -205,10 +213,14 @@ module Fontcustom
|
|
205
213
|
|
206
214
|
def glyphs
|
207
215
|
output = @glyphs.map do |name, value|
|
208
|
-
%Q|#{@options[:css_selector].sub('{{glyph}}', name.to_s)}
|
216
|
+
%Q|#{@options[:css_selector].sub('{{glyph}}', name.to_s)}#{@pseudo_element} { content: "\\#{value[:codepoint].to_s(16)}"; }|
|
209
217
|
end
|
210
218
|
output.join "\n"
|
211
219
|
end
|
220
|
+
|
221
|
+
def pseudo_element
|
222
|
+
@pseudo_element
|
223
|
+
end
|
212
224
|
end
|
213
225
|
end
|
214
226
|
end
|
data/lib/fontcustom/options.rb
CHANGED
@@ -165,7 +165,11 @@ module Fontcustom
|
|
165
165
|
def check_template_paths
|
166
166
|
@options[:templates].each do |template|
|
167
167
|
next if %w|preview css scss scss-rails|.include? template
|
168
|
-
|
168
|
+
if template[0] == "/"
|
169
|
+
path = template
|
170
|
+
else
|
171
|
+
path = File.expand_path File.join(@options[:input][:templates], template)
|
172
|
+
end
|
169
173
|
unless File.exists? path
|
170
174
|
raise Fontcustom::Error,
|
171
175
|
"Custom template `#{template}` wasn't found in `#{@options[:input][:templates]}/`. Check your options."
|
@@ -184,7 +188,7 @@ module Fontcustom
|
|
184
188
|
end
|
185
189
|
|
186
190
|
def print_debug
|
187
|
-
message = line_break(16)
|
191
|
+
message = line_break(16)
|
188
192
|
message << @options.pretty_inspect.split("\n ").join(line_break(16))
|
189
193
|
say_message :debug, "Using options:#{message}"
|
190
194
|
end
|
@@ -225,7 +225,7 @@ class FontError(Exception):
|
|
225
225
|
pass
|
226
226
|
|
227
227
|
def multichar(str):
|
228
|
-
vals = struct.unpack('4B', str[:4])
|
228
|
+
vals = struct.unpack('4B', str[:4].encode('utf-8'))
|
229
229
|
return (vals[0] << 24) + (vals[1] << 16) + (vals[2] << 8) + vals[3]
|
230
230
|
|
231
231
|
def multicharval(v):
|
@@ -289,10 +289,10 @@ def get_table_directory(data):
|
|
289
289
|
datalen = len(data)
|
290
290
|
sfntsize = struct.calcsize(OpenType.SFNT_UNPACK)
|
291
291
|
if sfntsize > datalen:
|
292
|
-
raise FontError
|
292
|
+
raise FontError('truncated font data')
|
293
293
|
sfntvers, numTables = struct.unpack(OpenType.SFNT_UNPACK, data[:sfntsize])[:2]
|
294
294
|
if sfntvers != OpenType.SFNT_CFF and sfntvers != OpenType.SFNT_TRUE:
|
295
|
-
raise FontError
|
295
|
+
raise FontError('invalid font type')
|
296
296
|
|
297
297
|
font = {}
|
298
298
|
font['version'] = sfntvers
|
@@ -301,7 +301,7 @@ def get_table_directory(data):
|
|
301
301
|
# create set of offsets, lengths for tables
|
302
302
|
table_dir_size = struct.calcsize(OpenType.TABLE_DIR_UNPACK)
|
303
303
|
if sfntsize + table_dir_size * numTables > datalen:
|
304
|
-
raise FontError
|
304
|
+
raise FontError('truncated font data, table directory extends past end of data')
|
305
305
|
table_dir = {}
|
306
306
|
for i in range(0, numTables):
|
307
307
|
start = sfntsize + i * table_dir_size
|
@@ -321,7 +321,7 @@ def get_name_records(nametable):
|
|
321
321
|
count, strOffset = struct.unpack('>2H', nametable[2:6])
|
322
322
|
namerecsize = struct.calcsize(OpenType.NAME_RECORD_UNPACK)
|
323
323
|
if count * namerecsize + headersize > len(nametable):
|
324
|
-
raise FontError
|
324
|
+
raise FontError('names exceed size of name table')
|
325
325
|
name['count'] = count
|
326
326
|
name['strOffset'] = strOffset
|
327
327
|
|
@@ -363,7 +363,7 @@ def make_eot_name_headers(fontdata, nameTableDir):
|
|
363
363
|
else:
|
364
364
|
nameheaders.append(struct.pack('4x')) # len = 0, padding = 0
|
365
365
|
|
366
|
-
return ''.join(nameheaders)
|
366
|
+
return b''.join(nameheaders)
|
367
367
|
|
368
368
|
# just return a null-string (len = 0)
|
369
369
|
def make_root_string():
|
@@ -381,7 +381,7 @@ def make_eot_header(fontdata):
|
|
381
381
|
required = (OpenType.TABLE_HEAD, OpenType.TABLE_NAME, OpenType.TABLE_OS2)
|
382
382
|
for table in required:
|
383
383
|
if not (table in tableDir):
|
384
|
-
raise FontError
|
384
|
+
raise FontError('missing required table ' + multicharval(table))
|
385
385
|
|
386
386
|
# read name strings
|
387
387
|
|
@@ -398,7 +398,7 @@ def make_eot_header(fontdata):
|
|
398
398
|
os2size = struct.calcsize(OpenType.OS2_UNPACK)
|
399
399
|
|
400
400
|
if os2size > os2Dir['length']:
|
401
|
-
raise FontError
|
401
|
+
raise FontError('OS/2 table invalid length')
|
402
402
|
|
403
403
|
os2fields = struct.unpack(OpenType.OS2_UNPACK, fontdata[os2offset : os2offset + os2size])
|
404
404
|
|
@@ -420,7 +420,7 @@ def make_eot_header(fontdata):
|
|
420
420
|
headsize = struct.calcsize(OpenType.HEAD_UNPACK)
|
421
421
|
|
422
422
|
if headsize > headDir['length']:
|
423
|
-
raise FontError
|
423
|
+
raise FontError('head table invalid length')
|
424
424
|
|
425
425
|
headfields = struct.unpack(OpenType.HEAD_UNPACK, fontdata[headoffset : headoffset + headsize])
|
426
426
|
checkSumAdjustment = headfields[0]
|
@@ -435,11 +435,11 @@ def make_eot_header(fontdata):
|
|
435
435
|
*([eotSize, fontDataSize, version, flags] + panose + [charset, italic] +
|
436
436
|
[weight, fsType, magicNumber] + urange + codepage + [checkSumAdjustment]))
|
437
437
|
|
438
|
-
return ''.join((fixed, nameheaders, rootstring))
|
438
|
+
return b''.join((fixed, nameheaders, rootstring))
|
439
439
|
|
440
440
|
|
441
441
|
def write_eot_font(eot, header, data):
|
442
|
-
open(eot,'wb').write(''.join((header, data)))
|
442
|
+
open(eot,'wb').write(b''.join((header, data)))
|
443
443
|
return
|
444
444
|
|
445
445
|
def main():
|
@@ -453,7 +453,7 @@ def main():
|
|
453
453
|
for f in args:
|
454
454
|
data = readfont(f)
|
455
455
|
if len(data) == 0:
|
456
|
-
print
|
456
|
+
print('Error reading %s' % f)
|
457
457
|
else:
|
458
458
|
eot = eotname(f)
|
459
459
|
header = make_eot_header(data)
|
@@ -463,4 +463,4 @@ def main():
|
|
463
463
|
if __name__ == '__main__':
|
464
464
|
main()
|
465
465
|
|
466
|
-
|
466
|
+
|
@@ -39,6 +39,7 @@ font.descent = options['font_descent']
|
|
39
39
|
font.fontname = options['font_name']
|
40
40
|
font.familyname = options['font_name']
|
41
41
|
font.fullname = options['font_name']
|
42
|
+
font.copyright = options['copyright']
|
42
43
|
if options['autowidth']:
|
43
44
|
font.autoWidth(0, 0, options['font_em'])
|
44
45
|
|
@@ -53,7 +54,7 @@ def removeSwitchFromSvg( file ):
|
|
53
54
|
tmpsvgfile = tempfile.NamedTemporaryFile(suffix=".svg", delete=False)
|
54
55
|
svgtext = svgtext.replace('<switch>', '')
|
55
56
|
svgtext = svgtext.replace('</switch>', '')
|
56
|
-
tmpsvgfile.file.write(svgtext)
|
57
|
+
tmpsvgfile.file.write(svgtext.encode('utf-8'))
|
57
58
|
tmpsvgfile.file.close()
|
58
59
|
|
59
60
|
return tmpsvgfile.name
|
@@ -63,7 +64,7 @@ def createGlyph( name, source, code ):
|
|
63
64
|
|
64
65
|
if ext == '.svg':
|
65
66
|
temp = removeSwitchFromSvg(source)
|
66
|
-
glyph = font.createChar(code)
|
67
|
+
glyph = font.createChar(code, name)
|
67
68
|
glyph.importOutlines(temp)
|
68
69
|
os.unlink(temp)
|
69
70
|
|
@@ -83,7 +84,7 @@ def createGlyph( name, source, code ):
|
|
83
84
|
glyph = font.createChar(32)
|
84
85
|
glyph.width = 200
|
85
86
|
|
86
|
-
for glyph, data in manifest['glyphs'].
|
87
|
+
for glyph, data in manifest['glyphs'].items():
|
87
88
|
name = createGlyph(glyph, data['source'], data['codepoint'])
|
88
89
|
|
89
90
|
#
|
@@ -112,7 +113,11 @@ try:
|
|
112
113
|
# Convert WOFF
|
113
114
|
scriptPath = os.path.dirname(os.path.realpath(__file__))
|
114
115
|
try:
|
115
|
-
|
116
|
+
# check if on windows
|
117
|
+
if os.name == 'nt':
|
118
|
+
subprocess.Popen([scriptPath + '/sfnt2woff.exe', fontfile + '.ttf'], stdout=subprocess.PIPE)
|
119
|
+
else:
|
120
|
+
subprocess.Popen([scriptPath + '/sfnt2woff', fontfile + '.ttf'], stdout=subprocess.PIPE)
|
116
121
|
except OSError:
|
117
122
|
# If the local version of sfnt2woff fails (i.e., on Linux), try to use the
|
118
123
|
# global version. This allows us to avoid forcing OS X users to compile
|
@@ -122,9 +127,17 @@ try:
|
|
122
127
|
|
123
128
|
# Convert EOT for IE7
|
124
129
|
subprocess.call('python ' + scriptPath + '/eotlitetool.py ' + fontfile + '.ttf -o ' + fontfile + '.eot', shell=True)
|
125
|
-
|
130
|
+
# check if windows
|
131
|
+
if os.name == 'nt':
|
132
|
+
subprocess.call('move ' + fontfile + '.eotlite ' + fontfile + '.eot', shell=True)
|
133
|
+
else:
|
134
|
+
subprocess.call('mv ' + fontfile + '.eotlite ' + fontfile + '.eot', shell=True)
|
126
135
|
manifest['fonts'].append(fontfile + '.eot')
|
127
136
|
|
137
|
+
# Convert TTF to WOFF2
|
138
|
+
subprocess.call('woff2_compress \'' + fontfile + '.ttf\'', shell=True)
|
139
|
+
manifest['fonts'].append(fontfile + '.woff2')
|
140
|
+
|
128
141
|
finally:
|
129
142
|
manifestfile.seek(0)
|
130
143
|
manifestfile.write(json.dumps(manifest, indent=2, sort_keys=True))
|
Binary file
|
@@ -4,9 +4,9 @@
|
|
4
4
|
|
5
5
|
<%= font_face(url: "font-url", path: @font_path_alt) %>
|
6
6
|
|
7
|
-
[data-icon]
|
7
|
+
[data-icon]<%= pseudo_element %> { content: attr(data-icon); }
|
8
8
|
|
9
|
-
[data-icon]
|
9
|
+
[data-icon]<%= pseudo_element %>,
|
10
10
|
<%= glyph_selectors %> {
|
11
11
|
<%= glyph_properties %>
|
12
12
|
}
|
@@ -4,9 +4,9 @@
|
|
4
4
|
|
5
5
|
<%= font_face(path: @font_path_alt) %>
|
6
6
|
|
7
|
-
[data-icon]
|
7
|
+
[data-icon]<%= pseudo_element %> { content: attr(data-icon); }
|
8
8
|
|
9
|
-
[data-icon]
|
9
|
+
[data-icon]<%= pseudo_element %>,
|
10
10
|
<%= glyph_selectors %> {
|
11
11
|
<%= glyph_properties %>
|
12
12
|
}
|
data/lib/fontcustom/version.rb
CHANGED
data/lib/fontcustom/watcher.rb
CHANGED
@@ -39,7 +39,7 @@ module Fontcustom
|
|
39
39
|
else
|
40
40
|
listen_options[:filter] = /(#{templates.join("|")}|.+\.svg)$/
|
41
41
|
listen_options[:relative_paths] = true
|
42
|
-
@listener = Listen::Listener.new(listen_dirs, listen_options, &callback)
|
42
|
+
@listener = Listen::Listener.new(*listen_dirs, listen_options, &callback)
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fontcustom
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kai Zau
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2017-06-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
@@ -48,7 +48,7 @@ dependencies:
|
|
48
48
|
version: '1.0'
|
49
49
|
- - "<"
|
50
50
|
- !ruby/object:Gem::Version
|
51
|
-
version: '
|
51
|
+
version: '4.0'
|
52
52
|
type: :runtime
|
53
53
|
prerelease: false
|
54
54
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -58,21 +58,21 @@ dependencies:
|
|
58
58
|
version: '1.0'
|
59
59
|
- - "<"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '4.0'
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: rake
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '10'
|
69
69
|
type: :development
|
70
70
|
prerelease: false
|
71
71
|
version_requirements: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '10'
|
76
76
|
- !ruby/object:Gem::Dependency
|
77
77
|
name: bundler
|
78
78
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,6 +122,7 @@ files:
|
|
122
122
|
- bin/fontcustom
|
123
123
|
- fontcustom.gemspec
|
124
124
|
- gemfiles/Gemfile.listen_1
|
125
|
+
- gemfiles/Gemfile.listen_2
|
125
126
|
- lib/fontcustom.rb
|
126
127
|
- lib/fontcustom/base.rb
|
127
128
|
- lib/fontcustom/cli.rb
|
@@ -133,6 +134,7 @@ files:
|
|
133
134
|
- lib/fontcustom/scripts/eotlitetool.py
|
134
135
|
- lib/fontcustom/scripts/generate.py
|
135
136
|
- lib/fontcustom/scripts/sfnt2woff
|
137
|
+
- lib/fontcustom/scripts/sfnt2woff.exe
|
136
138
|
- lib/fontcustom/templates/_fontcustom-rails.scss
|
137
139
|
- lib/fontcustom/templates/_fontcustom.scss
|
138
140
|
- lib/fontcustom/templates/fontcustom-preview.html
|
@@ -203,7 +205,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
203
205
|
version: '0'
|
204
206
|
requirements: []
|
205
207
|
rubyforge_project:
|
206
|
-
rubygems_version: 2.
|
208
|
+
rubygems_version: 2.6.11
|
207
209
|
signing_key:
|
208
210
|
specification_version: 4
|
209
211
|
summary: Generate icon fonts from the command line.
|