1" Test for URLs in help documents. 2" 3" Opens a new window with all found URLS followed by return code from curl 4" (anything other than 0 means unreachable) 5" 6" Written by Christian Brabandt. 7 8func Test_check_URLs() 9 if has("win32") 10 echoerr "Doesn't work on MS-Windows" 11 return 12 endif 13 if executable('curl') 14 " Note: does not follow redirects! 15 let s:command = 'curl --silent --fail --output /dev/null --head ' 16 elseif executable('wget') 17 " Note: only allow a couple of redirects 18 let s:command = 'wget --quiet -S --spider --max-redirect=2 --timeout=5 --tries=2 -O /dev/null ' 19 else 20 echoerr 'Only works when "curl" or "wget" is available' 21 return 22 endif 23 24 let pat='\(https\?\|ftp\)://[^\t* ]\+' 25 exe 'helpgrep' pat 26 helpclose 27 28 let urls = map(getqflist(), 'v:val.text') 29 " do not use submatch(1)! 30 let urls = map(urls, {key, val -> matchstr(val, pat)}) 31 " remove examples like user@host (invalid urls) 32 let urls = filter(urls, 'v:val !~ "@"') 33 " Remove example URLs which are invalid 34 let urls = filter(urls, {key, val -> val !~ '\<\(\(my\|some\)\?host\|machine\|hostname\|file\)\>'}) 35 new 36 put =urls 37 " remove some more invalid items 38 " empty lines 39 v/./d 40 " remove # anchors 41 %s/#.*$//e 42 " remove trailing stuff (parenthesis, dot, comma, quotes), but only for HTTP 43 " links 44 g/^h/s#[.,)'"/>][:.]\?$## 45 g#^[hf]t\?tp:/\(/\?\.*\)$#d 46 silent! g/ftp://,$/d 47 silent! g/=$/d 48 let a = getline(1,'$') 49 let a = uniq(sort(a)) 50 %d 51 call setline(1, a) 52 53 " Do the testing. 54 set nomore 55 %s/.*/\=TestURL(submatch(0))/ 56 57 " highlight the failures 58 /.* \([0-9]*[1-9]\|[0-9]\{2,}\)$ 59endfunc 60 61func TestURL(url) 62 " Relies on the return code to determine whether a page is valid 63 echom printf("Testing URL: %d/%d %s", line('.'), line('$'), a:url) 64 call system(s:command . shellescape(a:url)) 65 return printf("%s %d", a:url, v:shell_error) 66endfunc 67 68call Test_check_URLs() 69