#web-page #scripting #command-line-tool #networking #stdin #dynamic-menu

bin+lib thqm

A simple HTTP server to serve a dynamic menu for your scripts over the network

13 releases (5 breaking)

0.6.0 Oct 6, 2024
0.5.0 Sep 28, 2024
0.4.1 Sep 23, 2024
0.3.1 Sep 23, 2024
0.1.4 Feb 16, 2022

#161 in HTTP server

Download history 94/week @ 2024-09-07 67/week @ 2024-09-14 748/week @ 2024-09-21 332/week @ 2024-09-28 158/week @ 2024-10-05 10/week @ 2024-10-12 95/week @ 2024-11-30

95 downloads per month

MIT license

47KB
880 lines

thqm

A command line utility to generate and serve a dynamic menu web page.


thqm takes its name from the arabic تحكم, pronounced tahakoom, meaning control.

thqm is a nifty little command line utility. It dynamically generates a web page menu based on the provided stdin and outputs any selections to stdout.

In a sense, it functions similarly to dmenu/rofi but the menu is a web page served on the local network.

This makes it perfect to control scripts over the network.

See the examples folder for some example scripts.

📦 Installation

Manual

To compile and install manually from this repo, you'll need rust installed.

To compile the binary:

git clone https://github.com/loiccoyle/thqm-rs
cd thqm-rs
cargo build --release

The compiled binary will be located at ./target/release/thqm. Just place this binary somewhere in your $PATH.

Or to install it straight from cargo:

cargo install thqm

Make sure you have cargo's bin folder in your $PATH.

You'll also need to install the template styles with:

thqm --install-styles

This will install the styles in the user data folder.

Arch linux (AUR)

Using your favourite AUR helper:

paru -S thqm

The installation process will install the styles system wide in the /usr/share/thqm folder.

📋 Usage

CLI options

thqm has a few command line options, when in doubt see the --help.

$ thqm --help
A simple HTTP server to serve a dynamic menu web page.

thqm generates a menu based on the standard input and writes selections to standard output.

See https://github.com/loiccoyle/thqm-rs/tree/main/examples for script examples.

Basic usage:
$ echo 'Option 1\nOption 2' | thqm -u |
    while IFS= read -r sel; do
      case $sel in
      'Option 1') echo 'hello';;
      'Option 2') echo 'world';;
      *) echo "$sel";;
      esac
    done

Usage: thqm [OPTIONS]

Options:
  -p, --port <PORT>            The port to listen on [default: 8000]
  -U, --username <USERNAME>    The username to authenticate with
  -P, --password <PASSWORD>    The password to authenticate with
  -S, --separator <SEPARATOR>  The entry separator [default: "\n"]
  -t, --title <TITLE>          The page title [default: thqm]
  -s, --style <STYLE>          The page style [default: default]
      --style-dir <PATH>       Specify style with its root directory
  -Q, --qrcode                 Show the qrcode in terminal
      --save-qrcode <PATH>     Save the qrcode image to file
  -u, --url                    Show the page url
  -o, --oneshot                Shutdown server after first selection
  -c, --custom-input           Show custom input field
      --list-styles            List available page styles
      --no-shutdown            Don't allow the server to be shutdown from the page
      --no-qrcode              Don't allow the qrcode to be shown in the page
      --install-styles         Download and install styles to the user data directory
  -v, --verbose...             Increase logging verbosity
  -q, --quiet...               Decrease logging verbosity
  -h, --help                   Print help
  -V, --version                Print version

Scripting

thqm will generate a web page based on the provided stdin, the selected entry will be printed to stdout.

For this behaviour to actually be useful, we'll need to do a bit of scripting.

A typical script will look something like this:

#!/bin/sh

# define the handler function, i.e. what each option should do.
handler() {
  while IFS= read -r event; do
    case "$event" in
    "Option 1")
      # handle Option 1
      ;;
    "Option 2")
      # handle Option 2
      ;;
    *)
      # pass through thqm's output
      echo "$event"
      ;;
    esac
  done
}

printf "Option 1\nOption 2" | thqm "$@" | handler
# ^                                 ^      ^ Pass user selections to the handler
# │                                 └ Forward script's options to thqm
# └ Provide the options to thqm through stdin

See the examples folder for some example scripts.

🎨 Styling

thqm has a few pre-made menu styles, see the thqm-styles repository, which can be installed to your system's user data directory with the --install-styles flag.

To create your own styles, follow the same file structure as the included styles.

Path Usage
{DATA_DIR}/thqm/{style_name} The name of the style is determined by the name of the style's root folder in the user data directory.
{DATA_DIR}/thqm/{style_name}/template/index.html This file is the tera template which will be used to generate the menu.
{DATA_DIR}/thqm/{style_name}/static/ This directory holds static resources such as css, js and image files.

The {DATA_DIR} directory depends on the OS:

  • Linux: ${XDG_DATA_HOME}
  • MacOS: $HOME/Library/Application Support
  • Windows: C:\Users\{USER}\AppData\Roaming

The style tera template options are documented here.

User provided styles take priority over system wide styles.

If you want to contribute your own styles, please feel free to submit them to the thqm-styles repository.

Dependencies

~20–38MB
~569K SLoC