mirror of
https://codeberg.org/cage/tinmop/
synced 2025-02-21 08:50:51 +01:00
- fixed crash when completing an empty command line (pressing tab with
no string typed on the command line); - fixed chrash when completing bookmark entry with non word character (e.g. '['); - added macro 'gemini-parser:with-initialized-parser'; - added source metadata (sourceline and source-line-id to results of gemini parsing to IR (see: sexp->text-rows).
This commit is contained in:
parent
f2dba92f8b
commit
9d0e588b0b
@ -103,16 +103,6 @@ completed) and the common prefix of the completion string."
|
|||||||
(lambda (a)
|
(lambda (a)
|
||||||
(text-utils:string-starts-with-p hint a)))
|
(text-utils:string-starts-with-p hint a)))
|
||||||
|
|
||||||
(defun contains-clsr (hint)
|
|
||||||
(handler-case
|
|
||||||
(let ((scanner (cl-ppcre:create-scanner hint)))
|
|
||||||
(lambda (a)
|
|
||||||
(cl-ppcre:scan scanner a)))
|
|
||||||
(error ()
|
|
||||||
(let ((scanner (cl-ppcre:create-scanner `(:sequence ,hint))))
|
|
||||||
(lambda (a)
|
|
||||||
(cl-ppcre:scan scanner a))))))
|
|
||||||
|
|
||||||
(defun remove-if-hidden (candidates)
|
(defun remove-if-hidden (candidates)
|
||||||
(remove-if #'db:hidden-recipient-p candidates))
|
(remove-if #'db:hidden-recipient-p candidates))
|
||||||
|
|
||||||
@ -200,10 +190,12 @@ list af all possible candidtae for completion."
|
|||||||
(let ((strings '())
|
(let ((strings '())
|
||||||
(indices '())
|
(indices '())
|
||||||
(ordering ()))
|
(ordering ()))
|
||||||
(loop for candidate in bag when (<= (length template)
|
(loop for candidate in bag when (and template
|
||||||
(length candidate))
|
(<= (length template)
|
||||||
|
(length candidate)))
|
||||||
do
|
do
|
||||||
(when-let ((indices-matched (cl-i18n-utils:fuzzy-match template candidate
|
(when-let ((indices-matched (cl-i18n-utils:fuzzy-match template
|
||||||
|
candidate
|
||||||
:similarity-match 5
|
:similarity-match 5
|
||||||
:similarity-mismatch -5
|
:similarity-mismatch -5
|
||||||
:penalty-weight 1)))
|
:penalty-weight 1)))
|
||||||
@ -265,8 +257,21 @@ list af all possible candidtae for completion."
|
|||||||
(with-simple-complete bookmark-section-complete
|
(with-simple-complete bookmark-section-complete
|
||||||
(lambda () (remove-if #'null (db:bookmark-all-sections))))
|
(lambda () (remove-if #'null (db:bookmark-all-sections))))
|
||||||
|
|
||||||
|
(defun quote-hint (a)
|
||||||
|
(cl-ppcre:quote-meta-chars a))
|
||||||
|
|
||||||
|
(defun contains-clsr (hint)
|
||||||
|
(handler-case
|
||||||
|
(let ((scanner (cl-ppcre:create-scanner (quote-hint hint))))
|
||||||
|
(lambda (a)
|
||||||
|
(cl-ppcre:scan scanner a)))
|
||||||
|
(error ()
|
||||||
|
(let ((scanner (cl-ppcre:create-scanner `(:sequence ,hint))))
|
||||||
|
(lambda (a)
|
||||||
|
(cl-ppcre:scan scanner a))))))
|
||||||
|
|
||||||
(defun bookmark-description-complete-clsr (type)
|
(defun bookmark-description-complete-clsr (type)
|
||||||
(lambda (hint)
|
(lambda (hint)
|
||||||
(when-let ((matched (remove-if-not (lambda (a) (cl-ppcre:scan hint a))
|
(when-let ((matched (remove-if-not (contains-clsr hint)
|
||||||
(db:bookmark-description-for-complete type))))
|
(db:bookmark-description-for-complete type))))
|
||||||
(values matched (reduce-to-common-prefix matched)))))
|
(values matched (reduce-to-common-prefix matched)))))
|
||||||
|
@ -3176,7 +3176,7 @@ days in the past"
|
|||||||
(type value section description now)))))
|
(type value section description now)))))
|
||||||
|
|
||||||
(defun bookmark-all-sections ()
|
(defun bookmark-all-sections ()
|
||||||
(let ((rows (query (select :section (from +table-bookmark+)))))
|
(let ((rows (query (select :section (from +table-bookmark+) (group-by :section)))))
|
||||||
(mapcar #'second rows)))
|
(mapcar #'second rows)))
|
||||||
|
|
||||||
(defun bookmark-complete->id (description)
|
(defun bookmark-complete->id (description)
|
||||||
|
@ -385,9 +385,7 @@
|
|||||||
(subseq res 1)
|
(subseq res 1)
|
||||||
res))))
|
res))))
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(let ((gemini-parser:*pre-group-id* -1)
|
(gemini-parser:with-initialized-parser
|
||||||
(gemini-parser:*header-group-id* -1)
|
|
||||||
(gemini-parser:*pre-alt-text* ""))
|
|
||||||
(when-let ((extension (fs:get-extension path)))
|
(when-let ((extension (fs:get-extension path)))
|
||||||
(setf support-file (fs:temporary-file :extension extension)))
|
(setf support-file (fs:temporary-file :extension extension)))
|
||||||
(with-open-support-file (file-stream support-file character)
|
(with-open-support-file (file-stream support-file character)
|
||||||
|
@ -19,12 +19,14 @@
|
|||||||
|
|
||||||
(defparameter *raw-mode-data* nil)
|
(defparameter *raw-mode-data* nil)
|
||||||
|
|
||||||
(defparameter *pre-group-id* -1)
|
|
||||||
|
|
||||||
(defparameter *parser-lock* (bt:make-recursive-lock))
|
(defparameter *parser-lock* (bt:make-recursive-lock))
|
||||||
|
|
||||||
|
(defparameter *pre-group-id* -1)
|
||||||
|
|
||||||
(defparameter *header-group-id* -1)
|
(defparameter *header-group-id* -1)
|
||||||
|
|
||||||
|
(defparameter *source-line-id* -1)
|
||||||
|
|
||||||
(defparameter *pre-alt-text* "")
|
(defparameter *pre-alt-text* "")
|
||||||
|
|
||||||
(defun-w-lock next-pre-group-id () *parser-lock*
|
(defun-w-lock next-pre-group-id () *parser-lock*
|
||||||
@ -47,6 +49,13 @@
|
|||||||
(defun-w-lock current-pre-alt-text () *parser-lock*
|
(defun-w-lock current-pre-alt-text () *parser-lock*
|
||||||
*pre-alt-text*)
|
*pre-alt-text*)
|
||||||
|
|
||||||
|
(defun-w-lock next-source-line-id () *parser-lock*
|
||||||
|
(incf *source-line-id*)
|
||||||
|
*source-line-id*)
|
||||||
|
|
||||||
|
(defun-w-lock current-source-line-id () *parser-lock*
|
||||||
|
*source-line-id*)
|
||||||
|
|
||||||
(defparameter *omitted-port* +gemini-default-port+)
|
(defparameter *omitted-port* +gemini-default-port+)
|
||||||
|
|
||||||
(define-constant +h1-prefix+ "#" :test #'string=)
|
(define-constant +h1-prefix+ "#" :test #'string=)
|
||||||
@ -390,7 +399,11 @@
|
|||||||
((raw-text
|
((raw-text
|
||||||
:initform nil
|
:initform nil
|
||||||
:initarg :raw-text
|
:initarg :raw-text
|
||||||
:accessor raw-text)))
|
:accessor raw-text)
|
||||||
|
(source-line-id
|
||||||
|
:initform nil
|
||||||
|
:initarg :source-line-id
|
||||||
|
:accessor source-line-id)))
|
||||||
|
|
||||||
(defclass with-group-id ()
|
(defclass with-group-id ()
|
||||||
((group-id
|
((group-id
|
||||||
@ -428,7 +441,7 @@
|
|||||||
:group-id group-id
|
:group-id group-id
|
||||||
:pre-group-id pre-group-id))
|
:pre-group-id pre-group-id))
|
||||||
|
|
||||||
(defclass pre-end () ())
|
(defclass pre-end (with-raw-text) ())
|
||||||
|
|
||||||
(defun make-pre-end ()
|
(defun make-pre-end ()
|
||||||
(make-instance 'pre-end))
|
(make-instance 'pre-end))
|
||||||
@ -462,7 +475,7 @@
|
|||||||
:pre-group-id pre-group-id
|
:pre-group-id pre-group-id
|
||||||
:alt-text alt-text))
|
:alt-text alt-text))
|
||||||
|
|
||||||
(defclass vertical-space (with-group-id)
|
(defclass vertical-space (with-group-id with-raw-text)
|
||||||
((size
|
((size
|
||||||
:initform 1
|
:initform 1
|
||||||
:initarg :size
|
:initarg :size
|
||||||
@ -537,6 +550,8 @@
|
|||||||
(header-group-id (next-header-group-id)))
|
(header-group-id (next-header-group-id)))
|
||||||
(list (make-header-line text header-group-id level)
|
(list (make-header-line text header-group-id level)
|
||||||
(make-header-line underline header-group-id level))))
|
(make-header-line underline header-group-id level))))
|
||||||
|
(extract-source-line (node)
|
||||||
|
(html-utils:attribute-value (html-utils:find-attribute :source-line node)))
|
||||||
(trim (a)
|
(trim (a)
|
||||||
(trim-blanks a))
|
(trim-blanks a))
|
||||||
(text-value (node &key (trim t))
|
(text-value (node &key (trim t))
|
||||||
@ -565,10 +580,22 @@
|
|||||||
(make-vertical-space ()
|
(make-vertical-space ()
|
||||||
(make-instance 'vertical-space
|
(make-instance 'vertical-space
|
||||||
:group-id (current-header-group-id)))
|
:group-id (current-header-group-id)))
|
||||||
(build-rows ()
|
(add-source-metadata (thing source-line-id source-line)
|
||||||
(loop for node in parsed-gemini
|
|
||||||
collect
|
|
||||||
(cond
|
(cond
|
||||||
|
((typep thing 'list)
|
||||||
|
(mapcar (lambda (a)
|
||||||
|
(setf (source-line-id a) source-line-id)
|
||||||
|
(setf (raw-text a) source-line)
|
||||||
|
a)
|
||||||
|
thing))
|
||||||
|
(t
|
||||||
|
(setf (source-line-id thing) source-line-id)
|
||||||
|
(setf (raw-text thing) source-line)
|
||||||
|
thing)))
|
||||||
|
(build-row (node)
|
||||||
|
(let ((source-line (extract-source-line node))
|
||||||
|
(source-line-id (next-source-line-id))
|
||||||
|
(res (cond
|
||||||
((null node)
|
((null node)
|
||||||
(make-vertical-space))
|
(make-vertical-space))
|
||||||
((html-utils:tag= :as-is node)
|
((html-utils:tag= :as-is node)
|
||||||
@ -627,8 +654,11 @@
|
|||||||
(linkify link-name link-value)
|
(linkify link-name link-value)
|
||||||
(linkify link-value link-value)))
|
(linkify link-value link-value)))
|
||||||
(header-group-id (current-header-group-id)))
|
(header-group-id (current-header-group-id)))
|
||||||
(make-link-line link-text link-name link-value header-group-id)))))))
|
(make-link-line link-text link-name link-value header-group-id))))))
|
||||||
(flatten (build-rows))))
|
(add-source-metadata res source-line-id source-line)))
|
||||||
|
(build-rows ()
|
||||||
|
(flatten (loop for node in parsed-gemini collect (build-row node)))))
|
||||||
|
(build-rows)))
|
||||||
|
|
||||||
(defun parse-gemini-file (data)
|
(defun parse-gemini-file (data)
|
||||||
(let* ((lines (if (string= (format nil "~%") data)
|
(let* ((lines (if (string= (format nil "~%") data)
|
||||||
@ -651,8 +681,7 @@
|
|||||||
(mapcar (lambda (a b)
|
(mapcar (lambda (a b)
|
||||||
(when b
|
(when b
|
||||||
(html-utils:add-attribute :source-line a b)))
|
(html-utils:add-attribute :source-line a b)))
|
||||||
lines parsed)
|
lines parsed)))
|
||||||
parsed))
|
|
||||||
|
|
||||||
;; response header
|
;; response header
|
||||||
|
|
||||||
@ -721,3 +750,10 @@
|
|||||||
(defmethod gemini-first-h1 ((data string))
|
(defmethod gemini-first-h1 ((data string))
|
||||||
(when-let ((parsed (parse-gemini-file data)))
|
(when-let ((parsed (parse-gemini-file data)))
|
||||||
(gemini-first-h1 parsed)))
|
(gemini-first-h1 parsed)))
|
||||||
|
|
||||||
|
(defmacro with-initialized-parser (&body body)
|
||||||
|
`(let ((gemini-parser:*pre-group-id* -1)
|
||||||
|
(gemini-parser:*header-group-id* -1)
|
||||||
|
(gemini-parser:*source-line-id* -1)
|
||||||
|
(gemini-parser:*pre-alt-text* ""))
|
||||||
|
,@body))
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
:*pre-group-id*
|
:*pre-group-id*
|
||||||
:*pre-alt-text*
|
:*pre-alt-text*
|
||||||
:*header-group-id*
|
:*header-group-id*
|
||||||
|
:*source-line-id*
|
||||||
:geminize-h1
|
:geminize-h1
|
||||||
:geminize-h2
|
:geminize-h2
|
||||||
:geminize-h3
|
:geminize-h3
|
||||||
@ -94,7 +95,8 @@
|
|||||||
:sexp->text
|
:sexp->text
|
||||||
:parse-gemini-response-header
|
:parse-gemini-response-header
|
||||||
:gemini-iri-p
|
:gemini-iri-p
|
||||||
:gemini-first-h1))
|
:gemini-first-h1
|
||||||
|
:with-initialized-parser))
|
||||||
|
|
||||||
(defpackage :gemini-client
|
(defpackage :gemini-client
|
||||||
(:use
|
(:use
|
||||||
|
Loading…
x
Reference in New Issue
Block a user