diff options
| author | 2012-12-29 16:54:16 +0100 | |
|---|---|---|
| committer | 2012-12-29 16:54:16 +0100 | |
| commit | b46793938598358a9ab5249bd97e8999d5ac67e6 (patch) | |
| tree | 3461b18599341fd3be19b0c094d6a62775478b88 /src/markam.scm | |
| parent | f379783d28e73b4613852fca58e0af3f8ea6ab87 (diff) | |
| download | markam-b46793938598358a9ab5249bd97e8999d5ac67e6.tar.gz markam-b46793938598358a9ab5249bd97e8999d5ac67e6.zip | |
Rename linkwave to markam
Diffstat (limited to 'src/markam.scm')
| -rw-r--r-- | src/markam.scm | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/src/markam.scm b/src/markam.scm new file mode 100644 index 0000000..38bfc42 --- /dev/null +++ b/src/markam.scm @@ -0,0 +1,117 @@ +;;; markam -- Store/retrieve/manage bookmarks +;; Copyright (C) 2012 Tom Willemsen <tom at ryuslash dot org> + +;; 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 +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program 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 this program. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; The main program. For documentation you should consult the +;; README.org and/or any Texinfo documentation provided. + +;;; Code: + +(declare (uses paths + common)) + +(require-extension sqlite3) +(require-library posix srfi-4) + +(define version "0.1.0") + +(: string-no-null (string -> string)) +(define (string-no-null str) + ;; If STR contains a \0 byte at the end, remove it, otherwise return + ;; STR unchanged. + (if (and (> (string-length str) 0) + (char=? (string-ref str (- (string-length str) 1)) #\nul)) + (substring str 0 (- (string-length str) 1)) + str)) + +(: print-row (string fixnum string string -> void)) +(define (print-row url seconds name description) + ;; Print URL, SECONDS, NAME and DESCRIPTION to the standard output + ;; stream. + (format #t "~a~% ~a~% ~a~% ~a~%~%" (string-no-null name) (string-no-null description) + (string-no-null url) (seconds->string seconds))) + +(define (add-tag db name) + ;; Add NAME to the `tag' table in DB. + (execute db "INSERT INTO tag VALUES (?)" name) + (last-insert-rowid db)) + +(define (add-bookmark db url name description tags) + ;; Add a bookmark to the `bookmark' table in DB. URL is the url of + ;; the bookmark, NAME the title, DESCRIPTION a (possibly longer) + ;; description of the bookmark and TAGS is a list of tags to assign + ;; to it. Each tag will be created if necessary. + (execute db "INSERT INTO bookmark VALUES (?, STRFTIME('%s'), ?, ?)" + url name description) + (let ((bookmark-id (last-insert-rowid db))) + (for-each (lambda (tag) + (let ((tag-id '())) + (condition-case + (set! tag-id (first-result db "SELECT rowid FROM tag WHERE name = ?" tag)) + (exn (exn sqlite3) + (if (eq? (get-condition-property exn 'sqlite3 'status) 'done) + (set! tag-id (add-tag db tag)) + (signal exn)))) + (execute db "INSERT INTO bookmark_tag VALUES (?, ?)" + bookmark-id tag-id))) + tags))) + +(define (url-string? str) + ;; Is STR a URL? Very naïve, assumes all URLs begin with either + ;; `http://' or `https://', should be improved. + (and (> (string-length str) 7) + (or (string= (substring str 0 7) "http://") + (string= (substring str 0 8) "https://")))) + +(define (display-help) + ;; Display markam's help message. + (format #t (string-append + "Usage: markam [options]...~%" + " markam <url> <name> <description> [<tag>...]~%" + "~%" + "Possible options:~%" + "~%" + "--help, -h Display this help and exit~%" + "--version, -v Output version information and exit~%"))) + +(define (main args) + ;; Open a database connection, do what the user asked and close it + ;; again. + (let ((db (open-database (data-file "markam.db")))) + (if (null? args) + (for-each-row print-row db "select * from bookmark") + (if (url-string? (car args)) + (with-transaction + db (lambda () (add-bookmark db (car args) (cadr args) (caddr args) (cdddr args)) #t)) + ;; If the first argument is not a URL, loop through all + ;; arguments and proceed accordingly. + (do ((arg (car args) (and (not (null? args)) + (car args)))) + ((or (null? arg) (not arg))) + (cond + ((or (string= arg "-v") (string= arg "--version")) + (display-version) + (exit 0)) + ((or (string= arg "-h") (string= arg "--help")) + (display-help) + (exit 0)) + (else + (format #t "Unrecognized option: ~a~%" (car args)))) + (set! args (cdr args))))) + (finalize! db #t))) + +(main (command-line-arguments)) |
