summaryrefslogtreecommitdiff
path: root/autoload/ale/handlers/redpen.vim
blob: 195057caeaa5ce1d4e4f1a343bd4a37eed049bfd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
" Author: rhysd https://rhysd.github.io
" Description: Redpen, a proofreading tool (http://redpen.cc)

function! ale#handlers#redpen#HandleRedpenOutput(buffer, lines) abort
    " Only one file was passed to redpen. So response array has only one
    " element.
    let l:res = get(ale#util#FuzzyJSONDecode(a:lines, []), 0, {})
    let l:output = []

    for l:err in get(l:res, 'errors', [])
        let l:item = {
        \   'text': l:err.message,
        \   'type': 'W',
        \   'code': l:err.validator,
        \}

        if has_key(l:err, 'startPosition')
            let l:item.lnum = l:err.startPosition.lineNum
            let l:item.col = l:err.startPosition.offset + 1

            if has_key(l:err, 'endPosition')
                let l:item.end_lnum = l:err.endPosition.lineNum
                let l:item.end_col = l:err.endPosition.offset
            endif
        else
            " Fallback to a whole sentence region when a region is not
            " specified by the error.
            let l:item.lnum = l:err.lineNum
            let l:item.col = l:err.sentenceStartColumnNum + 1
        endif

        " Adjust column number for multibyte string
        let l:line = getline(l:item.lnum)

        if l:line is# ''
            let l:line = l:err.sentence
        endif

        let l:line = split(l:line, '\zs')

        if l:item.col >= 2
            let l:col = 0

            for l:strlen in map(l:line[0:(l:item.col - 2)], 'strlen(v:val)')
                let l:col = l:col + l:strlen
            endfor

            let l:item.col = l:col + 1
        endif

        if has_key(l:item, 'end_col')
            let l:col = 0

            for l:strlen in map(l:line[0:(l:item.end_col - 1)], 'strlen(v:val)')
                let l:col = l:col + l:strlen
            endfor

            let l:item.end_col = l:col
        endif

        call add(l:output, l:item)
    endfor

    return l:output
endfunction