package net.rubygrapefruit.docs.model.buildable; import net.rubygrapefruit.docs.model.*; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class BuildableInlineContainer implements InlineContainer { private final List<BuildableInline> contents = new ArrayList<BuildableInline>(); private BuildableText text; private boolean needWhitespace; @Override public String toString() { return String.format("[%s text:%s]", getTypeName(), getText()); } protected String getTypeName() { return getClass().getSimpleName().replaceFirst("^Buildable", "").toLowerCase(); } public void finish() { ListIterator<BuildableInline> iter = contents.listIterator(); while (iter.hasNext()) { BuildableInline inline = iter.next(); if (inline instanceof UnresolvedLink) { iter.remove(); iter.add(((UnresolvedLink) inline).resolve()); } else { inline.finish(); } } } public String getText() { StringBuilder builder = new StringBuilder(); for (Inline content : getContents()) { builder.append(content.getText()); } return builder.toString(); } public boolean isEmpty() { return contents.isEmpty(); } public void moveContentsTo(BuildableInlineContainer target) { for (BuildableInline element : contents) { target.add(element); } contents.clear(); } public BuildableInlineContainer append(CharSequence src) { boolean isFirstElement = contents.isEmpty(); int pos = 0; while (pos < src.length()) { char ch = src.charAt(pos); if (!Character.isWhitespace(ch)) { if (text == null) { text = new BuildableText(); contents.add(text); } if (needWhitespace) { text.append(' '); needWhitespace = false; } text.append(ch); pos++; } else { int end = pos + 1; while (end < src.length() && Character.isWhitespace(src.charAt(end))) { end++; } if (!isFirstElement || pos > 0) { needWhitespace = true; } pos = end; } } if (isFirstElement && text == null) { needWhitespace = false; } return this; } protected <T extends BuildableInline> T add(T element) { if (needWhitespace) { if (text == null) { text = new BuildableText(); contents.add(text); } text.append(' '); needWhitespace = false; } text = null; contents.add(element); return element; } public net.rubygrapefruit.docs.model.Error addError(String message) { return add(new BuildableErrorElement(message)); } public List<? extends Inline> getContents() { return contents; } public BuildableCode addCode() { return add(new BuildableCode()); } public BuildableLiteral addLiteral() { return add(new BuildableLiteral()); } public BuildableEmphasis addEmphasis() { return add(new BuildableEmphasis()); } public BuildableClassName addClassName() { return add(new BuildableClassName()); } public BuildableInlineContainer addCrossReference(LinkResolver resolver) { return add(new UnresolvedLink(resolver)); } }