DでHTML
すごい先を越されましたが、似たことをしていました。面白さとか色んな要素で負けまくりです。
大体Rubyのcgi.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ぐらいかっこよく書ければいいんですが。
属性は[ ]に書かせるほうがいいかなあまあいいか…使わないし。
追記:読みづらくしました弄りました
追追記:分かりやすくなりました