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 }