# File: shared/Posting/_lib.pm #
# #
# Authors: André Malo <nd@o3media.de>, 2001-03-03 #
-# Frank Schoenmann <fs@tower.de>, 2001-03-02 #
+# Frank Schoenmann <fs@tower.de>, 2001-03-13 #
# #
# Description: Message access interface, time format routines #
# #
use strict;
-use vars qw(@EXPORT_OK);
-use base qw(Exporter);
-
use Encode::Plain; $Encode::Plain::utf8 = 1;
use XML::DOM;
# Export
# ====================================================
-@EXPORT_OK = qw(get_message_header get_message_body get_message_node get_body_node parse_single_thread
- hr_time short_hr_time long_hr_time
- get_all_threads create_forum_xml_string
- save_file);
+use constant SORT_ASCENT => 0; # (young postings first)
+use constant SORT_DESCENT => 1;
+use constant KEEP_DELETED => 1;
+use constant KILL_DELETED => 0;
+
+use base qw(Exporter);
+@Posting::_lib::EXPORT_OK = qw(
+ get_message_header get_message_body get_message_node get_body_node parse_single_thread parse_xml_file
+ hr_time short_hr_time long_hr_time
+ get_all_threads create_forum_xml_string
+ save_file
+ SORT_ASCENT SORT_DESCENT KEEP_DELETED KILL_DELETED
+);
# ====================================================
# Access via XML::DOM
wantarray ? ($mnode, $tnode) : $mnode;
}
+### sub parse_xml_file ($) #####################################################
+#
+# load the specified XML-File and create the DOM tree
+# this sub is only to avoid errors and to centralize the parse process
+#
+# Params: $file filename
+# Return: XML::DOM::Document Object (Document Node) or false
+#
+sub parse_xml_file ($) {
+ my $file = shift;
+ my $xml = eval {
+ local $SIG{__DIE__};
+ new XML::DOM::Parser (KeepCDATA => 1) -> parsefile ($file);
+ };
+
+ return if ($@);
+
+ $xml;
+}
+
###########################
# sub parse_single_thread
#
\@smsg;
}
-### delete_messages () ##########################################################
+### delete_messages () #########################################################
#
# Filter out deleted messages
#
return;
}
-### get_all_threads () ##########################################################
+### get_all_threads () #########################################################
#
# Read and Parse the main file (without any XML-module, they are too slow)
#
# $deleted hold deleted (invisible) messages in result (1) oder not (0)
# $sorted direction of message sort: descending (0) (default) or ascending (1)
# Return: scalar context: hash reference
-# list context: list (\%threads, $last_thread, $last_message, \@unids)
+# list context: list (\%threads, $last_thread, $last_message, $dtd, \@unids)
#
sub get_all_threads ($$;$)
{
my ($file, $deleted, $sorted) = @_;
- my ($last_thread, $last_message, @unids, %threads);
+ my ($last_thread, $last_message, $dtd, @unids, %threads);
local (*FILE, $/);
open FILE, $file or return undef;
if (wantarray)
{
+ ($dtd) = $xml =~ /<!DOCTYPE\s+\S+\s+SYSTEM\s+"([^"]+)">/;
($last_thread) = map {/(\d+)/} $xml =~ /<Forum.+?lastThread="([^"]+)"[^>]*>/;
($last_message) = map {/(\d+)/} $xml =~ /<Forum.+?lastMessage="([^"]+)"[^>]*>/;
}
$threads{$tid} = $smsg if (@$smsg);
}
- wantarray ?
- (\%threads, $last_thread, $last_message, \@unids)
- : \%threads;
+ wantarray
+ ? (\%threads, $last_thread, $last_message, $dtd, \@unids)
+ : \%threads;
}
###########################