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);