@@ -11,21 +11,32 @@ import { flatten } from '../util/arrays';
1111
1212const rangeLimit = 5000 ;
1313
14+ const isStartRegion = ( t : string ) => / ^ \s * < ! - - \s * # ? r e g i o n \b .* - - > / . test ( t ) ;
15+ const isEndRegion = ( t : string ) => / ^ \s * < ! - - \s * # ? e n d r e g i o n \b .* - - > / . test ( t ) ;
16+
17+ const isRegionMarker = ( token : Token ) =>
18+ token . type === 'html_block' && ( isStartRegion ( token . content ) || isEndRegion ( token . content ) ) ;
19+
1420export default class MarkdownFoldingProvider implements vscode . FoldingRangeProvider {
1521
1622 constructor (
1723 private readonly engine : MarkdownEngine
1824 ) { }
1925
20- private async getRegions ( document : vscode . TextDocument ) : Promise < vscode . FoldingRange [ ] > {
21-
22- const isStartRegion = ( t : string ) => / ^ \s * < ! - - \s * # ? r e g i o n \b .* - - > / . test ( t ) ;
23- const isEndRegion = ( t : string ) => / ^ \s * < ! - - \s * # ? e n d r e g i o n \b .* - - > / . test ( t ) ;
24-
25- const isRegionMarker = ( token : Token ) => token . type === 'html_block' &&
26- ( isStartRegion ( token . content ) || isEndRegion ( token . content ) ) ;
27-
26+ public async provideFoldingRanges (
27+ document : vscode . TextDocument ,
28+ _ : vscode . FoldingContext ,
29+ _token : vscode . CancellationToken
30+ ) : Promise < vscode . FoldingRange [ ] > {
31+ const foldables = await Promise . all ( [
32+ this . getRegions ( document ) ,
33+ this . getHeaderFoldingRanges ( document ) ,
34+ this . getBlockFoldingRanges ( document )
35+ ] ) ;
36+ return flatten ( foldables ) . slice ( 0 , rangeLimit ) ;
37+ }
2838
39+ private async getRegions ( document : vscode . TextDocument ) : Promise < vscode . FoldingRange [ ] > {
2940 const tokens = await this . engine . parse ( document ) ;
3041 const regionMarkers = tokens . filter ( isRegionMarker )
3142 . map ( token => ( { line : token . map [ 0 ] , isStart : isStartRegion ( token . content ) } ) ) ;
@@ -45,18 +56,6 @@ export default class MarkdownFoldingProvider implements vscode.FoldingRangeProvi
4556 . filter ( ( region : vscode . FoldingRange | null ) : region is vscode . FoldingRange => ! ! region ) ;
4657 }
4758
48- public async provideFoldingRanges (
49- document : vscode . TextDocument ,
50- _ : vscode . FoldingContext ,
51- _token : vscode . CancellationToken
52- ) : Promise < vscode . FoldingRange [ ] > {
53- const foldables = await Promise . all ( [
54- this . getRegions ( document ) ,
55- this . getHeaderFoldingRanges ( document ) ,
56- this . getBlockFoldingRanges ( document ) ] ) ;
57- return flatten ( foldables ) . slice ( 0 , rangeLimit ) ;
58- }
59-
6059 private async getHeaderFoldingRanges ( document : vscode . TextDocument ) {
6160 const tocProvider = new TableOfContentsProvider ( this . engine , document ) ;
6261 const toc = await tocProvider . getToc ( ) ;
@@ -71,7 +70,7 @@ export default class MarkdownFoldingProvider implements vscode.FoldingRangeProvi
7170
7271 private async getBlockFoldingRanges ( document : vscode . TextDocument ) : Promise < vscode . FoldingRange [ ] > {
7372
74- const isFoldableToken = ( token : Token ) => {
73+ const isFoldableToken = ( token : Token ) : boolean => {
7574 switch ( token . type ) {
7675 case 'fence' :
7776 case 'list_item_open' :
0 commit comments