fontcustom 1.1.0.pre2 → 1.1.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.
@@ -21,13 +21,12 @@ module Fontcustom
21
21
 
22
22
  def get_data
23
23
  if File.exists? opts.data_cache
24
- @data = JSON.parse(File.read(opts.data_cache), :symbolize_names => true)
24
+ @data = JSON.parse File.read(opts.data_cache), :symbolize_names => true
25
25
  else
26
- raise Fontcustom::Error, "#{relative_to_root(opts.data_cache)} is required to generate templates, but I couldn't find it."
26
+ raise Fontcustom::Error, "`#{relative_to_root(opts.data_cache)}` is missing. This file is required to generate templates."
27
27
  end
28
- rescue JSON::ParserError
29
- # Catches both empty and and malformed files
30
- raise Fontcustom::Error, "#{relative_to_root(opts.data_cache)} is empty or corrupted. Try deleting the file and running Fontcustom::Generator::Font again to regenerate the data file. Old generated files may need to be deleted manually."
28
+ rescue
29
+ raise Fontcustom::Error, "Couldn't parse `#{relative_to_root(opts.data_cache)}`. Delete it to start from scratch. Any previously generated files will need to be deleted manually."
31
30
  end
32
31
 
33
32
  def reset_output
@@ -51,33 +50,36 @@ module Fontcustom
51
50
  fonts = Pathname.new opts.output[:fonts]
52
51
  css = Pathname.new opts.output[:css]
53
52
  preview = Pathname.new opts.output[:preview]
54
- @data[:paths][:css_to_fonts] = File.join fonts.relative_path_from(css).to_s, name
55
- @data[:paths][:preview_to_fonts] = File.join fonts.relative_path_from(preview).to_s, name
56
- @data[:paths][:preprocessor_to_fonts] = if opts.preprocessor_path != ""
57
- File.join opts.preprocessor_path, name
58
- else
59
- @data[:paths][:css_to_fonts]
60
- end
53
+ @font_path = File.join fonts.relative_path_from(css).to_s, name
54
+ @font_path_alt = opts.preprocessor_path.nil? ? @font_path : File.join(opts.preprocessor_path, name)
55
+ @font_path_preview = File.join fonts.relative_path_from(preview).to_s, name
61
56
  end
62
57
 
63
58
  def generate
64
59
  @glyphs = @data[:glyphs]
65
- @font_path = @data[:paths][:css_to_fonts]
66
- @font_path_pre = @data[:paths][:preprocessor_to_fonts]
60
+ created = []
61
+ packaged = %w|fontcustom-bootstrap-ie7.css fontcustom.css _fontcustom-bootstrap-ie7.scss _fontcustom-rails.scss
62
+ fontcustom-bootstrap.css fontcustom-preview.html _fontcustom-bootstrap.scss _fontcustom.scss|
63
+ css_exts = %w|.css .scss .sass .less .stylus|
67
64
  begin
68
- created = []
69
65
  opts.templates.each do |source|
70
66
  name = File.basename source
71
67
  ext = File.extname source
72
- target = if opts.output.keys.include? name
73
- File.join opts.output[name], name
74
- elsif %w|.css .scss .sass .less .stylus|.include? ext
75
- File.join opts.output[:css], name
76
- elsif name == "fontcustom-preview.html"
77
- File.join opts.output[:preview], name
78
- else
79
- File.join opts.output[:fonts], name
80
- end
68
+ target = name.dup
69
+
70
+ if packaged.include?(name) && opts.font_name != DEFAULT_OPTIONS[:font_name]
71
+ target.sub! DEFAULT_OPTIONS[:font_name], opts.font_name
72
+ end
73
+
74
+ target = if opts.output.keys.include? name.to_sym
75
+ File.join opts.output[name.to_sym], target
76
+ elsif css_exts.include? ext
77
+ File.join opts.output[:css], target
78
+ elsif name == "fontcustom-preview.html"
79
+ File.join opts.output[:preview], target
80
+ else
81
+ File.join opts.output[:fonts], target
82
+ end
81
83
 
82
84
  template source, target, :verbose => false
83
85
  created << target
@@ -2,18 +2,17 @@ require "yaml"
2
2
  require "thor/shell"
3
3
  require "thor/shell/basic"
4
4
  require "thor/shell/color"
5
- require "thor/core_ext/hash_with_indifferent_access"
6
5
  require "fontcustom/util"
7
6
 
8
7
  module Fontcustom
