mirror of
https://github.com/dense-analysis/ale.git
synced 2026-01-27 21:32:18 +08:00
linter/markdown: adds support for languatool (#2155)
This commit is contained in:
74
autoload/ale/handlers/languagetool.vim
Normal file
74
autoload/ale/handlers/languagetool.vim
Normal file
@@ -0,0 +1,74 @@
|
||||
" Author: Vincent (wahrwolf [ät] wolfpit.net)
|
||||
" Description: languagetool for markdown files
|
||||
"
|
||||
call ale#Set('languagetool_executable', 'languagetool')
|
||||
|
||||
function! ale#handlers#languagetool#GetExecutable(buffer) abort
|
||||
return ale#Var(a:buffer, 'languagetool_executable')
|
||||
endfunction
|
||||
|
||||
function! ale#handlers#languagetool#GetCommand(buffer) abort
|
||||
let l:executable = ale#handlers#languagetool#GetExecutable(a:buffer)
|
||||
|
||||
return ale#Escape(l:executable) . ' --autoDetect '
|
||||
endfunction
|
||||
|
||||
function! ale#handlers#languagetool#HandleOutput(buffer, lines) abort
|
||||
" Match lines like:
|
||||
" 1.) Line 5, column 1, Rule ID:
|
||||
let l:head_pattern = '^\v.+.\) Line (\d+), column (\d+), Rule ID. (.+)$'
|
||||
let l:head_matches = ale#util#GetMatches(a:lines, l:head_pattern)
|
||||
|
||||
" Match lines like:
|
||||
" Message: Did you forget a comma after a conjunctive/linking adverb?
|
||||
let l:message_pattern = '^\vMessage. (.+)$'
|
||||
let l:message_matches = ale#util#GetMatches(a:lines, l:message_pattern)
|
||||
|
||||
" Match lines like:
|
||||
" ^^^^^ "
|
||||
let l:markers_pattern = '^\v *(\^+) *$'
|
||||
let l:markers_matches = ale#util#GetMatches(a:lines, l:markers_pattern)
|
||||
|
||||
let l:output = []
|
||||
|
||||
|
||||
" Okay tbh I was to lazy to figure out a smarter solution here
|
||||
" We just check that the arrays are same sized and merge everything
|
||||
" together
|
||||
let l:i = 0
|
||||
|
||||
while l:i < len(l:head_matches)
|
||||
\ && (
|
||||
\ (len(l:head_matches) == len(l:markers_matches))
|
||||
\ && (len(l:head_matches) == len(l:message_matches))
|
||||
\ )
|
||||
let l:item = {
|
||||
\ 'lnum' : str2nr(l:head_matches[l:i][1]),
|
||||
\ 'col' : str2nr(l:head_matches[l:i][2]),
|
||||
\ 'end_col' : str2nr(l:head_matches[l:i][2]) + len(l:markers_matches[l:i][1])-1,
|
||||
\ 'type' : 'W',
|
||||
\ 'code' : l:head_matches[l:i][3],
|
||||
\ 'text' : l:message_matches[l:i][1]
|
||||
\}
|
||||
call add(l:output, l:item)
|
||||
let l:i+=1
|
||||
endwhile
|
||||
|
||||
return l:output
|
||||
endfunction
|
||||
|
||||
" Define the languagetool linter for a given filetype.
|
||||
" TODO:
|
||||
" - Add language detection settings based on user env (for mothertongue)
|
||||
" - Add fixer
|
||||
" - Add config options for rules
|
||||
function! ale#handlers#languagetool#DefineLinter(filetype) abort
|
||||
call ale#linter#Define(a:filetype, {
|
||||
\ 'name': 'languagetool',
|
||||
\ 'executable_callback': 'ale#handlers#languagetool#GetExecutable',
|
||||
\ 'command_callback': 'ale#handlers#languagetool#GetCommand',
|
||||
\ 'output_stream': 'stdout',
|
||||
\ 'callback': 'ale#handlers#languagetool#HandleOutput',
|
||||
\ 'lint_file': 1,
|
||||
\})
|
||||
endfunction
|
||||
Reference in New Issue
Block a user