CodeMirror 2-tylko podświetlenie (bez edytora)

Czy CodeMirror 2 może być użyty do podświetlenia kodu ze znacznika DIV LUB PRE (bez edytora)?

Jak CodeMirror 1 używany do pracy z funkcją hightlightText ()? Na przykład tutaj: http://codemirror.net/1/highlight.html, po naciśnięciu przycisku Uruchom podświetlenie (podświetlony tekst poniżej)

Może również podświetlić kod z elementu inline, jak <code>, i zachować wyniki w linii, jak Pretify Google robi?

Author: Alex, 2011-04-02

8 answers

O wiele ładniejszym i łatwiejszym rozwiązaniem jest ustawienie właściwości readOnly instancji CodeMirror na true, tak:

$('.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
    });

});

Po prostu dodaj klasę .code do znacznika zawierającego kod i będzie podświetlona składnia. Dodałem również wsparcie dla kodu inline, używając klasy .inline.

Przykład na jsfiddle

 51
Author: Sindre Sorhus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-08 01:32:08

Jako nieco późna aktualizacja, CodeMirror 2 niedawno zyskał tę zdolność. Zobacz http://codemirror.net/demo/runmode.html

 33
Author: Marijn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-15 20:49:04

Właściwie nie można. Codemirror2 jest napisany w taki sposób, że cała implementacja jest ukryta w zamknięciach. Metody publiczne, które mogą być używane są opisane w dokumentacji http://codemirror.net/manual.html
Jedynymi dostępnymi opcjami są użycie zakreślaczy składni lub zanurzenie się w kodzie CodeMirror2, aby usunąć niezbędne części.
Jeśli wybierzesz ostatnią opcję, zwróć uwagę na

function refreshDisplay(from, to) method

Pętli przez linie i podświetla je.

 2
Author: Eldar Djafarov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-05 12:22:34

Edit
Właśnie zdałem sobie sprawę, że istnieje prostsza metoda. Przeczytaj metodę 2 poniżej. Zachowuję starą metodę i jej wyjaśnienia w Nienaruszonym Stanie i dołączam tylko ulepszony kod jQuery.


Jeśli pytasz o natywną metodę pakietu, odpowiedź brzmi nie, działa tylko z textarea. Ale jeśli jesteś otwarty na używanie obejść, oto jeden, który działa (przetestowany).

Użyłem jQuery tutaj, ale jego użycie nie jest koniecznością i możesz osiągnąć to samo z czystym js kod, choć byłby dłuższy i nie tak schludny jak kod jQuery.

Przejdźmy do obejścia problemu.

Załóżmy, że masz <pre> z kodem w środku, który chcesz zmienić w podświetlany bez edytora kontener codemirror:

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

To co robisz to,

  1. Zmień <pre> na <textarea>,
  2. Dołącz codemirror do textarea,
  3. Ukryj fałszywy kursor i trzymaj go w ukryciu, i
  4. Nie zezwalaj na przechwytywanie ukrytego pola tekstowego codemirror ostrości (a gdy już to zrobi).

Do ostatniej akcji użyłem metody zasugerowanej przez Travisa Webba . Oto kod jQuery, który robi te cztery rzeczy:

$(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();
    });

});

Metoda Druga

Zamiast zmagać się z kursorem i tym wszystkim, możemy usunąć elementy, które sprawiają, że edytor zaznacza. Oto kod:

$(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
Author: Majid Fouladpour,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:31:55

Powinieneś używać samodzielnego zakreślacza składni kodu: SyntaxHighlighter 3 działa naprawdę dobrze.

Jeśli naprawdę chcesz CodeMirror, jest readOnly wariant:

var myCodeMirror = CodeMirror(function(elt) {
    myElement.parentNode.replaceChild(myElement, elt); // myElement is your <pre> or <div>
  }, {
    value: myElement.value,
    readOnly: true
  });
 2
Author: bpierre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-09 13:49:29

CodeMirror V2 zawiera runmode.js.

Napisałem przykład używając runmode z gutterem.

Sprawdź: http://jsfiddle.net/lyhcode/37vHL/2/

 2
Author: lyhcode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-23 09:27:57

Oto prostsze rozwiązanie przy użyciu codemirror runmode i 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
Author: desheikh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-19 00:05:13

CM2 nie obsługuje bezpośrednio funkcji, której szukasz. Jednak użyłem sztuczki dotyczącej obsługi onFocus, którą obsługują, aby uniemożliwić użytkownikowi skupienie się na elemencie Codemirror, a tym samym uniemożliwić edycję. Moje wyjaśnienie, które następuje zakłada, że przejrzałeś tutaj: http://codemirror.net/manual.html. prawdopodobnie będziesz chciał użyć jQuery do tej techniki, ale nie jest to wymagane. Mówisz o kodzie w div więc zakładam wiesz jak dołączyć Codemirror do elementu div.

  1. Utwórz <input id="tricky"> pole tekstowe jakiegoś rodzaju, które jest ukryte. Możesz użyć dowolnej techniki do "ukrycia" go, ale mogę ci powiedzieć, że ustawienie CSS na "display:none" nie zadziała. visibility:hidden może działać, ale prawdopodobnie lepiej po prostu umieścić div na stronie gdzieś.
  2. Konfiguracja obsługi onFocus zgodnie z dokumentacją Codemirror2 w powyższym linku,
  3. wewnątrz twojego onFocus obsługi zdarzeń, zrób coś jak:

    $("tricky").focus();
    lub bez jQuery:
    document.getElementById("tricky").focus();

I natychmiast przekierowujesz fokus do niewidzialnego pola i nikt nie może edytować wyświetlanego kodu. Prawdopodobnie istnieje jakiś sprytny sposób na pokonanie tej metody, ale zadziała ona w 99% przypadków. To trochę oszustwa, ale przynajmniej nie musisz się zadręczać wnętrznościami Codemirror.

 1
Author: Travis Webb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-23 09:29:13