;; -*- lexical-binding: t; -*- (require 'servall-client) (defvar servall-results-mode-map (let ((map (make-sparse-keymap))) (setq map (copy-keymap special-mode-map)) (define-key map "n" 'org-next-visible-heading) (define-key map "g" 'servall-results-update) (define-key map "\r" 'servall-results-open) (define-key map "p" 'org-previous-visible-heading) (define-key map "s" 'servall-results-re-search) map)) (defvar servall-results-buffer "*servall-results*") (define-derived-mode servall-results-mode org-mode "servall-results" "Mode for showing and selecting results" (setq-local buffer-read-only t servall-results-update-function nil servall-results-re-search-function nil servall-results-open-function nil)) (defun servall-results-update (&optional cb) (interactive) ;; assuming the update function takes a cb iff cb is nonnil. (if cb (funcall servall-results-update-function cb) (funcall servall-results-update-function))) (defun servall-results-re-search () (interactive) (call-interactively servall-results-re-search-function)) (defun servall-results-open () (interactive) (funcall servall-results-open-function)) ;; ytdl results (define-derived-mode servall-ytdl-results-mode servall-results-mode "servall-ytdl-results" "Mode for showing and selecting ytdl results" (setq-local servall-ytdl-results-query nil)) (defun servall-ytdl-search (query) (interactive "sYtdl Query: ") (with-current-buffer (get-buffer-create servall-results-buffer) (servall-ytdl-results-mode) (setq servall-ytdl-results-query query servall-results-update-function 'servall-ytdl-results-update servall-results-re-search-function 'servall-ytdl-search servall-results-open-function 'servall-ytdl-results-open) (servall-results-update (lambda () (switch-to-buffer servall-results-buffer))))) (defun servall-ytdl-results-update (cb) (servall-api-ytdl-search servall-ytdl-results-query (lambda (results) (with-current-buffer (get-buffer-create servall-results-buffer) (let* ((inhibit-read-only t)) (erase-buffer) (mapc (lambda (result) (let ((title (alist-get 'title result))) (insert (propertize (concat "* " title "\n") 'title title)) (insert (alist-get 'description result) "\n\n"))) results) (goto-char (point-min)))) (funcall cb)))) ;; wikipedia results (define-derived-mode servall-wikipedia-results-mode servall-results-mode "servall-wikipedia-results" "Mode for showing and selecting wikipedia results" (setq-local servall-wikipedia-results-query nil)) (defun servall-wikipedia-results-highlight () (save-excursion (goto-char (point-min)) (while (re-search-forward "\\(.*?\\)" nil t) (replace-match (propertize (match-string 1) 'font-lock-face 'match))))) (defun servall-wikipedia-results-update () (let* ((resp (servall-api-wikipedia-search servall-wikipedia-results-query)) (results (alist-get 'search (alist-get 'query resp))) (inhibit-read-only t)) (erase-buffer) (mapc (lambda (result) (let ((title (alist-get 'title result))) (insert (propertize (concat "* " title "\n") 'title title)) (insert (alist-get 'snippet result) "\n\n"))) results) (servall-wikipedia-results-highlight) (goto-char (point-min)))) (defun servall-wikipedia-search (query) (interactive "sWikipedia Query: ") (with-current-buffer (get-buffer-create servall-results-buffer) (servall-wikipedia-results-mode) (setq servall-wikipedia-results-query query servall-results-update-function 'servall-wikipedia-results-update servall-results-re-search-function 'servall-wikipedia-search servall-results-open-function 'servall-wikipedia-results-open) (servall-results-update)) (switch-to-buffer servall-results-buffer)) (defun servall-wikipedia-results-open () (when-let ((title (get-text-property (point) 'title))) (switch-to-buffer-other-window (servall-wikipedia-load title)))) (defun servall-wikipedia-to-name (title) (replace-regexp-in-string " " "_" title)) ;; wikipedia view (defvar servall-wikipedia-view-mode-map (let ((map (make-sparse-keymap))) (setq map (copy-keymap special-mode-map)) (define-key map "g" 'servall-wikipedia-reload) (define-key map "n" 'org-next-visible-heading) (define-key map "p" 'org-previous-visible-heading) map)) (defun servall-wikipedia-view-buffer (title) (format "*wikipedia %s*" title)) (define-derived-mode servall-wikipedia-view-mode org-mode "servall-wikipedia-view" "Mode for viewing wikipedia entries." (setq-local buffer-read-only t servall-wikipedia-title nil)) (defun servall-wikipedia-reload () (interactive) (servall-wikipedia-load servall-wikipedia-title t)) (defun servall-wikipedia-load (title &optional force) (let* ((buffer-name (servall-wikipedia-view-buffer title)) (buffer (get-buffer buffer-name))) (unless (and buffer (not force)) (setq buffer (get-buffer-create buffer-name)) (with-current-buffer buffer (servall-wikipedia-view-mode) (setq servall-wikipedia-title title) (let ((inhibit-read-only t)) (erase-buffer) (insert "* " title "\n") (insert (servall-api-wikipedia-org title))) (goto-char (point-min)))) buffer)) (provide 'servall-wikipedia)