diff --git a/doc/clark.texi b/doc/clark.texi index f0ba70b..69f1ba5 100644 --- a/doc/clark.texi +++ b/doc/clark.texi @@ -118,6 +118,12 @@ as when no commands are given, but filtered by either of these conditions. @end deffn +@deffn Command random [TAG] +Look through the database for a random bookmark. If @var{tag} is +specified, limit the results to bookmarks having the given tag. Simply +prints the url of the selected bookmark. +@end deffn + @node Management, Miscellaneous, Querying, Usage @section Maintaining bookmarks in the database. diff --git a/js/clark.js b/js/clark.js index 80eff5d..72c9ee4 100644 --- a/js/clark.js +++ b/js/clark.js @@ -264,6 +264,22 @@ function clark_set_tags(I) { interactive("clark-set-tags", "Replace the tags for the bookmark of" + " the current URL.", clark_set_tags); +function clark_random(I) +{ + check_buffer(I.buffer, content_buffer); + + let tag = yield I.minibuffer.read($prompt="tag: "); + let command = clark_program + ' random'; + if (tag != "") + command += ' ' + tag; + + let result = yield clark_shell_command(command); + + if (result) + I.buffer.load(result); +} +interactive("clark-random", "Open a random bookmark", clark_random); + function clark_shell_command(command) { let data = "", error = ""; @@ -278,11 +294,12 @@ function clark_shell_command(command) )}] ); - yield co_return(error == ""); + yield co_return(error == "" && data); } define_keymap("clark_keymap"); +define_key(clark_keymap, "#", "clark-random"); define_key(clark_keymap, "?", "clark-exists-p"); define_key(clark_keymap, "a", "clark-add"); define_key(clark_keymap, "A", "clark-add-link"); diff --git a/lisp/clark.asd b/lisp/clark.asd index fca0f42..48ac718 100644 --- a/lisp/clark.asd +++ b/lisp/clark.asd @@ -30,4 +30,5 @@ :serial t :depends-on (:sqlite) :components ((:file "package") - (:file "clark"))) + (:file "clark") + (:file "queries"))) diff --git a/lisp/clark.lisp b/lisp/clark.lisp index bfb0868..d9477e8 100644 --- a/lisp/clark.lisp +++ b/lisp/clark.lisp @@ -330,6 +330,17 @@ list of tags." (clear-tags url) (add-tags url tags)) +(defun random-item (lst) + (nth (random (length lst) (make-random-state t)) lst)) + +(defcommand random (&optional tag) + "Pick a random bookmark, possibly from TAG." + "Usage: clark random [] + +Get a random bookmark. If TAG is given limit the result to a bookmark +having the tag TAG." + (format t "~a~%" (random-item (url-list tag)))) + (defcommand version () "Show version." "Usage: clark version diff --git a/lisp/queries.lisp b/lisp/queries.lisp new file mode 100644 index 0000000..1df24c5 --- /dev/null +++ b/lisp/queries.lisp @@ -0,0 +1,46 @@ +;; Copyright (C) 2013 Tom Willemsen + +;; This file is part of CLark + +;; CLark 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. + +;; CLark 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 CLark. If not, see . + +;;; Code: + +(in-package :org.ryuslash.clark) + +(defun url-list-no-tag () + "Get a list of all URLs stored." + (mapcar #'car + (execute-to-list + *db* (sql select "url" + from "bookmark")))) + +(defun url-list-for-tag (tag) + "Get a list of all the stored URLs with tag TAG." + (mapcar + #'car + (execute-to-list + *db* (sql select "url" + from "bookmark" + where ? in (select "name" + from "tag" + join "bookmark_tag" on ("tag_id = tag.rowid") + where "bookmark_id" = "bookmark.rowid")) + tag))) + +(defun url-list (&optional tag) + "Get a list of URLs, possibly with tag TAG." + (if tag + (url-list-for-tag tag) + (url-list-no-tag)))