This commit is contained in:
coma 2025-09-25 01:54:30 +04:00
commit 5ab2d8abfd
45 changed files with 9738 additions and 0 deletions

32
src/lib/utils/date.js Normal file
View file

@ -0,0 +1,32 @@
export function formatDate(dateString) {
const date = new Date(dateString);
return date.toLocaleDateString('ru-RU', {
year: 'numeric',
month: 'long',
day: 'numeric'
});
}
export function formatDateTime(dateString) {
const date = new Date(dateString);
return date.toLocaleDateString('ru-RU', {
year: 'numeric',
month: 'long',
day: 'numeric',
hour: '2-digit',
minute: '2-digit'
});
}
export function getRelativeTime(dateString) {
const date = new Date(dateString);
const now = new Date();
const diffInSeconds = Math.floor((now - date) / 1000);
if (diffInSeconds < 60) return 'только что';
if (diffInSeconds < 3600) return `${Math.floor(diffInSeconds / 60)} мин. назад`;
if (diffInSeconds < 86400) return `${Math.floor(diffInSeconds / 3600)} ч. назад`;
if (diffInSeconds < 604800) return `${Math.floor(diffInSeconds / 86400)} дн. назад`;
return formatDate(dateString);
}

26
src/lib/utils/markdown.js Normal file
View file

@ -0,0 +1,26 @@
import { marked } from 'marked';
import sanitizeHtml from 'sanitize-html';
marked.setOptions({
breaks: true,
gfm: true
});
const sanitizeOptions = {
allowedTags: sanitizeHtml.defaults.allowedTags.concat(['img', 'h1', 'h2', 'h3']),
allowedAttributes: {
...sanitizeHtml.defaults.allowedAttributes,
img: ['src', 'alt', 'title'],
a: ['href', 'name', 'target']
}
};
export function parseMarkdown(content) {
const html = marked.parse(content);
return sanitizeHtml(html, sanitizeOptions);
}
export function extractExcerpt(content, length = 150) {
const plainText = content.replace(/[#*`~]/g, '').replace(/\n/g, ' ');
return plainText.slice(0, length) + (plainText.length > length ? '...' : '');
}