diff --git a/autoload/vimwiki/tags.vim b/autoload/vimwiki/tags.vim index 33efc12..b50415e 100644 --- a/autoload/vimwiki/tags.vim +++ b/autoload/vimwiki/tags.vim @@ -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 diff --git a/test/tag_update_existing_heading.vader b/test/tag_update_existing_heading.vader new file mode 100644 index 0000000..1e1d36e --- /dev/null +++ b/test/tag_update_existing_heading.vader @@ -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\ + \ + ## unusedtag\ + \ + ## usedtag\ + \ + :VimwikiRebuildTags!\ + :call vimwiki#tags#generate_tags(0)\ + +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\ + \ + ## z\ + \ + ## usedtag\ + \ + ## a\ + \ + # Other Stuff + \ + :VimwikiRebuildTags!\ + :call vimwiki#tags#generate_tags(0)\ + +Expect (Existing tag subheading order is preserved): + # Generated Tags + + ## z + + + ## usedtag + + - [Test-Tag-tagged](Test-Tag-tagged) + + ## a + + + # Other Stuff