DでHTML MPL編 その後
若干弄りました。
const bool inline = true; template Tag(char[] name, bool isInline = false){ template Text(char[] str = ""){ static if (isInline) const char[] Text = "<" ~ name ~ ">" ~ str ~ "</" ~ name ~ ">\n"; else const char[] Text = "<" ~ name ~ ">\n" ~ nest!(str) ~ "</" ~ name ~ ">\n"; } template Text(char[] param, char[] str = ""){ static if (isInline) const char[] Text = "<" ~ name ~ param ~ ">" ~ str ~ "</" ~ name ~ ">\n"; else const char[] Text = "<" ~ name ~ param ~ ">\n" ~ nest!(str) ~ "</" ~ name ~ ">\n"; } } // if you want to more parameter, you must define yourself or give up X-D template Param( char[] p0, char[] p1 = "", char[] p2 = "" ){ static if (p0.length == 0) const char[] Param = ""; else static if (p1.length == 0) const char[] Param = set!(p0); else static if (p2.length == 0) const char[] Param = set!(p0) ~ set!(p1); else const char[] Param = set!(p0) ~ set!(p1) ~ set!(p2); } template nest(char[] s, int i = 0){ static if (s.length == 0){ const char[] nest = ""; } else static if (s.length-1 == i){ static if (s[i] == '\n'){ const char[] nest = s; } else { const char[] nest = s ~ '\n'; } } else static if (i == 0){ const char[] nest = nest!(" " ~ s, i+5); } else static if (s[i] == '\n'){ const char[] nest = nest!(s[0 .. i+1] ~ " " ~ s[i+1 .. length], i+5); } else { const char[] nest = nest!(s, i+1); } } template set(char[] s, int i = 0){ static if (s[i] == '=') const char[] set = ' ' ~ s[0 .. i] ~ "=\"" ~ s[i+1 .. length] ~ '"'; else static if (s.length-1 == i) const char[] set = ' ' ~ s; else const char[] set = set!(s, i+1); } alias Tag!("html").Text html; alias Tag!("head").Text head; alias Tag!("title", inline).Text title; alias Tag!("body").Text body_; alias Tag!("H1", inline).Text H1; void main(){ char[] s = html!( head!( title!("test") ~ body_!( H1!("hoge") ~ H1!(Param!("color=red", "size=3"), "hoge-") ) ) ); printf("%.*s", s); }
あんまり面白くない感じになりました。