Skip to content

Commit 7a51992

Browse files
authored
fix: not determined folding widgets for html tags (#5548)
1 parent 7591120 commit 7a51992

File tree

3 files changed

+79
-27
lines changed

3 files changed

+79
-27
lines changed

src/mode/folding/php.js

+14-18
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,20 @@
11
"use strict";
22

33
var oop = require("../../lib/oop");
4-
var MixedFoldMode = require("./mixed").FoldMode;
54
var CstyleFoldMode = require("./cstyle").FoldMode;
65
var Range = require("../../range").Range;
76
var TokenIterator = require("../../token_iterator").TokenIterator;
87

98

109
var FoldMode = exports.FoldMode = function () {
11-
this.cstyleFoldMode = new CstyleFoldMode();
12-
MixedFoldMode.call(this, this, {
13-
"js-": new CstyleFoldMode(),
14-
"css-": new CstyleFoldMode(),
15-
"php-": this
16-
});
1710
};
1811

19-
oop.inherits(FoldMode, MixedFoldMode);
12+
oop.inherits(FoldMode, CstyleFoldMode);
2013

2114
(function () {
15+
this.getFoldWidgetRangeBase = this.getFoldWidgetRange;
16+
this.getFoldWidgetBase = this.getFoldWidget;
17+
2218
this.indentKeywords = {
2319
"if": 1,
2420
"while": 1,
@@ -34,31 +30,31 @@ oop.inherits(FoldMode, MixedFoldMode);
3430
"endswitch": -1
3531
};
3632

37-
this.foldingStartMarker = /(?:\s|^)(if|else|elseif|while|for|foreach|switch).*\:/i;
38-
this.foldingStopMarker = /(?:\s|^)(endif|endwhile|endfor|endforeach|endswitch)\;/i;
33+
this.foldingStartMarkerPhp = /(?:\s|^)(if|else|elseif|while|for|foreach|switch).*\:/i;
34+
this.foldingStopMarkerPhp = /(?:\s|^)(endif|endwhile|endfor|endforeach|endswitch)\;/i;
3935

4036
this.getFoldWidgetRange = function (session, foldStyle, row) {
4137
var line = session.doc.getLine(row);
42-
var match = this.foldingStartMarker.exec(line);
38+
var match = this.foldingStartMarkerPhp.exec(line);
4339
if (match) {
4440
return this.phpBlock(session, row, match.index + 2);
4541
}
4642

47-
var match = this.foldingStopMarker.exec(line);
43+
var match = this.foldingStopMarkerPhp.exec(line);
4844
if (match) {
4945
return this.phpBlock(session, row, match.index + 2);
5046
}
51-
return this.cstyleFoldMode.getFoldWidgetRange(session, foldStyle, row);
47+
return this.getFoldWidgetRangeBase(session, foldStyle, row);
5248
};
5349

5450

5551
// must return "" if there's no fold, to enable caching
5652
this.getFoldWidget = function (session, foldStyle, row) {
5753
var line = session.getLine(row);
58-
var isStart = this.foldingStartMarker.test(line);
59-
var isEnd = this.foldingStopMarker.test(line);
54+
var isStart = this.foldingStartMarkerPhp.test(line);
55+
var isEnd = this.foldingStopMarkerPhp.test(line);
6056
if (isStart && !isEnd) {
61-
var match = this.foldingStartMarker.exec(line);
57+
var match = this.foldingStartMarkerPhp.exec(line);
6258
var keyword = match && match[1].toLowerCase();
6359
if (keyword) {
6460
var type = session.getTokenAt(row, match.index + 2).type;
@@ -68,7 +64,7 @@ oop.inherits(FoldMode, MixedFoldMode);
6864
}
6965
}
7066
if (isEnd && foldStyle === "markbeginend") {
71-
var match = this.foldingStopMarker.exec(line);
67+
var match = this.foldingStopMarkerPhp.exec(line);
7268
var keyword = match && match[1].toLowerCase();
7369
if (keyword) {
7470
var type = session.getTokenAt(row, match.index + 2).type;
@@ -77,7 +73,7 @@ oop.inherits(FoldMode, MixedFoldMode);
7773
}
7874
}
7975
}
80-
return this.cstyleFoldMode.getFoldWidget(session, foldStyle, row);
76+
return this.getFoldWidgetBase(session, foldStyle, row);
8177
};
8278

8379
this.phpBlock = function (session, row, column, tokenRange) {

src/mode/folding/php_test.js

+52-7
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,38 @@ module.exports = {
1313

1414
"test: php folding with alternative syntax": function () {
1515
var session = new EditSession([
16-
'<?php', 'function checkNumber($number)', '{', ' switch ($number) {', ' case 0:',
17-
' echo "Number is zero again";', ' if ($number == 0):',
18-
' echo "Number is zero";', ' elseif ($number > 0):',
19-
' echo "Number is positive";', ' else:',
20-
' echo "Number is negative";', 'endif;', ' break;', ' default:',
21-
' echo "Number is not zero";', ' }', 'foreach (array(1, 2, 3) as $num):',
22-
' echo "Num: $num";', ' endforeach;', '}', '?>'
16+
'<?php',
17+
'function checkNumber($number)',
18+
'{',
19+
' switch ($number) {',
20+
' case 0:',
21+
' echo "Number is zero again";',
22+
' if ($number == 0):',
23+
' echo "Number is zero";',
24+
' elseif ($number > 0):',
25+
' echo "Number is positive";',
26+
' else:',
27+
' echo "Number is negative";',
28+
'endif;',
29+
' break;',
30+
' default:',
31+
' echo "Number is not zero";',
32+
' }', 'foreach (array(1, 2, 3) as $num):',
33+
' echo "Num: $num";',
34+
' endforeach;',
35+
'}',
36+
'?>',
37+
'',
38+
'<script>',
39+
' function test() {',
40+
' ',
41+
' }',
42+
'</script>',
43+
'<style>',
44+
' div {',
45+
' color: red;',
46+
' }',
47+
'</style>'
2348
]);
2449

2550
session.setFoldStyle("markbeginend");
@@ -41,6 +66,18 @@ module.exports = {
4166
assert.equal(session.getFoldWidget(17), "start");
4267
assert.equal(session.getFoldWidget(19), "end");
4368
assert.equal(session.getFoldWidget(20), "end");
69+
assert.equal(session.getFoldWidget(21), "");
70+
assert.equal(session.getFoldWidget(22), "");
71+
assert.equal(session.getFoldWidget(23), "start");
72+
assert.equal(session.getFoldWidget(24), "start");
73+
assert.equal(session.getFoldWidget(25), "");
74+
assert.equal(session.getFoldWidget(26), "end");
75+
assert.equal(session.getFoldWidget(27), "end");
76+
assert.equal(session.getFoldWidget(28), "start");
77+
assert.equal(session.getFoldWidget(29), "start");
78+
assert.equal(session.getFoldWidget(30), "");
79+
assert.equal(session.getFoldWidget(31), "end");
80+
assert.equal(session.getFoldWidget(32), "end");
4481

4582
assert.range(session.getFoldWidgetRange(2), 2, 1, 20, 0); // Range for the function's foldable section
4683
assert.range(session.getFoldWidgetRange(3), 3, 21, 16, 7); // Range for the 'switch' statement
@@ -50,6 +87,14 @@ module.exports = {
5087
assert.range(session.getFoldWidgetRange(12), 10, 16, 12, 0); // Range for the 'endif' line
5188
assert.range(session.getFoldWidgetRange(17), 17, 33, 19, 3);
5289
assert.range(session.getFoldWidgetRange(19), 17, 33, 19, 3);
90+
assert.range(session.getFoldWidgetRange(23), 23, 8, 27, 0); // Range for script tag
91+
assert.range(session.getFoldWidgetRange(24), 24, 21, 26, 4); // Range for cstyle { } block
92+
assert.range(session.getFoldWidgetRange(26), 24, 21, 26, 4); // Range for closing cstyle { } block
93+
assert.range(session.getFoldWidgetRange(27), 23, 8, 27, 0); // Range for closing script tag
94+
assert.range(session.getFoldWidgetRange(28), 28, 7, 32, 0); // Range for openning style tag
95+
assert.range(session.getFoldWidgetRange(29), 29, 9, 31, 4); // Range for cstyle { } block
96+
assert.range(session.getFoldWidgetRange(31), 29, 9, 31, 4); // Range for closing cstyle { } block
97+
assert.range(session.getFoldWidgetRange(32), 28, 7, 32, 0); // Range for closing style tag
5398
}
5499
};
55100

src/mode/php.js

+13-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ var WorkerClient = require("../worker/worker_client").WorkerClient;
99
var PhpCompletions = require("./php_completions").PhpCompletions;
1010
var PhpFoldMode = require("./folding/php").FoldMode;
1111
var unicode = require("../unicode");
12+
var MixedFoldMode = require("./folding/mixed").FoldMode;
13+
var HtmlFoldMode = require("./folding/html").FoldMode;
14+
var CstyleFoldMode = require("./folding/cstyle").FoldMode;
1215
var HtmlMode = require("./html").Mode;
1316
var JavaScriptMode = require("./javascript").Mode;
1417
var CssMode = require("./css").Mode;
@@ -18,7 +21,11 @@ var PhpMode = function(opts) {
1821
this.$outdent = new MatchingBraceOutdent();
1922
this.$behaviour = this.$defaultBehaviour;
2023
this.$completer = new PhpCompletions();
21-
this.foldingRules = new PhpFoldMode();
24+
this.foldingRules = new MixedFoldMode(new HtmlFoldMode(), {
25+
"js-": new CstyleFoldMode(),
26+
"css-": new CstyleFoldMode(),
27+
"php-": new PhpFoldMode()
28+
});
2229
};
2330
oop.inherits(PhpMode, TextMode);
2431

@@ -91,7 +98,11 @@ var Mode = function(opts) {
9198
"css-": CssMode,
9299
"php-": PhpMode
93100
});
94-
this.foldingRules = new PhpFoldMode();
101+
this.foldingRules = new MixedFoldMode(new HtmlFoldMode(), {
102+
"js-": new CstyleFoldMode(),
103+
"css-": new CstyleFoldMode(),
104+
"php-": new PhpFoldMode()
105+
});
95106
};
96107
oop.inherits(Mode, HtmlMode);
97108

0 commit comments

Comments
 (0)