From 1afeaf67be32a8ef1599452d09b4cf7b326d0954 Mon Sep 17 00:00:00 2001 From: Sean Allred Date: Mon, 1 Dec 2014 08:45:50 -0500 Subject: Standardize local variables - Move lexical-binding to top of file; fixes #123 - Use indent-tabs-mode: nil for all files --- sx-tag.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'sx-tag.el') diff --git a/sx-tag.el b/sx-tag.el index 8c468a6..7ac80c6 100644 --- a/sx-tag.el +++ b/sx-tag.el @@ -1,4 +1,4 @@ -;;; sx-tag.el --- Retrieving list of tags and handling tags. -*- lexical-binding: t; -*- +;;; sx-tag.el --- retrieving list of tags and handling tags -*- lexical-binding: t; -*- ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by @@ -84,3 +84,7 @@ Return the list of invalid tags in TAGS." (provide 'sx-tag) ;;; sx-tag.el ends here + +;; Local Variables: +;; indent-tabs-mode: nil +;; End: -- cgit v1.2.3 From a812b209b24401827a7020051ac3726358795231 Mon Sep 17 00:00:00 2001 From: Artur Malabarba Date: Sun, 4 Jan 2015 21:22:42 -0200 Subject: Use defconst instead of defvar where appropriate. Fix #200 --- sx-auth.el | 64 +++++++++++++++++++++++++++-------------------------- sx-favorites.el | 2 +- sx-filter.el | 2 +- sx-inbox.el | 6 ++--- sx-networks.el | 2 +- sx-notify.el | 2 +- sx-question-list.el | 2 +- sx-question-mode.el | 2 +- sx-site.el | 2 +- sx-tag.el | 2 +- sx-time.el | 2 +- sx.el | 2 +- 12 files changed, 46 insertions(+), 44 deletions(-) (limited to 'sx-tag.el') diff --git a/sx-auth.el b/sx-auth.el index 686aa0c..cba310d 100644 --- a/sx-auth.el +++ b/sx-auth.el @@ -47,32 +47,33 @@ what you are doing! This variable is set with `sx-auth-authenticate'.") -(defvar sx-auth-method-auth '((me . t) - (inbox . t) - (notifications . t) - (events . t) - (posts (comments add)) - (comments delete - edit - flags - upvote) - (answers accept - delete - downvote - edit - flags - upvote) - (questions answers - add - close - delete - downvote - edit - favorite - flags - render - upvote - (unanswered my-tags))) +(defconst sx-auth-method-auth + '((me . t) + (inbox . t) + (notifications . t) + (events . t) + (posts (comments add)) + (comments delete + edit + flags + upvote) + (answers accept + delete + downvote + edit + flags + upvote) + (questions answers + add + close + delete + downvote + edit + favorite + flags + render + upvote + (unanswered my-tags))) "List of methods that require auth. Methods are of the form \(METHOD . SUBMETHODS) where SUBMETHODS is \(METHOD METHOD METHOD ...). @@ -80,11 +81,12 @@ Methods are of the form \(METHOD . SUBMETHODS) where SUBMETHODS If all SUBMETHODS require auth or there are no submethods, form will be \(METHOD . t)") -(defvar sx-auth-filter-auth '(question.upvoted - question.downvoted - answer.upvoted - answer.downvoted - comment.upvoted) +(defconst sx-auth-filter-auth + '(question.upvoted + question.downvoted + answer.upvoted + answer.downvoted + comment.upvoted) "List of filter types that require auth. Keywords are of the form \(OBJECT TYPES) where TYPES is \(FILTER FILTER FILTER).") diff --git a/sx-favorites.el b/sx-favorites.el index 7fdc772..d98b4c2 100644 --- a/sx-favorites.el +++ b/sx-favorites.el @@ -30,7 +30,7 @@ (require 'sx-networks) (require 'sx-filter) -(defvar sx-favorite-list-filter +(defconst sx-favorite-list-filter (sx-filter-from-nil (question.question_id))) diff --git a/sx-filter.el b/sx-filter.el index 4695446..57c491d 100644 --- a/sx-filter.el +++ b/sx-filter.el @@ -107,7 +107,7 @@ return the compiled filter." ;;; Browsing filter -(defvar sx-browse-filter +(defconst sx-browse-filter (sx-filter-from-nil ((question body_markdown bounty_amount diff --git a/sx-inbox.el b/sx-inbox.el index 01000a6..1efceb1 100644 --- a/sx-inbox.el +++ b/sx-inbox.el @@ -28,7 +28,7 @@ ;;; API -(defvar sx-inbox-filter +(defconst sx-inbox-filter '((inbox_item.answer_id inbox_item.body inbox_item.comment_id @@ -91,7 +91,7 @@ These are identified by their links.") "List of notification items which are read. These are identified by their links.") -(defvar sx-inbox--header-line +(defconst sx-inbox--header-line '(" " (:propertize "n p j k" face mode-line-buffer-id) ": Navigate" @@ -106,7 +106,7 @@ These are identified by their links.") ": Quit") "Header-line used on the inbox list.") -(defvar sx-inbox--mode-line +(defconst sx-inbox--mode-line '(" " (:propertize (sx-inbox--notification-p diff --git a/sx-networks.el b/sx-networks.el index 2695689..45eaf05 100644 --- a/sx-networks.el +++ b/sx-networks.el @@ -29,7 +29,7 @@ (require 'sx-site) (require 'sx-filter) -(defvar sx-network--user-filter +(defconst sx-network--user-filter (sx-filter-from-nil ((badge_count bronze silver diff --git a/sx-notify.el b/sx-notify.el index 6dc90b9..0c9a5b8 100644 --- a/sx-notify.el +++ b/sx-notify.el @@ -27,7 +27,7 @@ ;;; mode-line notification -(defvar sx-notify--mode-line +(defconst sx-notify--mode-line '((sx-inbox--unread-inbox (sx-inbox--unread-notifications " [")) (sx-inbox--unread-inbox (:propertize diff --git a/sx-question-list.el b/sx-question-list.el index b9f34a0..c72dc0d 100644 --- a/sx-question-list.el +++ b/sx-question-list.el @@ -228,7 +228,7 @@ and thus not displayed in the list of questions. This is ignored if `sx-question-list--refresh-function' is set.") (make-variable-buffer-local 'sx-question-list--dataset) -(defvar sx-question-list--header-line +(defconst sx-question-list--header-line '(" " (:propertize "n p j k" face mode-line-buffer-id) ": Navigate" diff --git a/sx-question-mode.el b/sx-question-mode.el index f702822..5303ebb 100644 --- a/sx-question-mode.el +++ b/sx-question-mode.el @@ -178,7 +178,7 @@ property." ;;; Major-mode -(defvar sx-question-mode--header-line +(defconst sx-question-mode--header-line '(" " (:propertize "n p TAB" face mode-line-buffer-id) ": Navigate" diff --git a/sx-site.el b/sx-site.el index 02f618e..9b2ea34 100644 --- a/sx-site.el +++ b/sx-site.el @@ -28,7 +28,7 @@ (require 'sx-cache) (require 'sx-filter) -(defvar sx-site-browse-filter +(defconst sx-site-browse-filter (sx-filter-from-nil ((site site_type name diff --git a/sx-tag.el b/sx-tag.el index 7ac80c6..5e75890 100644 --- a/sx-tag.el +++ b/sx-tag.el @@ -26,7 +26,7 @@ ;;; Getting the list from a site -(defvar sx-tag-filter +(defconst sx-tag-filter (sx-filter-from-nil (tag.name tag.synonyms)) diff --git a/sx-time.el b/sx-time.el index 1d1267b..9fa0037 100644 --- a/sx-time.el +++ b/sx-time.el @@ -26,7 +26,7 @@ (require 'time-date) -(defvar sx-time-seconds-to-string +(defconst sx-time-seconds-to-string ;; (LIMIT NAME VALUE) ;; We use an entry if the number of seconds in question is less than ;; LIMIT, but more than the previous entry's LIMIT. diff --git a/sx.el b/sx.el index 8cfb5dc..3271755 100644 --- a/sx.el +++ b/sx.el @@ -300,7 +300,7 @@ Return the result of BODY." (push ov sx--overlays)) result)) -(defvar sx--ascii-replacement-list +(defconst sx--ascii-replacement-list '(("[:space:]" . "") ("àåáâäãåą" . "a") ("èéêëę" . "e") -- cgit v1.2.3 From d26df2730db01a4904ad71eb3590b5d90c015767 Mon Sep 17 00:00:00 2001 From: Artur Malabarba Date: Sun, 4 Jan 2015 23:16:44 -0200 Subject: Implement sx-tag-list--get --- sx-tag.el | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'sx-tag.el') diff --git a/sx-tag.el b/sx-tag.el index 5e75890..0f726fd 100644 --- a/sx-tag.el +++ b/sx-tag.el @@ -62,6 +62,23 @@ Returns a list." (mapcar (lambda (x) (cdr (assoc 'name x))) (sx-tag--get-some-tags-containing site string))) + +;;; Getting tags from our data branch. Without the API. +;;;; @TODO: Once the cache is finished, this can probably be made into +;;;; a cache variasble with 1 day expiration time. +(defvar sx-tag-list-alist nil + "Alist where the tag list for each site is stored. +Elements are of the type (SITE . TAG-LIST).") + +(defun sx-tag-list--get (site) + "Retrieve all tags from SITE in a single request. +This does not access the API. Instead, it uses +`sx-request-get-data', which accesses SX's tag cache." + (or (cdr (assoc site sx-tag-list-alist)) + (let ((list (sx-request-get-data (concat "tags/" site)))) + (push (cons site list) sx-tag-list-alist) + list))) + ;;; Check tag validity (defun sx-tag--invalid-name-p (site tags) -- cgit v1.2.3 From 065ef960b3fcf80ea68dbcbbcca8c276a2d09b07 Mon Sep 17 00:00:00 2001 From: Artur Malabarba Date: Mon, 5 Jan 2015 00:53:01 -0200 Subject: Move sx--multiple-read to sx-tag-multiple-read --- sx-search.el | 13 ++++--------- sx-tag.el | 33 +++++++++++++++++++++++++++++++++ sx.el | 18 ------------------ 3 files changed, 37 insertions(+), 27 deletions(-) (limited to 'sx-tag.el') diff --git a/sx-search.el b/sx-search.el index d47905e..8614f49 100644 --- a/sx-search.el +++ b/sx-search.el @@ -32,13 +32,11 @@ (require 'sx) (require 'sx-question-list) +(require 'sx-tag) (defvar sx-search--query-history nil "Query history for interactive prompts.") -(defvar sx-search--tag-history nil - "Tags history for interactive prompts.") - ;;; Basic function (defun sx-search-get-questions (site page query &optional tags excluded-tags keywords) @@ -84,15 +82,12 @@ prefix argument, the user is asked for everything." (when (string= query "") (setq query nil)) (when current-prefix-arg - (setq tags (sx--multiple-read - (format "Tags (%s)" - (if query "optional" "mandatory")) - 'sx-search--tag-history)) + (setq tags (sx-tag-multiple-read + site (format "Tags%s" (if query " (optional)" "")))) (when (and (not query) (string= "" tags)) (sx-user-error "Must supply either QUERY or TAGS")) (setq excluded-tags - (sx--multiple-read - "Excluded tags (optional)" 'sx-search--tag-history))) + (sx-tag-multiple-read site "Excluded tags (optional)"))) (list site query tags excluded-tags))) ;; Here starts the actual function diff --git a/sx-tag.el b/sx-tag.el index 0f726fd..41ed9eb 100644 --- a/sx-tag.el +++ b/sx-tag.el @@ -99,6 +99,39 @@ Return the list of invalid tags in TAGS." :site site)))) (cl-remove-if (lambda (x) (member x result)) tags))) + +;;; Prompt the user for tags. +(defvar sx-tag-history nil + "Tags history for interactive prompts.") + +;;; @TODO: Make it so that hitting BACKSPACE with an empty input +;;; deletes a previously submitted tag. +(defun sx-tag-multiple-read (site prompt &optional initial-value) + "Interactively read a list of tags for SITE. +Call `sx-completing-read' multiple times, until input is empty. +Return a list of tags given by the user. + +PROMPT is a string displayed to the user and should not end with +a space nor a colon. INITIAL-VALUE is a list of already-selected +tags." + (let ((completion-list (sx-tag-list--get site)) + (list initial-value) + input) + (while (not (string= + "" + (setq input (sx-completing-read + (concat prompt " [" + (mapconcat #'identity list ",") + "]: ") + completion-list + (lambda (x) (not (member x list))) + nil + 'require-match + nil + 'sx-tag-history)))) + (push input list)) + list)) + (provide 'sx-tag) ;;; sx-tag.el ends here diff --git a/sx.el b/sx.el index 3271755..9924308 100644 --- a/sx.el +++ b/sx.el @@ -176,24 +176,6 @@ All ARGS are passed to `completing-read' or `ido-completing-read'." (apply (if ido-mode #'ido-completing-read #'completing-read) args)) -(defun sx--multiple-read (prompt hist-var) - "Interactively query the user for a list of strings. -Call `read-string' multiple times, until the input is empty. - -PROMPT is a string displayed to the user and should not end with -a space nor a colon. HIST-VAR is a quoted symbol, indicating a -list in which to store input history." - (let (list input) - (while (not (string= - "" - (setq input (read-string - (concat prompt " [" - (mapconcat #'identity list ",") - "]: ") - "" hist-var)))) - (push input list)) - list)) - (defmacro sx-sorted-insert-skip-first (newelt list &optional predicate) "Inserted NEWELT into LIST sorted by PREDICATE. This is designed for the (site id id ...) lists. So the first car -- cgit v1.2.3 From 34ea6829153a1b5b45104c0650a9d0a148491aef Mon Sep 17 00:00:00 2001 From: Artur Malabarba Date: Mon, 5 Jan 2015 11:16:50 -0200 Subject: Fix sx-tag-completing-read --- sx-tag.el | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'sx-tag.el') diff --git a/sx-tag.el b/sx-tag.el index 41ed9eb..b2ad375 100644 --- a/sx-tag.el +++ b/sx-tag.el @@ -108,29 +108,30 @@ Return the list of invalid tags in TAGS." ;;; deletes a previously submitted tag. (defun sx-tag-multiple-read (site prompt &optional initial-value) "Interactively read a list of tags for SITE. -Call `sx-completing-read' multiple times, until input is empty. +Call `sx-completing-read' multiple times, until input is empty, +with completion options given by the tag list of SITE. Return a list of tags given by the user. PROMPT is a string displayed to the user and should not end with a space nor a colon. INITIAL-VALUE is a list of already-selected tags." (let ((completion-list (sx-tag-list--get site)) - (list initial-value) + (list (reverse initial-value)) + (empty-string + (propertize "--\x000-some-string-representing-empty-\x000--" + 'display "DONE")) input) (while (not (string= - "" + empty-string (setq input (sx-completing-read (concat prompt " [" - (mapconcat #'identity list ",") + (mapconcat #'identity (reverse list) ",") "]: ") completion-list - (lambda (x) (not (member x list))) - nil - 'require-match - nil - 'sx-tag-history)))) + nil 'require-match nil 'sx-tag-history + empty-string)))) (push input list)) - list)) + (reverse list))) (provide 'sx-tag) ;;; sx-tag.el ends here -- cgit v1.2.3