33 * Licensed under the MIT License. See License.txt in the project root for license information.
44 *--------------------------------------------------------------------------------------------*/
55'use strict' ;
6- import { TextDocument , CancellationToken , Position } from 'vscode-languageserver' ;
7- import { LanguageService as HTMLLanguageService , TokenType , Range } from 'vscode-html-languageservice' ;
8-
9- import { FoldingRangeType , FoldingRange , FoldingRangeList } from 'vscode-languageserver-protocol-foldingprovider' ;
6+ import { TextDocument , CancellationToken , Position , Range } from 'vscode-languageserver' ;
7+ import { FoldingRange , FoldingRangeList } from 'vscode-languageserver-protocol-foldingprovider' ;
108import { LanguageModes } from './languageModes' ;
11- import { binarySearch } from '../utils/arrays' ;
129
13- export function getFoldingRegions ( languageModes : LanguageModes , document : TextDocument , maxRanges : number | undefined , cancellationToken : CancellationToken | null ) : FoldingRangeList {
10+ export function getFoldingRanges ( languageModes : LanguageModes , document : TextDocument , maxRanges : number | undefined , cancellationToken : CancellationToken | null ) : FoldingRangeList {
1411 let htmlMode = languageModes . getMode ( 'html' ) ;
1512 let range = Range . create ( Position . create ( 0 , 0 ) , Position . create ( document . lineCount , 0 ) ) ;
1613 let ranges : FoldingRange [ ] = [ ] ;
@@ -92,94 +89,3 @@ function limitRanges(ranges: FoldingRange[], maxRanges: number) {
9289 }
9390 return ranges . filter ( ( r , index ) => ( typeof nestingLevels [ index ] === 'number' ) && nestingLevels [ index ] < maxLevel ) ;
9491}
95-
96- export const EMPTY_ELEMENTS : string [ ] = [ 'area' , 'base' , 'br' , 'col' , 'embed' , 'hr' , 'img' , 'input' , 'keygen' , 'link' , 'menuitem' , 'meta' , 'param' , 'source' , 'track' , 'wbr' ] ;
97-
98- export function isEmptyElement ( e : string ) : boolean {
99- return ! ! e && binarySearch ( EMPTY_ELEMENTS , e . toLowerCase ( ) , ( s1 : string , s2 : string ) => s1 . localeCompare ( s2 ) ) >= 0 ;
100- }
101-
102- export function getHTMLFoldingRegions ( htmlLanguageService : HTMLLanguageService , document : TextDocument , range : Range ) : FoldingRange [ ] {
103- const scanner = htmlLanguageService . createScanner ( document . getText ( ) ) ;
104- let token = scanner . scan ( ) ;
105- let ranges : FoldingRange [ ] = [ ] ;
106- let stack : { startLine : number , tagName : string } [ ] = [ ] ;
107- let lastTagName = null ;
108- let prevStart = - 1 ;
109-
110- function addRange ( range : FoldingRange ) {
111- ranges . push ( range ) ;
112- prevStart = range . startLine ;
113- }
114-
115- while ( token !== TokenType . EOS ) {
116- switch ( token ) {
117- case TokenType . StartTag : {
118- let tagName = scanner . getTokenText ( ) ;
119- let startLine = document . positionAt ( scanner . getTokenOffset ( ) ) . line ;
120- stack . push ( { startLine, tagName } ) ;
121- lastTagName = tagName ;
122- break ;
123- }
124- case TokenType . EndTag : {
125- lastTagName = scanner . getTokenText ( ) ;
126- break ;
127- }
128- case TokenType . StartTagClose :
129- if ( ! lastTagName || ! isEmptyElement ( lastTagName ) ) {
130- break ;
131- }
132- // fallthrough
133- case TokenType . EndTagClose :
134- case TokenType . StartTagSelfClose : {
135- let i = stack . length - 1 ;
136- while ( i >= 0 && stack [ i ] . tagName !== lastTagName ) {
137- i -- ;
138- }
139- if ( i >= 0 ) {
140- let stackElement = stack [ i ] ;
141- stack . length = i ;
142- let line = document . positionAt ( scanner . getTokenOffset ( ) ) . line ;
143- let startLine = stackElement . startLine ;
144- let endLine = line - 1 ;
145- if ( endLine > startLine && prevStart !== startLine ) {
146- addRange ( { startLine, endLine } ) ;
147- }
148- }
149- break ;
150- }
151- case TokenType . Comment : {
152- let startLine = document . positionAt ( scanner . getTokenOffset ( ) ) . line ;
153- let text = scanner . getTokenText ( ) ;
154- let m = text . match ( / ^ \s * # ( r e g i o n \b ) | ( e n d r e g i o n \b ) / ) ;
155- if ( m ) {
156- if ( m [ 1 ] ) { // start pattern match
157- stack . push ( { startLine, tagName : '' } ) ; // empty tagName marks region
158- } else {
159- let i = stack . length - 1 ;
160- while ( i >= 0 && stack [ i ] . tagName . length ) {
161- i -- ;
162- }
163- if ( i >= 0 ) {
164- let stackElement = stack [ i ] ;
165- stack . length = i ;
166- let endLine = startLine ;
167- startLine = stackElement . startLine ;
168- if ( endLine > startLine && prevStart !== startLine ) {
169- addRange ( { startLine, endLine, type : FoldingRangeType . Region } ) ;
170- }
171- }
172- }
173- } else {
174- let endLine = document . positionAt ( scanner . getTokenOffset ( ) + scanner . getTokenLength ( ) ) . line ;
175- if ( startLine < endLine ) {
176- addRange ( { startLine, endLine, type : FoldingRangeType . Comment } ) ;
177- }
178- }
179- break ;
180- }
181- }
182- token = scanner . scan ( ) ;
183- }
184- return ranges ;
185- }
0 commit comments