| import type { Projection } from "./markdown-stream" |
|
|
| export type MarkdownToken = [content: string, style: string] |
|
|
| export type MarkdownWorkerRequest = |
| | { type: "parse"; id: number; text: string } |
| | { type: "project"; id: number; key: string; text: string; live: boolean } |
| | { type: "highlight"; id: number; key: string; text: string; language: string; complete?: boolean } |
| | { type: "dispose"; key: string } |
|
|
| export type MarkdownWorkerResponse = |
| | { type: "parse"; id: number; html: string } |
| | { type: "project"; id: number; key: string; projection: Projection } |
| | { |
| type: "highlight" |
| id: number |
| key: string |
| language: string |
| reset: boolean |
| stable: MarkdownToken[] |
| unstable: MarkdownToken[] |
| } |
| | { type: "error"; id: number; key?: string; message: string } |
| | { type: "superseded"; id: number; key: string } |
|
|
| export type MarkdownWorkerState = { |
| id: number |
| generation: number |
| language: string |
| stable: MarkdownToken[] |
| unstable: MarkdownToken[] |
| } |
|
|
| export function shouldReleaseMarkdownWorkerState(complete: boolean, latestID: number | undefined, responseID: number) { |
| return complete && latestID === responseID |
| } |
|
|
| export function markdownBlockKey(owner: string, cacheKey: string | undefined, index: number, mode: string) { |
| return `${owner}:${cacheKey ? `${cacheKey}:${index}:${mode}` : `block:${index}`}` |
| } |
|
|
| export function applyMarkdownWorkerResponse( |
| state: MarkdownWorkerState | undefined, |
| response: Extract<MarkdownWorkerResponse, { type: "highlight" }>, |
| ) { |
| if (state && response.id <= state.id) return state |
| return { |
| id: response.id, |
| generation: (state?.generation ?? 0) + (response.reset ? 1 : 0), |
| language: response.language, |
| stable: response.reset ? response.stable : [...(state?.stable ?? []), ...response.stable], |
| unstable: response.unstable, |
| } |
| } |
|
|