diff --git a/vimgolf.el b/vimgolf.el index 18f9847..704a328 100644 --- a/vimgolf.el +++ b/vimgolf.el @@ -51,6 +51,7 @@ ;; Steve Purcell (@sanityinc) ;; Adam Collard (@acollard) ;; Siddhanathan Shanmugam (@siddhanathan) +;; Tanner Hoelzel (@thoelze1) ;;; Code: @@ -407,18 +408,24 @@ part of the arg list away." (defvar vimgolf--browse-list nil "Holds a list of parsed VimGolf challenges.") +(defvar vimgolf--browse-page-number 1 + "Holds the page number currently being browsed.") + +(defvar vimgolf--browse-last-page nil + "Holds the number of the last page of challenges.") + (defun vimgolf-browse (&optional force-pull) "Browse VimGolf challenges in a dedicated buffer. Optional FORCE-PULL will retrieve challenges again even if -`vimgolf--browse-list' was already generated. - -TODO Is there no API for browsing all the challenges?" +`vimgolf--browse-list' was already generated." (interactive) (if (or (eq vimgolf--browse-list nil) force-pull) - (url-retrieve vimgolf-host 'vimgolf-parse-browse-html) + (url-retrieve (concat vimgolf-host "/?page=" + (number-to-string vimgolf--browse-page-number)) + 'vimgolf-parse-browse-html) (vimgolf-browse-list) (vimgolf-browse-next))) @@ -458,6 +465,13 @@ argument is dropped on the floor." (with-current-buffer (current-buffer) (let ((html (vimgolf-parse-html-entites (replace-regexp-in-string "\n" "" (buffer-string))))) + (if (not vimgolf--browse-last-page) + (progn + (string-match + "" + html) + (setq vimgolf--browse-last-page + (string-to-number (match-string 1 html))))) (setq vimgolf--browse-list nil) (while (string-match @@ -518,6 +532,24 @@ the arg is ignored." (when challenge-id (message (cadr (assoc challenge-id vimgolf--browse-list)))))) +(defun vimgolf-browse-next-page + () + "Load next page of challenges." + (interactive) + (if (equal vimgolf--browse-page-number vimgolf--browse-last-page) + (message "You are already at the last page") + (setq vimgolf--browse-page-number (+ 1 vimgolf--browse-page-number)) + (vimgolf-browse t))) + +(defun vimgolf-browse-previous-page + () + "Load previous page of challenges." + (interactive) + (if (equal vimgolf--browse-page-number 1) + (message "You are already at the first page") + (setq vimgolf--browse-page-number (- vimgolf--browse-page-number 1)) + (vimgolf-browse t))) + (defun vimgolf-browse-next () "Move point to the next challenge." @@ -575,6 +607,8 @@ the arg is ignored." (define-key keymap "g" 'vimgolf-browse-refresh) (define-key keymap "n" 'vimgolf-browse-next) (define-key keymap "p" 'vimgolf-browse-previous) + (define-key keymap "N" 'vimgolf-browse-next-page) + (define-key keymap "P" 'vimgolf-browse-previous-page) keymap) "Keymap for browsing VimGolf.")