diff --git a/src/rendering/renderer/fileNameRenderer.spec.ts b/src/rendering/renderer/fileNameRenderer.spec.ts index 5b1ea60..8aa0dd0 100644 --- a/src/rendering/renderer/fileNameRenderer.spec.ts +++ b/src/rendering/renderer/fileNameRenderer.spec.ts @@ -1,4 +1,4 @@ -import type { Book } from '~/models'; +import type { Book, BookMetadata } from '~/models'; import FileNameRenderer from './fileNameRenderer'; @@ -25,18 +25,24 @@ describe('FileNameRenderer', () => { const book: Partial = { title: 'Immunity to change: How to overcome it', }; + const metadata: Partial = { + publicationDate: '2010' + }; const renderer = new FileNameRenderer('{{shortTitle}}'); - expect(renderer.render(book)).toBe('Immunity to change.md'); + expect(renderer.render(book, metadata)).toBe('Immunity to change.md'); }); it('File name with book title as is', () => { const book: Partial = { title: 'Immunity to change: How to overcome it', }; + const metadata: Partial = { + publicationDate: '2010' + }; const renderer = new FileNameRenderer('{{longTitle}}'); - expect(renderer.render(book)).toBe('Immunity to change How to overcome it.md'); + expect(renderer.render(book, metadata)).toBe('Immunity to change How to overcome it.md'); }); it('File name with author', () => { @@ -44,9 +50,25 @@ describe('FileNameRenderer', () => { title: 'Immunity to change: How to overcome it', author: 'John Doe', }; + const metadata: Partial = { + publicationDate: '2010' + }; const renderer = new FileNameRenderer('{{author}}'); - expect(renderer.render(book)).toBe('John Doe.md'); + expect(renderer.render(book, metadata)).toBe('John Doe.md'); + }); + + it('File name with publication date', () => { + const book: Partial = { + title: 'Immunity to change: How to overcome it', + author: 'John Doe', + }; + const metadata: Partial = { + publicationDate: '2010' + }; + + const renderer = new FileNameRenderer('{{publicationDate}} - {{author}}'); + expect(renderer.render(book, metadata)).toBe('2010 - John Doe.md'); }); }); }); diff --git a/src/rendering/renderer/fileNameRenderer.ts b/src/rendering/renderer/fileNameRenderer.ts index 70534bb..fcfab97 100644 --- a/src/rendering/renderer/fileNameRenderer.ts +++ b/src/rendering/renderer/fileNameRenderer.ts @@ -1,7 +1,7 @@ import nunjucks, { Environment } from 'nunjucks'; import sanitize from 'sanitize-filename'; -import type { Book } from '~/models'; +import type { Book, BookMetadata } from '~/models'; import { fileNameTemplateVariables } from './templateVariables'; @@ -21,8 +21,8 @@ export default class FileNameRenderer { } } - public render(book: Partial): string { - const templateVariables = fileNameTemplateVariables(book); + public render(book: Partial, metadata: Partial): string { + const templateVariables = fileNameTemplateVariables(book, metadata); const fileName = this.nunjucks.renderString(this.template, templateVariables); diff --git a/src/rendering/renderer/templateVariables.ts b/src/rendering/renderer/templateVariables.ts index 12a617e..fecea28 100644 --- a/src/rendering/renderer/templateVariables.ts +++ b/src/rendering/renderer/templateVariables.ts @@ -1,6 +1,6 @@ import moment from 'moment'; -import type { Book, BookHighlight, Highlight } from '~/models'; +import type { Book, BookHighlight, BookMetadata, Highlight } from '~/models'; import { parseAuthors, shortenTitle } from '~/utils'; import { generateAppLink } from './utils'; @@ -21,6 +21,7 @@ type CommonTemplateVariables = AuthorsTemplateVariables & { type FileNameTemplateVariables = CommonTemplateVariables & { shortTitle: string; // TODO: Eventually deprecate + publicationDate?: string; }; type FileTemplateVariables = CommonTemplateVariables & { @@ -79,8 +80,14 @@ export const commonTemplateVariables = (book: Partial): FileNameTemplateVa }; }; -export const fileNameTemplateVariables = (book: Partial): FileNameTemplateVariables => { - return commonTemplateVariables(book); +export const fileNameTemplateVariables = ( + book: Partial, + metadata: Partial +): FileNameTemplateVariables => { + return { + publicationDate: metadata?.publicationDate, + ...commonTemplateVariables(book), + }; }; export const highlightTemplateVariables = ( diff --git a/src/settings/templateEditorModal/data.ts b/src/settings/templateEditorModal/data.ts index 85b71d1..406c05b 100644 --- a/src/settings/templateEditorModal/data.ts +++ b/src/settings/templateEditorModal/data.ts @@ -7,6 +7,9 @@ const data: BookHighlight[] = [ title: 'Animal Farm (Classics To Go)', author: 'George Orwell', }, + metadata: { + publicationDate: '1945', + }, highlights: [ { id: '1-A', @@ -24,6 +27,9 @@ const data: BookHighlight[] = [ title: 'An Everyone Culture', author: 'Robert Kegan and Lisa Laskow Lahey', }, + metadata: { + publicationDate: '2016', + }, highlights: [ { id: '2-A', @@ -45,6 +51,9 @@ const data: BookHighlight[] = [ title: 'The Girl on the Train: A Novel', author: 'Paula Hawkins', }, + metadata: { + publicationDate: '2015', + }, highlights: [ { id: '3-A', diff --git a/src/settings/templateEditorModal/store.ts b/src/settings/templateEditorModal/store.ts index f970ac1..456f4be 100644 --- a/src/settings/templateEditorModal/store.ts +++ b/src/settings/templateEditorModal/store.ts @@ -51,7 +51,7 @@ export default (): TemplateEditorModalStore => { const fileNameTemplate = $fileNameTemplateField || DefaultFileNameTemplate; try { const renderer = new FileNameRenderer(fileNameTemplate); - return renderer.render($selectedBook.book); + return renderer.render($selectedBook.book, $selectedBook.metadata); } catch (error) { return InvalidRender; }