1 module uim.css.rules; 2 3 import uim.css; 4 5 @safe: 6 class DCSSRules : DCSSObj { 7 this() { super(); } 8 this(DCSSRule[] someRules) { this().rules(someRules); } 9 this(DCSSRules aRules) { this().rules(aRules); } 10 11 override protected void _init() { super._init; } 12 13 DCSSRule[] _rules; 14 DCSSRule[] rules() { return _rules; } 15 16 O rules(this O)(DCSSRule[] someRules) { _rules ~= someRules; return cast(O)this; } 17 O rules(this O)(DCSSRules someRules) { _rules ~= someRules.rules; return cast(O)this; } 18 O rules(this O)(string[string][string] someDeclarations) { 19 foreach(aSelector,aDeclaration; someDeclarations) { 20 this.rule(aSelector, aDeclaration); } 21 return cast(O)this; } 22 unittest { 23 assert(CSSRules.rules(["body": ["background-color": "lightgreen"]]) == "body{background-color:lightgreen}"); 24 } 25 26 auto find(string selector) { foreach(i, rule; _rules) if (rule.selector == selector) return i; return -1; } 27 O remove(this O)(long index) { if (index < _rules.length) _rules = _rules.remove(index);} 28 o sub(this O)(string selector){ auto index = find(selector); this.remove(index); } 29 30 /// Adding CSS rules 31 O add(this O)(DCSSRules aRules) { _rules ~= aRules.rules; return cast(O)this; } 32 O add(this O)(DCSSRule aRule) { _rules ~= aRule; return cast(O)this; } 33 O add(this O)(DCSSMedia aRule) { _rules ~= aRule; return cast(O)this; } 34 35 O rule(this O)(DCSSRule aRule) { _rules ~= aRule; return cast(O)this; } 36 O rule(this O)(string aSelector, string name, string value) { _rules~=CSSRule(aSelector, name, value); return cast(O)this; } 37 O rule(this O)(string aSelector, string[string] someDeclarations) { _rules~=CSSRule(aSelector, someDeclarations); return cast(O)this; } 38 39 O opCall(this O)(string aSelector, string name, string value) { _rules~=CSSRule(aSelector, name, value); return cast(O)this; } 40 O opCall(this O)(string aSelector, string[string] someDeclarations) { _rules~=CSSRule(aSelector, someDeclarations); return cast(O)this; } 41 O opCall(this O)(DCSSRule aRule) { return this.add(aRule); } 42 O opCall(this O)(DCSSRule aRules) { return this.add(aRules); } 43 44 bool opEquals(string css) { return toString == css; } 45 override string toString() { 46 return _rules.map!(a => a.toString).join(""); 47 } 48 } 49 auto CSSRules() { return new DCSSRules(); } 50 auto CSSRules(DCSSRule[] someRules) { return new DCSSRules(someRules); } 51 auto CSSRules(DCSSRules someRules) { return new DCSSRules(someRules); } 52 53 unittest { 54 assert(CSSRules.rule(CSSRule("body", ["background-color": "lightgreen"])) == "body{background-color:lightgreen}"); 55 assert(CSSRules.rule("body", "background-color", "lightgreen") == "body{background-color:lightgreen}"); 56 assert(CSSRules.rule("body", ["background-color": "lightgreen"]) == "body{background-color:lightgreen}"); 57 assert(CSSRules 58 .rule("body", ["background-color": "lightgreen"]) 59 .rule("test", ["background-color": "lightgreen"]) == "body{background-color:lightgreen}test{background-color:lightgreen}"); 60 }