9
8
  class Options
10
9
  include Util
11
10
 
12
- attr_reader :project_root, :input, :output, :config, :data_cache, :templates,
13
- :font_name, :file_hash, :css_prefix, :preprocessor_path, :skip_first, :debug, :verbose
11
+ attr_reader :project_root, :input, :output, :config, :templates, :font_name, :css_prefix, :data_cache, :preprocessor_path, :no_hash, :debug, :quiet, :skip_first
14
12
 
15
13
  def initialize(options = {})
16
14
  check_fontforge
15
+ options = symbolize_hash(options)
17
16
 
18
17
  # Overwrite example defaults (used in Thor's help) with real defaults, if unchanged
19
18
  EXAMPLE_OPTIONS.keys.each do |key|
@@ -39,7 +38,7 @@ module Fontcustom
39
38
 
40
39
  def set_config_path
41
40
  @config = if @cli_options[:config]
42
- path = File.expand_path File.join(@cli_options[:project_root], @cli_options[:config])
41
+ path = expand_path @cli_options[:config]
43
42
 
44
43
  # :config is the path to fontcustom.yml
45
44
  if File.exists?(path) && ! File.directory?(path)
@@ -50,7 +49,7 @@ module Fontcustom
50
49
  File.join path, "fontcustom.yml"
51
50
 
52
51
  else
53
- raise Fontcustom::Error, "The configuration file was not found. Check #{relative_to_root(path)} and try again."
52
+ raise Fontcustom::Error, "The configuration file wasn't found. Check `#{relative_to_root(path)}` and try again."
54
53
  end
55
54
  else
56
55
  # fontcustom.yml is in the project_root
@@ -69,12 +68,20 @@ module Fontcustom
69
68
 
70
69
  def load_config
71
70
  @config_options = {}
72
- return unless @config
73
- begin
74
- config = YAML.load File.open(@config)
75
- @config_options = config if config # empty file returns false
76
- rescue Exception => e
77
- raise Fontcustom::Error, "The configuration file failed to load. Message: #{e.message}"
71
+ if @config
72
+ say_message :status, "Loading configuration file at `#{relative_to_root(@config)}`."
73
+ begin
74
+ config = YAML.load File.open(@config)
75
+ if config # empty YAML returns false
76
+ @config_options = symbolize_hash(config)
77
+ else
78
+ say_message :status, "Configuration file was empty. Using defaults."
79
+ end
80
+ rescue Exception => e
81
+ raise Fontcustom::Error, "The configuration file failed to load. Message: #{e.message}"
82
+ end
83
+ else
84
+ say_message :status, "No configuration file set. Generate one with `fontcustom config` to save your settings."
78
85
  end
79
86
  end
80
87
 
@@ -83,73 +90,69 @@ module Fontcustom
83
90
 
84
91
  options = DEFAULT_OPTIONS.dup
85
92
  options = options.merge @config_options
86
- options = options.merge @cli_options
93
+ options = options.merge symbolize_hash(@cli_options)
87
94
  remove_instance_variable :@config_options
88
95
  remove_instance_variable :@cli_options
89
96
 
90
97
  # :config is excluded since it's already been set
91
- keys = %w|project_root input output data_cache templates font_name file_hash css_prefix preprocessor_path skip_first debug verbose|
92
- keys.each { |key| instance_variable_set("@#{key}", options[key]) }
98
+ keys = %w|project_root input output data_cache templates font_name css_prefix preprocessor_path skip_first no_hash debug quiet|
99
+ keys.each { |key| instance_variable_set("@#{key}", options[key.to_sym]) }
93
100
 
94
- @font_name = @font_name.strip.gsub(/\W/, '-')
101
+ @font_name = @font_name.strip.gsub(/\W/, "-")
95
102
  end
96
103
 
97
104
  def set_data_path
98
105
  @data_cache = if ! @data_cache.nil?
99
- File.expand_path File.join(@project_root, @data_cache)
106
+ expand_path @data_cache
100
107
  elsif @config
101
- File.join File.dirname(@config), '.fontcustom-data'
108
+ File.join File.dirname(@config), ".fontcustom-data"
102
109
  else
103
- File.join @project_root, '.fontcustom-data'
110
+ File.join @project_root, ".fontcustom-data"
104
111
  end
105
112
  end
106
113
 
107
114
  def set_input_paths
108
115
  if @input.is_a? Hash
