// src/html.ts var highlightMarkHtml = { enter: { highlight() { this.tag(""); } }, exit: { highlight() { this.tag(""); } } }; // src/syntax.ts import { ok as assert } from "uvu/assert"; import { splice } from "micromark-util-chunked"; import { classifyCharacter } from "micromark-util-classify-character"; import { resolveAll } from "micromark-util-resolve-all"; import { codes, constants, types } from "micromark-util-symbol"; var HIGHLIGHT_SEQUENCE_TEMPORTARY = "highlightSequenceTemporary"; var HIGHLIGHT_SEQUENCE = "highlightSequence"; var HIGHLIGHT = "highlight"; var HIGHLIGHT_TEXT = "highlightText"; function highlightMark() { const tokenizer = { name: "highlight", tokenize: tokenizeHighlight, resolveAll: resolveAllHighlight }; return { text: { [codes.equalsTo]: tokenizer }, insideSpan: { null: [tokenizer] }, attentionMarkers: { null: [codes.equalsTo] } }; function resolveAllHighlight(events, context) { let index = -1; while (++index < events.length) { if (events[index][0] === "enter" && events[index][1].type === HIGHLIGHT_SEQUENCE_TEMPORTARY && events[index][1]._close) { let open = index; while (open--) { if (events[open][0] === "exit" && events[open][1].type === HIGHLIGHT_SEQUENCE_TEMPORTARY && events[open][1]._open && // If the sizes are the same: events[index][1].end.offset - events[index][1].start.offset === events[open][1].end.offset - events[open][1].start.offset) { events[index][1].type = HIGHLIGHT_SEQUENCE; events[open][1].type = HIGHLIGHT_SEQUENCE; const highlight = { type: HIGHLIGHT, start: Object.assign({}, events[open][1].start), end: Object.assign({}, events[index][1].end) }; const text = { type: HIGHLIGHT_TEXT, start: Object.assign({}, events[open][1].end), end: Object.assign({}, events[index][1].start) }; const nextEvents = [ ["enter", highlight, context], ["enter", events[open][1], context], ["exit", events[open][1], context], ["enter", text, context] ]; const insideSpan = context.parser.constructs.insideSpan.null; if (insideSpan) { splice( nextEvents, nextEvents.length, 0, resolveAll(insideSpan, events.slice(open + 1, index), context) ); } splice(nextEvents, nextEvents.length, 0, [ ["exit", text, context], ["enter", events[index][1], context], ["exit", events[index][1], context], ["exit", highlight, context] ]); splice(events, open - 1, index - open + 3, nextEvents); index = open + nextEvents.length - 2; break; } } } } index = -1; while (++index < events.length) { if (events[index][1].type === HIGHLIGHT_SEQUENCE_TEMPORTARY) { events[index][1].type = types.data; } } return events; } function tokenizeHighlight(effects, ok, nok) { const previous = this.previous; const events = this.events; let size = 0; return start; function start(code) { assert(code === codes.equalsTo, "expected `=`"); if (previous === codes.equalsTo && events[events.length - 1][1].type !== types.characterEscape) { return nok(code); } effects.enter(HIGHLIGHT_SEQUENCE_TEMPORTARY); return more(code); } function more(code) { const before = classifyCharacter(previous); if (code === codes.equalsTo) { if (size > 1) return nok(code); effects.consume(code); size++; return more; } if (size < 2) return nok(code); const token = effects.exit(HIGHLIGHT_SEQUENCE_TEMPORTARY); const after = classifyCharacter(code); token._open = !after || after === constants.attentionSideAfter && Boolean(before); token._close = !before || before === constants.attentionSideAfter && Boolean(after); return ok(code); } } } export { highlightMark, highlightMarkHtml };