Используйте пробел нулевой ширины (​
), чтобы сохранить пробелы и разрешить перенос текста.Основная идея заключается в соединении каждого пробела или последовательности пробелов с пробелом нулевой ширины.Затем замените каждый пробел неразрывным пробелом.Вы также захотите закодировать html и добавить разрывы строк.
Если вас не интересуют символы Юникода, это тривиально.Вы можете просто использовать 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​")
Чтобы кодировать символы Юникода, это немного сложнее.Вам нужно перебрать строку:
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
Без моноширинного шрифта вы потеряете столбцы:
десять семь пробелов
одиннадцать четырех пробелов
Похоже, что алгоритм исправления будет очень сложным.