ProzillaOS/packages/apps/terminal/core/commands/cowsay.ts
2024-06-16 21:46:44 +02:00

108 lines
No EOL
2.5 KiB
TypeScript

import { MAX_WIDTH } from "../../../../config/apps/terminal.config";
import { Command, ExecuteParams } from "../command";
const COW = `
\\ ^__^
\\ (oo)\\_______
(__)\\ )\\/\\
||----w |
|| ||`;
export const cowsay = new Command()
.setRequireArgs(true)
.setManual({
purpose: "Show a cow saying something",
usage: "cowsay text",
description: "Show ASCII art of a cow saying something."
})
.setExecute(function(args, params) {
const { rawInputValue } = params as ExecuteParams;
// Separate input value into lines
const segments = rawInputValue?.split(" ");
const lines: string[] = [];
let currentLine = "";
let maxLineWidth = 0;
const addLine = (line: string) => {
line = line.trimEnd();
lines.push(line);
if (line.length > maxLineWidth)
maxLineWidth = line.length;
};
const nextLine = (word?: string) => {
addLine(currentLine);
if (word) {
currentLine = word + " ";
} else {
currentLine = "";
}
};
segments?.forEach((segment) => {
// Add empty spaces preceding lines
if (segment === "") {
currentLine += " ";
return;
}
const words = segment.split("\n");
for (let i = 0; i < words.length; i++) {
const word = words[i];
// Handle next lines
if (i > 0)
nextLine();
// Fit word on current line
if ((currentLine + word).length <= MAX_WIDTH) {
currentLine += word + " ";
} else if (word.length > MAX_WIDTH) {
const remainingSpaces = MAX_WIDTH - currentLine.length;
if (remainingSpaces >= 2) {
addLine(currentLine + word.substring(0, remainingSpaces - 1) + "-");
currentLine = word.substring(remainingSpaces - 1) + " ";
} else {
nextLine(word);
}
} else {
nextLine(word);
}
}
});
if (currentLine.length > 0)
addLine(currentLine);
// Turn lines into speech bubble
const speechBubble = [` ${"_".repeat(maxLineWidth + 2)} `];
for (let i = 0; i < lines.length; i++) {
let line = lines[i];
const missingSpaces = maxLineWidth - line.length;
if (missingSpaces > 0)
line += " ".repeat(missingSpaces);
if (lines.length > 1) {
if (i === 0) {
line = `/ ${line} \\`;
} else if (i === lines.length - 1) {
line = `\\ ${line} /`;
} else {
line = `| ${line} |`;
}
} else {
line = `< ${line} >`;
}
speechBubble.push(line);
}
speechBubble.push(` ${"-".repeat(maxLineWidth + 2)} `);
return speechBubble.join("\n") + COW;
});