fontcustom 1.3.0.beta2 → 1.3.0.beta3
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/README.md +38 -17
- data/TODO.md +1 -2
- data/lib/fontcustom/generator/font.rb +5 -5
- data/lib/fontcustom/generator/template.rb +27 -21
- data/lib/fontcustom/options.rb +12 -12
- data/lib/fontcustom/templates/fontcustom.yml +22 -13
- data/lib/fontcustom/utility.rb +10 -5
- data/lib/fontcustom/version.rb +1 -1
- data/spec/fontcustom/utility_spec.rb +3 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a863f3b75e4669343c50c8f137aaae1c5c5df1fd
|
4
|
+
data.tar.gz: 4997708bd8b627e3ec060c32fa0c06a7a6de4835
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3743b80862699178d2c6754a198af545c38358db18563d3ffe5110b777c7350e47a1e505720e14a8620b1ae03f048e34dc091ad60ec15f224b934b56ef2368f6
|
7
|
+
data.tar.gz: 8f977e595ebf6232b06d7e69b2aead55be38727c104092340fcf20617b3b691d1f6bdf6a31d6c3a1c37a6c3080467eceb4e2f7524509c5c35a4c9d3ba643950e
|
data/README.md
CHANGED
@@ -42,31 +42,22 @@ fontcustom help # See all options
|
|
42
42
|
### Configuration
|
43
43
|
|
44
44
|
To preserve options between compiles, create a configuration file with
|
45
|
-
`fontcustom config`. This should live in the directory where you
|
46
|
-
|
47
|
-
|
45
|
+
`fontcustom config`. This should live in the directory where you run
|
46
|
+
all `fontcustom` commands. Each of the following has its own command
|
47
|
+
line flag (`--css-selector`, etc.). Defaults values are shown.
|
48
|
+
|
49
|
+
**Basics**
|
48
50
|
|
49
51
|
```yml
|
50
|
-
# (defaults shown)
|
51
|
-
font_name: fontcustom # Names the font and sets the name and directory
|
52
|
-
# of generated files
|
53
52
|
project_root: (pwd) # Context for all relative paths
|
54
53
|
input: (project_root) # Where vectors and templates are located
|
55
54
|
output: (project_root)/(font name) # Where generated files will be saved
|
56
55
|
config: (pwd)/fontcustom.yml # Optional path to a configuration file
|
57
|
-
templates: [ css, preview ] # Templates to generate alongside fonts
|
58
|
-
# Possible values: preview, css, scss, scss-rails
|
59
|
-
css_selector: .icon-{{glyph}} # Template for CSS classes
|
60
|
-
6
|
61
|
-
preprocessor_path: "" # Font path used in proprocessor templates (Sass, etc.)
|
62
|
-
no_hash: false # Don't add asset-busting hashes to font files
|
63
|
-
autowidth: false # Automatically size glyphs based on the width of
|
64
|
-
# their individual vectors
|
65
56
|
debug: false # Output raw messages from fontforge
|
66
57
|
quiet: false # Silence all messages except errors
|
67
58
|
|
68
|
-
# For more control over file locations,
|
69
|
-
#
|
59
|
+
# For more control over file locations, set
|
60
|
+
# input and output as hashes instead of strings
|
70
61
|
input:
|
71
62
|
vectors: path/to/vectors # required
|
72
63
|
templates: path/to/templates
|
@@ -75,9 +66,39 @@ output:
|
|
75
66
|
fonts: app/assets/fonts # required
|
76
67
|
css: app/assets/stylesheets
|
77
68
|
preview: app/views/styleguide
|
78
|
-
6
|
79
69
|
```
|
80
70
|
|
71
|
+
**Fonts**
|
72
|
+
|
73
|
+
```yml
|
74
|
+
font_name: fontcustom # Also sets the default output directory and
|
75
|
+
# the name of generated stock templates
|
76
|
+
no_hash: false # Don't add asset-busting hashes to font files
|
77
|
+
autowidth: false # Automatically size glyphs based on the width of
|
78
|
+
# their individual vectors
|
79
|
+
```
|
80
|
+
|
81
|
+
**Templates**
|
82
|
+
|
83
|
+
```yml
|
84
|
+
templates: [ css, preview ] # List of templates to generate alongside fonts
|
85
|
+
# Possible values: preview, css, scss, scss-rails
|
86
|
+
css_selector: .icon-{{glyph}} # CSS selector format (`{{glyph}}` is replaced)
|
87
|
+
preprocessor_path: "" # Font path used in CSS proprocessor templates
|
88
|
+
|
89
|
+
# Custom templates should live in the `input`
|
90
|
+
# or `input[:templates]` directory and be added
|
91
|
+
# to `templates` as their basename:
|
92
|
+
templates: [ preview, VectorIcons.less ]
|
93
|
+
```
|
94
|
+
|
95
|
+
Custom templates have access to `@options`, `@manifest`, and the following ERB helpers:
|
96
|
+
|
97
|
+
* `font_name`
|
98
|
+
* `font_face`: FontSpring's [Bulletproof @font-face syntax](http://www.fontspring.com/blog/further-hardening-of-the-bulletproof-syntax)
|
99
|
+
* `glyph_selectors`: comma-separated list of all selectors
|
100
|
+
* `glyphs`: all selectors and their codepoint assignments (`.icon-example:before { content: "\f103"; }`)
|
101
|
+
|
81
102
|
### SVG Guidelines
|
82
103
|
|
83
104
|
* All colors will be rendered identically — including white fills.
|
data/TODO.md
CHANGED
@@ -2,11 +2,10 @@
|
|
2
2
|
|
3
3
|
### 1.3.0
|
4
4
|
|
5
|
-
* tests, error messages, and docs for template generator
|
6
5
|
* store relative paths in manifest (rebuild in generator/util)
|
7
6
|
|
7
|
+
* reactivate watcher
|
8
8
|
* Detect old manifest / show error message
|
9
|
-
* In template/fontcustom.yml, clarify that input/output can be hashes
|
10
9
|
|
11
10
|
* Add more travis CLI rubies / thor versions?
|
12
11
|
* documentation for template helpers
|
@@ -49,6 +49,9 @@ module Fontcustom
|
|
49
49
|
name = File.basename file, ".svg"
|
50
50
|
name = name.strip.gsub(/\W/, "-")
|
51
51
|
glyphs[name.to_sym] = { :source => file }
|
52
|
+
if File.read(file).include? "rgba"
|
53
|
+
say_message :warn, "`#{relative_path(file)}` contains transparency and will be skipped."
|
54
|
+
end
|
52
55
|
end
|
53
56
|
|
54
57
|
# Dir.glob returns a different order depending on ruby
|
@@ -73,13 +76,10 @@ module Fontcustom
|
|
73
76
|
stdout = stdout.split("\n")
|
74
77
|
stdout = stdout[1..-1] if stdout[0] == "CreateAllPyModules()"
|
75
78
|
|
76
|
-
if stderr.include? "Failed to parse color rgba("
|
77
|
-
say_message :warn, "Transparent glyphs are not supported. Check your SVGs."
|
78
|
-
end
|
79
|
-
|
80
79
|
debug_msg = " Try again with --debug for more details."
|
81
80
|
if @options[:debug]
|
82
|
-
|
81
|
+
messages = stderr.split("\n") + stdout
|
82
|
+
say_message :debug, messages.join(line_break)
|
83
83
|
debug_msg = ""
|
84
84
|
end
|
85
85
|
|
@@ -42,30 +42,14 @@ module Fontcustom
|
|
42
42
|
def create_files
|
43
43
|
@glyphs = @manifest[:glyphs]
|
44
44
|
created = []
|
45
|
-
packaged = %w|fontcustom-bootstrap-ie7.css fontcustom.css _fontcustom-bootstrap-ie7.scss _fontcustom-rails.scss
|
46
|
-
fontcustom-bootstrap.css fontcustom-preview.html _fontcustom-bootstrap.scss _fontcustom.scss|
|
47
|
-
css_exts = %w|.css .scss .sass .less .stylus|
|
48
45
|
begin
|
49
46
|
@options[:templates].each do |source|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
target.sub! DEFAULT_OPTIONS[:font_name], @options[:font_name]
|
56
|
-
end
|
57
|
-
|
58
|
-
target = if @options[:output].keys.include? name.to_sym
|
59
|
-
File.join @options[:output][name.to_sym], target
|
60
|
-
elsif css_exts.include? ext
|
61
|
-
File.join @options[:output][:css], target
|
62
|
-
elsif name == "fontcustom-preview.html"
|
63
|
-
File.join @options[:output][:preview], target
|
64
|
-
else
|
65
|
-
File.join @options[:output][:fonts], target
|
47
|
+
begin
|
48
|
+
target = template_target source
|
49
|
+
template source, target, :verbose => false, :force => true
|
50
|
+
rescue => e
|
51
|
+
raise Fontcustom::Error, "Could not generate template `#{relative_path(source)}`:#{line_break + e.message}"
|
66
52
|
end
|
67
|
-
|
68
|
-
template source, target, :verbose => false, :force => true
|
69
53
|
created << target
|
70
54
|
end
|
71
55
|
ensure
|
@@ -75,6 +59,28 @@ module Fontcustom
|
|
75
59
|
end
|
76
60
|
end
|
77
61
|
|
62
|
+
def template_target(source)
|
63
|
+
packaged = %w|fontcustom.css _fontcustom.scss _fontcustom-rails.scss fontcustom-preview.html|
|
64
|
+
css_exts = %w|.css .scss .sass .less .stylus|
|
65
|
+
name = File.basename source
|
66
|
+
ext = File.extname source
|
67
|
+
target = name.dup
|
68
|
+
|
69
|
+
if packaged.include?(name) && @options[:font_name] != DEFAULT_OPTIONS[:font_name]
|
70
|
+
target.sub! DEFAULT_OPTIONS[:font_name], @options[:font_name]
|
71
|
+
end
|
72
|
+
|
73
|
+
if @options[:output].keys.include? name.to_sym
|
74
|
+
File.join @options[:output][name.to_sym], target
|
75
|
+
elsif css_exts.include? ext
|
76
|
+
File.join @options[:output][:css], target
|
77
|
+
elsif name == "fontcustom-preview.html"
|
78
|
+
File.join @options[:output][:preview], target
|
79
|
+
else
|
80
|
+
File.join @options[:output][:fonts], target
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
78
84
|
#
|
79
85
|
# Template Helpers
|
80
86
|
#
|
data/lib/fontcustom/options.rb
CHANGED
@@ -50,7 +50,7 @@ module Fontcustom
|
|
50
50
|
File.join path, "fontcustom.yml"
|
51
51
|
|
52
52
|
else
|
53
|
-
raise Fontcustom::Error, "No configuration file found at `#{
|
53
|
+
raise Fontcustom::Error, "No configuration file found at `#{relative_path(path)}`."
|
54
54
|
end
|
55
55
|
else
|
56
56
|
# fontcustom.yml is in the project_root
|
@@ -70,16 +70,16 @@ module Fontcustom
|
|
70
70
|
def load_config
|
71
71
|
@config_options = {}
|
72
72
|
if @cli_options[:config]
|
73
|
-
say_message :debug, "Using settings from `#{
|
73
|
+
say_message :debug, "Using settings from `#{relative_path(@cli_options[:config])}`." if @cli_options[:debug]
|
74
74
|
begin
|
75
75
|
config = YAML.load File.open(@cli_options[:config])
|
76
76
|
if config # empty YAML returns false
|
77
77
|
@config_options = symbolize_hash(config)
|
78
78
|
else
|
79
|
-
say_message :warn, "`#{
|
79
|
+
say_message :warn, "`#{relative_path(@cli_options[:config])}` was empty. Using defaults."
|
80
80
|
end
|
81
81
|
rescue Exception => e
|
82
|
-
raise Fontcustom::Error, "Error parsing `#{
|
82
|
+
raise Fontcustom::Error, "Error parsing `#{relative_path(@cli_options[:config])}`:\n#{e.message}"
|
83
83
|
end
|
84
84
|
end
|
85
85
|
end
|
@@ -98,7 +98,7 @@ module Fontcustom
|
|
98
98
|
raise Fontcustom::Error,
|
99
99
|
"CSS selector `#{@options[:css_selector]}` should contain the \"{{glyph}}\" placeholder."
|
100
100
|
end
|
101
|
-
@options[:css_selector] = @options[:css_selector].strip.gsub(/[
|
101
|
+
@options[:css_selector] = @options[:css_selector].strip.gsub(/[^\.#\{\}\w]/, "-")
|
102
102
|
end
|
103
103
|
|
104
104
|
def set_manifest_path
|
@@ -135,7 +135,7 @@ module Fontcustom
|
|
135
135
|
end
|
136
136
|
|
137
137
|
if Dir[File.join(@options[:input][:vectors], "*.svg")].empty?
|
138
|
-
raise Fontcustom::Error, "`#{
|
138
|
+
raise Fontcustom::Error, "`#{relative_path(@options[:input][:vectors])}` doesn't contain any SVGs."
|
139
139
|
end
|
140
140
|
end
|
141
141
|
|
@@ -151,7 +151,7 @@ module Fontcustom
|
|
151
151
|
@options[:output][key] = expand_path val
|
152
152
|
if File.exists?(val) && ! File.directory?(val)
|
153
153
|
raise Fontcustom::Error,
|
154
|
-
"Output `#{
|
154
|
+
"Output `#{relative_path(@options[:output][key])}` exists but isn't a directory. Check your options."
|
155
155
|
end
|
156
156
|
end
|
157
157
|
|
@@ -162,11 +162,11 @@ module Fontcustom
|
|
162
162
|
output = expand_path @options[:output]
|
163
163
|
if File.exists?(output) && ! File.directory?(output)
|
164
164
|
raise Fontcustom::Error,
|
165
|
-
"Output `#{
|
165
|
+
"Output `#{relative_path(output)}` exists but isn't a directory. Check your options."
|
166
166
|
end
|
167
167
|
else
|
168
168
|
output = File.join @options[:project_root], @options[:font_name]
|
169
|
-
say_message :debug, "Generated files will be saved to `#{
|
169
|
+
say_message :debug, "Generated files will be saved to `#{relative_path(output)}/`." if @options[:debug]
|
170
170
|
end
|
171
171
|
|
172
172
|
@options[:output] = {
|
@@ -207,7 +207,7 @@ module Fontcustom
|
|
207
207
|
template = File.expand_path File.join(@options[:input][:templates], template) unless template[0] == "/"
|
208
208
|
unless File.exists? template
|
209
209
|
raise Fontcustom::Error,
|
210
|
-
"Custom template `#{
|
210
|
+
"Custom template `#{relative_path(template)}` doesn't exist. Check your options."
|
211
211
|
end
|
212
212
|
template
|
213
213
|
end
|
@@ -217,10 +217,10 @@ module Fontcustom
|
|
217
217
|
def check_input(dir)
|
218
218
|
if ! File.exists? dir
|
219
219
|
raise Fontcustom::Error,
|
220
|
-
"Input `#{
|
220
|
+
"Input `#{relative_path(dir)}` doesn't exist. Check your options."
|
221
221
|
elsif ! File.directory? dir
|
222
222
|
raise Fontcustom::Error,
|
223
|
-
"Input `#{
|
223
|
+
"Input `#{relative_path(dir)}` isn't a directory. Check your options."
|
224
224
|
end
|
225
225
|
end
|
226
226
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# --------------------------------------------------------------------------- #
|
2
2
|
# Project Info
|
3
|
-
#
|
3
|
+
# Defaults shown. Learn more about these options by running
|
4
4
|
# `fontcustom help` or visiting <http://fontcustom.com>.
|
5
5
|
# --------------------------------------------------------------------------- #
|
6
6
|
|
@@ -15,20 +15,27 @@
|
|
15
15
|
|
16
16
|
|
17
17
|
# --------------------------------------------------------------------------- #
|
18
|
-
#
|
19
|
-
# Relative paths are expanded from PROJECT_ROOT (defaults to the directory
|
20
|
-
# where the fontcustom command is run). INPUT and OUTPUT can be strings or
|
21
|
-
# hashes or file types / names.
|
18
|
+
# Input Paths
|
22
19
|
# --------------------------------------------------------------------------- #
|
23
20
|
|
24
|
-
#
|
25
|
-
#manifest: tmp/fontcustom
|
21
|
+
#input: assets/fonts/fontcustom/source # as a string
|
26
22
|
|
27
|
-
#
|
23
|
+
# OR
|
24
|
+
|
25
|
+
#input: # as a hash
|
28
26
|
# vectors: app/assets/fonts/fontcustom/vectors # required
|
29
27
|
# templates: app/assets/fonts/fontcustom/templates
|
30
28
|
|
31
|
-
|
29
|
+
|
30
|
+
# --------------------------------------------------------------------------- #
|
31
|
+
# Output Paths
|
32
|
+
# --------------------------------------------------------------------------- #
|
33
|
+
|
34
|
+
#output: assets/fonts/fontcustom # as a string
|
35
|
+
|
36
|
+
# OR
|
37
|
+
|
38
|
+
#output: # as a hash
|
32
39
|
# fonts: app/assets/fonts # required
|
33
40
|
# css: app/assets/stylesheets
|
34
41
|
# preview: app/views/styleguide
|
@@ -37,10 +44,12 @@
|
|
37
44
|
|
38
45
|
# --------------------------------------------------------------------------- #
|
39
46
|
# Templates
|
40
|
-
# Included in Font Custom:
|
41
|
-
# preview, css, scss, scss-rails
|
47
|
+
# Included in Font Custom: preview, css, scss, scss-rails
|
42
48
|
# Custom templates should be saved in the INPUT[:templates] directory and
|
43
|
-
# referenced by their
|
49
|
+
# referenced by their baserame.
|
44
50
|
# --------------------------------------------------------------------------- #
|
45
51
|
|
46
|
-
#templates:
|
52
|
+
#templates:
|
53
|
+
# - scss
|
54
|
+
# - preview
|
55
|
+
# - my-custom-template.yml
|
data/lib/fontcustom/utility.rb
CHANGED
@@ -70,7 +70,7 @@ module Fontcustom
|
|
70
70
|
end
|
71
71
|
|
72
72
|
# TODO Is this robust enough?
|
73
|
-
def
|
73
|
+
def relative_path(path)
|
74
74
|
path = path.sub(_options[:project_root], "")
|
75
75
|
path = path[1..-1] if path[0] == "/"
|
76
76
|
path = "." if path.empty?
|
@@ -84,7 +84,7 @@ module Fontcustom
|
|
84
84
|
def write_file(file, content = "", message = nil, message_body = nil)
|
85
85
|
File.open(file, "w") { |f| f.write(content) }
|
86
86
|
if message
|
87
|
-
body = message_body ||
|
87
|
+
body = message_body || relative_path(file)
|
88
88
|
say_message message, body
|
89
89
|
end
|
90
90
|
end
|
@@ -95,7 +95,7 @@ module Fontcustom
|
|
95
95
|
JSON.parse(json, :symbolize_names => true)
|
96
96
|
rescue JSON::ParserError
|
97
97
|
raise Fontcustom::Error,
|
98
|
-
"Couldn't parse `#{
|
98
|
+
"Couldn't parse `#{relative_path file}`. Fix the invalid "\
|
99
99
|
"JSON or delete the file to start from scratch."
|
100
100
|
end
|
101
101
|
end
|
@@ -133,8 +133,13 @@ module Fontcustom
|
|
133
133
|
|
134
134
|
def say_changed(status, changed)
|
135
135
|
return if _options[:quiet]
|
136
|
-
message = changed.map { |file|
|
137
|
-
say_status status, message.join(
|
136
|
+
message = changed.map { |file| relative_path(file) }
|
137
|
+
say_status status, message.join(line_break)
|
138
|
+
end
|
139
|
+
|
140
|
+
# magic number for Thor say_status line breaks
|
141
|
+
def line_break
|
142
|
+
"\n#{" " * 14}"
|
138
143
|
end
|
139
144
|
|
140
145
|
private
|
data/lib/fontcustom/version.rb
CHANGED
@@ -118,16 +118,16 @@ describe Fontcustom::Utility do
|
|
118
118
|
end
|
119
119
|
end
|
120
120
|
|
121
|
-
context "#
|
121
|
+
context "#relative_path" do
|
122
122
|
it "should trim project root from paths" do
|
123
123
|
gen = Generator.new
|
124
|
-
path = gen.
|
124
|
+
path = gen.relative_path fixture "test/path"
|
125
125
|
path.should == "test/path"
|
126
126
|
end
|
127
127
|
|
128
128
|
it "should trim beginning slash" do
|
129
129
|
gen = Generator.new
|
130
|
-
path = gen.
|
130
|
+
path = gen.relative_path "/test/path"
|
131
131
|
path.should == "test/path"
|
132
132
|
end
|
133
133
|
end
|
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: 1.3.0.
|
4
|
+
version: 1.3.0.beta3
|
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: 2013-
|
12
|
+
date: 2013-12-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|