public class Main {
public static void main
(String args
[]) { Page page = new Page();
writeBody(page);
page.show();
}
static void writeBody(Page page) {
try (BodyTag bodyTag = new BodyTag(page)) {
writeText(page);
writeList(page);
}
}
static void writeText(Page page) {
try (StrongTag strongTag = new StrongTag(page)) {
strongTag.append(" some text ");
}
}
static void writeList(Page page) {
try (ListTag list = new ListTag(page)) {
// A twisted way to write a, b and c as elements
for (char c=97; c<100; ++c) {
appendElem
(page,
String.
valueOf(c
)); }
}
}
static void appendElem
(Page page,
String elem
) { try (ListElem li = new ListElem(page)) {
li.append(elem);
}
}
}
class Page {
StringBuilder content = new StringBuilder();
content.append(text);
}
void show() {
}
}
abstract class Tag implements AutoCloseable {
Page content;
Tag
(Page parent,
String tagName
) { name = tagName;
content = parent;
content.append("<");
content.append(name);
content.append(">");
}
public void append
(String text
) { content.append(text);
}
@Override
final public void close() {
content.append("</");
content.append(name);
content.append(">");
}
}
final class StrongTag extends Tag {
public StrongTag(Page parent) {
super(parent, "strong");
}
}
final class BodyTag extends Tag {
public BodyTag(Page parent) {
super(parent, "body");
}
}
final class ListTag extends Tag {
public ListTag(Page parent) {
super(parent, "ol");
}
}
final class ListElem extends Tag {
public ListElem(Page parent) {
super(parent, "li");
}
}
CgogICAgcHVibGljIGNsYXNzIE1haW4gewogICAgICAgIAogICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKICAgICAgICAgICAgUGFnZSBwYWdlID0gbmV3IFBhZ2UoKTsKICAgICAgICAgICAgd3JpdGVCb2R5KHBhZ2UpOwogICAgICAgICAgICBwYWdlLnNob3coKTsKICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHN0YXRpYyB2b2lkIHdyaXRlQm9keShQYWdlIHBhZ2UpIHsKICAgICAgICAgICAgdHJ5IChCb2R5VGFnIGJvZHlUYWcgPSBuZXcgQm9keVRhZyhwYWdlKSkgewogICAgICAgICAgICAgICAgd3JpdGVUZXh0KHBhZ2UpOwogICAgICAgICAgICAgICAgd3JpdGVMaXN0KHBhZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBzdGF0aWMgdm9pZCB3cml0ZVRleHQoUGFnZSBwYWdlKSB7CiAgICAgICAgICAgIHRyeSAoU3Ryb25nVGFnIHN0cm9uZ1RhZyA9IG5ldyBTdHJvbmdUYWcocGFnZSkpIHsKICAgICAgICAgICAgICAgIHN0cm9uZ1RhZy5hcHBlbmQoIiBzb21lIHRleHQgIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc3RhdGljIHZvaWQgd3JpdGVMaXN0KFBhZ2UgcGFnZSkgewogICAgICAgICAgICB0cnkgKExpc3RUYWcgbGlzdCA9IG5ldyBMaXN0VGFnKHBhZ2UpKSB7CiAgICAgICAgICAgICAgICAvLyBBIHR3aXN0ZWQgd2F5IHRvIHdyaXRlIGEsIGIgYW5kIGMgYXMgZWxlbWVudHMKICAgICAgICAgICAgICAgIGZvciAoY2hhciBjPTk3OyBjPDEwMDsgKytjKSB7CiAgICAgICAgICAgICAgICAgICAgYXBwZW5kRWxlbShwYWdlLCBTdHJpbmcudmFsdWVPZihjKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAKICAgICAgICBzdGF0aWMgdm9pZCBhcHBlbmRFbGVtKFBhZ2UgcGFnZSwgU3RyaW5nIGVsZW0pIHsKICAgICAgICAgICAgdHJ5IChMaXN0RWxlbSBsaSA9IG5ldyBMaXN0RWxlbShwYWdlKSkgewogICAgICAgICAgICAgICAgbGkuYXBwZW5kKGVsZW0pOwogICAgICAgICAgICB9ICAgICAgICAKICAgICAgICB9CiAgICB9CiAgICAKICAgIGNsYXNzIFBhZ2UgewogICAgICAgIAogICAgICAgIFN0cmluZ0J1aWxkZXIgY29udGVudCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgCiAgICAgICAgdm9pZCBhcHBlbmQoU3RyaW5nIHRleHQpIHsKICAgICAgICAgICAgY29udGVudC5hcHBlbmQodGV4dCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHZvaWQgc2hvdygpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNvbnRlbnQpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgYWJzdHJhY3QgY2xhc3MgVGFnIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZSB7CiAgICAgICAgCiAgICAgICAgU3RyaW5nIG5hbWU7CiAgICAgICAgUGFnZSBjb250ZW50OwogICAgICAgIAogICAgICAgIFRhZyhQYWdlIHBhcmVudCwgU3RyaW5nIHRhZ05hbWUpIHsKICAgICAgICAgICAgbmFtZSA9IHRhZ05hbWU7CiAgICAgICAgICAgIGNvbnRlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgIGNvbnRlbnQuYXBwZW5kKCI8Iik7CiAgICAgICAgICAgIGNvbnRlbnQuYXBwZW5kKG5hbWUpOwogICAgICAgICAgICBjb250ZW50LmFwcGVuZCgiPiIpOyAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHB1YmxpYyB2b2lkIGFwcGVuZChTdHJpbmcgdGV4dCkgewogICAgICAgICAgICBjb250ZW50LmFwcGVuZCh0ZXh0KTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgZmluYWwgcHVibGljIHZvaWQgY2xvc2UoKSB7CiAgICAgICAgICAgIGNvbnRlbnQuYXBwZW5kKCI8LyIpOwogICAgICAgICAgICBjb250ZW50LmFwcGVuZChuYW1lKTsKICAgICAgICAgICAgY29udGVudC5hcHBlbmQoIj4iKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGZpbmFsIGNsYXNzIFN0cm9uZ1RhZyBleHRlbmRzIFRhZyB7CiAgICAKICAgICAgICBwdWJsaWMgU3Ryb25nVGFnKFBhZ2UgcGFyZW50KSB7CiAgICAgICAgICAgIHN1cGVyKHBhcmVudCwgInN0cm9uZyIpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZmluYWwgY2xhc3MgQm9keVRhZyBleHRlbmRzIFRhZyB7CiAgICAKICAgICAgICBwdWJsaWMgQm9keVRhZyhQYWdlIHBhcmVudCkgewogICAgICAgICAgICBzdXBlcihwYXJlbnQsICJib2R5Iik7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmaW5hbCBjbGFzcyBMaXN0VGFnIGV4dGVuZHMgVGFnIHsKICAgICAgICAKICAgICAgICBwdWJsaWMgTGlzdFRhZyhQYWdlIHBhcmVudCkgewogICAgICAgICAgICBzdXBlcihwYXJlbnQsICJvbCIpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZmluYWwgY2xhc3MgTGlzdEVsZW0gZXh0ZW5kcyBUYWcgewogICAgICAgIAogICAgICAgIHB1YmxpYyBMaXN0RWxlbShQYWdlIHBhcmVudCkgewogICAgICAgICAgICBzdXBlcihwYXJlbnQsICJsaSIpOwogICAgICAgIH0KICAgIH0KICAgIA==