Read, organize, archive
I heavily use getpocket to collect articles and save them for later reading. While on my mobile devices I use the official
app, on my desktop systems (mostly tmux + Emacs) I use pocket-reader.el quite heavily to collect/organize/archive my list of
articles. After my transition from Spacemacs to Doom Emacs I still love evil mode and like to do most of the stuff in normal
mode. That’s why I’ve added some keybindings to pocket-reader:
1
2
3
4
5
6
7
8
9
10
11
|
(map! :map pocket-reader-mode-map
:after pocket-reader
:nm "d" #'pocket-reader-delete
:nm "a" #'pocket-reader-toggle-archived
:nm "TAB" #'pocket-reader-open-url
:nm "tr" #'pocket-reader-remove-tags
:nm "ta" #'pocket-reader-add-tags
:nm "gr" #'pocket-reader-refresh
:nm "p" #'pocket-reader-search
:nm "y" #'pocket-reader-copy-url
:nm "Y" #'dorneanu/pocket-reader-copy-to-scratch)
|
This way I can add/remove tags, archive articles, open links without leaving normal mode in evil
.
Read later on E-Reader
Since I tend to read on my e-reader most of the time, I also wanted to have an almost automated way of saving articles to Epub
and send these to my device. Fortunately PocketBook devices can sync with Dropbox which made my life quite easy in the past. I just had to copy e-books, PDFs, Epubs to a specific folder in Dropbox and these will eventually sync with my device once WiFi
is activated. That’s first step of automation.
As for the Epub conversion I’ve used pandoc in the past which still does its job great. Initially I’ve used monolith to save complete web pages as HTML but I’ve realized the HTML also contained useless ads, images, text. That’s why I’ve searched for
ways how to make the content more readable and discovered rdrview. It’s written in C and applies Firefox’s reader view to web pages. Here are some examples:
1
2
3
4
|
$ rdrview -M http://blog.dornea.nu/2021/06/13/note-taking-in-2021/
Title: Note taking in 2021 - blog.dornea.nu
Excerpt: [Update 2021-06-22] If you’re more interested in the Tiddlywiki aspect of this post you can also check this Tiddlywiki Google Groups thread. [Update 2021-06-18] This post caught some attention on this Hackernews thread. You might want to check the comments. Based on the recommendations in the thread I’ve put together a list of (digital) solutions (besides the preferred ones) Almost 6 years ago I was blogging about organizing and visualizing knowledge.
Readerable: Yes
|
Code Snippet 1:
Get meta information
And now I’m using some xpath
to extract the title:
1
2
|
$ rdrview -T title,body -H http://blog.dornea.nu/2021/06/13/note-taking-in-2021/ | xmllint --html --xpath "//div/h1/text()" -
Note taking in 2021 - blog.dornea.nu
|
Below I’ve glued everything together in order to:
- convert an URL to epub
- extract the title and use it as the filename for the Epub
- do the converion using pandoc
- use rclone to copy the file to Dropbox
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
#!/bin/bash
RDRVIEW_OUTPUT=~/work/dropbox/rdrview
DROPBOX_DIR="dropbox:Apps/Dropbox PocketBook/articles/2021/"
add_link_to_dropbox() {
# Create tmp file
TEMP_FILE=$(mktemp)
# Make link readable
rdrview -T title,body -H $1 > $TEMP_FILE
# Extract title
TITLE=$(xmllint --html --xpath "//div/h1/text()" 2>/dev/null ${TEMP_FILE})
echo "[-] Converting $TITLE"
# Convert to PDF
OUTPUT_FILE="${RDRVIEW_OUTPUT}/${TITLE// /_}".epub
pandoc --pdf-engine=xelatex --metadata title="${TITLE}" -f html -t epub -o ${OUTPUT_FILE} ${TEMP_FILE}
# Copy to dropbox
rclone copy ${OUTPUT_FILE} "${DROPBOX_DIR}"
# Log
echo "[-] Successfully added ${OUTPUT_FILE} to dropbox."
# Clean up
rm $TEMP_FILE
rm $OUTPUT_FILE
}
add_link_to_dropbox $1
|
Let’s give it a try using https://pandoc.org/ as an URL:
1
2
3
|
$ ~/work/dropbox/add_links_to_dropbox https://pandoc.org/
[-] Converting Pandoc - About pandoc
[-] Successfully added /home/victor/work/dropbox/rdrview/Pandoc_-_About_pandoc.epub to dropbox.
|
Emacs for Everything
Now I’d like to be able to call that script from Emacs without copy/paste URLs and hand them over to my script.
The most difficult part here was to come up with some valid Elisp code. What I wanted was:
- in
pocket-reader
copy entry’s URL to scratch
buffer
- once I have collected the list of URLs for which I want the Epub conversion
- take the list and use it as input for my script
- use
xargs
since my script takes only one argument
And this is what I’ve got (my first elisp function ever):
1
2
3
4
5
6
7
8
9
10
11
|
;; Copy current url to scratch buffer
(defun dorneanu/pocket-reader-copy-to-scratch ()
"Copy URL of current item to kill-ring/clipboard."
(interactive)
(when-let ((id (tabulated-list-get-id))
(item (ht-get pocket-reader-items id))
(url (pocket-reader--get-url item)))
(with-current-buffer "*scratch*"
(insert url)
(newline))
(message "Added: %s to scratch buffer" url)))
|
This will insert
the URL into the scratch
buffer and add a new line. Once you have your URLs in the buffer you can
use shell-command-on-region
with xargs -n1 <script>
as shown in the asciinema below.
Demo