copy current state of medienstaatsvertrag.org, to be verified
This commit is contained in:
227
lib/calcms/template.pm
Normal file
227
lib/calcms/template.pm
Normal file
@@ -0,0 +1,227 @@
|
||||
use warnings "all";
|
||||
use strict;
|
||||
|
||||
package template;
|
||||
use Data::Dumper;
|
||||
use HTML::Template::Compiled;
|
||||
use HTML::Template::Compiled::Plugin::XMLEscape;
|
||||
use JSON;
|
||||
use Cwd;
|
||||
|
||||
use config;
|
||||
use params;
|
||||
use project;
|
||||
use log;
|
||||
use roles;
|
||||
|
||||
require Exporter;
|
||||
our @ISA = qw(Exporter);
|
||||
#our @EXPORT = qw(all);
|
||||
our @EXPORT_OK = qw(check process exit_on_missing_permission clear_cache);
|
||||
our %EXPORT_TAGS = ( 'all' => [ @EXPORT_OK ] );
|
||||
|
||||
sub process{
|
||||
# my $output=$_[0];
|
||||
my $filename=$_[1];
|
||||
my $params=$_[2];
|
||||
|
||||
my $config=$config::config;
|
||||
for my $key (keys %{$config::config->{locations}}){
|
||||
$params->{$key} =$config::config->{locations}->{$key} if ($key=~/\_url$/);
|
||||
}
|
||||
|
||||
# add current project
|
||||
unless (defined $params->{project_title}){
|
||||
my $projects = project::get_with_dates($config, { name => $config->{project} });
|
||||
if (@$projects==1){
|
||||
my $project= $projects->[0];
|
||||
foreach my $key (keys %$project){
|
||||
$params->{'project_'.$key}=$project->{$key};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$params->{user}=$ENV{REMOTE_USER} unless defined $params->{user};
|
||||
|
||||
my $user_permissions=roles::get_user_permissions();
|
||||
for my $permission (keys %$user_permissions){
|
||||
$params->{$permission}=$user_permissions->{$permission} if ($user_permissions->{$permission} eq '1');
|
||||
}
|
||||
|
||||
$params->{jobs}=roles::get_user_jobs();
|
||||
|
||||
log::write($config, 'template',$params) if ($config::config->{system}->{debug}>0);
|
||||
# my $html_template = HTML::Template->new(
|
||||
# filename => $filename,
|
||||
# die_on_bad_params =>0,
|
||||
## cache =>1,
|
||||
## cache_debug => 1
|
||||
# );
|
||||
|
||||
|
||||
if (($filename =~/json\-p/) || (params::isJson)){
|
||||
my $header="Content-type:application/json; charset=utf-8\n\n";
|
||||
my $json=to_json($params, {pretty => 1});
|
||||
# $json=$header.$params->{json_callback}.'['.$json.']';
|
||||
$json=$header.$params->{json_callback}.$json;
|
||||
if((defined $_[0]) && ($_[0]eq'print')){
|
||||
print $json."\n";
|
||||
}else{
|
||||
$_[0]= $json."\n";
|
||||
}
|
||||
return;
|
||||
}
|
||||
#print STDERR $filename."\n";
|
||||
log::error($config, "cannot find template $filename ") unless -e $filename;
|
||||
log::error($config, "cannot read template $filename ") unless -r $filename;
|
||||
|
||||
my $default_escape='0';
|
||||
$default_escape='JS' if ($filename=~/\.js$/);
|
||||
$default_escape='JS' if ($filename=~/\.json$/);
|
||||
$default_escape='HTML_ALL' if ($filename=~/\.html$/);
|
||||
|
||||
my $html_template=undef;
|
||||
|
||||
unless ($filename=~/\.xml$/){
|
||||
$html_template = HTML::Template::Compiled->new(
|
||||
filename => $filename,
|
||||
die_on_bad_params => 0,
|
||||
case_sensitive => 0,
|
||||
loop_context_vars => 0,
|
||||
global_vars => 0,
|
||||
tagstyle => '-asp -comment',
|
||||
default_escape => $default_escape,
|
||||
cache => 0,
|
||||
utf8 => 1,
|
||||
);
|
||||
}else{
|
||||
$html_template = HTML::Template::Compiled->new(
|
||||
filename => $filename,
|
||||
die_on_bad_params => 0,
|
||||
case_sensitive => 1,
|
||||
loop_context_vars => 0,
|
||||
global_vars => 0,
|
||||
tagstyle => '-asp -comment',
|
||||
default_escape => 'XML',
|
||||
plugin => [qw(HTML::Template::Compiled::Plugin::XMLEscape)],
|
||||
utf8 => 1
|
||||
);
|
||||
}
|
||||
|
||||
#$params=
|
||||
setRelativeUrls($params,0) unless (defined $params->{extern}) && ($params->{extern} eq '1');
|
||||
|
||||
# HTML::Template::Compiled->preload($cache_dir);
|
||||
$html_template->param($params);
|
||||
if((defined $_[0]) && ($_[0]eq'print')){
|
||||
print $html_template->output;
|
||||
}else{
|
||||
$_[0]=$html_template->output;
|
||||
}
|
||||
}
|
||||
|
||||
# set relative urls in nested params structure
|
||||
sub setRelativeUrls{
|
||||
my $params=shift;
|
||||
my $depth=shift || 0;
|
||||
|
||||
#print STDERR "setRelativeUrls depth:$depth ".ref($params)."\n";
|
||||
|
||||
return unless defined $params;
|
||||
|
||||
if ($depth>10){
|
||||
print STDERR "prevent deep recursion in template::setRelativeUrls()\n";
|
||||
return ;
|
||||
}
|
||||
|
||||
# set recursive for hash
|
||||
if (ref($params) eq 'HASH'){
|
||||
for my $key (keys %$params){
|
||||
#next unless ($key eq 'icon') || ($key eq 'thumb');
|
||||
my $val=$params->{$key};
|
||||
next unless defined $val;
|
||||
if (ref($val) eq ''){
|
||||
# make link relative
|
||||
$params->{$key} =~s/^https?\:(\/\/[^\/]+)/$1/;
|
||||
}elsif ( (ref($val) eq 'HASH') || (ref($val) eq 'ARRAY') ){
|
||||
setRelativeUrls($params->{$key}, $depth+1);
|
||||
}
|
||||
}
|
||||
return $params;
|
||||
}
|
||||
|
||||
# set recursive for arrays
|
||||
if (ref($params) eq 'ARRAY'){
|
||||
for my $i (0..@$params){
|
||||
my $val=$params->[$i];
|
||||
next unless defined $val;
|
||||
if ( (ref($val) eq 'HASH') || (ref($val) eq 'ARRAY') ){
|
||||
setRelativeUrls($params->[$i], $depth+1);
|
||||
}
|
||||
}
|
||||
return $params;
|
||||
}
|
||||
|
||||
return $params;
|
||||
}
|
||||
|
||||
#requires read config
|
||||
sub check{
|
||||
my $template=shift||'';
|
||||
my $default=shift;
|
||||
|
||||
if($template =~/json\-p/){
|
||||
$template=~s/[^a-zA-Z0-9\-\_\.]//g;
|
||||
$template=~s/\.{2,99}/\./g;
|
||||
return $template;
|
||||
}
|
||||
|
||||
my $config=$config::config;
|
||||
if ($template eq''){
|
||||
$template=$default;
|
||||
}else{
|
||||
$template=~s/^\.\///gi;
|
||||
#template does use ';' in filename
|
||||
log::error($config, 'invalid template!') if ($template=~/;/);
|
||||
#template does use '..' in filename
|
||||
log::error($config, 'invalid template!') if ($template=~/\.\./);
|
||||
}
|
||||
#print STDERR $config::config->{cache}->{compress}."<.compres default:$template\n";
|
||||
$template=(split(/\//,$template))[-1];
|
||||
my $cwd=getcwd();
|
||||
|
||||
$template.='.html' unless ($template=~/\./);
|
||||
if (($config::config->{cache}->{compress}eq'1') && (-e $cwd.'/templates/compressed/'.$template)){
|
||||
$template=$cwd.'/templates/compressed/'.$template;
|
||||
}elsif (-e $cwd.'/templates/'.$template){
|
||||
$template=$cwd.'/templates/'.$template;
|
||||
}else{
|
||||
log::error($config, "template not found: '$cwd/$template'");
|
||||
|
||||
}
|
||||
|
||||
log::error($config, "missing permission to read template '$template'") unless (-r $template);
|
||||
return $template;
|
||||
}
|
||||
|
||||
#deprecated (for old admin only)
|
||||
sub exit_on_missing_permission{
|
||||
my $permission=shift;
|
||||
my $user_permissions=roles::get_user_permissions();
|
||||
if ($user_permissions->{$permission} ne '1'){
|
||||
print STDERR "missing permission to $permission\n";
|
||||
template::process('print', template::check('default.html'), {error => 'sorry, missing permission!'});
|
||||
die();
|
||||
#exit;
|
||||
}
|
||||
}
|
||||
|
||||
sub clear_cache{
|
||||
HTML::Template::Compiled->clear_cache();
|
||||
# return;
|
||||
# my $html_template = HTML::Template::Compiled->new();
|
||||
# $html_template->clear_cache();
|
||||
}
|
||||
|
||||
#do not delete last line!
|
||||
1;
|
||||
Reference in New Issue
Block a user