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