xref: /vim-8.2.3635/src/po/check.vim (revision cf2d8dee)
1" Vim script for checking .po files.
2"
3" Go through the file and verify that:
4" - All %...s items in "msgid" are identical to the ones in "msgstr".
5" - An error or warning code in "msgid" matches the one in "msgstr".
6
7if 1	" Only execute this if the eval feature is available.
8
9" Function to get a split line at the cursor.
10" Used for both msgid and msgstr lines.
11" Removes all text except % items and returns the result.
12func! GetMline()
13  let idline = substitute(getline('.'), '"\(.*\)"$', '\1', '')
14  while line('.') < line('$')
15    +
16    let line = getline('.')
17    if line[0] != '"'
18      break
19    endif
20    let idline .= substitute(line, '"\(.*\)"$', '\1', '')
21  endwhile
22
23  " remove '%', not used for formatting.
24  let idline = substitute(idline, "'%'", '', 'g')
25
26  " remove '%' used for plural forms.
27  let idline = substitute(idline, '\\nPlural-Forms: .\+;\\n', '', '')
28
29  " remove everything but % items.
30  return substitute(idline, '[^%]*\(%[-+ #''.0-9*]*l\=[dsuxXpoc%]\)\=', '\1', 'g')
31endfunc
32
33" This only works when 'wrapscan' is set.
34let s:save_wrapscan = &wrapscan
35set wrapscan
36
37" Start at the first "msgid" line.
381
39/^msgid
40let startline = line('.')
41let error = 0
42
43while 1
44  if getline(line('.') - 1) !~ "no-c-format"
45    let fromline = GetMline()
46    if getline('.') !~ '^msgstr'
47      echo 'Missing "msgstr" in line ' . line('.')
48      let error = 1
49    endif
50    let toline = GetMline()
51    if fromline != toline
52      echo 'Mismatching % in line ' . (line('.') - 1)
53      echo 'msgid: ' . fromline
54      echo 'msgstr: ' . toline
55      let error = 1
56    endif
57  endif
58
59  " Find next msgid.
60  " Wrap around at the end of the file, quit when back at the first one.
61  /^msgid
62  if line('.') == startline
63    break
64  endif
65endwhile
66
67" Check that error code in msgid matches the one in msgstr.
68"
69" Examples of mismatches found with msgid "E123: ..."
70" - msgstr "E321: ..."    error code mismatch
71" - msgstr "W123: ..."    warning instead of error
72" - msgstr "E123 ..."     missing colon
73" - msgstr "..."          missing error code
74"
751
76if search('msgid "\("\n"\)\?\([EW][0-9]\+:\).*\nmsgstr "\("\n"\)\?[^"]\@=\2\@!') > 0
77  echo 'Mismatching error/warning code in line ' . line('.')
78  let error = 1
79endif
80
81if error == 0
82  echo "OK"
83endif
84
85let &wrapscan = s:save_wrapscan
86unlet s:save_wrapscan
87
88endif
89