73 lines
3.0 KiB
VimL
73 lines
3.0 KiB
VimL
" Return the filename of the note with id `noteId`. If the file is note found,
|
|
" then v:false is returned.
|
|
function denote#meta#fileFromNoteId(noteId)
|
|
" According to the file-naming scheme, the note id is prefixed with '@@'. If
|
|
" the note id appears at the beginning of the filename, then this prefix is
|
|
" optional. There may exist another field (such as the signature, title, or
|
|
" keywords field) after the note id. These are prefixed with '==', '--', or
|
|
" '__'. If the note id is the last field, then the id is followed by the file
|
|
" extension, e.g., '.md'.
|
|
" (A) First, we get all files that contain the note id as substring.
|
|
" (B) Then we ensure that the note id is followed by another field or by the
|
|
" file extension.
|
|
let l:files = glob(g:denote_directory .. '/*' .. a:noteId .. '*', 0, v:true)
|
|
\ ->filter('v:val->split("/")[-1] =~ "' .. a:noteId .. '\\(==\\|--\\|__\\|\\.\\)"')
|
|
\ ->filter('v:val->split("/")[-1] =~ "^' .. a:noteId .. '\\|@@' .. a:noteId .. '"')
|
|
return empty(l:files) ? v:false : l:files[0]
|
|
endfunction
|
|
|
|
" Return the note id from the filename. On failure, v:false is returned.
|
|
function denote#meta#noteIdFromFile(file)
|
|
return a:file->fnamemodify(':t')->matchstr('@@\zs.\{-\}\ze\(==\|--\|__\|\..\)')
|
|
\ ?? a:file->fnamemodify(':t')->matchstr('^.\{-\}\ze\(==\|--\|__\|\..\)')
|
|
\ ?? v:false
|
|
endfunction
|
|
|
|
" Return the note title from the filename.
|
|
function denote#meta#noteTitleFromFile(file)
|
|
return a:file->fnamemodify(':t')
|
|
\ ->matchstr('--\zs.\{-\}\ze\(==\|@@\|__\|\..\)')
|
|
\ ->substitute('-', ' ', 'g')
|
|
endfunction
|
|
|
|
" Return the note tags from the filename as a list.
|
|
function denote#meta#noteTagsFromFile(file)
|
|
return a:file->fnamemodify(':t')
|
|
\ ->matchstr('__\zs.\{-\}\ze\(==\|@@\|--\|\..\)')
|
|
\ ->split('_')
|
|
endfunction
|
|
|
|
" Return the note signature from the filename.
|
|
function denote#meta#noteSignatureFromFile(file)
|
|
return a:file->fnamemodify(':t')
|
|
\ ->matchstr('==\zs.\{-\}\ze\(==\|@@\|__\|\..\)')
|
|
endfunction
|
|
|
|
" Identifier creation
|
|
function denote#meta#identifier_generate()
|
|
return exists('*strftime')
|
|
\ ? strftime('%Y%m%dT%H%M%S')
|
|
\ : rand()
|
|
endfunction
|
|
|
|
" This function removes illegal characters in parts of the filename.
|
|
function s:santizefnpart(part)
|
|
return a:part->tolower()
|
|
\ ->substitute('[^[:alnum:]]', '-', 'g')
|
|
\ ->substitute('-\+', '-', 'g')
|
|
\ ->substitute('_\+', '_', 'g')
|
|
\ ->substitute('=\+', '=', 'g')
|
|
\ ->substitute('@\+', '@', 'g')
|
|
\ ->trim('-_@=')
|
|
endfunction
|
|
|
|
" Function that returns the filename give all metadata. The filename is
|
|
" returned with the path to the denote directory.
|
|
function denote#meta#filename(ext, identifier, title='', tags=[], signature='')
|
|
let l:f = g:denote_directory .. '/' .. s:santizefnpart(a:identifier)
|
|
let l:f ..= len(a:signature) > 0 ? ('==' .. s:santizefnpart(a:signature)) : ''
|
|
let l:f ..= len(a:title) > 0 ? ('--' .. s:santizefnpart(a:title)) : ''
|
|
let l:f ..= len(a:tags) > 0 ? ('__' .. map(copy(a:tags), {_, v -> s:santizefnpart(v)})->join('_')) : ''
|
|
return l:f .. '.' .. a:ext
|
|
endfunction
|