From 7a5199292f55dfa1a8ea8830ea1a9d98be097161 Mon Sep 17 00:00:00 2001
From: Azat Alimov <32402726+mkslanc@users.noreply.github.com>
Date: Wed, 8 May 2024 15:15:46 +0400
Subject: [PATCH] fix: not determined folding widgets for html tags (#5548)
---
src/mode/folding/php.js | 32 +++++++++----------
src/mode/folding/php_test.js | 59 +++++++++++++++++++++++++++++++-----
src/mode/php.js | 15 +++++++--
3 files changed, 79 insertions(+), 27 deletions(-)
diff --git a/src/mode/folding/php.js b/src/mode/folding/php.js
index 0b20322fe3e..56b9bab317e 100644
--- a/src/mode/folding/php.js
+++ b/src/mode/folding/php.js
@@ -1,24 +1,20 @@
"use strict";
var oop = require("../../lib/oop");
-var MixedFoldMode = require("./mixed").FoldMode;
var CstyleFoldMode = require("./cstyle").FoldMode;
var Range = require("../../range").Range;
var TokenIterator = require("../../token_iterator").TokenIterator;
var FoldMode = exports.FoldMode = function () {
- this.cstyleFoldMode = new CstyleFoldMode();
- MixedFoldMode.call(this, this, {
- "js-": new CstyleFoldMode(),
- "css-": new CstyleFoldMode(),
- "php-": this
- });
};
-oop.inherits(FoldMode, MixedFoldMode);
+oop.inherits(FoldMode, CstyleFoldMode);
(function () {
+ this.getFoldWidgetRangeBase = this.getFoldWidgetRange;
+ this.getFoldWidgetBase = this.getFoldWidget;
+
this.indentKeywords = {
"if": 1,
"while": 1,
@@ -34,31 +30,31 @@ oop.inherits(FoldMode, MixedFoldMode);
"endswitch": -1
};
- this.foldingStartMarker = /(?:\s|^)(if|else|elseif|while|for|foreach|switch).*\:/i;
- this.foldingStopMarker = /(?:\s|^)(endif|endwhile|endfor|endforeach|endswitch)\;/i;
+ this.foldingStartMarkerPhp = /(?:\s|^)(if|else|elseif|while|for|foreach|switch).*\:/i;
+ this.foldingStopMarkerPhp = /(?:\s|^)(endif|endwhile|endfor|endforeach|endswitch)\;/i;
this.getFoldWidgetRange = function (session, foldStyle, row) {
var line = session.doc.getLine(row);
- var match = this.foldingStartMarker.exec(line);
+ var match = this.foldingStartMarkerPhp.exec(line);
if (match) {
return this.phpBlock(session, row, match.index + 2);
}
- var match = this.foldingStopMarker.exec(line);
+ var match = this.foldingStopMarkerPhp.exec(line);
if (match) {
return this.phpBlock(session, row, match.index + 2);
}
- return this.cstyleFoldMode.getFoldWidgetRange(session, foldStyle, row);
+ return this.getFoldWidgetRangeBase(session, foldStyle, row);
};
// must return "" if there's no fold, to enable caching
this.getFoldWidget = function (session, foldStyle, row) {
var line = session.getLine(row);
- var isStart = this.foldingStartMarker.test(line);
- var isEnd = this.foldingStopMarker.test(line);
+ var isStart = this.foldingStartMarkerPhp.test(line);
+ var isEnd = this.foldingStopMarkerPhp.test(line);
if (isStart && !isEnd) {
- var match = this.foldingStartMarker.exec(line);
+ var match = this.foldingStartMarkerPhp.exec(line);
var keyword = match && match[1].toLowerCase();
if (keyword) {
var type = session.getTokenAt(row, match.index + 2).type;
@@ -68,7 +64,7 @@ oop.inherits(FoldMode, MixedFoldMode);
}
}
if (isEnd && foldStyle === "markbeginend") {
- var match = this.foldingStopMarker.exec(line);
+ var match = this.foldingStopMarkerPhp.exec(line);
var keyword = match && match[1].toLowerCase();
if (keyword) {
var type = session.getTokenAt(row, match.index + 2).type;
@@ -77,7 +73,7 @@ oop.inherits(FoldMode, MixedFoldMode);
}
}
}
- return this.cstyleFoldMode.getFoldWidget(session, foldStyle, row);
+ return this.getFoldWidgetBase(session, foldStyle, row);
};
this.phpBlock = function (session, row, column, tokenRange) {
diff --git a/src/mode/folding/php_test.js b/src/mode/folding/php_test.js
index 84c1200f697..026c25edd79 100644
--- a/src/mode/folding/php_test.js
+++ b/src/mode/folding/php_test.js
@@ -13,13 +13,38 @@ module.exports = {
"test: php folding with alternative syntax": function () {
var session = new EditSession([
- ' 0):',
- ' echo "Number is positive";', ' else:',
- ' echo "Number is negative";', 'endif;', ' break;', ' default:',
- ' echo "Number is not zero";', ' }', 'foreach (array(1, 2, 3) as $num):',
- ' echo "Num: $num";', ' endforeach;', '}', '?>'
+ ' 0):',
+ ' echo "Number is positive";',
+ ' else:',
+ ' echo "Number is negative";',
+ 'endif;',
+ ' break;',
+ ' default:',
+ ' echo "Number is not zero";',
+ ' }', 'foreach (array(1, 2, 3) as $num):',
+ ' echo "Num: $num";',
+ ' endforeach;',
+ '}',
+ '?>',
+ '',
+ '',
+ ''
]);
session.setFoldStyle("markbeginend");
@@ -41,6 +66,18 @@ module.exports = {
assert.equal(session.getFoldWidget(17), "start");
assert.equal(session.getFoldWidget(19), "end");
assert.equal(session.getFoldWidget(20), "end");
+ assert.equal(session.getFoldWidget(21), "");
+ assert.equal(session.getFoldWidget(22), "");
+ assert.equal(session.getFoldWidget(23), "start");
+ assert.equal(session.getFoldWidget(24), "start");
+ assert.equal(session.getFoldWidget(25), "");
+ assert.equal(session.getFoldWidget(26), "end");
+ assert.equal(session.getFoldWidget(27), "end");
+ assert.equal(session.getFoldWidget(28), "start");
+ assert.equal(session.getFoldWidget(29), "start");
+ assert.equal(session.getFoldWidget(30), "");
+ assert.equal(session.getFoldWidget(31), "end");
+ assert.equal(session.getFoldWidget(32), "end");
assert.range(session.getFoldWidgetRange(2), 2, 1, 20, 0); // Range for the function's foldable section
assert.range(session.getFoldWidgetRange(3), 3, 21, 16, 7); // Range for the 'switch' statement
@@ -50,6 +87,14 @@ module.exports = {
assert.range(session.getFoldWidgetRange(12), 10, 16, 12, 0); // Range for the 'endif' line
assert.range(session.getFoldWidgetRange(17), 17, 33, 19, 3);
assert.range(session.getFoldWidgetRange(19), 17, 33, 19, 3);
+ assert.range(session.getFoldWidgetRange(23), 23, 8, 27, 0); // Range for script tag
+ assert.range(session.getFoldWidgetRange(24), 24, 21, 26, 4); // Range for cstyle { } block
+ assert.range(session.getFoldWidgetRange(26), 24, 21, 26, 4); // Range for closing cstyle { } block
+ assert.range(session.getFoldWidgetRange(27), 23, 8, 27, 0); // Range for closing script tag
+ assert.range(session.getFoldWidgetRange(28), 28, 7, 32, 0); // Range for openning style tag
+ assert.range(session.getFoldWidgetRange(29), 29, 9, 31, 4); // Range for cstyle { } block
+ assert.range(session.getFoldWidgetRange(31), 29, 9, 31, 4); // Range for closing cstyle { } block
+ assert.range(session.getFoldWidgetRange(32), 28, 7, 32, 0); // Range for closing style tag
}
};
diff --git a/src/mode/php.js b/src/mode/php.js
index b665067bb8d..04a6fd3eb3e 100644
--- a/src/mode/php.js
+++ b/src/mode/php.js
@@ -9,6 +9,9 @@ var WorkerClient = require("../worker/worker_client").WorkerClient;
var PhpCompletions = require("./php_completions").PhpCompletions;
var PhpFoldMode = require("./folding/php").FoldMode;
var unicode = require("../unicode");
+var MixedFoldMode = require("./folding/mixed").FoldMode;
+var HtmlFoldMode = require("./folding/html").FoldMode;
+var CstyleFoldMode = require("./folding/cstyle").FoldMode;
var HtmlMode = require("./html").Mode;
var JavaScriptMode = require("./javascript").Mode;
var CssMode = require("./css").Mode;
@@ -18,7 +21,11 @@ var PhpMode = function(opts) {
this.$outdent = new MatchingBraceOutdent();
this.$behaviour = this.$defaultBehaviour;
this.$completer = new PhpCompletions();
- this.foldingRules = new PhpFoldMode();
+ this.foldingRules = new MixedFoldMode(new HtmlFoldMode(), {
+ "js-": new CstyleFoldMode(),
+ "css-": new CstyleFoldMode(),
+ "php-": new PhpFoldMode()
+ });
};
oop.inherits(PhpMode, TextMode);
@@ -91,7 +98,11 @@ var Mode = function(opts) {
"css-": CssMode,
"php-": PhpMode
});
- this.foldingRules = new PhpFoldMode();
+ this.foldingRules = new MixedFoldMode(new HtmlFoldMode(), {
+ "js-": new CstyleFoldMode(),
+ "css-": new CstyleFoldMode(),
+ "php-": new PhpFoldMode()
+ });
};
oop.inherits(Mode, HtmlMode);