43 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			43 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|   | /*--------------------------------------------------------------------------------------------- | ||
|  |  *  Copyright (c) Microsoft Corporation. All rights reserved. | ||
|  |  *  Licensed under the MIT License. See License.txt in the project root for license information. | ||
|  |  *--------------------------------------------------------------------------------------------*/ | ||
|  | import { createScanner } from '../parser/htmlScanner'; | ||
|  | import { TokenType, DocumentHighlightKind } from '../htmlLanguageTypes'; | ||
|  | export function findDocumentHighlights(document, position, htmlDocument) { | ||
|  |     const offset = document.offsetAt(position); | ||
|  |     const node = htmlDocument.findNodeAt(offset); | ||
|  |     if (!node.tag) { | ||
|  |         return []; | ||
|  |     } | ||
|  |     const result = []; | ||
|  |     const startTagRange = getTagNameRange(TokenType.StartTag, document, node.start); | ||
|  |     const endTagRange = typeof node.endTagStart === 'number' && getTagNameRange(TokenType.EndTag, document, node.endTagStart); | ||
|  |     if (startTagRange && covers(startTagRange, position) || endTagRange && covers(endTagRange, position)) { | ||
|  |         if (startTagRange) { | ||
|  |             result.push({ kind: DocumentHighlightKind.Read, range: startTagRange }); | ||
|  |         } | ||
|  |         if (endTagRange) { | ||
|  |             result.push({ kind: DocumentHighlightKind.Read, range: endTagRange }); | ||
|  |         } | ||
|  |     } | ||
|  |     return result; | ||
|  | } | ||
|  | function isBeforeOrEqual(pos1, pos2) { | ||
|  |     return pos1.line < pos2.line || (pos1.line === pos2.line && pos1.character <= pos2.character); | ||
|  | } | ||
|  | function covers(range, position) { | ||
|  |     return isBeforeOrEqual(range.start, position) && isBeforeOrEqual(position, range.end); | ||
|  | } | ||
|  | function getTagNameRange(tokenType, document, startOffset) { | ||
|  |     const scanner = createScanner(document.getText(), startOffset); | ||
|  |     let token = scanner.scan(); | ||
|  |     while (token !== TokenType.EOS && token !== tokenType) { | ||
|  |         token = scanner.scan(); | ||
|  |     } | ||
|  |     if (token !== TokenType.EOS) { | ||
|  |         return { start: document.positionAt(scanner.getTokenOffset()), end: document.positionAt(scanner.getTokenEnd()) }; | ||
|  |     } | ||
|  |     return null; | ||
|  | } |