pre html-M-BM- bash脚本在网络上高亮显示语法-删除字节序列的ASCII表示形式0xc2 0xa0

时间:2018-08-10 22:41:11

标签: javascript html bash pre

如果您从http://alexgorbatchev.com/SyntaxHighlighter/复制bash脚本(包含在<pre>元素中并使用SyntaxHighlighter插件https://hoodlogic.tk/pre_bash_nbsp.html突出显示),然后将其保存在名为test.sh的文件中尝试运行test.sh bash脚本(在Linux上,在Ubuntu 16.04上进行了测试),您会收到以下语法错误:

bash -n test.sh
test.sh: line 2: syntax error near unexpected token `then'
test.sh: line 2: `    if [ ! -z "$1" ]; then'

如果在脚本上使用cat -A命令,则会在输出中看到很多这样的内容:

cat -A test.sh
M-BM-M-BM-M-BM-M-BM-M-BM-M-BM-M-BM-M-BM-M-BM-M-BM-

您可以使用sed(在此处引用:https://askubuntu.com/questions/357248/how-to-remove-special-m-bm-character-with-sed)将其删除,但是我的问题是如何从浏览器复制脚本客户端并拥有它,以使&nbsp;字符转换为Linux空间字符?

有人知道吗?使用此jQuery代码段从<code>块中复制文本不会在粘贴到浏览器中的<textarea>时删除M-BM字符。

var textToCopy = "";
var i = 0;
$(".code .container .line", elem.parent()).each(function(e){
    if(i == 0){
        textToCopy += $(this).text();
    }else{
        textToCopy += "\n" + $(this).text();
    }
    i++;
});
$("textarea").val(textToCopy);

这似乎与行尾无关。如果您手动下载原始批处理文件,则脚本将按预期工作,因为源中没有不间断空格,但是如果您使用PHP的<pre>命令将其加载到echo file_get_contents("file");中以进行SyntaxHighlighting ,&nbsp;现在已添加到您的脚本中。

有人知道解决方案吗?

1 个答案:

答案 0 :(得分:0)

它看起来像是事物的组合(包括不同的浏览器行为):

语法突出显示脚本不应在代码节中使用&nbsp;条目,因为它已经使用了以下CSS样式white-space: pre;。因此,它应如下所示:

<style>
.spaces { white-space: pre; }
</style>

<code class="bash spaces">    </code>

但是语法荧光笔脚本会生成以下内容:

<code class="bash spaces">&nbsp;&nbsp;&nbsp;</code>

这会导致Chrome使用&nbsp;复制文本。 Firefox不会因为以下原因:https://bugzilla.mozilla.org/show_bug.cgi?id=359303

因此,由于语法突出显示脚本的操作有误,因此必须在复制文本之前将&nbsp;字符转换为普通空格:

textToCopy.replace(new RegExp(String.fromCharCode(160), "g"), " ");

不幸的是,它非常复杂,我希望Chrome在这种情况下的行为类似于Firefox,并自动将&nbsp;个字符转换为Linux和Windows的实际空间。但是既然没有,我就必须以不同的方式处理它。