IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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 InitializeKey­words, 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 :)

C # - Pre pokročilých

 

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#

 

Všetky články v sekcii
C # - Pre pokročilých
Článok pre vás napísal David Jančík
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor je vášnivý programátor. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.
Aktivity