1
0
Fork 0

- [gemini] improved rendering of quoted text.

This commit is contained in:
cage 2021-04-03 15:03:24 +02:00
parent d7f074aa34
commit 9e3269576d
6 changed files with 79 additions and 62 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -1926,7 +1926,8 @@
:scroll-next-page
:scroll-previous-page
:search-regex
:init))
:init
:viewport-width))
(defpackage :open-attach-window
(:use

View File

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