Initial Commit

This commit is contained in:
JB
2025-10-06 23:31:31 -04:00
commit 0c8630b8ba
243 changed files with 166945 additions and 0 deletions

62
packages/util/src/text.ts Normal file
View File

@@ -0,0 +1,62 @@
export function truncateText(input: string, length: number = 1000): string {
return input.length > length ? input.substring(0, length) + '...' : input;
}
export function formatNumberToShortForm(number: number, locale: string = 'en-uS') {
let suffix = '';
let value = number;
if (Math.abs(number) >= 1e9) {
value = number / 1e9;
suffix = 'b';
} else if (Math.abs(number) >= 1e6) {
value = number / 1e6;
suffix = 'M';
} else if (Math.abs(number) >= 1e3) {
value = number / 1e3;
suffix = 'k';
}
// Format the number to have up to 4 significant digits
const formattedValue = new Intl.NumberFormat(locale, {
maximumSignificantDigits: 4,
minimumSignificantDigits: 3,
minimumFractionDigits: 0,
maximumFractionDigits: 2,
}).format(value);
return `${formattedValue}${suffix}`;
}
export function normalize(value: string) {
return value
.toString()
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.replace(/[^a-zA-Z\s\d]/g, '')
.trim();
}
export function toTitleCase(value: string) {
return value.replace(/\w\S*/g, (txt) => txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase());
}
export function escapeMarkdown(text: string) {
return text.replace(/([\\_*~`|])/g, '\\$1');
}
export function escapeCodeBlock(text: string) {
return text.replace(/```/g, '`\u200b``');
}
export function escapeInlineCode(text: string) {
return text.replace(/`/g, '\u200b`');
}
export function escapeSpoiler(text: string) {
return text.replace(/\|\|/g, '|\u200b|');
}
export function escapeAll(text: string) {
return escapeMarkdown(escapeCodeBlock(escapeInlineCode(escapeSpoiler(text))));
}