109
- @input = Thor::CoreExt::HashWithIndifferentAccess.new @input
110
-
111
- if @input.has_key? "vectors"
112
- @input[:vectors] = File.expand_path File.join(@project_root, @input[:vectors])
113
- unless File.directory? input[:vectors]
114
- raise Fontcustom::Error, "INPUT[\"vectors\"] should be a directory. Check #{relative_to_root(input[:vectors])} and try again."
116
+ @input = symbolize_hash(@input)
117
+ if @input.has_key? :vectors
118
+ @input[:vectors] = expand_path @input[:vectors]
119
+ unless File.directory? @input[:vectors]
120
+ raise Fontcustom::Error, "INPUT[:vectors] should be a directory. Check `#{relative_to_root(@input[:vectors])}` and try again."
115
121
  end
116
122
  else
117
- raise Fontcustom::Error, "INPUT (as a hash) should contain a \"vectors\" key."
123
+ raise Fontcustom::Error, "INPUT (as a hash) should contain a :vectors key."
118
124
  end
119
125
 
120
- if @input.has_key? "templates"
121
- @input[:templates] = File.expand_path File.join(@project_root, @input[:templates])
126
+ if @input.has_key? :templates
127
+ @input[:templates] = expand_path @input[:templates]
122
128
  unless File.directory? @input[:templates]
123
- raise Fontcustom::Error, "INPUT[\"templates\"] should be a directory. Check #{relative_to_root(input[:templates])} and try again."
129
+ raise Fontcustom::Error, "INPUT[:templates] should be a directory. Check `#{relative_to_root(@input[:templates])}` and try again."
124
130
  end
125
131
  else
126
132
  @input[:templates] = @input[:vectors]
127
133
  end
128
- elsif @input.is_a? String
129
- input = File.expand_path File.join(@project_root, @input)
134
+ else
135
+ input = @input ? expand_path(@input) : @project_root
130
136
  unless File.directory? input
131
- raise Fontcustom::Error, "INPUT (as a string) should be a directory. Check #{relative_to_root(input)} and try again."
137
+ raise Fontcustom::Error, "INPUT (as a string) should be a directory. Check `#{relative_to_root(input)}` and try again."
132
138
  end
133
- @input = Thor::CoreExt::HashWithIndifferentAccess.new({
134
- :vectors => input,
135
- :templates => input
136
- })
139
+ @input = { :vectors => input, :templates => input }
137
140
  end
138
141
 
139
142
  if Dir[File.join(@input[:vectors], "*.{svg,eps}")].empty?
140
- raise Fontcustom::Error, "#{relative_to_root(@input[:vectors])} doesn't contain any vectors (*.svg or *.eps files)."
143
+ raise Fontcustom::Error, "`#{relative_to_root(@input[:vectors])}` doesn't contain any vectors (*.svg or *.eps files)."
141
144
  end
142
145
  end
143
146
 
144
147
  def set_output_paths
145
148
  if @output.is_a? Hash
146
- @output = Thor::CoreExt::HashWithIndifferentAccess.new @output
147
- raise Fontcustom::Error, "OUTPUT (as a hash) should contain a \"fonts\" key." unless @output.has_key? "fonts"
149
+ @output = symbolize_hash(@output)
150
+ raise Fontcustom::Error, "OUTPUT (as a hash) should contain a :fonts key." unless @output.has_key? :fonts
148
151
 
149
152
  @output.each do |key, val|
150
- @output[key] = File.expand_path File.join(@project_root, val)
153
+ @output[key] = expand_path val
151
154
  if File.exists?(val) && ! File.directory?(val)
152
- raise Fontcustom::Error, "OUTPUT[\"#{key}\"] should be a directory, not a file. Check #{relative_to_root(val)} and try again."
155
+ raise Fontcustom::Error, "OUTPUT[:#{key.to_s}] should be a directory, not a file. Check `#{relative_to_root(val)}` and try again."
153
156
  end
154
157
  end
155
158
 
@@ -157,20 +160,20 @@ module Fontcustom
157
160
  @output[:preview] ||= @output[:fonts]
158
161
  else
159
162
  if @output.is_a? String
160
- output = File.expand_path File.join(@project_root, @output)
163
+ output = expand_path @output
161
164
  if File.exists?(output) && ! File.directory?(output)
162
- raise Fontcustom::Error, "OUTPUT should be a directory, not a file. Check #{relative_to_root(output)} and try again."
165
+ raise Fontcustom::Error, "OUTPUT should be a directory, not a file. Check `#{relative_to_root(output)}` and try again."
163
166
  end
