Split codeblocks properly in chunkMessageLines
This commit is contained in:
parent
f28f2c13d4
commit
97e78e37ca
1 changed files with 24 additions and 2 deletions
26
src/utils.ts
26
src/utils.ts
|
@ -293,13 +293,35 @@ export function chunkLines(str: string, maxChunkLength = 2000): string[] {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Chunks a long message to multiple smaller messages, retaining leading and trailing line breaks
|
* Chunks a long message to multiple smaller messages, retaining leading and trailing line breaks, open code blocks, etc.
|
||||||
*/
|
*/
|
||||||
export function chunkMessageLines(str: string): string[] {
|
export function chunkMessageLines(str: string): string[] {
|
||||||
const chunks = chunkLines(str, 1999);
|
const chunks = chunkLines(str, 1990); // We don't split at exactly 2000 to be able to do the stuff below
|
||||||
|
let openCodeBlock = false;
|
||||||
|
|
||||||
return chunks.map(chunk => {
|
return chunks.map(chunk => {
|
||||||
|
// If the chunk starts with a newline, add an invisible unicode char so Discord doesn't strip it away
|
||||||
if (chunk[0] === "\n") chunk = "\u200b" + chunk;
|
if (chunk[0] === "\n") chunk = "\u200b" + chunk;
|
||||||
|
// If the chunk ends with a newline, add an invisible unicode char so Discord doesn't strip it away
|
||||||
if (chunk[chunk.length - 1] === "\n") chunk = chunk + "\u200b";
|
if (chunk[chunk.length - 1] === "\n") chunk = chunk + "\u200b";
|
||||||
|
// If the previous chunk had an open code block, open it here again
|
||||||
|
if (openCodeBlock) {
|
||||||
|
openCodeBlock = false;
|
||||||
|
if (chunk.startsWith("```")) {
|
||||||
|
// Edge case: chunk starts with a code block delimiter, e.g. the previous chunk and this one were split right before the end of a code block
|
||||||
|
// Fix: just strip the code block delimiter away from here, we don't need it anymore
|
||||||
|
chunk = chunk.slice(3);
|
||||||
|
} else {
|
||||||
|
chunk = "```" + chunk;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If the chunk has an open code block, close it and open it again in the next chunk
|
||||||
|
const codeBlockDelimiters = chunk.match(/```/g);
|
||||||
|
if (codeBlockDelimiters && codeBlockDelimiters.length % 2 !== 0) {
|
||||||
|
chunk += "```";
|
||||||
|
openCodeBlock = true;
|
||||||
|
}
|
||||||
|
|
||||||
return chunk;
|
return chunk;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue