UNPKG

chrome-devtools-frontend

Version:
54 lines (49 loc) 2.04 kB
// 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}); }