Kolorowanie składni

Odpowiedz Nowy wątek
2006-11-03 23:01
orc
0

Witam.

Piszę sobie programik, który wczytując źródło w Pascalu z pliku przetwarza je, po czym zapisuje wyniki w pliku html z pokolorowaną składnią.

Nie wiem do końca jak mogę zrobić to kolorowanie w locie.

Na razie mam takie coś:

begin

write('Podaj nazwe pliku do otwarcia: ');
readln(strNzwPlikOdc);
write('Podaj nazwe pliku do zapisania: ');
readln(strNzwPlikZap);

Assign(filUchwytOdc, strNzwPlikOdc);
Reset(filUchwytOdc);

Assign(filUchwytZap, strNzwPlikZap+'.html');
Rewrite(filUchwytZap);

while not EOF(filUchwytOdc) do
    begin
        Readln(filUchwytOdc, strLine);
        Writeln(filUchwytZap, strLine+'<br />');
    end;

close(filUchwytOdc);
close(filUchwytZap);

end.

I myślę sobie, żeby każdą wczytaną linię rozbić na słowa, które umieszczę w tablicy. W drugiej tablicy będę miał słowa kluczowe Pascala i będę porównywał każde z rozdzielonych słów. Jeśli będzie pasowało do któregoś ze słów kluczowych, to będzie to wyrażenie zamieniało na to samo, z tym, że pogrubione, czyli np.:

end zamieni na < b>end</b > - po otwarciu pliku .html będzie ono pogrubione.

Ewentualnie wyszukując w stringu słowo przy pomocy gotowej funkcji i zamieniając je jak wyżej.

Jakieś pomysły, jak mogę to inaczej zrobić?

<font size="4">NIE CHCĘ GOTOWCA, JEDYNIE POMYSŁY</span>

EDIT: Chcę zrobić mniej więcej coś takiego, jak widoczne jest w tagach < delphi > powyżej.

Pozostało 580 znaków

2006-11-04 08:31
0
<by-t3h-w4y>Odradzam stosowanie tagów ``, są one dostępne w Coyote'cie ze względów kompatybilności. Używaj ``.</by-t3h-w4y>

Jeśli masz zamiar kolorować coś więcej niż słowa kluczowe, odradzam dzielenie kodu na linijki.

Ja bym to zrobił tak: otwarłbym oba pliki za pomocą TFileStream, do pliku HTML zapisałbym prolog - !DOCTYPE, znacznik <head>, arkusz styli, <meta name="Generator">, początek <body> i <code><pre> (albo samo <code><pre>). Następnie w pętli: odczytywałbym jeden znak i jeżeli:
1. jest literą - odczytywałbym kolejne znaki, dopóki nie napotkam znaku niealfanumerycznego. Następnie sprawdzałbym, czy to, co odczytałem jest słowem kluczowym. Jeśli tak - do pliku wyjściowego zapisałbym: „<b class="keyword">słowo_kluczowe</b>”.
2. jest cyfrą - odczytywałbym wszystkie znaki, aż do pierwszego znaku niecyfrowego. Następnie obrałbym to co odczytałem w „<span class="number">” i dopisałbym do pliku wyjściowego.
3. jest znakiem „{” - sprawdziłbym, czy następny znak jest znakiem „$” i zapamiętałbym to w zmiennej. Następnie odczytałbym wszystko aż do napotkania znaku „}” i w zależności od stanu mojej zmiennej umieściłbym to w znaczniku „<i class="comment">” lub „<i class="directive">”.
4. jest znakiem „$” - odczytywałbym wszystkie znaki, aż do pierwszego znaku nie będącego cyfrą szesnastkową. To co odczytałem, zapisałbym jako „<span class="hex">$...</span>”.
5. i tak dalej...
6. jeśli żaden z powyższych warunków nie jest prawdziwy, po prostu umieszczałbym odczytany znak w pliku HTML.

Oczywiście, przed ubraniem czegokolwiek w znaczniki, zamieniałbym < na <, & na & i > na >
Po zakończeniu pętli umieszczałbym w pliku HTML „</pre></code></body></html>” (lub samo </pre></code>) i zamykałbym oba pliki.

Ale po co miałbym się tak męczyć, skoro jest SynEdit, jego podświetlacze i SynExporterHTML :P Można stworzyć podświetlacz składni Pascala i SynExporterHTML jako AOwner podając nil, ustawić opcje, wyeksportować i zniszczyć komponenty.

// to automatyczne zamykanie tagów jest w... nerwiające.

</i></i>


php if ($crazy) sqrt() or die;

Pozostało 580 znaków

2006-11-04 09:14
orc
0

Tak, tylko ja mam to napisać jako aplikacja konsolowa.

Dzięki za poddanie pomysłu. Dzisiaj spróbuję coś wymodzić. :)

Pozostało 580 znaków

2006-11-04 10:45
0

A kto ci mówił, że komponentów nie można używać w aplikacji konsolowej? Można, tylko inaczej się je tworzy - jak normalne klasy, przy pomocy konstruktora Create, do którego trzeba podać właściciela (parametr AOwner typu TComponent; może być równy nil).

Oczywiście nie zabraniam ci robienia tego sposobem, jaki opisałem wyżej - w końcu większa frajda napisać coś samemu ;)


php if ($crazy) sqrt() or die;

Pozostało 580 znaków

2006-11-04 12:55
orc
0

Nie widziałem, że komponenty mogę używać w aplikacji konsolowej. :)

Dzięki za pomoc!

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0