Вам нужно будет выполнить итерацию всех строк, а не только строк с соответствующими ключевыми словами, и затем сохранить текущий отступ , который вы увеличиваете для некоторых ключевых слов и уменьшаете для других.Я хотел бы сохранить такое влияние на отступы как свойство для каждого ключевого слова рядом со свойством стиля для них:
const keywords = {
IF: { style: "code-elem", indent: 4 },
ENDIF: { style: "code-elem", indent: -4 },
IFLISTING: { style: "code-str", indent: 4 },
ENDIFLISTING: { style: "code-str", indent: -4 },
VAR: { style: "code-comment", indent: 0 },
LISTING: { style: "code-comment", indent: 0 }
};
function myFunction() {
let indent = 0;
document.getElementById("demo").innerHTML = document.getElementById("text1").value.split(/[\r\n]+/).map(line => {
const oldIndent = indent;
line = line.trim().replace(/###([A-Z]+)(.*?)###/g, (m, keyword, arg) => {
const param = keywords[keyword];
if (!param) return m;
indent += param.indent;
return `<span class="${param.style}">${m}</span>`;
});
return " ".repeat(Math.min(indent, oldIndent)) + line;
}).join("<br>");
}
.code-str { color: #080; }
.code-elem { color: #f00;}
.code-comment { color: #00f; }
<textarea rows="15" cols="80" type="text" id="text1">###VAR:837:Single###
###IF:69154!=1###
###IF:69154!=1###
###VAR:69154:Single###x
###ENDIF:69154###
###VAR:69154:Single###x
###ENDIF:69154###
###VAR:990:Single### battery ###VAR:S301:Single###mAh (###VAR:S302:Single###V)
###IFLISTING:7785###
replaces
###ENDIFLISTING:7785###
###IFLISTING:7786###
replaces
###ENDIFLISTING:7786###
</textarea><br>
<button onclick="myFunction()">MAGIC</button>
<p id="demo"></p>