Merge remote-tracking branch 'upstream/dev' into upstream/tags

This commit is contained in:
Ivan Tishchenko 2015-04-15 22:44:54 +03:00
commit fd66db5551
4 changed files with 107 additions and 184 deletions

View File

@ -270,16 +270,20 @@ function! vimwiki#base#resolve_link(link_text, ...) "{{{
\ 'scheme': '', \ 'scheme': '',
\ 'filename': '', \ 'filename': '',
\ 'anchor': '', \ 'anchor': '',
\ 'relative': 0,
\ } \ }
" extract scheme " extract scheme
let link_infos.scheme = matchstr(link_text, g:vimwiki_rxSchemeUrlMatchScheme) let link_infos.scheme = matchstr(link_text, g:vimwiki_rxSchemeUrlMatchScheme)
if !(link_infos.scheme =~# '\mwiki\d\+' || link_infos.scheme ==# 'diary' || if link_infos.scheme == '' || link_text == ''
\ link_infos.scheme ==# 'local' || link_infos.scheme ==# 'file')
let link_infos.filename = '' " malformed link let link_infos.filename = '' " malformed link
return link_infos return link_infos
endif endif
if link_infos.scheme !~# '\mwiki\d\+\|diary\|local\|file'
let link_infos.filename = link_text " unknown scheme, may be a weblink
return link_infos
endif
let link_text = matchstr(link_text, g:vimwiki_rxSchemeUrlMatchUrl) let link_text = matchstr(link_text, g:vimwiki_rxSchemeUrlMatchUrl)
let is_wiki_link = link_infos.scheme =~# '\mwiki\d\+' || let is_wiki_link = link_infos.scheme =~# '\mwiki\d\+' ||
@ -300,12 +304,11 @@ function! vimwiki#base#resolve_link(link_text, ...) "{{{
" check if absolute or relative path " check if absolute or relative path
if is_wiki_link && link_text[0] == '/' if is_wiki_link && link_text[0] == '/'
let link_text = link_text[1:] let link_text = link_text[1:]
let is_relative = 0 let link_infos.relative = 0
elseif !is_wiki_link && (link_text[0] == '/' || elseif !is_wiki_link && vimwiki#path#is_absolute(link_text)
\ (link_text =~? '\m^\a:' && vimwiki#u#is_windows())) let link_infos.relative = 0
let is_relative = 0
else else
let is_relative = 1 let link_infos.relative = 1
let root_dir = fnamemodify(source_file, ':p:h') . '/' let root_dir = fnamemodify(source_file, ':p:h') . '/'
endif endif
@ -318,7 +321,7 @@ function! vimwiki#base#resolve_link(link_text, ...) "{{{
return link_infos return link_infos
endif endif
if !is_relative || link_infos.index != source_wiki if !link_infos.relative || link_infos.index != source_wiki
let root_dir = VimwikiGet('path', link_infos.index) let root_dir = VimwikiGet('path', link_infos.index)
endif endif
@ -341,19 +344,15 @@ function! vimwiki#base#resolve_link(link_text, ...) "{{{
\ VimwikiGet('diary_rel_path', link_infos.index) . \ VimwikiGet('diary_rel_path', link_infos.index) .
\ link_text . \ link_text .
\ VimwikiGet('ext', link_infos.index) \ VimwikiGet('ext', link_infos.index)
elseif (link_infos.scheme ==# 'file' && is_relative) || elseif (link_infos.scheme ==# 'file' || link_infos.scheme ==# 'local')
\ link_infos.scheme ==# 'local' \ && link_infos.relative
let link_infos.filename = root_dir . link_text let link_infos.filename = simplify(root_dir . link_text)
else " absolute file link else " absolute file link
" collapse repeated leading "/"'s within a link " collapse repeated leading "/"'s within a link
let link_text = substitute(link_text, '\m^/*', '/', '') let link_text = substitute(link_text, '\m^/\+', '/', '')
" convert "/~..." into "~..." for fnamemodify " expand ~/
let link_text = substitute(link_text, '\m^/\~', '\~', '') let link_text = fnamemodify(link_text, ':p')
" convert /C: to C: (or fnamemodify(...":p:h") interpret it as C:\C:) let link_infos.filename = simplify(link_text)
if vimwiki#u#is_windows()
let link_text = substitute(link_text, '\m^/\ze[[:alpha:]]:', '', '')
endif
let link_infos.filename = link_text
endif endif
let link_infos.filename = vimwiki#path#normalize(link_infos.filename) let link_infos.filename = vimwiki#path#normalize(link_infos.filename)
@ -361,146 +360,6 @@ function! vimwiki#base#resolve_link(link_text, ...) "{{{
endfunction "}}} endfunction "}}}
" vimwiki#base#resolve_scheme
function! vimwiki#base#resolve_scheme(lnk, as_html, ...) " {{{ Resolve scheme
let quiet = a:0 && a:1 ? 1 : 0
let lnk = a:lnk
" if link is schemeless add wikiN: scheme
let is_schemeless = lnk !~# g:vimwiki_rxSchemeUrl
let lnk = (is_schemeless ? 'wiki'.g:vimwiki_current_idx.':'.lnk : lnk)
" Get scheme
let scheme = matchstr(lnk, g:vimwiki_rxSchemeUrlMatchScheme)
" Get link (without scheme)
let lnk = matchstr(lnk, g:vimwiki_rxSchemeUrlMatchUrl)
let path = ''
let subdir = ''
let ext = ''
let idx = -1
let anchor = ''
"extract anchor
if scheme =~# 'wiki' || scheme =~# 'diary'
let split_lnk = split(lnk, '#', 1)
let lnk = split_lnk[0]
if len(split_lnk) <= 1 || split_lnk[-1] == ''
let anchor = ''
else
let anchor = join(split_lnk[1:], '#')
endif
endif
" do nothing if scheme is unknown to vimwiki
if !(scheme =~# 'wiki.*' || scheme =~# 'diary' || scheme =~# 'local'
\ || scheme =~# 'file')
return [idx, scheme, path, subdir, lnk, ext, scheme.':'.lnk, anchor]
endif
" scheme behaviors
if scheme =~# 'wiki\d\+'
let idx = eval(matchstr(scheme, '\D\+\zs\d\+\ze'))
if idx < 0 || idx >= len(g:vimwiki_list)
if !quiet
echom 'Vimwiki Error: Numbered scheme refers to a non-existent wiki!'
endif
return [idx,'','','','','','', '']
endif
if a:as_html
if idx == g:vimwiki_current_idx
let path = VimwikiGet('path_html')
else
let path = VimwikiGet('path_html', idx)
endif
else
if idx == g:vimwiki_current_idx
let path = VimwikiGet('path')
else
let path = VimwikiGet('path', idx)
endif
endif
" For Issue 310. Otherwise current subdir is used for another wiki.
if idx == g:vimwiki_current_idx
let subdir = VimwikiGet('subdir')
else
let subdir = ""
endif
if a:as_html
let ext = '.html'
else
if idx == g:vimwiki_current_idx
let ext = VimwikiGet('ext')
else
let ext = VimwikiGet('ext', idx)
endif
endif
" default link for directories
if vimwiki#path#is_link_to_dir(lnk)
let ext = (g:vimwiki_dir_link != '' ? g:vimwiki_dir_link . ext : '')
endif
elseif scheme =~# 'diary'
if a:as_html
" use cached value (save time when converting diary index!)
let path = VimwikiGet('invsubdir')
let ext = '.html'
else
let path = VimwikiGet('path')
let ext = VimwikiGet('ext')
endif
let idx = g:vimwiki_current_idx
let subdir = VimwikiGet('diary_rel_path')
elseif scheme =~# 'local'
" revisiting the 'lcd'-bug ...
let path = VimwikiGet('path')
let subdir = VimwikiGet('subdir')
if a:as_html
" prepend browser-specific file: scheme
let path = 'file://'.fnamemodify(path, ":p")
endif
elseif scheme =~# 'file'
" RM repeated leading "/"'s within a link
let lnk = substitute(lnk, '^/*', '/', '')
" convert "/~..." into "~..." for fnamemodify
let lnk = substitute(lnk, '^/\~', '\~', '')
" convert /C: to C: (or fnamemodify(...":p:h") interpret it as C:\C:
if vimwiki#u#is_windows()
let lnk = substitute(lnk, '^/\ze[[:alpha:]]:', '', '')
endif
if a:as_html
" prepend browser-specific file: scheme
let path = 'file://'.fnamemodify(lnk, ":p:h").'/'
else
let path = fnamemodify(lnk, ":p:h").'/'
endif
let lnk = fnamemodify(lnk, ":p:t")
let subdir = ''
endif
" construct url from parts
if is_schemeless && a:as_html
let scheme = ''
let url = lnk.ext
else
let url = path.subdir.lnk.ext
endif
" lnk and url should be '' if the given wiki link has the form [[#anchor]].
" We cannot do lnk = expand('%:t:r') or so, because this function is called
" from vimwiki#html#WikiAll2HTML() for many files, so expand('%:t:r')
" doesn't give the currently processed file
if lnk == ''
let url = ''
endif
" result
return [idx, scheme, path, subdir, lnk, ext, url, anchor]
endfunction "}}}
" vimwiki#base#system_open_link " vimwiki#base#system_open_link
function! vimwiki#base#system_open_link(url) "{{{ function! vimwiki#base#system_open_link(url) "{{{
" handlers " handlers
@ -868,7 +727,8 @@ function! s:get_links(wikifile, idx) "{{{
endif endif
let link_count += 1 let link_count += 1
let target = vimwiki#base#resolve_link(link_text, a:wikifile) let target = vimwiki#base#resolve_link(link_text, a:wikifile)
if target.filename != '' if target.filename != '' &&
\ target.scheme =~# '\mwiki\d\+\|diary\|file\|local'
call add(links, [target.filename, target.anchor, lnum, col]) call add(links, [target.filename, target.anchor, lnum, col])
endif endif
endwhile endwhile
@ -986,6 +846,12 @@ function! vimwiki#base#edit_file(command, filename, anchor, ...) "{{{
" getpos() directly after this command. Strange. " getpos() directly after this command. Strange.
if !(a:command ==# ':e ' && vimwiki#path#is_equal(a:filename, expand('%:p'))) if !(a:command ==# ':e ' && vimwiki#path#is_equal(a:filename, expand('%:p')))
execute a:command.' '.fname execute a:command.' '.fname
" Make sure no other plugin takes ownership over the new file. Vimwiki
" rules them all! Well, except for directories, which may be opened with
" Netrw
if &filetype != 'vimwiki' && fname !~ '\m/$'
set filetype=vimwiki
endif
endif endif
if a:anchor != '' if a:anchor != ''
call s:jump_to_anchor(a:anchor) call s:jump_to_anchor(a:anchor)

View File

@ -372,19 +372,20 @@ function! s:tag_wikiincl(value) "{{{
let url_0 = matchstr(str, g:vimwiki_rxWikiInclMatchUrl) let url_0 = matchstr(str, g:vimwiki_rxWikiInclMatchUrl)
let descr = matchstr(str, vimwiki#html#incl_match_arg(1)) let descr = matchstr(str, vimwiki#html#incl_match_arg(1))
let verbatim_str = matchstr(str, vimwiki#html#incl_match_arg(2)) let verbatim_str = matchstr(str, vimwiki#html#incl_match_arg(2))
" resolve url
let [idx, scheme, path, subdir, lnk, ext, url, anchor] = let link_infos = vimwiki#base#resolve_link(url_0)
\ vimwiki#base#resolve_scheme(url_0, 1, 1)
" generate html output
" TODO: migrate non-essential debugging messages into g:VimwikiLog " TODO: migrate non-essential debugging messages into g:VimwikiLog
if g:vimwiki_debug > 1 if g:vimwiki_debug > 1
echom '{{idx='.idx.', scheme='.scheme.', path='.path.', subdir='.subdir.', lnk='.lnk.', ext='.ext.'}}' echom string(link_infos)
endif endif
" Issue 343: Image transclusions: schemeless links have .html appended. let url = link_infos.filename
" If link is schemeless pass it as it is
if scheme == '' " strip the .html extension when we have wiki links, so that the user can
let url = lnk " simply write {{image.png}} to include an image from the wiki directory
if link_infos.scheme =~# '\mwiki\d\+\|diary'
let url = fnamemodify(url, ':r')
endif endif
let url = escape(url, '#') let url = escape(url, '#')
@ -406,20 +407,40 @@ function! s:tag_wikilink(value) "{{{
let descr = matchstr(str, g:vimwiki_rxWikiLinkMatchDescr) let descr = matchstr(str, g:vimwiki_rxWikiLinkMatchDescr)
let descr = (substitute(descr,'^\s*\(.*\)\s*$','\1','') != '' ? descr : url) let descr = (substitute(descr,'^\s*\(.*\)\s*$','\1','') != '' ? descr : url)
" resolve url let line = VimwikiLinkConverter(url, s:current_wiki_file,
let [idx, scheme, path, subdir, lnk, ext, url, anchor] = \ s:current_html_file)
\ vimwiki#base#resolve_scheme(url, 1, 1) if line == ''
let link_infos = vimwiki#base#resolve_link(url, s:current_wiki_file)
if link_infos.scheme ==# 'file' || link_infos.scheme ==# 'local'
" external file links are always absolute
let html_link = link_infos.filename
else
" wiki links are always relative to the current file
echom link_infos.filename fnamemodify(s:current_wiki_file, ':h') fnamemodify(link_infos.filename, ':r')
let html_link = vimwiki#path#relpath(
\ fnamemodify(s:current_wiki_file, ':h'),
\ fnamemodify(link_infos.filename, ':r'))
echom html_link
if html_link !~ '\m/$'
let html_link .= '.html'
endif
endif
" generate html output " generate html output
" TODO: migrate non-essential debugging messages into g:VimwikiLog " TODO: migrate non-essential debugging messages into g:VimwikiLog
if g:vimwiki_debug > 1 if g:vimwiki_debug > 1
echom '[[idx='.idx.', scheme='.scheme.', path='.path.', subdir='.subdir.', lnk='.lnk.', ext='.ext.']]' echom string(link_infos)
endif endif
if anchor != ''
let anchor = substitute(anchor, '#', '-', 'g') if link_infos.anchor != ''
let url .= '#'.anchor let anchor = substitute(link_infos.anchor, '#', '-', 'g')
let html_link .= '#'.anchor
endif endif
let line = vimwiki#html#linkify_link(url, descr) let line = html_link
endif
let line =vimwiki#html#linkify_link(line, descr)
return line return line
endfunction "}}} endfunction "}}}
"}}} "}}}
@ -1338,6 +1359,11 @@ function! vimwiki#html#Wiki2HTML(path_html, wikifile) "{{{
let path_html = expand(a:path_html).VimwikiGet('subdir') let path_html = expand(a:path_html).VimwikiGet('subdir')
let htmlfile = fnamemodify(wikifile, ":t:r").'.html' let htmlfile = fnamemodify(wikifile, ":t:r").'.html'
" the currently processed file name is needed when processing links
" yeah yeah, shame on me for using (quasi-) global variables
let s:current_wiki_file = wikifile
let s:current_html_file = path_html . htmlfile
if s:use_custom_wiki2html() if s:use_custom_wiki2html()
let force = 1 let force = 1
call vimwiki#html#CustomWiki2HTML(path_html, wikifile, force) call vimwiki#html#CustomWiki2HTML(path_html, wikifile, force)

