# Barbly

Barbly allows you to create status bar menus for macOS. It's similar to
[bitbar](https://github.com/matryer/bitbar) and supports some of the same
syntax.

Each instance of a barbly executable creates only one menu item. You specify
the period at which to refresh, and the command to generate the menu contents.

## Sample Scripts

Some sample scripts that are useful to use with barbly can be found in the
[scripts](./scripts) directory.

Here is an example of running the [`github_issues.sh`](./scripts/github_issues.sh)
script with barbly to monitor for new issues.

    barbly -p 60 ./scripts/github_issues.sh nixos nixpkgs

![Example Menu](./doc/demo.png)

Clicking on an item will open the issue in your browser.

## Syntax

Barbly can decode either JSON objects or BitBar syntax for the script outputs.
By default, it will attempt to auto-detect the format, but you can explicitly
tell it which format to use with the `--json` and `--bitbar` flags.

### JSON

The top level object has two fields, `title`, which is a string that will
be displayed in the status bar, and `items` which is an array of menu items
that will be displayed in the drop down menu when the title is clicked.

Each menu item is either `{}`, which creates a menu separator, or an object
with a `label` field, which will be the text for that menu item. Optionally
a menu item can have either an `exec` or a `items` field. An `items` field
would contain an array of menu items and would create a sub-menu. An `exec`
field would create a clickable menu item which executes the command described
by the array of strings in the `exec` field.

```json
{
  "title": "Example",
  "items": [
    {
      "label": "Say Hello",
      "exec": [ "say", "Hello" ]
    },
    {},
    {
      "label": "Sub Menu",
      "items": [
        {
          "label": "DuckDuckGo",
          "exec": [ "open", "https://duckduckgo.com/" ]
        }
      ]
    },
    { "label": "Information Only" }
  ]
}
```

### BitBar

The bitbar simulation is not complete. Only the following features are supported.

The text that appears in the status bar is the output of the script up until a line
containing only `---`.

After this, each line represents an item in a drop down menu. Submenus can be nested
arbitrarily by prefixing the line with `--` (one pair for each level of nesting).

Each line can contain some paramters which appear after the first `|` as key value
pairs separated by an `=`.

| Paramter Name | Effect                                       | Example                        |
|---------------|----------------------------------------------|--------------------------------|
| `href`        | Open the given URL or file.                  | href=https://www.google.com    |
|               |                                              | href=/Applications/Firefox.app |
| `bash`        | Run the given bash script                    | bash=/my/script.bash           |
| `paramX`      | Arguments to pass to the bash script above   | bash=/script.sh param1=5 param2=example |

Menu separators can be created with lines containing only `---`.

See the scripts in the [scripts](./scripts) directory for some examples.