commit 0b105d1caecb9520737622fa1aef69df3892c43e
parent dd5040f2308c934044f21a9d267c979da3f68c2d
Author: lou woell <lou@repetitions.de>
Date: Mon, 23 Mar 2026 00:40:39 +0100
split file
Diffstat:
| A | linkhut-dmenu.scm | | | 65 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| M | linkhut.scm | | | 59 | +++++++++++++++++------------------------------------------ |
2 files changed, 82 insertions(+), 42 deletions(-)
diff --git a/linkhut-dmenu.scm b/linkhut-dmenu.scm
@@ -0,0 +1,65 @@
+#!/bin/guile \
+-l ./linkhut.scm -e main -s
+!#
+
+(use-modules
+ (linkhut)
+ (rnrs io ports)
+ ;; readline
+ (ice-9 rdelim))
+
+(define prompt "Bookmark: ")
+
+;; (post ...) -> ((title . link) ...)
+(define (show posts)
+ (map (lambda (post) (cons (get-post-value 'title post)
+ (get-post-value 'link post)))
+ posts))
+
+;; Spawn a dmenu let the user select an entry and return it. ENTRIES is assumed
+;; to be an alist with string keys, which will be shown to the user.
+(define (menu entries)
+ (let* ((in-pipe (pipe))
+ (out-pipe (pipe))
+ (pid (spawn "dmenu" `("dmenu"
+ "-p" ,prompt
+ "-P" ">")
+ #:input (car in-pipe)
+ #:output (cdr out-pipe))))
+ (close-port (cdr out-pipe))
+
+ (map (lambda (entry) (write-line (car entry) (cdr in-pipe)))
+ entries)
+ (close-port (cdr in-pipe))
+
+ (let ((result (read-line (car out-pipe))))
+ (close-port (car out-pipe))
+ (display (/ (cdr (waitpid pid))
+ 256))
+ (newline)
+
+ (assoc result entries))))
+
+(define* (mark-read post #:key (shared #t))
+ (post-add (get-post-value 'link post)
+ (get-post-value 'title post)
+ #:extended (get-post-value 'note post)
+ #:tags (filter (lambda (x) (not (string= x "unread")))
+ (get-post-value 'tags post))
+ #:shared shared
+ #:replace #t
+ #:toread #f))
+
+(define* (mark-unread post #:key (shared #t))
+ (post-add (get-post-value 'link post)
+ (get-post-value 'title post)
+ #:extended (get-post-value 'note post)
+ #:tags (filter (lambda (x) (not (string= x "unread")))
+ (get-post-value 'tags post))
+ #:shared shared
+ #:replace #t
+ #:toread #t))
+
+(define (main args)
+ (let ((selection (menu (show (post-get #:tag "unread")))))
+ (waitpid (spawn "xdg-open" `("xdg-open" ,(cdr selection))))))
diff --git a/linkhut.scm b/linkhut.scm
@@ -1,6 +1,3 @@
-#!/bin/guile -s
-!#
-
;;; linkhut interface for guile scheme
;; Copyright (C) 2026 lou woell <lou@repetitions.de>
@@ -25,6 +22,23 @@
;;; Code:
+(define-module (linkhut)
+ #:export (post-update
+ post-add
+ post-delete
+ post-get
+ post-recent
+ post-dates
+ post-all
+ post-all-hashes
+ post-suggest
+
+ get-post-value
+
+ tags-get
+ tag-delete
+ tag-rename))
+
(use-modules
;; let-values
(srfi srfi-11)
@@ -34,8 +48,6 @@
;; readline
(ice-9 rdelim)
- (rnrs io ports)
-
(web uri)
(web response)
(web client)
@@ -46,8 +58,6 @@
;; TODO: make this a bit more user friendly
(define token (call-with-input-file "./token" read-line))
-(define prompt "Bookmark: ")
-
(define host "api.ln.ht")
(define api-version "v1")
(define post-url "posts")
@@ -388,38 +398,3 @@
(call-linkhut (list tags-url "delete")
`((old . ,old)
(new . ,new))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;; menu
-;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;; (post ...) -> ((title . link) ...)
-(define (show posts)
- (map (lambda (post) (cons (get-post-value 'title post)
- (get-post-value 'link post)))
- posts))
-
-;; Spawn a dmenu let the user select an entry and return it. ENTRIES is assumed
-;; to be an alist with string keys, which will be shown to the user.
-(define (menu entries)
- (let* ((in-pipe (pipe))
- (out-pipe (pipe))
- (pid (spawn "dmenu" `("dmenu" "-p" ,prompt)
- #:input (car in-pipe)
- #:output (cdr out-pipe))))
- (close-port (cdr out-pipe))
-
- (map (lambda (entry) (write-line (car entry) (cdr in-pipe)))
- entries)
- (close-port (cdr in-pipe))
-
- (let ((result (read-line (car out-pipe))))
- (close-port (car out-pipe))
- (display (/ (cdr (waitpid pid))
- 256))
- (newline)
-
- (assoc result entries))))