Skip to content

Commit 5c80e3c

Browse files
committedOct 25, 2023
fix: improve yaml folding
1 parent cf18975 commit 5c80e3c

File tree

2 files changed

+91
-1
lines changed

2 files changed

+91
-1
lines changed
 

‎src/mode/folding/yaml.js

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
"use strict";
2+
3+
var oop = require("../../lib/oop");
4+
var BaseFoldMode = require("./fold_mode").FoldMode;
5+
var Range = require("../../range").Range;
6+
7+
var FoldMode = exports.FoldMode = function() {};
8+
oop.inherits(FoldMode, BaseFoldMode);
9+
10+
(function() {
11+
this.getFoldWidgetRange = function(session, foldStyle, row) {
12+
var re = /\S/;
13+
var line = session.getLine(row);
14+
var startLevel = line.search(re);
15+
if (startLevel == -1)
16+
return;
17+
18+
var startColumn = line.length;
19+
var maxRow = session.getLength();
20+
var startRow = row;
21+
var endRow = row;
22+
23+
while (++row < maxRow) {
24+
line = session.getLine(row);
25+
var level = line.search(re);
26+
27+
if (level == -1 && row !== maxRow - 1) {
28+
endRow = row;
29+
break;
30+
}
31+
32+
if ((level == -1 && row !== maxRow - 1) || line[level] == "-" || level > startLevel)
33+
continue;
34+
35+
if (level <= startLevel) {
36+
var token = session.getTokenAt(row, 0);
37+
if (!token || token.type !== "string")
38+
break;
39+
}
40+
}
41+
42+
if (endRow > startRow) {
43+
var endColumn = session.getLine(endRow).length;
44+
return new Range(startRow, startColumn, endRow, endColumn);
45+
}
46+
};
47+
48+
// must return "" if there's no fold, to enable caching
49+
this.getFoldWidget = function(session, foldStyle, row) {
50+
var line = session.getLine(row);
51+
var indent = line.search(/[^\s]/);
52+
var next = session.getLine(row + 1);
53+
var prev = session.getLine(row - 1);
54+
var prevIndent = prev.search(/[^\s]/);
55+
var nextIndent = next.search(/[^\s]/);
56+
57+
var lineStartsWithDash = line.search(/^\-/) !== -1;
58+
59+
if (indent == -1) {
60+
session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : "";
61+
return "";
62+
}
63+
64+
// documentation comments
65+
if (prevIndent == -1) {
66+
if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") {
67+
session.foldWidgets[row - 1] = "";
68+
session.foldWidgets[row + 1] = "";
69+
return "start";
70+
}
71+
} else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") {
72+
if (session.getLine(row - 2).search(/[^\s]/) == -1) {
73+
session.foldWidgets[row - 1] = "start";
74+
session.foldWidgets[row + 1] = "";
75+
return "";
76+
}
77+
}
78+
79+
if (prevIndent!= -1 && (prevIndent < indent || lineStartsWithDash))
80+
session.foldWidgets[row - 1] = "start";
81+
else
82+
session.foldWidgets[row - 1] = "";
83+
84+
if (indent < nextIndent)
85+
return "start";
86+
else
87+
return "";
88+
};
89+
90+
}).call(FoldMode.prototype);

‎src/mode/yaml.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ var oop = require("../lib/oop");
44
var TextMode = require("./text").Mode;
55
var YamlHighlightRules = require("./yaml_highlight_rules").YamlHighlightRules;
66
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
7-
var FoldMode = require("./folding/coffee").FoldMode;
7+
var FoldMode = require("./folding/yaml").FoldMode;
88
var WorkerClient = require("../worker/worker_client").WorkerClient;
99

1010
var Mode = function() {

0 commit comments

Comments
 (0)
Please sign in to comment.