Уценка и экранирование разрывов строк Javascript - PullRequest
4 голосов
/ 04 октября 2009

Я пишу компилятор уценки в Erlang для использования на стороне сервера. Поскольку он должен работать с клиентами, я решил принять библиотеку на стороне клиента (showdown.js) в качестве спецификации, а затем протестировать мой код на совместимость с этим.

В первые пару итераций я построил 260 с лишним модульных тестов, которые проверяли, что моя программа выдает результат, совместимый с тем, что я считал действительной уценкой на основе чтения примечания к синтаксису .

Но сейчас я пытаюсь написать программу на javascript для генерации моих модульных тестов.

У меня есть такой ввод:

"3 > 4\na"

Я хочу запустить 'showdown', чтобы получить:

"<p>3 &gt; 4\na</p>"

и я хочу добавить это в утверждение EUnit:

"?_assert(conv(\"3 > 4\na\") == \"<p>3 &gt; 4\na</p>\"),",

, который является действительным синтаксисом Эрланга для модульного теста. Чтобы упростить жизнь и сделать генератор модульных тестов переносимым, я делаю это на веб-странице, добавляя несколько строк в файл javascript и затем просматривая страницу, чтобы получить новый набор модульных тестов внутри <textarea />, который Затем вы копируете в модуль для запуска EUnit.

Проблема в том, что я не могу преобразовать разрывы строк в \n в строке, поэтому я получаю:

"?_assert(conv(\"3 > 4
a\") == \"<p>3 &gt; 4
a</p>\"),",

Я пытался преобразовать переводы строк в их экранированные версии, используя такой код:

text.replace("\\", "\\\\");
text.replace("\n", "\\n");

но без радости ...

1 Ответ

2 голосов
/ 05 октября 2009

Том МакНалти помог мне и указал, что мои регулярные выражения были супер штанами, в частности, я не использовал глобальный флаг: (

Рабочий код:

var converter;
var text = "";
var item;
var input;
var output;
var head;
var tail;
converter = new Attacklab.showdown.converter();
item = document.getElementById("tests");
for (var test in tests) {
  input = tests[test].replace(/[\n\r]+/gi,"\\n" );
  input = input.replace(/[\"]+/gi, "\\\"");
  output = converter.makeHtml(tests[test]).replace(/[\n\r]+/gi, "\\n");
  output = output.replace(/[\"]+/gi, "\\\"");
  text += "     ?_assert(conv(\"" + input + "\") == \"" + output + "\"),\n";
};
head = "unit_test_() -> \n    [\n";
tail = "\n    ].";
text = text.slice(0, text.length - 2);
item.value = head + text + tail;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...