View File

@ -92,13 +92,20 @@ function! vimwiki#path#relpath(dir, file) "{{{
call remove(dir, 0) call remove(dir, 0)
call remove(file, 0) call remove(file, 0)
endwhile endwhile
if empty(dir) && empty(file)
return './'
endif
for segment in dir for segment in dir
let result += ['..'] let result += ['..']
endfor endfor
for segment in file for segment in file
let result += [segment] let result += [segment]
endfor endfor
return join(result, '/') let result_path = join(result, '/')
if a:file =~ '\m/$'
let result_path .= '/'
endif
return result_path
endfunction "}}} endfunction "}}}
" If the optional argument provided and nonzero, " If the optional argument provided and nonzero,
@ -133,3 +140,11 @@ function! vimwiki#path#mkdir(path, ...) "{{{
return 1 return 1
endif endif
endfunction " }}} endfunction " }}}
function! vimwiki#path#is_absolute(path) "{{{
if vimwiki#u#is_windows()
return a:path =~? '\m^\a:'
else
return a:path =~# '\m^/\|\~/'
endif
endfunction "}}}

View File

@ -762,11 +762,27 @@ Link with spaces in it: >
or: > or: >
[[This is a link source|Description of the link]] [[This is a link source|Description of the link]]
Links to directories (ending with a "/") are also supported: > Wiki files don't need to be in the root directory of your wiki, you can put
[[/home/somebody/|Home Directory]] them in subdirectories as well: >
[[projects/Important Project 1]]
To jump from that file back to the index file, use this link: >
[[../index]]
or: >
[[/index]]
The latter works, because wiki links starting with "/" are considered to be
absolute to the wiki root directory, that is, the link [[/index]] always opens
the file /path/to/your/wiki/index.wiki, no matter in which subdirectory you
are currently in.
Links to directories (ending with a "/") are also supported: >
[[a subdirectory/|Other files]]
Use |g:vimwiki_dir_link| to control the behavior when opening directories. Use |g:vimwiki_dir_link| to control the behavior when opening directories.
Typing wikilinks can be simplified by using Vim's omni completion (see
|compl-omni|) like so: >
[[ind<C-X><C-O>
which opens up a popup menu with all the wiki files starting with "ind".
Raw URLs~ Raw URLs~
Raw URLs are also supported: > Raw URLs are also supported: >