1 module uim.html.apps.page;
2 
3 import uim.html;
4 
5 class DH5AppPage : DH5AppObj {
6 	this() { super(); 
7 	clearMetas;
8 	clearLinks;
9 	clearStyles;
10 	clearScripts;
11 	
12 	this.mimetype("text/html"); }
13 	this(DH5App anApp) { this().app(anApp); }
14 	this(string aName) { this().name(aName); }
15 	this(DH5App anApp, string aName) { this(anApp).name(aName); }
16 
17 	mixin(OProperty!("string", "title"));
18 	unittest {
19 		assert(H5AppPage.title("aTitle").title == "aTitle");	
20 		assert(H5AppPage.title("aTitle").title("otherTitle").title == "otherTitle");
21 	}
22 
23 	/// Language of page
24 	string _lang = "en";
25 	/// Get language of page
26 	string lang() { return _lang; }
27 	string language() { return _lang; }
28 	/// Change language of page
29 	O lang(this O)(string newLang) { _lang = newLang; return cast(O)this; }
30 	O language(this O)(string newLang) { _lang = newLang; return cast(O)this; }
31 	unittest {		
32 			assert(H5App.lang("aLanguage").lang == "aLanguage");	
33 			assert(H5App.lang("aLanguage").lang("otherLanguage").lang == "otherLanguage");
34 			assert(H5App.language("aLanguage").language == "aLanguage");	
35 			assert(H5App.language("aLanguage").language("otherLanguage").language == "otherLanguage");
36 	}
37 
38 	string[string] keywords;
39 	
40   /// Every page can has his own layout - Otherwise it will use central app layout
41 	DH5AppLayout _layout;
42 	auto layout() { 
43 		if (_layout) return _layout;
44 		if (_app) if (_app.layout) return _app.layout;
45 		return null;
46 	}
47 	O layout(this O)(DH5AppLayout newlayout) { _layout = newlayout; return cast(O)this; }
48 	unittest {
49 		//auto ly = H5AppLayout;
50 		//assert(H5AppPage.content("xxx") == "xxx");
51 		//assert(H5AppPage.content("xxx").layout(ly) == `<!doctype html><html dir="ltr" lang="en"><head></head><body>xxx</body></html>`);
52 	}
53 
54 	protected DH5Meta[] _metas;
55 	DH5Meta[] metas() { return _metas; }
56 	O metas(this O)(string[string] value, string[string][] addMetas...) { this.metas([value]~addMetas); return cast(O)this;}
57 	O metas(this O)(string[string][] addMetas) { foreach(meta; addMetas) this.metas(H5Meta(meta)); return cast(O)this; }
58 
59 	O metas(this O)(DH5Meta[] addMetas...) { this.metas(addMetas); return cast(O)this; }
60 	O metas(this O)(DH5Meta[] addMetas) { _metas ~= addMetas; return cast(O)this;}
61 
62 	O clearMetas(this O)() { _metas = null; return cast(O)this; }
63 	unittest {
64 		assert(uim.html.elements.meta.toString(H5AppLayout.metas(["a":"b"]).metas)  == `<meta a="b">`);
65 		assert(uim.html.elements.meta.toString(H5AppLayout.metas([["a":"b"]]).metas)  == `<meta a="b">`);
66 		assert(uim.html.elements.meta.toString(H5AppLayout.metas(H5Meta(["a":"b"])).metas)  == `<meta a="b">`);
67 		assert(uim.html.elements.meta.toString(H5AppLayout.metas([H5Meta(["a":"b"])]).metas)  == `<meta a="b">`);
68 	}
69 
70 	DH5Link[] _links;
71 	DH5Link[] links() { return  _links; }	
72 	O links(this O)(string[string] link, string[string][] links...) { this.links([link]~links); return cast(O)this;}
73 	O links(this O)(string[string][] links) { 
74 		foreach(link; links) _links ~= H5Link(link); 
75 		return cast(O)this;}
76 
77 	O links(this O)(DH5Link[] links...) { this.links(links); return cast(O)this;}
78 	O links(this O)(DH5Link[] links) { _links ~= links; return cast(O)this;}
79 
80 	O clearLinks(this O)() { _links = null; return cast(O)this; }
81 	unittest {
82 		/// TODO
83 	}
84 
85 	DH5Style[] _styles;
86 	DH5Style[] styles() { return  _styles; }	
87 	O styles(this O)(string content, string[] contents...) { this.styles([content]~contents); return cast(O)this; } // <style>...</style>
88 	O styles(this O)(string[] links) { foreach(link; links) _styles ~= H5Style(content); return cast(O)this;}
89 
90 	O styles(this O)(string[string] link, string[string][] links...) { this.links([link]~links); return cast(O)this;}
91 	O styles(this O)(string[string][] links) { foreach(link; links) _links ~= H5Link(link); return cast(O)this;}
92 
93 	O styles(this O)(DH5Style[] styles...) { this.styles(styles); return cast(O)this;}
94 	O styles(this O)(DH5Style[] styles) { _styles ~= styles; return cast(O)this;}
95 	O styles(this O)(DH5Link[] links...) { this.styles(links); return cast(O)this;}
96 	O styles(this O)(DH5Link[] links) { _styles ~= links; return cast(O)this;}
97 
98 	O clearStyles(this O)() { _styles = null; return cast(O)this; }
99 	unittest {
100 		/// TODO
101 	}
102 
103 	DH5Script[] _scripts;
104 	DH5Script[] scripts() { return _scripts; }
105 
106 	O scripts(this O)(string newScript, string[] newScripts...) { this.scripts([newScript]~newScripts); return cast(O)this;}
107 	O scripts(this O)(string[] newScripts) { 
108 		debug writeln("In AppPAge: O scripts(this O)(string[] newScripts)");
109 		writeln("Scripts length = ", newScripts.length);
110 		_scripts ~= newScripts.map!(a => H5Script(a)).array; 
111 		return cast(O)this;}
112 
113 	O scripts(this O)(string[string] newScript, string[string][] newScripts...) { this.scripts([newScript]~newScripts); return cast(O)this;}
114 	O scripts(this O)(string[string][] newScripts) { _scripts ~= newScripts.map!(a => H5Script(a)).array; return cast(O)this;}
115 
116 	O scripts(this O)(DH5Script[] newScripts...) { this.scripts(newScripts); return cast(O)this;}
117 	O scripts(this O)(DH5Script[] newScripts) { _scripts ~= newScripts; return cast(O)this;}
118 
119 	O clearScripts(this O)() { _scripts = null; return cast(O)this; }
120 	unittest {
121 		// assert(H5AppLayout.)
122 	}
123 	
124 	/// Export to string
125 	override string toString(string[string] parameters) {
126 		// Check layout
127 		DH5AppLayout lt;
128 		if (app) lt = app.layout;
129 		if (this.layout) lt = this.layout;
130 
131 		// if layout, use layout
132 		if (lt) return this.layout.toString(this, parameters);
133 		return this.content; // No layout, only content
134 
135 		// old stuff :-(
136 /* 		// if (_layout) return _layout.toString(this.content, this.parameters);
137 		// return _content;
138 		// // debug // writeln("H5Page: override string toString()");
139 		if (cached) {
140 			// // debug // writeln("Cached");
141 			if (_toString) return _toString;
142 			if (this.content) { _toString = (this.layout ? this.layout.toString(this, this.parameters) : this.content); return _toString; }
143 		}
144 		// Not cached
145 		// // debug // writeln("Not Cached");
146 		// // debug // writeln(this.content);
147 		if (this.content) { return (this.layout ? this.layout.toString(this, this.parameters) : this.content); }
148 		return _toString;
149  */	}
150 	unittest {
151 		//// writeln(`// writeln(H5AppPage)`);
152 		//// writeln(H5AppPage);
153 	}
154 }
155  auto H5AppPage() { return new DH5AppPage(); }
156  auto H5AppPage(string aName) { return new DH5AppPage(aName); }
157  auto H5AppPage(DH5App anApp) { return new DH5AppPage(anApp); }
158  auto H5AppPage(DH5App anApp, string aName) { return new DH5AppPage(anApp, aName); }
159 
160 unittest {
161     assert(H5AppPage);
162     assert(H5AppPage("name").name() == "name");
163     assert(H5AppPage("name").name("newname").name() == "newname");
164 
165 		auto app = H5App;
166 	  assert(H5AppPage(app).app == app);
167     assert(H5AppPage(app, "name").name == "name");
168     assert(H5AppPage(app, "name").app == app);
169     assert(H5AppPage(app, "name").name("newname").name() == "newname");
170 }
171 
172 	// Get page by names
173 	 DH5AppPage pageByName(DH5AppPage[] pages, string name) {
174 		foreach(page; pages) if (page.name == name) return page;
175 		return null; }
176 	unittest {
177 /* 		assert(H5App.pages("test", "testcontent").pages.pageByName("test").name == "test");	
178 		assert(H5App.pages("test", "testcontent").pages("test2", "testcontent").pages.pageByName("test").name == "test");	
179  */	}