# Contribution guidelines
## Development environment
### Prerequisites
- PHP 8.1+
- `make` , `awk` , `xargs`
- `entr` to watch for file changes
- `xdg-open` link handler to invoke browser
- `libgd` (`php-gd`, `phpX.Y-gd` ) for downsizing images
### Official repositories
- Codeberg: < https: // codeberg . org / gravel / sessioncommunities . online >
- Lokinet Gitea (mirror): < https: // lokilocker . com / gravel / sessioncommunities . online >
- GitHub (archive): < https: // github . com / mdPlusPlus / sessioncommunities . online >
- Lokinet Gitea (archive): < https: // lokilocker . com / SomeGuy / sessioncommunities . online >
### Structure
[`fetch-servers.php` ](php/fetch-servers.php ) queries available servers, and [`generate-html.php` ](php/generate-html.php> ) generates static HTML. Static HTML is generated from the [`sites` ](sites ) directory to the [`output` ](output ) directory, which additionally contains static assets. All contents of `sites` are invoked to produce a HTML page unless they are prefixed with a `+` sign.
### Development
Run at least once: `make fetch` to query servers. This takes around 15 seconds thanks to the coroutine implementation.
Run when developing: `make dev` to watch for changes & serve HTML locally in browser.
See [`Makefile` ](Makefile ) for more details.
Recommended:
- Add the [default include paths ](.phpenv ) (`.`, `php` ) to your PHP intellisense.
- Get [EditorConfig ](https://editorconfig.org/#pre-installed ) for your IDE if not pre-installed.
- Symlink the commit hooks provided in [`etc/hooks` ](etc/hooks/ ) to `.git/hooks/<hook>` to run a full test cycle when committing to main.
### Running your own copy
- point your webserver at the [`output` ](output/ ) folder
- edit [`sites/privacy.php` ](sites/privacy.php ) to correspond to your Privacy Policy
- install and enable systemd services from the [`etc/systemd` ](etc/systemd/ ) folder or an equivalent timer for periodic updates
## Code style guidelines
### General
**Indentation**: Tabs (4-wide)
**Filename separator**: Hyphen (`-`)
### PHP
**Identifier casing**: `snake_case` and `CONSTANT_CASE`
**Comments and documentation**: [PHPDoc ](https://en.wikipedia.org/wiki/PHPDoc )
**Whitespace**:
- The following exceptions apply to PHP expressions embedded within HTML:
- Flow control statements within HTML (`< ?php if ($condition): >`)
shall have zero indentation, akin to C macros or sh heredocs.
- Self-contained PHP `include` and variable shorthand statements
in multi-line HTML child node position shall be followed by an extra line:
```php
< body >
< div >
< ?php if ($bowl->has_food()): >
<?= $bowl->describe_food() ?>
< ?php else: >
< ?php include 'bowl-empty.php'; >
< ?php endif; >
< / div >
< / body >
```
**Other**:
- Strings shall be surrounded by single quotes `''`
where no variable expansion is taking place
### HTML & CSS
**Identifier casing**: `kebab-case` , legacy `snake_case`
**Comments and documentation**: PHP no-ops instead of HTML comments, if possible
### JavaScript
**Identifier casing**: `camelCase` and `CONSTANT_CASE` , occasional `snake_case` for references to DOM
**Comments and documentation**: [JSDoc ](https://jsdoc.app/ )