Zvýrazňování syntaxe

Školení, která pořádám

Na těchto stránkách zvýrazňuji zdrojový kód příkladů pomocí funkce highlight_string. Neumí toho sice příliš moc, např. nevytváří odkazy na použité PHP funkce (to by se dalo snadno doplnit následným dozpracováním), ale zato se můžu spolehnout na to, že bude na 100% fungovat, protože pro rozebrání kódu používá stejný algoritmus jako samotné PHP. Jedinou výjimkou by bylo použití konstrukcí z jiné verze PHP nebo spoléhání na hodnotu některých konfiguračních direktiv (asp_tags nebo short_open_tag). Pro zvýraznění jiného než PHP kódu používám export ze SciTE, což je však poměrně krkolomné, protože výstup je potřeba ještě pročistit.

Úloha zvýrazňování kódu byla samozřejmě mnohokrát zpracována, z těch nejznámější jmenuji alespoň GeSHi a FSHL. Kód používaný pro vytváření webových aplikací je ale velice komplexní, používá se tu pět různých jazyků, které se vzájemně proplétají: HTML, CSS, JS, PHP a SQL. Nároky na analýzu kódu jsou tedy extrémní:

Kromě toho je potřeba se rozhodnout, zda zvýrazňování kódu provádět na serveru nebo až u klienta. Pokud se rozhodneme dělat ho na serveru, tak můžeme využít veškerou sílu PHP, vygenerovaný kód ale bude se všemi značkami pro zvýraznění syntaxe a odkazy na dokumentaci několikanásobně delší, než jeho původní podoba. Pokud se rozhodneme použít JavaScript, musíme se sžít s několika omezeními regulárních výrazů:

Omezení to jsou někdy nepříjemná, všechny tyto vlastnosti by se nám hodily, ale dá se s tím žít.

Zvýrazňovačů syntaxe je napsáno v JavaScriptu několik, žádný ale nesplňuje přísná kritéria, která jsem si stanovil. Jak asi tušíte, vytvořil jsem proto zvýrazňovač vlastní. Kromě popsaných vlastností (vzájemné provázání všech podporovaných jazyků, odkazy do dokumentace) disponuje co nejpečlivějším zohledněním syntaxe jednotlivých jazyků (např. __halt_compiler v PHP nebo regulární výrazy v JavaScriptu).

Můj zvýrazňovač syntaxe se jmenuje JUSH a je k dispozici pod Apache licencí. Testujte, stahujte a posílejte zpětnou vazbu.

Přijďte si o tomto tématu popovídat na školení JavaScript a AJAX.

Jakub Vrána, Řešení problému, 19.3.2007, diskuse: 18 (nové: 0)

Diskuse

ikona Libor:

Zvýrazňovače jsou fajn, ale nastavit vhodné barevné kombinace je velká alchymie. V mém případě někdy méně znamená více, a tak mám zkušenost, že dokonale zvýrazněný zdrojový kód s mnoha barvami na mě většinou působí už rušivě a přehlednost klesá.
# 19.3.2007 10:47:13 reagovat

LesTR:

Moc hezká věc!
# 19.3.2007 13:14:56 reagovat

Bohdan:

Kéž by to takhle pěkně uměl PSPad...
# 19.3.2007 13:25:53 reagovat

tark:

PHP se v PsPadu nedělá! Na to zásadně nějaké IDE, zkus PHP Eclipse nebo Zend Studio..
# 19.3.2007 18:49:40 reagovat

Magelan:

No, Zend Studio bude jistě úžasný nástroj, bodejď by taky nebyl, když je od autorů. Ale ne každý se tím živí natolik profesionálně aby mohl utratit těch asi 9K, co to stojí. Pro menší projekty mi PSPad zatím stačí, a ještě chvíli stačit bude. Za tu cenu je to program bez konkurence. Eclipse nemohu soudit, to jsem neviděl nikdy, Zend Studio kdysi u jednoho známého ano. Dokonce jsme ho kdysi použil i pro zvýrazňování kodu který byl potom vložen do html stránek. Nebylo to úplně bezpracné ale výsledek vyšel docela pěkně.
# 19.3.2007 21:25:13 reagovat

Tomas:

