From 51effa1f19d287343ae832ab41b949e981bff7d2 Mon Sep 17 00:00:00 2001 From: Tanner Hoelzel Date: Wed, 25 Dec 2019 00:33:41 -0500 Subject: [PATCH 1/6] browse all challenges --- vimgolf.el | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/vimgolf.el b/vimgolf.el index 5abd0d6..d195443 100644 --- a/vimgolf.el +++ b/vimgolf.el @@ -393,6 +393,9 @@ 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.") + (defun vimgolf-browse (&optional force-pull) "Browse VimGolf challenges in a dedicated buffer. @@ -401,7 +404,9 @@ TODO Is there no API for browsing all the challenges?" (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))) @@ -497,6 +502,22 @@ argument is dropped on the floor." (when challenge-id (message (cadr (assoc challenge-id *vimgolf-browse-list*)))))) +(defun vimgolf-browse-next-page + () + "Load next page of challenges." + (interactive) + (if (< *vimgolf-browse-page-number* 10) + (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 (> *vimgolf-browse-page-number* 1) + (setq *vimgolf-browse-page-number* (- *vimgolf-browse-page-number* 1))) + (vimgolf-browse t)) + (defun vimgolf-browse-next () "Move point to the next challenge." @@ -558,6 +579,8 @@ argument is dropped on the floor." (define-key vimgolf-browse-mode-map "g" 'vimgolf-browse-refresh) (define-key vimgolf-browse-mode-map "n" 'vimgolf-browse-next) (define-key vimgolf-browse-mode-map "p" 'vimgolf-browse-previous) + (define-key vimgolf-browse-mode-map "N" 'vimgolf-browse-next-page) + (define-key vimgolf-browse-mode-map "P" 'vimgolf-browse-previous-page) ) (put 'vimgolf-mode 'mode-class 'special) From e42818f16e025e6049574412da081a8e879e3a11 Mon Sep 17 00:00:00 2001 From: Tanner Hoelzel Date: Wed, 22 May 2024 18:22:43 -0400 Subject: [PATCH 2/6] parse number of last page on browse The number gets parsed from the HTML only once. This keeps things simple, even though it is possible that the total number of pages could change during browse, resulting in unreachable pages until vimgolf.el is reloaded. To ensure all pages are reachable, we could make the request without storing/checking an upper bound. If the request yields no challenges parsed, then we retain the previous page results. --- vimgolf.el | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/vimgolf.el b/vimgolf.el index eadb493..df6e15a 100644 --- a/vimgolf.el +++ b/vimgolf.el @@ -410,6 +410,9 @@ part of the arg list away." (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. @@ -463,6 +466,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 From 699eba247580dddb0f9d2cdb0d49c571fa281616 Mon Sep 17 00:00:00 2001 From: Tanner Hoelzel Date: Wed, 22 May 2024 18:43:06 -0400 Subject: [PATCH 3/6] check and enforce page bounds during browse There is no checking that the number of the last page is non-nil. Parsing could fail silently and we wouldn't know here. We could raise an error here, or leave it as is. --- vimgolf.el | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/vimgolf.el b/vimgolf.el index df6e15a..10d5389 100644 --- a/vimgolf.el +++ b/vimgolf.el @@ -537,17 +537,19 @@ the arg is ignored." () "Load next page of challenges." (interactive) - (if (< *vimgolf-browse-page-number* 10) - (setq *vimgolf-browse-page-number* (+ 1 *vimgolf-browse-page-number*))) - (vimgolf-browse t)) + (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 (> *vimgolf-browse-page-number* 1) - (setq *vimgolf-browse-page-number* (- *vimgolf-browse-page-number* 1))) - (vimgolf-browse t)) + (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 () From e5ce461db2b657fe7ecfef11352f84ca95272b5e Mon Sep 17 00:00:00 2001 From: Tanner Hoelzel Date: Wed, 22 May 2024 18:47:05 -0400 Subject: [PATCH 4/6] follow variable naming convention --- vimgolf.el | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/vimgolf.el b/vimgolf.el index 10d5389..1317972 100644 --- a/vimgolf.el +++ b/vimgolf.el @@ -407,7 +407,7 @@ part of the arg list away." (defvar vimgolf--browse-list nil "Holds a list of parsed VimGolf challenges.") -(defvar *vimgolf-browse-page-number* 1 +(defvar vimgolf--browse-page-number 1 "Holds the page number currently being browsed.") (defvar vimgolf--browse-last-page nil @@ -425,7 +425,7 @@ TODO Is there no API for browsing all the challenges?" (if (or (eq vimgolf--browse-list nil) force-pull) (url-retrieve (concat vimgolf-host "/?page=" - (number-to-string *vimgolf-browse-page-number*)) + (number-to-string vimgolf--browse-page-number)) 'vimgolf-parse-browse-html) (vimgolf-browse-list) (vimgolf-browse-next))) @@ -537,18 +537,18 @@ the arg is ignored." () "Load next page of challenges." (interactive) - (if (equal *vimgolf-browse-page-number* vimgolf--browse-last-page) + (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*)) + (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) + (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)) + (setq vimgolf--browse-page-number (- vimgolf--browse-page-number 1)) (vimgolf-browse t))) (defun vimgolf-browse-next From bc61c1dc09da3de9a37450bec2ca7a8a93c43a0c Mon Sep 17 00:00:00 2001 From: Tanner Hoelzel Date: Wed, 22 May 2024 18:47:39 -0400 Subject: [PATCH 5/6] add contributor name --- vimgolf.el | 1 + 1 file changed, 1 insertion(+) diff --git a/vimgolf.el b/vimgolf.el index 1317972..370c793 100644 --- a/vimgolf.el +++ b/vimgolf.el @@ -51,6 +51,7 @@ ;; Steve Purcell (@sanityinc) ;; Adam Collard (@acollard) ;; Siddhanathan Shanmugam (@siddhanathan) +;; Tanner Hoelzel (@thoelze1) ;;; Code: From ceef7e21ef645e90828de4bb08e7682e4036b2d4 Mon Sep 17 00:00:00 2001 From: Tanner Hoelzel Date: Wed, 22 May 2024 19:00:27 -0400 Subject: [PATCH 6/6] remove TODO comment I am fairly certain there is no API for browsing all of the challenges. The vimgolf docs say to use your browser to pick a challenge. I could find no functionality to browse challenges in the official CLI. --- vimgolf.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/vimgolf.el b/vimgolf.el index 370c793..704a328 100644 --- a/vimgolf.el +++ b/vimgolf.el @@ -419,9 +419,7 @@ part of the arg list away." "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)