126 lines
3.8 KiB
JavaScript
126 lines
3.8 KiB
JavaScript
//.CommonJS
|
|
var CSSOM = {
|
|
CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration,
|
|
CSSRule: require("./CSSRule").CSSRule,
|
|
CSSRuleList: require("./CSSRuleList").CSSRuleList,
|
|
CSSGroupingRule: require("./CSSGroupingRule").CSSGroupingRule,
|
|
};
|
|
var regexPatterns = require("./regexPatterns").regexPatterns;
|
|
// Use cssstyle if available
|
|
try {
|
|
CSSOM.CSSStyleDeclaration = require("cssstyle").CSSStyleDeclaration;
|
|
} catch (e) {
|
|
// ignore
|
|
}
|
|
///CommonJS
|
|
|
|
|
|
/**
|
|
* @constructor
|
|
* @see https://drafts.csswg.org/cssom/#the-csspagerule-interface
|
|
*/
|
|
CSSOM.CSSPageRule = function CSSPageRule() {
|
|
CSSOM.CSSGroupingRule.call(this);
|
|
this.__style = new CSSOM.CSSStyleDeclaration();
|
|
this.__style.parentRule = this;
|
|
};
|
|
|
|
CSSOM.CSSPageRule.prototype = Object.create(CSSOM.CSSGroupingRule.prototype);
|
|
CSSOM.CSSPageRule.prototype.constructor = CSSOM.CSSPageRule;
|
|
|
|
Object.setPrototypeOf(CSSOM.CSSPageRule, CSSOM.CSSGroupingRule);
|
|
|
|
Object.defineProperty(CSSOM.CSSPageRule.prototype, "type", {
|
|
value: 6,
|
|
writable: false
|
|
});
|
|
|
|
Object.defineProperty(CSSOM.CSSPageRule.prototype, "selectorText", {
|
|
get: function() {
|
|
return this.__selectorText;
|
|
},
|
|
set: function(value) {
|
|
if (typeof value === "string") {
|
|
var trimmedValue = value.trim();
|
|
|
|
// Empty selector is valid for @page
|
|
if (trimmedValue === '') {
|
|
this.__selectorText = '';
|
|
return;
|
|
}
|
|
|
|
var atPageRuleSelectorRegExp = regexPatterns.atPageRuleSelectorRegExp;
|
|
var cssCustomIdentifierRegExp = regexPatterns.cssCustomIdentifierRegExp;
|
|
var match = trimmedValue.match(atPageRuleSelectorRegExp);
|
|
if (match) {
|
|
var pageName = match[1] || '';
|
|
var pseudoPages = match[2] || '';
|
|
|
|
// Validate page name if present
|
|
if (pageName) {
|
|
// Page name can be an identifier or a string
|
|
if (!cssCustomIdentifierRegExp.test(pageName)) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Validate pseudo-pages if present
|
|
if (pseudoPages) {
|
|
var pseudos = pseudoPages.split(':').filter(function(p) { return p; });
|
|
var validPseudos = ['left', 'right', 'first', 'blank'];
|
|
var allValid = true;
|
|
for (var j = 0; j < pseudos.length; j++) {
|
|
if (validPseudos.indexOf(pseudos[j].toLowerCase()) === -1) {
|
|
allValid = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!allValid) {
|
|
return; // Invalid pseudo-page, do nothing
|
|
}
|
|
}
|
|
|
|
this.__selectorText = pageName + pseudoPages.toLowerCase();
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
Object.defineProperty(CSSOM.CSSPageRule.prototype, "style", {
|
|
get: function() {
|
|
return this.__style;
|
|
},
|
|
set: function(value) {
|
|
if (typeof value === "string") {
|
|
this.__style.cssText = value;
|
|
} else {
|
|
this.__style = value;
|
|
}
|
|
}
|
|
});
|
|
|
|
Object.defineProperty(CSSOM.CSSPageRule.prototype, "cssText", {
|
|
get: function() {
|
|
var values = "";
|
|
if (this.cssRules.length) {
|
|
var valuesArr = [" {"];
|
|
this.style.cssText && valuesArr.push(this.style.cssText);
|
|
valuesArr.push(this.cssRules.reduce(function(acc, rule){
|
|
if (rule.cssText !== "") {
|
|
acc.push(rule.cssText);
|
|
}
|
|
return acc;
|
|
}, []).join("\n "));
|
|
values = valuesArr.join("\n ") + "\n}";
|
|
} else {
|
|
values = " {" + (this.style.cssText ? " " + this.style.cssText : "") + " }";
|
|
}
|
|
return "@page" + (this.selectorText ? " " + this.selectorText : "") + values;
|
|
}
|
|
});
|
|
|
|
//.CommonJS
|
|
exports.CSSPageRule = CSSOM.CSSPageRule;
|
|
///CommonJS
|