Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | 44x 85x 36x 36x 2x 3x 3x | // SPDX-FileCopyrightText: 2024-2026 Hack23 AB
// SPDX-License-Identifier: Apache-2.0
/**
* @module Utils/Articles/Slug
* @description Pure string/date utilities for article slugs and read-time math.
*/
import fs from 'fs';
/**
* Format slug for display (hyphen-separated to Title Case)
*
* @param slug - Hyphen-separated slug string
* @returns Formatted title string
*/
export function formatSlug(slug: string): string {
return slug
.split('-')
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
.join(' ');
}
/**
* Get file modification time as YYYY-MM-DD string
*
* @param filepath - Path to file
* @returns Last modified date in YYYY-MM-DD format
*/
export function getModifiedDate(filepath: string): string {
const stats = fs.statSync(filepath);
return stats.mtime.toISOString().slice(0, 10);
}
/**
* Format date for article slug
*
* @param date - Date to format (defaults to now)
* @returns Formatted date string (YYYY-MM-DD)
*/
export function formatDateForSlug(date: Date = new Date()): string {
return date.toISOString().slice(0, 10);
}
/**
* Calculate read time estimate from content
*
* @param content - Article content text
* @param wordsPerMinute - Reading speed (default 250)
* @returns Estimated read time in minutes
*/
export function calculateReadTime(content: string, wordsPerMinute: number = 250): number {
const words = content.split(/\s+/).length;
return Math.ceil(words / wordsPerMinute);
}
|