@tanstack/highlight
Version:
Tiny class-based syntax highlighting for documentation.
79 lines (56 loc) • 2.78 kB
Markdown
# Tokenizer Contracts and Patterns
## Public Types
```ts
type TokenRange = {
className: HighlightTokenClass
end: number
start: number
}
type TokenizerContext = {
hasLanguage: (lang: string) => boolean
tokenize: (code: string, lang: string) => Array<TokenRange>
}
type LanguageDefinition<Name extends string = string> = {
aliases?: ReadonlyArray<string>
name: Name
tokenize: (
code: string,
context: TokenizerContext,
) => ReadonlyArray<TokenRange>
}
```
`defineLanguage()` is an identity helper that preserves the literal `name` type.
## Range Normalization
The core:
1. Clamps each start and end into the source bounds.
2. Sorts candidates by `start`.
3. Drops empty ranges.
4. Drops a range when its start is before the previously accepted end.
5. Preserves gaps as unclassified source tokens.
Return non-overlapping ranges. Input order only remains relevant for equal starts under the runtime's stable sort; it does not make a later-start specific range override an earlier broad range.
## Shipped-Language Helpers
Repository-owned language definitions can use `src/internal/patterns.ts`:
- `patternTokenizer(patterns)` creates a tokenizer from collectors and regex patterns.
- `collectPatternRanges(code, patterns, initial)` applies patterns in priority order using an occupied-byte map.
- `addRange(ranges, occupied, range)` rejects invalid or overlapping ranges.
- `offsetRanges(ranges, offset)` maps delegated ranges into outer source coordinates.
These helpers are internal and are not package exports. Application-defined languages should implement their own small non-overlapping scanner.
## Delegation
- Call `context.hasLanguage(name)` before delegation.
- Call `context.tokenize(substring, name)` only for a registered target.
- Offset every delegated range into outer coordinates.
- Do not import target language definitions from an outer definition.
- Recursion stops after 24 nested tokenizer calls.
## Semantic Token Classes
Definitions can emit:
`attr`, `code-inline`, `command`, `comment`, `deleted`, `function`, `heading`, `inserted`, `keyword`, `link`, `literal`, `meta`, `number`, `operator`, `property`, `selector`, `string`, `tag`, `type`, and `variable`.
## Repository Quality Gates
For a shipped definition:
1. Add an isolated `src/languages/<name>.ts` module.
2. Add its explicit package export through the existing wildcard.
3. Add common valid-code fixtures.
4. Assert token concatenation reconstructs source exactly.
5. Add focused regressions for context-aware scanning.
6. Include it in the all-language registry only when intended.
7. Run `pnpm run test`, `pnpm run size`, and `pnpm run bench`.
The target is useful highlighting for valid documentation code, not compiler or IDE grammar conformance.