<commit_before>/**
 * java utilites © darkslave.net
 * https://github.com/darkslave86/util
 */
package net.darkslave.util;


import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;





public class Misc {
    public static final String   EMPTY_STRING = "";
    public static final String[] EMPTY_STRING_ARRAY = new String[0];

    private static final String  SPACE_CHARS = "\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u200B\\u202F\\u205F\\u3000\\uFEFF";
    private static final Pattern TRIM_SPACES = Pattern.compile("^[" + SPACE_CHARS + "]+|[" + SPACE_CHARS + "]+$");

    private static final String  MARKER_BEGIN = "{{";
    private static final String  MARKER_CLOSE = "}}";



    /**
     * Получить строку по шаблону
     *
     * @param source - шаблон
     * @param params - параметры
     * @return строка
     */
    public static String template(String source, Map<String, ?> params) {
        StringBuilder result = new StringBuilder(source.length());
        int index = 0;

        while (true) {
            int begin = source.indexOf(MARKER_BEGIN, index);
            int close = source.indexOf(MARKER_CLOSE, begin);

            if (begin < 0 || close < 0) {
                result.append(source.substring(index));
                break;
            }

            String key = source.substring(begin + MARKER_BEGIN.length(), close);
            Object val = params.get(key);

            if (val != null) {
                result.append(source.substring(index, begin));
                result.append(val);
            } else {
                result.append(source.substring(index, close + MARKER_CLOSE.length()));
            }

            index = close + MARKER_CLOSE.length();
        }

        return result.toString();
    }



    /**
     * Получить строковое представление или пустую строку, если null
     *
     * @param source - исходный объект
     * @return строка
     */
    public static String toString(Object source) {
        return source != null ? source.toString() : EMPTY_STRING;
    }


    /**
     * Удалить все пробельные символы из начала и конца строки
     *
     * @param source - исходная строка
     * @return строка
     */
    public static String trim(CharSequence source) {
        return TRIM_SPACES.matcher(source).replaceAll(EMPTY_STRING);
    }

<commit_msg>Misc.template<commit_after>/**
 * java utilites © darkslave.net
 * https://github.com/darkslave86/util
 */
package net.darkslave.util;


import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;





public class Misc {
    public static final String   EMPTY_STRING = "";
    public static final String[] EMPTY_STRING_ARRAY = new String[0];

    private static final String  SPACE_CHARS = "\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u200B\\u202F\\u205F\\u3000\\uFEFF";
    private static final Pattern TRIM_SPACES = Pattern.compile("^[" + SPACE_CHARS + "]+|[" + SPACE_CHARS + "]+$");

    private static final String  MARKER_BEGIN = "{{";
    private static final String  MARKER_CLOSE = "}}";
    private static final int     MARKER_BEGIN_LENGTH = MARKER_BEGIN.length();
    private static final int     MARKER_CLOSE_LENGTH = MARKER_CLOSE.length();


    /**
     * Интерфейс разборщика шаблона на основе хэш-таблицы
     */
    public static class MapResolver implements Resolver {
        private final Map<?, ?> delegate;

        public MapResolver(Map<?, ?> delegate) {
            if (delegate == null)
                throw new IllegalArgumentException("Parameter can't be null");
            this.delegate = delegate;
        }

        @Override
        public Object get(String key) {
            return delegate.get(key);
        }

    }


    /**
     * Интерфейс разборщика шаблона
     */
    public static interface Resolver {
        Object get(String key);
    }


    /**
     * Получить строку по шаблону
     *
     * @param source - шаблон
     * @param params - параметры
     * @return строка
     */
    public static String template(String source, Map<String, ?> params) {
        return template(source, new MapResolver(params));
    }


    /**
     * Получить строку по шаблону
     *
     * @param source   - шаблон
     * @param resolver - разборщик шаблона
     * @return строка
     */
    public static String template(String source, Resolver resolver) {
        StringBuilder result = new StringBuilder(source.length());
        int index = 0;

        while (true) {
            int begin = source.indexOf(MARKER_BEGIN, index);
            int close = source.indexOf(MARKER_CLOSE, begin);

            if (begin < 0 || close < 0) {
                result.append(source.substring(index));
                break;
            }

            String key = source.substring(begin + MARKER_BEGIN_LENGTH, close);
            Object val = resolver.get(key);

            if (val != null) {
                result.append(source.substring(index, begin));
                result.append(val);
            } else {
                result.append(source.substring(index, close + MARKER_CLOSE_LENGTH));
            }

            index = close + MARKER_CLOSE_LENGTH;
        }

        return result.toString();
    }




    /**
     * Получить строковое представление или пустую строку, если null
     *
     * @param source - исходный объект
     * @return строка
     */
    public static String toString(Object source) {
        return source != null ? source.toString() : EMPTY_STRING;
    }


    /**
     * Удалить все пробельные символы из начала и конца строки
     *
     * @param source - исходная строка
     * @return строка
     */
    public static String trim(CharSequence source) {
        return TRIM_SPACES.matcher(source).replaceAll(EMPTY_STRING);
    }


{'fraction_non_alphanumeric': 0.11408, 'fraction_numerical': 0.0256, 'mean_word_length': 2.257425742574257, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 7, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3942937', 'n_tokens_mistral': 2074, 'n_tokens_neox': 1941, 'n_words': 437}