Уценка -> Ошибка вскрытия в регулярном выражении отсоединения? - PullRequest
4 голосов
/ 08 сентября 2011

Я смотрю на оригинальную реализацию Markdown Грубера здесь и реализацию Showdown здесь .

Я сравниваю функцию _Detab в каждом.Я даю каждой следующей строке

"Where\tis pancakes house?"

Perl-версия теста и вывод: здесь .Это длина 26 символов.

JavaScript-версия теста и вывода здесь .Это 27 символов.

      123456789012345678901234567
Perl: Where   is pancakes house?
  JS: Where    is pancakes house?

Я сделал ошибку?Это ошибка или какая-то другая цель?

Ответы [ 2 ]

2 голосов
/ 08 сентября 2011

В развязке Showdown есть несколько ошибок. Вот почему для версии Stack Overflow я переписал :

function _Detab(text) {
    if (!/\t/.test(text))
        return text;

    var spaces = ["    ", "   ", "  ", " "],
    skew = 0,
    v;

    return text.replace(/[\n\t]/g, function (match, offset) {
        if (match === "\n") {
            skew = offset + 1;
            return match;
        }
        v = (offset - skew) % 4;
        skew = offset + 1;
        return spaces[v];
    });
}

Он корректно отключается, и, если я правильно помню свои измерения, это примерно так же быстро (может быть, немного медленнее), чем оригинал в старых версиях IE, и намного быстрее в новых браузерах.

См. http://code.google.com/p/pagedown/wiki/PageDown для нашей полной версии Showdown.

2 голосов
/ 08 сентября 2011

Похоже, ошибка в реализации Showdown. В Markdown используются 4 пробела, поэтому строка, оканчивающаяся на вкладке, всегда должна быть кратна 4 символам после того, как вкладки будут преобразованы в пробелы. Версия Perl составляет "Where\t" 8 символов, а версия JavaScript - 9 символов.

Я подозреваю, что ошибка может не возникать с вкладками в начале строки, как обычно они используются в Markdown, что объясняет, почему она не была замечена.

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