From 3e12a95ab34e120fb958ba0eeebaada5def7cd11 Mon Sep 17 00:00:00 2001 From: bptato Date: Mon, 3 Jun 2024 20:29:10 +0200 Subject: js: improve jsregex interface It's easier to just use nested seqs here. (This also fixes reverse-search highlighting the last capture group instead of the whole match.) --- adapter/protocol/man.nim | 134 ++++++++++++++++++++++------------------------- src/js/jsregex.nim | 29 +++++----- src/server/buffer.nim | 26 +++++---- 3 files changed, 88 insertions(+), 101 deletions(-) diff --git a/adapter/protocol/man.nim b/adapter/protocol/man.nim index a5b7dab9..4d6de03f 100644 --- a/adapter/protocol/man.nim +++ b/adapter/protocol/man.nim @@ -94,13 +94,11 @@ proc isCommand(paths: seq[string]; name, s: string): bool = return true false -iterator myCaptures(captures: var seq[RegexCapture]; target: int; - offset: var int): RegexCapture = - for cap in captures.mitems: - if cap.i == target: - cap.s += offset - cap.e += offset - yield cap +iterator myCaptures(res: var RegexResult; i, offset: int): RegexCapture = + for cap in res.captures.mitems: + cap[i].s += offset + cap[i].e += offset + yield cap[i] proc readErrorMsg(efile: File; line: var string): string = var msg = "" @@ -176,70 +174,64 @@ proc processManpage(ofile, efile: File; header, keyword: string) = var fileRes = fileRe.exec(line) var includeRes = includeRe.exec(line) var manRes = manRe.exec(line) - if linkRes.success: - for cap in linkRes.captures.myCaptures(0, offset): - let s = line[cap.s.." & s & "" - line[cap.s.." & s & "" - line[cap.s.." & s & "" - else: - "" & s & "" - line[cap.s.." & s & "" - line[cap.s.." & man & "" - line[manCap.s.." & s & "" + line[cap.s.." & s & "" + line[cap.s.." & s & "" + else: + "" & s & "" + line[cap.s.." & s & "" + line[cap.s.." & man & "" + line[manCap.s..= str.len: diff --git a/src/server/buffer.nim b/src/server/buffer.nim index 6b214b4e..9a141135 100644 --- a/src/server/buffer.nim +++ b/src/server/buffer.nim @@ -594,8 +594,8 @@ proc findPrevMatch*(buffer: Buffer; regex: Regex; cursorx, cursory: int; let b = buffer.cursorBytes(y, cursorx) let res = regex.exec(buffer.lines[y].str, 0, b) var numfound = 0 - if res.success and res.captures.len > 0: - let cap = res.captures[^1] + if res.captures.len > 0: + let cap = res.captures[^1][0] let x = buffer.lines[y].str.width(0, cap.s) let str = buffer.lines[y].str.substr(cap.s, cap.e - 1) inc numfound @@ -609,8 +609,8 @@ proc findPrevMatch*(buffer: Buffer; regex: Regex; cursorx, cursory: int; else: break let res = regex.exec(buffer.lines[y].str) - if res.success and res.captures.len > 0: - let cap = res.captures[^1] + if res.captures.len > 0: + let cap = res.captures[^1][0] let x = buffer.lines[y].str.width(0, cap.s) let str = buffer.lines[y].str.substr(cap.s, cap.e - 1) inc numfound @@ -628,7 +628,7 @@ proc findNextMatch*(buffer: Buffer; regex: Regex; cursorx, cursory: int; let res = regex.exec(buffer.lines[y].str, b, buffer.lines[y].str.len) var numfound = 0 if res.success and res.captures.len > 0: - let cap = res.captures[0] + let cap = res.captures[0][0] let x = buffer.lines[y].str.width(0, cap.s) let str = buffer.lines[y].str.substr(cap.s, cap.e - 1) inc numfound @@ -643,7 +643,7 @@ proc findNextMatch*(buffer: Buffer; regex: Regex; cursorx, cursory: int; break let res = regex.exec(buffer.lines[y].str) if res.success and res.captures.len > 0: - let cap = res.captures[0] + let cap = res.captures[0][0] let x = buffer.lines[y].str.width(0, cap.s) let str = buffer.lines[y].str.substr(cap.s, cap.e - 1) inc numfound @@ -1779,10 +1779,8 @@ proc markURL*(buffer: Buffer; schemes: seq[string]) {.proxy.} = var data = "" var j = 0 for cap in res.captures.mitems: - if cap.i != 0: - continue - let capLen = cap.e - cap.s - while j < cap.s: + let capLen = cap[0].e - cap[0].s + while j < cap[0].s: case (let c = text.data[j]; c) of '<': data &= "<" @@ -1802,13 +1800,13 @@ proc markURL*(buffer: Buffer; schemes: seq[string]) {.proxy.} = else: data &= c inc j - cap.s += offset - cap.e += offset + cap[0].s += offset + cap[0].e += offset let s = text.data[j ..< j + capLen] let news = "" & s.htmlEscape() & "" data &= news - j += cap.e - cap.s - offset += news.len - (cap.e - cap.s) + j += cap[0].e - cap[0].s + offset += news.len - (cap[0].e - cap[0].s) while j < text.data.len: case (let c = text.data[j]; c) of '<': data &= "<" -- cgit 1.4.1-2-gfad0