Tvoríme vlastné Syntax Highlighter
Najprv je potrebné si rozvrhnúť, ako vlastne bude náš program fungovať. Najjednoduchšie čo určite väčšinu z vás napadne je: mať nejakú kolekciu tú prejsť cyklom a podľa toho zafarbovať. A presne tak to urobíme. Samozrejme nesmieme očakávať extra výkon a chcieť ho použiť pre väčšie text. Hodí sa skôr pre jednorazové zvýraznenie. Ale my si vyskúšame aj realtime.
Najprv teda nájdeme nejaké kľúčové slová. Ja zašiel za strýkom a
poprosil o "C # keywords" a "PHP keywords". Hneď prvý odkaz ma zaviedol sem:
http://msdn.microsoft.com/...=vs.71).aspx
a sem: http://php.net/...keywords.php
Tieto slová som jednoducho skopíroval, vložil do editora a jednoducho ich
orezal tak, aby z nich vznikol dlhý riadok jednotlivých slov oddelených
čiarkou.
abstract,event,new,struct,as,explicit,null,switch,base,extern,this,false,operator,throw,break....
Teraz je potrebné zmazať duplicitné slová. To som urobil jednoducho.
Všetky slová som splitnul a cyklom pridal do
Listu
. A pri pridávaní som kontroloval, či v
Listu
už je obsiahnuté. Ak nie tak som si ho
vypísal. Console.Write(keyword + ",");
a skopíroval
výsledok.
Teraz keď máme kľúčové slovíčka. Je dobré ich roztriediť. Na dátové typy, fce atp. proste na kolekciu slov, ktoré vo výsledku budeme odlišovať farbou. Kľúčové slová budú potrebné zelená, kdežto dátové typy modrej.
Takže budeme mať:
string CSharpKeywords = "abstract,event,new...."; string PHPFunctions = "mb_strlen,mb_strpos..."; string PHPKeywords = "and,array,clone..."; string DataTypes = "bool,object,byte,int...";
Teraz si vytvoríme triedu SyntaxHighlighter a pridáme
statickú kolekciu Dictionary
s dátovými typmi
string
a Color
.
private static Dictionary<string, Color> keywords;
Teraz verejnú statickú metódu void InitializeKeywords,
v ktorej deklarujeme kolekciu a vložíme naše kľúčové slová. Môžeme
pridať aj jednoduché ošetrenie if (keywords != null) return;
Aby
metóda neprebehla viackrát.
No a teraz už len jednoducho prejdeme cyklom jednotlivé slovíčka a pridáme ich do kolekcie.
foreach (string word in CSharpKeywords.Split(',')) keywords.Add(word, Color.Green);
Túto metódu zavoláme v konstruktoru Formu.
public Form1()
{
InitializeComponent();
SyntaxHighlighter.InitializeKeywords();
}
Keď už sme vo formu, tak si otvoríme Designer a pridáme
RichTextBox
a
Button
.
RichTextBox
bude môcť prijímať Tabulátor
AcceptsTab
Tlačidlu vytvoríme udalosť OnClick
Teraz sa presunieme späť a pridáme verejnú statickú metódu HighlightText, ktorá vracia string a jej parametrom je text typu string
Vytvoríme si inštanciu RichTextBoxu.
RichTextBox rtb = new RichTextBox(); rtb.Text = text; rtb.Font = new Font(FontFamily.GenericMonospace, 8.75f, FontStyle.Regular);
A teraz prejdeme všetky kľúčové slová, vyhľadáme je v texte a zafarbíme.
int index; foreach (var entry in keywords) { index = 0; while ((index = rtb.Find(entry.Key, index, RichTextBoxFinds.WholeWord)) != -1) { rtb.Select(index, entry.Key.Length); rtb.SelectionFont = new Font(rtb.Font.FontFamily, rtb.Font.Size, FontStyle.Bold); rtb.SelectionColor = entry.Value; index += 1; } }
Teraz si popíšeme čo vlastne kód robí.
Je tu akási premenná index
tá určuje
súčasnú pozíciu v texte. Pri hľadaní ďalšieho slova sa postupuje od
pozície prechádzajúceho. Pripočíta sa k nemu 1, pretože je v ňom
obsiahnutá pozície, kde začína dané slovo a program by sa zacyklil, takto
slovo odsekni a bude sa hľadať ďalej.
Metóda Find
vyhľadá dané slovo, začína
hľadať od danej pozície a hľadá iba samostatná slová tzn. "In" nájde,
ale "indeed" už nie. Vráti pozíciu, kde dané slovo začína. Ak sa v texte
nevyskytuje vráti -1.
Metóda Select
vyberie text, ktorý začína na
danej pozícii a označí zadaný počet znakov. Robí to isté ako keď
kliknete a ťaháte myšou cez text.
Teraz keď je text vybratý zvolí sa farba a písmo výberu pomocou
SelectionFont
a
SelectionColor
.
Môžete si ďalej zvýrazniť komentáre:
index = 0; while ((index = rtb.Text.IndexOf("//", index)) != -1) { rtb.Select(index, rtb.Text.IndexOf("\n", index) - index); rtb.SelectionFont = new Font(rtb.Font.FontFamily, rtb.Font.Size, FontStyle.Regular); rtb.SelectionColor = Color.Gray; index += 2; // zde se přičítá dvojka kvůli popiskům tzv. summary, kde jsou /// závorky já je beru jako komentář. }
Alebo aj string "môj text" či viacerých riadkové komentáre / * môj komentár * /, ktoré možno jednoducho pridať rovnakým spôsobom ako jednoriadkový komentár.
Teraz si zvýrazňovač "syntax hajlajtr" vyskúšame. Iba do udalosti tlačidla pridáme
richTextBox1.Rtf = SyntaxHighlighter.HighlightText(richTextBox1.Text);
Spustíme a vyskúšame.
Teraz si skúsime real time zvýrazňovania. Tzn. že budeme písať a bude
sa nám text ihneď zvýrazňovať. Tlačidlo zmažeme is udalostí.
RichTextBoxu nastavíme dock - aby sa nám pekne roztiahol. A pridáme mu event
KeyDown
Ak ste niektorí skúšali z predstihom, narazili ste na problém, že sa
vlastne nedá písať, pretože pri prvom kľúčovom slove nás začne vracať
nazačátek. To ošetríme jednoducho uložením súčasnej pozície kurzora
SelectionStart
, zvýraznením a následným
nastavním pozície kurzora späť.
int lastSelectionStart = richTextBox1.SelectionStart;
richTextBox1.Rtf = SyntaxHighlighter.HighlightText(richTextBox1.Text);
richTextBox1.SelectionStart = lastSelectionStart;
Bystrí z vás narazí na problém, že ak chcem niečo označiť a zmazať - nejde to. To sa dá ľahko ošetriť kontrolou či je niečo vybraného - tzn. dĺžka výberu.
if (richTextBox1.SelectionLength > 0) return;
A náš vlastný Highly .. to je slovo hajlajtr je na svete. A potom, že je to nejaká veda
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 427x (49.16 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#