-
Notifications
You must be signed in to change notification settings - Fork 1
/
check.lua
105 lines (97 loc) · 3.04 KB
/
check.lua
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
--------------------
-- Check initiators
--------------------
local _M = {}
local backend = require("textadept-spellchecker.backend")
------------------------
-- Document highlighting
------------------------
local function highlight(word, suggestions)
-- Highlights all occurences of given word in buffer with given style
if word == nil or word:len() < 2 then
return
end
local style = 3
if suggestions then style = 1 end
local word_len = word:len()
local text = buffer:text_range(0, buffer.length)
local pos = 1
local last = 1
while pos do
pos = text:find("[%s%p]"..word.."[%s%p]", last)
if pos then
last = pos + word_len
buffer.indicator_current = style
buffer:indicator_fill_range( pos, word_len )
end
end
end
local function check_text(text)
-- Performs spelling check for supplied visible text
local checker = backend.get_checker()
local uniq_words = {}
-- for word in text:gmatch("[^%s%p][^%s%p]+")
for word in text:gmatch("[^%s%p][^%s%p]+")
do
if not uniq_words[word] and word:len() > 1 then
uniq_words[word] = true
end
end
for word,_ in pairs(uniq_words)
do
checker:write(word.."\n")
end
end
function _M.frame()
-- Performs spelling check for visible text
local lastline = buffer.first_visible_line + buffer.lines_on_screen
local start = buffer:position_from_line(buffer.first_visible_line-1)
local finish = buffer:position_from_line(lastline+1)
if start == -1 then start = 0 end
if finish == -1 then finish = buffer.length end
start = buffer:word_start_position(start, false)
finish = buffer:word_end_position(finish, false)
-- occurs when user scrolls buffer during position measurements
if start >= finish then return end
buffer.indicator_current = 1
buffer:indicator_clear_range(0, buffer.length)
buffer.indicator_current = 3
buffer:indicator_clear_range(0, buffer.length)
check_text(buffer:text_range(start, finish))
end
function _M.file()
-- Checking whole file in background
buffer.indicator_current = 1
buffer:indicator_clear_range(0, buffer.length)
buffer.indicator_current = 3
buffer:indicator_clear_range(0, buffer.length)
check_text(buffer:text_range(0, buffer.length))
end
function _M.shutdown()
if CURSES then
events.disconnect(events.FILE_AFTER_SAVE, _M.file)
end
events.disconnect(backend.ANSWER, highlight)
events.disconnect(events.RESET_BEFORE, shutdown)
events.disconnect(events.INITIALIZED, connect_events)
backend.kill_checker()
for i, b in ipairs(_BUFFERS)
do
b.indicator_current = 1
b:indicator_clear_range(0, b.length)
b.indicator_current = 3
b:indicator_clear_range(0, b.length)
end
end
function _M.connect_events()
if CURSES then -- livechecking not implemented for CURSES so its better to use filechecking
events.connect(events.FILE_AFTER_SAVE, _M.file)
end
events.connect(backend.ANSWER, highlight)
events.connect(events.QUIT, _M.shutdown)
events.connect(events.RESET_BEFORE, _M.shutdown)
end
if backend then
events.connect(events.INITIALIZED, _M.connect_events)
return _M
end