graphite-sass 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +15 -0
- data/lib/Graphite.rb +173 -0
- data/stylesheets/Graphite.scss +165 -0
- metadata +92 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 585c7020278533126d93285d965e63bd3085feaf
|
4
|
+
data.tar.gz: e44e791882c7a17221b5b033bf6d4b4d48dbeb7b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 08104a1f32b485ee103002bdeb0cd4aafe74e8b0fefd3590bc62e85120c9059835babe48cad2b2d6c0c2eac3e7de8377bfbed90539ffe1f24eac9cc80e9d5f69
|
7
|
+
data.tar.gz: 86ea08fcab288c367338fe149ffe031e64412bd74bf99ff815e0ae382bec55a7326cd046f01b0c72131f2a77dc1b817280e50f63708d979bce67ec8fc6e153ad
|
data/README.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# Graphite [![Gem Version](https://badge.fury.io/rb/Graphite.svg)](http://badge.fury.io/rb/Graphite)
|
2
|
+
|
3
|
+
Graphite imports a folder of fonts and automagically outputs font-face directives for each font into your stylesheet.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
1. `gem install Graphite`
|
8
|
+
2. Add `require "graphite"` to your `config.rb`
|
9
|
+
3. Import into your stylesheet with `@import "graphite";`
|
10
|
+
|
11
|
+
## Documentation
|
12
|
+
|
13
|
+
#### File naming convention
|
14
|
+
|
15
|
+
In order for Graphite to successfully import your fonts, please follow this convention for naming your font files: `name-weightnum-style.extension`
|
data/lib/Graphite.rb
ADDED
@@ -0,0 +1,173 @@
|
|
1
|
+
require 'compass'
|
2
|
+
require 'sassy_hash'
|
3
|
+
|
4
|
+
extension_path = File.expand_path(File.join(File.dirname(__FILE__), ".."))
|
5
|
+
Compass::Frameworks.register('graphite', :path => extension_path)
|
6
|
+
|
7
|
+
module Graphite
|
8
|
+
VERSION = "0.0.1"
|
9
|
+
DATE = "2014-06-24"
|
10
|
+
end
|
11
|
+
|
12
|
+
# Graphite : import fonts from font_dir into map
|
13
|
+
# ----------------------------------------------------------------------------------------------------
|
14
|
+
# @param font_dir [string] : path to top-level font directory
|
15
|
+
# @param legacy_ie [bool] : support legacy versions of ie
|
16
|
+
# ----------------------------------------------------------------------------------------------------
|
17
|
+
# @return map of fonts, variable for each font
|
18
|
+
|
19
|
+
module Sass::Script::Functions
|
20
|
+
def graphite(font_dir, legacy_ie = false)
|
21
|
+
|
22
|
+
def opts(value)
|
23
|
+
value.options = options
|
24
|
+
value
|
25
|
+
end
|
26
|
+
|
27
|
+
# Set Sass variable to environment
|
28
|
+
def set_sass_var(literal, name = literal)
|
29
|
+
environment.global_env.set_var("#{name}", Sass::Script::Value::String.new(literal))
|
30
|
+
end
|
31
|
+
|
32
|
+
# Get weights and styles for passed font
|
33
|
+
def font_has_weights?(font)
|
34
|
+
# Keep hash of weights found
|
35
|
+
weights = {}
|
36
|
+
# Valid weights
|
37
|
+
valid_weights = ["100", "200", "300", "400", "500", "600", "700", "800", "900"]
|
38
|
+
# valid styles
|
39
|
+
valid_styles = ["normal", "italic"]
|
40
|
+
# Get weights for font
|
41
|
+
valid_weights.each do |weight|
|
42
|
+
# Check filename for weight
|
43
|
+
if font.include?(weight)
|
44
|
+
# Get styles for weight
|
45
|
+
styles = []
|
46
|
+
# Check filename for style
|
47
|
+
valid_styles.each do |style|
|
48
|
+
if font.include?(style)
|
49
|
+
# Save to styles
|
50
|
+
styles << style
|
51
|
+
end
|
52
|
+
end
|
53
|
+
# Keep hash of each weight
|
54
|
+
w = {
|
55
|
+
weight => {
|
56
|
+
"styles" => styles
|
57
|
+
}
|
58
|
+
}
|
59
|
+
# Merge weight into weights hash
|
60
|
+
weights.merge!(w)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
# Return weights
|
64
|
+
return weights
|
65
|
+
end
|
66
|
+
|
67
|
+
# Add style to passed weight
|
68
|
+
def set_font_style(font, style)
|
69
|
+
font.merge!(style) do |k, old, new|
|
70
|
+
# Merge styles
|
71
|
+
if old.is_a?(Hash)
|
72
|
+
# Get key => value of old map
|
73
|
+
old.each do |key, value|
|
74
|
+
# Does new map have key?
|
75
|
+
if new.has_key?(key)
|
76
|
+
# Then concat values
|
77
|
+
new.each do |k, v|
|
78
|
+
value.concat(v)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Check if passed dir has fonts
|
87
|
+
def dir_has_fonts?(dir)
|
88
|
+
# Keep hash of all fonts found
|
89
|
+
fonts = {}
|
90
|
+
# Valid font extensions
|
91
|
+
valid_extensions = ["eot", "otf", "woff", "ttf", "svg"]
|
92
|
+
# Change dir to font_dir
|
93
|
+
Dir.chdir(dir) do
|
94
|
+
# Search each dir
|
95
|
+
Dir.glob("**/") do |d|
|
96
|
+
# Check if dir has fonts
|
97
|
+
Dir.chdir(d) do
|
98
|
+
path = d
|
99
|
+
# Clean up font name
|
100
|
+
family = d.delete("/")
|
101
|
+
# Get matched extensions
|
102
|
+
extensions = []
|
103
|
+
# Get matched weights and styles
|
104
|
+
variations = {}
|
105
|
+
# Check dir for matching extensions
|
106
|
+
valid_extensions.each do |ext|
|
107
|
+
Dir.glob("*.#{ext}") do |filename|
|
108
|
+
if filename.size > 0
|
109
|
+
# Check if filename has weights
|
110
|
+
w = font_has_weights?(filename.to_s)
|
111
|
+
# Merge weights and styles
|
112
|
+
set_font_style(variations, w)
|
113
|
+
# Save extensions that exist
|
114
|
+
if extensions.include?(ext) === false
|
115
|
+
extensions << ext
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
# Build out font hash
|
121
|
+
font = {
|
122
|
+
"#{family}" => {
|
123
|
+
"path" => path,
|
124
|
+
"extensions" => extensions,
|
125
|
+
"weights" => variations
|
126
|
+
}
|
127
|
+
}
|
128
|
+
# Merge into fonts hash
|
129
|
+
fonts = fonts.merge(font)
|
130
|
+
# Set Sass variable for font family
|
131
|
+
set_sass_var(family)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
# Return hash of all fonts
|
136
|
+
return fonts
|
137
|
+
end
|
138
|
+
|
139
|
+
# Assert types
|
140
|
+
assert_type font_dir, :String, :font_dir
|
141
|
+
|
142
|
+
# Define root path up to current working directory
|
143
|
+
root = Dir.pwd
|
144
|
+
|
145
|
+
# Clean up font_dir
|
146
|
+
font_dir = unquote(font_dir).to_s
|
147
|
+
|
148
|
+
# Define dir path
|
149
|
+
dir_path = root
|
150
|
+
dir_path += font_dir
|
151
|
+
|
152
|
+
# Normalize windows path
|
153
|
+
dir_path = Sass::Util.pathname(dir_path)
|
154
|
+
|
155
|
+
# Create Sass variable for font path
|
156
|
+
set_sass_var(font_dir, 'graphite_font_dir')
|
157
|
+
|
158
|
+
# Font naming convention : name-weight[-variant].extension
|
159
|
+
fonts = {
|
160
|
+
"legacy-ie" => legacy_ie,
|
161
|
+
}
|
162
|
+
|
163
|
+
# Get all fonts in dir
|
164
|
+
f = dir_has_fonts?(dir_path)
|
165
|
+
|
166
|
+
# Merge results into fonts
|
167
|
+
fonts = fonts.merge(f)
|
168
|
+
|
169
|
+
# Convert hash to map, return
|
170
|
+
Sass::Script::Value::Map.new(SassyHash[fonts])
|
171
|
+
end
|
172
|
+
declare :Graphite, [:font_dir]
|
173
|
+
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
// Filename seperator
|
2
|
+
// ----
|
3
|
+
$graphite_seperator: "-" !global;
|
4
|
+
|
5
|
+
// Prepend directory path
|
6
|
+
// ----
|
7
|
+
$graphite_chdir: ".." !global;
|
8
|
+
|
9
|
+
// Checks if item is map
|
10
|
+
// ----
|
11
|
+
// @param $n [literal] : item
|
12
|
+
// ----
|
13
|
+
// @return [bool]
|
14
|
+
|
15
|
+
@function is-map($n) {
|
16
|
+
@return type-of($n) == "map";
|
17
|
+
}
|
18
|
+
|
19
|
+
// Fetch value from key in map
|
20
|
+
// ----
|
21
|
+
// @dependence `map-fetche()`
|
22
|
+
// ----
|
23
|
+
// @param $i [map] : map
|
24
|
+
// @param $n [list] : keys
|
25
|
+
// ----
|
26
|
+
// @return fetched value | false
|
27
|
+
|
28
|
+
@function map-fetch($map, $keys) {
|
29
|
+
$key: nth($keys, 1);
|
30
|
+
$length: length($keys);
|
31
|
+
$value: map-get($map, $key);
|
32
|
+
|
33
|
+
// check if value equals null (meaning the @param was incorrect and the map doesn't exist)
|
34
|
+
@if $value == null {
|
35
|
+
@warn "Invalid arguments padded to function: `map-fetch(#{$map}, #{$keys})`";
|
36
|
+
@return false;
|
37
|
+
}
|
38
|
+
|
39
|
+
@else {
|
40
|
+
@if $length > 1 {
|
41
|
+
$rest: ();
|
42
|
+
|
43
|
+
@for $i from 2 through $length {
|
44
|
+
$rest: append($rest, nth($keys, $i))
|
45
|
+
}
|
46
|
+
|
47
|
+
@return map-fetch($value, $rest);
|
48
|
+
|
49
|
+
} @else {
|
50
|
+
@return $value;
|
51
|
+
}
|
52
|
+
}
|
53
|
+
}
|
54
|
+
|
55
|
+
// Import fonts from $dir
|
56
|
+
// ----
|
57
|
+
// @param $dir [string] : directory to import fonts
|
58
|
+
// @param $legacy-ie [bool] : support legacy ie
|
59
|
+
// ----
|
60
|
+
// @return $fonts [map] : imports fonts from $dir and creates
|
61
|
+
// a $var for each font family containing [string] name
|
62
|
+
|
63
|
+
@mixin graphite($dir, $legacy-ie: false) {
|
64
|
+
$graphite_fonts: graphite("#{$dir}", $legacy-ie) !global;
|
65
|
+
|
66
|
+
// Make sure it's a valid map before attempting the loop
|
67
|
+
@if is-map($graphite_fonts) {
|
68
|
+
// Start legacy with null value
|
69
|
+
$legacy-ie: null;
|
70
|
+
|
71
|
+
// Loop over each label => font and output a @font-face directive
|
72
|
+
@each $key, $value in $graphite_fonts {
|
73
|
+
|
74
|
+
// Support legacy IE?
|
75
|
+
@if $key == "legacy-ie" {
|
76
|
+
$legacy-ie: map-get($graphite_fonts, "legacy-ie");
|
77
|
+
}
|
78
|
+
|
79
|
+
@if is-map($value) {
|
80
|
+
// Font name
|
81
|
+
$name: $key;
|
82
|
+
// Path to top-level font directory
|
83
|
+
$path: $graphite_font_dir;
|
84
|
+
// Empty list of extensions
|
85
|
+
$extensions: ();
|
86
|
+
// Empty list of declared fonts
|
87
|
+
$history: ();
|
88
|
+
|
89
|
+
// Break down the font map
|
90
|
+
@each $k, $v in $value {
|
91
|
+
|
92
|
+
// Font directory string
|
93
|
+
@if $k == "path" {
|
94
|
+
// Define path to font directory
|
95
|
+
$path: $graphite_chdir + $path + "/" + $v;
|
96
|
+
}
|
97
|
+
|
98
|
+
// List of extensions found
|
99
|
+
@if $k == "extensions" {
|
100
|
+
// Get each extension
|
101
|
+
@each $ext in $v {
|
102
|
+
// Append ext to list
|
103
|
+
$extensions: append($extensions, $ext);
|
104
|
+
}
|
105
|
+
}
|
106
|
+
|
107
|
+
// Map of font weights
|
108
|
+
@if $k == "weights" {
|
109
|
+
$weights: map-fetch($graphite_fonts, $key $k);
|
110
|
+
|
111
|
+
// Iterate over each weight
|
112
|
+
@each $weight, $styles in $weights {
|
113
|
+
// Get list of styles for weight
|
114
|
+
$styles: map-fetch($weights, $weight "styles");
|
115
|
+
|
116
|
+
// Iterate over each style
|
117
|
+
@each $style in $styles {
|
118
|
+
// Contatenate vars to create filename
|
119
|
+
$filename: "#{$name + $graphite_seperator + $weight + $graphite_seperator + $style}";
|
120
|
+
|
121
|
+
// If filename has not already been declared
|
122
|
+
@if not index($history, "#{$filename}") {
|
123
|
+
// Add filename to history
|
124
|
+
$history: append($history, $filename, "comma");
|
125
|
+
|
126
|
+
@font-face {
|
127
|
+
// Empty list of valid extensions
|
128
|
+
$types: ();
|
129
|
+
|
130
|
+
// Define font family
|
131
|
+
font-family: "#{$name}";
|
132
|
+
|
133
|
+
// Output weight and style
|
134
|
+
font-weight: $weight;
|
135
|
+
font-style: $style;
|
136
|
+
|
137
|
+
// IE9
|
138
|
+
@if index($extensions, "eot") {
|
139
|
+
src: url("#{$path + $filename}.eot");
|
140
|
+
}
|
141
|
+
|
142
|
+
// Define value for each type
|
143
|
+
$ie: if(index($extensions, "eot") and $legacy-ie, url("#{$path + $filename}.eot?#iefix") format("embedded-opentype"), null);
|
144
|
+
$woff: if(index($extensions, "woff"), url("#{$path + $filename}.woff") format("woff"), null);
|
145
|
+
$ttf: if(index($extensions, "ttf"), url("#{$path + $filename}.ttf") format("truetype"), null);
|
146
|
+
$svg: if(index($extensions, "svg"), url("#{$path + $filename + '.svg#' + $name}") format("svg"), null);
|
147
|
+
|
148
|
+
// Append to types list if not null
|
149
|
+
$types: if($ie != null, append($types, #{$ie}, "comma"), $types);
|
150
|
+
$types: if($woff != null, append($types, #{$woff}, "comma"), $types);
|
151
|
+
$types: if($ttf != null, append($types, #{$ttf}, "comma"), $types);
|
152
|
+
$types: if($svg != null, append($types, #{$svg}, "comma"), $types);
|
153
|
+
|
154
|
+
// Output types
|
155
|
+
src: #{$types};
|
156
|
+
}
|
157
|
+
}
|
158
|
+
}
|
159
|
+
}
|
160
|
+
}
|
161
|
+
}
|
162
|
+
}
|
163
|
+
}
|
164
|
+
}
|
165
|
+
}
|
metadata
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: graphite-sass
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ezekiel Gabrielse
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-06-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sass
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.3.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.3.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: compass
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.12.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.12.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: sassy_hash
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.0.6
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.0.6
|
55
|
+
description: Graphite imports a folder of fonts and automagically outputs font-face
|
56
|
+
directives for each font into your stylesheet.
|
57
|
+
email:
|
58
|
+
- ezekg@yahoo.com
|
59
|
+
executables: []
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- README.md
|
64
|
+
- lib/Graphite.rb
|
65
|
+
- stylesheets/Graphite.scss
|
66
|
+
homepage: https://github.com/ezekg/Graphite/
|
67
|
+
licenses:
|
68
|
+
- MIT
|
69
|
+
metadata: {}
|
70
|
+
post_install_message:
|
71
|
+
rdoc_options: []
|
72
|
+
require_paths:
|
73
|
+
- lib
|
74
|
+
- stylesheets
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 1.3.6
|
85
|
+
requirements: []
|
86
|
+
rubyforge_project: graphite
|
87
|
+
rubygems_version: 2.2.2
|
88
|
+
signing_key:
|
89
|
+
specification_version: 4
|
90
|
+
summary: Graphite imports a folder of fonts and automagically outputs their font-face
|
91
|
+
directives.
|
92
|
+
test_files: []
|