Как отформатировать текст в несколько строк в JavaScript - PullRequest
0 голосов
/ 07 декабря 2018

что я пытаюсь сделать, это иметь текстовое поле с определенной длиной строки без разрезания слов пополам.в данный момент я пытаюсь разрезать текст на строки длиной n, а затем пытаюсь восстановить слова, зная, когда будет следующий пробел.это то, что у меня есть в данный момент, но оно не работает полностью и исправляет только некоторые слова

function TextBox(length,text){
  array = [];
  test = /[A-Za-z]+/g;
  //cutting the text up
  for (i= 0;i < Math.ceil(text.length / length); i ++){
    array.push(text.slice(i * length,Math.min((i + 1) * length,text.length)));
  }
  //in case it ruins the lines the first time round
  for (z = 0; z < 3; z++){
    //reformatting the code
    for (i = 0; i < array.length - 1; i ++){
      if (test.test(array[i][array[i].length - 1])){
        array[i] += array[i+1].substr(0,array[i+1].indexOf(' ') + 1);
        array[i + 1] = array[i + 1].substr(array[i + 1].indexOf(' ') + 1);
      }
    }
  }
  //for debugging
  console.log(array);
}
TextBox(5,"i like to eat cheese when I am hungry");

РЕДАКТИРОВАТЬ, например, ввод: «Я люблю есть сыр, когда я голоден» иЯ хочу что-то вроде: [«мне нравится», «есть», «сыр», «когда я», «голоден»], что я выхожу прямо сейчас, это: [«мне нравится», «к»,«ешь с», обратите внимание на «с» из сыра «гуси», «когда», «я», «повешен», «ry»] и «ry» из голодных

с длиной строкиоколо n (5 в этом примере) символов.

Я попытался добавить и удалить дополнительный цикл for, но, насколько я могу судить, он помогает отформатировать его.

, если вы знаете, что яя делаю не так, или более простой способ сделать это было бы здорово.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Вот еще один дубль, использующий только Array split() и .reduce()

function TextBox(length,text){
  var array = [];  
  
  text.split(' ').reduce(function(prev, cur) {
    var next = [prev, cur].join(' ').trim();
    
    if (next.length <= length) {
    	return next;
    } else {
    	array.push(next);
    	return '';
    }
  });   
  
  console.log(array);
}

TextBox(5, 'i like to eat cheese when I am hungry');

TextBox(8, 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum')
0 голосов
/ 07 декабря 2018

Одним из вариантов будет создание регулярного выражения, которое чередуется между 5 символами, 4 символами или 7 символами и т. Д .:

.....   // 5 characters
....    // 4 characters
......  // 6 characters
...     // 3 characters
....... // 7 characters

И перед этими чередованиями стоит

(?! )

чтобы гарантировать, что совпавшая строка не начинается с пробела, и завершить чередования

(?= |$)

, чтобы гарантировать, что совпадение заканчивается непосредственно перед пробелом (или концом строки).

Затем все, что вам нужно сделать, это выполнить шаблон .match на входе:

function TextBox(length,text){
   const alternations = Array.from(
     { length: length * 2 - 1 },
     (_, i) => {
       const charCount = i % 2 === 0
       ? length - i / 2
       : length + (i - 1) / 2 + 1;
       return '.'.repeat(charCount);
     }
   );
   // in case none of the above alternations matched, lazy-match characters
   // until coming to a character followed by a space or the end of the string:
   alternations.push('.+?');

   const pattern = new RegExp('(?! )(?:' + alternations.join('|') + ')(?= |$)', 'g');
   console.log(pattern);
   return text.match(pattern);
}
console.log(TextBox(5,"i like to eat cheese when I am hungry"));
console.log(TextBox(8,"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...