#!/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: 2023-07-09
#===============================================================================
# TODO: сделать проверку на существование подсвечиваемого файла
require 5.008_008;
use warnings;
use strict;
use utf8;
use CGI qw (:escpeHTML);
use CGI::Carp 'fatalsToBrowser';
use Text::VimColor;
use File::Basename;
#========= 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',
snippet => 'java'
};
return $filetypes->{$lang} || 'none';
}
# создание хэша с базовыми настройками скрипта
sub set_options {
#my $basedir = '/home/ubuntu/public_html/dimioorg/wp-content/uploads';
my $basedir = dirname(__FILE__) . '/../../../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
}