Javascript, чтобы уменьшить разрывы строк до двух? - PullRequest
0 голосов
/ 15 октября 2011

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

   if (theSelection)
   {
      for (var i = 0, l = theSelection.length; i < l; i++)
      {
         if (theSelection[i] == '[' && theSelection[i+1] == 'q') level++; 
         if (theSelection[i-6] == 'q' && theSelection[i-7] == '/' && 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]

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

EDIT:

Вот большой фрагмент кода:

if (theSelection)
{
    for (var i = 0, l = theSelection.length; i < l; i++)
    {
        if (theSelection[i] == '[' && theSelection[i+1] == 'q') level++; 
        if (theSelection[i-6] == 'q' && theSelection[i-7] == '/' && 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, "\n\n");
}

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

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

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

Ответы [ 2 ]

2 голосов
/ 15 октября 2011

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

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

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

Пост 50 от пользователя A: Моя рыба умерла = (
============================
Запись 51 от пользователя B:

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

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

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

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

0 голосов
/ 15 октября 2011

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

var output,
    theSelection = 'Text.\n\n[quote="User 2"]\nQuote tex\nt.\n[/quote]\n\n\n\n\nMore text.';

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

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

console.log(output);

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