about summary refs log tree commit diff stats
path: root/src/server
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2023-10-14 17:13:29 +0200
committerbptato <nincsnevem662@gmail.com>2023-10-14 17:16:14 +0200
commitc225ff1619c9db8a48160c4e82c82da91f133f4d (patch)
treeea8a3d4bbad7ddb0b7bed0d21cc726434aefa971 /src/server
parenteae438e48ad7c1558f07d539469ab55c9d67fac4 (diff)
downloadchawan-c225ff1619c9db8a48160c4e82c82da91f133f4d.tar.gz
container: add cursorNthLink, cursorRevNthLink
Diffstat (limited to 'src/server')
-rw-r--r--src/server/buffer.nim42
1 files changed, 38 insertions, 4 deletions
diff --git a/src/server/buffer.nim b/src/server/buffer.nim
index 49ee97aa..5ed97258 100644
--- a/src/server/buffer.nim
+++ b/src/server/buffer.nim
@@ -65,10 +65,10 @@ type
 
   BufferCommand* = enum
     LOAD, RENDER, WINDOW_CHANGE, FIND_ANCHOR, READ_SUCCESS, READ_CANCELED,
-    CLICK, FIND_NEXT_LINK, FIND_PREV_LINK, FIND_NEXT_MATCH, FIND_PREV_MATCH,
-    GET_SOURCE, GET_LINES, UPDATE_HOVER, PASS_FD, CONNECT, CONNECT2,
-    GOTO_ANCHOR, CANCEL, GET_TITLE, SELECT, REDIRECT_TO_FD, READ_FROM_FD,
-    SET_CONTENT_TYPE, CLONE
+    CLICK, FIND_NEXT_LINK, FIND_PREV_LINK, FIND_NTH_LINK, FIND_REV_NTH_LINK,
+    FIND_NEXT_MATCH, FIND_PREV_MATCH, GET_SOURCE, GET_LINES, UPDATE_HOVER,
+    PASS_FD, CONNECT, CONNECT2, GOTO_ANCHOR, CANCEL, GET_TITLE, SELECT,
+    REDIRECT_TO_FD, READ_FROM_FD, SET_CONTENT_TYPE, CLONE
 
   # LOADING_PAGE: istream open
   # LOADING_RESOURCES: istream closed, resources open
@@ -470,6 +470,40 @@ proc findNextLink*(buffer: Buffer, cursorx, cursory: int): tuple[x, y: int] {.pr
       inc i
   return (-1, -1)
 
+proc findNthLink*(buffer: Buffer, i: int): tuple[x, y: int] {.proxy.} =
+  if i == 0:
+    return (-1, -1)
+  var k = 0
+  var link: Element
+  for y in 0 .. buffer.lines.high:
+    let line = buffer.lines[y]
+    for j in 0 ..< line.formats.len:
+      let format = line.formats[j]
+      let fl = format.node.getClickable()
+      if fl != nil and fl != link:
+        inc k
+        if k == i:
+          return (format.pos, y)
+        link = fl
+  return (-1, -1)
+
+proc findRevNthLink*(buffer: Buffer, i: int): tuple[x, y: int] {.proxy.} =
+  if i == 0:
+    return (-1, -1)
+  var k = 0
+  var link: Element
+  for y in countdown(buffer.lines.high, 0):
+    let line = buffer.lines[y]
+    for j in countdown(line.formats.high, 0):
+      let format = line.formats[j]
+      let fl = format.node.getClickable()
+      if fl != nil and fl != link:
+        inc k
+        if k == i:
+          return (format.pos, y)
+        link = fl
+  return (-1, -1)
+
 proc findPrevMatch*(buffer: Buffer, regex: Regex, cursorx, cursory: int,
     wrap: bool, n: int): BufferMatch {.proxy.} =
   if cursory >= buffer.lines.len: return