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: 20 (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á.

LesTR:

Moc hezká věc!

Bohdan:

Kéž by to takhle pěkně uměl PSPad...

tark:

PHP se v PsPadu nedělá! Na to zásadně nějaké IDE, zkus PHP Eclipse nebo Zend Studio..

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ě.

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 :)

Lkopo:

ale proc ne? PHP se da delat klidne v PSPadu jeste je zadaro a zvyraznovace jsou urceny i pro PHP. Nevim proc si myslis ze PHP se neda delat v PSPadu - jak napr. Zend Studio tam ti napr. napomaha prikazy - ja jsem doteraz delal PHP v PSPadu a jsem uplne spokojenej

emer:

pouzivam NetBeans, zadarmo s moznostou podpory. paradicka

ikona Honza:

Koukám, že jsi na ty zvýrazňovače setsakra náročnej. Cože je ta apache licence?

ikona Jakub Vrána OpenID:

Je benevolentnější než GPL.

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.

ikona Jakub Vrána OpenID:

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...

ikona Jakub Vrána OpenID:

Nezávislá recenze: http://stribny.name/zapisnik/?clanky/jush-…-highlighter.

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?

ikona Jakub Vrána OpenID:

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.

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?

ikona Jakub Vrána OpenID:

Na stránce být nemusí. Stačí, když zůstane ve zdrojovém kódu.

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>

ikona Jakub Vrána OpenID:

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ý.

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čí.

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, 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:

avatar © 2005-2017 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.