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 */ }