164
167
  else
165
168
  output = File.join @project_root, @font_name
166
- say_message :status, "All generated files will be added into `#{relative_to_root(output)}/` by default."
169
+ say_message :status, "All generated files will be saved to `#{relative_to_root(output)}/`."
167
170
  end
168
171
 
169
- @output = Thor::CoreExt::HashWithIndifferentAccess.new({
172
+ @output = {
170
173
  :fonts => output,
171
174
  :css => output,
172
175
  :preview => output
173
- })
176
+ }
174
177
  end
175
178
  end
176
179
 
@@ -201,9 +204,9 @@ module Fontcustom
201
204
  when "bootstrap-ie7-scss"
202
205
  File.join template_path, "_fontcustom-bootstrap-ie7.scss"
203
206
  else
204
- path = File.expand_path File.join(@input[:templates], template)
205
- raise Fontcustom::Error, "The custom template at #{relative_to_root(path)} does not exist." unless File.exists? path
206
- path
207
+ template = File.expand_path File.join(@input[:templates], template) unless template[0] == "/"
208
+ raise Fontcustom::Error, "The custom template at `#{relative_to_root(template)}` does not exist." unless File.exists? template
209
+ template
207
210
  end
208
211
  end
209
212
  end
@@ -9,7 +9,7 @@ try:
9
9
  import argparse
10
10
  parser = argparse.ArgumentParser(description='Convert a directory of svg and eps files into a unified font file.')
11
11
  parser.add_argument('dir', metavar='directory', type=unicode, nargs=2, help='directory of vector files')
12
- parser.add_argument('--name', metavar='fontname', type=unicode, nargs='?', default='fontcustom', help='reference name of the font (no spaces)')
12
+ parser.add_argument('--name', metavar='fontname', type=unicode, nargs='?', help='reference name of the font (no spaces)')
13
13
  parser.add_argument('--nohash', '-n', action='store_true', help='disable hash fingerprinting of font files')
14
14
  parser.add_argument('--debug', '-d', action='store_true', help='display debug messages')
15
15
  args = parser.parse_args()
@@ -19,7 +19,7 @@ except ImportError:
19
19
  # Older Pythons don't have argparse, so we use optparse instead
20
20
  import optparse
21
21
  parser = optparse.OptionParser(description='Convert a directory of svg and eps files into a unified font file.')
22
- parser.add_option('--name', metavar='fontname', type='string', nargs='?', default='fontcustom', help='reference name of the font (no spaces)')
22
+ parser.add_option('--name', metavar='fontname', type='string', nargs='?', help='reference name of the font (no spaces)')
23
23
  parser.add_option('--nohash', '-n', action='store_true', help='disable hash fingerprinting of font files')
24
24
  parser.add_argument('--debug', '-d', action='store_true', help='display debug messages')
25
25
  (args, posargs) = parser.parse_args()
@@ -5,11 +5,11 @@
5
5
 
6
6
  @font-face {
7
7
  font-family: "<%= @opts.font_name %>";
8
- src: url("<%= @font_path_pre %>.eot");
9
- src: url("<%= @font_path_pre %>.eot?#iefix") format("embedded-opentype"),
10
- url("<%= @font_path_pre %>.woff") format("woff"),
11
- url("<%= @font_path_pre %>.ttf") format("truetype"),
12
- url("<%= @font_path_pre %>.svg#<%= @opts.font_name %>") format("svg");
8
+ src: url("<%= @font_path_alt %>.eot");
9
+ src: url("<%= @font_path_alt %>.eot?#iefix") format("embedded-opentype"),
10
+ url("<%= @font_path_alt %>.woff") format("woff"),
11
+ url("<%= @font_path_alt %>.ttf") format("truetype"),
12
+ url("<%= @font_path_alt %>.svg#<%= @opts.font_name %>") format("svg");
13
13
  font-weight: normal;
14
14
  font-style: normal;
15
15
  }
@@ -4,11 +4,11 @@
4
4
 
