我正在用 Erlang 编写一个 Markdown 编译器供服务器端使用。因为它需要与客户端一起工作,所以我决定采用客户端库 (showdown.js) 作为规范,然后测试我的代码与它的兼容性。
在前几次迭代中,我建立了 260 多个单元测试,检查我的程序产生的输出是否与我认为有效的 markdown 兼容,基于阅读 syntax notes .
但现在我正在尝试编写一个 javascript 程序来生成我的单元测试。
我有这样的输入:
"3 > 4\na"
我想对其进行“摊牌”以获得:
"<p>3 > 4\na</p>"
我想把它拼接成一个 EUnit 断言:
"?_assert(conv(\"3 > 4\na\") == \"<p>3 > 4\na</p>\"),",
这是单元测试的有效 Erlang 语法。为了让生活更轻松,并使单元测试生成器可移植,我在网页中执行此操作,以便通过将一些行附加到 javascript 文件然后查看页面,您可以在 <textarea />
中获得一组新的单元测试。然后将其复制到模块中以运行 EUnit。
问题是我无法将换行符转换为 \n
在字符串中,所以我最终得到:
"?_assert(conv(\"3 > 4
a\") == \"<p>3 > 4
a</p>\"),",
我尝试使用如下代码将换行符转换为其转义版本:
text.replace("\\", "\\\\");
text.replace("\n", "\\n");
但没有快乐...
最佳答案
Tom McNulty 帮助我指出我的正则表达式是 super 裤子,特别是我没有使用全局标志 :(
工作代码是:
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;
关于javascript - Markdown 和转义 Javascript 换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1517207/