Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make auto_tags preserve existing tag section structure #1353

Merged
merged 1 commit into from
Jul 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 45 additions & 40 deletions autoload/vimwiki/tags.vim
Original file line number Diff line number Diff line change
Expand Up @@ -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
call add(lines, '')
endif
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, ''))
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
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)
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_tpl = vimwiki#vars#get_global('WikiLinkTemplate1')
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 link_tpl = s:safesubstitute(link_tpl, '__FileExtension__', file_extension , '')
call add(lines, bullet . substitute(link_tpl, '__LinkUrl__', taglink, ''))
let entry = s:safesubstitute(entry, '__FileExtension__', file_extension , '')
endif
endfor
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
Expand Down
63 changes: 63 additions & 0 deletions test/tag_update_existing_heading.vader
Original file line number Diff line number Diff line change
@@ -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
Loading