Nested message formatting
This commit is contained in:
parent
f25621daef
commit
b4db7fd2a7
|
|
@ -25,50 +25,48 @@ export namespace MessageTools {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const format = (message: string): string => {
|
export const format = (message: string): string => {
|
||||||
const replaceRegex = /([*"]\*?)/ig;
|
const replaceRegex = /(\*\*?|")/ig;
|
||||||
const splitToken = '___SPLIT_AWOORWA___';
|
const splitToken = '___SPLIT_AWOORWA___';
|
||||||
|
|
||||||
const preparedMessage = message.replace(replaceRegex, `${splitToken}$1${splitToken}`);
|
const preparedMessage = message.replace(replaceRegex, `${splitToken}$1${splitToken}`);
|
||||||
const parts = preparedMessage.split(splitToken);
|
const parts = preparedMessage.split(splitToken);
|
||||||
|
|
||||||
let isText = true;
|
const stack: string[] = [];
|
||||||
let keepPart = true;
|
|
||||||
|
|
||||||
let resultHTML = '';
|
let resultHTML = '';
|
||||||
|
|
||||||
for (const part of parts) {
|
for (const part of parts) {
|
||||||
|
const isClose = stack.at(-1) === part;
|
||||||
if (isText) {
|
if (isClose) {
|
||||||
if (part === '*') {
|
stack.pop();
|
||||||
isText = false;
|
|
||||||
keepPart = false;
|
|
||||||
resultHTML += `<span class="italic">`;
|
|
||||||
} else if (part === '**') {
|
|
||||||
isText = false;
|
|
||||||
keepPart = false;
|
|
||||||
resultHTML += `<span class="bold">`;
|
|
||||||
} else if (part === '"') {
|
|
||||||
isText = false;
|
|
||||||
keepPart = true;
|
|
||||||
resultHTML += `<span class="quote">"`;
|
|
||||||
} else {
|
|
||||||
resultHTML += part;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (part === '*' || part === '**') {
|
if (part === '*' || part === '**') {
|
||||||
resultHTML += `</span>`;
|
resultHTML += `</span>`;
|
||||||
isText = true;
|
|
||||||
} else if (part === '"') {
|
} else if (part === '"') {
|
||||||
resultHTML += `"</span>`;
|
resultHTML += `"</span>`;
|
||||||
isText = true;
|
}
|
||||||
|
} else {
|
||||||
|
if (part === '*') {
|
||||||
|
stack.push(part);
|
||||||
|
resultHTML += `<span class="italic">`;
|
||||||
|
} else if (part === '**') {
|
||||||
|
stack.push(part);
|
||||||
|
resultHTML += `<span class="bold">`;
|
||||||
|
} else if (part === '"') {
|
||||||
|
stack.push(part);
|
||||||
|
resultHTML += `<span class="quote">"`;
|
||||||
} else {
|
} else {
|
||||||
resultHTML += part;
|
resultHTML += part;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isText) {
|
while (stack.length) {
|
||||||
resultHTML += `</span>`;
|
const part = stack.pop();
|
||||||
|
if (part === '*' || part === '**') {
|
||||||
|
resultHTML += `</span>`;
|
||||||
|
} else if (part === '"') {
|
||||||
|
resultHTML += `"</span>`;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return resultHTML;
|
return resultHTML;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue