CodeMirror 2能否用于突出显示DIV
或PRE
标记中的代码(没有编辑器)?
像 CodeMirror 1 过去可以使用 hightlightText() 函数一样吗?例如这里:http://codemirror.net/1/highlight.html,按下运行高亮后(下面突出显示的文本)
它还可以<code>
像 Google 的 Prettify 那样突出显示内联元素中的代码,并保持结果内联吗?
CodeMirror 2能否用于突出显示DIV
或PRE
标记中的代码(没有编辑器)?
像 CodeMirror 1 过去可以使用 hightlightText() 函数一样吗?例如这里:http://codemirror.net/1/highlight.html,按下运行高亮后(下面突出显示的文本)
它还可以<code>
像 Google 的 Prettify 那样突出显示内联元素中的代码,并保持结果内联吗?
一个更好更简单的解决方案是将 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
到包含代码的标签中,它将突出显示语法。我还通过使用 class 添加了对内联代码的支持.inline
。
作为一个较晚的更新,CodeMirror 2 最近获得了这种能力。见http://codemirror.net/demo/runmode.html
您应该使用独立的代码语法荧光笔: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
});
这是使用 codemirror 运行模式和 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]);
});
});
其实你不能。Codemirror2 的编写方式是所有实现都隐藏在闭包中。可以使用的公共方法在文档http://codemirror.net/manual.html
中进行了描述
。唯一可用的选项是使用另一个语法荧光笔或深入 CodeMirror2 的代码以去除必要的部分。
如果您会选择最后一个选项,请注意
function refreshDisplay(from, to) method
它遍历线条并突出显示它们。
编辑
刚刚意识到存在一个更简单的方法。阅读下面的方法 2。我保持旧方法及其解释完整,只包括改进的 jQuery 代码。
如果您询问包的本机方法,答案是否定的,它仅适用于textarea
. 但是,如果您愿意使用变通办法,这里有一个可行(经过测试)。
我在这里使用了 jQuery,但它的使用不是必须的,您可以使用纯 js 代码实现相同的目的,尽管它会更长并且不如 jQuery 代码那么简洁。
现在,让我们开始解决方法。
假设你有一个<pre>
with 代码,你想变成没有编辑器的语法高亮代码镜像容器:
<pre id="mycode">
<?php
echo 'hi';
$a = 10;
if($a == 5) echo 'too small';
?>
</pre>
你所做的是,
<pre>
为<textarea>
,对于最后一个动作,我使用了Travis Webb 建议的方法。这是执行这四件事的 jQuery 代码:
$(document).ready(function() {
// (1) replace pre with textarea
$('#mycode').replaceWith('<textarea id="code">' + $('#mycode').html() + '</textarea>');
// (2) attach codemirror
var editor = CodeMirror.fromTextArea($("#code"), {
lineNumbers: true,
mode: "application/x-httpd-php"
});
// (3) hide the fake cursor
$('pre.CodeMirror-cursor').hide();
// [4] textarea to grab and keep the focus
$('body').append('<textarea id="tricky" style="height: 1px; position: fixed; width: 1px; top: 0; margin-top: -100px;" wrap="off"></textarea>');
// (4) grab focus
$('#tricky').focus();
// [4] if focus is lost (probably to codemirror)
$('#tricky').blur(function() {
// (4) re-claim focus
$('#tricky').focus();
// (3) keep the fake cursor hidden
$('pre.CodeMirror-cursor').hide();
});
});
方法二
我们可以删除使编辑器打勾的元素,而不是与光标和所有这些搏斗。这是代码:
$(document).ready(function() {
$('#mycode').replaceWith('<textarea id="code">' + $('#mycode').html() + '</textarea>');
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
lineNumbers: true,
mode: "application/x-httpd-php"
});
$('pre.CodeMirror-cursor').remove();
$('div.CodeMirror').find('textarea').blur().parent().remove();
$('div.CodeMirror').find('pre:first').remove();
$('textarea#code').remove();
});