;;; infobox.el -- Infobox in a help buffer -*- lexical-binding: t -*- ;; Copyright (C) 2025 Free Software Foundation, Inc. ;; Author: Yuchen Pei ;; Package-Requires: ((emacs "29.4")) ;; This file is part of dotted. ;; dotted is free software: you can redistribute it and/or modify it under ;; the terms of the GNU Affero General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; dotted is distributed in the hope that it will be useful, but WITHOUT ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General ;; Public License for more details. ;; You should have received a copy of the GNU Affero General Public ;; License along with dotted. If not, see . ;;; Commentary: ;; Infobox in a help buffer. ;;; Code: (defun infobox-translate (info specs) "Translate INFO according to SPECS. TODO: allow multiple levels in specs keys using let-alist, i.e. something like (.channel.name . \"Channel name\")" (seq-map (lambda (pair) (when-let ((val (alist-get (car pair) info))) (if (or (stringp (cdr pair)) (symbolp (cdr pair))) (cons (cdr pair) val) (cons (cadr pair) (funcall (cddr pair) val))))) specs)) (defun infobox-render (info item &optional interactive-p) "Render and display a help buffer of INFO." (help-setup-xref item interactive-p) (with-help-window (help-buffer) (with-current-buffer standard-output (let ((n-rows 0)) (seq-do (lambda (pair) (when pair (when (stringp (car pair)) (insert (car pair) ": ") (setq n-rows (1+ n-rows))) (insert (cdr pair) "\n"))) info) (align-regexp (point-min) (progn (goto-line (1+ n-rows)) (point)) "\\(\\s-*\\):")) (visual-line-mode)))) (provide 'infobox)