Yo'HighLight je PHP skript pro zvýraznění syntaxe zdrojového kódu pro použití na internetu.
Všechny downloady obsahují (není li uvedeno jinak):
Verze | Obsahuje | Changelog | Datum |
---|---|---|---|
Yo'HighLighter 1.3 | Třída, CPP, CPP lite, PHP, SQL + RA | N/A | 9.1.2007 |
Yo'HighLighter 1.2 | Třída, CPP, PHP, SQL + RA | N/A | 8.1.2007 |
Yo'HighLighter 1.0 | Třída, CPP, PHP, SQL + RA | N/A | 6.1.2007 |
Je možné, že verze 1.2 a 1.0 nebudou fungovat a velice pravděpodobné, že nebudou fungovat s pluginy do novějších verzí. |
Tvorba pluginu je sama o sobě velmi jednoduchá - nejprve do souboru includneme
soubor s třídou (_class_highlight.php) a vytvoříme si novou
instanci třídy highlight:
<?php
Tak, teď si povíme co znamenají jednotlivé atributy konstruktoru:
include('class/_class_highlight.php');
$php = new highlight(".", "1", "?", "~", "_");
?>
public function __construct($kvantifikator = ".", $numbers = "1", $onePlace = "?", $unSeparated = "~", $whiteSpace = "_", $precise = TRUE)
$kvantifikator - určuje zástupný znak pro 0-N libovolných znaků (obdoba *)
$numbers - určuje zástupný znak pro 0-N znaků z množiny <0-9>
$onePlace - zástupný znak pro právě jeden libovolný znak.
$unSeparated - zástupný znak pro 0-N libovolných znaků, s vyjímkou
separátorů. Ty jsou určeny přímo v třídě:
private static $separators = array( "[", "]", ".", "{", "}", "(", ")", "*", ":", " ", ";",
a říkají nám které znaky dělí řetězec na části.
"&", "|", "+", "-", "\?", "\"", "'", "//", "/*","*/",
"\n", "\r", "\t", "!", "<", ">", "=", ",", "/", "~"
) ;
$whiteSpace - zástupný znak pro 0-N tzv. bílých znaků
- jejich seznam je opět přímo v hlavní třídě:
private static $spaces = array(" ", "\n", "\r", "\t");
$precise - určuje zda má algoritmus při vyhledávání používat bloky
nebo jen jednoduše hledat všechna zadaná klíčová slova, což je rychlejší, ale přicházíme o některé
rozšířené možnosti.
Nyní můžeme přistoupit k přidání klíčových slov, symbolů apod. K tomuto účelu slouží následující tři funkce (i s příklady):
public function add($word, $begin = "<span class=\"keyWord\">", $end = "</span>", $replace = FALSE, &$array = "EMPTY");
- přidání jednoho klíčového slova. Atribut $word je klíčovým slovem (nebo znakem, záleží co přidáváme),
$begin je to, co se má dát před klíčové slovo na výstupu, analogicky
$end se připojuje na výstup za klíčové slovo.
$replace obsahuje řetězec, kterým se má případně hledané klíčové
slovo nahradit. Poslední atribut, $array nijak nevyužijeme - je pro vnitřní potřebu.
$php->add("/*.*/","<span class=\"PHP-comment\">","</span>");
public function addArray($array, $begin, $end, $replace = FALSE);
- v podstatě to samé jako předchozí funkce, ale pracuje zde s polem klíčových slov - to aby nebylo nutné
psát pro každé slovo funkci. $begin a $end
se v tomto případě přiřadí automaticky ke všem slovům z pole $array.
$keyWords = array( "int", "float", "main", "function", "class", "void", "char", "for",
"while", "do", "switch", "case", "return", "new", "break", "delete",
"bool", "if", "else", "else if", "struct", "using", "namespace", "private",
"public", "static", "double", "exit", "const", "\_\_construct", "die", "echo",
"array", "include", "require", "inlude\_once", "require\_once", "as", "foreach",
"isset", "empty", "session_register", "session_start", "session_write_close", "Header"
) ;
$php->addArray($keyWords,"<span class=\"PHP-keyWord\">","</span>");
Toto pole $array má zcela jiný význam než
$array v předchozí funkci!
public function addBlock($begin, $end, $comment = FALSE, $mismatched = FALSE);
- tato funkce má zcela jiné využití - určuje nám, které značky jsou párové, resp. tvoří blok.
Atributy $begin a $end
jsou zřejmé, atribut $comment říká zda znaky mezi nimy
ovlivňují tok kódu. Například když budete mít složené závorky a mezi nimy nějaký komentář,
který bude obsahovat další složenou závorku ({ /* } */ }), tak tato složená závorka neovlivňuje
tok kódu - je vyňata ze sémantiky... Nevím jak to popsat, ale snad je to jasné :-).
$php->addBlock("{","}",FALSE);
Atribut $mismatched je TRUE, pokud
počáteční a koncový blok mohou být i v opačném pořadí (u závorek je to pochopitelně k ničemu,
ale hodí se to třeba u PHP, kde může být blokem jak "<?php ?>"
tak "?> <?php" (blok HTML kódu v PHP zdrojáku).
Pod pojemem kvantifikátory mám na mysli zástupné znaky, které jsme definovali při volání
konstruktoru. Pokud chceme například přidat mezi klíčová slova řetězec, provedeme to následujícně:
$php->add("\".\"","<span class=\"PHP-string\">","</span>");
Všimněte si tečky - zde nahrazuje libovolný počet libovolných znaků. Pokud bychom
chtěli do klíčových slov přidat skutečnou tečku, musíme ji "oescapovat" (čiliže
přidat před ni lomítko (ještě polopatičtěji → "\.")). Obdobně používáme další
zvolené kvantifikátory:
$numbers = array("1", "0x??", "0x??????", "1\.1");
Toto popořadě znamená:
$php->addArray($numbers, "<span class=\"PHP-number\">","</span>");
$php->add("\$~", "<span class=\"PHP-variable\">","</span>");
Nyní už víme všechno podstatné, takže už jen pár drobností k atributu $replace.
Lze ho totiž použít nejen k nahrazení nalezeného klíčového slova nějakou pevně danou náhradou, ale i
následujícím způsobem:
$php->add("\$~->~", "<span class=\"PHP-variable\">", "</span>", "\$~1</span><span class=\"PHP-operator\">-></span><span class=\"PHP-variable\">~2");
Všimněte si posledního vstupního (poněkud dlouhého) atributu funkce. Je tak
dlouhý, že se mi nevešel do rámečku, ale o to nejde - podstatné jsou tam dva podřetězce:
~1 a ~2. Tyto podřetězce se nahradí prvním (~1) a druhým (~2)
nalezeným řetězcem podle vzoru "\$~->~". Například na vstup přijde posloupnost
$php->add → odpovídá to vzoru \$~->~ → první vlnovka sedí na php, druhá na add.
~1 je nahrazena tím co se našlo na první vlnovce (v tomto případě php) ~2 tím co bylo na druhé
(add). Obdobná práce je s obecným kvantifikátorem (v našem případě ".") → .1 je nahrazena
řetězcem odpovídajícím místu první tečky. Pokud je hledáno jen s jedním kvantifikátorem, tak
se při nahrazování nepíše ".1", ale pouze "." (resp ~):
$php->add("(.)", "<span class=\"PHP-operator\">(</span>", "<span class=\"PHP-operator\">)</span>", "(.)");
Na tomto příkladu je mimo toho vidět ještě jedna věc - chceme-li aby se nalezený podřetězec
(v tomto případě tedy to co je mezi "(" a ")") také zvýrazňoval, musíme v atributu $replace
dát příslušný kvantifikátor do závorky.
Třída také umí vygenerovat číslo použitelné k označení nějakého bloku a k jeho zpracování
pomocí javascriptu (například otvírání a zavírání bloku kódu). Číslo je vygenerováno na místě
kde se v atribututech $begin, $end nebo
$replace nachází "[1]", kde znak 1 je vámi zvolený zástupný
znak pro libovolné číslo. Vygenerované číslo je shodné vždy pro jeden nález. Příklad:
$php->add("{_.}", "<span class=\"PHP-collapse\" onClick=\"showHide(this, [1]);\">{ </span> <span class=\"PHP-block\" id=\"block_[1]\">\n", "</span><span class=\"PHP-operator\">}</span>\n", "(.)");
Nic víc snad není potřeba, pokud budete přesto chtít něco vědět, stačí napsat. :-)
Spuštění skriptu na nějaký zdrojový kód je pak už jednoduché - kód který chcete parsovat pošlete metodě parseString($string);, která vám jako výsledek vrátí řetězec se zvýrazněnými kusy kódu - ten pak stačí zkopírovat a uložit do souboru kam ho chcete dát.
Zatím tu nic není
Martin "Yo'Sarin" Řezník