80 lines
2.2 KiB
TypeScript
80 lines
2.2 KiB
TypeScript
/**
|
|
* Format utilities for Nextcloud Talk messages.
|
|
*
|
|
* Nextcloud Talk supports markdown natively, so most formatting passes through.
|
|
* This module handles any edge cases or transformations needed.
|
|
*/
|
|
|
|
/**
|
|
* Convert markdown to Nextcloud Talk compatible format.
|
|
* Nextcloud Talk supports standard markdown, so minimal transformation needed.
|
|
*/
|
|
export function markdownToNextcloudTalk(text: string): string {
|
|
return text.trim();
|
|
}
|
|
|
|
/**
|
|
* Escape special characters in text to prevent markdown interpretation.
|
|
*/
|
|
export function escapeNextcloudTalkMarkdown(text: string): string {
|
|
return text.replace(/([*_`~[\]()#>+\-=|{}!\\])/g, "\\$1");
|
|
}
|
|
|
|
/**
|
|
* Format a mention for a Nextcloud user.
|
|
* Nextcloud Talk uses @user format for mentions.
|
|
*/
|
|
export function formatNextcloudTalkMention(userId: string): string {
|
|
return `@${userId.replace(/^@/, "")}`;
|
|
}
|
|
|
|
/**
|
|
* Format a code block for Nextcloud Talk.
|
|
*/
|
|
export function formatNextcloudTalkCodeBlock(code: string, language?: string): string {
|
|
const lang = language ?? "";
|
|
return `\`\`\`${lang}\n${code}\n\`\`\``;
|
|
}
|
|
|
|
/**
|
|
* Format inline code for Nextcloud Talk.
|
|
*/
|
|
export function formatNextcloudTalkInlineCode(code: string): string {
|
|
if (code.includes("`")) {
|
|
return `\`\` ${code} \`\``;
|
|
}
|
|
return `\`${code}\``;
|
|
}
|
|
|
|
/**
|
|
* Strip Nextcloud Talk specific formatting from text.
|
|
* Useful for extracting plain text content.
|
|
*/
|
|
export function stripNextcloudTalkFormatting(text: string): string {
|
|
return (
|
|
text
|
|
.replace(/```[\s\S]*?```/g, "")
|
|
.replace(/`[^`]+`/g, "")
|
|
.replace(/\*\*([^*]+)\*\*/g, "$1")
|
|
.replace(/\*([^*]+)\*/g, "$1")
|
|
.replace(/_([^_]+)_/g, "$1")
|
|
.replace(/~~([^~]+)~~/g, "$1")
|
|
.replace(/\[([^\]]+)\]\([^)]+\)/g, "$1")
|
|
.replace(/\s+/g, " ")
|
|
.trim()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Truncate text to a maximum length, preserving word boundaries.
|
|
*/
|
|
export function truncateNextcloudTalkText(text: string, maxLength: number, suffix = "..."): string {
|
|
if (text.length <= maxLength) return text;
|
|
const truncated = text.slice(0, maxLength - suffix.length);
|
|
const lastSpace = truncated.lastIndexOf(" ");
|
|
if (lastSpace > maxLength * 0.7) {
|
|
return truncated.slice(0, lastSpace) + suffix;
|
|
}
|
|
return truncated + suffix;
|
|
}
|