使用zero-width space()保留空白并允许文本换行。基本思想是将每个空间或空间序列与零宽度空间配对。然后用一个不间断的空格替换每个空格。您还需要对html进行编码并添加换行符。
如果你不在乎unicode字符,那就很简单了。您可以使用string.replace():function textToHTML(text)
{
return ((text || "") + "") // make sure it is a string;
.replace(/&/g, "&")
.replace(/
.replace(/>/g, ">")
.replace(/\t/g, " ")
.replace(/ /g, " ")
.replace(/\r\n|\r|\n/g, "
");
}
如果空白可以换行,则将每个空白与上面的零宽度空白配对。否则,为了使空白保持在一起,将每个序列的空格与一个零宽度的空格配对:.replace(/ /g, " ")
.replace(/(( )+)/g, "$1")
要编码unicode字符,它要复杂一些。您需要迭代字符串:var charEncodings = {
"\t": " ",
" ": " ",
"&": "&",
"
">": ">",
"\n": "
",
"\r": "
"
};
var space = /[\t ]/;
var noWidthSpace = "";
function textToHTML(text)
{
text = (text || "") + ""; // make sure it is a string;
text = text.replace(/\r\n/g, "\n"); // avoid adding two
tags
var html = "";
var lastChar = "";
for (var i in text)
{
var char = text[i];
var charCode = text.charCodeAt(i);
if (space.test(char) && !space.test(lastChar) && space.test(text[i + 1] || ""))
{
html += noWidthSpace;
}
html += char in charEncodings ? charEncodings[char] :
charCode > 127 ? "" + charCode + ";" : char;
lastChar = char;
}
return html;
}
现在,只是一个评论。如果不使用monospace字体,就会丢失一些格式。考虑一下这些带有单空格字体的文本行如何构成列:ten seven spaces
eleven four spaces
如果没有等宽字体,将丢失列:
十个七格
十一个四格
看来修复这个问题的算法非常复杂。