Poprawne podświetlanie basha w GeSHi
Popularny moduł do podświetlania większości istniejących na świecie języków programowania, GeSHi, ma problemy z prawidłowym podświetlaniem basha. Jest to spowodowane tym, że w bashu istnieje zmienna $#, równocześnie komentarze jednolinijkowe zaczynają się od znaku #. Takiej sytuacji twórca GeSHi nie przewidział - w efekcie albo będą podświetlane prawidłowo komentarze ale $# zostanie potraktowane jako początek komentarza, albo będzie prawidłowo rozpoznawana zmienna $#, jednak komentarze będą wtedy traktowane jak zwykły kod - słowa kluczowe i np. ciągi będą podświetlane.
Błąd był zgłaszany na stronie projektu GeSHi, jednak GeSHi został w całości napisany na Google Code of Summer 2 lata temu, i od tej pory nie ma opiekuna - nie jest rozwijany. W dalszej części opiszę jak w bardzo prosty sposób sprawić, by komentarze w bashu były podświetlane prawidłowo.
Teoretycznie poprawne rozwiązanie, to zmodyfikowanie w ten sposób GeSHi by przy rozpoznawaniu początku komentarza możliwe było sprawdzenie jaki jest poprzedni znak. Jednak kod modułu GeSHi jest dość rozbudowany, a analiza kodu i zrozumienie filozofii działania wymaga pracy i czasu, zaś twórca, który dobrze zna ten moduł, dawno zarzucił prace przy nim. Dlatego spróbowałem znaleźć jakieś obejście tego problemu - okazało się to banalne:
W pliku konfiguracji języka, bash.php, w linii określającej komentarze jednolinijkowe podajemy:
Cały trick polega na spacji przed znakiem #. Teraz w kodzie przed wszystkimi komentarzami wystarczy dodać tą dodatkową spację - kod dalej jest prawidłowy, ta spacja przed początkiem komentarza niczego nie zmienia w działaniu skryptów. Natomiast konstrukcja $# nie jest już rozpoznawana jako komentarz - ponieważ przed '#' nie ma spacji.
Poniżej przykładowy kod do wpisania:
#!/bin/bash # to jest komentarz "jak dobrze widać # ze spacją na początku if [ $# = 0 ] echo "Tutaj kod prawidłowo podświetlony" # a to jest komentarz bez początkowego ' ' przez co jest źle podświetlany ls -l #komentarze działają także w ten sposób
a tak będzie on podświetlany przez moduł
- #!/bin/bash
- # to jest komentarz "jak dobrze widać
- # ze spacją na początku
- if [ $# = 0 ] echo "Tutaj kod prawidłowo podświetlony"
- # a to jest komentarz bez początkowego ' ' przez co jest źle podświetlany
- ls -l #komentarze działają także w ten sposób
Teraz wystarczy tylko pamiętać o spacji przed wszystkimi komentarzami, a nasz kod będzie elegancko podświetlany, i to dało się osiągnąć bardzo niewielkim nakładem pracy.
Do artykułu dołączam zmodyfikowany plik bash.php (do podmiany w katalogu geshi/bash.php )
| Załącznik | Rozmiar |
|---|---|
| bash.php.zip | 3.03 KB |






Odpowiedzi
Trochę poszukałem w sieci,
Trochę poszukałem w sieci, i okazuje się że niepotrzebnie kombinowałem - w wersji 1.0.7 geshi jest to już poprawione
Strona projektu: http://qbnz.com/highlighter
--
Tomasz Dąbski