diff options
| author | Jackson Moore <jacksonmoore@tuta.io> | 2026-09-04 11:40:26 +0200 |
|---|---|---|
| committer | Jackson Moore <jacksonmoore@tuta.io> | 2026-09-04 11:40:26 +0200 |
| commit | 5574e26f6bf1152a50e28080ca200e447f1acade (patch) | |
| tree | 495e2217af17648cc7d7d554e8d424d896c488b9 /lua/clever_f/direct_preview_planner.lua | |
| parent | 07cb5088325b7272f8718bfaee9e85515ae6a81e (diff) | |
Scan direct previews on current line
Diffstat (limited to 'lua/clever_f/direct_preview_planner.lua')
| -rw-r--r-- | lua/clever_f/direct_preview_planner.lua | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/lua/clever_f/direct_preview_planner.lua b/lua/clever_f/direct_preview_planner.lua new file mode 100644 index 0000000..7ead43f --- /dev/null +++ b/lua/clever_f/direct_preview_planner.lua @@ -0,0 +1,64 @@ +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:iterate( + direction, + view:line_match_start_bounds(origin.line) + ) do + records[#records + 1] = { + position = position, + character = character, + span = span, + } + end + return records +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 + +setmetatable(M, { + __call = function() + return DirectPreviewPlanner.new() + end, +}) + +return M |
