https://github.com/mbolli/tempest-highlight-ron
RON (Readable Object Notation) syntax highlighting for tempest/highlight — parser-backed, role-aware highlighting of keys, values, numbers, literals & structure via the real RON parser (mbolli/php-ron).
https://github.com/mbolli/tempest-highlight-ron
code-highlighting php readable-object-notation ron syntax-highlighting tempest tempest-highlight
Last synced: about 18 hours ago
JSON representation
RON (Readable Object Notation) syntax highlighting for tempest/highlight — parser-backed, role-aware highlighting of keys, values, numbers, literals & structure via the real RON parser (mbolli/php-ron).
- Host: GitHub
- URL: https://github.com/mbolli/tempest-highlight-ron
- Owner: mbolli
- License: mit
- Created: 2026-06-15T10:51:32.000Z (about 1 month ago)
- Default Branch: main
- Last Pushed: 2026-06-15T11:17:48.000Z (about 1 month ago)
- Last Synced: 2026-06-15T13:04:28.061Z (about 1 month ago)
- Topics: code-highlighting, php, readable-object-notation, ron, syntax-highlighting, tempest, tempest-highlight
- Language: PHP
- Size: 9.77 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# tempest-highlight-ron
[](https://packagist.org/packages/mbolli/tempest-highlight-ron)
[](https://packagist.org/packages/mbolli/tempest-highlight-ron)
[](https://packagist.org/packages/mbolli/tempest-highlight-ron)
[](https://phpstan.org/)
[](LICENSE)
[RON (Readable Object Notation)](https://github.com/starfederation/ron) language support for
[tempest/highlight](https://github.com/tempestphp/highlight).
Unlike a regex grammar, this plugin tokenizes with the **real RON parser**
([mbolli/php-ron](https://github.com/mbolli/php-ron)), so highlighting is byte-exact and
context-aware: keys are distinguished from values even though RON has no `:`/`=` separator,
and repeated-quote strings (`''''' `, `""a "quoted" phrase""`) are spanned correctly.
## Installation
```bash
composer require mbolli/tempest-highlight-ron
```
## Usage
```php
use Tempest\Highlight\Highlighter;
use Mbolli\TempestHighlightRon\RonLanguage;
$highlighter = new Highlighter();
$highlighter->addLanguage(new RonLanguage());
echo $highlighter->parse($ron, 'ron');
```
Registering the language as `ron` also highlights fenced ` ```ron ` blocks in markdown
rendered through tempest/highlight.
## What gets highlighted
For example RON like:
```ron
users [
{id 100 name Ada roles [admin writer] active true}
]
settings {retry {max 3} tags [llm json]}
```
| RON construct | Role | tempest token | CSS class |
|-------------------------------------------------|-------------|---------------|----------------|
| `{` `}` `[` `]` | punctuation | `PROPERTY` | `hl-property` |
| object keys (bare/quoted, elided or braced) | key | `KEYWORD` | `hl-keyword` |
| string values (bare, quoted, repeated-quote) | string | `VALUE` | `hl-value` |
| numbers (`100`, `-12.5e+2`) | number | `NUMBER` | `hl-number` |
| `true` / `false` / `null` | literal | `LITERAL` | `hl-literal` |
Because classification comes from the parser, `'true'` (quoted) is a string, a key named
`true` is a key, and a bare `123` in key position stays a key — none are mis-coloured.
## How it works
`RonLanguage` adds five `Pattern`s on top of tempest's base language. Each delegates to
`Mbolli\Ron\Ron::tokenize()`, which returns role-aware source spans; the spans are handed to
tempest in `PREG_OFFSET_CAPTURE` shape. Tokenization is memoized per content string, so the
source is lexed once per parse regardless of how many patterns run. `Ron::tokenize()` is
lenient — malformed RON never throws, it just highlights as much as it can classify.
## License
MIT