From 5e602a20c11cd4e0de578fcb46d3833eb4100777 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Sat, 14 Mar 2026 12:07:46 +0100 Subject: [PATCH] fix: enhance date handling in setLastModifiedDateInner for TOML support #979 --- CHANGELOG.md | 1 + src/commands/Article.ts | 39 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d433af4..47901a47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ - [#958](https://github.com/estruyf/vscode-front-matter/issues/958): Fix variable frontmatter leads to error - [#964](https://github.com/estruyf/vscode-front-matter/issues/964): Fix settings page for dark themes - [#972](https://github.com/estruyf/vscode-front-matter/issues/972): Fix content view sorting for Modified Date not working as expected +- [#979](https://github.com/estruyf/vscode-front-matter/issues/979): Fix unwanted automatic updates in the publishDate field of TOML front matter - [#984](https://github.com/estruyf/vscode-front-matter/issues/984): Fix in `frontMatter.global.timezone` is invalid - [#1004](https://github.com/estruyf/vscode-front-matter/issues/1004): Fix for `mediaDB.json` containing full paths on Windows instead of relative paths - [#1006](https://github.com/estruyf/vscode-front-matter/issues/1006): Fix output channel colorizer schema to only apply to the Front Matter output channel diff --git a/src/commands/Article.ts b/src/commands/Article.ts index 837262e1..78bb5c92 100644 --- a/src/commands/Article.ts +++ b/src/commands/Article.ts @@ -37,7 +37,7 @@ import { COMMAND_NAME, DefaultFields } from '../constants'; import { DashboardData, SnippetInfo, SnippetRange } from '../models/DashboardData'; import { DateHelper } from '../helpers/DateHelper'; import { parseWinPath } from '../helpers/parseWinPath'; -import { ParsedFrontMatter } from '../parsers'; +import { FrontMatterParser, ParsedFrontMatter } from '../parsers'; import { MediaListener } from '../listeners/panel'; import { NavigationType } from '../dashboardWebView/models'; import { SNIPPET } from '../constants/Snippet'; @@ -149,23 +149,58 @@ export class Article { return; } + const documentText = document.getText(); + const isToml = FrontMatterParser.getLanguageFromContent(documentText) === 'toml'; const cloneArticle = Object.assign({}, article); - const dateField = await ArticleHelper.getModifiedDateField(article); + + let contentType; + const dateField = isToml + ? ((contentType = await ArticleHelper.getContentType(article)), + contentType.fields.find((f) => f.isModifiedDate)) + : await ArticleHelper.getModifiedDateField(article); + + if (isToml) { + Logger.verbose( + `Article:setLastModifiedDateInner:TOML - updating all datetime fields to preserve format` + ); + } + Logger.verbose(`Article:setLastModifiedDateInner:DateField - ${JSON.stringify(dateField)}`); try { const fieldName = dateField?.name || DefaultFields.LastModified; const fieldValue = Article.formatDate(new Date(), dateField?.dateFormat); cloneArticle.data[fieldName] = fieldValue; + Logger.verbose( `Article:setLastModifiedDateInner:DateField name - ${fieldName} - value - ${fieldValue}` ); + + if (isToml && contentType) { + // TOML parser returns datetime literals as Date objects. + // Reformat them using each field dateFormat to preserve expected output on save. + for (const field of contentType.fields) { + if (field.type === 'datetime' && field.name !== fieldName) { + const value = cloneArticle.data[field.name]; + if (value instanceof Date) { + cloneArticle.data[field.name] = Article.formatDate(value, field.dateFormat); + Logger.verbose( + `Article:setLastModifiedDateInner:Reformat field - ${field.name} - value - ${ + cloneArticle.data[field.name] + }` + ); + } + } + } + } + Logger.verbose(`Article:setLastModifiedDateInner:End`); return cloneArticle; } catch (e: unknown) { Notifications.error( l10n.t(LocalizationKey.commandsArticleSetDateError, `${CONFIG_KEY}${SETTING_DATE_FORMAT}`) ); + return; } }