1
0
Fork 0
forked from Haldis/menus
menus/README.md

126 lines
4.1 KiB
Markdown

# HLDS data format
HLDS is the Haldis Language for Describing Servings. It defines the menu you see when ordering in
Haldis.
There is syntax highlighting support for editors in [`etc/` in the Haldis
repository](https://git.zeus.gent/haldis/haldis/-/tree/master/etc). For VSCode there is a plug-in
in the standard repository.
## Tabs and spaces
Indentation at the beginning of the line requires hard **tabs** (spaces will not work).
For alignment (putting things in the same column between lines) **spaces** are required (tabs will
not work). Example (`↦` for tab and `·` for space):
```
dish·fries:·Frietjes
↦ single_choice·size:·Formaat
↦ ↦ extra_small:·Extra small··€·1.8
↦ ↦ small:·······Small········€·2
↦ ↦ medium:······Medium·······€·2.5
↦ ↦ large:·······Large········€·3.3
```
## Identifiers
You must choose an identifier for each location, dish, choice, option and tag. Identifiers may
consist of numbers, hyphens, underscores and lowercase letters of the alphabet (a through z).
* Allowed: `0-my_identifier`
* Disallowed: ~~`0 My Identifié`~~
## Locations
A HLDS file consists of one or more locations. Each location starts with a header, which is enclosed
in "fences" of at least three equal signs. The first line of the header contains the ID and name of
the location. Further lines contain the metadata of the location, such as the phone number and
OpenStreetMap element. In the future, the phone number and such will be fetched from OpenStreetMap.
```hlds
==========================
ocean_garden: Ocean Garden
osm https://www.openstreetmap.org/node/2275105003
phone +32 9 222 72 74
address Zwijnaardsesteenweg 399, 9000 Gent
website http://oceangarden.byethost3.com/
# Comments are allowed too!
==========================
```
## Dishes
A location consists of dishes. Spaces can be used to align the elements of your dish (but that's
not required).
```hlds
dish cheeseburger: Cheeseburger € 2.9
dish assortment: Twijfelaar € 3
```
## Inline choices
Dishes can contain choices. There are two types:
* `single_choice` is a required choice where the user must choose one option.
* `multi_choice` is an optional choice where the user can choose zero or more options.
```hlds
dish fries: Frietjes
single_choice size: Formaat
extra_small: Extra small € 1.8
small: Small € 2
medium: Medium € 2.5
large: Large € 3.3
multi_choice sauce: Saus
ketchup: Ketchup € 1.4
mayo: Mayonaise € 1.4
bicky: Bickysaus € 1.4
stew: Stoofvleessaus € 1.9
```
## Common choices
Choices that are used more than once, can be declared once and referenced in multiple dishes.
```hlds
bami_nasi: Bami of nasi
bami: Bami
nasi: Nasi
dish wok3: Studentenwok 3 kip bami/nasi zonder saus € 6
single_choice bami_nasi
dish wok5: Studentenwok 5 babi pangang € 6
single_choice bami_nasi
```
## Descriptions
You can add descriptions to dishes, choices and options. Separate name and description with ` -- `.
```hlds
dish dishid: Name -- This is a description € 3
```
## Tags and price
**Note:** Only the `{no_text}` tag is supported at this moment. You can ignore other tags for now.
The tag and price part starts with at least two spaces: ` `.
Tags are `{identifier}`. You can use tags to attach more information about a dish or option in a
structured way. For example: `{has_meat}` signals to vegetarians that they should avoid this.
The order is always id, name, description, ` `, tags, price (not all have to be present of course).
```hlds
dish dishid: Name -- This is a description {has_meat} € 3
```
The special `{no_text}` tag signals that an option is to be hidden when showing a dish in an
order's list of dishes. This is useful for choices that have an implicit default that need not be
read by the person making the order.
```hlds
veggie: Vegetarische opties
meat: Niet vegetarisch {has_meat} {no_text}
tofu: Vegetarisch met tofu
falafel: Vegetarisch met falafel
vegan: Veganistisch
```