is_diary_file(): use filereadable() to check a single file
Intended to address #1267 - "get_diary_files() takes very long to execute on Windows - this leads to very slow link-creation using the Enter key". In theory, this should be a performance improvement for link creation on systems with very slow filesystem access (this came up under Windows, but ought to be a general optimization). It does nothing for generating the entire list of diary files, which by nature has to get the whole list anyway. - Uses a filereadable() call against a path instead of checking the results of get_diary_files() for most calls. - Introduces is_among_diary_files() for the case where you want to check against a get_diary_files() list. - is_diary_file() will pass through to is_among_diary_files() if it gets invoked with a second parameter, to retain backwards compatibility on the off chance anyone has scripted against this behavior. I'm not sure this is necessary, but trying to be cautious with the implicit API here. - Includes a test/api_base_is_diary_file.vader My original version of this change assumed that input would be in the form of "2023-01-01", instead of a fully-qualifed filename. As it is, it expects a full path to the file, in keeping with the list returned by vimwiki#diary#get_diary_files(). Bug: #1267
This commit is contained in:
@@ -449,7 +449,7 @@ function! vimwiki#base#generate_links(create, ...) abort
|
|||||||
let use_caption = vimwiki#vars#get_wikilocal('generated_links_caption', wiki_nr)
|
let use_caption = vimwiki#vars#get_wikilocal('generated_links_caption', wiki_nr)
|
||||||
for link in links
|
for link in links
|
||||||
let link_infos = vimwiki#base#resolve_link(link)
|
let link_infos = vimwiki#base#resolve_link(link)
|
||||||
if !vimwiki#base#is_diary_file(link_infos.filename, copy(l:diary_file_paths))
|
if !vimwiki#base#is_among_diary_files(link_infos.filename, copy(l:diary_file_paths))
|
||||||
let link_tpl = vimwiki#vars#get_syntaxlocal('Link1')
|
let link_tpl = vimwiki#vars#get_syntaxlocal('Link1')
|
||||||
|
|
||||||
let link_caption = vimwiki#base#read_caption(link_infos.filename)
|
let link_caption = vimwiki#base#read_caption(link_infos.filename)
|
||||||
@@ -2639,13 +2639,10 @@ function! s:clean_url(url) abort
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
function! vimwiki#base#is_diary_file(filename, ...) abort
|
function! vimwiki#base#is_among_diary_files(filename, diary_file_paths) abort
|
||||||
" Check if 1.filename is a diary file
|
" Check if filename is in a list of diary files
|
||||||
" An optional second argument allows you to pass in a list of diary files rather
|
|
||||||
" than generating a list on each call to the function.
|
|
||||||
let l:diary_file_paths = a:0 > 0 ? a:1 : vimwiki#diary#get_diary_files()
|
|
||||||
let l:normalised_file_paths =
|
let l:normalised_file_paths =
|
||||||
\ map(l:diary_file_paths, 'vimwiki#path#normalize(v:val)')
|
\ map(a:diary_file_paths, 'vimwiki#path#normalize(v:val)')
|
||||||
" Escape single quote (Issue #886)
|
" Escape single quote (Issue #886)
|
||||||
let filename = substitute(a:filename, "'", "''", 'g')
|
let filename = substitute(a:filename, "'", "''", 'g')
|
||||||
let l:matching_files =
|
let l:matching_files =
|
||||||
@@ -2654,6 +2651,32 @@ function! vimwiki#base#is_diary_file(filename, ...) abort
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
function! vimwiki#base#is_diary_file(filename, ...) abort
|
||||||
|
" Check if filename is a diary file.
|
||||||
|
"
|
||||||
|
" For our purposes, a diary file is any readable file with the current wiki
|
||||||
|
" extension in diary_rel_path.
|
||||||
|
"
|
||||||
|
" An optional second argument allows you to pass in a list of diary files
|
||||||
|
" rather than generating a list on each call to the function. This is
|
||||||
|
" handled by passing off to is_among_diary_files(). This behavior is
|
||||||
|
" retained just in case anyone has scripted against is_diary_file(), but
|
||||||
|
" shouldn't be used internally by VimWiki code. Call is_among_diary_files()
|
||||||
|
" directly instead.
|
||||||
|
|
||||||
|
" Handle the case with diary file paths passed in:
|
||||||
|
if a:0 > 0
|
||||||
|
return vimwiki#base#is_among_diary_files(a:filename, a:1)
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:readable = filereadable(a:filename)
|
||||||
|
let l:diary_path = vimwiki#vars#get_wikilocal('path') .
|
||||||
|
\ vimwiki#vars#get_wikilocal('diary_rel_path')
|
||||||
|
let l:in_diary_path = (0 == stridx(a:filename, l:diary_path))
|
||||||
|
return l:readable && l:in_diary_path
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
function! vimwiki#base#normalize_link_helper(str, rxUrl, rxDesc, template) abort
|
function! vimwiki#base#normalize_link_helper(str, rxUrl, rxDesc, template) abort
|
||||||
" Treat link string towards normalization
|
" Treat link string towards normalization
|
||||||
" [__LinkDescription__](__LinkUrl__.__FileExtension__)
|
" [__LinkDescription__](__LinkUrl__.__FileExtension__)
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
# Test vimwiki#base#is_diary_file() for various inputs.
|
||||||
|
|
||||||
|
Execute (Check known good diary file):
|
||||||
|
VimwikiIndex 1
|
||||||
|
let link_infos = vimwiki#base#resolve_link('diary:2020-07-22')
|
||||||
|
Assert vimwiki#base#is_diary_file(link_infos.filename)
|
||||||
|
|
||||||
|
Execute (Check known good diary file using is_diary_file, with list of all diary files - legacy interface):
|
||||||
|
VimwikiIndex 1
|
||||||
|
let link_infos = vimwiki#base#resolve_link('diary:2020-07-22')
|
||||||
|
let diary_file_paths = vimwiki#diary#get_diary_files()
|
||||||
|
Assert vimwiki#base#is_diary_file(link_infos.filename, diary_file_paths)
|
||||||
|
|
||||||
|
Execute (Check known good diary file use is_among_diary_files, with list of all diary files):
|
||||||
|
VimwikiIndex 1
|
||||||
|
let link_infos = vimwiki#base#resolve_link('diary:2020-07-22')
|
||||||
|
let diary_file_paths = vimwiki#diary#get_diary_files()
|
||||||
|
Assert vimwiki#base#is_among_diary_files(link_infos.filename, diary_file_paths)
|
||||||
|
|
||||||
|
Execute (Check for nonexistent diary file):
|
||||||
|
VimwikiIndex 1
|
||||||
|
Assert !vimwiki#base#is_diary_file('not-a-diary-file')
|
||||||
|
|
||||||
|
Execute (Clean):
|
||||||
|
call ReloadVimwiki()
|
||||||
Reference in New Issue
Block a user