mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Add regex awareness to jsonata formatter
This commit is contained in:
parent
e16fe1e6a5
commit
79feb691bd
@ -11,6 +11,7 @@
|
|||||||
var length = str.length;
|
var length = str.length;
|
||||||
var start = 0;
|
var start = 0;
|
||||||
var inString = false;
|
var inString = false;
|
||||||
|
var inRegex = false;
|
||||||
var inBox = false;
|
var inBox = false;
|
||||||
var quoteChar;
|
var quoteChar;
|
||||||
var list = [];
|
var list = [];
|
||||||
@ -24,8 +25,13 @@
|
|||||||
}
|
}
|
||||||
for (var i=0;i<length;i++) {
|
for (var i=0;i<length;i++) {
|
||||||
var c = str[i];
|
var c = str[i];
|
||||||
if (!inString) {
|
if (!inString && !inRegex) {
|
||||||
if (c === "'" || c === '"') {
|
if (c === "/") {
|
||||||
|
inRegex = true;
|
||||||
|
frame = {type:"regex",pos:i};
|
||||||
|
list.push(frame);
|
||||||
|
stack.push(frame);
|
||||||
|
} else if (c === "'" || c === '"') {
|
||||||
inString = true;
|
inString = true;
|
||||||
quoteChar = c;
|
quoteChar = c;
|
||||||
frame = {type:"string",pos:i};
|
frame = {type:"string",pos:i};
|
||||||
@ -37,6 +43,9 @@
|
|||||||
} else if (c === ",") {
|
} else if (c === ",") {
|
||||||
frame = {type:",",pos:i};
|
frame = {type:",",pos:i};
|
||||||
list.push(frame);
|
list.push(frame);
|
||||||
|
} else if (c === "&") {
|
||||||
|
frame = {type:"&",pos:i};
|
||||||
|
list.push(frame);
|
||||||
} else if (/[\(\[\{]/.test(c)) {
|
} else if (/[\(\[\{]/.test(c)) {
|
||||||
frame = {type:"open-block",char:c,pos:i};
|
frame = {type:"open-block",char:c,pos:i};
|
||||||
list.push(frame);
|
list.push(frame);
|
||||||
@ -45,6 +54,7 @@
|
|||||||
var oldFrame = stack.pop();
|
var oldFrame = stack.pop();
|
||||||
if (matchingBrackets[oldFrame.char] !== c) {
|
if (matchingBrackets[oldFrame.char] !== c) {
|
||||||
// console.log("Stack frame mismatch",c,"at",i,"expected",matchingBrackets[oldFrame.char],"from",oldFrame.pos);
|
// console.log("Stack frame mismatch",c,"at",i,"expected",matchingBrackets[oldFrame.char],"from",oldFrame.pos);
|
||||||
|
// console.log(list);
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
//console.log("Closing",c,"at",i,"compare",oldFrame.type,oldFrame.pos);
|
//console.log("Closing",c,"at",i,"compare",oldFrame.type,oldFrame.pos);
|
||||||
@ -53,19 +63,32 @@
|
|||||||
list.push(frame);
|
list.push(frame);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if (c === "\\") {
|
||||||
|
// an escaped char - stay in current mode and skip the next char
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (inString) {
|
||||||
if (c === quoteChar) {
|
if (c === quoteChar) {
|
||||||
// Next char must be a ]
|
// Next char must be a ]
|
||||||
inString = false;
|
inString = false;
|
||||||
stack.pop();
|
var f = stack.pop();
|
||||||
|
f.end = i;
|
||||||
|
}
|
||||||
|
} else if (inRegex) {
|
||||||
|
if (c === "/") {
|
||||||
|
inRegex = false;
|
||||||
|
var f = stack.pop();
|
||||||
|
f.end = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
// console.log("list",list);
|
||||||
|
|
||||||
// console.log(stack);
|
|
||||||
var result = str;
|
var result = str;
|
||||||
var indent = 0;
|
var indent = 0;
|
||||||
var offset = 0;
|
var offset = 0;
|
||||||
var pre,post,indented;
|
var pre,post,indented,hasNewline;
|
||||||
var longStack = [];
|
var longStack = [];
|
||||||
list.forEach(function(f) {
|
list.forEach(function(f) {
|
||||||
if (f.type === ";" || f.type === ",") {
|
if (f.type === ";" || f.type === ",") {
|
||||||
@ -73,30 +96,52 @@
|
|||||||
pre = result.substring(0,offset+f.pos+1);
|
pre = result.substring(0,offset+f.pos+1);
|
||||||
post = result.substring(offset+f.pos+1);
|
post = result.substring(offset+f.pos+1);
|
||||||
indented = indentLine(post,indent);
|
indented = indentLine(post,indent);
|
||||||
result = pre+"\n"+indented;
|
hasNewline = /\n$/.test(pre);
|
||||||
offset += indented.length-post.length+1;
|
// console.log("A§"+pre+"§\n§"+indented+"§",hasNewline);
|
||||||
|
result = pre+(hasNewline?"":"\n")+indented;
|
||||||
|
offset += indented.length-post.length+(hasNewline?0:1);
|
||||||
}
|
}
|
||||||
|
} else if (f.type === "&") {
|
||||||
|
pre = result.substring(0,offset+f.pos+1);
|
||||||
|
var lastLineBreak = pre.lastIndexOf("\n");
|
||||||
|
var lineLength = pre.length - lastLineBreak;
|
||||||
|
if (lineLength > 70) {
|
||||||
|
post = result.substring(offset+f.pos+1);
|
||||||
|
if (!/^\n/.test(post)) {
|
||||||
|
indented = indentLine(post,indent);
|
||||||
|
hasNewline = /\n$/.test(pre);
|
||||||
|
result = pre+(hasNewline?"":"\n")+indented;
|
||||||
|
offset += indented.length-post.length+(hasNewline?0:1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} else if (f.type === "open-block") {
|
} else if (f.type === "open-block") {
|
||||||
if (f.width > 30) {
|
if (f.width > 40) {
|
||||||
longStack.push(true);
|
longStack.push(true);
|
||||||
indent += 4;
|
indent += 4;
|
||||||
pre = result.substring(0,offset+f.pos+1);
|
pre = result.substring(0,offset+f.pos+1);
|
||||||
post = result.substring(offset+f.pos+1);
|
post = result.substring(offset+f.pos+1);
|
||||||
|
hasNewline = /\n$/.test(pre);
|
||||||
indented = indentLine(post,indent);
|
indented = indentLine(post,indent);
|
||||||
result = pre+(/\n$/.test(pre)?"":"\n")+indented;
|
result = pre+(hasNewline?"":"\n")+indented;
|
||||||
offset += indented.length-post.length+1;
|
offset += indented.length-post.length+(hasNewline?0:1);
|
||||||
} else {
|
} else {
|
||||||
longStack.push(false);
|
longStack.push(false);
|
||||||
}
|
}
|
||||||
} else if (f.type === "close-block") {
|
} else if (f.type === "close-block") {
|
||||||
if (f.width > 30) {
|
if (f.width > 40) {
|
||||||
indent -= 4;
|
indent -= 4;
|
||||||
pre = result.substring(0,offset+f.pos);
|
pre = result.substring(0,offset+f.pos);
|
||||||
post = result.substring(offset+f.pos);
|
post = result.substring(offset+f.pos);
|
||||||
indented = indentLine(post,indent);
|
indented = indentLine(post,indent);
|
||||||
result = pre+(/\n$/.test(pre)?"":"\n")+indented;
|
hasNewline = /\n *$/.test(pre);
|
||||||
|
if (hasNewline) {
|
||||||
|
result = pre + post;
|
||||||
|
} else {
|
||||||
|
result = pre+"\n"+indented;
|
||||||
offset += indented.length-post.length+1;
|
offset += indented.length-post.length+1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
longStack.pop();
|
longStack.pop();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user