From 8f4c7d0d180b53d8131e46f225de0f00ab969915 Mon Sep 17 00:00:00 2001 From: doxxx93 Date: Mon, 14 Oct 2024 10:17:31 +0900 Subject: [PATCH 1/2] Add default author feature for Docusaurus conversion - Implement defaultAuthor in FrontMatterConverter - Update DocusaurusSettings to include defaultAuthor - Add UI setting for defaultAuthor in O2Settings --- src/FrontMatterConverter.ts | 13 +++++- src/docusaurus/docusaurus.ts | 1 + src/docusaurus/settings/DocusaurusSettings.ts | 1 + src/settings.ts | 15 ++++++ src/tests/FrontMatterConverter.test.ts | 46 +++++++++++++++++++ 5 files changed, 75 insertions(+), 1 deletion(-) diff --git a/src/FrontMatterConverter.ts b/src/FrontMatterConverter.ts index 39970ae..5699142 100644 --- a/src/FrontMatterConverter.ts +++ b/src/FrontMatterConverter.ts @@ -64,17 +64,20 @@ export class FrontMatterConverter implements Converter { private readonly resourcePath: string; private readonly isEnableBanner: boolean; private readonly isEnableUpdateFrontmatterTimeOnEdit: boolean; + private readonly defaultAuthor: string; constructor( fileName: string, resourcePath: string, isEnableBanner = false, isEnableUpdateFrontmatterTimeOnEdit = false, + defaultAuthor = '', ) { this.fileName = fileName; this.resourcePath = resourcePath; this.isEnableBanner = isEnableBanner; this.isEnableUpdateFrontmatterTimeOnEdit = isEnableUpdateFrontmatterTimeOnEdit; + this.defaultAuthor = defaultAuthor; } parseFrontMatter(content: string): [FrontMatter, string] { @@ -92,6 +95,10 @@ export class FrontMatterConverter implements Converter { frontMatter.mermaid = true.toString(); } + if (!frontMatter.authors && this.defaultAuthor) { + frontMatter.authors = this.defaultAuthor; + } + const result = convert( convertImageFrontMatter( this.isEnableBanner, @@ -147,7 +154,7 @@ function replaceDateFrontMatter(frontMatter: FrontMatter, isEnable: boolean): Fr return frontMatter; } -export const convertFrontMatter = (input: string) => { +export const convertFrontMatter = (input: string, defaultAuthor: string = '') => { const [frontMatter, body] = parseFrontMatter(input); if (Object.keys(frontMatter).length === 0) { return input; @@ -161,6 +168,10 @@ export const convertFrontMatter = (input: string) => { delete frontMatter['aliases']; delete frontMatter['published']; + if (!frontMatter.authors && defaultAuthor && defaultAuthor.trim() !== '') { + frontMatter.authors = defaultAuthor; + } + return join( convert({ ...frontMatter }), body, diff --git a/src/docusaurus/docusaurus.ts b/src/docusaurus/docusaurus.ts index e545188..cc1d77c 100644 --- a/src/docusaurus/docusaurus.ts +++ b/src/docusaurus/docusaurus.ts @@ -53,6 +53,7 @@ export const convertToDocusaurus = async (plugin: O2Plugin) => { convertWikiLink( convertFrontMatter( contents, + plugin.docusaurus.defaultAuthor, ), ), ), diff --git a/src/docusaurus/settings/DocusaurusSettings.ts b/src/docusaurus/settings/DocusaurusSettings.ts index 7289cb7..6828d36 100644 --- a/src/docusaurus/settings/DocusaurusSettings.ts +++ b/src/docusaurus/settings/DocusaurusSettings.ts @@ -4,6 +4,7 @@ import { DateExtractionPattern } from '../DateExtractionPattern'; export default class DocusaurusSettings implements O2PluginSettings { docusaurusPath: string; dateExtractionPattern: string; + defaultAuthor: string; targetPath(): string { return `${this.docusaurusPath}/blog`; diff --git a/src/settings.ts b/src/settings.ts index 8389b03..c0d83ce 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -64,6 +64,7 @@ export class O2SettingTab extends PluginSettingTab { }); this.addDocusaurusPathSetting(); this.dateExtractionPatternSetting(); + this.addDefaultAuthorSetting(); // 새로운 설정 추가 } private enableUpdateFrontmatterTimeOnEditSetting() { @@ -202,6 +203,20 @@ export class O2SettingTab extends PluginSettingTab { }); } + private addDefaultAuthorSetting() { + const docusaurus = this.plugin.docusaurus as DocusaurusSettings; + new Setting(this.containerEl) + .setName('Default Author') + .setDesc('The default author to be used in Docusaurus frontmatter.') + .addText(text => text + .setPlaceholder('Enter default author') + .setValue(docusaurus.defaultAuthor || '') + .onChange(async (value) => { + docusaurus.defaultAuthor = value; + await this.plugin.saveSettings(); + })); + } + private enableAutoArchiveSetting() { new Setting(this.containerEl) .setName('Auto archive') diff --git a/src/tests/FrontMatterConverter.test.ts b/src/tests/FrontMatterConverter.test.ts index d9e4cd2..a80290e 100644 --- a/src/tests/FrontMatterConverter.test.ts +++ b/src/tests/FrontMatterConverter.test.ts @@ -393,3 +393,49 @@ date: 2021-01-01 12:00:00 +0900 expect(result).toEqual(incompleteFrontMatterContents); // Assuming the function passes through incomplete front matter as is }); }); + +describe('FrontMatterConverter with defaultAuthor', () => { + it('should not add authors when defaultAuthor is empty', () => { + const converter = new FrontMatterConverter('file.md', 'path', false, false, ''); + const input = '---\ntitle: "Test"\n---\nContent'; + const result = converter.convert(input); + expect(result).not.toContain('authors:'); + }); + + it('should not override existing authors', () => { + const converter = new FrontMatterConverter('file.md', 'path', false, false, 'Default Author'); + const input = '---\ntitle: "Test"\nauthors: Existing Author\n---\nContent'; + const result = converter.convert(input); + expect(result).toContain('authors: Existing Author'); + expect(result).not.toContain('authors: Default Author'); + }); + + it('should add defaultAuthor when no authors exist', () => { + const converter = new FrontMatterConverter('file.md', 'path', false, false, 'Default Author'); + const input = '---\ntitle: "Test"\n---\nContent'; + const result = converter.convert(input); + expect(result).toContain('authors: Default Author'); + }); + + it('should handle empty frontmatter', () => { + const converter = new FrontMatterConverter('file.md', 'path', false, false, 'Default Author'); + const input = 'Content without frontmatter'; + const result = converter.convert(input); + expect(result).toBe(input); + }); +}); + +describe('convertFrontMatter with defaultAuthor', () => { + it('should add defaultAuthor when no authors exist', () => { + const input = '---\ntitle: "Test"\n---\nContent'; + const result = convertFrontMatter(input, 'Default Author'); + expect(result).toContain('authors: Default Author'); + }); + + it('should not override existing authors', () => { + const input = '---\ntitle: "Test"\nauthors: Existing Author\n---\nContent'; + const result = convertFrontMatter(input, 'Default Author'); + expect(result).toContain('authors: Existing Author'); + expect(result).not.toContain('authors: Default Author'); + }); +}); From 1caacbe7fa156acddf81a9be34f31b997b7500a5 Mon Sep 17 00:00:00 2001 From: doxxx93 Date: Mon, 14 Oct 2024 18:48:12 +0900 Subject: [PATCH 2/2] feat: Add support for multiple authors and update settings UI - Introduced AuthorStrategyFactory to separate author handling logic for Jekyll and Docusaurus - Applied author strategies in FrontMatterConverter - Added `authors` and `platform` fields to DocusaurusSettings and JekyllSettings - Enhanced O2Settings with UI for author input specific to Jekyll and Docusaurus - Added test cases for handling multiple authors - Extended existing defaultAuthor functionality to support multiple authors --- src/AuthorStrategyFactory.ts | 25 +++ src/FrontMatterConverter.ts | 37 +++-- src/docusaurus/docusaurus.ts | 17 +- src/docusaurus/settings/DocusaurusSettings.ts | 5 + src/enums/PlatformType.ts | 6 + src/jekyll/chirpy.ts | 2 + src/jekyll/settings/JekyllSettings.ts | 4 + src/settings.ts | 29 ++++ src/strategies/authors/AuthorStrategy.ts | 6 + .../authors/DefaultAuthorStrategy.ts | 8 + .../authors/DocusaurusAuthorStrategy.ts | 15 ++ .../authors/JekyllAuthorStrategy.ts | 15 ++ src/tests/FrontMatterConverter.test.ts | 147 ++++++++++++++++++ 13 files changed, 302 insertions(+), 14 deletions(-) create mode 100644 src/AuthorStrategyFactory.ts create mode 100644 src/enums/PlatformType.ts create mode 100644 src/strategies/authors/AuthorStrategy.ts create mode 100644 src/strategies/authors/DefaultAuthorStrategy.ts create mode 100644 src/strategies/authors/DocusaurusAuthorStrategy.ts create mode 100644 src/strategies/authors/JekyllAuthorStrategy.ts diff --git a/src/AuthorStrategyFactory.ts b/src/AuthorStrategyFactory.ts new file mode 100644 index 0000000..91f4fae --- /dev/null +++ b/src/AuthorStrategyFactory.ts @@ -0,0 +1,25 @@ +import { PlatformType } from './enums/PlatformType'; +import { + AuthorStrategy, + + +} from './strategies/authors/AuthorStrategy'; +import { DocusaurusAuthorStrategy } from './strategies/authors/DocusaurusAuthorStrategy'; +import { JekyllAuthorStrategy } from './strategies/authors/JekyllAuthorStrategy'; +import { DefaultAuthorStrategy } from './strategies/authors/DefaultAuthorStrategy'; + +export class AuthorStrategyFactory { + static createStrategy(platform: PlatformType, authors: string): AuthorStrategy { + if (!authors) { + return new DefaultAuthorStrategy(); + } + switch (platform) { + case PlatformType.Jekyll: + return new JekyllAuthorStrategy(); + case PlatformType.Docusaurus: + return new DocusaurusAuthorStrategy(); + default: + return new DefaultAuthorStrategy(); + } + } +} diff --git a/src/FrontMatterConverter.ts b/src/FrontMatterConverter.ts index 39970ae..3eed342 100644 --- a/src/FrontMatterConverter.ts +++ b/src/FrontMatterConverter.ts @@ -1,8 +1,11 @@ import { ObsidianRegex } from './core/ObsidianRegex'; import { Converter } from './core/Converter'; import yaml from 'js-yaml'; +import { AuthorStrategyFactory } from './AuthorStrategyFactory'; +import { PlatformType } from './enums/PlatformType'; +import { AuthorStrategy } from './strategies/authors/AuthorStrategy'; -interface FrontMatter { +export interface FrontMatter { [key: string]: string | undefined; } @@ -64,17 +67,23 @@ export class FrontMatterConverter implements Converter { private readonly resourcePath: string; private readonly isEnableBanner: boolean; private readonly isEnableUpdateFrontmatterTimeOnEdit: boolean; + private readonly authors: string; + private readonly authorStrategy: AuthorStrategy; constructor( fileName: string, resourcePath: string, - isEnableBanner = false, - isEnableUpdateFrontmatterTimeOnEdit = false, + isEnableBanner: boolean = false, + isEnableUpdateFrontmatterTimeOnEdit: boolean = false, + authors: string = '', + platform: PlatformType = PlatformType.Default ) { this.fileName = fileName; this.resourcePath = resourcePath; this.isEnableBanner = isEnableBanner; this.isEnableUpdateFrontmatterTimeOnEdit = isEnableUpdateFrontmatterTimeOnEdit; + this.authors = authors; + this.authorStrategy = AuthorStrategyFactory.createStrategy(platform, authors); } parseFrontMatter(content: string): [FrontMatter, string] { @@ -93,13 +102,15 @@ export class FrontMatterConverter implements Converter { } const result = convert( - convertImageFrontMatter( - this.isEnableBanner, - this.fileName, - this.resourcePath, - replaceDateFrontMatter( - { ...frontMatter }, - this.isEnableUpdateFrontmatterTimeOnEdit, + this.applyAuthors( + convertImageFrontMatter( + this.isEnableBanner, + this.fileName, + this.resourcePath, + replaceDateFrontMatter( + { ...frontMatter }, + this.isEnableUpdateFrontmatterTimeOnEdit, + ), ), ), ); @@ -107,6 +118,12 @@ export class FrontMatterConverter implements Converter { return join(result, body); } + private applyAuthors(frontMatter: FrontMatter): FrontMatter { + if (this.authors) { + return this.authorStrategy.applyAuthors(frontMatter, this.authors); + } + return frontMatter; + } } function convertImageFrontMatter( diff --git a/src/docusaurus/docusaurus.ts b/src/docusaurus/docusaurus.ts index e545188..e6a0b17 100644 --- a/src/docusaurus/docusaurus.ts +++ b/src/docusaurus/docusaurus.ts @@ -6,7 +6,8 @@ import { convertFootnotes } from '../FootnotesConverter'; import { convertDocusaurusCallout } from '../CalloutConverter'; import { convertComments } from '../CommentsConverter'; import { Notice, TFile } from 'obsidian'; -import { convertFrontMatter } from '../FrontMatterConverter'; +import { FrontMatterConverter } from '../FrontMatterConverter'; +import DocusaurusSettings from './settings/DocusaurusSettings'; const markPublished = async (plugin: O2Plugin) => { const filesInReady = getFilesInReady(plugin); @@ -39,21 +40,29 @@ const checkPublished = async (plugin: O2Plugin, file: TFile) => { }; export const convertToDocusaurus = async (plugin: O2Plugin) => { + const settings = plugin.docusaurus as DocusaurusSettings; // get file name in ready folder const markdownFiles = await copyMarkdownFile(plugin); for (const file of markdownFiles) { const publishedDate = await checkPublished(plugin, file); + const frontMatterConverter = new FrontMatterConverter( + file.name, + settings.resourcePath(), + false, + false, + settings.authors, + settings.platform, + ); + const contents: Contents = await plugin.app.vault.read(file); const result = convertComments( convertDocusaurusCallout( convertFootnotes( convertWikiLink( - convertFrontMatter( - contents, - ), + frontMatterConverter.convert(contents), ), ), ), diff --git a/src/docusaurus/settings/DocusaurusSettings.ts b/src/docusaurus/settings/DocusaurusSettings.ts index 7289cb7..ad112bf 100644 --- a/src/docusaurus/settings/DocusaurusSettings.ts +++ b/src/docusaurus/settings/DocusaurusSettings.ts @@ -1,9 +1,14 @@ import { O2PluginSettings } from '../../settings'; import { DateExtractionPattern } from '../DateExtractionPattern'; +import { PlatformType } from '../../enums/PlatformType'; +import { AuthorStrategy } from '../../strategies/authors/AuthorStrategy'; export default class DocusaurusSettings implements O2PluginSettings { docusaurusPath: string; dateExtractionPattern: string; + authors: string = ''; + authorStrategy: AuthorStrategy; + platform: PlatformType = PlatformType.Docusaurus; targetPath(): string { return `${this.docusaurusPath}/blog`; diff --git a/src/enums/PlatformType.ts b/src/enums/PlatformType.ts new file mode 100644 index 0000000..42ecda4 --- /dev/null +++ b/src/enums/PlatformType.ts @@ -0,0 +1,6 @@ +export enum PlatformType { + Default, + Jekyll, + Docusaurus, + // 추가 플랫폼은 여기에 열거할 수 있습니다. +} diff --git a/src/jekyll/chirpy.ts b/src/jekyll/chirpy.ts index bfd86ec..64a72cc 100644 --- a/src/jekyll/chirpy.ts +++ b/src/jekyll/chirpy.ts @@ -24,6 +24,8 @@ export async function convertToChirpy(plugin: O2Plugin) { settings.jekyllRelativeResourcePath, settings.isEnableBanner, settings.isEnableUpdateFrontmatterTimeOnEdit, + settings.authors, + settings.platform, ); const resourceLinkConverter = new ResourceLinkConverter( fileName, diff --git a/src/jekyll/settings/JekyllSettings.ts b/src/jekyll/settings/JekyllSettings.ts index 92125e0..59c38e9 100644 --- a/src/jekyll/settings/JekyllSettings.ts +++ b/src/jekyll/settings/JekyllSettings.ts @@ -1,8 +1,12 @@ import { O2PluginSettings } from '../../settings'; +import { PlatformType } from '../../enums/PlatformType'; export default class JekyllSettings implements O2PluginSettings { private _jekyllPath: string; private _jekyllRelativeResourcePath: string; + authors: string = ''; + platform: PlatformType = PlatformType.Jekyll; + pathReplacer(year: string, month: string, day: string, title: string): string { return `${year}-${month}-${day}-${title}.md`; } diff --git a/src/settings.ts b/src/settings.ts index 8389b03..5b81b36 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -57,6 +57,7 @@ export class O2SettingTab extends PluginSettingTab { }); this.addJekyllPathSetting(); this.addJekyllRelativeResourcePathSetting(); + this.addJekyllAuthorsSettings(); // docusaurus settings this.containerEl.createEl('h2', { @@ -64,6 +65,34 @@ export class O2SettingTab extends PluginSettingTab { }); this.addDocusaurusPathSetting(); this.dateExtractionPatternSetting(); + this.addDocusaurusAuthorsSettings(); + } + private addJekyllAuthorsSettings() { + const jekyllSettings = this.plugin.jekyll as JekyllSettings; + new Setting(this.containerEl) + .setName('Jekyll Authors') + .setDesc('Enter authors separated by commas. For single author, enter only one name.') + .addText(text => text + .setPlaceholder('author1, author2, ...') + .setValue(jekyllSettings.authors) + .onChange(async (value) => { + jekyllSettings.authors = value; + await this.plugin.saveSettings(); + })); + } + + private addDocusaurusAuthorsSettings() { + const docusaurusSettings = this.plugin.docusaurus as DocusaurusSettings; + new Setting(this.containerEl) + .setName('Docusaurus Authors') + .setDesc('Enter authors separated by commas. For single author, enter only one name.') + .addText(text => text + .setPlaceholder('author1, author2, ...') + .setValue(docusaurusSettings.authors) + .onChange(async (value) => { + docusaurusSettings.authors = value; + await this.plugin.saveSettings(); + })); } private enableUpdateFrontmatterTimeOnEditSetting() { diff --git a/src/strategies/authors/AuthorStrategy.ts b/src/strategies/authors/AuthorStrategy.ts new file mode 100644 index 0000000..9181b52 --- /dev/null +++ b/src/strategies/authors/AuthorStrategy.ts @@ -0,0 +1,6 @@ +import { FrontMatter } from '../../FrontMatterConverter'; + +export interface AuthorStrategy { + applyAuthors(frontMatter: FrontMatter, authors: string): FrontMatter; +} + diff --git a/src/strategies/authors/DefaultAuthorStrategy.ts b/src/strategies/authors/DefaultAuthorStrategy.ts new file mode 100644 index 0000000..32fab79 --- /dev/null +++ b/src/strategies/authors/DefaultAuthorStrategy.ts @@ -0,0 +1,8 @@ +import { AuthorStrategy } from './AuthorStrategy'; +import { FrontMatter } from '../../FrontMatterConverter'; + +export class DefaultAuthorStrategy implements AuthorStrategy { + applyAuthors(frontMatter: FrontMatter, authors: string): FrontMatter { + return frontMatter; + } +} diff --git a/src/strategies/authors/DocusaurusAuthorStrategy.ts b/src/strategies/authors/DocusaurusAuthorStrategy.ts new file mode 100644 index 0000000..b076ebe --- /dev/null +++ b/src/strategies/authors/DocusaurusAuthorStrategy.ts @@ -0,0 +1,15 @@ +import { AuthorStrategy } from './AuthorStrategy'; +import { FrontMatter } from '../../FrontMatterConverter'; + +export class DocusaurusAuthorStrategy implements AuthorStrategy { + applyAuthors(frontMatter: FrontMatter, authors: string): FrontMatter { + const authorsList = authors.split(',').map(author => author.trim()); + delete frontMatter.author; + if (authorsList.length === 1) { + frontMatter.authors = authorsList[0]; + } else { + frontMatter.authors = `[${authorsList.join(', ')}]`; + } + return frontMatter; + } +} diff --git a/src/strategies/authors/JekyllAuthorStrategy.ts b/src/strategies/authors/JekyllAuthorStrategy.ts new file mode 100644 index 0000000..9150178 --- /dev/null +++ b/src/strategies/authors/JekyllAuthorStrategy.ts @@ -0,0 +1,15 @@ +import { AuthorStrategy } from './AuthorStrategy'; +import { FrontMatter } from '../../FrontMatterConverter'; + +export class JekyllAuthorStrategy implements AuthorStrategy { + applyAuthors(frontMatter: FrontMatter, authors: string): FrontMatter { + const authorsList = authors.split(',').map(author => author.trim()); + delete frontMatter.authors; + if (authorsList.length === 1) { + frontMatter.author = authorsList[0]; + } else { + frontMatter.authors = `[${authorsList.join(', ')}]`; + } + return frontMatter; + } +} diff --git a/src/tests/FrontMatterConverter.test.ts b/src/tests/FrontMatterConverter.test.ts index d9e4cd2..1e136a3 100644 --- a/src/tests/FrontMatterConverter.test.ts +++ b/src/tests/FrontMatterConverter.test.ts @@ -1,4 +1,5 @@ import { convertFrontMatter, FrontMatterConverter } from '../FrontMatterConverter'; +import { PlatformType } from '../enums/PlatformType'; const frontMatterConverter = new FrontMatterConverter('2023-01-01-test-title', 'assets/img', true); const disableImageConverter = new FrontMatterConverter('2023-01-01-test-title', 'assets/img', false); @@ -393,3 +394,149 @@ date: 2021-01-01 12:00:00 +0900 expect(result).toEqual(incompleteFrontMatterContents); // Assuming the function passes through incomplete front matter as is }); }); + +describe('Author/Authors conversion', () => { + describe('Jekyll', () => { + it('should add single author for Jekyll', () => { + const converter = new FrontMatterConverter('test-file', 'assets/img', false, false, 'John Doe', PlatformType.Jekyll); + const input = `--- +title: "Test Post" +--- +Content`; + const expected = `--- +title: "Test Post" +author: John Doe +--- + +Content`; + expect(converter.convert(input)).toEqual(expected); + }); + + it('should add multiple authors for Jekyll', () => { + const converter = new FrontMatterConverter('test-file', 'assets/img', false, false, 'John Doe, Jane Smith', PlatformType.Jekyll); + const input = `--- +title: "Test Post" +--- + +Content`; + const expected = `--- +title: "Test Post" +authors: [John Doe, Jane Smith] +--- + +Content`; + expect(converter.convert(input)).toEqual(expected); + }); + + it('should overwrite existing author for Jekyll', () => { + const converter = new FrontMatterConverter('test-file', 'assets/img', false, false, 'John Doe', PlatformType.Jekyll); + const input = `--- +title: "Test Post" +author: Existing Author +--- +Content`; + const expected = `--- +title: "Test Post" +author: John Doe +--- + +Content`; + expect(converter.convert(input)).toEqual(expected); + }); + + it('should overwrite existing authors with single author for Jekyll', () => { + const converter = new FrontMatterConverter('test-file', 'assets/img', false, false, 'John Doe', PlatformType.Jekyll); + const input = `--- +title: "Test Post" +authors: [Existing Author 1, Existing Author 2] +--- +Content`; + const expected = `--- +title: "Test Post" +author: John Doe +--- + +Content`; + expect(converter.convert(input)).toEqual(expected); + }); + }); + + describe('Docusaurus', () => { + it('should add single author for Docusaurus', () => { + const converter = new FrontMatterConverter('test-file', 'assets/img', false, false, 'John Doe', PlatformType.Docusaurus); + const input = `--- +title: "Test Post" +--- + +Content`; + const expected = `--- +title: "Test Post" +authors: John Doe +--- + +Content`; + expect(converter.convert(input)).toEqual(expected); + }); + + it('should add multiple authors for Docusaurus', () => { + const converter = new FrontMatterConverter('test-file', 'assets/img', false, false, 'John Doe, Jane Smith', PlatformType.Docusaurus); + const input = `--- +title: "Test Post" +--- +Content`; + const expected = `--- +title: "Test Post" +authors: [John Doe, Jane Smith] +--- + +Content`; + expect(converter.convert(input)).toEqual(expected); + }); + + it('should overwrite existing authors for Docusaurus', () => { + const converter = new FrontMatterConverter('test-file', 'assets/img', false, false, 'John Doe, Jane Smith', PlatformType.Docusaurus); + const input = `--- +title: "Test Post" +authors: Existing Author +--- +Content`; + const expected = `--- +title: "Test Post" +authors: [John Doe, Jane Smith] +--- + +Content`; + expect(converter.convert(input)).toEqual(expected); + }); + + it('should overwrite existing single author with multiple authors for Docusaurus', () => { + const converter = new FrontMatterConverter('test-file', 'assets/img', false, false, 'John Doe, Jane Smith', PlatformType.Docusaurus); + const input = `--- +title: "Test Post" +authors: Existing Author +--- +Content`; + const expected = `--- +title: "Test Post" +authors: [John Doe, Jane Smith] +--- + +Content`; + expect(converter.convert(input)).toEqual(expected); + }); + }); + + it('should not add authors when not provided', () => { + const converter = new FrontMatterConverter('test-file', 'assets/img', false, false, '', PlatformType.Docusaurus); + const input = `--- +title: "Test Post" +--- +Content`; + const expected = `--- +title: "Test Post" +--- + +Content`; + expect(converter.convert(input)).toEqual(expected); + }); +});