42 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			42 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;
 | |
| }
 | 
