UNPKG

openfl

Version:

A fast, productive library for 2D cross-platform development.

418 lines (400 loc) 12.3 kB
// 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;