chrome-devtools-frontend
Version:
Chrome DevTools UI
54 lines (49 loc) • 2.04 kB
text/typescript
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import * as Platform from '../../core/platform/platform.js';
import * as TextUtils from '../../models/text_utils/text_utils.js';
import {javaScriptOutline} from './JavaScriptOutline.js';
export interface Item {
title: string;
subtitle?: string;
line: number;
column: number;
}
export function htmlOutline(content: string, chunkCallback: (arg0: {
chunk: Array<Item>,
isLastChunk: boolean,
}) => void): void {
const SCRIPT_OPENING_TAG = /<script[^>]*>/im;
const SCRIPT_CLOSING_TAG = /<\/script\s*>/im;
const textCursor = new TextUtils.TextCursor.TextCursor(Platform.StringUtilities.findLineEndingIndexes(content));
while (true) {
// Look for the opening <script> tag.
const openingMatch = SCRIPT_OPENING_TAG.exec(content.substring(textCursor.offset()));
if (!openingMatch) {
break;
}
const scriptStart = textCursor.offset() + openingMatch.index + openingMatch[0].length;
textCursor.advance(scriptStart);
const scriptLine = textCursor.lineNumber();
const scriptColumn = textCursor.columnNumber();
// Look for the closing </script> tag.
const closingMatch = SCRIPT_CLOSING_TAG.exec(content.substring(textCursor.offset()));
if (!closingMatch) {
break;
}
const scriptEnd = textCursor.offset() + closingMatch.index;
textCursor.advance(scriptEnd + closingMatch[0].length);
const scriptContent = content.substring(scriptStart, scriptEnd);
javaScriptOutline(scriptContent, ({chunk}) => {
chunk.forEach(item => {
if (item.line === 0) {
item.column += scriptColumn;
}
item.line += scriptLine;
});
chunkCallback({chunk, isLastChunk: false});
});
}
chunkCallback({chunk: [], isLastChunk: true});
}