package ru.noties.markwon.html;
import android.support.annotation.NonNull;
import static ru.noties.markwon.html.AppendableUtils.appendQuietly;
abstract class TrimmingAppender {
abstract void append(
@NonNull T output,
@NonNull String data
);
@NonNull
static TrimmingAppender create() {
return new Impl();
}
static class Impl extends TrimmingAppender {
// if data is fully empty (consists of white spaces) -> do not add anything
// leading ws:
// - trim to one space (if at all present) append to output only if previous is ws
// trailing ws:
// - if present trim to single space
@Override
void append(
@NonNull T output,
@NonNull String data
) {
final int startLength = output.length();
char c;
boolean previousIsWhiteSpace = false;
for (int i = 0, length = data.length(); i < length; i++) {
c = data.charAt(i);
if (Character.isWhitespace(c)) {
previousIsWhiteSpace = true;
continue;
}
if (previousIsWhiteSpace) {
// validate that output has ws as last char
final int outputLength = output.length();
if (outputLength > 0
&& !Character.isWhitespace(output.charAt(outputLength - 1))) {
appendQuietly(output, ' ');
}
}
previousIsWhiteSpace = false;
appendQuietly(output, c);
}
// additionally check if previousIsWhiteSpace is true (if data ended with ws)
// BUT only if we have added something (otherwise the whole data is empty (white))
if (previousIsWhiteSpace && (startLength < output.length())) {
appendQuietly(output, ' ');
}
}
}
}