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, ' ');
            }
        }
    }
}