package scrum.client.wiki; import java.util.ArrayList; import java.util.List; public class Toc extends AWikiElement { private WikiModel model; public Toc(WikiModel model) { super(); this.model = model; } @Override String toHtml(HtmlContext context) { List<Header> headers = new ArrayList<Header>(); for (AWikiElement element : model.getElements()) { appendHeaders(headers, element); } if (headers.isEmpty()) return ""; StringBuilder sb = new StringBuilder(); sb.append("<ul class=\"toc\">"); int currentDepth = 1; for (Header h : headers) { int depth = h.getDepth(); int diff = depth - currentDepth; for (int i = 0; i < diff; i++) { sb.append("<ul>"); } for (int i = diff; i < 0; i++) { sb.append("</ul>"); } currentDepth = depth; sb.append("<li>"); sb.append(escapeHtml(h.getText())); sb.append("</li>"); } while (currentDepth > 1) { sb.append("</ul>"); currentDepth--; } sb.append("</ul>"); return sb.toString(); } private void appendHeaders(List<Header> headers, AWikiElement element) { if (element instanceof Paragraph) { Paragraph p = (Paragraph) element; for (AWikiElement e : p.getElements()) { appendHeaders(headers, e); } return; } if (element instanceof Header) headers.add((Header) element); } @Override public String toString() { return "Toc"; } }