All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.weaverplatform.util.IndentStringBuilder Maven / Gradle / Ivy

package com.weaverplatform.util;

import java.util.ArrayList;
import java.util.Iterator;

public class IndentStringBuilder {

  public interface Serializable {
    void buildString(IndentStringBuilder builder);
  }

  private final StringBuilder builder = new StringBuilder();

  private int level = 0;

  private final String indention = "  ";

  private final String newline = "\n";

  private final char[] trimmable = new char[]{' ', '\n', '\t', '\r'};

  private ArrayList list = null;

  public void append(String str) {
    builder.append(str);
  }

  public void appendLine(String str) {
    appendLine(str, 0);
  }

  public void appendLine(String str, int increase) {
    builder.append(str);
    newline(increase);
  }

  public void appendJoin(String delimiter, Iterator iterator) {
    appendJoin(delimiter, false, iterator);
  }

  public void appendJoin(String delimiter, boolean newline, Iterator iterator) {
    while(iterator.hasNext()) {
      Object next = iterator.next();
      if(next instanceof IndentStringBuilder.Serializable) {
        ((IndentStringBuilder.Serializable)next).buildString(this);
      } else {
        append(next.toString());
      }
      if(iterator.hasNext()) {
        append(delimiter);
        if(newline) {
          newline();
        }
      }
    }
  }

  public void newline() {
    newline(0);
  }

  public void newline(int increase) {
    builder.append(newline);
    updateLevel(increase);
    indent(level);
  }

  public void updateLevel(int increase) {
    level = Math.max(0, level + increase);
  }

  private void indent(int count) {
    while(count-- > 0) {
      builder.append(indention);
    }
  }

  public void retract() {
    while(builder.length() != 0) {
      boolean didDelete = false;
      for(char trim : trimmable) {
        if(trim == builder.charAt(builder.length() - 1)) {
          didDelete = true;
          builder.deleteCharAt(builder.length() - 1);
          break;
        }
      }
      if(!didDelete) {
        return;
      }
    }
  }

  public void recordList() {
    if(list != null) {
      throw new RuntimeException("Can not start list when already recording, first cancelList() or appendList().");
    }
    list = new ArrayList<>();
  }

  public void appendListItem(String item) {
    if(list == null) {
      throw new RuntimeException("First call recordList().");
    }
    list.add(item);
  }

  public void appendList(String delimiter, boolean newline) {
    if(list == null) {
      throw new RuntimeException("First call recordList().");
    }
    appendJoin(delimiter, newline, list.iterator());
    list = null;
  }

  public void cancelList() {
    list = null;
  }

  public int listSize() {
    if(list == null) {
      return 0;
    }
    return list.size();
  }

  @Override
  public String toString() {
    return builder.toString();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy