Javascript для уменьшения разрывов строк до двух?

#javascript #line-breaks

#javascript #разрывы строк

Вопрос:

Я использую следующий javascript:

    if (theSelection)
   {
      for (var i = 0, l = theSelection.length; i < l; i  )
      {
         if (theSelection[i] == '[' amp;amp; theSelection[i 1] == 'q') level  ; 
         if (theSelection[i-6] == 'q' amp;amp; theSelection[i-7] == '/' amp;amp; theSelection[i-8] == '[') level--;
         if (level<1) tmp.push(theSelection[i]);
      }
      theSelection = tmp.join('');
   }
  

… чтобы удалить вложенные кавычки из текста перед его отправкой в окно ответа, но вместо удаленных вложенных кавычек остаются разрывы строк. Так, например, если я процитирую сообщение от пользователя 1, в котором говорится…

 Text.

[quote="User 2"]Quote text.[/quote]

More text.
  

Он отображается в окне ответа как…

 [quote="User 1"]Text.



More text.[/quote]
  

Что бы я добавил к этому javascript, чтобы либо удалить этот пробел, либо ограничить пространство между новыми строками всего двумя разрывами строк, чтобы окончательный текст, отображаемый в окне ответа, отображался как:

 [quote="User 1"]Text.

More text.[/quote]
  

Спасибо за любую помощь.

Редактировать:

Вот большая часть кода:

 if (theSelection)
{
    for (var i = 0, l = theSelection.length; i < l; i  )
    {
        if (theSelection[i] == '[' amp;amp; theSelection[i 1] == 'q') level  ; 
        if (theSelection[i-6] == 'q' amp;amp; theSelection[i-7] == '/' amp;amp; theSelection[i-8] == '[') level--;
        if (level<1) tmp.push(theSelection[i]);
    }
    theSelection = tmp.join('');
}

if (theSelection)
{
    if (bbcodeEnabled)
    {
        insert_text('[quote="'   username   '"]'   'n'   'n'   theSelection   '[/quote]'   'n'   'n');
    }
        else
        {
            insert_text(username   ' '   l_wrote   ':'   'n');
            var lines = split_lines(theSelection);
            for (i = 0; i < lines.length; i  )
            {
                insert_text('> '   lines[i]   'n');
            }
        }
}
  

Я разместил…

 if (theSelection)
{
    theSelection = theSelection.replace(/n{2,}/g, "nn");
}
  

… между двумя существующими операторами «if (theSelection)», и это отлично сработало. Однако остается одна проблема. Удаление вложенных кавычек происходит до того, как текст, заключенный в кавычки, помещается в его собственные теги кавычек, а два разрыва строки добавляются после открывающего тега кавычек. Итак, если цитируемое сообщение содержало вложенную цитату перед любым исходным текстом, то текст, который генерирует приведенный выше код, имеет четыре разрыва строки при открытии вместо предполагаемых двух. Поэтому я думаю, что мне нужно будет разместить…

 if (theSelection)
{
    theSelection = theSelection.replace(/n{2,}/g, "nn");
}
  

после того, как theSelection вставляется в свои собственные теги кавычек, в этот момент «if (theSelection)», похоже, больше не работает, и я настолько новичок в javascript, что не знаю, как заменить «theSelection» на что-то, что будет отражать вывод предыдущего «if (theSelection)»инструкция. Я надеюсь, что это имело хотя бы небольшой смысл.

Ответ №1:

Используйте регулярное выражение. Следующий код заменит 2 новые строки на две новые строки.

 string = string.replace(/n{2,}/g, "nn")
  

Я рекомендую показывать знак, который уведомляет читателя о том, что цитата исчезла. Рассмотрим следующее:

Сообщение 50 от пользователя: моя рыба умерла =(
============================
Сообщение 51 от пользователя:

[quote=Niceidea]
(2 страницы назад) Как насчет blabla . …
[/quote]
Потрясающе!
============================

После применения вашего кода:

============================
Сообщение 50 от пользователя: Моя рыба умерла =(
============================
Сообщение 51 от пользователя: Потрясающе!
============================

Предыдущий участник может быть оскорблен, потому что он не знал контекста ответа.

Комментарии:

1. Это отлично сработало, но у меня есть еще одна проблема, которую я отредактировал в исходном вопросе. И спасибо за вашу помощь.

2. Если вы пытаетесь заменить 3 или более на 2, вы можете уменьшить накладные расходы с {3,} помощью . Использование {2,} все еще работает, но какой смысл это делать? Вы также могли бы сделать /nn /g

3. @Yosiah Используйте .replace(/n{3,}/g, "nn").replace(/^s |s $/g,"") для решения вашей новой проблемы.

4. @RobW Прошу прощения за то, что я такой плотный (я занимаюсь этим меньше дня), но где бы я это разместил? И нужно ли мне вводить что-либо перед двумя методами «.replace»? Еще раз спасибо.

Ответ №2:

Я нашел хорошее решение: меньше кода и именно то, что вы хотели:

 var output,
    theSelection = 'Text.nn[quote="User 2"]nQuote texnt.n[/quote]nnnnnMore text.';

    /*
     * theSelection is:
     * 'Text.
     *  
     *  [quote="User 2"]
     *  Quote tex
     *  t.
     *  [/quote]
     *
     *
     *
     *  More text.'
     */

if (theSelection) {
    output = theSelection.replace(/[quote=".*"][sS]*[/quote]/gi, '')
                         .replace(/n{2,}/g, 'nn');
}

console.log(output);

/*
 * Outputs:
 * 'Text.
 *
 * More text.'
 * 
 */