Make auto_tags preserve existing tag section structure
This commit is contained in:
+48
-43
@@ -360,65 +360,70 @@ function! vimwiki#tags#generate_tags(create, ...) abort
|
||||
|
||||
" make a dictionary { tag_name: [tag_links, ...] }
|
||||
let tags_entries = {}
|
||||
for tagname in self.specific_tags
|
||||
let tags_entries[tagname] = []
|
||||
endfor
|
||||
|
||||
for entries in values(metadata)
|
||||
for entry in entries
|
||||
if has_key(tags_entries, entry.tagname)
|
||||
call add(tags_entries[entry.tagname], [entry.link, entry.description])
|
||||
else
|
||||
let tags_entries[entry.tagname] = [[entry.link, entry.description]]
|
||||
if need_all_tags
|
||||
let tags_entries[entry.tagname] = [[entry.link, entry.description]]
|
||||
endif
|
||||
endif
|
||||
endfor
|
||||
unlet entry " needed for older vims with sticky type checking since name is reused
|
||||
endfor
|
||||
|
||||
let tagnames = need_all_tags ? sort(keys(tags_entries)) : self.specific_tags
|
||||
let lines = []
|
||||
let bullet = repeat(' ', vimwiki#lst#get_list_margin()).vimwiki#lst#default_symbol().' '
|
||||
let current_dir = vimwiki#base#current_subdir()
|
||||
for tagname in sort(keys(tags_entries))
|
||||
if need_all_tags || index(self.specific_tags, tagname) != -1
|
||||
if len(lines) > 0
|
||||
for tagname in tagnames
|
||||
if len(lines) > 0
|
||||
call add(lines, '')
|
||||
endif
|
||||
|
||||
let tag_tpl = printf('rxH%d_Template', self.header_level + 1)
|
||||
call add(lines, s:safesubstitute(vimwiki#vars#get_syntaxlocal(tag_tpl), '__Header__', tagname, ''))
|
||||
|
||||
if vimwiki#vars#get_wikilocal('syntax') ==# 'markdown'
|
||||
for _ in range(vimwiki#vars#get_global('markdown_header_style'))
|
||||
call add(lines, '')
|
||||
endif
|
||||
|
||||
let tag_tpl = printf('rxH%d_Template', self.header_level + 1)
|
||||
call add(lines, s:safesubstitute(vimwiki#vars#get_syntaxlocal(tag_tpl), '__Header__', tagname, ''))
|
||||
|
||||
if vimwiki#vars#get_wikilocal('syntax') ==# 'markdown'
|
||||
for _ in range(vimwiki#vars#get_global('markdown_header_style'))
|
||||
call add(lines, '')
|
||||
endfor
|
||||
endif
|
||||
|
||||
for [taglink, tagdescription] in sort(tags_entries[tagname])
|
||||
let taglink = vimwiki#path#relpath(current_dir, taglink)
|
||||
if vimwiki#vars#get_wikilocal('syntax') ==# 'markdown'
|
||||
let link_tpl = vimwiki#vars#get_syntaxlocal('Weblink3Template')
|
||||
let link_infos = vimwiki#base#resolve_link(taglink)
|
||||
if empty(link_infos.anchor)
|
||||
let link_tpl = vimwiki#vars#get_syntaxlocal('Link1')
|
||||
let entry = s:safesubstitute(link_tpl, '__LinkUrl__', taglink, '')
|
||||
let entry = s:safesubstitute(entry, '__LinkDescription__', tagdescription, '')
|
||||
let file_extension = vimwiki#vars#get_wikilocal('ext', vimwiki#vars#get_bufferlocal('wiki_nr'))
|
||||
let entry = s:safesubstitute(entry, '__FileExtension__', file_extension , '')
|
||||
else
|
||||
let link_caption = split(tagdescription, '#', 0)[-1]
|
||||
let link_text = split(taglink, '#', 1)[0]
|
||||
let entry = s:safesubstitute(link_tpl, '__LinkUrl__', link_text, '')
|
||||
let entry = s:safesubstitute(entry, '__LinkAnchor__', link_infos.anchor, '')
|
||||
let entry = s:safesubstitute(entry, '__LinkDescription__', link_caption, '')
|
||||
let file_extension = vimwiki#vars#get_wikilocal('ext', vimwiki#vars#get_bufferlocal('wiki_nr'))
|
||||
let entry = s:safesubstitute(entry, '__FileExtension__', file_extension , '')
|
||||
endif
|
||||
|
||||
call add(lines, bullet . entry)
|
||||
else
|
||||
let link_tpl = vimwiki#vars#get_global('WikiLinkTemplate1')
|
||||
let file_extension = vimwiki#vars#get_wikilocal('ext', vimwiki#vars#get_bufferlocal('wiki_nr'))
|
||||
let link_tpl = s:safesubstitute(link_tpl, '__FileExtension__', file_extension , '')
|
||||
call add(lines, bullet . substitute(link_tpl, '__LinkUrl__', taglink, ''))
|
||||
endif
|
||||
endfor
|
||||
endif
|
||||
|
||||
for [taglink, tagdescription] in sort(tags_entries[tagname])
|
||||
let taglink = vimwiki#path#relpath(current_dir, taglink)
|
||||
if vimwiki#vars#get_wikilocal('syntax') ==# 'markdown'
|
||||
let link_tpl = vimwiki#vars#get_syntaxlocal('Weblink3Template')
|
||||
let link_infos = vimwiki#base#resolve_link(taglink)
|
||||
if empty(link_infos.anchor)
|
||||
let link_tpl = vimwiki#vars#get_syntaxlocal('Link1')
|
||||
let entry = s:safesubstitute(link_tpl, '__LinkUrl__', taglink, '')
|
||||
let entry = s:safesubstitute(entry, '__LinkDescription__', tagdescription, '')
|
||||
let file_extension = vimwiki#vars#get_wikilocal('ext', vimwiki#vars#get_bufferlocal('wiki_nr'))
|
||||
let entry = s:safesubstitute(entry, '__FileExtension__', file_extension , '')
|
||||
else
|
||||
let link_caption = split(tagdescription, '#', 0)[-1]
|
||||
let link_text = split(taglink, '#', 1)[0]
|
||||
let entry = s:safesubstitute(link_tpl, '__LinkUrl__', link_text, '')
|
||||
let entry = s:safesubstitute(entry, '__LinkAnchor__', link_infos.anchor, '')
|
||||
let entry = s:safesubstitute(entry, '__LinkDescription__', link_caption, '')
|
||||
let file_extension = vimwiki#vars#get_wikilocal('ext', vimwiki#vars#get_bufferlocal('wiki_nr'))
|
||||
let entry = s:safesubstitute(entry, '__FileExtension__', file_extension , '')
|
||||
endif
|
||||
|
||||
call add(lines, bullet . entry)
|
||||
else
|
||||
let link_tpl = vimwiki#vars#get_global('WikiLinkTemplate1')
|
||||
let file_extension = vimwiki#vars#get_wikilocal('ext', vimwiki#vars#get_bufferlocal('wiki_nr'))
|
||||
let link_tpl = s:safesubstitute(link_tpl, '__FileExtension__', file_extension , '')
|
||||
call add(lines, bullet . substitute(link_tpl, '__LinkUrl__', taglink, ''))
|
||||
endif
|
||||
endfor
|
||||
endfor
|
||||
|
||||
return lines
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
# Test how vimwiki#tags#generate_tags behaves when updating existing tag link sections
|
||||
|
||||
Before (Setup test wiki files):
|
||||
call writefile([":usedtag:", ":othertag:"], expand("~/testmarkdown/Test-Tag-tagged.md"))
|
||||
edit ~/testmarkdown/Test-Tag-links.md
|
||||
|
||||
After (Cleanup files):
|
||||
%delete
|
||||
call system("rm $HOME/testmarkdown/.vimwiki_tags")
|
||||
call system("rm $HOME/testmarkdown/Test-Tag-tagged.md")
|
||||
call system("rm $HOME/testmarkdown/Test-Tag-links.md")
|
||||
|
||||
|
||||
Do (Create preexisting tag links with unused tag):
|
||||
I
|
||||
# Generated Tags\<CR>
|
||||
\<CR>
|
||||
## unusedtag\<CR>
|
||||
\<CR>
|
||||
## usedtag\<CR>
|
||||
\<ESC>
|
||||
:VimwikiRebuildTags!\<CR>
|
||||
:call vimwiki#tags#generate_tags(0)\<CR>
|
||||
|
||||
Expect (Keeps unused tag header):
|
||||
# Generated Tags
|
||||
|
||||
## unusedtag
|
||||
|
||||
|
||||
## usedtag
|
||||
|
||||
- [Test-Tag-tagged](Test-Tag-tagged)
|
||||
|
||||
Do (Create preexisting tag subheadings out of alphabetical order):
|
||||
I
|
||||
# Generated Tags\<CR>
|
||||
\<CR>
|
||||
## z\<CR>
|
||||
\<CR>
|
||||
## usedtag\<CR>
|
||||
\<CR>
|
||||
## a\<CR>
|
||||
\<CR>
|
||||
# Other Stuff
|
||||
\<ESC>
|
||||
:VimwikiRebuildTags!\<CR>
|
||||
:call vimwiki#tags#generate_tags(0)\<CR>
|
||||
|
||||
Expect (Existing tag subheading order is preserved):
|
||||
# Generated Tags
|
||||
|
||||
## z
|
||||
|
||||
|
||||
## usedtag
|
||||
|
||||
- [Test-Tag-tagged](Test-Tag-tagged)
|
||||
|
||||
## a
|
||||
|
||||
|
||||
# Other Stuff
|
||||
Reference in New Issue
Block a user