#!/usr/bin/perl
#===============================================================================
#     REVISION:  $Id:$
#  DESCRIPTION:  Подсветка исходного кода для языка Perl и shell-кода
#                (по умолчанию - синтаксис bash). CGI-скрипт для использования
#                на сервере.
#
#        USAGE:  http://mysite.ru/sourcehl.cgi?d=[dir]&s=[sourcefile]&l=[language]
#      OPTIONS:  s : [sourcefile] - путь к подсвечиваемому исх. коду
#                l : [language] - язык кода (pl, sh, ... - см. $filetypes)
#                d : [dir] - каталог для поиска файлов 
#
#       AUTHOR:  dimio
#          URL:  http://dimio.org
#      VERSION:  2.02
#      CREATED:  2010-11-27
#LAST_MODIFIED:  2021-04-14
#===============================================================================
# TODO: сделать проверку на существование подсвечиваемого файла

require 5.008_008;
use warnings;
use strict;
use utf8;
use CGI qw (:escpeHTML);
use CGI::Carp 'fatalsToBrowser';
use Text::VimColor;
#========= SYSTEM VARIABLES =========
local $| = 1;
our $VERSION = '2.02';
$CGI::POST_MAX = 1048576*0.5; # Максимальное кол-во данных (в мегабайтах), которое может принять скрипт
$CGI::DISABLE_UPLOADS = 1; # Загрузка файлов в скрипт запрещена
my $YEAR = (localtime)[5]+1900;
our $COPY = '2010-'. $YEAR .' dimio (http://dimio.org)';

#========= INITIALIZING =========
my $opt = set_options();
my $query = CGI->new;

#========= MAIN PROGRAM =========
get_param($opt, $query);

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

my $syntax = Text::VimColor->new(
    vim_options     => [ qw( -RXZ -i NONE -u NONE -N -n ), "+set nomodeline",
                        "+set termencoding=utf-8", "+set encoding=utf-8",
                       ],
    file            => $opt->{src_dir}{$opt->{c_dir}} . $opt->{src_filename},
    filetype        => set_vim_filetype($opt->{src_lang}),
);

# вывод подсвеченного кода
print '
',"$/";
#print $syntax->html;

my $file = $opt->{src_dir}{$opt->{c_dir}} . $opt->{src_filename};
open(FH, '<', $file) or die $!;
while(){
    print $_;
}
close(FH);

print '
'; # вывод окончания html-документа print $query->end_html; exit 0; #========= SUBROUTINES ========== # # В зависимости от параметра $opt->{src_lang} подсвечиваемого файла # устанавливает тип файла для vim sub set_vim_filetype { my $lang = shift; my $filetypes = { pl => 'perl', cgi => 'perl', php => 'php', sh => 'sh', ssh => 'sshconfig', vim => 'vim', xml => 'xml', rc => 'conf', wget => 'wget', js => 'javascript', conk => 'conkyrc', tmux => 'tmux', #motion => 'conf', txt => 'text', ext => 'sh', }; return $filetypes->{$lang} || 'none'; } # создание хэша с базовыми настройками скрипта sub set_options { my $basedir = '/home/ubuntu/public_html/dimioorg/wp-content/uploads'; my %opt = ( js_dir => '/cgi-bin/js', css_files => [ #'/cgi-bin/bps/hlghtsrc/css/perl-syntax.css', #'/cgi-bin/bps/hlghtsrc/css/shell-syntax.css', #'/cgi-bin/bps/hlghtsrc/css/vimcolor.css', '/wp-content/plugins/vimcolor/css/vimcolor.css', ], src_dir => { 'dev' => $basedir . '/devel/', 'conf' => $basedir . '/configs/', 'dc01' => $basedir . '/dcscripts/Automator/', 'dc02' => $basedir . '/dcscripts/Economic/', 'dc03' => $basedir . '/dcscripts/InterfaceImprovements/', }, src_lang => 'pl', src_filename => '', ); return \%opt; } # получение значений параметров get-запроса к скрипту, # их проверка на отсутствие зловредного кода sub get_param { my ($opt, $query) = @_; if ( $query->url_param('s') !~ /^[-._a-z0-9]+$/xi || $query->url_param('l') !~ /^[a-z]{1,4}$/xi || $query->url_param('d') !~ /^[a-z0-9]{1,4}$/xi ) { print $query->br('Error: bad file name or lang type!'), $query->end_html; exit 0; } else { $opt->{src_filename} = $query->url_param('s'); $opt->{src_lang} = $query->url_param('l'); $opt->{c_dir} = $query->url_param('d'); } return 1; } # формирует заголовок 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', -head => [ $query-> Link( { -type => 'image/x-icon', -rel => 'shortcut icon', -href => '/favicon.ico', }), $query-> Link( { -type => 'image/gif', -rel => 'icon', -href => '/favicon.gif', }), ], -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} .'/ya_metrika.js' }, # { -type => 'text/javascript', # -src => $opt->{js_dir} .'/liveinternet-counter.js' }, ], -style => { 'src'=> $opt->{css_files} }, #-BGCOLOR=>'black', ); # dochead end }