使用零宽度空格( ​
) 保留空白并允许文本换行。基本思想是将每个空间或空间序列与零宽度空间配对。然后用不间断的空格替换每个空格。您还需要对 html 进行编码并添加换行符。
如果您不关心 unicode 字符,那是微不足道的。您可以使用string.replace()
:
function textToHTML(text)
{
return ((text || "") + "") // make sure it is a string;
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/\t/g, " ")
.replace(/ /g, "​ ​")
.replace(/\r\n|\r|\n/g, "<br />");
}
如果空格可以换行,则将每个空格与上面的零宽度空格配对。否则,要将空白保持在一起,请将每个空格序列与零宽度空间配对:
.replace(/ /g, " ")
.replace(/(( )+)/g, "​$1​")
要编码 unicode 字符,它有点复杂。您需要迭代字符串:
var charEncodings = {
"\t": " ",
" ": " ",
"&": "&",
"<": "<",
">": ">",
"\n": "<br />",
"\r": "<br />"
};
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 <br /> 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;
}
现在,只是一个评论。如果不使用等宽字体,您将丢失一些格式。考虑这些具有等宽字体的文本行如何形成列:
ten seven spaces
eleven four spaces
如果没有等宽字体,您将丢失列:
十七个空格
十一四个空格
解决这个问题的算法似乎非常复杂。