openfl
Version:
A fast, productive library for 2D cross-platform development.
418 lines (400 loc) • 12.3 kB
JavaScript
// Class: openfl.text._internal.CSSParser
var $global = typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : this
$global.Object.defineProperty(exports, "__esModule", {value: true});
var __map_reserved = {};
// Imports
var $hxClasses = require("./../../../hxClasses_stub").default;
var $hxEnums = require("./../../../hxEnums_stub").default;
var $import = require("./../../../import_stub").default;
function EReg() {return require("./../../../EReg");}
function StringTools() {return require("./../../../StringTools");}
function haxe_ds_StringMap() {return require("./../../../haxe/ds/StringMap");}
function HxOverrides() {return require("./../../../HxOverrides");}
function js_Boot() {return require("./../../../js/Boot");}
// Constructor
var CSSParser = function(options) {
this.importRegex = new (EReg().default)("@import .*?;","ig");
this.commentRegex = "(\\/\\*[\\s\\S]*?\\*\\/)";
this.combinedCSSRegex = "((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)*?})";
this.keyframeRegex = "((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})";
this.mediaQueryRegex = "((@media [\\s\\S]*?){([\\s\\S]*?}\\s*?)})";
this.cssRegex = new (EReg().default)("([\\s\\S]*?){([\\s\\S]*?)*}","ig");
this.keyframeStatements = [];
this.importStatements = [];
}
// Meta
CSSParser.__name__ = "openfl.text._internal.CSSParser";
CSSParser.__isInterface__ = false;
CSSParser.prototype = {
stripComments: function(css) {
var regex = new (EReg().default)(this.commentRegex,"ig");
return regex.replace(css,"");
},
parseRules: function(rules) {
var rulesReg = new (EReg().default)("(\\*?[-#/\\*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)+((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^\\)]*?\\)|[^};])+)","g");
var arr = this.getMatches(rulesReg,rules);
var ret = [];
var _g = 0;
var _g1 = arr.length;
while(_g < _g1) {
var i = _g++;
if(!rulesReg.match(arr[i])) {
return null;
}
rules = rulesReg.matched(0).split("\r\n").join("\n");
var line = rules;
line = (StringTools().default).trim(line);
if(line.indexOf(":") != -1) {
var directive = (StringTools().default).trim(line.split(":")[0]);
var value = (StringTools().default).trim(line.split(":")[1]);
if(directive.length < 1 || value.length < 1) {
continue;
}
var _g2 = new (haxe_ds_StringMap().default)();
_g2.set("type","declaration");
_g2.set("property",directive);
_g2.set("value",value);
ret.push(_g2);
} else if((HxOverrides().default).substr((StringTools().default).trim(line),0,7) == "base64,") {
var _line = line + (StringTools().default).trim(line);
ret[ret.length - 1].set("value",_line);
} else if(line.length > 0) {
var _g3 = new (haxe_ds_StringMap().default)();
_g3.set("type","declaration");
_g3.set("property","");
_g3.set("value",line);
_g3.set("defective",true);
ret.push(_g3);
}
}
return ret;
},
findCorrespondingRule: function(rules,directive,value) {
var ret = null;
var _g = 0;
var _g1 = rules.length;
while(_g < _g1) {
var i = _g++;
if(rules[i].get("directive") == directive) {
ret = rules[i];
if(value == rules[i].get("value")) {
break;
}
}
}
return ret;
},
findBySelector: function(objectArray,selector,contains) {
if(contains == null) {
contains = false;
}
var found = [];
var _g = 0;
var _g1 = objectArray.length;
while(_g < _g1) {
var i = _g++;
if(contains == false) {
if(objectArray[i].get("selector") == selector) {
found.push(objectArray[i]);
}
} else if(((js_Boot().default).__cast(objectArray[i].get("selector") , String)).indexOf(selector) != -1) {
found.push(objectArray[i]);
}
}
if(selector == "@imports" || found.length < 2) {
return found;
} else {
var base = found[0];
var _g2 = 0;
var _g3 = found.length;
while(_g2 < _g3) {
var i1 = _g2++;
this.intelligentCSSPush([base],found[i1]);
}
return [base];
}
},
deleteBySelector: function(objectArray,selector) {
var ret = [];
var _g = 0;
var _g1 = objectArray.length;
while(_g < _g1) {
var i = _g++;
if(objectArray[i].get("selector") != selector) {
ret.push(objectArray[i]);
}
}
return ret;
},
compress: function(objectArray) {
var compressed = [];
var done = new (haxe_ds_StringMap().default)();
var _g = 0;
var _g1 = objectArray.length;
while(_g < _g1) {
var i = _g++;
var obj = objectArray[i];
if(done.get(obj.get("selector")) == true) {
continue;
}
var found = this.findBySelector(objectArray,obj.get("selector"));
if(found.length != 0) {
compressed = compressed.concat(found);
done.set("selector",true);
}
}
return compressed;
},
diff: function(object1,object2) {
if(object1.get("selector") == object2.get("selector")) {
return null;
}
if(object1.get("type") == "media" || object2.get("type") == "media") {
return null;
}
var _g = new (haxe_ds_StringMap().default)();
_g.set("selector",object1.get("selector"));
_g.set("rules",[]);
var diff = _g;
var rule1 = new (haxe_ds_StringMap().default)();
var rule2 = new (haxe_ds_StringMap().default)();
var _length = ((js_Boot().default).__cast(object1.get("rules") , Array)).length;
var _length2 = ((js_Boot().default).__cast(object2.get("rules") , Array)).length;
var _g1 = 0;
var _g2 = _length;
while(_g1 < _g2) {
var i = _g1++;
rule1 = ((js_Boot().default).__cast(object1.get("rules") , Array))[1];
rule2 = this.findCorrespondingRule(object2.get("rules"),object1.get("directive"),object1.get("value"));
if(rule2 == null) {
((js_Boot().default).__cast(diff.get("rules") , Array)).push(rule1);
} else if(rule1.get("value") != rule2.get("value")) {
((js_Boot().default).__cast(diff.get("rules") , Array)).push(rule1);
}
}
var _g3 = 0;
var _g4 = _length2;
while(_g3 < _g4) {
var i1 = _g3++;
rule2 = ((js_Boot().default).__cast(object1.get("rules") , Array))[1];
rule1 = this.findCorrespondingRule(object1.get("rules"),object2.get("directive"));
if(rule1 == null) {
rule2.set("type","DELETED");
((js_Boot().default).__cast(diff.get("rules") , Array)).push(rule2);
}
}
if(((js_Boot().default).__cast(diff.get("rules") , Array)).length == 0) {
return null;
}
return diff;
},
intelligentMerge: function(objectArray,newArray,reverse) {
if(reverse == null) {
reverse = false;
}
var _g = 0;
var _g1 = newArray.length;
while(_g < _g1) {
var i = _g++;
this.intelligentCSSPush(objectArray,newArray[i],reverse);
}
var _g2 = 0;
var _g3 = objectArray.length;
while(_g2 < _g3) {
var i1 = _g2++;
var cobj = objectArray[i1];
if(cobj.get("type") == "media" || cobj.get("type") == "keyframes") {
continue;
}
cobj.set("rules",this.compactRules(cobj.get("rules")));
}
},
intelligentCSSPush: function(objectArray,minimalObject,reverse) {
if(reverse == null) {
reverse = false;
}
var pushSelector = minimalObject.get("selector");
var cssObject = null;
if(reverse == false) {
var _g = 0;
var _g1 = objectArray.length;
while(_g < _g1) {
var i = _g++;
if(objectArray[i].get("selector") == minimalObject.get("selector")) {
cssObject = objectArray[i];
break;
}
}
} else {
var j = objectArray.length - 1;
while(j > -1) {
if(objectArray[j].get("selector") == minimalObject.get("selector")) {
cssObject = objectArray[j];
break;
}
--j;
}
}
if(cssObject == null) {
objectArray.push(minimalObject);
} else if(minimalObject.get("type") != "media") {
var mRules = minimalObject.get("rules");
var _g2 = 0;
var _g11 = mRules.length;
while(_g2 < _g11) {
var i1 = _g2++;
var rule = mRules[i1];
var oldRule = this.findCorrespondingRule(cssObject.get("rules"),rule.get("directive"));
if(oldRule == null) {
var cRules = cssObject.get("rules");
cRules.push(rule);
} else if(rule.get("type") == "DELETED") {
oldRule.set("type","DELETED");
} else {
oldRule.set("value",rule.get("value"));
}
}
} else {
cssObject.set("value",((js_Boot().default).__cast(cssObject.get("subStyles") , Array)).concat(minimalObject.get("subStyles")));
}
},
compactRules: function(rules) {
var newRules = [];
var _g = 0;
var _g1 = rules.length;
while(_g < _g1) {
var i = _g++;
if(rules[i].get("type") != "DELETED") {
newRules.push(rules[i]);
}
}
return newRules;
},
getImports: function(objectArray) {
var imps = [];
var _g = 0;
var _g1 = objectArray.length;
while(_g < _g1) {
var i = _g++;
if(objectArray[i].get("type") == "imports") {
imps.push(objectArray[i].get("styles"));
}
}
return imps;
},
parse: function(source) {
if(source == null) {
return null;
}
source = new (EReg().default)("^\\s+|\\s+$","g").replace(source,"");
var css = [];
var m = this.importRegex.match(source);
while(m) {
var imports = this.importRegex.matched(0);
if(imports != null) {
this.importStatements.push(imports);
var _g = new (haxe_ds_StringMap().default)();
_g.set("selector","@imports");
_g.set("type","imports");
_g.set("styles",imports);
css.push(_g);
} else {
break;
}
}
source = this.importRegex.replace(source,"");
var keyframesRegex = new (EReg().default)(this.keyframeRegex,"gi");
var arr = null;
while(keyframesRegex.match(source)) {
arr = this.getMatches(keyframesRegex,source);
if(arr == null) {
break;
}
var _g1 = new (haxe_ds_StringMap().default)();
_g1.set("selectors","@keyframes");
_g1.set("type","keyframes");
_g1.set("styles",keyframesRegex.matchedRight());
css.push(_g1);
}
source = keyframesRegex.replace(source,"");
var unified = new (EReg().default)(this.combinedCSSRegex,"gi");
while(unified.match(source)) {
arr = this.getMatches(unified,source);
if(arr == null) {
break;
}
var selector = "";
var _g2 = 0;
var _g11 = arr.length;
while(_g2 < _g11) {
var i = _g2++;
var selReg = new (EReg().default)("^([^{]+)","");
if(selReg.match(arr[i])) {
if(selReg.matched(0) != null) {
selector = (StringTools().default).trim(selReg.matched(0).split("\r\n").join("\n"));
}
var commentsRegex = new (EReg().default)(this.commentRegex,"gi");
var comments = this.getMatches(commentsRegex,selector);
if(comments != null) {
selector = (StringTools().default).trim(commentsRegex.replace(selector,""));
}
selector = new (EReg().default)("\n+","").replace(selector,"\n");
if(selector.indexOf("@media") != -1) {
var _g3 = new (haxe_ds_StringMap().default)();
_g3.set("selectors",selector);
_g3.set("type","media");
_g3.set("subStyles",this.parse(selReg.matchedRight() + "\n}"));
var object = _g3;
if(comments != null) {
object.set("comments",comments[0]);
}
css.push(object);
} else if(selReg.matchedRight() != null) {
var rules = this.parseRules(selReg.matchedRight());
var _g4 = new (haxe_ds_StringMap().default)();
_g4.set("selectors",selector);
_g4.set("type","rule");
_g4.set("declarations",rules);
var styleObject = _g4;
if(selector == "@font-face") {
styleObject.set("type","font-face");
}
if(comments != null) {
styleObject.set("comments",comments[0]);
}
css.push(styleObject);
}
} else {
break;
}
}
break;
}
var _g5 = new (haxe_ds_StringMap().default)();
_g5.set("type","stylesheet");
_g5.set("rules",css);
_g5.set("parsingErrors",[]);
var ret = _g5;
return ret;
},
getMatches: function(ereg,input,index) {
if(index == null) {
index = 0;
}
var matches = [];
while(ereg.match(input)) {
var match = (StringTools().default).trim(ereg.matched(index));
matches.push(match);
input = (StringTools().default).trim(ereg.matchedRight());
}
if(matches.length == 0) {
return null;
}
return matches;
}
};
CSSParser.prototype.__class__ = CSSParser.prototype.constructor = $hxClasses["openfl.text._internal.CSSParser"] = CSSParser;
// Init
// Statics
// Export
exports.default = CSSParser;