#!/usr/bin/perl -T
#===============================================================================
#     REVISION:  $Id:$
#  DESCRIPTION:  Подсветка исходного кода для языка Perl и shell-кода
#                (по умолчанию - синтаксис bash). CGI-скрипт для использования
#                на сервере.
#
#        USAGE:  http://mysite.ru/sourcehl.cgi?s=<sourcefile>&l=<language>
#
#      OPTIONS:  <sourcefile> - путь к подсвечиваемому исх. коду
#                <language> - язык кода (pl или sh)
#
#       AUTHOR:  dimio
#          URL:  http://www.dimio.org
#      VERSION:  1.0
#      CREATED:  2010-11-27
#===============================================================================
BEGIN {
    my $homedir = ( getpwuid($>) )[7];
    my @user_include;
    foreach my $path (@INC) {
        if ( -d $homedir . '/perl' . $path ) {
            push @user_include, $homedir . '/perl' . $path;
        }
    }
    unshift @INC, @user_include;
}

require 5.8.8;
use warnings;
use strict;
use CGI qw (:escpeHTML);
use CGI::Carp 'fatalsToBrowser';
use Syntax::Highlight::Engine::Simple::Perl;
use Syntax::Highlight::Shell;
#========= SYSTEM VARIABLES =========
$| = 1;
our $VERSION = '1.0';
$CGI::POST_MAX = 1048576*0.5; # Максимальное кол-во данных (в мегабайтах), которое может принять скрипт
$CGI::DISABLE_UPLOADS = 1; # Загрузка файлов в скрипт запрещена
my $YEAR = (localtime)[5]+1900;
our $COPY = '2010-'. $YEAR .' dimio (www.dimio.org)';

#========= INITIALIZING =========
my $opt = set_options();
my $query = CGI->new;
$opt->{src_filename} = $query->url_param('s');
$opt->{src_lang} = $query->url_param('l');

#========= MAIN PROGRAM =========
if ( $opt->{src_filename} !~ /^[\w-.]+$/i || $opt->{src_lang} !~ /^[a-z]{1,4}$/i ) {
    print   $query->br('Error: bad file name or lang type!'),
            $query->end_html;
    exit 0;
}

my ($hlighter, $hl_html);

if ($opt->{src_lang} eq 'pl') { #подсветка для перл-кода
    $hlighter = Syntax::Highlight::Engine::Simple->new(type => 'Perl');
    $hl_html = hlight_perl_src($opt,$hlighter);
}
elsif ($opt->{src_lang} eq 'sh') { #подсветка для шелл-кода
    $hlighter = Syntax::Highlight::Shell->new(pre => 0, nnn => 0);
    $hl_html = hlight_shell_src($opt,$hlighter);
}

print_page_title($query,$opt); #вывод заголовка html-документа

print '<pre class="program_code">';
print $$hl_html; #вывод подсвеченного кода
print '</pre>';

print $query->end_html;
exit 0;

#========= SUBROUTINES =========
sub set_options {
    my %opt = (
            js_dir          => '/cgi-bin/js', #путь к директории с яваскритом
            css_files       => [ qw(
                                /cgi-bin/bps/hlghtsrc/css/perl-syntax.css
                                /cgi-bin/bps/hlghtsrc/css/shell-syntax.css
                               )], #css-файлы для подсветки
            src_dir         => './', #путь к директории с файлами, которые нужно подсветить
            src_lang        => '',
            src_filename    => '',
    );

    return \%opt;
}

sub hlight_shell_src {
    #Выполнение разметки shell-кода для подсветки синтаксиса
    my ($opt,$hlighter) = @_;
    my $src;

    open (SRC,'<', $opt->{src_dir}.$opt->{src_filename})
            or die "Can't open $opt->{src_dir} . $opt->{src_filename} : $!\n";

    {
        local undef $/;
        $src = <SRC>;
    }

    my $hl_html = $hlighter->parse($src);

    close (SRC);

    return \$hl_html;
}

sub hlight_perl_src {
    #Выполнение разметки perl-кода для подсветки синтаксиса
    my ($opt,$hlighter) = @_;

    my $hl_html = $hlighter->doFile(
                file => $opt->{src_dir}.$opt->{src_filename},
                tab_width => 4,
                encode => 'utf8'
            );

    return \$hl_html;
}

sub print_page_title {
   my ($query,$opt) = @_;

   print
        $query->header(
            -type       => 'text/html',
            -charset    => 'utf-8',
        ),
        $query->start_html(
            -title  => $opt->{src_filename} . ' | dimio.org',
            -author => 'dimio@dimio.org',
            -base   => 'true',
            -meta   => {
                     'keywords'     => 'perl syntax highlighter cgi',
                     'copyright'    => $COPY,
                     'version'      => $VERSION,
                     'generator'    => 'Perl syntax highlighter by Dimio',
                        },
            -script => [
                     {  -type => 'text/javascript',
                        -src => $opt->{js_dir} .'/google_analit.js' },
                     {  -type => 'text/javascript',
                        -src => $opt->{js_dir} .'/liveinternet-counter.js' },
                       ],
            -style  =>{ 'src'=> $opt->{css_files} },
            #-BGCOLOR=>'black',
        ); # dochead end
}