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);
}

あんまり面白くない感じになりました。