module examples.common.splittext; import std.conv : to; import std.uni : isWhite; import std.array : split; import std.stdio : writeln; private dstring[] splitText(string[] text, size_t length = 50) { // Инициализация массива для хранения результата dstring[] result; // Перебор каждой строки входного текста foreach (line; text) { // Преобразование строки в dstring для поддержки Unicode dstring lineD = line.to!dstring; // Разделение строки на слова по пробелам dstring[] words = lineD.split(); // Если строка пустая или содержит только пробелы, добавляем пустую строку if (!words.length) { result ~= ""; continue; } // Инициализация текущей строки для сборки результата dstring currentLine; // Проверка, начинается ли строка с пробела, и добавление пробела к первому слову if (isWhite(lineD[0])) { words[0] = ' ' ~ words[0]; } // Перебор всех слов в строке foreach (idx, word; words) { // Если слово длиннее максимальной длины строки if (word.length > length) { // Начальная позиция для разбиения слова size_t start = 0; // Разбиение длинного слова на части while (start < word.length) { // Вычисление конца текущего фрагмента слова size_t end = start + length; if (end > word.length) end = word.length; // Если добавление фрагмента превысит длину строки if (currentLine.length + (end - start) > length) { // Сохраняем текущую строку и начинаем новую с фрагмента слова result ~= currentLine; currentLine = word[start .. end]; } else { // Добавляем пробел, если текущая строка не пуста if (currentLine.length) { currentLine ~= " "; } // Добавляем фрагмент слова к текущей строке currentLine ~= word[start .. end]; } // Сдвигаем начальную позицию для следующего фрагмента start += length; } } else { // Если добавление слова (и пробела, если нужно) превысит длину строки if (currentLine.length + word.length + (currentLine.length ? 1 : 0) > length) { // Сохраняем текущую строку и начинаем новую со слова result ~= currentLine; currentLine = word; } else { // Добавляем пробел, если текущая строка не пуста if (currentLine.length) { currentLine ~= ' '; } // Добавляем слово к текущей строке currentLine ~= word; } } } // Если текущая строка не пуста, добавляем её в результат if (currentLine.length) { result ~= currentLine; } } // Возвращаем массив строк с учётом ограничения длины return result; } void formatLines() { auto lines = [" Hello world this is a very long line", " Another line"]; foreach (line; splitText(lines, 10)) { writeln(line); } }