CodeMirror 2 - 仅高亮显示(无编辑器)

60

能否使用CodeMirror 2来突出显示来自 DIVPRE 标签的代码(不使用编辑器)?

就像 CodeMirror 1 过去可以使用 highlightText() 函数一样? 例如这里:http://codemirror.net/1/highlight.html,在按下 "run highlight" 后突出显示(下面的突出显示文本)

此外,它能否从内联元素,如 <code>,突出显示代码,并保持结果内联,就像谷歌的 Prettify 所做的那样?


哇,你的声望值已经达到了70% - 你是慷慨还是绝望?;) - 我会给你一个+1来帮助你回升! - UpTheCreek
你有特别的限制不能使用独立的高亮显示器吗? - bpierre
1
不,我只是喜欢codeMirror :) 目前我在使用highlight.js,它很棒,但我想看看codeMirror的表现。另外,codeMirror可以突出显示混合的php / html / js / css代码,这是它的优点... - Alex
1
从她设置赏金的方式来看,显然Alex完全不在乎声誉。我有点喜欢这一点,但仍希望她能保留一些声誉。她的声誉比此处设定的赏金要少(显然是因为在此之后失去了另一个赏金问题的分数)。现在,如果由于声誉不足而取消了这个赏金,我会很高兴。无论如何,我很想看看系统如何处理这个问题。 - Majid Fouladpour
@bpierre CodeMirror是一种使用JS编写的工具,既可以在浏览器上工作,也可以在服务器(Node)上运行。它非常灵活,允许嵌套模式(代码内部的代码)。这是两个重要的原因。 - Alba Mendez
7个回答

57

一个更好、更简单的解决方案是将CodeMirror实例的readOnly属性设置为true,就像这样:

$('.code').each(function() {

    var $this = $(this),
        $code = $this.html();

    $this.empty();

    var myCodeMirror = CodeMirror(this, {
        value: $code,
        mode: 'javascript',
        lineNumbers: !$this.is('.inline'),
        readOnly: true
    });

});

只需将包含代码的标签添加类.code,它就会被语法高亮显示。我还添加了对行内代码的支持,通过使用类.inline

在jsfiddle上的示例


哇,你在我添加这个选项到我的答案之前只回答了9分钟,并且使用了内联模式。+1! :-) - bpierre
@Felix 谢谢,应该注意到那个 ;) - Sindre Sorhus
不错:D,但我有一个问题:因为我不想在文本区域中显示它,所以来自div的代码将被转义。但是codemirror显示转义字符,而不是解码它们 :( - Alex
在你的例子中尝试添加一些转义的 HTML,例如 &lt;div&gt; fuu &lt;/div&gt; - Alex
我已经更新了 jsfiddle 的示例,并支持转义代码。 - Sindre Sorhus

40

3
你应该使用独立的代码语法高亮工具:SyntaxHighlighter 3 非常好用。
如果你真的想使用 CodeMirror,那么有一个 readOnly 选项:
var myCodeMirror = CodeMirror(function(elt) {
    myElement.parentNode.replaceChild(myElement, elt); // myElement is your <pre> or <div>
  }, {
    value: myElement.value,
    readOnly: true
  });

2
实际上你不能。Codemirror2的实现方式是所有实现都隐藏在闭包中。可以使用的公共方法在文档http://codemirror.net/manual.html中有描述。
唯一可用的选项是使用其他语法高亮工具或深入CodeMirror2的代码中剥离必要的部分。
如果您选择了最后一种选项,请注意

function refreshDisplay(from, to) method

它循环遍历每一行并将其突出显示。

2
编辑
刚刚意识到有一个更简单的方法存在。请参阅下面的方法2。我保留旧方法及其解释,并包含改进后的jQuery代码。
如果您询问有关包的本地方法,答案是“不行,它只适用于

2
以下是翻译内容:

这里有一个更简单的解决方案,使用 codemirror runmode 和 jquery:

<pre class='code'>{:message => 'sample code'}</pre>

$(document).ready(function() {
    $('.code').each(function(index, e) {
        $(e).addClass('cm-s-default'); // apply a theme class
        CodeMirror.runMode($(e).text(), "javascript", $(e)[0]);
    });
});

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接