1
0
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:
cage 2021-11-05 11:13:05 +01:00
parent f2dba92f8b
commit 9d0e588b0b
5 changed files with 131 additions and 90 deletions

View File

@ -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)))))

View File

@ -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)

View File

@ -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)

View File

@ -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))

View File

@ -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