5
5
  @font-face {
6
6
  font-family: "<%= @opts.font_name %>";
7
- src: font-url("<%= @font_path_pre %>.eot");
8
- src: font-url("<%= @font_path_pre %>.eot?#iefix") format("embedded-opentype"),
9
- font-url("<%= @font_path_pre %>.woff") format("woff"),
10
- font-url("<%= @font_path_pre %>.ttf") format("truetype"),
11
- font-url("<%= @font_path_pre %>.svg#<%= @opts.font_name %>") format("svg");
7
+ src: font-url("<%= @font_path_alt %>.eot");
8
+ src: font-url("<%= @font_path_alt %>.eot?#iefix") format("embedded-opentype"),
9
+ font-url("<%= @font_path_alt %>.woff") format("woff"),
10
+ font-url("<%= @font_path_alt %>.ttf") format("truetype"),
11
+ font-url("<%= @font_path_alt %>.svg#<%= @opts.font_name %>") format("svg");
12
12
  font-weight: normal;
13
13
  font-style: normal;
14
14
  }
@@ -4,15 +4,18 @@
4
4
 
5
5
  @font-face {
6
6
  font-family: "<%= @opts.font_name %>";
7
- src: url("<%= @font_path_pre %>.eot");
8
- src: url("<%= @font_path_pre %>.eot?#iefix") format("embedded-opentype"),
9
- url("<%= @font_path_pre %>.woff") format("woff"),
10
- url("<%= @font_path_pre %>.ttf") format("truetype"),
11
- url("<%= @font_path_pre %>.svg#<%= @opts.font_name %>") format("svg");
7
+ src: url("<%= @font_path_alt %>.eot");
8
+ src: url("<%= @font_path_alt %>.eot?#iefix") format("embedded-opentype"),
9
+ url("<%= @font_path_alt %>.woff") format("woff"),
10
+ url("<%= @font_path_alt %>.ttf") format("truetype"),
11
+ url("<%= @font_path_alt %>.svg#<%= @opts.font_name %>") format("svg");
12
12
  font-weight: normal;
13
13
  font-style: normal;
14
14
  }
15
15
 
16
+ [data-icon]:before { content: attr(data-icon); }
17
+
18
+ [data-icon]:before,
16
19
  <%= @glyphs.map {|name| ".#{@opts.css_prefix + name}:before"}.join(",\n") %> {
17
20
  font-family: "<%= @opts.font_name %>";
18
21
  font-style: normal;
@@ -1,4 +1,4 @@
1
- /*
1
+ /*
2
2
  Icon Font: <%= @opts.font_name %>
3
3
  Bootstrap IE7 Enabler
4
4
  */
@@ -1,4 +1,4 @@
1
- /*
1
+ /*
2
2
  Icon Font: <%= @opts.font_name %>
3
3
  Bootstrap Override
4
4
  */
@@ -20,28 +20,39 @@
20
20
  font: 16px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif;
21
21
  }
22
22
 
23
- a,
23
+ a,
24
24
  a:visited {
25
25
  color: #888;
26
26
  text-decoration: underline;
27
27
  }
