From b4769c70c4f3bc196595ff9795acc10ca7ddc1a6 Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Sun, 6 Oct 2013 02:29:12 +0200 Subject: Move command definitions to separate file Hoping to keep the clark source file clean. --- lisp/commands.lisp | 130 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 lisp/commands.lisp (limited to 'lisp/commands.lisp') diff --git a/lisp/commands.lisp b/lisp/commands.lisp new file mode 100644 index 0000000..dedd46c --- /dev/null +++ b/lisp/commands.lisp @@ -0,0 +1,130 @@ +;; 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) + +(defcommand add (url name description &rest tags) + "Add a new bookmark." + "Usage: clark add [ ...] + +Add URL with NAME, DESCRIPTION and TAGS to the database. TAGS may be +omitted or any number of tag names." + (if (not (bookmark-exists-p url)) + (with-transaction *db* + (insert-bookmark url name description) + (add-tags (last-insert-rowid *db*) tags)) + (format t "~A has already been bookmarked~%" url))) + +(defcommand edit (url &rest rest) + "Edit a bookmark." + "Usage: clark edit [--name ] \\ + [--description ] + +Edit the information for URL, specifying which part(s) to edit. Each +option will replace the previous value for that part." + (let ((name-lst (member "--name" rest :test #'string=)) + (desc-lst (member "--description" rest :test #'string=)) + query qargs) + (when name-lst + (setf query (concatenate 'string query "name = ? ") + qargs (nconc qargs (list (cadr name-lst))))) + (when desc-lst + (setf query (concatenate 'string query (when qargs ", ") + "description = ? ") + qargs (nconc qargs (list (cadr desc-lst))))) + (when qargs + (apply #'execute-non-query *db* + (format + nil (sql update "bookmark" set "~A" where "url" = ?) query) + (append qargs (list url)))))) + +(defcommand exists (url) + "Check if a bookmark exists in the database." + "Usage: clark exists + +Check if URL exists in the database. Prints `yes' when found and `no' +otherwise." + (format t "~:[no~;yes~]~%" (bookmark-exists-p url))) + +(defcommand help (&optional command) + "Show help message." + help-message + (if command + (let ((ldoc + (nth 2 (car (member + command *help-messages* + :test #'(lambda (x y) (equal x (car y)))))))) + (cond + ((null ldoc) + (with-error-and-help + 1 "help" "Unknown command: ~a~%" command)) + ((and (symbolp ldoc) (fboundp ldoc)) (funcall ldoc)) + (t (format t "~A~%" ldoc)))) + (call-command help "help"))) + +(defcommand remove (url) + "Remove a bookmark from the database." + "Usage: clark remove + +Remove URL from the database." + (clear-tags url) + (delete-bookmark url)) + +(defcommand search (str) + "Search through bookmarks." + "Usage: clark search + +Search the database for STR. Matches are made for substrings of a +bookmark's name or an exact match for a tag." + (map nil #'print-bookmark (bookmark-search str))) + +(defcommand set-tags (url &rest tags) + "Set a bookmark's tags." + "Usage: clark set-tags [ ...] + +Set bookmark URL's tags to the given list, overwriting the previous +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 remove-tags (url &rest tags) + "Remove given tags from bookmark's tag list." + "Usage: clark remove-tags [ ...] + +Remove the given TAGS from URL's tag list. If no tags are given, +remove all tags from bookmark." + (delete-tags url tags)) + +(defcommand version () + "Show version." + "Usage: clark version + +Print the version number and exit." + (format t "clark version ~A~%" version)) -- cgit v1.2.3-54-g00ecf