white-space: nowrap;
However, the above does not work on Safari. In Safari, use this instead:
white-space: pre; overflow-x: auto; word-wrap: normal;
https://stackoverflow.com/questions/657795/how-to-remove-word-wrap-from-textarea/25556711#25556711
white-space: nowrap;
white-space: pre; overflow-x: auto; word-wrap: normal;
function escapeRegExp(text) {
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}
Lookbehind:
String.prototype.splitKeep = function (tokens) {
const escaped = escapeRegExp(tokens);
return this.split(new RegExp(`(?=[${escaped}])|(?<=[${escaped}])`, "g"));
};
Match. Safari does not support lookbehind, use match approach:
String.prototype.splitKeep = function (tokens) {
const tokensEscaped = tokens
.split("")
.map((s) => escapeRegExp(s))
.join("|");
const wordMatch = `[^${escapeRegExp(tokens)}]+`;
return this.match(new RegExp(tokensEscaped + "|" + wordMatch, "g"));
};
Loop-based approach:
String.prototype.splitKeep = function (tokens) {
let toPush = "";
const splitList = [];
for (const c of this) {
if (tokens.includes(c)) {
if (toPush.length > 0) {
splitList.push(toPush);
}
splitList.push(c);
toPush = "";
continue;
}
toPush += c;
}
if (toPush.length > 0) {
splitList.push(toPush);
}
return splitList;
};
Benchmark code:
console.time("test");
for (let i = 0; i < 10000; ++i) {
"pin1yin1".splitKeep("12345 ");
}
console.timeEnd("test");
Results:
% node splitkeep-lookbehind.js test: 19.35ms % node splitkeep-lookbehind.js test: 18.951ms % node splitkeep-match.js test: 54.635ms % node splitkeep-match.js test: 51.998ms % node splitkeep-loop.js test: 14.647ms % node splitkeep-loop.js test: 13.035ms