blob: 5dd8a36e3c92d8da28d4d72ba25713aae029c1a7 [file] [log] [blame]
/**
* @license
* Copyright 2022 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
/**
* This file defines the API of syntax-worker, which is a web worker for syntax
* highlighting based on the HighlightJS library.
*
* Workers communicate via `postMessage(e)` and `onMessage(e)` where `e` is a
* MessageEvent.
*
* SyntaxWorker expects incoming messages to be of type
* `MessageEvent<SyntaxWorkerMessage>`. And outgoing messages will be of type
* `MessageEvent<SyntaxWorkerResult>`.
*/
/** Type of incoming messages for SyntaxWorker. */
export enum SyntaxWorkerMessageType {
INIT,
REQUEST,
}
/** Incoming message for SyntaxWorker. */
export interface SyntaxWorkerMessage {
type: SyntaxWorkerMessageType;
}
/**
* Requests the worker to import the HighlightJS lib from the given URL and
* initializes and configures it. Has to be called once before you can send
* a SyntaxWorkerRequest message.
*/
export interface SyntaxWorkerInit extends SyntaxWorkerMessage {
type: SyntaxWorkerMessageType.INIT;
url: string;
}
export function isInit(
x: SyntaxWorkerMessage | undefined
): x is SyntaxWorkerInit {
return !!x && x.type === SyntaxWorkerMessageType.INIT;
}
/**
* Requests the worker to highlight the given code. The worker must have been
* initialized before.
*/
export interface SyntaxWorkerRequest extends SyntaxWorkerMessage {
type: SyntaxWorkerMessageType.REQUEST;
language: string;
code: string;
}
export function isRequest(
x: SyntaxWorkerMessage | undefined
): x is SyntaxWorkerRequest {
return !!x && x.type === SyntaxWorkerMessageType.REQUEST;
}
/** Type of outgoing messages of SyntaxWorker. */
export interface SyntaxWorkerResult {
/** Unset or undefined means "success". */
error?: string;
/**
* Returned by SyntaxWorkerRequest calls. Every line gets its own array of
* ranges. `ranges[0]` are the ranges for line 1. Every line has an array,
* which may be empty. All ranges are guaranteed to be closed.
*/
ranges?: SyntaxLayerLine[];
}
/** Ranges for one line. */
export interface SyntaxLayerLine {
ranges: SyntaxLayerRange[];
}
/** Can be used for `length` in SyntaxLayerRange. */
export const UNCLOSED = -1;
/** Range of characters in a line to be syntax highlighted. */
export interface SyntaxLayerRange {
/** 0-based inclusive. */
start: number;
/** Can only be UNCLOSED during processing. */
length: number;
/** HighlightJS specific names, e.g. 'literal'. */
className: string;
}