Создание массива из строки по ширине

Функция возвращает массив строк с заданной максимальной шириной, кастомные переносы и опциональная разбивка по словам.
  1. class Main {
  2.  
  3.     static function main() {
  4.         var text = "Два друга, поднимаясь в горы, застряли на вершине из-за бурана.\nИсикура при подъеме получил ранение и, думая, что умирает, рассказал Асаи свою самую страшную тайну.\n\n";
  5.         var lines = parseText(text, 300, true);
  6.         for (line in lines) trace(line);
  7.  
  8.         var text = "Но рядом оказалось убежище и, добравшись до туда, они смогли вызвать помощь. Буран не прекращался, и теперь они вдвоем в пустом доме должны ждать спасение.\n\nУ Исикуры есть шанс выжить. Есть ли он у Асаи?";
  9.         var lines = parseText(text, 200, false);
  10.         for (line in lines) trace(line);
  11.     }
  12.  
  13.     static function parseText(text:String, width:Float, wordWrap:Bool):Array<String> {
  14.         var lines:Array<String> = [];
  15.         var lastChance = -1;
  16.         var lastBreak = 0;
  17.         var i = 0;
  18.  
  19.         while (i < text.length) {
  20.             var line = text.substring(lastBreak, i + 1);
  21.             var w = line.length * 10; //достаточно заменить на получение длины строки в пикселях
  22.             if (w > width) {
  23.                 if (lastChance < 0 || !wordWrap) lastChance = i - 1;
  24.                 lines.push(text.substring(lastBreak, lastChance + 1));
  25.                 i = lastBreak = lastChance + 1;
  26.                 lastChance = -1;
  27.             }
  28.  
  29.             var char = text.substring(i, i + 1);
  30.             if (char == " ") lastChance = i;
  31.             else if (char == "\n") {
  32.                 lines.push(text.substring(lastBreak, i + 1));
  33.                 lastBreak = i + 1;
  34.                 lastChance = -1;
  35.             }
  36.             i++;
  37.         }
  38.         var end = text.substring(lastBreak);
  39.         if (end != "" && end != " ") lines.push(end);
  40.         return lines;
  41.     }
  42.  
  43. }
Исходник/результат при исполнении в консоли: https://try.haxe.org/#D314F989

Реклама

Мы в соцсетях

tw tg yt gt