webfontloader 1.3.0 → 1.3.1
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.
- data/CHANGELOG +5 -0
- data/Rakefile +2 -1
- data/lib/webfontloader.rb +1 -1
- data/spec/core/font_spec.js +9 -4
- data/spec/core/fontruler_spec.js +3 -10
- data/spec/core/fontwatcher_spec.js +22 -23
- data/spec/core/fontwatchrunner_spec.js +206 -231
- data/spec/deps.js +27 -0
- data/spec/google/lastresortwebkitfontwatchrunner_spec.js +47 -58
- data/spec/index.html +14 -25
- data/src/ascender/ascender_script.js +52 -45
- data/src/core/browserinfo.js +54 -47
- data/src/core/cssclassname.js +27 -22
- data/src/core/cssfontfamilyname.js +23 -17
- data/src/core/domhelper.js +209 -203
- data/src/core/eventdispatcher.js +111 -103
- data/src/core/font.js +110 -68
- data/src/core/fontmoduleloader.js +56 -13
- data/src/core/fontruler.js +52 -43
- data/src/core/fontvariationdescription.js +82 -76
- data/src/core/fontwatcher.js +93 -88
- data/src/core/fontwatchrunner.js +161 -161
- data/src/core/initialize.js +22 -15
- data/src/core/namespace.js +0 -29
- data/src/core/size.js +31 -25
- data/src/core/useragent.js +63 -48
- data/src/core/useragentparser.js +317 -306
- data/src/custom/customcss.js +31 -24
- data/src/fontdeck/fontdeck_script.js +46 -37
- data/src/google/fontapiparser.js +105 -97
- data/src/google/fontapiurlbuilder.js +46 -41
- data/src/google/googlefontapi.js +48 -32
- data/src/google/lastresortwebkitfontwatchrunner.js +80 -67
- data/src/modules.yml +6 -6
- data/src/monotype/monotype_script.js +47 -40
- data/src/typekit/typekit_script.js +41 -35
- data/tools/compiler/base.js +1548 -0
- data/tools/compiler/compiler.jar +0 -0
- data/webfontloader.gemspec +4 -2
- metadata +18 -16
data/src/core/fontruler.js
CHANGED
@@ -1,61 +1,70 @@
|
|
1
|
+
goog.provide('webfont.FontRuler');
|
2
|
+
|
3
|
+
goog.require('webfont.CssFontFamilyName');
|
4
|
+
goog.require('webfont.FontVariationDescription');
|
5
|
+
goog.require('webfont.Size');
|
6
|
+
|
1
7
|
/**
|
2
8
|
* An element that can be used to measure the metrics
|
3
9
|
* of a given font and string.
|
4
10
|
* @constructor
|
5
11
|
* @param {webfont.DomHelper} domHelper
|
6
|
-
* @param {Object.<string, function(Object): webfont.Size>} fontSizer
|
7
12
|
* @param {string} fontTestString
|
8
13
|
*/
|
9
|
-
webfont.FontRuler = function(domHelper,
|
14
|
+
webfont.FontRuler = function(domHelper, fontTestString) {
|
10
15
|
this.domHelper_ = domHelper;
|
11
|
-
this.fontSizer_ = fontSizer;
|
12
16
|
this.fontTestString_ = fontTestString;
|
13
17
|
this.nameHelper_ = new webfont.CssFontFamilyName();
|
14
18
|
this.fvd_ = new webfont.FontVariationDescription();
|
15
19
|
this.el_ = this.domHelper_.createElement('span', {}, this.fontTestString_);
|
16
20
|
};
|
17
21
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
*/
|
22
|
-
webfont.FontRuler.prototype.setFont = function(fontFamily, opt_fontDescription) {
|
23
|
-
var styleString = this.computeStyleString_(fontFamily, opt_fontDescription);
|
24
|
-
this.domHelper_.setStyle(this.el_, styleString);
|
25
|
-
};
|
22
|
+
goog.scope(function () {
|
23
|
+
var FontRuler = webfont.FontRuler,
|
24
|
+
Size = webfont.Size;
|
26
25
|
|
27
|
-
/**
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
26
|
+
/**
|
27
|
+
* @param {string} fontFamily
|
28
|
+
* @param {string=} opt_fontDescription
|
29
|
+
*/
|
30
|
+
FontRuler.prototype.setFont = function(fontFamily, opt_fontDescription) {
|
31
|
+
var styleString = this.computeStyleString_(fontFamily, opt_fontDescription);
|
32
|
+
this.domHelper_.setStyle(this.el_, styleString);
|
33
|
+
};
|
33
34
|
|
34
|
-
/**
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
webfont.FontRuler.prototype.computeStyleString_ = function(fontFamily, opt_fontDescription) {
|
41
|
-
var variationCss = opt_fontDescription ? this.fvd_.expand(opt_fontDescription) : '';
|
42
|
-
var styleString = "position:absolute;top:-999px;left:-999px;" +
|
43
|
-
"font-size:300px;width:auto;height:auto;line-height:normal;margin:0;" +
|
44
|
-
"padding:0;font-variant:normal;white-space:nowrap;font-family:" +
|
45
|
-
this.nameHelper_.quote(fontFamily) + ";" + variationCss;
|
46
|
-
return styleString;
|
47
|
-
};
|
35
|
+
/**
|
36
|
+
* Inserts the ruler into the DOM.
|
37
|
+
*/
|
38
|
+
FontRuler.prototype.insert = function() {
|
39
|
+
this.domHelper_.insertInto('body', this.el_);
|
40
|
+
};
|
48
41
|
|
49
|
-
/**
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
42
|
+
/**
|
43
|
+
* @private
|
44
|
+
* @param {string} fontFamily
|
45
|
+
* @param {string=} opt_fontDescription
|
46
|
+
* @return {string}
|
47
|
+
*/
|
48
|
+
FontRuler.prototype.computeStyleString_ = function(fontFamily, opt_fontDescription) {
|
49
|
+
var variationCss = opt_fontDescription ? this.fvd_.expand(opt_fontDescription) : '';
|
50
|
+
var styleString = "position:absolute;top:-999px;left:-999px;" +
|
51
|
+
"font-size:300px;width:auto;height:auto;line-height:normal;margin:0;" +
|
52
|
+
"padding:0;font-variant:normal;white-space:nowrap;font-family:" +
|
53
|
+
this.nameHelper_.quote(fontFamily) + ";" + variationCss;
|
54
|
+
return styleString;
|
55
|
+
};
|
55
56
|
|
56
|
-
/**
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
};
|
57
|
+
/**
|
58
|
+
* @return {webfont.Size}
|
59
|
+
*/
|
60
|
+
FontRuler.prototype.getSize = function() {
|
61
|
+
return new Size(this.el_.offsetWidth, this.el_.offsetHeight);
|
62
|
+
};
|
63
|
+
|
64
|
+
/**
|
65
|
+
* Removes the ruler element from the DOM.
|
66
|
+
*/
|
67
|
+
FontRuler.prototype.remove = function() {
|
68
|
+
this.domHelper_.removeElement(this.el_);
|
69
|
+
};
|
70
|
+
});
|
@@ -1,3 +1,5 @@
|
|
1
|
+
goog.provide('webfont.FontVariationDescription');
|
2
|
+
|
1
3
|
/**
|
2
4
|
* @constructor
|
3
5
|
*/
|
@@ -38,97 +40,101 @@ webfont.FontVariationDescription.VALUES = {
|
|
38
40
|
]
|
39
41
|
};
|
40
42
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
for (var i = 0; i < this.values_.length; i++) {
|
53
|
-
if (value == this.values_[i][1]) {
|
54
|
-
output[this.index_] = this.values_[i][0];
|
55
|
-
return;
|
56
|
-
}
|
43
|
+
goog.scope(function () {
|
44
|
+
var FontVariationDescription = webfont.FontVariationDescription;
|
45
|
+
|
46
|
+
/**
|
47
|
+
* @private
|
48
|
+
* @constructor
|
49
|
+
*/
|
50
|
+
FontVariationDescription.Item = function(index, property, values) {
|
51
|
+
this.index_ = index;
|
52
|
+
this.property_ = property;
|
53
|
+
this.values_ = values;
|
57
54
|
}
|
58
|
-
}
|
59
55
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
56
|
+
FontVariationDescription.Item.prototype.compact = function(output, value) {
|
57
|
+
for (var i = 0; i < this.values_.length; i++) {
|
58
|
+
if (value == this.values_[i][1]) {
|
59
|
+
output[this.index_] = this.values_[i][0];
|
60
|
+
return;
|
61
|
+
}
|
65
62
|
}
|
66
63
|
}
|
67
|
-
}
|
68
64
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
*/
|
75
|
-
webfont.FontVariationDescription.prototype.compact = function(input) {
|
76
|
-
var result = ['n', '4'];
|
77
|
-
var descriptors = input.split(';');
|
78
|
-
|
79
|
-
for (var i = 0, len = descriptors.length; i < len; i++) {
|
80
|
-
var pair = descriptors[i].replace(/\s+/g, '').split(':');
|
81
|
-
if (pair.length == 2) {
|
82
|
-
var property = pair[0];
|
83
|
-
var value = pair[1];
|
84
|
-
var item = this.getItem_(property);
|
85
|
-
if (item) {
|
86
|
-
item.compact(result, value);
|
65
|
+
FontVariationDescription.Item.prototype.expand = function(output, value) {
|
66
|
+
for (var i = 0; i < this.values_.length; i++) {
|
67
|
+
if (value == this.values_[i][0]) {
|
68
|
+
output[this.index_] = this.property_ + ':' + this.values_[i][1];
|
69
|
+
return;
|
87
70
|
}
|
88
71
|
}
|
89
72
|
}
|
90
73
|
|
91
|
-
|
92
|
-
|
74
|
+
/**
|
75
|
+
* Compacts CSS declarations into an FVD.
|
76
|
+
* @param {string} input A string of CSS declarations such as
|
77
|
+
* 'font-weight:normal;font-style:italic'.
|
78
|
+
* @return {string} The equivalent FVD such as 'n4'.
|
79
|
+
*/
|
80
|
+
FontVariationDescription.prototype.compact = function(input) {
|
81
|
+
var result = ['n', '4'];
|
82
|
+
var descriptors = input.split(';');
|
93
83
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
84
|
+
for (var i = 0, len = descriptors.length; i < len; i++) {
|
85
|
+
var pair = descriptors[i].replace(/\s+/g, '').split(':');
|
86
|
+
if (pair.length == 2) {
|
87
|
+
var property = pair[0];
|
88
|
+
var value = pair[1];
|
89
|
+
var item = this.getItem_(property);
|
90
|
+
if (item) {
|
91
|
+
item.compact(result, value);
|
92
|
+
}
|
93
|
+
}
|
94
|
+
}
|
104
95
|
|
105
|
-
|
96
|
+
return result.join('');
|
97
|
+
};
|
106
98
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
99
|
+
/**
|
100
|
+
* Expands a FVD string into equivalent CSS declarations.
|
101
|
+
* @param {string} fvd The FVD string, such as 'n4'.
|
102
|
+
* @return {?string} The equivalent CSS such as
|
103
|
+
* 'font-weight:normal;font-style:italic' or null if it cannot be parsed.
|
104
|
+
*/
|
105
|
+
FontVariationDescription.prototype.expand = function(fvd) {
|
106
|
+
if (fvd.length != 2) {
|
107
|
+
return null;
|
108
|
+
}
|
114
109
|
|
115
|
-
|
116
|
-
return result.join(';') + ';';
|
117
|
-
} else {
|
118
|
-
return null;
|
119
|
-
}
|
120
|
-
}
|
110
|
+
var result = [null, null];
|
121
111
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
webfont.FontVariationDescription.prototype.getItem_ = function(property) {
|
126
|
-
for (var i = 0; i < this.properties_.length; i++) {
|
127
|
-
if (property == this.properties_[i]) {
|
112
|
+
for (var i = 0, len = this.properties_.length; i < len; i++) {
|
113
|
+
var property = this.properties_[i];
|
114
|
+
var key = fvd.substr(i, 1);
|
128
115
|
var values = this.values_[property];
|
129
|
-
|
116
|
+
var item = new webfont.FontVariationDescription.Item(i, property, values);
|
117
|
+
item.expand(result, key);
|
118
|
+
}
|
119
|
+
|
120
|
+
if (result[0] && result[1]) {
|
121
|
+
return result.join(';') + ';';
|
122
|
+
} else {
|
123
|
+
return null;
|
130
124
|
}
|
131
125
|
}
|
132
126
|
|
133
|
-
|
134
|
-
|
127
|
+
/**
|
128
|
+
* @private
|
129
|
+
*/
|
130
|
+
FontVariationDescription.prototype.getItem_ = function(property) {
|
131
|
+
for (var i = 0; i < this.properties_.length; i++) {
|
132
|
+
if (property == this.properties_[i]) {
|
133
|
+
var values = this.values_[property];
|
134
|
+
return new webfont.FontVariationDescription.Item(i, property, values);
|
135
|
+
}
|
136
|
+
}
|
137
|
+
|
138
|
+
return null;
|
139
|
+
};
|
140
|
+
});
|
data/src/core/fontwatcher.js
CHANGED
@@ -1,20 +1,17 @@
|
|
1
|
+
goog.provide('webfont.FontWatcher');
|
2
|
+
|
3
|
+
goog.require('webfont.FontWatchRunner');
|
4
|
+
|
1
5
|
/**
|
2
6
|
* @constructor
|
3
7
|
* @param {webfont.UserAgent} userAgent
|
4
8
|
* @param {webfont.DomHelper} domHelper
|
5
9
|
* @param {webfont.EventDispatcher} eventDispatcher
|
6
|
-
* @param {Object.<string, function(Object): webfont.Size>} fontSizer
|
7
|
-
* @param {function(function(), number=)} asyncCall
|
8
|
-
* @param {function(): number} getTime
|
9
10
|
* @param {number=} opt_timeout
|
10
11
|
*/
|
11
|
-
webfont.FontWatcher = function(userAgent, domHelper, eventDispatcher,
|
12
|
-
asyncCall, getTime, opt_timeout) {
|
12
|
+
webfont.FontWatcher = function(userAgent, domHelper, eventDispatcher, opt_timeout) {
|
13
13
|
this.domHelper_ = domHelper;
|
14
14
|
this.eventDispatcher_ = eventDispatcher;
|
15
|
-
this.fontSizer_ = fontSizer;
|
16
|
-
this.asyncCall_ = asyncCall;
|
17
|
-
this.getTime_ = getTime;
|
18
15
|
this.currentlyWatched_ = 0;
|
19
16
|
this.last_ = false;
|
20
17
|
this.success_ = false;
|
@@ -29,95 +26,103 @@ webfont.FontWatcher = function(userAgent, domHelper, eventDispatcher, fontSizer,
|
|
29
26
|
*/
|
30
27
|
webfont.FontWatcher.DEFAULT_VARIATION = 'n4';
|
31
28
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
var
|
57
|
-
|
58
|
-
|
29
|
+
goog.scope(function () {
|
30
|
+
var FontWatcher = webfont.FontWatcher;
|
31
|
+
|
32
|
+
/**
|
33
|
+
* Watches a set of font families.
|
34
|
+
* @param {Array.<string>} fontFamilies The font family names to watch.
|
35
|
+
* @param {Object.<string, Array.<string>>} fontDescriptions The font variations
|
36
|
+
* of each family to watch. Described with FVD.
|
37
|
+
* @param {Object.<string, string>} fontTestStrings The font test strings for
|
38
|
+
* each family.
|
39
|
+
* @param {function(new:webfont.FontWatchRunner,
|
40
|
+
* function(string, string),
|
41
|
+
* function(string, string),
|
42
|
+
* webfont.DomHelper,
|
43
|
+
* string,
|
44
|
+
* string,
|
45
|
+
* webfont.BrowserInfo,
|
46
|
+
* number=,
|
47
|
+
* Object.<string, boolean>=,
|
48
|
+
* string=)} fontWatchRunnerCtor The font watch runner constructor.
|
49
|
+
* @param {boolean} last True if this is the last set of families to watch.
|
50
|
+
*/
|
51
|
+
FontWatcher.prototype.watch = function(fontFamilies, fontDescriptions,
|
52
|
+
fontTestStrings, fontWatchRunnerCtor, last) {
|
53
|
+
var length = fontFamilies.length;
|
54
|
+
|
55
|
+
if (length === 0) {
|
56
|
+
this.eventDispatcher_.dispatchInactive();
|
57
|
+
return;
|
59
58
|
}
|
60
|
-
this.currentlyWatched_ += fontDescriptions[fontFamily].length;
|
61
|
-
}
|
62
59
|
|
63
|
-
|
64
|
-
|
65
|
-
|
60
|
+
for (var i = 0; i < length; i++) {
|
61
|
+
var fontFamily = fontFamilies[i];
|
62
|
+
if (!fontDescriptions[fontFamily]) {
|
63
|
+
fontDescriptions[fontFamily] = [webfont.FontWatcher.DEFAULT_VARIATION];
|
64
|
+
}
|
65
|
+
this.currentlyWatched_ += fontDescriptions[fontFamily].length;
|
66
|
+
}
|
66
67
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
var fontTestString = fontTestStrings[fontFamily];
|
68
|
+
if (last) {
|
69
|
+
this.last_ = last;
|
70
|
+
}
|
71
71
|
|
72
|
-
for (var
|
73
|
-
var
|
72
|
+
for (var i = 0; i < length; i++) {
|
73
|
+
var fontFamily = fontFamilies[i];
|
74
|
+
var descriptions = fontDescriptions[fontFamily];
|
75
|
+
var fontTestString = fontTestStrings[fontFamily];
|
74
76
|
|
75
|
-
|
77
|
+
for (var j = 0, len = descriptions.length; j < len; j++) {
|
78
|
+
var fontDescription = descriptions[j];
|
76
79
|
|
77
|
-
|
78
|
-
var inactiveCallback = webfont.bind(this, this.fontInactive_)
|
79
|
-
var fontWatchRunner = new fontWatchRunnerCtor(activeCallback,
|
80
|
-
inactiveCallback, this.domHelper_, this.fontSizer_, this.asyncCall_,
|
81
|
-
this.getTime_, fontFamily, fontDescription,
|
82
|
-
this.browserInfo_, this.timeout_, null, fontTestString);
|
80
|
+
this.eventDispatcher_.dispatchFontLoading(fontFamily, fontDescription);
|
83
81
|
|
84
|
-
|
82
|
+
var activeCallback = goog.bind(this.fontActive_, this);
|
83
|
+
var inactiveCallback = goog.bind(this.fontInactive_, this);
|
84
|
+
var fontWatchRunner = new fontWatchRunnerCtor(activeCallback,
|
85
|
+
inactiveCallback, this.domHelper_, fontFamily, fontDescription,
|
86
|
+
this.browserInfo_, this.timeout_, null, fontTestString);
|
87
|
+
|
88
|
+
fontWatchRunner.start();
|
89
|
+
}
|
85
90
|
}
|
86
|
-
}
|
87
|
-
};
|
91
|
+
};
|
88
92
|
|
89
|
-
/**
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
};
|
93
|
+
/**
|
94
|
+
* Called by a FontWatchRunner when a font has been detected as active.
|
95
|
+
* @param {string} fontFamily
|
96
|
+
* @param {string} fontDescription
|
97
|
+
* @private
|
98
|
+
*/
|
99
|
+
FontWatcher.prototype.fontActive_ = function(fontFamily, fontDescription) {
|
100
|
+
this.eventDispatcher_.dispatchFontActive(fontFamily, fontDescription);
|
101
|
+
this.success_ = true;
|
102
|
+
this.decreaseCurrentlyWatched_();
|
103
|
+
};
|
100
104
|
|
101
|
-
/**
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
};
|
105
|
+
/**
|
106
|
+
* Called by a FontWatchRunner when a font has been detected as inactive.
|
107
|
+
* @param {string} fontFamily
|
108
|
+
* @param {string} fontDescription
|
109
|
+
* @private
|
110
|
+
*/
|
111
|
+
FontWatcher.prototype.fontInactive_ = function(fontFamily, fontDescription) {
|
112
|
+
this.eventDispatcher_.dispatchFontInactive(fontFamily, fontDescription);
|
113
|
+
this.decreaseCurrentlyWatched_();
|
114
|
+
};
|
111
115
|
|
112
|
-
/**
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
116
|
+
/**
|
117
|
+
* @private
|
118
|
+
*/
|
119
|
+
FontWatcher.prototype.decreaseCurrentlyWatched_ = function() {
|
120
|
+
if (--this.currentlyWatched_ == 0 && this.last_) {
|
121
|
+
if (this.success_) {
|
122
|
+
this.eventDispatcher_.dispatchActive();
|
123
|
+
} else {
|
124
|
+
this.eventDispatcher_.dispatchInactive();
|
125
|
+
}
|
121
126
|
}
|
122
|
-
}
|
123
|
-
};
|
127
|
+
};
|
128
|
+
});
|