case-insensitive find (ASCII only)

This commit is contained in:
Kartik K. Agaram 2023-07-25 22:16:56 -07:00
parent 163e341051
commit 23faf85faa
2 changed files with 24 additions and 10 deletions

View File

@ -24,11 +24,12 @@ end
-- returns whether it found another occurrence
function Text.search_next(State)
local search_term = State.search_term:lower()
-- search current line from cursor
local curr_pos = State.cursor1.pos
local curr_line = State.lines[State.cursor1.line].data
local curr_offset = Text.offset(curr_line, curr_pos)
local offset = find(curr_line, State.search_term, curr_offset, --[[literal]] true)
local offset = ifind(curr_line, search_term, curr_offset, --[[literal]] true)
if offset then
State.cursor1.pos = utf8.len(curr_line, 1, offset)
end
@ -36,7 +37,7 @@ function Text.search_next(State)
-- search lines below cursor
for i=State.cursor1.line+1,#State.lines do
local curr_line = State.lines[i].data
offset = find(curr_line, State.search_term, --[[from start]] nil, --[[literal]] true)
offset = ifind(curr_line, search_term, --[[from start]] nil, --[[literal]] true)
if offset then
State.cursor1 = {line=i, pos=utf8.len(curr_line, 1, offset)}
break
@ -47,7 +48,7 @@ function Text.search_next(State)
-- wrap around
for i=1,State.cursor1.line-1 do
local curr_line = State.lines[i].data
offset = find(curr_line, State.search_term, --[[from start]] nil, --[[literal]] true)
offset = ifind(curr_line, search_term, --[[from start]] nil, --[[literal]] true)
if offset then
State.cursor1 = {line=i, pos=utf8.len(curr_line, 1, offset)}
break
@ -57,7 +58,7 @@ function Text.search_next(State)
if offset == nil then
-- search current line until cursor
local curr_line = State.lines[State.cursor1.line].data
offset = find(curr_line, State.search_term, --[[from start]] nil, --[[literal]] true)
offset = ifind(curr_line, search_term, --[[from start]] nil, --[[literal]] true)
local pos = utf8.len(curr_line, 1, offset)
if pos and pos < State.cursor1.pos then
State.cursor1.pos = pos
@ -80,11 +81,12 @@ end
-- returns whether it found another occurrence
function Text.search_previous(State)
local search_term = State.search_term:lower()
-- search current line before cursor
local curr_pos = State.cursor1.pos
local curr_line = State.lines[State.cursor1.line].data
local curr_offset = Text.offset(curr_line, curr_pos)
local offset = rfind(curr_line, State.search_term, curr_offset-1, --[[literal]] true)
local offset = irfind(curr_line, search_term, curr_offset-1, --[[literal]] true)
if offset then
State.cursor1.pos = utf8.len(curr_line, 1, offset)
end
@ -92,7 +94,7 @@ function Text.search_previous(State)
-- search lines above cursor
for i=State.cursor1.line-1,1,-1 do
local curr_line = State.lines[i].data
offset = rfind(curr_line, State.search_term, --[[from end]] nil, --[[literal]] true)
offset = irfind(curr_line, search_term, --[[from end]] nil, --[[literal]] true)
if offset then
State.cursor1 = {line=i, pos=utf8.len(curr_line, 1, offset)}
break
@ -103,7 +105,7 @@ function Text.search_previous(State)
-- wrap around
for i=#State.lines,State.cursor1.line+1,-1 do
local curr_line = State.lines[i].data
offset = rfind(curr_line, State.search_term, --[[from end]] nil, --[[literal]] true)
offset = irfind(curr_line, search_term, --[[from end]] nil, --[[literal]] true)
if offset then
State.cursor1 = {line=i, pos=utf8.len(curr_line, 1, offset)}
break
@ -113,7 +115,7 @@ function Text.search_previous(State)
if offset == nil then
-- search current line after cursor
local curr_line = State.lines[State.cursor1.line].data
offset = rfind(curr_line, State.search_term, --[[from end]] nil, --[[literal]] true)
offset = irfind(curr_line, search_term, --[[from end]] nil, --[[literal]] true)
local pos = utf8.len(curr_line, 1, offset)
if pos and pos > State.cursor1.pos then
State.cursor1.pos = pos
@ -134,6 +136,17 @@ function Text.search_previous(State)
return (offset ~= nil)
end
-- case-insensitive find (ipat is already in lowercase)
function ifind(s, ipat, i, plain)
if s == nil then return end
return find(s:lower(), ipat, i, plain)
end
function irfind(s, ipat, i, plain)
if s == nil then return end
return rfind(s:lower(), ipat, i, plain)
end
function find(s, pat, i, plain)
if s == nil then return end
return s:find(pat, i, plain)

View File

@ -51,10 +51,11 @@ function Text.draw(State, line_index, y, startpos)
if State.search_term then
local data = State.lines[State.cursor1.line].data
local cursor_offset = Text.offset(data, State.cursor1.pos)
if data:sub(cursor_offset, cursor_offset+#State.search_term-1) == State.search_term then
local cand = data:sub(cursor_offset, cursor_offset+#State.search_term-1)
if cand:lower() == State.search_term:lower() then
local lo_px = Text.draw_highlight(State, line, State.left,y, pos, State.cursor1.pos, State.cursor1.pos+utf8.len(State.search_term))
App.color(Text_color)
love.graphics.print(State.search_term, State.left+lo_px,y)
love.graphics.print(cand, State.left+lo_px,y)
end
else
Text.draw_cursor(State, State.left+Text.x(screen_line, State.cursor1.pos-pos+1), y)