A text-based bookmark manager rendered in a web page
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

159 lines
4.6 KiB

8 months ago
*FR → LISEZMOI.md*
# Demo
8 months ago
![a browsable bookmark manager](demo.png)
8 months ago
**A demo more understandable and browsable to be released soon**
8 months ago
# Presentation
## signet.sh
Signet.sh is a shell script parsing a bookmark database to a webpage.
It uses awk inside a here-doc declaration redirected to an html file.
I have created this script because I found the bookmarks manager from
firefox not great to use, to the point where I did not have the habit to
bookmark my browsing. Firefox stores bookmarks in a sqlite format and I
8 months ago
wanted something text based.
I have been using the generated html page as a default landing page for
three months, it has been a pleasing experience so far.
8 months ago
## Bookmarks database format
Only a Url is required, the rest of the fields are optional :
8 months ago
* URL : ...
* Name : grabs </title> from the bookmarked page
* Description : ...
* Tags : comma separated keywords
* Date : posix time of the bookmarked link
* Color : css color (name, hex, rgb etc...)
8 months ago
For example, in a file called BOOKMARKS by default:
```
URL: https://rosettacode.org/wiki/Rosetta_Code
Name: Rosetta Code
Description:
Tags: literacy, read
Date: 1704675057
Color: Purple
URL: https://www.emigre.com/TypeSpecimens
Name: Emigre: Type Specimens
Description:
Tags: emigre, type
Date: 1704680644
URL: https://web.archive.org/web/20211025182257/http://len.falken.ink/
Name: Wayback Machine
Description:
Tags: read
Date: 1704712747
```
# Other bookmark managers:
- nb https://xwmx.github.io/nb/ (AGPL-3.0)
- ??
# Dependency :
To add a link via the proposed interface, we will need
to install dmenu ~~and htmlq~~.
* dmenu https://tools.suckless.org/dmenu/ (MIT/X)
* ~~htmlq https://github.com/mgdm/htmlq (MIT)~~ replaced by one
awk command
## dmenu
Dmenu is an interactive menu that allows us to select and write
values in a menu. These values can come from a program
provided as input from a pipe "|", for example:
```
ls | dmenu
```
displays a drop-down menu with the files in my directory.
In our script, to store the given tags in a variable, we can do:
```
tags=$(echo "" | dmenu -p "Enter comma-separated tags:")
```
## ~~htmlq~~
Htmlq is an HTML parser written in Go. It doesn't matter which parser we
8 months ago
use, it seems that each language has its own.
8 months ago
We give to the program an html string and it filters through it using css
selectors returning the found html elements
Using javascript, retrieving all the \<h1> children of a \<section> can
be done with :
```
document.querySelectorAll('section h1')
```
8 months ago
In shell, it's more complicated since we don't have document object
model we can query. Htmlq is made for that:
8 months ago
```
cat fichier.html | htmlq 'section h1'
```
And to output only the text -- the javascript equivalent of .innerHTML:
```
cat fichier.html | htmlq 'section h1' --text
```
We use it to retrieve the title tag of the page to add:
```
curl page.html | htmlq 'title' --text
```
Pre-release patch:
```
curl $url | awk -v RS='</title>' \
'/<title>/ {gsub(/.*<title>/, ""); print}' |\
tr -d '\n'
```
For the moment this step is blocking. In case internet cuts while
bookmarking a link, you will have to wait for the end of the curl
attempt to move to the next field in the script :/ sorry!
# Add a bookmark :
To add a link, I select the URL of the page with Ctrl + l, the copy and
8 months ago
run add.sh with Super + i.
__If anyone knows how to retrieve the url of
8 months ago
the current browser page without having to copy it, this would save two
8 months ago
steps out of three.__
8 months ago
8 months ago
In short : Ctrl + l, Ctrl + c, Super + i
8 months ago
8 months ago
(or shorter : Ctrl + l + c, Super + i)
8 months ago
Super + i because in my window manager configuration file located in
~/.config/awesome/rc.lua, I have the following lines:
```
awful.key({modkey}, "i", function()
awful.util.spawn_with_shell("add.sh") end,
{description = "Enregistre le lien copié dans signet.sh"}),
```
8 months ago
# Repository structure :
8 months ago
* BOOKMARKS → A textual database of bookmarks
* add.sh → A script to add a link to the database
8 months ago
* dmenu
* ./signet.sh
8 months ago
* bookmark.sh → The shell script itself
8 months ago
* It generates a new html page from the link database
(default index.html)
8 months ago
* style.css → Stylesheet for index.html
* script.js → A bit of javascript for:
8 months ago
* search in the \<textarea>
* add background colors to entries that have them
* if the description field is empty, do not display it
* format posix time dates to YY-MM-DD format
8 months ago
8 months ago
/!\ Soon /!\
8 months ago
8 months ago
starred.sh → curl from the github user api and format it in the same
way as signet.sh without using jq
https://api.github.com/users/[user]/starred
# Credits
8 months ago
* Junicode (OFL-1.1)
8 months ago
https://psb1558.github.io/Junicode-font/
8 months ago
* dmenu (MIT/X)
8 months ago
https://tools.suckless.org/dmenu/
8 months ago
* jquery (MIT)
https://jquery.com/
8 months ago