28
- a:hover,
28
+ a:hover,
29
29
  a:focus { color: #000; }
30
30
 
31
- h1 {
31
+ header {
32
32
  border-bottom: 2px solid #ddd;
33
+ margin-bottom: 20px;
34
+ overflow: hidden;
35
+ padding: 20px 0;
36
+ }
37
+
38
+ header h1 {
33
39
  color: #888;
40
+ float: left;
34
41
  font-size: 36px;
35
42
  font-weight: 300;
36
- margin-bottom: 20px;
37
- padding: 20px 0;
43
+ }
44
+
45
+ header a {
46
+ float: right;
47
+ font-size: 14px;
38
48
  }
39
49
 
40
50
  .container {
41
51
  margin: 0 auto;
42
- min-width: 880px;
52
+ max-width: 1200px;
53
+ min-width: 960px;
43
54
  padding: 0 40px;
44
- width: 80%;
55
+ width: 90%;
45
56
  }
46
57
 
47
58
  .glyph {
@@ -50,20 +61,41 @@
50
61
  margin-bottom: 20px;
51
62
  }
52
63
 
53
- .preview-glyphs { vertical-align: bottom; }
64
+ .preview-glyphs { vertical-align: bottom; }
54
65
 
55
- .preview-scale {
66
+ .preview-scale {
56
67
  color: #888;
57
- font-size: 12px;
68
+ font-size: 12px;
58
69
  margin-top: 5px;
59
70
  }
60
71
 
61
72
  .step {
62
73
  display: inline-block;
63
74
  line-height: 1;
75
+ position: relative;
64
76
  width: 10%;
65
77
  }
66
78
 
79
+ .step .letters,
80
+ .step i {
81
+ -webkit-transition: opacity .3s;
82
+ -moz-transition: opacity .3s;
83
+ -ms-transition: opacity .3s;
84
+ -o-transition: opacity .3s;
85
+ transition: opacity .3s;
86
+ }
87
+
88
+ .step:hover .letters { opacity: 1; }
89
+ .step:hover i { opacity: .3; }
90
+
91
+ .letters {
92
+ opacity: .3;
93
+ position: absolute;
94
+ }
95
+
96
+ .characters-off .letters { display: none; }
97
+ .characters-off .step:hover i { opacity: 1; }
98
+
67
99
  <% scale.each do |n| %>
68
100
  .size-<%= n %> { font-size: <%= n %>px; }
69
101
  <% end %>
@@ -81,7 +113,7 @@
81
113
 
82
114
  .usage .class { width: 250px; }
83
115
 
84
- .footer {
116
+ footer {
85
117
  color: #888;
86
118
  font-size: 12px;
87
119
  padding: 20px 0;
@@ -91,15 +123,18 @@
91
123
 
92
124
  @font-face {
93
125
  font-family: "<%= @opts.font_name %>";
94
- src: url("<%= @data[:paths][:preview_to_fonts] %>.eot");
95
- src: url("<%= @data[:paths][:preview_to_fonts] %>.eot?#iefix") format("embedded-opentype"),
96
- url("<%= @data[:paths][:preview_to_fonts] %>.woff") format("woff"),
97
- url("<%= @data[:paths][:preview_to_fonts] %>.ttf") format("truetype"),
98
- url("<%= @data[:paths][:preview_to_fonts] %>.svg#<%= @opts.font_name %>") format("svg");
126
+ src: url("<%= @font_path_preview %>.eot");
127
+ src: url("<%= @font_path_preview %>.eot?#iefix") format("embedded-opentype"),
128
+ url("<%= @font_path_preview %>.woff") format("woff"),
129
+ url("<%= @font_path_preview %>.ttf") format("truetype"),
130
+ url("<%= @font_path_preview %>.svg#<%= @opts.font_name %>") format("svg");
99
131
  font-weight: normal;
100
132
  font-style: normal;
101
133
  }
102
134
 
135
+ [data-icon]:before { content: attr(data-icon); }
136
+
137
+ [data-icon]:before,
103
138
  <%= @glyphs.map {|name| ".#{@opts.css_prefix + name}:before"}.join(",\n") %> {
104
139
  font-family: "<%= @opts.font_name %>";
105
140
  font-style: normal;
@@ -116,19 +151,29 @@
116
151
  </style>
117
152
 
118
153
  <!--[if lte IE 8]><script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
154
+
155
+ <script>
156
+ function toggleCharacters() {
157
+ var body = document.getElementsByTagName('body')[0];
158
+ body.className = body.className === 'characters-off' ? '' : 'characters-off';
159
+ }
160
+ </script>
119
161
  </head>
120
162
 
121
163
  <body>
122
- <div class="container">
123
- <h1><%= @opts.font_name %> contains <%= @glyphs.length %> glyphs:</h1>
164
+ <div id="page" class="container">
165
+ <header>
166
+ <h1><%= @opts.font_name %> contains <%= @glyphs.length %> glyphs:</h1>
167
+ <a onclick="toggleCharacters(); return false;" href="#">Toggle Preview Characters</a>
168
+ </header>
124
169
 
125
170
  <% @glyphs.each_with_index do |name, index| %>
126
171
  <div class="glyph">
127
172
  <div class="preview-glyphs">
128
- <% scale.each do |n| %><i class="step <%= @opts.css_prefix + name %> size-<%= n %>"></i><% end %>
173
+ <% scale.each do |n| %><span class="step size-<%= n %>"><span class="letters">Pp</span><i class="<%= @opts.css_prefix + name %>"></i></span><% end %>
129
174
  </div>
130
175
  <div class="preview-scale">
131
- <% scale.each do |n| %><span class="step"><%= n %></span><% end %>
176
+ <% scale.each do |n| %><span class="step"><%= n %></span><% end %>
132
177
  </div>
133
178
  <div class="usage">
134
179
  <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".<%= @opts.css_prefix + name %>" />
@@ -137,9 +182,9 @@
137
182
  </div>
138
183
  <% end %>
139
184
 
140
- <div class="footer">
185
+ <footer>
141
186
  Made with love using <a href="http://fontcustom.com">Font Custom</a>.
142
- </div>
187
+ </footer>
143
188
  </div>
144
189
  </body>
145
190
  </html>