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?
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
.
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
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.
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,
- Zmień
<pre>
na<textarea>
, - Dołącz codemirror do textarea,
- Ukryj fałszywy kursor i trzymaj go w ukryciu, i
- 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();
});
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
});
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/
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]);
});
});
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
.
- 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ś. - Konfiguracja obsługi
onFocus
zgodnie z dokumentacją Codemirror2 w powyższym linku, - 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.
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