CodeMirror 2 - только подсветка (без редактора) - PullRequest
53 голосов
/ 02 апреля 2011

Можно ли использовать CodeMirror 2 для выделения кода из тега DIV или PRE (без редактора)?

Как CodeMirror 1 раньше можно было использовать с функцией hightlightText ()? Например, здесь: http://codemirror.net/1/highlight.html, после нажатия кнопки «Выделить» (выделенный текст ниже)

Может ли он выделять код из встроенного элемента, например <code>, и сохранять результаты встроенными, как это делает Google Prettify?

Ответы [ 8 ]

53 голосов
/ 09 апреля 2011

Более приятное и простое решение - просто установить для свойства readOnly экземпляра CodeMirror значение 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

37 голосов
/ 16 июня 2011

Как несколько позднее обновление, CodeMirror 2 недавно получила эту возможность. Смотри http://codemirror.net/demo/runmode.html

2 голосов
/ 11 ноября 2012

Вот более простое решение, использующее режим запуска codemirror и jquery:

<code><pre class='code'>{:message => 'sample code'}
$ (документ) .ready (function () { $ ('. code'). each (function (index, e) { $ (Е) .addClass ( 'см-s-умолчанию'); // применить класс темы CodeMirror.runMode ($ (e) .text (), "javascript", $ (e) [0]); }); });
2 голосов
/ 16 декабря 2011

CodeMirror V2 содержит runmode.js.

Я написал пример использования runmode с желобом.

check: http://jsfiddle.net/lyhcode/37vHL/2/

2 голосов
/ 08 апреля 2011

Редактировать
Только что понял, что существует более простой метод.Прочтите метод 2 ниже.Я сохраняю старый метод и его пояснения нетронутыми и просто включаю улучшенный код jQuery.


Если вы спрашиваете о нативном методе пакета, ответ - нет, он толькоработает с textarea.Но если вы открыты для использования обходных путей, вот тот, который работает (проверено).

Я использовал здесь jQuery, но его использование не является обязательным, и вы можете добиться того же с помощью чистого кода js, хотя ибудет длиннее и не так аккуратен, как код jQuery.

Теперь перейдем к обходному пути.

Предположим, у вас есть <pre> с кодом внутри, который вы хотите превратить в редактор.меньше выделенного синтаксисом контейнера codemirror:

<code><pre id="mycode">
<?php
  echo 'hi';
  $a = 10;
  if($a == 5) echo 'too small';
?>

Что вы делаете,

  1. измените <pre> на <textarea>,
  2. прикрепить кодовое зеркало к текстовой области,
  3. скрыть фальшивый курсор и сохранить его скрытым, а
  4. не разрешить текстовой области скрытого кодового зеркала захватить фокус (и вернуть его обратно, когда это произойдет).

Для последнего действия я использовал метод , предложенный 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();
});
2 голосов
/ 05 апреля 2011

На самом деле вы не можете. Codemirror2 написан так, что вся реализация скрыта в замыканиях. Публичные методы, которые можно использовать, описаны в документации http://codemirror.net/manual.html
Единственные доступные варианты - использовать другие подсветки синтаксиса или погрузиться в код CodeMirror2, чтобы вырезать необходимые части.
Если вы выберете последний вариант, пожалуйста, обратите внимание на

function refreshDisplay(from, to) method

он проходит по линиям и выделяет их.

2 голосов
/ 03 апреля 2011

Вы должны использовать автономную подсветку синтаксиса кода: 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
  });
1 голос
/ 08 апреля 2011

CM2 напрямую не поддерживает функцию, которую вы ищете.Однако я использовал трюк с обработчиком onFocus, который он поддерживает, чтобы запретить пользователю сосредоточиться на элементе Codemirror и, следовательно, запретить редактирование.Следующее мое объяснение предполагает, что вы просматривали здесь: http://codemirror.net/manual.html. Возможно, вы захотите использовать jQuery для этой техники, но это не обязательно.Вы говорите о наличии кода в div, поэтому я предполагаю, что вы знаете, как прикрепить Codemirror к элементу div.

  1. Создать текстовое поле <input id="tricky"> какого-то вида, которое скрыто,Вы можете использовать любую технику для «сокрытия» этого по своему желанию, но я могу вам сказать, что установка CSS на "display:none" не будет работать.visibility:hidden может работать, но, вероятно, лучше просто расположить div где-нибудь на странице.
  2. Установить обработчик onFocus в соответствии с документацией Codemirror2 по ссылке выше,
  3. Внутри onFocus обработчик событий, сделайте что-то вроде:$("tricky").focus();или без jQuery:document.getElementById("tricky").focus();

, и вы мгновенно перенаправляете фокус на невидимое поле, и никто не может редактировать отображаемый вами код.Вероятно, есть какой-то умный способ победить этот метод, но он будет работать в 99% случаев.Это немного хитро, но, по крайней мере, вам не нужно дурачиться с внутренностями Codemirror.

...