commit 0b105d1caecb9520737622fa1aef69df3892c43e
parent dd5040f2308c934044f21a9d267c979da3f68c2d
Author: lou woell <lou@repetitions.de>
Date:   Mon, 23 Mar 2026 00:40:39 +0100

split file

Diffstat:
Alinkhut-dmenu.scm | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mlinkhut.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))))