mirror of
https://github.com/SqrtMinusOne/biome.git
synced 2025-12-11 14:53:02 +03:00
biome-query: more formatters
This commit is contained in:
parent
f60e6c047b
commit
06f4a71a4f
2 changed files with 112 additions and 15 deletions
125
biome-grid.el
125
biome-grid.el
|
|
@ -46,21 +46,73 @@
|
||||||
(15 . "#aba10e")
|
(15 . "#aba10e")
|
||||||
(25 . "#f39506")
|
(25 . "#f39506")
|
||||||
(35 . "#bf4112")
|
(35 . "#bf4112")
|
||||||
(40 . "#8a2b0a"))))
|
(40 . "#8a2b0a")))
|
||||||
|
("°F" . (gradient
|
||||||
|
(-40 . "#ae64a0")
|
||||||
|
(-22 . "#9488d2")
|
||||||
|
(5 . "#90cfd2")
|
||||||
|
(23 . "#66adbb")
|
||||||
|
(41 . "#508c40")
|
||||||
|
(59 . "#aba10e")
|
||||||
|
(77 . "#f39506")
|
||||||
|
(95 . "#bf4112")
|
||||||
|
(104 . "#8a2b0a")))
|
||||||
|
("hPa" . (gradient
|
||||||
|
(980 . "#006794")
|
||||||
|
(1005 . "#469998")
|
||||||
|
(1015 . "#b1b09d")
|
||||||
|
(1025 . "#a36f40")
|
||||||
|
(1030 . "#a0522c")))
|
||||||
|
("mm" . (gradient
|
||||||
|
(0 . "#3b7ba0")
|
||||||
|
(1.5 . "#3a98a2")
|
||||||
|
(5 . "#35a17f")
|
||||||
|
(8.5 "#47a43e")
|
||||||
|
(15 . "#a0a23b")
|
||||||
|
(25 . "#a53856")
|
||||||
|
(30 . "#a43a9a")))
|
||||||
|
("wmo code" . wmo-code))
|
||||||
"Format units in the grid."
|
"Format units in the grid."
|
||||||
:group 'biome)
|
:group 'biome)
|
||||||
|
|
||||||
(defvar biome-grid-mode-map
|
(defcustom biome-grid-wmo-codes
|
||||||
(let ((keymap (make-sparse-keymap)))
|
'((0 "☀️" "Clear sky")
|
||||||
(define-key keymap (kbd "q") #'quit-window)
|
(1 "🌤️" "Mainly clear")
|
||||||
(when (fboundp 'evil-define-key*)
|
(2 "🌥️" "Partly cloudy")
|
||||||
(evil-define-key* 'normal keymap
|
(3 "☁️" "Overcast")
|
||||||
"q" #'quit-window))
|
(45 "🌫️" "Fog")
|
||||||
keymap)
|
(48 "🌫️" "Depositing rime fog")
|
||||||
"Keymap for `biome-api-error-mode'.")
|
(51 "💧" "Drizzle (light)")
|
||||||
|
(53 "💧" "Drizzle (moderate)")
|
||||||
|
(55 "💧" "Drizzle (dense)")
|
||||||
|
(56 "🧊" "Freezing drizzle (light)")
|
||||||
|
(57 "🧊" "Freezing drizzle (moderate)")
|
||||||
|
(61 "🌧️" "Rain (light)")
|
||||||
|
(63 "🌧️" "Rain (moderate)")
|
||||||
|
(65 "🌧️" "Rain (heavy)")
|
||||||
|
(66 "🧊" "Freezing rain (light)")
|
||||||
|
(67 "🧊" "Freezing rain (heavy)")
|
||||||
|
(71 "🌨️" "Snow (light)")
|
||||||
|
(73 "🌨️" "Snow (moderate)")
|
||||||
|
(75 "🌨️" "Snow (heavy)")
|
||||||
|
(77 "🌨️" "Snow grains")
|
||||||
|
(80 "🌧️" "Rain showers (light)")
|
||||||
|
(81 "🌧️" "Rain showers (moderate)")
|
||||||
|
(82 "🌧️" "Rain showers (violent)")
|
||||||
|
(85 "🌧️" "Show showers (light)")
|
||||||
|
(86 "🌧️" "Show showers (heavy)")
|
||||||
|
(95 "⛈️" "Thunderstorm")
|
||||||
|
(96 "⛈️" "Thunderstorm with hail (light)")
|
||||||
|
(99 "⛈️" "Thunderstorm with hail (heavy)"))
|
||||||
|
"Descriptions for WMO weather codes.
|
||||||
|
|
||||||
(define-derived-mode biome-grid-mode tabulated-list-mode "Biome Grid"
|
The defaults values are takes from open-meteo docs."
|
||||||
"Major mode for displaying biome results.")
|
:group 'biome)
|
||||||
|
|
||||||
|
(defcustom biome-grid-wmo-show-emoji t
|
||||||
|
"Show emoji for WMO weather codes."
|
||||||
|
:type 'boolean
|
||||||
|
:group 'biome)
|
||||||
|
|
||||||
(defun biome-grid--blend-colors (c1 c2 val)
|
(defun biome-grid--blend-colors (c1 c2 val)
|
||||||
"Blend colors C1 and C2 by VAL.
|
"Blend colors C1 and C2 by VAL.
|
||||||
|
|
@ -87,17 +139,40 @@ C1 and C2 are hex RGS strings, VAL is a number between 0 and 1."
|
||||||
(format (format "%%%ds" col-width) value)
|
(format (format "%%%ds" col-width) value)
|
||||||
'face `(:background ,background-color :foreground ,foreground-color))))
|
'face `(:background ,background-color :foreground ,foreground-color))))
|
||||||
|
|
||||||
|
(defun biome-grid--format-wmo-code (value)
|
||||||
|
"Format WMO code.
|
||||||
|
|
||||||
|
VALUE is a WMO number."
|
||||||
|
(let ((format (alist-get value biome-grid-wmo-codes)))
|
||||||
|
(if format
|
||||||
|
(if biome-grid-wmo-show-emoji
|
||||||
|
(format "%s %s" (nth 0 format) (nth 1 format))
|
||||||
|
(format "%s" (nth 1 format)))
|
||||||
|
(format "%s" value))))
|
||||||
|
|
||||||
(defun biome-grid--format-entries (entries unit col-width)
|
(defun biome-grid--format-entries (entries unit col-width)
|
||||||
(let ((format-def (alist-get unit biome-grid-format-units nil nil #'equal)))
|
(let ((format-def (alist-get unit biome-grid-format-units nil nil #'equal)))
|
||||||
(mapcar
|
(mapcar
|
||||||
(lambda (entry)
|
(lambda (entry)
|
||||||
(cond
|
(cond
|
||||||
|
((or (null entry) (equal entry "")) "")
|
||||||
|
((eq format-def 'wmo-code)
|
||||||
|
(biome-grid--format-wmo-code entry))
|
||||||
((stringp entry) entry)
|
((stringp entry) entry)
|
||||||
((eq (car-safe format-def) 'gradient)
|
((eq (car-safe format-def) 'gradient)
|
||||||
(biome-grid--format-gradient entry (cdr format-def) col-width))
|
(biome-grid--format-gradient entry (cdr format-def) col-width))
|
||||||
(t (prin1-to-string entry))))
|
(t (prin1-to-string entry))))
|
||||||
entries)))
|
entries)))
|
||||||
|
|
||||||
|
(defun biome-grid--get-col-witdh (col-name entries unit)
|
||||||
|
(let ((width (cl-loop for entry in (cons col-name entries)
|
||||||
|
maximize (+ 1 (length entry)))))
|
||||||
|
;; XXX this is necessary to compensate for emojis of different
|
||||||
|
;; actual width. Forunately this doesn't break the formmating of
|
||||||
|
;; the grid (hail `tabulated-list', what a pleasant surprise)
|
||||||
|
(cond ((and (equal unit "wmo code") biome-grid-wmo-show-emoji) (+ width 2))
|
||||||
|
(t width))))
|
||||||
|
|
||||||
(defun biome-grid--set-list (query results)
|
(defun biome-grid--set-list (query results)
|
||||||
(let* ((group (intern (alist-get :group query)))
|
(let* ((group (intern (alist-get :group query)))
|
||||||
(group-units (intern (format "%s_units" (alist-get :group query))))
|
(group-units (intern (format "%s_units" (alist-get :group query))))
|
||||||
|
|
@ -108,11 +183,10 @@ C1 and C2 are hex RGS strings, VAL is a number between 0 and 1."
|
||||||
(regexp-quote "%") "%%"
|
(regexp-quote "%") "%%"
|
||||||
(alist-get key (alist-get group-units results)))
|
(alist-get key (alist-get group-units results)))
|
||||||
for var-name = (biome-query--get-header (symbol-name key) var-names)
|
for var-name = (biome-query--get-header (symbol-name key) var-names)
|
||||||
for col-name = (if biome-grid-display-units
|
for col-name = (if (and biome-grid-display-units (not (string-empty-p unit)))
|
||||||
(format "%s (%s)" var-name unit)
|
(format "%s (%s)" var-name unit)
|
||||||
var-name)
|
var-name)
|
||||||
for col-width = (cl-loop for entry in (cons col-name entries)
|
for col-width = (biome-grid--get-col-witdh col-name values unit)
|
||||||
maximize (+ 0 (length entry)))
|
|
||||||
for entries = (biome-grid--format-entries values unit col-width)
|
for entries = (biome-grid--format-entries values unit col-width)
|
||||||
do (push (list col-name col-width nil) columns)
|
do (push (list col-name col-width nil) columns)
|
||||||
do (push entries all-entries))
|
do (push entries all-entries))
|
||||||
|
|
@ -131,6 +205,29 @@ C1 and C2 are hex RGS strings, VAL is a number between 0 and 1."
|
||||||
all-entries
|
all-entries
|
||||||
:initial-value (make-vector (length (car all-entries)) nil))))))
|
:initial-value (make-vector (length (car all-entries)) nil))))))
|
||||||
|
|
||||||
|
(defun biome-grid-bury-or-kill-this-buffer ()
|
||||||
|
"Undisplay the current buffer.
|
||||||
|
|
||||||
|
Bury the current buffer, unless there is only one window showing
|
||||||
|
it, in which case it is killed."
|
||||||
|
(interactive)
|
||||||
|
(if (> (length (get-buffer-window-list nil nil t)) 1)
|
||||||
|
(bury-buffer)
|
||||||
|
(kill-buffer)))
|
||||||
|
|
||||||
|
(defvar biome-grid-mode-map
|
||||||
|
(let ((keymap (make-sparse-keymap)))
|
||||||
|
(define-key keymap (kbd "q") #'biome-grid-bury-or-kill-this-buffer)
|
||||||
|
(when (fboundp 'evil-define-key*)
|
||||||
|
(evil-define-key* 'normal keymap
|
||||||
|
"q" #'biome-grid-bury-or-kill-this-buffer))
|
||||||
|
keymap)
|
||||||
|
"Keymap for `biome-api-error-mode'.")
|
||||||
|
|
||||||
|
(define-derived-mode biome-grid-mode tabulated-list-mode "Biome Grid"
|
||||||
|
"Major mode for displaying biome results.")
|
||||||
|
|
||||||
|
|
||||||
(defun biome-grid (query results)
|
(defun biome-grid (query results)
|
||||||
"Display RESULTS in a grid."
|
"Display RESULTS in a grid."
|
||||||
(setq my/test results)
|
(setq my/test results)
|
||||||
|
|
|
||||||
|
|
@ -565,7 +565,7 @@ OBJ is an instance of `biome-query--transient-date-variable'."
|
||||||
|
|
||||||
(transient-define-infix biome-query--transient-group-switch-infix ()
|
(transient-define-infix biome-query--transient-group-switch-infix ()
|
||||||
:class 'biome-query--transient-group-switch
|
:class 'biome-query--transient-group-switch
|
||||||
:key "S"
|
:key "<tab>"
|
||||||
:description "Switch group")
|
:description "Switch group")
|
||||||
|
|
||||||
;; Layout generation
|
;; Layout generation
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue