| 16 | | sub new |
| 17 | | { |
| 18 | | my $class = shift; |
| 19 | | my $self = {}; |
| 20 | | bless $self, $class; |
| 21 | | |
| 22 | | my %args = @_; |
| 23 | | my $wiki = $args{wiki}; |
| 24 | | |
| 25 | | unless ($wiki && UNIVERSAL::isa($wiki, 'Wiki::Toolkit')) |
| 26 | | { |
| 27 | | croak 'No Wiki::Toolkit object supplied'; |
| 28 | | } |
| 29 | | |
| 30 | | $self->{wiki} = $wiki; |
| 31 | | |
| 32 | | # Mandatory arguments. |
| 33 | | foreach my $arg (qw/site_name site_url make_node_url atom_link/) |
| 34 | | { |
| 35 | | croak "No $arg supplied" unless $args{$arg}; |
| 36 | | $self->{$arg} = $args{$arg}; |
| 37 | | } |
| 38 | | |
| 39 | | # Must-supply-one-of arguments |
| 40 | | my %mustoneof = ( 'html_equiv_link' => ['html_equiv_link','recent_changes_link'] ); |
| 41 | | $self->handle_supply_one_of(\%mustoneof,\%args); |
| 42 | | |
| 43 | | # Optional arguments. |
| 44 | | foreach my $arg (qw/site_description software_name software_version software_homepage encoding/) |
| 45 | | { |
| 46 | | $self->{$arg} = $args{$arg} || ''; |
| 47 | | } |
| 48 | | |
| 49 | | # Supply some defaults, if a blank string isn't what we want |
| 50 | | unless($self->{encoding}) { |
| 51 | | $self->{encoding} = $self->{wiki}->store->{_charset}; |
| 52 | | } |
| 53 | | |
| 54 | | $self->{timestamp_fmt} = $Wiki::Toolkit::Store::Database::timestamp_fmt; |
| 55 | | $self->{utc_offset} = strftime "%z", localtime; |
| 56 | | $self->{utc_offset} =~ s/(..)(..)$/$1:$2/; |
| 57 | | |
| 58 | | # Escape any &'s in the urls |
| 59 | | foreach my $key qw(site_url atom_link) { |
| 60 | | my @ands = ($self->{$key} =~ /(\&.{1,6})/g); |
| 61 | | foreach my $and (@ands) { |
| 62 | | if($and ne "&") { |
| 63 | | my $new_and = $and; |
| 64 | | $new_and =~ s/\&/\&/; |
| 65 | | $self->{$key} =~ s/$and/$new_and/; |
| | 16 | sub new { |
| | 17 | my $class = shift; |
| | 18 | my $self = {}; |
| | 19 | bless $self, $class; |
| | 20 | |
| | 21 | my %args = @_; |
| | 22 | my $wiki = $args{wiki}; |
| | 23 | |
| | 24 | unless ($wiki && UNIVERSAL::isa($wiki, 'Wiki::Toolkit')) { |
| | 25 | croak 'No Wiki::Toolkit object supplied'; |
| | 26 | } |
| | 27 | |
| | 28 | $self->{wiki} = $wiki; |
| | 29 | |
| | 30 | # Mandatory arguments. |
| | 31 | foreach my $arg (qw/site_name site_url make_node_url atom_link/) { |
| | 32 | croak "No $arg supplied" unless $args{$arg}; |
| | 33 | $self->{$arg} = $args{$arg}; |
| | 34 | } |
| | 35 | |
| | 36 | # Must-supply-one-of arguments |
| | 37 | my %mustoneof = ( 'html_equiv_link' => ['html_equiv_link','recent_changes_link'] ); |
| | 38 | $self->handle_supply_one_of(\%mustoneof,\%args); |
| | 39 | |
| | 40 | # Optional arguments. |
| | 41 | foreach my $arg (qw/site_description software_name software_version software_homepage encoding/) { |
| | 42 | $self->{$arg} = $args{$arg} || ''; |
| | 43 | } |
| | 44 | |
| | 45 | # Supply some defaults, if a blank string isn't what we want |
| | 46 | unless($self->{encoding}) { |
| | 47 | $self->{encoding} = $self->{wiki}->store->{_charset}; |
| | 48 | } |
| | 49 | |
| | 50 | $self->{timestamp_fmt} = $Wiki::Toolkit::Store::Database::timestamp_fmt; |
| | 51 | $self->{utc_offset} = strftime "%z", localtime; |
| | 52 | $self->{utc_offset} =~ s/(..)(..)$/$1:$2/; |
| | 53 | |
| | 54 | # Escape any &'s in the urls |
| | 55 | foreach my $key qw(site_url atom_link) { |
| | 56 | my @ands = ($self->{$key} =~ /(\&.{1,6})/g); |
| | 57 | foreach my $and (@ands) { |
| | 58 | if($and ne "&") { |
| | 59 | my $new_and = $and; |
| | 60 | $new_and =~ s/\&/\&/; |
| | 61 | $self->{$key} =~ s/$and/$new_and/; |
| | 62 | } |
| 81 | | my ($self,$atom_timestamp) = @_; |
| 82 | | |
| 83 | | my $generator = ''; |
| 84 | | |
| 85 | | if ($self->{software_name}) |
| 86 | | { |
| 87 | | $generator = ' <generator'; |
| 88 | | $generator .= ' uri="' . $self->{software_homepage} . '"' if $self->{software_homepage}; |
| 89 | | $generator .= ' version=' . $self->{software_version} . '"' if $self->{software_version}; |
| 90 | | $generator .= ">\n"; |
| 91 | | $generator .= $self->{software_name} . "</generator>\n"; |
| 92 | | } |
| 93 | | |
| 94 | | my $subtitle = $self->{site_description} |
| | 77 | my ($self,$atom_timestamp) = @_; |
| | 78 | |
| | 79 | my $generator = ''; |
| | 80 | |
| | 81 | if ($self->{software_name}) { |
| | 82 | $generator = ' <generator'; |
| | 83 | $generator .= ' uri="' . $self->{software_homepage} . '"' if $self->{software_homepage}; |
| | 84 | $generator .= ' version=' . $self->{software_version} . '"' if $self->{software_version}; |
| | 85 | $generator .= ">\n"; |
| | 86 | $generator .= $self->{software_name} . "</generator>\n"; |
| | 87 | } |
| | 88 | |
| | 89 | my $subtitle = $self->{site_description} |
| 137 | | my ($self,$atom_timestamp,@nodes) = @_; |
| 138 | | |
| 139 | | my $atom = $self->build_feed_start($atom_timestamp); |
| 140 | | |
| 141 | | my (@urls, @items); |
| 142 | | |
| 143 | | foreach my $node (@nodes) |
| 144 | | { |
| 145 | | my $node_name = $node->{name}; |
| 146 | | |
| 147 | | my $item_timestamp = $node->{last_modified}; |
| | 132 | my ($self,$atom_timestamp,@nodes) = @_; |
| | 133 | |
| | 134 | my $atom = $self->build_feed_start($atom_timestamp); |
| | 135 | |
| | 136 | my (@urls, @items); |
| | 137 | |
| | 138 | foreach my $node (@nodes) { |
| | 139 | my $node_name = $node->{name}; |
| | 140 | |
| | 141 | my $item_timestamp = $node->{last_modified}; |
| 154 | | $item_timestamp = $time->strftime( "%Y-%m-%dT%H:%M:%S$utc_offset" ); |
| 155 | | |
| 156 | | my $author = $node->{metadata}{username}[0] || $node->{metadata}{host}[0] || 'Anonymous'; |
| 157 | | my $description = $node->{metadata}{comment}[0] || 'No description given for node'; |
| 158 | | |
| 159 | | $description .= " [$author]" if $author; |
| 160 | | |
| 161 | | my $version = $node->{version}; |
| 162 | | my $status = (1 == $version) ? 'new' : 'updated'; |
| 163 | | |
| 164 | | my $major_change = $node->{metadata}{major_change}[0]; |
| 165 | | $major_change = 1 unless defined $major_change; |
| 166 | | my $importance = $major_change ? 'major' : 'minor'; |
| 167 | | |
| 168 | | my $url = $self->{make_node_url}->($node_name, $version); |
| 169 | | |
| 170 | | # make XML-clean |
| 171 | | my $title = $node_name; |
| 172 | | $title =~ s/&/&/g; |
| 173 | | $title =~ s/</</g; |
| 174 | | $title =~ s/>/>/g; |
| 175 | | |
| 176 | | # Pop the categories into atom:category elements (4.2.2) |
| 177 | | # We can do this because the spec says: |
| 178 | | # "This specification assigns no meaning to the content (if any) |
| 179 | | # of this element." |
| 180 | | # TODO: Decide if we should include the "all categories listing" url |
| 181 | | # as the scheme (URI) attribute? |
| 182 | | my $category_atom = ""; |
| 183 | | if($node->{metadata}->{category}) { |
| 184 | | foreach my $cat (@{ $node->{metadata}->{category} }) { |
| 185 | | $category_atom .= " <category term=\"$cat\" />\n"; |
| | 148 | $item_timestamp = $time->strftime( "%Y-%m-%dT%H:%M:%S$utc_offset" ); |
| | 149 | |
| | 150 | my $author = $node->{metadata}{username}[0] || $node->{metadata}{host}[0] || 'Anonymous'; |
| | 151 | my $description = $node->{metadata}{comment}[0] || 'No description given for node'; |
| | 152 | |
| | 153 | $description .= " [$author]" if $author; |
| | 154 | |
| | 155 | my $version = $node->{version}; |
| | 156 | my $status = (1 == $version) ? 'new' : 'updated'; |
| | 157 | |
| | 158 | my $major_change = $node->{metadata}{major_change}[0]; |
| | 159 | $major_change = 1 unless defined $major_change; |
| | 160 | my $importance = $major_change ? 'major' : 'minor'; |
| | 161 | |
| | 162 | my $url = $self->{make_node_url}->($node_name, $version); |
| | 163 | |
| | 164 | # make XML-clean |
| | 165 | my $title = $node_name; |
| | 166 | $title =~ s/&/&/g; |
| | 167 | $title =~ s/</</g; |
| | 168 | $title =~ s/>/>/g; |
| | 169 | |
| | 170 | # Pop the categories into atom:category elements (4.2.2) |
| | 171 | # We can do this because the spec says: |
| | 172 | # "This specification assigns no meaning to the content (if any) |
| | 173 | # of this element." |
| | 174 | # TODO: Decide if we should include the "all categories listing" url |
| | 175 | # as the scheme (URI) attribute? |
| | 176 | my $category_atom = ""; |
| | 177 | if ($node->{metadata}->{category}) { |
| | 178 | foreach my $cat (@{ $node->{metadata}->{category} }) { |
| | 179 | $category_atom .= " <category term=\"$cat\" />\n"; |
| | 180 | } |
| 226 | | my ($self,$atom_timestamp,@nodes) = @_; |
| 227 | | |
| 228 | | my $atom = $self->build_feed_start($atom_timestamp); |
| 229 | | |
| 230 | | my (@urls, @items); |
| 231 | | |
| 232 | | foreach my $node (@nodes) |
| 233 | | { |
| 234 | | my $node_name = $node->{name}; |
| 235 | | |
| 236 | | my $url = $self->{make_node_url}->($node_name); |
| 237 | | |
| 238 | | # make XML-clean |
| 239 | | my $title = $node_name; |
| 240 | | $title =~ s/&/&/g; |
| 241 | | $title =~ s/</</g; |
| 242 | | $title =~ s/>/>/g; |
| 243 | | |
| 244 | | # What location stuff do we have? |
| 245 | | my $geo_atom = $self->format_geo($node); |
| 246 | | |
| 247 | | push @items, qq{ |
| | 220 | my ($self,$atom_timestamp,@nodes) = @_; |
| | 221 | |
| | 222 | my $atom = $self->build_feed_start($atom_timestamp); |
| | 223 | |
| | 224 | my (@urls, @items); |
| | 225 | |
| | 226 | foreach my $node (@nodes) { |
| | 227 | my $node_name = $node->{name}; |
| | 228 | |
| | 229 | my $url = $self->{make_node_url}->($node_name); |
| | 230 | |
| | 231 | # make XML-clean |
| | 232 | my $title = $node_name; |
| | 233 | $title =~ s/&/&/g; |
| | 234 | $title =~ s/</</g; |
| | 235 | $title =~ s/>/>/g; |
| | 236 | |
| | 237 | # What location stuff do we have? |
| | 238 | my $geo_atom = $self->format_geo($node); |
| | 239 | |
| | 240 | push @items, qq{ |