magelan: mnoo ja som si stiahol zend studio(s crackom ;P), ale nemozem si na neho zvyknut ;) viem, ze je kvalitny, ale aj tak nevyuzijem ani stotinu jeho funkcii ;) takze nebud smutny ze ho nemas :)
# 22.5.2007 22:54:54 reagovat

ikona Honza:

Koukám, že jsi na ty zvýrazňovače setsakra náročnej. Cože je ta apache licence?
# 19.3.2007 18:48:24 reagovat

ikona Jakub Vrána:

Je benevolentnější než GPL.
# 19.3.2007 19:00:59 reagovat

ikona dgx:

Vypadá to nadupaně, Jakube!

Sice, jak už tu bylo zmíněno, v takto zvýrazněné syntaxi se už ztrácím, tedy méně znamená více a asi bych odstranil potrhávání a kurzívu, nicméně to je asi jen věcí CSS.

Co by bylo naopak parádní, kdyby se syntaxe obarvovala přímo v editoru, tedy v contenteditable boxu, a za běhu.
# 20.3.2007 11:42:36 reagovat

ikona Jakub Vrána:

Podtrhávání a kurzíva je skutečně jen věcí CSS.

Na obarvování v editoru se zkusím podívat. Vím, že takové editory už jsou, koneckonců jsi mi na nějaké osobně posílal odkaz :-). Pak by se něco takového dalo použít jako nouzový programátorský editor. Problém je, že nic takového momentálně nepotřebuji...
# 20.3.2007 11:51:35 reagovat

ikona Jakub Vrána:

Nezávislá recenze: http://stribny.name/zapisnik/?clanky/jush-…-highlighter.
# 22.3.2007 13:19:59 reagovat

Colin:

Já jsem velice spokojený s JUSHem. Jé možné ho rozšířit o zvýrazňování VBA scriptu? Myslím tím jestli můžu sám nebo to musí udělat Jakub. Zvýraznění by mělo být jednoduché, jde jen o zvýraznění komentářů od znaku ' do konce řádky. Nic jiného není potřeba. Nebo neexistuje již něco takového?
# 14.2.2008 16:08:42 reagovat

ikona Jakub Vrána:

Zvýrazňování VBA by bylo třeba doprogramovat, JUSH není modulární. Pokud bych to dělal já, určitě bych se neomezil na zvýraznění komentářů, nicméně pokud ovládáš JavaScript, můžeš to zkusit sám.
# 14.2.2008 16:13:44 reagovat

hook:

Díky za zvýrazňovač, jenom se chci zeptat jak je to s licencí, samozřejmě jsem nemělnil licenci ani v jenom ze souborů. Jde mi jestli musí být odkaz někde na stránce nebo tak?
# 12.3.2008 23:56:00 reagovat

ikona Jakub Vrána:

Na stránce být nemusí. Stačí, když zůstane ve zdrojovém kódu.
# 13.3.2008 08:28:47 reagovat

Kajman:

Zdravím, děkuji a posílám jednu připomínku.

Když zpracovávané pre obsahuje html tagy, tak jush převede <> na html entity a vyskočí tak html kód do textu. Takže se moc nedá použít již nějaké označkování před jushem.
<pre class="jush-php">
echo "<b>jo</b>";
echo "<a href="http://example.com" target="_blank" rel="nofollow">http://www.example.com</a>;";
</pre>

# 15.8.2008 07:29:33 reagovat

ikona Jakub Vrána:

Děkuji za připomínku, je to skutečně chyba. Problém je v tom, že značky výstupu by se s již existujícími značkami mohly křížit, což je problém.

Když pošleš patch, který tento problém řeší, budu vděčný.
# 15.8.2008 07:45:49 reagovat

Kajman:

Zkoušel jsem zrušit úvodní html_entity_decode celého pre a udělat nové state, do kterého se dá spadnou ze všech ostatních díky < a vystoupit >, ale nějak jsem se zamotal, takže funkční verze z toho nevypadne :-)

Tohle už je vyšší dívčí.
# 15.8.2008 14:30:25 reagovat

Vložit příspěvek

Používejte diakritiku. Nelze používat HTML značky, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

© 2005-2008 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.