如何在 JQuery 终端中为包含反斜杠 (\) 的文本着色?

How do I color text in JQuery Terminal that contains a backslash (\)?

我一直在关注 以帮助我更改 JQuery 终端中输出的颜色,尽管该方法似乎不适用于反斜杠。

理想情况下,我希望能够用一种颜色(即红色)突出显示某些文本,而文本的其余部分是白色以外的其他颜色(即蓝绿色)。文本经常使用反斜杠,这会导致一些否则不会存在的错误。

下面是一个可重现的示例:

function highlight_all_occurences_of_x_in_text(text) {

text_list = text.split("");
output_list = [];

while (text_list.length > 0) {
    current_character = text_list.shift();
    
    if (current_character === 'x') {
        output_list.push('[[gb;red;black]');
        output_list.push('x');
        output_list.push(']');
    }
    else {
        output_list.push(current_character);
    }
}

return '[[gb;yellow;black]' + output_list.join('') + ']';
}

如果我调用 highlight_all_occurences_of_x_in_text('\text') 甚至 highlight_all_occurences_of_x_in_text('\\text'),我会得到预期的输出。

但是如果我调用 highlight_all_occurences_of_x_in_text('\\x'),我会得到类似 '][[gb;red;blackx]' 的结果。

我该如何处理?

解决方法是使用

$.terminal.escape_brackets

$.terminal.escape_formatting

这两个函数都将 [ ] \ 替换为 HTML 个实体。

发生这种情况的原因是 \] 是一个转义括号,如果您有 [[;yellow;]\] 终端将不会关闭格式并继续将其余部分作为文本的一部分处理,如果在那之后发生事件是另一种格式。

   
function highlight_all_occurences_of_x_in_text(text) {

    var text_list = text.split("");
    var output_list = [];
    
    while (text_list.length > 0) {
        current_character = text_list.shift();
        
        if (current_character === 'x') {
            output_list.push('[[gb;red;black]');
            output_list.push('x');
            output_list.push(']');
        } else {
            var str = $.terminal.escape_formatting(current_character);
            output_list.push(str);
        }
    }
    
    return '[[gb;yellow;black]' + output_list.join('') + ']';

}

var term = $('body').terminal(highlight_all_occurences_of_x_in_text, {
  onInit() {
    this.echo('type any text to highlight x');
  }
});
:root {
  --size: 1.4;
}
<script src="https://cdn.jsdelivr.net/npm/jquery"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery.terminal/js/jquery.terminal.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/js-polyfills/keyboard.js"></script>
<link href="https://cdn.jsdelivr.net/npm/jquery.terminal/css/jquery.terminal.css" rel="stylesheet"/>