@@ -2,7 +2,15 @@ import { MarkdownView, Notice, parseYaml, Plugin, stringifyYaml, TFile, TFolder
22import { getDefaultSettings , MediaDbPluginSettings , MediaDbSettingTab } from './settings/Settings' ;
33import { APIManager } from './api/APIManager' ;
44import { MediaTypeModel } from './models/MediaTypeModel' ;
5- import { CreateNoteOptions , dateTimeToString , markdownTable , replaceIllegalFileNameCharactersInString , unCamelCase } from './utils/Utils' ;
5+ import {
6+ CreateNoteOptions ,
7+ dateTimeToString ,
8+ markdownTable ,
9+ replaceIllegalFileNameCharactersInString ,
10+ unCamelCase ,
11+ hasTemplaterPlugin ,
12+ useTemplaterPluginInFile ,
13+ } from './utils/Utils' ;
614import { OMDbAPI } from './api/apis/OMDbAPI' ;
715import { MALAPI } from './api/apis/MALAPI' ;
816import { MALAPIManga } from './api/apis/MALAPIManga' ;
@@ -63,7 +71,8 @@ export default class MediaDbPlugin extends Plugin {
6371 this . app . workspace . on ( 'file-menu' , ( menu , file ) => {
6472 if ( file instanceof TFolder ) {
6573 menu . addItem ( item => {
66- item . setTitle ( 'Import folder as Media DB entries' )
74+ item
75+ . setTitle ( 'Import folder as Media DB entries' )
6776 . setIcon ( 'database' )
6877 . onClick ( ( ) => this . createEntriesFromFolder ( file ) ) ;
6978 } ) ;
@@ -286,7 +295,11 @@ export default class MediaDbPlugin extends Plugin {
286295 options . folder = await this . mediaTypeManager . getFolder ( mediaTypeModel , this . app ) ;
287296 }
288297
289- await this . createNote ( this . mediaTypeManager . getFileName ( mediaTypeModel ) , fileContent , options ) ;
298+ const targetFile = await this . createNote ( this . mediaTypeManager . getFileName ( mediaTypeModel ) , fileContent , options ) ;
299+
300+ if ( this . settings . enableTemplaterIntegration ) {
301+ await useTemplaterPluginInFile ( this . app , targetFile ) ;
302+ }
290303 } catch ( e ) {
291304 console . warn ( e ) ;
292305 new Notice ( e . toString ( ) ) ;
@@ -299,14 +312,87 @@ export default class MediaDbPlugin extends Plugin {
299312 }
300313
301314 async generateMediaDbNoteContents ( mediaTypeModel : MediaTypeModel , options : CreateNoteOptions ) : Promise < string > {
315+ let template = await this . mediaTypeManager . getTemplate ( mediaTypeModel , this . app ) ;
316+
317+ if ( this . settings . useDefaultFrontMatter || ! template ) {
318+ return this . generateContentWithDefaultFrontMatter ( mediaTypeModel , options , template ) ;
319+ } else {
320+ return this . generateContentWithCustomFrontMatter ( mediaTypeModel , options , template ) ;
321+ }
322+ }
323+
324+ async generateContentWithDefaultFrontMatter ( mediaTypeModel : MediaTypeModel , options : CreateNoteOptions , template ?: string ) : Promise < string > {
302325 let fileMetadata = this . modelPropertyMapper . convertObject ( mediaTypeModel . toMetaDataObject ( ) ) ;
303326 let fileContent = '' ;
304- const template = options . attachTemplate ? await this . mediaTypeManager . getTemplate ( mediaTypeModel , this . app ) : '' ;
327+ template = options . attachTemplate ? template : '' ;
305328
306329 ( { fileMetadata, fileContent } = await this . attachFile ( fileMetadata , fileContent , options . attachFile ) ) ;
307330 ( { fileMetadata, fileContent } = await this . attachTemplate ( fileMetadata , fileContent , template ) ) ;
308331
309- fileContent = `---\n${ this . settings . useCustomYamlStringifier ? YAMLConverter . toYaml ( fileMetadata ) : stringifyYaml ( fileMetadata ) } ---\n` + fileContent ;
332+ if ( this . settings . enableTemplaterIntegration && hasTemplaterPlugin ( this . app ) ) {
333+ // Only support stringifyYaml for templater plugin
334+ // Include the media variable in all templater commands by using a top level JavaScript execution command.
335+ fileContent = `---\n<%* const media = ${ JSON . stringify ( mediaTypeModel ) } %>\n${ stringifyYaml ( fileMetadata ) } ---\n${ fileContent } ` ;
336+ } else {
337+ fileContent = `---\n${ this . settings . useCustomYamlStringifier ? YAMLConverter . toYaml ( fileMetadata ) : stringifyYaml ( fileMetadata ) } ---\n` + fileContent ;
338+ }
339+
340+ return fileContent ;
341+ }
342+
343+ async generateContentWithCustomFrontMatter ( mediaTypeModel : MediaTypeModel , options : CreateNoteOptions , template : string ) : Promise < string > {
344+ const frontMatterRegex = / ^ - - - * \n ( [ \s \S ] * ?) \n - - - \h * / ;
345+
346+ const match = template . match ( frontMatterRegex ) ;
347+
348+ if ( ! match || match . length !== 2 ) {
349+ throw new Error ( 'Cannot find YAML front matter for template.' ) ;
350+ }
351+
352+ let frontMatter = parseYaml ( match [ 1 ] ) ;
353+ let fileContent : string = template . replace ( frontMatterRegex , '' ) ;
354+
355+ // Updating a previous file
356+ if ( options . attachFile ) {
357+ const previousMetadata = this . app . metadataCache . getFileCache ( options . attachFile ) . frontmatter ;
358+
359+ // Use contents (below front matter) from previous file
360+ fileContent = await this . app . vault . read ( options . attachFile ) ;
361+ const regExp = new RegExp ( this . frontMatterRexExpPattern ) ;
362+ fileContent = fileContent . replace ( regExp , '' ) ;
363+ fileContent = fileContent . startsWith ( '\n' ) ? fileContent . substring ( 1 ) : fileContent ;
364+
365+ // Update updated front matter with entries from the old front matter, if it isn't defined in the new front matter
366+ Object . keys ( previousMetadata ) . forEach ( key => {
367+ const value = previousMetadata [ key ] ;
368+
369+ if ( ! frontMatter [ key ] && value ) {
370+ frontMatter [ key ] = value ;
371+ }
372+ } ) ;
373+ }
374+
375+ // Ensure that id, type, and dataSource are defined
376+ if ( ! frontMatter . id ) {
377+ frontMatter . id = mediaTypeModel . id ;
378+ }
379+
380+ if ( ! frontMatter . type ) {
381+ frontMatter . type = mediaTypeModel . type ;
382+ }
383+
384+ if ( ! frontMatter . dataSource ) {
385+ frontMatter . dataSource = mediaTypeModel . dataSource ;
386+ }
387+
388+ if ( this . settings . enableTemplaterIntegration && hasTemplaterPlugin ( this . app ) ) {
389+ // Only support stringifyYaml for templater plugin
390+ // Include the media variable in all templater commands by using a top level JavaScript execution command.
391+ fileContent = `---\n<%* const media = ${ JSON . stringify ( mediaTypeModel ) } %>\n${ stringifyYaml ( frontMatter ) } ---\n${ fileContent } ` ;
392+ } else {
393+ fileContent = `---\n${ this . settings . useCustomYamlStringifier ? YAMLConverter . toYaml ( frontMatter ) : stringifyYaml ( frontMatter ) } ---\n` + fileContent ;
394+ }
395+
310396 return fileContent ;
311397 }
312398
@@ -386,7 +472,7 @@ export default class MediaDbPlugin extends Plugin {
386472 * @param fileContent
387473 * @param options
388474 */
389- async createNote ( fileName : string , fileContent : string , options : CreateNoteOptions ) : Promise < void > {
475+ async createNote ( fileName : string , fileContent : string , options : CreateNoteOptions ) : Promise < TFile > {
390476 // find and possibly create the folder set in settings or passed in folder
391477 const folder = options . folder ?? this . app . vault . getAbstractFileByPath ( '/' ) ;
392478
@@ -412,6 +498,8 @@ export default class MediaDbPlugin extends Plugin {
412498 }
413499 await activeLeaf . openFile ( targetFile , { state : { mode : 'source' } } ) ;
414500 }
501+
502+ return targetFile ;
415503 }
416504
417505 /**
0 commit comments