Skip to content

Commit 59c2eda

Browse files
committed
@font-face support. Closes NV#4.
1 parent fdc11b8 commit 59c2eda

File tree

4 files changed

+78
-2
lines changed

4 files changed

+78
-2
lines changed

lib/CSSFontFaceRule.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
//.CommonJS
2+
var CSSOM = {
3+
CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration,
4+
CSSRule: require("./CSSRule").CSSRule
5+
};
6+
///CommonJS
7+
8+
9+
/**
10+
* @constructor
11+
* @see http://dev.w3.org/csswg/cssom/#css-font-face-rule
12+
*/
13+
CSSOM.CSSFontFaceRule = function CSSFontFaceRule() {
14+
CSSOM.CSSRule.call(this);
15+
this.style = new CSSOM.CSSStyleDeclaration;
16+
this.style.parentRule = this;
17+
};
18+
19+
CSSOM.CSSFontFaceRule.prototype = new CSSOM.CSSRule;
20+
CSSOM.CSSFontFaceRule.prototype.constructor = CSSOM.CSSFontFaceRule;
21+
CSSOM.CSSFontFaceRule.prototype.type = 5;
22+
//FIXME
23+
//CSSOM.CSSFontFaceRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule;
24+
//CSSOM.CSSFontFaceRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule;
25+
26+
// http://www.opensource.apple.com/source/WebCore/WebCore-955.66.1/css/WebKitCSSFontFaceRule.cpp
27+
CSSOM.CSSFontFaceRule.prototype.__defineGetter__("cssText", function() {
28+
return "@font-face {" + this.style.cssText + "}";
29+
});
30+
31+
32+
//.CommonJS
33+
exports.CSSFontFaceRule = CSSOM.CSSFontFaceRule;
34+
///CommonJS

lib/parse.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ var CSSOM = {
44
CSSStyleRule: require("./CSSStyleRule").CSSStyleRule,
55
CSSImportRule: require("./CSSImportRule").CSSImportRule,
66
CSSMediaRule: require("./CSSMediaRule").CSSMediaRule,
7+
CSSFontFaceRule: require("./CSSFontFaceRule").CSSFontFaceRule,
78
CSSStyleDeclaration: require('./CSSStyleDeclaration').CSSStyleDeclaration,
89
CSSKeyframeRule: require('./CSSKeyframeRule').CSSKeyframeRule,
910
CSSKeyframesRule: require('./CSSKeyframesRule').CSSKeyframesRule
@@ -44,13 +45,13 @@ CSSOM.parse = function parse(token) {
4445

4546
var styleSheet = new CSSOM.CSSStyleSheet;
4647

47-
// @type CSSStyleSheet|CSSMediaRule|CSSKeyframesRule
48+
// @type CSSStyleSheet|CSSMediaRule|CSSFontFaceRule|CSSKeyframesRule
4849
var currentScope = styleSheet;
4950

5051
// @type CSSMediaRule|CSSKeyframesRule
5152
var parentRule;
5253

53-
var selector, name, value, priority="", styleRule, mediaRule, importRule, keyframesRule, keyframeRule;
54+
var selector, name, value, priority="", styleRule, mediaRule, importRule, fontFaceRule, keyframesRule, keyframeRule;
5455

5556
var atKeyframesRegExp = /@(-(?:\w+-)+)?keyframes/g;
5657

@@ -136,6 +137,13 @@ CSSOM.parse = function parse(token) {
136137
i += "import".length;
137138
buffer += "@import";
138139
break;
140+
} else if (token.indexOf("@font-face", i) === i) {
141+
state = "fontFaceRule-begin";
142+
i += "font-face".length;
143+
fontFaceRule = new CSSOM.CSSFontFaceRule;
144+
fontFaceRule.__starts = i;
145+
buffer = "";
146+
break;
139147
} else {
140148
atKeyframesRegExp.lastIndex = i;
141149
var matchKeyframes = atKeyframesRegExp.exec(token);
@@ -166,6 +174,14 @@ CSSOM.parse = function parse(token) {
166174
mediaRule.parentStyleSheet = styleSheet;
167175
buffer = "";
168176
state = "before-selector";
177+
} else if (state === "fontFaceRule-begin") {
178+
if (parentRule) {
179+
fontFaceRule.parentRule = parentRule;
180+
}
181+
fontFaceRule.parentStyleSheet = styleSheet;
182+
styleRule = fontFaceRule;
183+
buffer = "";
184+
state = "before-name";
169185
} else if (state === "keyframesRule-begin") {
170186
keyframesRule.name = buffer.trim();
171187
if (parentRule) {

spec/parse.spec.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,31 @@ var TESTS = [
707707
return result;
708708
})()
709709
},
710+
{
711+
input: "@font-face { font-family: Delicious; font-weight: bold; src: url('Delicious-Bold.otf'); }",
712+
result: (function() {
713+
var result = {
714+
cssRules: [
715+
{
716+
parentRule: null,
717+
style: {
718+
0: 'font-family',
719+
1: 'font-weight',
720+
2: 'src',
721+
'font-family': 'Delicious',
722+
'font-weight': 'bold',
723+
'src': 'url(\'Delicious-Bold.otf\')',
724+
length: 3
725+
}
726+
}
727+
],
728+
parentStyleSheet: null
729+
};
730+
result.cssRules[0].parentStyleSheet = result;
731+
result.cssRules[0].style.parentRule = result.cssRules[0];
732+
return result;
733+
})()
734+
},
710735
{
711736
// Non-vendor prefixed @keyframes rule, from Twitter Bootstrap (progress-bars):
712737
input: '@keyframes progress-bar-stripes {\n from { background-position: 0 0; }\n to { background-position: 40px 0; }\n}',

src/files.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ exports.files = [
55
"MediaList",
66
"CSSMediaRule",
77
"CSSImportRule",
8+
"CSSFontFaceRule",
89
"StyleSheet",
910
"CSSStyleSheet",
1011
"CSSKeyframesRule",

0 commit comments

Comments
 (0)