4

我正在用 Erlang 编写一个 markdown 编译器以供服务器端使用。因为它需要与客户端一起工作,所以我决定采用客户端库(showdown.js)作为规范,然后测试我的代码是否与之兼容。

在最初的几次迭代中,我构建了 260 多个单元测试,这些测试检查我的程序产生的输出是否与我认为基于阅读语法注释的有效降价兼容。

但现在我正在尝试编写一个 javascript 程序来生成我的单元测试。

我有这样的输入:

"3 > 4\na"

我想对其进行“摊牌”以获得:

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

我想把它拼接成一个 EUnit 断言:

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

这是单元测试的有效 Erlang 语法。为了让生活更轻松,并使单元测试生成器可移植,我在网页中执行此操作,以便通过将一些行附加到 javascript 文件然后查看页面,您可以在 a<textarea />中获得一组新的单元测试,然后将其复制进入模块以运行 EUnit。

问题是我无法\n在字符串中转换为换行符,所以我最终得到:

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

我尝试使用以下代码将换行符转换为转义版本:

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

但没有快乐...

4

1 回答 1

2

Tom McNulty 帮助我并指出我的正则表达式是超级裤子,特别是我没有使用全局标志 :(

工作代码是:

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;
于 2009-10-05T07:11:14.200 回答