package BlogEntry;
use strict;
use BBCode;
use LWP::Simple;
use HTML::Entities;
use URI::Escape;
use Encode;
our $Error_str = '';
my %fieldset = ( "SID" => 'Session-ID',
"MID" => 'Message-ID',
"AUTHOR" => 'Autor',
"EMAIL" => 'E-Mail',
"URL" => 'Homepage',
"MSG" => 'Kommentar',
"DATE" => 'Datum'
);
my %commands = ( "SID" => \&_check_RE,
"MID" => \&_check_RE,
"AUTHOR" => \&_parse_UTF8,
"EMAIL" => \&_validate_Email,
"URL" => \&_validate_URL,
"MSG" => \&_parse_msg,
"DATE" => \&_check_RE,
);
my %RE = ( "SID" => '[a-zA-Z0-9-_]{16}',
"MID" => '\d{5}',
"AUTHOR" => '[a-zA-ZäöüÄÖÜß,.;:_!"§ -]+',
"DATE" => '\d{4}-\d{2}-\d{2}\s{1}\d{2}:\d{2}:\d{2}'
);
my %exceptions;
@exceptions{"submit", "preview"} = ();
# Objektkonstruktor
sub new {
my $Objekt = shift;
my $Referenz = {};
bless($Referenz,$Objekt);
$Referenz->_init();
return($Referenz);
}
# Neue Eigenschaften hinzufuegen
sub add_properties {
my $Objekt = shift;
my %props = ( @_ );
while(my ($schl, $wert) = each(%props)) {
if(exists($fieldset{$schl})) {
if($schl eq 'EMAIL' || $schl eq 'URL') {
if(length($wert) > 0) {
$Objekt->{$schl} = $wert;
}
}
else {
$Objekt->{$schl} = $wert;
}
}
}
}
# Eingaben pruefen
sub parse_input {
my @test;
my $Objekt = shift;
if(@_) { @test = @_ };
foreach(@test) {
if( exists($fieldset{$_}) ) {
my $ret = $commands{$_}->($_, $Objekt->{$_});
if (!$ret or $ret eq 'invalid') {
$Error_str .= "Der für $fieldset{$_} ($Objekt->{$_}) eingetragene Wert ist ungültig.
";
}
$Objekt->{$_} = $ret;
}
else {
if( !exists($exceptions{$_}) ) { $Error_str .= "Das Objekt hat keine Eigenschaft $_.
" };
}
}
$Error_str ne '' ? return $Error_str : return undef;
}
# Eigenschaften vorbelegen
sub _init {
my $Objekt = shift;
$Objekt->{SID} = '';
$Objekt->{MID} = '';
$Objekt->{AUTHOR} = '';
$Objekt->{EMAIL} = '';
$Objekt->{URL} = '';
$Objekt->{MSG} = '';
$Objekt->{DATE} = _get_datetime();
return $Objekt;
}
# Datum aufbereiten
sub _get_datetime {
my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
$Monat+=1;
$Jahrestag+=1;
$Monat = $Monat < 10 ? $Monat = "0".$Monat : $Monat;
$Monatstag = $Monatstag < 10 ? $Monatstag = "0".$Monatstag : $Monatstag;
$Stunden = $Stunden < 10 ? $Stunden = "0".$Stunden : $Stunden;
$Minuten = $Minuten < 10 ? $Minuten = "0".$Minuten : $Minuten;
$Sekunden = $Sekunden < 10 ? $Sekunden = "0".$Sekunden : $Sekunden;
$Jahr+=1900;
return "$Jahr-$Monat-$Monatstag $Stunden:$Minuten:$Sekunden";
}
# RegExp-Pruefung
sub _check_RE {
my $feld = shift;
my $str = shift;
$str =~ /^$RE{$feld}$/ ? return $str : return undef;
}
# E-Mail Validierung
sub _validate_Email {
my $feld = shift;
my $check = shift;
if($check ne 'none' && $check ne '') {
my $nonascii = "\x80-\xff";
my $nqtext = "[^\\\\$nonascii\015\012\"]";
my $qchar = "\\\\[^$nonascii]";
my $protocol = '(?:mailto:)';
my $normuser = '[a-zA-Z0-9][a-zA-Z0-9_.-]*';
my $quotedstring = "\"(?:$nqtext|$qchar)+\"";
my $user_part = "(?:$normuser|$quotedstring)";
my $dom_mainpart = '[a-zA-Z0-9][a-zA-Z0-9._-]*\\.';
my $dom_subpart = '(?:[a-zA-Z0-9][a-zA-Z0-9._-]*\\.)*';
my $dom_tldpart = '[a-zA-Z]{2,5}';
my $domain_part = "$dom_subpart$dom_mainpart$dom_tldpart";
my $regex = "$protocol?$user_part\@$domain_part";
$check =~ /^$regex$/ ? return $check : return 'invalid';
}
else {
return 'none';
}
}
# URL-Validierung
sub _validate_URL {
my $feld = shift;
my $uri = shift;
if($uri ne 'none' && $uri ne '') {
my $success = get($uri);
defined $success ? return $uri : return 'invalid';
}
else {
return 'none';
}
}
# BBCode in Message parsen
sub _parse_msg {
my $feld = shift;
my $old = shift;
my $msg = _parse_UTF8(0,$old);
my @bbcode_tags = qw(b u i url img);
my $bbc = HTML::BBCode->new( { allowed_tags => [ @bbcode_tags ],
no_html => 1,
linebreaks => 1
}
);
my $html = $bbc->parse($msg);
$html =~ s!(")!"!g;
$html =~ s!(')!'!g;
return $html;
}
sub _parse_UTF8 {
my $mode = shift;
my $str = shift;
return encode_entities(decode_utf8(uri_unescape($str)));
}
1;