1- import { Notice , Plugin , TFile , TFolder } from 'obsidian' ;
1+ import { Notice , parseYaml , Plugin , stringifyYaml , TFile , TFolder } from 'obsidian' ;
22import { DEFAULT_SETTINGS , MediaDbPluginSettings , MediaDbSettingTab } from './settings/Settings' ;
33import { APIManager } from './api/APIManager' ;
44import { MediaTypeModel } from './models/MediaTypeModel' ;
@@ -109,33 +109,13 @@ export default class MediaDbPlugin extends Plugin {
109109 console . log ( 'MDB | Creating new note...' ) ;
110110 // console.log(mediaTypeModel);
111111
112- let metadata = this . modelPropertyMapper . convertObject ( mediaTypeModel . toMetaDataObject ( ) ) ;
113- if ( attachFile ) {
114- let attachFileMetadata : any = this . app . metadataCache . getFileCache ( attachFile ) . frontmatter ;
115- if ( attachFileMetadata ) {
116- attachFileMetadata = JSON . parse ( JSON . stringify ( attachFileMetadata ) ) ; // deep copy
117- delete attachFileMetadata . position ;
118- } else {
119- attachFileMetadata = { } ;
120- }
121-
122- metadata = Object . assign ( attachFileMetadata , metadata ) ;
123- }
124-
125- debugLog ( metadata ) ;
112+ let fileMetadata = this . modelPropertyMapper . convertObject ( mediaTypeModel . toMetaDataObject ( ) ) ;
113+ let fileContent = '' ;
126114
127- let fileContent = `---\n${ YAMLConverter . toYaml ( metadata ) } ---\n` ;
115+ ( { fileMetadata, fileContent} = await this . attachFile ( fileMetadata , fileContent , attachFile ) ) ;
116+ ( { fileMetadata, fileContent} = await this . attachTemplate ( fileMetadata , fileContent , await this . mediaTypeManager . getTemplate ( mediaTypeModel , this . app ) ) ) ;
128117
129- if ( this . settings . templates ) {
130- fileContent += await this . mediaTypeManager . getContent ( mediaTypeModel , this . app ) ;
131- }
132-
133- if ( attachFile ) {
134- let attachFileContent : string = await this . app . vault . read ( attachFile ) ;
135- const regExp = new RegExp ( '^(---)\\n[\\s\\S]*\\n---' ) ;
136- attachFileContent = attachFileContent . replace ( regExp , '' ) ;
137- fileContent += '\n\n' + attachFileContent ;
138- }
118+ fileContent = `---\n${ this . settings . useCustomYamlStringifier ? YAMLConverter . toYaml ( fileMetadata ) : stringifyYaml ( fileMetadata ) } ---\n` + fileContent ;
139119
140120 await this . createNote ( this . mediaTypeManager . getFileName ( mediaTypeModel ) , fileContent ) ;
141121 } catch ( e ) {
@@ -144,6 +124,67 @@ export default class MediaDbPlugin extends Plugin {
144124 }
145125 }
146126
127+ async attachFile ( fileMetadata : any , fileContent : string , fileToAttach ?: TFile ) : Promise < { fileMetadata : any , fileContent : string } > {
128+ if ( ! fileToAttach ) {
129+ return { fileMetadata : fileMetadata , fileContent : fileContent } ;
130+ }
131+
132+ let attachFileMetadata : any = this . app . metadataCache . getFileCache ( fileToAttach ) . frontmatter ;
133+ if ( attachFileMetadata ) {
134+ attachFileMetadata = JSON . parse ( JSON . stringify ( attachFileMetadata ) ) ; // deep copy
135+ delete attachFileMetadata . position ;
136+ } else {
137+ attachFileMetadata = { } ;
138+ }
139+ fileMetadata = Object . assign ( attachFileMetadata , fileMetadata ) ;
140+
141+ let attachFileContent : string = await this . app . vault . read ( fileToAttach ) ;
142+ const regExp = new RegExp ( '^(---)\\n[\\s\\S]*\\n---' ) ;
143+ attachFileContent = attachFileContent . replace ( regExp , '' ) ;
144+ fileContent += '\n' + attachFileContent ;
145+
146+ return { fileMetadata : fileMetadata , fileContent : fileContent } ;
147+ }
148+
149+ async attachTemplate ( fileMetadata : any , fileContent : string , template : string ) : Promise < { fileMetadata : any , fileContent : string } > {
150+ if ( ! template ) {
151+ return { fileMetadata : fileMetadata , fileContent : fileContent } ;
152+ }
153+
154+ let templateMetadata : any = this . getMetaDataFromFileContent ( template ) ;
155+ fileMetadata = Object . assign ( templateMetadata , fileMetadata ) ;
156+
157+ const regExp = new RegExp ( '^(---)\\n[\\s\\S]*\\n---' ) ;
158+ const attachFileContent = template . replace ( regExp , '' ) ;
159+ fileContent += '\n' + attachFileContent ;
160+
161+ return { fileMetadata : fileMetadata , fileContent : fileContent } ;
162+ }
163+
164+ getMetaDataFromFileContent ( fileContent : string ) : any {
165+ let metadata : any ;
166+
167+ const regExp = new RegExp ( '^(---)\\n[\\s\\S]*\\n---' ) ;
168+ const frontMatterRegExpResult = regExp . exec ( fileContent ) ;
169+ if ( ! frontMatterRegExpResult ) {
170+ return { } ;
171+ }
172+ let frontMatter = frontMatterRegExpResult [ 0 ] ;
173+ if ( ! frontMatter ) {
174+ return { } ;
175+ }
176+ frontMatter = frontMatter . substring ( 4 ) ;
177+ frontMatter = frontMatter . substring ( 0 , frontMatter . length - 3 ) ;
178+
179+ metadata = parseYaml ( frontMatter ) ;
180+
181+ if ( ! metadata ) {
182+ metadata = { } ;
183+ }
184+
185+ return metadata ;
186+ }
187+
147188 async createNote ( fileName : string , fileContent : string , openFile : boolean = false ) {
148189 fileName = replaceIllegalFileNameCharactersInString ( fileName ) ;
149190 const filePath = `${ this . settings . folder . replace ( / \/ $ / , '' ) } /${ fileName } .md` ;
0 commit comments