gptel: Tweak markdown to org conversion

gptel.el (gptel--convert-markdown->org,
gptel--stream-convert-markdown->org): Handle the case of Markdown
bullet lists that begin with a "*", which the Gemini LLMs produce
often.  Address #238.
This commit is contained in:
Karthik Chikmagalur 2024-03-07 18:24:31 -08:00
parent 2487ada4d6
commit b634f05fe5

View file

@ -1298,23 +1298,28 @@ elements."
(delete-char 1)) (delete-char 1))
((looking-back "\\(?:[[:word:]]\\|\s\\)\\*\\{2\\}" ((looking-back "\\(?:[[:word:]]\\|\s\\)\\*\\{2\\}"
(max (- (point) 3) (point-min))) (max (- (point) 3) (point-min)))
(backward-delete-char 1)))) (delete-char -1))))
("*" ("*"
(if (save-match-data (cond
((save-match-data
(and (looking-back "\\(?:[[:space:]]\\|\s\\)\\(?:_\\|\\*\\)" (and (looking-back "\\(?:[[:space:]]\\|\s\\)\\(?:_\\|\\*\\)"
(max (- (point) 2) (point-min))) (max (- (point) 2) (point-min)))
(not (looking-at "[[:space:]]\\|\s")))) (not (looking-at "[[:space:]]\\|\s"))))
;; Possible beginning of italics ;; Possible beginning of emphasis
(and (and
(save-excursion (save-excursion
(when (and (re-search-forward (regexp-quote (match-string 0)) nil t) (when (and (re-search-forward (regexp-quote (match-string 0))
(line-end-position) t)
(looking-at "[[:space]]\\|\s") (looking-at "[[:space]]\\|\s")
(not (looking-back "\\(?:[[:space]]\\|\s\\)\\(?:_\\|\\*\\)" (not (looking-back "\\(?:[[:space]]\\|\s\\)\\(?:_\\|\\*\\)"
(max (- (point) 2) (point-min))))) (max (- (point) 2) (point-min)))))
(backward-delete-char 1) (delete-char -1) (insert "/") t))
(insert "/") t)) (progn (delete-char -1) (insert "/"))))
(progn (backward-delete-char 1) ((save-excursion
(insert "/"))))))) (ignore-errors (backward-char 2))
(looking-at "\\(?:$\\|\\`\\)\n\\*[[:space:]]"))
;; Bullet point, replace with hyphen
(delete-char -1) (insert "-"))))))
(buffer-string))) (buffer-string)))
(defun gptel--stream-convert-markdown->org () (defun gptel--stream-convert-markdown->org ()
@ -1363,18 +1368,21 @@ text stream."
(delete-char 1)) (delete-char 1))
((looking-back "\\(?:[[:word:]]\\|\s\\)\\*\\{2\\}" ((looking-back "\\(?:[[:word:]]\\|\s\\)\\*\\{2\\}"
(max (- (point) 3) (point-min))) (max (- (point) 3) (point-min)))
(backward-delete-char 1)))) (delete-char -1))))
((and "*" (guard (not in-src-block))) ((and "*" (guard (not in-src-block)))
(when (save-match-data (save-match-data
(save-excursion (save-excursion
(backward-char 2) (ignore-errors (backward-char 2))
(or (cond
(looking-at ((or (looking-at
"[^[:space:][:punct:]\n]\\(?:_\\|\\*\\)\\(?:[[:space:][:punct:]]\\|$\\)") "[^[:space:][:punct:]\n]\\(?:_\\|\\*\\)\\(?:[[:space:][:punct:]]\\|$\\)")
(looking-at (looking-at
"\\(?:[[:space:][:punct:]]\\)\\(?:_\\|\\*\\)\\([^[:space:][:punct:]]\\|$\\)")))) "\\(?:[[:space:][:punct:]]\\)\\(?:_\\|\\*\\)\\([^[:space:][:punct:]]\\|$\\)"))
(backward-delete-char 1) ;; Emphasis, replace with slashes
(insert "/")))))) (forward-char 2) (delete-char -1) (insert "/"))
((looking-at "\\(?:$\\|\\`\\)\n\\*[[:space:]]")
;; Bullet point, replace with hyphen
(forward-char 2) (delete-char -1) (insert "-")))))))))
(if noop-p (if noop-p
(buffer-substring (point) start-pt) (buffer-substring (point) start-pt)
(prog1 (buffer-substring (point) (point-max)) (prog1 (buffer-substring (point) (point-max))