-
Notifications
You must be signed in to change notification settings - Fork 3.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rename Directive -> AtRule & Rule -> Declaration
- Added tree shim for old node types and plugin visitor shim to upgrade node visitors to new node types
- Loading branch information
1 parent
c73f50e
commit 52e9b5e
Showing
16 changed files
with
370 additions
and
306 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,134 @@ | ||
var Node = require("./node"), | ||
Selector = require("./selector"), | ||
Ruleset = require("./ruleset"); | ||
|
||
var AtRule = function (name, value, rules, index, currentFileInfo, debugInfo, isRooted, visibilityInfo) { | ||
var i; | ||
|
||
this.name = name; | ||
this.value = value; | ||
if (rules) { | ||
if (Array.isArray(rules)) { | ||
this.rules = rules; | ||
} else { | ||
this.rules = [rules]; | ||
this.rules[0].selectors = (new Selector([], null, null, this.index, currentFileInfo)).createEmptySelectors(); | ||
} | ||
for (i = 0; i < this.rules.length; i++) { | ||
this.rules[i].allowImports = true; | ||
} | ||
} | ||
this.index = index; | ||
this.currentFileInfo = currentFileInfo; | ||
this.debugInfo = debugInfo; | ||
this.isRooted = isRooted || false; | ||
this.copyVisibilityInfo(visibilityInfo); | ||
this.allowRoot = true; | ||
}; | ||
|
||
AtRule.prototype = new Node(); | ||
AtRule.prototype.type = "AtRule"; | ||
AtRule.prototype.accept = function (visitor) { | ||
var value = this.value, rules = this.rules; | ||
if (rules) { | ||
this.rules = visitor.visitArray(rules); | ||
} | ||
if (value) { | ||
this.value = visitor.visit(value); | ||
} | ||
}; | ||
AtRule.prototype.isRulesetLike = function() { | ||
return this.rules || !this.isCharset(); | ||
}; | ||
AtRule.prototype.isCharset = function() { | ||
return "@charset" === this.name; | ||
}; | ||
AtRule.prototype.genCSS = function (context, output) { | ||
var value = this.value, rules = this.rules; | ||
output.add(this.name, this.currentFileInfo, this.index); | ||
if (value) { | ||
output.add(' '); | ||
value.genCSS(context, output); | ||
} | ||
if (rules) { | ||
this.outputRuleset(context, output, rules); | ||
} else { | ||
output.add(';'); | ||
} | ||
}; | ||
AtRule.prototype.eval = function (context) { | ||
var mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules; | ||
|
||
//media stored inside other atrule should not bubble over it | ||
//backpup media bubbling information | ||
mediaPathBackup = context.mediaPath; | ||
mediaBlocksBackup = context.mediaBlocks; | ||
//deleted media bubbling information | ||
context.mediaPath = []; | ||
context.mediaBlocks = []; | ||
|
||
if (value) { | ||
value = value.eval(context); | ||
} | ||
if (rules) { | ||
// assuming that there is only one rule at this point - that is how parser constructs the rule | ||
rules = [rules[0].eval(context)]; | ||
rules[0].root = true; | ||
} | ||
//restore media bubbling information | ||
context.mediaPath = mediaPathBackup; | ||
context.mediaBlocks = mediaBlocksBackup; | ||
|
||
return new AtRule(this.name, value, rules, | ||
this.index, this.currentFileInfo, this.debugInfo, this.isRooted, this.visibilityInfo()); | ||
}; | ||
AtRule.prototype.variable = function (name) { | ||
if (this.rules) { | ||
// assuming that there is only one rule at this point - that is how parser constructs the rule | ||
return Ruleset.prototype.variable.call(this.rules[0], name); | ||
} | ||
}; | ||
AtRule.prototype.find = function () { | ||
if (this.rules) { | ||
// assuming that there is only one rule at this point - that is how parser constructs the rule | ||
return Ruleset.prototype.find.apply(this.rules[0], arguments); | ||
} | ||
}; | ||
AtRule.prototype.rulesets = function () { | ||
if (this.rules) { | ||
// assuming that there is only one rule at this point - that is how parser constructs the rule | ||
return Ruleset.prototype.rulesets.apply(this.rules[0]); | ||
} | ||
}; | ||
AtRule.prototype.outputRuleset = function (context, output, rules) { | ||
var ruleCnt = rules.length, i; | ||
context.tabLevel = (context.tabLevel | 0) + 1; | ||
|
||
// Compressed | ||
if (context.compress) { | ||
output.add('{'); | ||
for (i = 0; i < ruleCnt; i++) { | ||
rules[i].genCSS(context, output); | ||
} | ||
output.add('}'); | ||
context.tabLevel--; | ||
return; | ||
} | ||
|
||
// Non-compressed | ||
var tabSetStr = '\n' + Array(context.tabLevel).join(" "), tabRuleStr = tabSetStr + " "; | ||
if (!ruleCnt) { | ||
output.add(" {" + tabSetStr + '}'); | ||
} else { | ||
output.add(" {" + tabRuleStr); | ||
rules[0].genCSS(context, output); | ||
for (i = 1; i < ruleCnt; i++) { | ||
output.add(tabRuleStr); | ||
rules[i].genCSS(context, output); | ||
} | ||
output.add(tabSetStr + '}'); | ||
} | ||
|
||
context.tabLevel--; | ||
}; | ||
module.exports = AtRule; |
Oops, something went wrong.