import "@johnlindquist/kit";
function chunkify(text, chunkSize) {
const chunks = [];
let index = 0;
while (index < text.length) {
let end = index + chunkSize;
while (end > index && text[end] !== "\n") {
end--;
}
if (end === index) {
end = index + chunkSize;
}
const chunk = text.substring(index, end);
chunks.push(chunk);
index = end;
}
return chunks;
}
const rawText = await editor(
"Paste the text to chunkify here (You can delete this placeholder)."
);
let textWidget = await widget(
`<header class="grid grid-flow-col px-4 py-2">
<button id="previous-button" class="items-center rounded-md bg-black p-4 text-white transition-colors hover:bg-white hover:text-black hover:outline">Previous</button>
<div>
<h1 class="text-center text-4xl">Chunkifier</h1>
<h2 class="text-center text-gray-500">Chunk {{chunkIndex}} of {{totalChunks}}</h2>
</div>
<button id="close-button" class="items-center rounded-md bg-black p-4 text-white transition-colors hover:bg-white hover:text-black hover:outline">Close</button>
</header>
<section class="max-w-prose flex-1 overflow-auto break-words p-6">{{chunk}}</section>
<button id="copy-button" class="flex mx-6 my-4 items-center justify-center rounded-md bg-black px-6 py-4 text-4xl text-white transition-colors hover:bg-white hover:text-black hover:outline hover:outline-black">{{copyBtnText}}</button>`,
{
closable: true,
useContentSize: true,
draggable: true,
containerClass:
"flex h-screen flex-col overflow-hidden bg-white text-black",
alwaysOnTop: true,
minHeight: 600,
}
);
const chunks = chunkify(rawText, 2000);
let chunkIndex = 0;
let copyBtnText = "Copy";
textWidget.setState({
chunkIndex: chunkIndex + 1,
chunk: chunks[chunkIndex],
copyBtnText: "Copy",
totalChunks: chunks.length,
});
function handleClose() {
textWidget.close();
process.exit(0);
}
function handleCopyButton() {
copy(chunks[chunkIndex]);
const isLastChunk = chunkIndex >= chunks.length - 1;
if (isLastChunk && copyBtnText === "Copy") {
copyBtnText = "Done";
textWidget.setState({
copyBtnText,
chunk: "All chunks copied, click again to close!",
});
} else if (isLastChunk) {
handleClose();
} else {
chunkIndex++;
textWidget.setState({
chunkIndex: chunkIndex + 1,
chunk: `${chunks[chunkIndex]}`,
});
}
}
function handlePreviousButton() {
if (chunkIndex <= 0) return;
chunkIndex--;
let copyBtnText = "Copy";
textWidget.setState({
chunkIndex: chunkIndex + 1,
copyBtnText,
chunk: `${chunks[chunkIndex]}`,
});
}
textWidget.onClick((event) => {
switch (event.targetId) {
case "copy-button":
handleCopyButton();
break;
case "previous-button":
handlePreviousButton();
break;
case "close-button":
handleClose();
break;
}
});