fontcustom 1.2.0 → 1.3.0.beta
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +16 -0
- data/CONTRIBUTING.md +35 -15
- data/TODO.md +20 -0
- data/lib/fontcustom.rb +11 -24
- data/lib/fontcustom/base.rb +56 -0
- data/lib/fontcustom/cli.rb +13 -12
- data/lib/fontcustom/generator/font.rb +63 -65
- data/lib/fontcustom/generator/template.rb +81 -52
- data/lib/fontcustom/manifest.rb +42 -0
- data/lib/fontcustom/options.rb +93 -80
- data/lib/fontcustom/scripts/generate.py +116 -127
- data/lib/fontcustom/templates/_fontcustom-rails.scss +13 -18
- data/lib/fontcustom/templates/_fontcustom.scss +10 -18
- data/lib/fontcustom/templates/fontcustom-preview.html +17 -24
- data/lib/fontcustom/templates/fontcustom.css +10 -18
- data/lib/fontcustom/templates/fontcustom.yml +3 -3
- data/lib/fontcustom/utility.rb +145 -0
- data/lib/fontcustom/version.rb +1 -1
- data/lib/fontcustom/watcher.rb +1 -1
- data/spec/fixtures/generators/.fontcustom-manifest-corrupted.json +12 -5
- data/spec/fixtures/generators/.fontcustom-manifest-empty.json +0 -0
- data/spec/fixtures/generators/.fontcustom-manifest.json +49 -14
- data/spec/fixtures/generators/mixed-output/fontcustom_82a59e769bc60192484f2620570bbb59.eot +0 -0
- data/spec/fixtures/generators/mixed-output/fontcustom_82a59e769bc60192484f2620570bbb59.svg +56 -0
- data/spec/fixtures/generators/mixed-output/fontcustom_82a59e769bc60192484f2620570bbb59.ttf +0 -0
- data/spec/fixtures/generators/mixed-output/fontcustom_82a59e769bc60192484f2620570bbb59.woff +0 -0
- data/spec/fixtures/sandbox/.gitkeep +0 -0
- data/spec/fontcustom/base_spec.rb +58 -0
- data/spec/fontcustom/cli_spec.rb +15 -0
- data/spec/fontcustom/generator/font_spec.rb +50 -220
- data/spec/fontcustom/generator/template_spec.rb +30 -194
- data/spec/fontcustom/generator/template_spec.rb.off +215 -0
- data/spec/fontcustom/manifest_spec.rb +16 -0
- data/spec/fontcustom/options_spec.rb +206 -208
- data/spec/fontcustom/utility_spec.rb +163 -0
- data/spec/fontcustom/{watcher_spec.rb → watcher_spec.rb.off} +0 -0
- data/spec/spec_helper.rb +77 -19
- metadata +44 -54
- data/lib/fontcustom/templates/_fontcustom-bootstrap-ie7.scss +0 -22
- data/lib/fontcustom/templates/_fontcustom-bootstrap.scss +0 -63
- data/lib/fontcustom/templates/fontcustom-bootstrap-ie7.css +0 -22
- data/lib/fontcustom/templates/fontcustom-bootstrap.css +0 -63
- data/lib/fontcustom/util.rb +0 -62
- data/spec/fixtures/generators/mixed-output/fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.eot +0 -0
- data/spec/fixtures/generators/mixed-output/fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.svg +0 -102
- data/spec/fixtures/generators/mixed-output/fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.ttf +0 -0
- data/spec/fixtures/generators/mixed-output/fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.woff +0 -0
- data/spec/fontcustom/util_spec.rb +0 -82
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1abf5b322a257728ac1e293a8392f3592e9954b7
|
4
|
+
data.tar.gz: cb6b2ca5e590ae76878050e2317ab7de0cd74041
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 0476cea6aef78118bf1fd85caa008d3de5b2ab465c92619a639eec104ec98178072d4f231a3d1ffee152031f28f9814ad3f2a51fc00c2c5a6a1f1312f2093be4
|
7
|
+
data.tar.gz: 40046d513e692b44bf504969844f48fe905b79b67f7cb9c5b5fe4f5b8ef3a32cc6bde44d83f6173a876956a402d1be5c9fc637b059f532aa6803055c46360155
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
## 1.3.0.beta (11/25/2013)
|
2
|
+
|
3
|
+
The big news: fixed glyph code points. Automatically assigned for now, but changing them by hand is just a matter of modifying the generated `.fontcustom-manifest.json`.
|
4
|
+
|
5
|
+
Lots of internal changes / streamlining on this one. A few breaking changes (`css_prefix`, custom template syntax, possibly others). Error messages and docs are still a bit sparse — my apologies in advance.
|
6
|
+
|
7
|
+
* Fixed glyph code points ([#56](https://github.com/FontCustom/fontcustom/issues/56))
|
8
|
+
* Changes `css_prefix` to `css_selector` to allow greater flexibility ([#126](https://github.com/FontCustom/fontcustom/pull/126))
|
9
|
+
* Skips compilation if inputs have not changed (and `force` option to bypass checks)
|
10
|
+
* Adds CSS template helpers for convenience and DRYness
|
11
|
+
* Drops bootstrap templates (maintaince overhead, unsure if anyone was using them)
|
12
|
+
|
13
|
+
Next up:
|
14
|
+
|
15
|
+
* Storing relative paths in the manifest for collaborative editing ([#149](https://github.com/FontCustom/fontcustom/pull/149))
|
16
|
+
|
1
17
|
## 1.2.0 (11/2/2013)
|
2
18
|
|
3
19
|
* Preparation for fixed glyph code points.
|
data/CONTRIBUTING.md
CHANGED
@@ -1,31 +1,51 @@
|
|
1
1
|
## Help make Font Custom better!
|
2
2
|
|
3
3
|
This project was born out of an overheard conversation between two devs in a
|
4
|
-
NYC coffee shop — it's come a long ways thanks to your support.
|
4
|
+
NYC coffee shop — it's come a long ways thanks to your support. Here's what's
|
5
|
+
on the menu:
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
* Ruby on Rails integration
|
9
|
-
* Compass integration
|
7
|
+
* **Ruby on Rails integration**
|
8
|
+
* **Compass integration**
|
10
9
|
* Base 64 encode fonts into CSS
|
11
10
|
* Templates for LESS, stylus, etc.
|
12
11
|
* Ligature support
|
13
12
|
* Windows support
|
14
13
|
* Make better use of Thor
|
15
14
|
|
16
|
-
|
15
|
+
Just [file an issue](https://github.com/FontCustom/fontcustom/issues) if you
|
16
|
+
have an idea or would like to claim one.
|
17
17
|
|
18
|
-
|
19
|
-
as much as possible.
|
18
|
+
### Rules of Thumb
|
20
19
|
|
21
20
|
If you catch a typo or a block of code that could be more elegant — please let
|
22
21
|
us know. No such thing as too small of an improvement.
|
23
22
|
|
24
|
-
|
23
|
+
* Spaces instead of tabs, please.
|
24
|
+
* Develop in a topic branch.
|
25
|
+
* Include passing tests if applicable.
|
26
|
+
* Follow the [Github ruby styleguide](https://github.com/styleguide/ruby) as
|
27
|
+
much as possible.
|
28
|
+
|
29
|
+
### Getting Started
|
30
|
+
|
31
|
+
You'll need:
|
32
|
+
|
33
|
+
* Fontforge with Python scripting (easiest via [Homebrew](http://brew.sh/) on Mac)
|
34
|
+
* Ruby 1.9.2+ (via [rbenv](https://github.com/sstephenson/rbenv), [RVM](https://rvm.io/), etc.)
|
35
|
+
* Rubygems
|
36
|
+
* Bundler
|
37
|
+
* Rake
|
38
|
+
* Rspec
|
39
|
+
|
40
|
+
Some helpful links:
|
41
|
+
|
42
|
+
* http://createdbypete.com/articles/ruby-on-rails-development-with-mac-os-x-mountain-lion/
|
43
|
+
* http://guides.rubygems.org/make-your-own-gem/
|
44
|
+
|
45
|
+
---
|
46
|
+
|
47
|
+
That's all there is to it. Thanks again, and please don't hesitate to reach out:
|
25
48
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
* Add your tests. Run tests with `rake`.
|
30
|
-
* Develop your feature.
|
31
|
-
* Once all tests are passing, submit a pull request!
|
49
|
+
[Github Issues](https://github.com/FontCustom/fontcustom/issues)<br>
|
50
|
+
[@ezYZ](https://twitter.com/ezYZ)<br>
|
51
|
+
[@endtwist](https://twitter.com/endtwist)
|
data/TODO.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
## TODO
|
2
|
+
|
3
|
+
### 1.3.0
|
4
|
+
|
5
|
+
* tests, error messages, and docs for generate.py / SVG bugs
|
6
|
+
* tests, error messages, and docs for template generator
|
7
|
+
* store relative paths in manifest (rebuild in generator/util)
|
8
|
+
* documentation for template helpers
|
9
|
+
* redirect fontcustom.com to github repo (use wiki for documentation)
|
10
|
+
|
11
|
+
### Low Priority
|
12
|
+
|
13
|
+
* conserve code points: http://stackoverflow.com/questions/8794430/ruby-finding-lowest-free-id-in-an-id-array
|
14
|
+
* more flexible input/ouput hashes (regex or file extensions)
|
15
|
+
* sass template with variables
|
16
|
+
* less template with variables
|
17
|
+
* more robust fontforge check than `which`
|
18
|
+
* remove redundant requires
|
19
|
+
* rename options for succintness (e.g. :project_root => :root)
|
20
|
+
* trim options specs down
|
data/lib/fontcustom.rb
CHANGED
@@ -1,56 +1,43 @@
|
|
1
1
|
require "fontcustom/version"
|
2
2
|
require "fontcustom/error"
|
3
|
-
require "fontcustom/
|
3
|
+
require "fontcustom/utility"
|
4
|
+
require "fontcustom/base"
|
5
|
+
require "fontcustom/manifest"
|
4
6
|
require "fontcustom/options"
|
5
7
|
require "fontcustom/generator/font"
|
6
8
|
require "fontcustom/generator/template"
|
7
9
|
|
8
10
|
module Fontcustom
|
9
|
-
##
|
10
|
-
# Clean Ruby API to workaround Thor
|
11
|
-
def compile(options)
|
12
|
-
opts = Options.new options
|
13
|
-
Generator::Font.start [opts]
|
14
|
-
Generator::Template.start [opts]
|
15
|
-
rescue Fontcustom::Error => e
|
16
|
-
opts.say_message :error, e.message, :red
|
17
|
-
end
|
18
|
-
|
19
11
|
def gem_lib
|
20
12
|
File.expand_path(File.join(File.dirname(__FILE__), "fontcustom"))
|
21
13
|
end
|
22
|
-
|
23
|
-
module_function :compile, :gem_lib
|
14
|
+
module_function :gem_lib
|
24
15
|
|
25
16
|
##
|
26
|
-
#
|
17
|
+
# Hack to get Thor to show more helpful defaults in `fontcustom help`. These
|
18
|
+
# are overwritten in Fontcustom::Options.
|
27
19
|
EXAMPLE_OPTIONS = {
|
28
20
|
:project_root => "`pwd`",
|
29
21
|
:output => "PROJECT_ROOT/FONT_NAME",
|
30
|
-
:config => "PROJECT_ROOT/fontcustom.yml
|
22
|
+
:config => "PROJECT_ROOT/fontcustom.yml -or- PROJECT_ROOT/config/fontcustom.yml",
|
31
23
|
:templates => "css preview",
|
32
|
-
:manifest => "CONFIG_DIR/.fontcustom-manifest.json
|
24
|
+
:manifest => "CONFIG_DIR/.fontcustom-manifest.json -or- PROJECT_ROOT/.fontcustom-manifest.json"
|
33
25
|
}
|
34
26
|
|
35
27
|
DEFAULT_OPTIONS = {
|
36
|
-
:project_root =>
|
28
|
+
:project_root => nil,
|
37
29
|
:input => nil,
|
38
30
|
:output => nil,
|
39
31
|
:config => nil,
|
40
32
|
:templates => %w|css preview|,
|
41
33
|
:font_name => "fontcustom",
|
42
|
-
:
|
34
|
+
:css_selector => ".icon-{{glyph}}",
|
43
35
|
:manifest => nil,
|
44
36
|
:preprocessor_path => nil,
|
45
37
|
:autowidth => false,
|
46
38
|
:no_hash => false,
|
47
39
|
:debug => false,
|
40
|
+
:force => false,
|
48
41
|
:quiet => false
|
49
42
|
}
|
50
|
-
|
51
|
-
DATA_MODEL = {
|
52
|
-
:fonts => [],
|
53
|
-
:templates => [],
|
54
|
-
:glyphs => []
|
55
|
-
}
|
56
43
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require "digest/sha2"
|
2
|
+
|
3
|
+
module Fontcustom
|
4
|
+
class Base
|
5
|
+
include Utility
|
6
|
+
|
7
|
+
def initialize(cli_options)
|
8
|
+
@cli_options = cli_options
|
9
|
+
check_fontforge
|
10
|
+
init_manifest
|
11
|
+
end
|
12
|
+
|
13
|
+
def compile
|
14
|
+
@manifest[:checksum][:current] = checksum
|
15
|
+
if @options[:force] || @manifest[:checksum][:current] != @manifest[:checksum][:previous]
|
16
|
+
save_manifest
|
17
|
+
start_generators
|
18
|
+
@manifest = get_manifest
|
19
|
+
@manifest[:checksum][:previous] = @manifest[:checksum][:current]
|
20
|
+
save_manifest
|
21
|
+
else
|
22
|
+
say_message :status, "No changes detected. Skipping compilation."
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def check_fontforge
|
29
|
+
fontforge = `which fontforge`
|
30
|
+
if fontforge == "" || fontforge == "fontforge not found"
|
31
|
+
raise Fontcustom::Error, "Please install fontforge first. Visit <http://fontcustom.com> for instructions."
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def init_manifest
|
36
|
+
file = @cli_options[:manifest] || File.join(Dir.pwd, ".fontcustom-manifest.json")
|
37
|
+
@options = Fontcustom::Options.new(@cli_options).options
|
38
|
+
@manifest = Fontcustom::Manifest.new(@options).manifest
|
39
|
+
end
|
40
|
+
|
41
|
+
# Calculates a hash of vectors, options, and templates (content and filenames)
|
42
|
+
def checksum
|
43
|
+
files = Dir.glob File.join(@options[:input][:vectors], "*.svg")
|
44
|
+
files += Dir.glob File.join(@options[:input][:templates], "*")
|
45
|
+
content = files.map { |file| File.read(file) }.join
|
46
|
+
content << files.join
|
47
|
+
content << @options.flatten(2).join
|
48
|
+
Digest::SHA2.hexdigest(content).to_s
|
49
|
+
end
|
50
|
+
|
51
|
+
def start_generators
|
52
|
+
Fontcustom::Generator::Font.new(@options[:manifest]).generate
|
53
|
+
Fontcustom::Generator::Template.new(@options[:manifest]).generate
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/fontcustom/cli.rb
CHANGED
@@ -5,7 +5,7 @@ require "fontcustom/watcher"
|
|
5
5
|
|
6
6
|
module Fontcustom
|
7
7
|
class CLI < Thor
|
8
|
-
include
|
8
|
+
include Utility
|
9
9
|
|
10
10
|
default_task :show_help
|
11
11
|
|
@@ -22,17 +22,17 @@ module Fontcustom
|
|
22
22
|
:default => EXAMPLE_OPTIONS[:config]
|
23
23
|
|
24
24
|
class_option :templates, :aliases => "-t", :type => :array,
|
25
|
-
:desc => "Space-delinated list of
|
26
|
-
:enum => %w|preview css scss scss-rails
|
25
|
+
:desc => "Space-delinated list of files to generate alongside fonts. Use stock templates or choose your own.",
|
26
|
+
:enum => %w|preview css scss scss-rails|,
|
27
27
|
:default => EXAMPLE_OPTIONS[:templates]
|
28
28
|
|
29
29
|
class_option :font_name, :aliases => "-f", :type => :string,
|
30
30
|
:desc => "The font's name. Also determines the file names of generated templates.",
|
31
31
|
:default => DEFAULT_OPTIONS[:font_name]
|
32
32
|
|
33
|
-
class_option :
|
34
|
-
:desc => "
|
35
|
-
:default => DEFAULT_OPTIONS[:
|
33
|
+
class_option :css_selector, :aliases => "-s", :type => :string,
|
34
|
+
:desc => "Format of generated CSS selector. \"{{glyph}}\" is substituted for the glyph name.",
|
35
|
+
:default => DEFAULT_OPTIONS[:css_selector]
|
36
36
|
|
37
37
|
class_option :manifest, :aliases => "-m", :type => :string,
|
38
38
|
:desc => "Path to a manifest of generated files. Used for garbage collection.",
|
@@ -50,6 +50,9 @@ module Fontcustom
|
|
50
50
|
class_option :debug, :aliases => "-d", :type => :boolean,
|
51
51
|
:desc => "Display debugging messages."
|
52
52
|
|
53
|
+
class_option :force, :aliases => "-F", :type => :boolean,
|
54
|
+
:desc => "Forces compilation, even if inputs have not changed."
|
55
|
+
|
53
56
|
class_option :quiet, :aliases => "-q", :type => :boolean,
|
54
57
|
:desc => "Hide status messages."
|
55
58
|
|
@@ -60,12 +63,10 @@ module Fontcustom
|
|
60
63
|
|
61
64
|
desc "compile [INPUT] [OPTIONS]", "Generates webfonts and templates from *.svg and *.eps files in INPUT. Default: `pwd`"
|
62
65
|
def compile(input = nil)
|
63
|
-
|
64
|
-
opts = Options.new(opts)
|
65
|
-
Generator::Font.start [opts]
|
66
|
-
Generator::Template.start [opts]
|
66
|
+
Base.new(options.merge(:input => input)).compile
|
67
67
|
rescue Fontcustom::Error => e
|
68
|
-
|
68
|
+
say_status :error, e.message, :red
|
69
|
+
puts e.backtrace.join("\n") if options[:debug]
|
69
70
|
end
|
70
71
|
|
71
72
|
desc "watch [INPUT] [OPTIONS]", "Watches INPUT for changes and regenerates files automatically. Ctrl + C to stop. Default: `pwd`"
|
@@ -78,7 +79,7 @@ module Fontcustom
|
|
78
79
|
opts = Options.new(opts)
|
79
80
|
Watcher.new(opts).watch
|
80
81
|
rescue Fontcustom::Error => e
|
81
|
-
|
82
|
+
say_status :error, e.message, :red
|
82
83
|
end
|
83
84
|
|
84
85
|
desc "config [DIR]", "Generates an annotated configuration file (fontcustom.yml) in DIR. Default: `pwd`"
|
@@ -1,92 +1,90 @@
|
|
1
1
|
require "json"
|
2
2
|
require "open3"
|
3
|
-
require "thor"
|
4
|
-
require "thor/group"
|
5
|
-
require "thor/actions"
|
6
3
|
|
7
4
|
module Fontcustom
|
8
5
|
module Generator
|
9
|
-
class Font
|
10
|
-
include
|
11
|
-
include Thor::Actions
|
6
|
+
class Font
|
7
|
+
include Utility
|
12
8
|
|
13
|
-
|
14
|
-
# This is DRYier, easier to maintain.
|
15
|
-
argument :opts
|
9
|
+
attr_reader :manifest, :options
|
16
10
|
|
17
|
-
def
|
18
|
-
|
19
|
-
|
20
|
-
unless File.directory? dir
|
21
|
-
empty_directory dir, :verbose => ! opts.quiet
|
22
|
-
end
|
23
|
-
end
|
11
|
+
def initialize(manifest)
|
12
|
+
@manifest = get_manifest(manifest)
|
13
|
+
@options = @manifest[:options]
|
24
14
|
end
|
25
15
|
|
26
|
-
def
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
@data = data.is_a?(Hash) ? symbolize_hash(data) : Fontcustom::DATA_MODEL.dup
|
32
|
-
rescue
|
33
|
-
raise Fontcustom::Error, "Couldn't parse `#{relative_to_root(opts.manifest)}`. Delete it to start from scratch. Any previously generated files will need to be deleted manually."
|
34
|
-
end
|
35
|
-
else
|
36
|
-
@data = Fontcustom::DATA_MODEL.dup
|
37
|
-
end
|
16
|
+
def generate
|
17
|
+
create_output_dirs
|
18
|
+
delete_old_fonts
|
19
|
+
set_glyph_info
|
20
|
+
create_fonts
|
38
21
|
end
|
39
22
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
23
|
+
private
|
24
|
+
|
25
|
+
def create_output_dirs
|
26
|
+
dirs = @options[:output].values.uniq
|
27
|
+
dirs.each do |dir|
|
28
|
+
unless File.directory? dir
|
29
|
+
empty_directory dir, :verbose => ! @options[:quiet]
|
47
30
|
end
|
48
|
-
ensure
|
49
|
-
@data[:fonts] = @data[:fonts] - deleted
|
50
|
-
json = JSON.pretty_generate @data
|
51
|
-
overwrite_file opts.manifest, json
|
52
|
-
say_changed :delete, deleted
|
53
31
|
end
|
54
32
|
end
|
55
33
|
|
56
|
-
def
|
57
|
-
|
58
|
-
cmd += " --autowidth" if opts.autowidth
|
59
|
-
cmd += " --nohash" if opts.no_hash
|
60
|
-
cmd += " --debug" if opts.debug
|
61
|
-
output, err, status = execute_and_clean(cmd)
|
62
|
-
@json = output.delete_at(0)
|
63
|
-
say_status :debug, "#{err}\n#{' ' * 14}#{output}", :red if opts.debug
|
64
|
-
raise Fontcustom::Error, "`fontforge` compilation failed. Try again with --debug for more details." unless status.success?
|
34
|
+
def delete_old_fonts
|
35
|
+
delete_from_manifest(:fonts)
|
65
36
|
end
|
66
37
|
|
67
|
-
def
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
38
|
+
def set_glyph_info
|
39
|
+
codepoint = if ! @manifest[:glyphs].empty?
|
40
|
+
codepoints = @manifest[:glyphs].values.map { |data| data[:codepoint] }
|
41
|
+
codepoints.max + 1
|
42
|
+
else
|
43
|
+
0xf100
|
44
|
+
end
|
73
45
|
|
74
|
-
|
75
|
-
|
76
|
-
|
46
|
+
files = Dir.glob File.join(@options[:input][:vectors], "*.svg")
|
47
|
+
glyphs = {}
|
48
|
+
files.each do |file|
|
49
|
+
name = File.basename file, ".svg"
|
50
|
+
name = name.strip.gsub(/\W/, "-").downcase
|
51
|
+
glyphs[name.to_sym] = { :source => file }
|
52
|
+
end
|
77
53
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
54
|
+
# Dir.glob returns a different order depending on ruby
|
55
|
+
# version/platform, so we have to sort it first
|
56
|
+
glyphs = Hash[glyphs.sort_by { |key, val| key.to_s }]
|
57
|
+
glyphs.each do |name, data|
|
58
|
+
if @manifest[:glyphs].has_key? name
|
59
|
+
data[:codepoint] = @manifest[:glyphs][name][:codepoint]
|
60
|
+
else
|
61
|
+
data[:codepoint] = codepoint
|
62
|
+
codepoint = codepoint + 1
|
63
|
+
end
|
64
|
+
end
|
82
65
|
|
83
|
-
|
66
|
+
@manifest[:glyphs] = glyphs
|
67
|
+
save_manifest
|
68
|
+
end
|
84
69
|
|
85
|
-
def
|
70
|
+
def create_fonts
|
71
|
+
cmd = "fontforge -script #{Fontcustom.gem_lib}/scripts/generate.py #{@options[:manifest]}"
|
86
72
|
stdout, stderr, status = Open3::capture3(cmd)
|
87
73
|
stdout = stdout.split("\n")
|
88
74
|
stdout = stdout[1..-1] if stdout[0] == "CreateAllPyModules()"
|
89
|
-
|
75
|
+
|
76
|
+
debug_msg = " Try again with --debug for more details."
|
77
|
+
if @options[:debug]
|
78
|
+
say_message :debug, "#{stderr}\n#{' ' * 14}#{stdout}", :red
|
79
|
+
debug_msg = ""
|
80
|
+
end
|
81
|
+
|
82
|
+
if status.success?
|
83
|
+
@manifest = get_manifest
|
84
|
+
say_changed :create, @manifest[:fonts]
|
85
|
+
else
|
86
|
+
raise Fontcustom::Error, "`fontforge` compilation failed.#{debug_msg}"
|
87
|
+
end
|
90
88
|
end
|
91
89
|
end
|
92
90
|
end
|