From 63354190582c58196ff2743a41cdeb2046e90f78 Mon Sep 17 00:00:00 2001 From: cage Date: Fri, 30 Jun 2023 14:45:54 +0200 Subject: [PATCH] - [GUI] fixed rendering of gemtext's slices Rendering was working only when the whole gemtext was received in a single block over the net. If not the rendering code printed the text lines out of order or even replicating the first lines. --- src/gui/client/main-window.lisp | 83 ++++++++++++++++----------------- 1 file changed, 41 insertions(+), 42 deletions(-) diff --git a/src/gui/client/main-window.lisp b/src/gui/client/main-window.lisp index 3af29d9..2d1821b 100644 --- a/src/gui/client/main-window.lisp +++ b/src/gui/client/main-window.lisp @@ -136,7 +136,7 @@ (funcall process-function stream-wrapper last-lines-fetched)) (when (not (or (funcall aborting-function) (and (stream-exausted-p) - next-start-fetching))) + (<= next-start-fetching 0)))) (loop-fetch (+ last-lines-fetched-count next-start-fetching)))))))) (loop-fetch) @@ -561,7 +561,7 @@ (incf skip-index (length emoji-code-points))) (incf skip-index))))))) -(defun render-ir-lines (request-iri main-window) +(defun render-ir-lines (request-iri main-window &key (starting-index 0)) (with-accessors ((ir-lines ir-lines) (ir-rendered-lines ir-rendered-lines) (gemtext-font-scaling gemtext-font-scaling) @@ -614,17 +614,17 @@ (gui-conf:gemini-quote-justification)) ((:pre :pre-end :as-is) (gui-conf:gemini-preformatted-text-justification)))) - (render-link (line line-number) + (render-link (line link-rendered-label line-number) (multiple-value-bind (link-bg link-fg) (gui-conf:gemini-link-colors) (let ((link-font (scale-font (gui-conf:gemini-link-font-configuration) gemtext-font-scaling))) - (multiple-value-bind (link-rendered-label link-name link-value) + (multiple-value-bind (x link-name link-value) (linkify line) + (declare (ignore x)) (let ((target-iri (absolutize-link request-iri link-value)) (new-text-line-start `(:line ,line-number :char 0))) - (vector-push-extend link-rendered-label ir-rendered-lines) - (gui:append-text gemtext-widget (a:last-elt ir-rendered-lines)) + (gui:append-text gemtext-widget link-rendered-label) (let ((tag-link (gui:make-link-button gemtext-widget new-text-line-start `(- :end 1 :chars) @@ -667,12 +667,10 @@ ;; does not works because of a TK bug ;;(colorize-emoji main-window (1- line-number)) (gui:tag-lower gemtext-widget tag)))))) - (loop with render-line-count = 0 - with starting-pre-block-line = -1 - with ending-pre-block-line = -1 + (loop with render-line-count = starting-index with current-pre-block-alt-text = nil - for rendered-line across ir-rendered-lines - for ir-line across ir-lines + for rendered-line across (subseq ir-rendered-lines starting-index) + for ir-line across (subseq ir-lines starting-index) do (let ((type (ir-type ir-line))) (ecase (format-keyword type) @@ -711,19 +709,17 @@ (render-line :quote rendered-line render-line-count)) (:pre (incf render-line-count) - (setf starting-pre-block-line (1+ render-line-count)) (setf current-pre-block-alt-text (ir-pre-alt-text ir-line)) (render-line :pre rendered-line render-line-count :wrap :none)) (:pre-end - (setf ending-pre-block-line (1+ render-line-count)) (incf render-line-count) (render-line :pre-end rendered-line render-line-count)) (:a (incf render-line-count) - (render-link ir-line render-line-count)))))))) + (render-link ir-line rendered-line render-line-count)))))))) (defun collect-ir-lines (request-iri main-window lines) (with-accessors ((ir-lines ir-lines) @@ -735,33 +731,36 @@ (vector-push-extend raw-line ir-rendered-lines))) (collect-link (line) (vector-push-extend (linkify line) ir-rendered-lines))) - (loop for line in lines do - (vector-push-extend line ir-lines) - (let ((type (ir-type line))) - (ecase (format-keyword type) - (:vertical-space - (vector-push-extend (format nil "") ir-rendered-lines)) - (:as-is - (vector-push-extend (ir-line line) ir-rendered-lines)) - (:text - (vector-push-extend (ir-line line) ir-rendered-lines)) - (:h1 - (push-prefixed (gui-conf:gemini-h1-prefix) line)) - (:h2 - (push-prefixed (gui-conf:gemini-h1-prefix) line)) - (:h3 - (push-prefixed (gui-conf:gemini-h1-prefix) line)) - (:li - (push-prefixed (gui-conf:gemini-bullet-prefix) line)) - (:quote - (push-prefixed (gui-conf:gemini-quote-prefix) line)) - (:pre - (vector-push-extend (format nil "") ir-rendered-lines)) - (:pre-end - (vector-push-extend (format nil "") ir-rendered-lines)) - (:a - (collect-link line))))) - (render-ir-lines request-iri main-window)))) + (let ((starting-index (if (not (vector-empty-p ir-lines)) + 0 + (length ir-lines)))) + (loop for line in lines do + (vector-push-extend line ir-lines) + (let ((type (ir-type line))) + (ecase (format-keyword type) + (:vertical-space + (vector-push-extend (format nil "") ir-rendered-lines)) + (:as-is + (vector-push-extend (ir-line line) ir-rendered-lines)) + (:text + (vector-push-extend (ir-line line) ir-rendered-lines)) + (:h1 + (push-prefixed (gui-conf:gemini-h1-prefix) line)) + (:h2 + (push-prefixed (gui-conf:gemini-h1-prefix) line)) + (:h3 + (push-prefixed (gui-conf:gemini-h1-prefix) line)) + (:li + (push-prefixed (gui-conf:gemini-bullet-prefix) line)) + (:quote + (push-prefixed (gui-conf:gemini-quote-prefix) line)) + (:pre + (vector-push-extend (format nil "") ir-rendered-lines)) + (:pre-end + (vector-push-extend (format nil "") ir-rendered-lines)) + (:a + (collect-link line))))) + (render-ir-lines request-iri main-window :starting-index starting-index))))) (defun displace-gemini-response (response) (values (getf response :status) @@ -973,7 +972,7 @@ (initialize-ir-lines main-window) (start-streaming-thread main-window iri - :use-cache nil + :use-cache t :status status :process-function (lambda (stream-wrapper lines)