Poprawne podświetlanie basha w GeSHi

Tags:

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:

  1. 'COMMENT_SINGLE' => array(1=>' #'),

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ł

  1.  #!/bin/bash
  2.  # to jest komentarz "jak dobrze widać
  3.  # ze spacją na początku
  4. if [ $# = 0 ] echo "Tutaj kod prawidłowo podświetlony"
  5. # a to jest komentarz bez początkowego ' ' przez co jest źle podświetlany
  6. 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łącznikRozmiar
bash.php.zip3.03 KB

Odpowiedzi

Trochę poszukałem w sieci,

avatar użytkownika Tomasz Dąbski

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