diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/jao-lyrics.el | 152 | ||||
-rw-r--r-- | net/jao-osx-mail.el | 13 | ||||
-rw-r--r-- | net/jao-w3m-session.el | 410 | ||||
-rw-r--r-- | net/jao-weather.el | 219 |
4 files changed, 0 insertions, 794 deletions
diff --git a/net/jao-lyrics.el b/net/jao-lyrics.el deleted file mode 100644 index dd85da1..0000000 --- a/net/jao-lyrics.el +++ /dev/null @@ -1,152 +0,0 @@ -;; jao-lyrics.el -- simple show lyrics using glyrc - -;; Copyright (C) 2009, 2010, 2017, 2019, 2020 Jose Antonio Ortega Ruiz - -;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org> -;; Start date: Sat Jul 04, 2009 13:41 - -;; This file is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3 of the License, or -;; (at your option) any later version. - -;; This file 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 General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see <http://www.gnu.org/licenses/>. - -;;; Code: - -(defgroup jao-lyrics-faces nil "Faces" - :group 'faces) - -(defface jao-lyrics-font-lock-album '((t (:foreground "lightgoldenrod2"))) - "Album name in lyrics." - :group 'jao-lyrics-faces) - -(defface jao-lyrics-font-lock-title '((t (:foreground "dodgerblue2"))) - "Track title in lyrics." - :group 'jao-lyrics-faces) - -(defface jao-lyrics-font-lock-artist '((t (:foreground "dodgerblue3"))) - "Artist name in lyrics." - :group 'jao-lyrics-faces) - -(defvar jao-lyrics-cache-dir "~/.lyrics") - -(defun jao-lyrics--filename (artist title) - (expand-file-name (format "%s - %s.txt" artist title) - jao-lyrics-cache-dir)) - -(defun jao-lyrics--get-cached (artist title) - (let ((candidate (jao-lyrics--filename artist title))) - (and (file-exists-p candidate) - (with-current-buffer (find-file-noselect candidate) - (prog1 - (buffer-string) - (kill-buffer)))))) - -(defun jao-lyrics--cache (artist title lyrics) - (with-current-buffer - (find-file-noselect (jao-lyrics--filename artist title)) - (delete-region (point-min) (point-max)) - (insert lyrics) - (save-buffer) - (kill-buffer))) - -(make-variable-buffer-local - (defvar jao-lyrics--path nil)) - -(defvar jao-lyrics-mode-map) -(setq jao-lyrics-mode-map - (let ((map (make-keymap))) - (suppress-keymap map) - (define-key map [?q] 'bury-buffer) - (define-key map [?g] 'jao-show-lyrics) - (define-key map [?G] (lambda () (interactive) (jao-show-lyrics t))) - (define-key map [?e] 'jao-edit-lyrics) - map)) - -(defun jao-lyrics-mode () - (interactive) - (kill-all-local-variables) - (use-local-map jao-lyrics-mode-map) - (setq major-mode 'jao-lyrics-mode) - (setq mode-name "lyrics") - (toggle-read-only 1)) - -(defun jao-lyrics-buffer () - (or (get-buffer "*Lyrics*") - (with-current-buffer (get-buffer-create "*Lyrics*") - (jao-lyrics-mode) - (current-buffer)))) - -(defun jao-edit-lyrics () - (interactive) - (unless jao-lyrics--path - (error "No track data available.")) - (find-file-other-window jao-lyrics--path)) - - - -(defun jao-lyrics--clean-download (fn) - (with-current-buffer (find-file-noselect fn) - (goto-char (point-min)) - (when (re-search-forward - "^\\(CreditsWritten by:\\|External linksNominate\\)" nil t) - (beginning-of-line) - (kill-region (point) (point-max))) - (replace-string "
" "" nil (point-min) (point-max)) - (replace-string "\\'" "'" nil (point-min) (point-max)) - (save-buffer))) - -(defun jao-lyrics--download (artist title &optional noartist) - (message "Retrieving lyrics...") - (or (executable-find "glyrc") - (error "glyrc not installed")) - (let ((fn (jao-lyrics--filename (or noartist artist) title))) - (shell-command-to-string (format "glyrc lyrics -n 1-8 -Y -a %s -t %s -w %s" - (shell-quote-argument artist) - (shell-quote-argument title) - (shell-quote-argument fn))) - (jao-lyrics--clean-download fn) - (prog1 (jao-lyrics--get-cached artist title) (message nil)))) - -(defvar jao-lyrics-info-function) -(defvar-local jao-lyrics--info-function nil) - -;;;###autoload -(defun jao-show-lyrics (&optional force info-function) - (interactive "P") - (let* ((a/t (funcall (or info-function - jao-lyrics--info-function - jao-lyrics-info-function))) - (artist (car a/t)) - (title (cdr a/t)) - (artist (if force (read-string "Artist: " artist) artist)) - (title (if force (read-string "Title: " title) title)) - (buffer (jao-lyrics-buffer)) - (cached (and (not force) (jao-lyrics--get-cached artist title))) - (cached (and (not (zerop (length cached))) cached)) - (lyrics (or cached - (jao-lyrics--download artist title) - (jao-lyrics--download "" title artist))) - (inhibit-read-only t)) - (with-current-buffer buffer - (when info-function - (setq-local jao-lyrics--info-function info-function)) - (delete-region (point-min) (point-max)) - (insert (format "♪ %s - %s\n\n" - (propertize artist 'face 'jao-lyrics-font-lock-artist) - (propertize title 'face 'jao-lyrics-font-lock-title))) - (when lyrics (insert lyrics)) - (goto-char (point-min)) - (setq jao-lyrics--path (jao-lyrics--filename artist title))) - (pop-to-buffer buffer))) - - -(provide 'jao-lyrics) -;;; jao-lyrics.el ends here diff --git a/net/jao-osx-mail.el b/net/jao-osx-mail.el deleted file mode 100644 index 8b9efda..0000000 --- a/net/jao-osx-mail.el +++ /dev/null @@ -1,13 +0,0 @@ -(defun jao--gnus-message-id () - (require 'org-gnus) - (let ((header (with-current-buffer gnus-summary-buffer - (gnus-summary-article-header)))) - (and header (org-remove-angle-brackets (mail-header-id header))))) - -(defun jao-gnus-open-in-mail () - (interactive) - (let ((id (jao--gnus-message-id))) - (unless id (error "no message selected")) - (shell-command-to-string (format "open 'message:<%s>'" id)))) - -(provide 'jao-osx-mail) diff --git a/net/jao-w3m-session.el b/net/jao-w3m-session.el deleted file mode 100644 index 63c7766..0000000 --- a/net/jao-w3m-session.el +++ /dev/null @@ -1,410 +0,0 @@ -;;; w3m-session.el --- Persistent emacs-w3m sessions - -;; Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2012 Jose A Ortega Ruiz - -;; Author: Jose A Ortega Ruiz <jao@member.fsf.org> -;; Version: 0.3.6 -;; Keywords: hypermedia, w3m, WWW - -;; This file is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. - -;; This file 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 General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to -;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; INTRODUCTION: -;; -;; jao-w3m-session provides persistent emacs-w3m browsing sessions. When -;; quitting w3m (or, if you request it, at any other time while using -;; it) you can save the current w3m session (that is, the set of open -;; tabs and the URLs they're visiting). Upon restarting emacs-w3m -;; (possibly after restarting Emacs itself) you'll have the possibity -;; of recovering the saved session (that is, of re-opening the saved -;; tabs and URLs). You also have at your disposal a command to recover -;; the saved session at any other time. -;; -;; INSTALLATION: -;; -;; Just put this file somewhere on your Emacs load path and add the -;; following line to your .emacs file: -;; -;; (require 'jao-w3m-session) -;; -;; After restarting Emacs (or evaluating the form above), each time -;; you start emacs-w3m with 'w3m' you'll get a prompt asking whether -;; your last browsing session should be loaded. Likewise, when -;; quitting the browser, you'll have the possibility of saving your -;; current session (overwriting the previous one). -;; -;; In addition, two new interactive functions are defined: -;; -;; jao-w3m-session-load -- load the last stored session -;; jao-w3m-session-save -- save the current session -;; -;; These functions can be invoked at any time while running emacs-w3m. -;; Optionally, you can bind them to key shortcuts with the proper -;; variations of the following elisp magic in your .emacs: -;; (defun w3m-add-keys () -;; (define-key w3m-mode-map "S" 'jao-w3m-session-save) -;; (define-key w3m-mode-map "L" 'jao-w3m-session-load)) -;; (add-hook 'w3m-mode-hook 'w3m-add-keys) -;; -;; CUSTOMIZATION: -;; -;; A new customization group, jao-w3m-session, is available. There you can -;; customize the following variables: -;; -;; jao-w3m-session-load-always -- if t, `jao-w3m-session-load' will *not* ask -;; for confirmation (default nil) -;; jao-w3m-session-save-always -- if t, `jao-w3m-session-save' will *not* ask -;; for confirmation (default nil) -;; jao-w3m-session-show-titles -- if t, the load prompt will list the -;; session URL titles (default t) -;; jao-w3m-session-duplicate-tabs -- what to do when loading a session that -;; contains a URL already open -;; jao-w3m-session-file -- the file where w3m session info -;; is stored (default "~/.jao-w3m-session") -;; jao-w3m-session-autosave-period -- the period, in seconds, for automatic -;; session backup file updating. -;; -;; -;; You can also customize them in your .emacs file, to wit: -;; -;; (setq jao-w3m-session-file "~/.emacs.d/jao-w3m-session") -;; (setq jao-w3m-session-save-always nil) -;; (setq jao-w3m-session-load-always nil) -;; (setq jao-w3m-session-show-titles t) -;; (setq jao-w3m-session-duplicate-tabs 'ask) ; 'never, 'always, 'ask -;; -;; HISTORY: -;; -;; Version 0.3.7 : -;; -;; - `jao-w3m-session-deactivate-builtin-sessions', to do what it -;; says. -;; -;; Version 0.3.6 (Sat Apr 19, 2008): -;; -;; - w3m-session -> jao-w3m-session to avoid collisions with -;; emacs-w3m's session manager. -;; -;; Version 0.3.5 (Sun Jan 14, 2007): -;; -;; - automatic session backup every `jao-w3m-session-autosave-period' -;; seconds. -;; -;; Version 0.3.4 (Wed Jul 19, 2006): -;; -;; - save session file on quitting Emacs (without using -;; desktop.el) -;; -;; Version 0.3.3 (Thu Jun 8, 2006): -;; -;; - save session file with pretty print. -;; - handle correctly multiple emacs-w3m (re)starts during a -;; single emacs session. -;; - save URLs in hexified form to allow & in them. -;; - code cleanup. -;; -;; Version 0.3.2 (Mon Sep 29, 2003): -;; -;; - bug fix: when searching or going to home/bookmarks/etc, -;; keep the current tab's focus. -;; -;; Version 0.3.1 (Tue Aug 26, 2003): -;; -;; - type of `jao-w3m-session-file' set to 'file' in customisation -;; buffer. -;; - bug fix: syntax error due to a typo in `jao-w3m-session-file' -;; -;; Version 0.3 (Mon Aug 25, 2003): -;; -;; - the load session tab lists the titles of the session's pages -;; (customizable via 'jao-w3m-session-show-titles'). -;; - the duplicated tab prompt displays also the URL's title. -;; - bug fix: active tab in session now is correctly saved. -;; -;; Version 0.2 (Fri Aug 22, 2003): -;; -;; - the session info now includes the active tab, which gets -;; displayed when the session is reloaded. -;; - when reloading a session in a running emacs-w3m, if the -;; session contains a URL that is already being displayed by the -;; browser, the tab can be reused or duplicated (customizable -;; via `jao-w3m-session-duplicate-tabs'). -;; -;; Version 0.1 (Wed Aug 20, 2003) -- Initial release. -;; - - -;;; Code: - -;;; Dependencies: - -(require 'w3m) -(require 'advice) -(require 'url-util) - -;;; Custom variables: - -(defgroup jao-w3m-session nil - "w3m - session saving in w3m." - :group 'w3m - :prefix "jao-w3m-session-") - -(defcustom jao-w3m-session-save-always nil - "If on, always save w3m session without asking." - :group 'jao-w3m-session - :type 'boolean) - -(defcustom jao-w3m-session-load-always nil - "If on, always load w3m session without asking." - :group 'jao-w3m-session - :type 'boolean) - -(defcustom jao-w3m-session-show-titles t - "If on, show URL titles in the load prompt." - :group 'jao-w3m-session - :type 'boolean) - -(defcustom jao-w3m-session-duplicate-tabs 'never - "How to treat session URL already being visited. - -When loading a session with `jao-w3m-session-load', if one of the URLs in -the session is already displayed in a w3m tab, jao-w3m-session can: -- `never' create a new tab (just reload it), or -- `always' duplicate the URL in a new tab, or -- `ask' the user what to do." - :group 'jao-w3m-session - :type '(choice (const :value never) - (const :value always) - (const :value ask))) - -(defcustom jao-w3m-session-file "~/.jao-w3m-session" - "File to save the w3m session data." - :group 'jao-w3m-session - :type 'file) - -(defvar jao-w3m-session-autosave-period 180 - "A backup of the current session is saved with this period (in secs).") - -(defvar jao-w3m-url-filters nil "URL filters.") - -;;; Interactive functions: - -(defun jao-w3m-session-save () - "Save the current w3m session." - (interactive) - (when (and (w3m-alive-p) - (or jao-w3m-session-save-always - (y-or-n-p "Save current w3m session? "))) - (jao-w3m-session-current-to-file) - (jao-w3m-session--restart--autosave))) - -(defun jao-w3m-session-load () - "Load last stored session into w3m." - (interactive) - (let ((s (jao-w3m-session-load-aux))) - (when s - (jao-w3m-session--restart--autosave) - (let* ((urls (jao-w3m-session-url s)) - (offset (jao-w3m-session-offset s)) - (buffers (unless (equal jao-w3m-session-duplicate-tabs 'always) - (jao-w3m-session-find-duplicated urls)))) - (w3m-goto-url-new-session urls t) - (when buffers (jao-w3m-session-close-buffers buffers)) - (unless (zerop offset) (w3m-next-buffer offset)))))) - -(defun jao-w3m-session-set-autosave-period (secs) - "Set new value for the period between session backup autosaves." - (interactive "p") - (let ((secs (or secs (read-number "New period (secs): " 0)))) - (when (> secs 0) - (setq jao-w3m-session-autosave-period secs) - (jao-w3m-session--restart--autosave)))) - -(defun jao-w3m-session-deactivate-builtin-sessions () - "Deactivate emacs-w3m's builtin session handling." - (setq w3m-session-deleted-save nil - w3m-session-autosave nil - w3m-session-deleted-keep-number 0 - w3m-session-crash-recovery nil)) - -;;; Internals: - -;;;; advice w3m to use session management - -(defadvice w3m (before jao-load-session activate) - "Optionally load last w3m session on startup." - (interactive - (let ((s (jao-w3m-session-load-aux))) - (list (or (and s (jao-w3m-session-url s)) w3m-home-page) t t)))) - -(defadvice w3m (after jao-select-tab activate) - "Goto the saved focused tab" - (interactive) - (let ((offset (jao-w3m-session-offset))) - (unless (zerop offset) - (w3m-next-buffer offset)) - (ad-deactivate 'w3m))) - -(defadvice w3m-quit (before jao-save-session activate) - "Save session before quitting." - (interactive) - (jao-w3m-session-save) - ;; this is a little hack: when quitting a w3m session with a tab - ;; selected other than the first, the frame is not automatically - ;; closed as should be when w3m-pop-up-frames is t: - (switch-to-buffer (car (w3m-list-buffers))) - (ad-activate 'w3m)) - -;;;; save session on exit -(add-to-list 'kill-emacs-query-functions - (lambda () (jao-w3m-session-save) t)) - - -;;;; auxiliary functions - -(defvar jao-w3m-current-session '(jao-w3m-session 0 nil)) - -(defun jao-w3m-session--filter (url filters) - (cond ((not filters) url) - ((string-match-p (caar filters) url) - (cond ((functionp (cdar filters)) (funcall (cadr filters) url)) - ((stringp (cdar filters)) (cdar filters)))) - (t (jao-w3m-session--filter url (cdr filters))))) - -(defun jao-w3m-session--current-urls () - (let ((urls) - (current-buffer (w3m-alive-p)) - (pos 0) - (count 0)) - (dolist (b (w3m-list-buffers) (list pos (reverse urls))) - (set-buffer b) - (let ((url (jao-w3m-session--filter w3m-current-url jao-w3m-url-filters))) - (when url - (when (eq b current-buffer) (setq pos count)) - (setq count (1+ count)) - (push (cons (url-hexify-string url) (w3m-buffer-title b)) urls)))))) - -(defun jao-w3m-session-url (&optional s) - (let ((s (or s jao-w3m-current-session))) - (concat "group:" - (mapconcat 'car (nth 2 s) "&")))) - -(defun jao-w3m-session-offset (&optional s) - (let ((s (or s jao-w3m-current-session))) - (nth 1 s))) - -(defun jao-w3m-session-titles (&optional s) - (let ((s (or s jao-w3m-current-session))) - (mapcar 'cdr (nth 2 s)))) - -(defun jao-w3m-session-current (&optional s) - (save-current-buffer - (setq jao-w3m-current-session - (or s (cons 'jao-w3m-session (jao-w3m-session--current-urls)))))) - -(defun jao-w3m-session-current-url () - (when (w3m-alive-p) - (save-current-buffer - (concat "group:" - (mapconcat (lambda (b) (set-buffer b) w3m-current-url) - (w3m-list-buffers) "&"))))) - -(defun jao-w3m-session-find-duplicated (urls) - (when (w3m-alive-p) - (save-current-buffer - (let* ((duplicate-p - (lambda (b) - (y-or-n-p - (format "'%s' (%s) is already open. Duplicate tab? " - (w3m-buffer-title b) w3m-current-url)))) - (test-b - (lambda (b) - (set-buffer b) - (if (and - (string-match (regexp-quote w3m-current-url) urls) - (or (equal jao-w3m-session-duplicate-tabs 'never) - (not (funcall duplicate-p b)))) - b 'not))) - (buffers (mapcar test-b (w3m-list-buffers)))) - (delete 'not buffers))))) - -(defun jao-w3m-session-close-buffers (buffers) - (save-current-buffer - (mapc 'kill-buffer buffers))) - -(defun jao-w3m-session-load-aux () - (let ((new-session (jao-w3m-session-from-file - (expand-file-name jao-w3m-session-file)))) - (if (and new-session - (or jao-w3m-session-load-always - (y-or-n-p - (if jao-w3m-session-show-titles - (format "Load last w3m session %S? " - (jao-w3m-session-titles new-session)) - "Load last w3m session? ")))) - (jao-w3m-session-current new-session) - nil))) - -(defun jao-w3m-session-from-file (fname) - (let ((fname (jao-w3m-session--check--backup fname))) - (if (file-readable-p fname) - (with-temp-buffer - (insert-file-contents fname) - (goto-char (point-min)) - (let ((sexp (read (current-buffer)))) - (and (equal 'jao-w3m-session (car sexp)) sexp))) - nil))) - -(defsubst jao-w3m-session-current-to-file () - (jao-w3m-session--to--file jao-w3m-session-file)) - -(defun jao-w3m-session--to--file (filename &optional is-auto) - (require 'pp) - (let ((msg (if is-auto (current-message)))) - (with-temp-buffer - (insert ";;;; File generated by jao-w3m-session. DO NOT EDIT!\n") - (pp (jao-w3m-session-current) (current-buffer)) - (insert "\n" ";;;; End of " - (file-name-nondirectory jao-w3m-session-file) "\n") - (write-region (point-min) (point-max) (expand-file-name filename))) - (if is-auto (message msg)))) - -(defvar jao-w3m-session--timer nil) - -(defun jao-w3m-session--backup-name (fname) - (concat (expand-file-name fname) ".bak")) - -(defun jao-w3m-session--check--backup (fname) - (let ((bfname (jao-w3m-session--backup-name fname))) - (if (and (file-newer-than-file-p bfname fname) - (y-or-n-p "A newer autosaved session exists. Use it? ")) - bfname - fname))) - -(defun jao-w3m-session--restart--autosave () - (when (> jao-w3m-session-autosave-period 0) - (if jao-w3m-session--timer (cancel-timer jao-w3m-session--timer)) - (setq jao-w3m-session--timer - (run-at-time jao-w3m-session-autosave-period - jao-w3m-session-autosave-period - 'jao-w3m-session--to--file - (jao-w3m-session--backup-name jao-w3m-session-file) - t)))) - -(provide 'jao-w3m-session) - -;;; jao-w3m-session.el ends here diff --git a/net/jao-weather.el b/net/jao-weather.el deleted file mode 100644 index 04a8523..0000000 --- a/net/jao-weather.el +++ /dev/null @@ -1,219 +0,0 @@ -;; Based on code by Thierry Volpiatto -;; (http://mercurial.intuxication.org/hg/xml-weather) - -(require 'xml) -(require 'derived) - - -;;; config: -(defvar jao-weather-format-id-url - "http://xoap.weather.com/search/search?where=%s") - -(defvar jao-weather-format-xml-from-id-url ; id, unit=m,day-forecast=5,login,key - "http://xoap.weather.com/weather/local/%s?cc=*&unit=%s&dayf=%s&prod=xoap&par=%s&key=%s") - -(defvar jao-weather-unit "m" - "*m mean metric, you will have wind speed in km/h, temperature in °C and so on.") - -(defvar jao-weather-login nil) -(defvar jao-weather-key nil) - -(defvar jao-weather-day-forecast-num 5 - "*Number of days for forecast; Maximum 5.") - -(defvar jao-weather-default-id "SPXX0015") - -(defvar jao-weather-timer-delay 3600) - -(defvar jao-weather-last-data nil) - - -;;; access: -(defun jao-weather-authentify () - "Authentify user from .authinfo file. -You have to setup correctly `auth-sources' to make this function -finding the path of your .authinfo file that is normally ~/.authinfo. -Entry in .authinfo should be: -machine xoap.weather.com port http login xxxxx password xxxxxx" - (let ((auth (auth-source-user-or-password '("login" "password") - "xoap.weather.com" - "http"))) - (setq jao-weather-login (car auth) - jao-weather-key (cadr auth)))) - -(defun jao-weather--url (id) - (unless (and jao-weather-login jao-weather-key) - (jao-weather-authentify)) - (format jao-weather-format-xml-from-id-url - (or id jao-weather-default-id) - jao-weather-unit - (min jao-weather-day-forecast-num 5) - jao-weather-login - jao-weather-key)) - -(defvar jao-weather-hook nil) - -;; http://xoap.weather.com/weather/local/[locid] -;; Replace the [locid], of course, with the location ID obtained in the previous step. -;; Appended to this URL is a mix of other parameters, -;; some required and some optional. A typical example might be: -;; http://xoap.weather.com/weather/local/NLXX0002?cc=*&dayf=5&prod=xoap&par=[partner id]&key=[license key] -(defun jao-weather--get-info-async (&optional id) - (let ((url (jao-weather--url id)) - (url-show-status nil)) - (url-retrieve url (lambda (res) - (when (not res) - (let ((data (jao-weather-get-alist))) - (when data - (setq jao-weather-last-data data) - (run-hooks 'jao-weather-hook)))) - (kill-buffer (current-buffer)))))) - -(defun jao-weather--get-info-now (&optional id) - (let* ((url (jao-weather--url id)) - (buffer (url-retrieve-synchronously url)) - (data (and buffer - (with-current-buffer buffer - (jao-weather-get-alist))))) - (when buffer (kill-buffer buffer)) - (when data - (setq jao-weather-last-data data) - (run-hooks 'jao-weather-hook)) - data)) - - -;;; formatting: -(defun jao-weather--flist (c fs) - (when c - (let (result) - (dolist (f fs result) - (let ((v (caddr (assoc (cadr f) c)))) - (when (and (stringp v) (not (string-equal v "N/A"))) - (push (cons (car f) v) result))))))) - -(defun jao-weather--parse-cc (cc) - (append (jao-weather--flist cc '((:date lsup) - (:observatory obst) - (:temperature tmp) - (:condition t) - (:pressure r))) - (jao-weather--flist (assoc 'wind cc) '((:windir d) - (:wind-tilt t) - (:gust gust))))) - -(defun jao-weather--parse-location (loc) - (jao-weather--flist loc '((:city dnam) - (:time tm) - (:latitude lat) - (:longitude lon) - (:sunrise sunr) - (:sunset suns)))) - -(defun jao-weather--parse-day (d) - (let ((p2 (assoc 'part - (remove (assoc 'part (cdr d)) - (cdr d)))) - (wday (or (cdr (assoc 't (cadr d))) "day"))) - `(,(cdr (assoc 'dt (cadr d))) - (:weekday . ,wday) - (:weekday-abbrev . ,(substring wday 0 3)) - ,@(jao-weather--flist (cdr d) '((:max hi) - (:min low) - (:sunrise sunr) - (:sunset suns) - (:humidity hmid))) - ,@(jao-weather--flist (assoc 'wind (assoc 'part (cdr d))) - '((:wind-dir 't) (:wind-speed 's))) - ,@(jao-weather--flist (assoc 'wind p2) '((:night-wind-dir wea) - (:night-wind-speed s))) - ,@(jao-weather--flist p2 - '((:night-condition t) (:night-humidity hmid)))))) - -(defun jao-weather-get-alist () - (let* ((pxml (car (xml-parse-region (point-min) (point-max)))) - (loc (car (xml-get-children pxml 'loc))) - (cc (car (xml-get-children pxml 'cc))) - (dayf (xml-get-children pxml 'dayf)) - (dayfs (xml-get-children (car dayf) 'day)) - (today (append (jao-weather--parse-cc cc) - (jao-weather--parse-location loc))) - (forecast (mapcar 'jao-weather--parse-day dayfs))) - `((today ,@today) (forecast ,@forecast)))) - -(defun jao-weather--format-fields (data fields sep) - (if data - (mapconcat (lambda (kv) - (let ((v (cdr (assoc (car kv) data)))) - (if (not v) "" - (format (or (cdr kv) "%s") v)))) - fields - sep) - "")) - -(defsubst jao-weather--today-string (fields sep) - (jao-weather--format-fields (cdr (assoc 'today jao-weather-last-data)) - fields sep)) - -(defun jao-weather--forecast-string (n fields sep) - (jao-weather--format-fields (nth n (cdr (assoc 'forecast - jao-weather-last-data))) - fields sep)) - - -;;; update daemon: -(defvar jao-weather--timer nil) -(defun jao-weather-start (&optional delay) - (interactive) - (jao-weather-stop) - (setq jao-weather--timer - (run-with-timer (or delay 0) - jao-weather-timer-delay - 'jao-weather--get-info-async))) - -(defun jao-weather-stop () - (interactive) - (when jao-weather--timer - (cancel-timer jao-weather--timer) - (setq jao-weather--timer nil))) - - -;;; today -(defun jao-weather-today-msg (&optional arg) - (interactive "p") - (when (> arg 4) (jao-weather--get-info-now)) - (if (= 4 arg) (jao-weather-forecast-msg) - (message "%s" (jao-weather--today-string '((:temperature . " %s°C") - (:condition . "(%s)") - (:sunrise . "↑ %s") - (:sunset . "↓ %s") - (:date . "[%s]")) - " ")))) - -(defun jao-weather-forecast-msg (&optional arg) - (interactive "P") - (when arg (jao-weather--get-info-now)) - (message " %s" (mapconcat - (lambda (n) - (jao-weather--forecast-string n - '((:weekday-abbrev . "%s ") - (:max . "%s°/") - (:min . "%s°") - (:condition . ", %s") - (:night-condition . ", %s")) - "")) - '(1 2 3 4) " | "))) - -(defun jao-weather-temperature () - (string-to-number (jao-weather--today-string '((:temperature)) ""))) - - -(defun jao-weather-temperature* (&optional sep) - (concat (jao-weather--today-string '((:temperature . "%s°")) "") - (or sep " ") - (jao-weather--forecast-string 1 - '((:max . "%s°/") (:min . "%s°") - (:night-condition . " %s")) - ""))) - -;; Provide -(provide 'jao-weather) |