import java.util.Map; import java.util.function.Function; import java.util.function.BiFunction; import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.*; public class Html { private HtmlTag tag; private String body; private Map attrs; private Html(HtmlTag tag, String body) { this.tag = tag; this.body = body; attrs = new HashMap<>(); } public static Html html(HtmlTag tag, Html... body) { return new Html(tag, Arrays.asList(body).stream().map(Html::toString).collect(Collectors.joining())); } public static Html str(HtmlTag tag, String body) { return new Html(tag, body); } public Html addAttr(String key, String value) { attrs.put(key, value); return this; } @Override public String toString() { String attr = attrs.entrySet().stream().map((e) -> e.getKey() + "=\"" + e.getValue() + "\"").collect(Collectors.joining(" ")); return String.format("<%s %s>%s", tag, attr, body); } public static Function, Html> mkList = (s) -> html(HtmlTag.UL, s.map((li) -> str(HtmlTag.LI, li)).toArray(Html[]::new)); public static final Html index = str(HtmlTag.P, "Hello World!"); }