summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--llm-tools-hl.el98
1 files changed, 57 insertions, 41 deletions
diff --git a/llm-tools-hl.el b/llm-tools-hl.el
index f4473d3..128a947 100644
--- a/llm-tools-hl.el
+++ b/llm-tools-hl.el
@@ -364,51 +364,67 @@ FILENAME."
364 (push (cons (car sec) (list sec)) grouped)))) 364 (push (cons (car sec) (list sec)) grouped))))
365 grouped)) 365 grouped))
366 366
367(defun llm-tools--hl-apply-insert-after (anchor payload content offset)
368 "Insert PAYLOAD after the line identified by ANCHOR (or EOF)."
369 (let* ((line-num (if (string= anchor "EOF")
370 (length content)
371 (+ (llm-tools--hl-anchor-to-line-num anchor) offset)))
372 (idx (1- line-num)))
373 (cons (append (cl-subseq content 0 (1+ idx))
374 payload
375 (cl-subseq content (1+ idx)))
376 (+ offset (length payload)))))
377
378(defun llm-tools--hl-apply-insert-before (anchor payload content offset)
379 "Insert PAYLOAD before the line identified by ANCHOR (or BOF)."
380 (let* ((line-num (if (string= anchor "BOF") 1
381 (+ (llm-tools--hl-anchor-to-line-num anchor) offset)))
382 (idx (1- line-num)))
383 (cons (append (cl-subseq content 0 idx)
384 payload
385 (cl-subseq content idx))
386 (+ offset (length payload)))))
387
388(defun llm-tools--hl-apply-delete (range content offset)
389 "Delete lines from (car RANGE) to (cadr RANGE)."
390 (let ((a (+ (llm-tools--hl-anchor-to-line-num (car range)) offset))
391 (b (+ (llm-tools--hl-anchor-to-line-num (cadr range)) offset)))
392 (cons (append (cl-subseq content 0 (1- a))
393 (cl-subseq content b))
394 (- offset (- b a 1)))))
395
396(defun llm-tools--hl-apply-replace (range payload content offset)
397 "Replace lines from (car RANGE) to (cadr RANGE) with PAYLOAD (nil → '(\"\"))"
398 (let ((a (+ (llm-tools--hl-anchor-to-line-num (car range)) offset))
399 (b (+ (llm-tools--hl-anchor-to-line-num (cadr range)) offset))
400 (payload (or payload '(""))))
401 (cons (append (cl-subseq content 0 (1- a))
402 payload
403 (cl-subseq content b))
404 (+ offset (- (length payload) (- b a 1))))))
405
367(defun llm-tools--hl-apply-one-op (op content offset) 406(defun llm-tools--hl-apply-one-op (op content offset)
368 "Apply a single OP to CONTENT (list of strings) at the given OFFSET. 407 "Apply a single OP to CONTENT (list of strings) at the given OFFSET.
369Returns a cons cell (NEW-CONTENT . NEW-OFFSET)." 408Returns a cons cell (NEW-CONTENT . NEW-OFFSET)."
370 (pcase (hl-op-type op) 409 (pcase (hl-op-type op)
371 ('insert-after 410 ('insert-after (llm-tools--hl-apply-insert-after
372 (let* ((anchor (hl-op-anchor op)) 411 (hl-op-anchor op)
373 (payload (hl-op-payload op)) 412 (hl-op-payload op)
374 (line-num (if (string= anchor "EOF") 413 content offset))
375 (length content) 414 ('insert-before (llm-tools--hl-apply-insert-before
376 (+ (llm-tools--hl-anchor-to-line-num anchor) 415 (hl-op-anchor op)
377 offset))) 416 (hl-op-payload op)
378 (idx (1- line-num))) 417 content
379 (cons (append (cl-subseq content 0 (1+ idx)) 418 offset))
380 payload 419 ('delete (llm-tools--hl-apply-delete
381 (cl-subseq content (1+ idx))) 420 (hl-op-range op)
382 (+ offset (length payload))))) 421 content
383 ('insert-before 422 offset))
384 (let* ((anchor (hl-op-anchor op)) 423 ('replace (llm-tools--hl-apply-replace
385 (payload (hl-op-payload op)) 424 (hl-op-range op)
386 (line-num (if (string= anchor "BOF") 425 (hl-op-payload op)
387 1 426 content
388 (+ (llm-tools--hl-anchor-to-line-num anchor) 427 offset))))
389 offset)))
390 (idx (1- line-num)))
391 (cons (append (cl-subseq content 0 idx)
392 payload
393 (cl-subseq content idx))
394 (+ offset (length payload)))))
395 ('delete
396 (let* ((range (hl-op-range op))
397 (a (+ (llm-tools--hl-anchor-to-line-num (car range)) offset))
398 (b (+ (llm-tools--hl-anchor-to-line-num (cadr range)) offset)))
399 (cons (append (cl-subseq content 0 (1- a))
400 (cl-subseq content b))
401 (- offset (- b a 1)))))
402 ('replace
403 (let* ((range (hl-op-range op))
404 (a (+ (llm-tools--hl-anchor-to-line-num (car range)) offset))
405 (b (+ (llm-tools--hl-anchor-to-line-num (cadr range)) offset))
406 (payload (or (hl-op-payload op)
407 '(""))))
408 (cons (append (cl-subseq content 0 (1- a))
409 payload
410 (cl-subseq content b))
411 (+ offset (- (length payload) (- b a 1))))))))
412 428
413(defun llm-tools--hl-apply-ops (ops content) 429(defun llm-tools--hl-apply-ops (ops content)
414 "Apply a list of OPS to CONTENT (list of strings). 430 "Apply a list of OPS to CONTENT (list of strings).