diff --git a/packages/cli/src/commands/publish.ts b/packages/cli/src/commands/publish.ts index 33baa92..6e050d7 100644 --- a/packages/cli/src/commands/publish.ts +++ b/packages/cli/src/commands/publish.ts @@ -110,6 +110,7 @@ export const publishCommand = command({ ignorePatterns: config.ignore, slugField: config.frontmatter?.slugField, removeIndexFromSlug: config.removeIndexFromSlug, + stripDatePrefix: config.stripDatePrefix, }); s.stop(`Found ${posts.length} posts`); diff --git a/packages/cli/src/commands/sync.ts b/packages/cli/src/commands/sync.ts index 36d9602..dd1ea5b 100644 --- a/packages/cli/src/commands/sync.ts +++ b/packages/cli/src/commands/sync.ts @@ -105,6 +105,7 @@ export const syncCommand = command({ ignorePatterns: config.ignore, slugField: config.frontmatter?.slugField, removeIndexFromSlug: config.removeIndexFromSlug, + stripDatePrefix: config.stripDatePrefix, }); s.stop(`Found ${localPosts.length} local posts`); diff --git a/packages/cli/src/lib/config.ts b/packages/cli/src/lib/config.ts index 030d8d4..a64785e 100644 --- a/packages/cli/src/lib/config.ts +++ b/packages/cli/src/lib/config.ts @@ -82,6 +82,7 @@ export function generateConfigTemplate(options: { frontmatter?: FrontmatterMapping; ignore?: string[]; removeIndexFromSlug?: boolean; + stripDatePrefix?: boolean; textContentField?: string; bluesky?: BlueskyConfig; }): string { @@ -124,6 +125,10 @@ export function generateConfigTemplate(options: { config.removeIndexFromSlug = options.removeIndexFromSlug; } + if (options.stripDatePrefix) { + config.stripDatePrefix = options.stripDatePrefix; + } + if (options.textContentField) { config.textContentField = options.textContentField; } diff --git a/packages/cli/src/lib/markdown.ts b/packages/cli/src/lib/markdown.ts index 73883ea..e7d3a6f 100644 --- a/packages/cli/src/lib/markdown.ts +++ b/packages/cli/src/lib/markdown.ts @@ -178,6 +178,7 @@ export function getSlugFromFilename(filename: string): string { export interface SlugOptions { slugField?: string; removeIndexFromSlug?: boolean; + stripDatePrefix?: boolean; } export function getSlugFromOptions( @@ -185,7 +186,7 @@ export function getSlugFromOptions( rawFrontmatter: Record, options: SlugOptions = {}, ): string { - const { slugField, removeIndexFromSlug = false } = options; + const { slugField, removeIndexFromSlug = false, stripDatePrefix = false } = options; let slug: string; @@ -218,6 +219,11 @@ export function getSlugFromOptions( slug = slug.replace(/\/_?index$/, ""); } + // Strip Jekyll-style date prefix (YYYY-MM-DD-) from filename + if (stripDatePrefix) { + slug = slug.replace(/(^|\/)(\d{4}-\d{2}-\d{2})-/g, "$1"); + } + return slug; } @@ -243,6 +249,7 @@ export interface ScanOptions { ignorePatterns?: string[]; slugField?: string; removeIndexFromSlug?: boolean; + stripDatePrefix?: boolean; } export async function scanContentDirectory( @@ -274,6 +281,7 @@ export async function scanContentDirectory( ignorePatterns: ignore = [], slugField, removeIndexFromSlug, + stripDatePrefix, } = options; const patterns = ["**/*.md", "**/*.mdx"]; @@ -302,6 +310,7 @@ export async function scanContentDirectory( const slug = getSlugFromOptions(relativePath, rawFrontmatter, { slugField, removeIndexFromSlug, + stripDatePrefix, }); posts.push({ diff --git a/packages/cli/src/lib/types.ts b/packages/cli/src/lib/types.ts index 16888be..3707cd4 100644 --- a/packages/cli/src/lib/types.ts +++ b/packages/cli/src/lib/types.ts @@ -33,6 +33,7 @@ export interface PublisherConfig { frontmatter?: FrontmatterMapping; // Custom frontmatter field mappings ignore?: string[]; // Glob patterns for files to ignore (e.g., ["_index.md", "**/drafts/**"]) removeIndexFromSlug?: boolean; // Remove "/index" or "/_index" suffix from paths (default: false) + stripDatePrefix?: boolean; // Remove YYYY-MM-DD- prefix from filenames (Jekyll-style, default: false) textContentField?: string; // Frontmatter field to use for textContent instead of markdown body bluesky?: BlueskyConfig; // Optional Bluesky posting configuration }