@@ -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+ executeInlineScriptsTemplates ,
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,9 @@ 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+ await useTemplaterPluginInFile ( this . app , targetFile ) ;
290301 } catch ( e ) {
291302 console . warn ( e ) ;
292303 new Notice ( e . toString ( ) ) ;
@@ -299,15 +310,67 @@ export default class MediaDbPlugin extends Plugin {
299310 }
300311
301312 async generateMediaDbNoteContents ( mediaTypeModel : MediaTypeModel , options : CreateNoteOptions ) : Promise < string > {
302- let fileMetadata = this . modelPropertyMapper . convertObject ( mediaTypeModel . toMetaDataObject ( ) ) ;
303- let fileContent = '' ;
304- const template = options . attachTemplate ? await this . mediaTypeManager . getTemplate ( mediaTypeModel , this . app ) : '' ;
313+ if ( this . settings . useDefaultFrontMatter ) {
314+ let fileMetadata = this . modelPropertyMapper . convertObject ( mediaTypeModel . toMetaDataObject ( ) ) ;
315+ let fileContent = '' ;
316+ const template = options . attachTemplate ? await this . mediaTypeManager . getTemplate ( mediaTypeModel , this . app ) : '' ;
317+
318+ ( { fileMetadata, fileContent } = await this . attachFile ( fileMetadata , fileContent , options . attachFile ) ) ;
319+ ( { fileMetadata, fileContent } = await this . attachTemplate ( fileMetadata , fileContent , template ) ) ;
320+
321+ fileContent = `---\n${ this . settings . useCustomYamlStringifier ? YAMLConverter . toYaml ( fileMetadata ) : stringifyYaml ( fileMetadata ) } ---\n` + fileContent ;
322+ return fileContent ;
323+ } else {
324+ let template = await this . mediaTypeManager . getTemplate ( mediaTypeModel , this . app ) ;
325+ const parts = template . split ( '---' ) ;
326+
327+ if ( parts . length < 3 ) {
328+ throw new Error ( 'Cannot find YAML front matter for template.' ) ;
329+ }
330+
331+ let frontMatter = parseYaml ( parts [ 1 ] ) ;
332+ let fileContent : string = parts [ 2 ] ;
333+
334+ // Updating a previous file
335+ if ( options . attachFile ) {
336+ const previousMetadata = this . app . metadataCache . getFileCache ( options . attachFile ) . frontmatter ;
337+
338+ // Use contents (below front matter) from previous file
339+ fileContent = await this . app . vault . read ( options . attachFile ) ;
340+ const regExp = new RegExp ( this . frontMatterRexExpPattern ) ;
341+ fileContent = fileContent . replace ( regExp , '' ) ;
342+ fileContent = fileContent . startsWith ( '\n' ) ? fileContent . substring ( 1 ) : fileContent ;
343+
344+ // Update updated front matter with entries from the old front matter, if it isn't defined in the new front matter
345+ Object . keys ( previousMetadata ) . forEach ( key => {
346+ const value = previousMetadata [ key ] ;
347+
348+ if ( ! frontMatter [ key ] && value ) {
349+ frontMatter [ key ] = value ;
350+ }
351+ } ) ;
352+ }
353+
354+ // Ensure that id, type, and dataSource are defined
355+ if ( ! frontMatter . id ) {
356+ frontMatter . id = mediaTypeModel . id ;
357+ }
305358
306- ( { fileMetadata, fileContent } = await this . attachFile ( fileMetadata , fileContent , options . attachFile ) ) ;
307- ( { fileMetadata, fileContent } = await this . attachTemplate ( fileMetadata , fileContent , template ) ) ;
359+ if ( ! frontMatter . type ) {
360+ frontMatter . type = mediaTypeModel . type ;
361+ }
308362
309- fileContent = `---\n${ this . settings . useCustomYamlStringifier ? YAMLConverter . toYaml ( fileMetadata ) : stringifyYaml ( fileMetadata ) } ---\n` + fileContent ;
310- return fileContent ;
363+ if ( ! frontMatter . dataSource ) {
364+ frontMatter . dataSource = mediaTypeModel . dataSource ;
365+ }
366+
367+ // Only support stringifyYaml for templater plugin
368+ fileContent = `---\n${ stringifyYaml ( frontMatter ) } ---\n${ fileContent } ` ;
369+
370+ fileContent = executeInlineScriptsTemplates ( mediaTypeModel , fileContent ) ;
371+
372+ return fileContent ;
373+ }
311374 }
312375
313376 async attachFile ( fileMetadata : any , fileContent : string , fileToAttach ?: TFile ) : Promise < { fileMetadata : any ; fileContent : string } > {
@@ -386,7 +449,7 @@ export default class MediaDbPlugin extends Plugin {
386449 * @param fileContent
387450 * @param options
388451 */
389- async createNote ( fileName : string , fileContent : string , options : CreateNoteOptions ) : Promise < void > {
452+ async createNote ( fileName : string , fileContent : string , options : CreateNoteOptions ) : Promise < TFile > {
390453 // find and possibly create the folder set in settings or passed in folder
391454 const folder = options . folder ?? this . app . vault . getAbstractFileByPath ( '/' ) ;
392455
@@ -412,6 +475,8 @@ export default class MediaDbPlugin extends Plugin {
412475 }
413476 await activeLeaf . openFile ( targetFile , { state : { mode : 'source' } } ) ;
414477 }
478+
479+ return targetFile ;
415480 }
416481
417482 /**
0 commit comments