1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
|
# This code is a part of Slash, and is released under the GPL.
# Copyright 1997-2001 by Open Source Development Network. See README
# and COPYING for more information, or see http://slashcode.com/.
# $Id: XML.pm,v 1.1.2.12 2001/10/21 15:50:58 pudge Exp $
package Slash::XML;
=head1 NAME
Slash::XML - Perl extension for Slash
=head1 SYNOPSIS
use Slash::XML;
xmlDisplay(%data);
=head1 DESCRIPTION
Slash::XML aids in creating XML. Right now, only RSS is supported.
=head1 EXPORTED FUNCTIONS
=cut
use strict;
# use Date::Manip;
use Time::Local;
use Slash;
use Slash::Utility;
use base 'Exporter';
use vars qw($VERSION @EXPORT);
($VERSION) = ' $Revision: 1.1.2.12 $ ' =~ /\$Revision:\s+([^\s]+)/;
@EXPORT = qw(xmlDisplay);
# FRY: There must be layers and layers of old stuff down there!
#========================================================================
=head2 xmlDisplay(TYPE, PARAM [, OPTIONS])
Creates XML data.
=over 4
=item Parameters
=over 4
=item TYPE
The XML type, which determines which XML creation routine to call.
Right now, supports only "rss" which calls XML::RSS::create().
=item PARAM
A hashref of parameters to pass to the XML creation routine.
=item OPTIONS
Hashref of options. Currently supported options are below.
If OPTIONS is the value C<1> instead of a hashref, that will
be the same as if the hashref were C<{ Return =E<gt> 1 }>.
=over 4
=item Return
Boolean for whether to print (false) or return (true) the
processed template data. Default is to print output via
Apache, with full HTML headers.
=back
=back
=item Return value
If OPTIONS-E<gt>{Return} is true, the XML data.
Otherwise, returns true/false for success/failure.
=back
=cut
sub xmlDisplay {
my($type, $param, $opt) = @_;
my $class = "Slash::XML::\U$type";
my $file = "Slash/XML/\U$type\E.pm";
# fix this to check can('create')
if (!exists($INC{$file}) && !eval("require $class")) {
errorLog($@);
return;
}
my $content = $class->create($param);
if (!$content) {
# I don't think we really care, actually ... do we?
# errorLog("$class->create returned no content");
return;
}
if (! ref $opt) {
$opt = $opt == 1 ? { Return => 1 } : {};
}
if ($opt->{Return}) {
return $content;
} else {
my $r = Apache->request;
$r->header_out('Cache-Control', 'private');
$r->content_type('text/xml');
$r->status(200);
$r->send_http_header;
$r->rflush;
$r->print($content);
$r->status(200);
return 1;
}
}
#========================================================================
=head2 date2iso8601([TIME])
Return a standard ISO 8601 time string.
=over 4
=item Parameters
=over 4
=item TIME
Some sort of string in GMT that can be parsed by Date::Parse.
If no TIME given, uses current time.
=back
=item Return value
The time string.
=back
=cut
sub date2iso8601 {
my($self, $time) = @_;
if ($time) { # force to GMT
$time .= ' GMT' unless $time =~ / GMT$/;
} else { # get current seconds
my $t = defined $time ? 0 : time();
$time = scalar localtime($t);
}
# calculate timezone differential from GMT
my $diff = (timelocal(localtime) - timelocal(gmtime)) / 36;
($diff = sprintf '%+0.4d', $diff) =~ s/(\d{2})$/:$1/;
return scalar timeCalc($time, "%Y-%m-%dT%H:%M:%S$diff", 0);
}
#========================================================================
=head2 encode(VALUE [, KEY])
Encodes the data to put it into the XML. Normally will encode
assuming the parsed data will be printed in HTML. See KEY.
=over 4
=item Parameters
=over 4
=item VALUE
Value to be encoded.
=item KEY
If KEY is "link", then data will be encoded so as NOT to assume
the parsed data will be printed in HTML.
=back
=item Return value
The encoded data.
=item Dependencies
See xmlencode() and xmlencode_plain() in Slash::Utility.
=back
=cut
sub encode {
my($self, $value, $key) = @_;
$key ||= '';
my $return = $key eq 'link'
? xmlencode_plain($value)
: xmlencode($value);
return $return;
}
1;
__END__
=head1 SEE ALSO
Slash(3), Slash::Utility(3), XML::Parser(3), XML::RSS(3).
|