Добавление модуля форматирования строк splittext

This commit is contained in:
Alexander Zhirov 2025-05-15 22:54:05 +03:00
parent e753c86eb9
commit 2b7cc25396
Signed by: alexander
GPG key ID: C8D8BE544A27C511
6 changed files with 103 additions and 1 deletions

View file

@ -1,5 +1,9 @@
# Общего назначения
## splittext
Функция `splitText` форматирует массив строк, разбивая их на строки длиной не более `length` (по умолчанию 50 символов). Преобразует входные строки в `dstring` (UTF-32), разбивает их на слова и обрабатывает каждое слово. Если слово длиннее `length`, оно разбивается на части. Сохраняет один пробел в начале строки, если она начинается с пробельного символа, и добавляет пробелы между словами. Пустые строки добавляются в результат без изменений. Возвращает массив отформатированных строк `dstring[]`. Использует модули `std.conv`, `std.string`, `std.uni`.
## isexists
Функция `isExecutableExists` проверяет наличие исполняемого файла `appName` в директориях, указанных в переменной окружения `PATH`. Разбивает `PATH` на директории, формирует полный путь к файлу и проверяет его существование и тип (файл). Возвращает `true`, если файл найден, иначе `false`. Использует модули `std.process`, `std.file`, `std.path`, `std.array`.

View file

@ -1,3 +1,4 @@
module examples.common;
public import examples.common.isexists;
public import examples.common.splittext;

View file

@ -0,0 +1,93 @@
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);
}
}