xref: /vim-8.2.3635/runtime/doc/test_urls.vim (revision f38c86eb)
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