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
|
local domain = require("clever_f.domain")
local text_topology = require("clever_f.text_topology")
local M = {}
local DirectPreviewPlanner = {}
DirectPreviewPlanner.__index = DirectPreviewPlanner
M.DirectPreviewPlanner = DirectPreviewPlanner
local planner_records = setmetatable({}, { __mode = "k" })
local function fail(message, level)
error(message, (level or 1) + 1)
end
local function require_view(view)
if not text_topology.TextView.is(view) then
fail("direct preview text must be a TextView", 3)
end
return view
end
function DirectPreviewPlanner.new()
local planner = setmetatable({}, DirectPreviewPlanner)
planner_records[planner] = true
return planner
end
function DirectPreviewPlanner.is(value)
return type(value) == "table" and planner_records[value] == true
end
function DirectPreviewPlanner:scan_current_line(view, origin, direction)
require_view(view)
origin = domain.Position.coerce(origin)
direction = domain.Direction.from_string(direction)
local records = {}
for position, character, span in view:iter_strict(
origin,
direction,
domain.SearchScope.CURRENT_LINE
) do
records[#records + 1] = {
position = position,
character = character,
span = span,
}
end
return records
end
function M.normalize_count(count)
return domain.Count.to_number(count)
end
function DirectPreviewPlanner:normalize_count(count)
return M.normalize_count(count)
end
function M.direction_for_descriptor(descriptor)
descriptor = domain.Descriptor.from_string(descriptor)
if domain.Descriptor.is_uppercase(descriptor) then
return domain.Direction.BACKWARD
end
return domain.Direction.FORWARD
end
function DirectPreviewPlanner:scan_for_descriptor(view, origin, descriptor)
return self:scan_current_line(
view,
origin,
M.direction_for_descriptor(descriptor)
)
end
function M.new()
return DirectPreviewPlanner.new()
end
function M.scan_current_line(view, origin, direction)
return DirectPreviewPlanner.new():scan_current_line(view, origin, direction)
end
function M.scan_for_descriptor(view, origin, descriptor)
return DirectPreviewPlanner.new():scan_for_descriptor(view, origin, descriptor)
end
setmetatable(M, {
__call = function()
return DirectPreviewPlanner.new()
end,
})
return M
|