mirror of
https://codeberg.org/cage/tinmop/
synced 2025-02-01 04:26:47 +01:00
- [gemini] improved rendering of quoted text.
This commit is contained in:
parent
d7f074aa34
commit
9e3269576d
@ -181,9 +181,10 @@
|
||||
|
||||
(defparameter *gemini-page-theme* nil)
|
||||
|
||||
(defun init-default-gemini-theme ()
|
||||
(defun init-default-gemini-theme (viewport)
|
||||
(setf *gemini-page-theme*
|
||||
(make-instance 'gemini-parser:gemini-page-theme
|
||||
:viewport viewport
|
||||
:link-prefix-other (swconf:gemini-link-prefix-to-other)
|
||||
:link-prefix-gemini (swconf:gemini-link-prefix-to-gemini)
|
||||
:quote-prefix (swconf:gemini-quote-prefix)
|
||||
|
@ -309,7 +309,11 @@
|
||||
(bullet-prefix
|
||||
:initarg :bullet-prefix
|
||||
:initform +bullet-line-prefix+
|
||||
:accessor bullet-prefix)))
|
||||
:accessor bullet-prefix)
|
||||
(viewport
|
||||
:initarg :viewport
|
||||
:initform nil
|
||||
:accessor viewport)))
|
||||
|
||||
(defun sexp->text (parsed-gemini theme)
|
||||
(labels ((header-prefix (prefix header)
|
||||
@ -317,9 +321,9 @@
|
||||
(header-prefix-h1 (header)
|
||||
(header-prefix (h1-prefix theme) header))
|
||||
(header-prefix-h2 (header)
|
||||
(header-prefix (h2-prefix theme) header))
|
||||
(header-prefix (h2-prefix theme) header))
|
||||
(header-prefix-h3 (header)
|
||||
(header-prefix (h3-prefix theme) header))
|
||||
(header-prefix (h3-prefix theme) header))
|
||||
(underlineize (stream text underline-char)
|
||||
(let* ((size (length text))
|
||||
(underline (build-string size underline-char)))
|
||||
@ -334,47 +338,53 @@
|
||||
(linkify (link-name link-value)
|
||||
(if (gemini-link-iri-p link-value)
|
||||
(format nil "~a~a~%" (link-prefix-gemini theme) link-name)
|
||||
(format nil "~a~a~%" (link-prefix-other theme) link-name))))
|
||||
(with-output-to-string (stream)
|
||||
(loop for node in parsed-gemini do
|
||||
(cond
|
||||
((null node)
|
||||
(format stream "~%"))
|
||||
((html-utils:tag= :as-is node)
|
||||
(format stream "~a~%" (text-value node)))
|
||||
((html-utils:tag= :text node)
|
||||
(format stream "~a~%" (text-value node)))
|
||||
((html-utils:tag= :h1 node)
|
||||
(underlineize stream
|
||||
(header-prefix-h1 (text-value node))
|
||||
+h1-underline+))
|
||||
((html-utils:tag= :h2 node)
|
||||
(underlineize stream
|
||||
(header-prefix-h2 (text-value node))
|
||||
+h2-underline+))
|
||||
((html-utils:tag= :h3 node)
|
||||
(underlineize stream
|
||||
(header-prefix-h3 (text-value node))
|
||||
+h3-underline+))
|
||||
((html-utils:tag= :li node)
|
||||
(format stream
|
||||
"~a ~a~%"
|
||||
(bullet-prefix theme)
|
||||
(text-value node)))
|
||||
((html-utils:tag= :quote node)
|
||||
(format stream
|
||||
"~a ~a~%"
|
||||
(quote-prefix theme)
|
||||
(text-value node)))
|
||||
((html-utils:tag= :pre node)
|
||||
(write-sequence (text-value node :trim nil) stream))
|
||||
((html-utils:tag= :a node)
|
||||
(let ((link-name (text-value node :trim nil))
|
||||
(link-value (html-utils:attribute-value (html-utils:find-attribute :href
|
||||
node))))
|
||||
(if link-name
|
||||
(write-string (linkify link-name link-value) stream)
|
||||
(write-string (linkify link-value link-value) stream)))))))))
|
||||
(format nil "~a~a~%" (link-prefix-other theme) link-name)))
|
||||
(fit-quote-lines (line win-width)
|
||||
(join-with-strings (mapcar (lambda (a) (strcat (quote-prefix theme) a))
|
||||
(flush-left-mono-text (split-words line)
|
||||
(- win-width
|
||||
(length (quote-prefix theme)))))
|
||||
(format nil "~%"))))
|
||||
(let ((win-width (message-window:viewport-width (viewport theme))))
|
||||
(with-output-to-string (stream)
|
||||
(loop for node in parsed-gemini do
|
||||
(cond
|
||||
((null node)
|
||||
(format stream "~%"))
|
||||
((html-utils:tag= :as-is node)
|
||||
(format stream "~a~%" (text-value node)))
|
||||
((html-utils:tag= :text node)
|
||||
(format stream "~a~%" (text-value node)))
|
||||
((html-utils:tag= :h1 node)
|
||||
(underlineize stream
|
||||
(header-prefix-h1 (text-value node))
|
||||
+h1-underline+))
|
||||
((html-utils:tag= :h2 node)
|
||||
(underlineize stream
|
||||
(header-prefix-h2 (text-value node))
|
||||
+h2-underline+))
|
||||
((html-utils:tag= :h3 node)
|
||||
(underlineize stream
|
||||
(header-prefix-h3 (text-value node))
|
||||
+h3-underline+))
|
||||
((html-utils:tag= :li node)
|
||||
(format stream
|
||||
"~a ~a~%"
|
||||
(bullet-prefix theme)
|
||||
(text-value node)))
|
||||
((html-utils:tag= :quote node)
|
||||
(write-sequence (fit-quote-lines (text-value node :trim nil)
|
||||
win-width)
|
||||
stream))
|
||||
((html-utils:tag= :pre node)
|
||||
(write-sequence (text-value node :trim nil) stream))
|
||||
((html-utils:tag= :a node)
|
||||
(let ((link-name (text-value node :trim nil))
|
||||
(link-value (html-utils:attribute-value (html-utils:find-attribute :href
|
||||
node))))
|
||||
(if link-name
|
||||
(write-string (linkify link-name link-value) stream)
|
||||
(write-string (linkify link-value link-value) stream))))))))))
|
||||
|
||||
(defun parse-gemini-file (data)
|
||||
(let* ((was-raw-mode *raw-mode*)
|
||||
|
@ -119,7 +119,6 @@ etc.) happened"
|
||||
;; (res:init)
|
||||
;; (load-configuration-files)
|
||||
;; (init-db)
|
||||
(gemini-client:init-default-gemini-theme)
|
||||
(db-utils:with-ready-database (:connect nil)
|
||||
(complete:initialize-complete-username-cache)
|
||||
(modules:load-module +starting-init-file+)
|
||||
@ -133,6 +132,7 @@ etc.) happened"
|
||||
;; initialized after the latter
|
||||
(message-window:init)
|
||||
(tags-window:init)
|
||||
(gemini-client:init-default-gemini-theme specials:*message-window*)
|
||||
(conversations-window:init)
|
||||
(setup-bindings)
|
||||
;; ... and init-keyboard-mapping-for last
|
||||
|
@ -137,18 +137,18 @@
|
||||
(defgeneric search-regex (object regex))
|
||||
|
||||
(defun text->rendered-lines-rows (window text)
|
||||
(flet ((fit-lines (lines)
|
||||
(let ((res ()))
|
||||
(loop for line in lines do
|
||||
(if (string-empty-p line)
|
||||
(push nil res)
|
||||
(loop
|
||||
for fitted-line in
|
||||
(flush-left-mono-text (split-words line)
|
||||
(win-width-no-border window))
|
||||
do
|
||||
(push fitted-line res))))
|
||||
(reverse res))))
|
||||
(labels ((fit-lines (lines)
|
||||
(let ((res ()))
|
||||
(loop for line in lines do
|
||||
(if (string-empty-p line)
|
||||
(push nil res)
|
||||
(loop
|
||||
for fitted-line in
|
||||
(flush-left-mono-text (split-words line)
|
||||
(win-width-no-border window))
|
||||
do
|
||||
(push fitted-line res))))
|
||||
(reverse res))))
|
||||
(let* ((lines (split-lines text))
|
||||
(fitted-lines (fit-lines lines))
|
||||
(color-re (swconf:color-regexps))
|
||||
@ -279,3 +279,8 @@
|
||||
(refresh-config *message-window*)
|
||||
(draw *message-window*)
|
||||
*message-window*))
|
||||
|
||||
(defgeneric viewport-width (object))
|
||||
|
||||
(defmethod viewport-width ((object message-window))
|
||||
(windows:win-width-no-border object))
|
||||
|
@ -1926,7 +1926,8 @@
|
||||
:scroll-next-page
|
||||
:scroll-previous-page
|
||||
:search-regex
|
||||
:init))
|
||||
:init
|
||||
:viewport-width))
|
||||
|
||||
(defpackage :open-attach-window
|
||||
(:use
|
||||
|
@ -1122,9 +1122,9 @@
|
||||
(text-rendering-theme gemini-client:text-rendering-theme)) response
|
||||
(when (and (gemini-viewer:downloading-allowed-p wrapper-object)
|
||||
(not (skip-rendering-p object)))
|
||||
(let* ((win specials:*message-window*)
|
||||
(rendered-line (gemini-parser:sexp->text parsed-file
|
||||
text-rendering-theme)))
|
||||
(let* ((win specials:*message-window*)
|
||||
(rendered-line (gemini-parser:sexp->text parsed-file
|
||||
text-rendering-theme)))
|
||||
(setf (windows:keybindings win)
|
||||
keybindings:*gemini-message-keymap*)
|
||||
(refresh-gemini-message-window links source rendered-line append-text)
|
||||
|
Loading…
x
Reference in New Issue
Block a user