/**
 * @license
 * Copyright 2025 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import { cpLen, cpSlice } from './textUtils.js';
const HIGHLIGHT_REGEX = /(^\/[a-zA-Z0-9_-]+|@(?:\\ |[a-zA-Z0-9_./-])+)/g;
export function parseInputForHighlighting(text, lineIndex = 0) {
    if (!text) {
        return [{ text: '', type: 'default' }];
    }
    const tokens = [];
    const pushToken = (token) => {
        const previous = tokens[tokens.length - 1];
        if (previous && previous.type === token.type) {
            previous.text += token.text;
            return;
        }
        tokens.push(token);
    };
    let lastIndex = 0;
    let match;
    while ((match = HIGHLIGHT_REGEX.exec(text)) !== null) {
        const [fullMatch] = match;
        const matchIndex = match.index;
        // Add the text before the match as a default token
        if (matchIndex > lastIndex) {
            pushToken({
                text: text.slice(lastIndex, matchIndex),
                type: 'default',
            });
        }
        // Add the matched token
        const type = fullMatch.startsWith('/') ? 'command' : 'file';
        if (type === 'command' && lineIndex !== 0) {
            pushToken({
                text: fullMatch,
                type: 'default',
            });
        }
        else {
            pushToken({
                text: fullMatch,
                type,
            });
        }
        lastIndex = matchIndex + fullMatch.length;
    }
    // Add any remaining text after the last match
    if (lastIndex < text.length) {
        pushToken({
            text: text.slice(lastIndex),
            type: 'default',
        });
    }
    return tokens;
}
export function buildSegmentsForVisualSlice(tokens, sliceStart, sliceEnd) {
    if (sliceStart >= sliceEnd)
        return [];
    const segments = [];
    let tokenCpStart = 0;
    for (const token of tokens) {
        const tokenLen = cpLen(token.text);
        const tokenStart = tokenCpStart;
        const tokenEnd = tokenStart + tokenLen;
        const overlapStart = Math.max(tokenStart, sliceStart);
        const overlapEnd = Math.min(tokenEnd, sliceEnd);
        if (overlapStart < overlapEnd) {
            const sliceStartInToken = overlapStart - tokenStart;
            const sliceEndInToken = overlapEnd - tokenStart;
            const rawSlice = cpSlice(token.text, sliceStartInToken, sliceEndInToken);
            const last = segments[segments.length - 1];
            if (last && last.type === token.type) {
                last.text += rawSlice;
            }
            else {
                segments.push({ type: token.type, text: rawSlice });
            }
        }
        tokenCpStart += tokenLen;
    }
    return segments;
}
//# sourceMappingURL=highlight.js.map