Multiline headers using html. Concurrent websocket open. And some general glitter.

This commit is contained in:
Robert C. Martin 2023-06-07 09:42:36 -05:00
parent 0ae3be7c6b
commit c579d5be6d
7 changed files with 64 additions and 28 deletions

View File

@ -1,7 +1,8 @@
(ns more-speech.config
(:require [more-speech.mem :refer :all]
(:require
[more-speech.db.in-memory :as in-memory]
[more-speech.db.xtdb :as xtdb]))
[more-speech.db.xtdb :as xtdb]
[more-speech.mem :refer :all]))
(def default-font "COURIER-PLAIN-14")
(def bold-font "COURIER-BOLD-14")
@ -93,6 +94,8 @@
(def user-name-chars #"[\w\-]+")
(def reference-pattern #"\#\[\d+\]")
(def html-escapes {\< "&lt;" \> "&gt;"})
(def production-db :xtdb)
(def db-type (atom nil))

View File

@ -368,9 +368,10 @@
(check-open url))))
(defn connect-to-relays []
(doseq [url (keys @relays)]
(let [futures (for [url (keys @relays)]
(let [relay (make-relay url)]
(connect-to-relay relay)))
(future (connect-to-relay relay))))]
(doseq [f futures] (deref f)))
(log-pr 2 'relay-connection-attempts-complete))
(defn request-contact-lists-from-relays []

View File

@ -1,5 +1,6 @@
(ns more-speech.ui.formatter-util
(:require [clojure.string :as string])
(:require [clojure.string :as string]
[more-speech.config :as config])
(:import (java.text SimpleDateFormat)
(java.util Date)))
@ -27,3 +28,18 @@
(let [lines (string/split-lines text)
lines (map #(str ">" %) lines)]
(string/join "\n" lines)))
(defn wrap-and-trim [s n l]
(cond
(zero? l) ""
(< (count s) n) s
:else
(let [point (.lastIndexOf s " " n)
point (if (< point 1) n point)]
(str (subs s 0 point)
"<br>"
(wrap-and-trim (subs s point) n (dec l))))))
(defn escape-html [s] (string/escape s config/html-escapes))

View File

@ -134,9 +134,12 @@
(defn format-header
([event]
(format-header event :long))
(format-header event :long {}))
([{:keys [pubkey created-at tags zaps] :as event} opt]
([event opt]
(format-header event opt {}))
([{:keys [pubkey created-at tags zaps] :as event} opt args]
(try
(if (nil? event)
"nil"
@ -158,7 +161,21 @@
(condp = opt
:long (format "%s%s %20s %s %s%s%s\n" reply-mark reaction-mark name time zap-mark dm-mark subject-content)
:short (format "%s%s %s %s %s%s%s" reply-mark reaction-mark name time zap-mark dm-mark subject-content)
:menu-item (format "%-20.20s %s %10.10s|%-30.30s" name short-time subject content))))
:menu-item (format "%-20.20s %s %10.10s|%-30.30s" name short-time subject content)
:tree-header
(let [read-mark (if (:read? args) " " "<span style=\"font-size:5px\">🔵</span>&nbsp&nbsp")
trimmed-content (-> content
(string/replace \newline \space)
(wrap-and-trim 100 2))
escaped-name (escape-html name)
escaped-dm-mark (escape-html dm-mark)
reaction-mark (if (some? (:reactions event)) (str "🤙" reaction-mark) "")]
(format "<html>%s<span style=\"font-size:11px\"><b>%-20.20s %s %s %s%s <i>%s</i></b></span><br>%s<hr></html>"
read-mark escaped-name reaction-mark short-time
zap-mark escaped-dm-mark subject
trimmed-content))
)))
(catch Exception e
(log-pr 1 'format-header 'Exception (.getMessage e))))))

View File

@ -31,9 +31,8 @@
(when (or (not reply?)
(and reply? (some? event)))
(when reply?
(let [subject (formatters/get-subject (:tags event))
prefix (if (empty? subject) "" "Re: ")]
(text! subject-text (str prefix subject))))
(let [subject (formatters/get-subject (:tags event))]
(text! subject-text subject)))
(listen send-button :action
(fn [_]
(let [message (text edit-area)

View File

@ -13,10 +13,9 @@
[more-speech.nostr.zaps :as zaps]
[more-speech.ui.formatters :as formatters]
[more-speech.ui.swing.article-panel :as article-panel]
[more-speech.ui.swing.tabs-util :as at-util]
[more-speech.ui.swing.edit-window :as edit-window]
[more-speech.ui.swing.util :as swing-util]
[more-speech.user-configuration :as uconfig])
[more-speech.ui.swing.tabs-util :as at-util]
[more-speech.ui.swing.util :as swing-util])
(:use (seesaw [color] [core] [font] [tree]))
(:import (javax.swing.tree DefaultMutableTreeNode DefaultTreeModel TreePath)))
@ -30,10 +29,9 @@
event-id (if (number? event-id) event-id 0) ;dummy event-idi
event (gateway/get-event (get-db) event-id)
read? (:read event)
font (if read? (uconfig/get-default-font) (uconfig/get-bold-font))
color (if (= (:kind event) 4) :blue :black)]
(config! widget :font font :foreground color)
(text! widget (formatters/format-header event)))))
(config! widget :foreground color)
(text! widget (formatters/format-header event :tree-header {:read? read?})))))
(defn select-article
[tab-index selected-node]
@ -52,7 +50,9 @@
(let [tab-index (swing-util/get-tab-index tab-name)
header-tree (tree :renderer render-event
:root-visible? false
:expands-selected-paths? true
:shows-root-handles? false
:expands-selected-paths? false
:row-height 60
:model (DefaultTreeModel. (DefaultMutableTreeNode. 0)))
renderer (.getCellRenderer header-tree)
_ (.setBackgroundSelectionColor renderer (color :azure))]

View File

@ -89,7 +89,7 @@
cl (.header cl "origin" "more-speech")
cws (.buildAsync cl (URI/create url) (->listener (StringBuffer.) relay))
wsf (future (.get cws))
ws (deref wsf 30000 :time-out)]
ws (deref wsf 5000 :time-out)]
(if (= ws :time-out)
(do
(log-pr 2 'connection-time-out url)