ATSHi
Categories: [ IT ]
I followed my dream, and I wrote the Automatic Transparent Syntax HIghlighting software.
I have files (mainly source code) put as-is on my web site. Those files can be
browsed with a regular web browser, and Apache's internal file indexing is
used for accessing the directory structure. When the user requests a (source
code) file of a known type, it would be nice to highlight the syntax.
atshi.php
does just that, automatically (no need for the webmaster to
manipulate the files) and transparently (the user doesn't know a PHP program
is being executed).
You can view the code, highlighted
by itself of course (recursive computing is fun). It expects to be called as
/path/to/atshi.php/path/to/example.pl
and uses the PATH_INFO
variable to
find the path to the file to be displayed (in the example above,
example.pl
). It uses the GeSHi library for
the actual syntax coloring (which is therefore a dependency), and
theoretically supports any file format/programming language supported by
GeSHi. In practice however, ATSHi detects the files that it should highlight
(source code must be highlighted, but .tar.gz or .jpg must not) by checking
first the filename's extension, or, if the file doesn't have one, checking the
“magic header” (the one starting with #!
) followed by the name of the
interpreter. It also recognizes the filename Makefile
. If it's unable to
recognize the file, it simply sends its content (with proper Content-Type
header) to the browser and lets the latter deal with it. Finally, the
highlighted version also provides a link at the top of the page for
downloading the raw file (atshi.php
sends the raw file instead of the
highlighted version when you append “?src” to the URL).
But this was all quite a simple job, and even if it was my first
PHP program, it was quite simple (PHP is an horrible language, but the doc is
good, which helped a lot). The real problem was getting Apache doing my
bidding. Here's a sample of the .htaccess
I use:
RewriteEngine on RewriteRule ˆlatex/latex.css - [L] RewriteRule ˆpoppikone/poppikone.css - [L] RewriteCond /home/mweber/weber.fi.eu.org/www/$1 -f RewriteRule ˆ((software|leffakone|poppikone|latex)/.*)$ /atshi/atshi.php/$1
The two top RewriteRule
(with the L flag) prevent ATSHi from highlighting the
stylesheets used in the corresponding directories (those stylesheets must be
sent as-is to the browser). The bottom RewriteRule
actually catches specific
paths and rewrite the URL using atshi.php
. Finally, the RewriteCond
just
above allows rewriting only if the path (identified as $1
when the regexp in
the RewriteRule
below is evaluated) is a regular file (highlighting
directories doesn't make sense, does it?); note that you must put an absolute
path in the condition.
The difficult part here was not really to get the URL rewriting properly written (although mentioning the absolute path trick in Apache's doc would have been nice). The really difficult part was to find out that the bloody Firefox always looks in its cache instead of asking the server if something has changed. So after making a change, Firefox still didn't show what was supposed to be showing… Erasing the cache before every test is therefore a must.