DでHTML

すごい先を越されましたが、似たことをしていました。面白さとか色んな要素で負けまくりです。
大体Rubycgi.rbのアレです。

import std.string;

const bool inline = true;

abstract class TagBase{
    static char[] nest(char[] str){
        char[] ret;
        foreach (s ;split(chomp(str), "\n")){
            ret ~= "    " ~ s ~ "\n";
        }
        return ret;
    }
}

class Tag(char[] name, bool isInline = false) : TagBase{
    static Tag_!(name, isInline) opIndex(char[] attr_name, char[] attr_para = ""){
        auto t = new Tag_!(name, isInline);
        t.attr = ' ' ~ attr_name;
        if (attr_para.length > 0){
            t.attr ~= "=\"" ~ attr_para ~ '"';
        }
        return t;
    }

    static char[] opCall(char[][] strs ...){
        char[] s;
        foreach (s_; strs){
            s ~= s_;
        }
        return "<" ~ name ~ (isInline ? ">" ~ s : ">\n" ~ nest(s)) ~ "</" ~ name ~ ">\n";
    }
}

class Tag_(char[] name, bool isInline = false) : TagBase{
    char[] attr;

    Tag_!(name, isInline) opIndex(char[] attr_name, char[] attr_para = ""){
        attr ~= ' ' ~ attr_name;
        if (attr_para.length > 0){
            attr ~= "=\"" ~ attr_para ~ '"';
        }
        return this;
    }

    char[] opCall(char[][] strs ...){
        char[] s;
        foreach (s_; strs){
            s ~= s_;
        }
        return "<" ~ name ~ attr ~ (isInline ? ">" ~ s : ">\n" ~ nest(s)) ~ "</" ~ name ~ ">\n";
    }
}

alias Tag!("html") html;
alias Tag!("head") head;
alias Tag!("title", inline) title;
alias Tag!("body") body_;
alias Tag!("H1", inline) H1;
alias Tag!("H2", inline) H2;

void main(){
    char[] s = 
    html(
        head(
            title(
                "test"
            ),
            body_(
                H1(
                    "hoge"
                ),
                H2["color", "red"]["size", "5"](
                    "hige!"
                )
            )
        )
    );
    printf("%.*s", s);
}

出力。

<html>
    <head>
        <title>test</title>
        <body>
            <H1>hoge</H1>
            <H2 color="red" size="3">hige!</H2>
        </body>
    </head>
</html>

まあそんなに便利なものでもないし、そんながんばって作らなくてもいいよね、という感じの実装です。
IOぐらいかっこよく書ければいいんですが。
属性は[ ]に書かせるほうがいいかなあまあいいか…使わないし。
追記:読みづらくしました弄りました
追追記:分かりやすくなりました