use Encode::Plain; $Encode::Plain::utf8 = 1;
-use Time::German ':overwrite_internal_localtime';
+use Time::German qw(localtime);
use XML::DOM;
################################################################################
use constant KEEP_DELETED => 1;
use constant KILL_DELETED => 0;
+use constant FORUM_DTD => 'http://selfforum.sourceforge.net/dtd/forum.dtd';
+
use base qw(Exporter);
@EXPORT_OK = qw(
get_message_header
# create a XML::DOM::Document object of a thread containing one posting
#
# Params: hash reference
-# (dtd, thread, msg, body, ip, name, email, home,
+# (thread, msg, body, ip, name, email, home,
# image, category, subject, time)
#
# Return: XML::DOM::Document object
# set doctype
#
- my $dtd = $xml -> createDocumentType ('Forum' => $par -> {dtd});
+ my $dtd = $xml -> createDocumentType ('Forum' => FORUM_DTD);
$xml -> setDoctype ($dtd);
# create root element 'Forum'
close(FILE) or return;
if (wantarray) {
- ($dtd) = $xml =~ /<!DOCTYPE\s+\S+\s+SYSTEM\s+"([^"]+)">/;
+ $dtd = FORUM_DTD;
($last_thread) = map {/(\d+)/} $xml =~ /<Forum.+?lastThread="([^"]+)"[^>]*>/;
($last_message) = map {/(\d+)/} $xml =~ /<Forum.+?lastMessage="([^"]+)"[^>]*>/;
}
my $reg_msg = qr~(?:</Message>
- |<Message\s+id="m(\d+)"\s+unid="([^"]*)"(?:\s+invisible="([^"]*)")?(?:\s+archive="([^"]*)")?[^>]*>\s*
+ |<Message\s+id="m(\d+)"(?:\s+unid="([^"]*)")?(?:\s+invisible="([^"]*)")?(?:\s+archive="([^"]*)")?[^>]*>\s*
<Header>[^<]*(?:<(?!Name>)[^<]*)*
<Name>([^<]+)</Name>[^<]*(?:<(?!Category>)[^<]*)*
<Category>([^<]*)</Category>\s*
push @stack,$cmno if (defined $cmno);
push @msg, {
mid => $1,
- unid => $2,
+ unid => (defined $2) ? $2 : '',
deleted => $3 || 0,
archive => $4 || 0,
name => $5,
if (defined $cmno)
{
push @{$msg[$cmno] -> {kids}} => $#msg;
- push @{$msg[$cmno] -> {unids}} => $2;
+ push @{$msg[$cmno] -> {unids}} => (defined $2) ? $2 : '#';
}
else
{
- push @unids => $2;
+ push @unids => (defined $2) ? $2 : '';
}
$msg[$_] -> {answers}++ for (@stack);
{
push @msg, {
mid => $1,
- unid => $2,
+ unid => (defined $2) ? $2 : '',
deleted => $3 || 0,
archive => $4 || 0,
name => $5,
if (defined $cmno)
{
push @{$msg[$cmno] -> {kids}} => $#msg;
- push @{$msg[$cmno] -> {unids}} => $2;
+ push @{$msg[$cmno] -> {unids}} => (defined $2) ? $2 : '';
$msg[$cmno] -> {answers}++;
}
else
{
- push @unids => $2;
+ push @unids => (defined $2) ? $2 : '';
}
$msg[$_] -> {answers}++ for (@stack);
my ($level, $thread, $msg);
my $xml =
- '<?xml version="1.0" encoding="UTF-8"?>'."\n"
- . '<!DOCTYPE Forum SYSTEM "'.$param -> {dtd}.'">'."\n"
- . '<Forum lastMessage="m'.$param -> {lastMessage}.'" lastThread="t'.$param -> {lastThread}.'">';
+ '<?xml version="1.0"?>'."\n"
+ . '<!DOCTYPE Forum SYSTEM "'.FORUM_DTD.'">'."\n"
+ . '<Forum lastMessage="m'.($param->{lastMessage} =~ /(\d+)/)[0].'" lastThread="t'.($param->{lastThread} =~ /(\d+)/)[0].'">';
for $thread (sort {$b <=> $a} keys %$threads) {
$xml .= '<Thread id="t'.$thread.'">';
$level = $msg -> {level};
$xml .=
'<Message id="m'.$msg -> {mid}.'"'
- . ' unid="'.$msg -> {unid}.'"'
+ . (($msg -> {unid}) ?' unid="'.$msg -> {unid}.'"':'')
. (($msg -> {deleted})?' invisible="1"':'')
. (($msg -> {archive})?' archive="1"':'')
. '>'