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
をコードを含むタグに追加するだけで、構文が強調表示されます。クラス.inline
を使用して、インラインコードのサポートも追加しました。
やや遅いアップデートとして、CodeMirror 2は最近この機能を獲得しました。 http://codemirror.net/demo/runmode.html を参照してください
スタンドアロンのコード構文ハイライターを使用する必要があります: SyntaxHighlighter は非常にうまく機能します。
CodeMirrorが本当に必要な場合は、 readOnly
オプションがあります。
var myCodeMirror = CodeMirror(function(elt) {
myElement.parentNode.replaceChild(myElement, elt); // myElement is your <pre> or <div>
}, {
value: myElement.value,
readOnly: true
});
編集
より単純な方法が存在することを理解しました。以下の方法2をお読みください。私は古いメソッドとその説明をそのまま維持し、改良されたjQueryコードを含めています。
パッケージのネイティブメソッドについて質問する場合、答えはnoで、textarea
でのみ機能します。ただし、回避策を使用できる場合は、動作する(テスト済みの)ものを次に示します。
ここではjQueryを使用しましたが、その使用は必須ではなく、純粋なjsコードで同じことを実現できますが、jQueryコードよりも長くてすっきりしません。
それでは、回避策に進みましょう。
<pre>
内部にコードがあり、エディターなしの構文で強調表示されたコードミラーコンテナーに変換したい場合:
<pre id="mycode">
<?php
echo 'hi';
$a = 10;
if($a == 5) echo 'too small';
?>
</pre>
あなたがすることは、
<pre>
〜<textarea>
、最後のアクションには Travis Webbが提案した方法 を使用しました。以下は、これら4つのことを行う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();
});
});
方法2
カーソルを使ってレスリングする代わりに、エディターをティックにする要素を削除できます。これがコードです:
$(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();
});
ここでは、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]);
});
});
実際にはできません。 Codemirror2は、すべての実装がクロージャーに隠されるように記述されています。使用できるパブリックメソッドについては、ドキュメント http://codemirror.net/manual.html で説明されています。
利用可能な唯一のオプションは、別の構文ハイライターを使用するか、CodeMirror2のコードを調べて、必要な部分を取り除くことです。
最後のオプションを選択する場合は、注意してください
function refreshDisplay(from, to) method
行をループして強調表示します。
CodeMirror V2にはrunmode.jsが含まれています。
Gutterでrunmodeを使用した例を書きました。
CM2は、探している機能を直接サポートしていません。ただし、私は、ユーザーがCodemirror要素に集中できないようにするためにサポートするonFocus
ハンドラーを含むトリックを使用し、編集を禁止しました。以下の私の説明は、あなたがここで調べたことを前提としています: http://codemirror.net/manual.html 。この手法ではおそらくjQueryを使用したいと思うでしょうが、それは必須ではありません。 div
にコードを含めることについて話しているので、div
要素にCodemirrorをアタッチする方法を知っていると想定しています。
<input id="tricky">
_テキストフィールドを作成します。希望する方法で「非表示」にすることができますが、CSSを_"display:none"
_に設定しても機能しないことがわかります。 _visibility:hidden
_は機能するかもしれませんが、ページのどこかにdivを配置するだけの方が良いでしょう。onFocus
ハンドラーをセットアップします。onFocus
イベントハンドラー内で、次のようにします。$("tricky").focus();
document.getElementById("tricky").focus();
フォーカスをすぐに非表示のフィールドにリダイレクトし、表示したコードを誰も編集できなくなります。この方法を無効にするための巧妙な方法がおそらくあるでしょうが、99%のケースで機能します。これは少し厄介ですが、少なくともCodemirrorの内部を操作する必要はありません。