| 100 | | if ($self->{software_name}) |
| 101 | | { |
| 102 | | $rss .= qq{<foaf:maker> |
| 103 | | <doap:Project> |
| 104 | | <doap:name>} . $self->{software_name} . qq{</doap:name>\n}; |
| 105 | | } |
| 106 | | |
| 107 | | if ($self->{software_name} && $self->{software_homepage}) |
| 108 | | { |
| 109 | | $rss .= qq{ <doap:homepage rdf:resource="} . $self->{software_homepage} . qq{" />\n}; |
| 110 | | } |
| 111 | | |
| 112 | | if ($self->{software_name} && $self->{software_version}) |
| 113 | | { |
| 114 | | $rss .= qq{ <doap:release> |
| | 95 | if ($self->{software_name}) { |
| | 96 | $rss .= qq{<foaf:maker> |
| | 97 | <doap:Project> |
| | 98 | <doap:name>} . $self->{software_name} . qq{</doap:name>\n}; |
| | 99 | } |
| | 100 | |
| | 101 | if ($self->{software_name} && $self->{software_homepage}) { |
| | 102 | $rss .= qq{ <doap:homepage rdf:resource="} . $self->{software_homepage} . qq{" />\n}; |
| | 103 | } |
| | 104 | |
| | 105 | if ($self->{software_name} && $self->{software_version}) { |
| | 106 | $rss .= qq{ <doap:release> |
| 167 | | $rss .= $self->build_feed_mid($feed_timestamp); |
| 168 | | |
| 169 | | # Generate the items list, and the individiual item entries |
| 170 | | my (@urls, @items); |
| 171 | | foreach my $node (@nodes) |
| 172 | | { |
| 173 | | my $node_name = $node->{name}; |
| 174 | | |
| 175 | | my $timestamp = $node->{last_modified}; |
| | 158 | $rss .= $self->build_feed_mid($feed_timestamp); |
| | 159 | |
| | 160 | # Generate the items list, and the individiual item entries |
| | 161 | my (@urls, @items); |
| | 162 | foreach my $node (@nodes) { |
| | 163 | my $node_name = $node->{name}; |
| | 164 | |
| | 165 | my $timestamp = $node->{last_modified}; |
| 182 | | $timestamp = $time->strftime( "%Y-%m-%dT%H:%M:%S$utc_offset" ); |
| 183 | | |
| 184 | | my $author = $node->{metadata}{username}[0] || $node->{metadata}{host}[0] || ''; |
| 185 | | my $description = $node->{metadata}{comment}[0] || ''; |
| 186 | | |
| 187 | | $description .= " [$author]" if $author; |
| 188 | | |
| 189 | | my $version = $node->{version}; |
| 190 | | my $status = (1 == $version) ? 'new' : 'updated'; |
| 191 | | |
| 192 | | my $major_change = $node->{metadata}{major_change}[0]; |
| 193 | | $major_change = 1 unless defined $major_change; |
| 194 | | my $importance = $major_change ? 'major' : 'minor'; |
| 195 | | |
| 196 | | my $url = $self->{make_node_url}->($node_name, $version); |
| 197 | | |
| 198 | | push @urls, qq{ <rdf:li rdf:resource="$url" />\n}; |
| 199 | | |
| 200 | | my $diff_url = ''; |
| | 172 | $timestamp = $time->strftime( "%Y-%m-%dT%H:%M:%S$utc_offset" ); |
| | 173 | |
| | 174 | my $author = $node->{metadata}{username}[0] || $node->{metadata}{host}[0] || ''; |
| | 175 | my $description = $node->{metadata}{comment}[0] || ''; |
| | 176 | |
| | 177 | $description .= " [$author]" if $author; |
| | 178 | |
| | 179 | my $version = $node->{version}; |
| | 180 | my $status = (1 == $version) ? 'new' : 'updated'; |
| | 181 | |
| | 182 | my $major_change = $node->{metadata}{major_change}[0]; |
| | 183 | $major_change = 1 unless defined $major_change; |
| | 184 | my $importance = $major_change ? 'major' : 'minor'; |
| | 185 | |
| | 186 | my $url = $self->{make_node_url}->($node_name, $version); |
| | 187 | |
| | 188 | push @urls, qq{ <rdf:li rdf:resource="$url" />\n}; |
| | 189 | |
| | 190 | my $diff_url = ''; |
| 209 | | if ($self->{make_history_url}) |
| 210 | | { |
| 211 | | $history_url = $self->{make_history_url}->($node_name); |
| 212 | | } |
| 213 | | |
| 214 | | my $node_url = $self->{make_node_url}->($node_name); |
| 215 | | |
| 216 | | my $rdf_url = $node_url; |
| 217 | | $rdf_url =~ s/\?/\?id=/; |
| 218 | | $rdf_url .= ';format=rdf'; |
| 219 | | |
| 220 | | # make XML-clean |
| 221 | | my $title = $node_name; |
| 222 | | $title =~ s/&/&/g; |
| 223 | | $title =~ s/</</g; |
| 224 | | $title =~ s/>/>/g; |
| 225 | | |
| 226 | | # Pop the categories into dublin core subject elements |
| 227 | | # (http://dublincore.org/usage/terms/history/#subject-004) |
| 228 | | # TODO: Decide if we should include the "all categories listing" url |
| 229 | | # as the scheme (URI) attribute? |
| 230 | | my $category_rss = ""; |
| 231 | | if($node->{metadata}->{category}) { |
| 232 | | foreach my $cat (@{ $node->{metadata}->{category} }) { |
| 233 | | $category_rss .= " <dc:subject>$cat</dc:subject>\n"; |
| | 198 | if ($self->{make_history_url}) { |
| | 199 | $history_url = $self->{make_history_url}->($node_name); |
| 235 | | } |
| 236 | | |
| 237 | | # Include geospacial data, if we have it |
| 238 | | my $geo_rss = $self->format_geo($node->{metadata}); |
| 239 | | |
| 240 | | push @items, qq{ |
| | 201 | |
| | 202 | my $node_url = $self->{make_node_url}->($node_name); |
| | 203 | |
| | 204 | my $rdf_url = $node_url; |
| | 205 | $rdf_url =~ s/\?/\?id=/; |
| | 206 | $rdf_url .= ';format=rdf'; |
| | 207 | |
| | 208 | # make XML-clean |
| | 209 | my $title = $node_name; |
| | 210 | $title =~ s/&/&/g; |
| | 211 | $title =~ s/</</g; |
| | 212 | $title =~ s/>/>/g; |
| | 213 | |
| | 214 | # Pop the categories into dublin core subject elements |
| | 215 | # (http://dublincore.org/usage/terms/history/#subject-004) |
| | 216 | # TODO: Decide if we should include the "all categories listing" url |
| | 217 | # as the scheme (URI) attribute? |
| | 218 | my $category_rss = ""; |
| | 219 | if($node->{metadata}->{category}) { |
| | 220 | foreach my $cat (@{ $node->{metadata}->{category} }) { |
| | 221 | $category_rss .= " <dc:subject>$cat</dc:subject>\n"; |
| | 222 | } |
| | 223 | } |
| | 224 | |
| | 225 | # Include geospacial data, if we have it |
| | 226 | my $geo_rss = $self->format_geo($node->{metadata}); |
| | 227 | |
| | 228 | push @items, qq{ |
| 299 | | $rss .= $self->build_feed_mid($feed_timestamp); |
| 300 | | |
| 301 | | # Generate the items list, and the individiual item entries |
| 302 | | my (@urls, @items); |
| 303 | | foreach my $node (@nodes) |
| 304 | | { |
| 305 | | my $node_name = $node->{name}; |
| 306 | | |
| 307 | | my $url = $self->{make_node_url}->($node_name); |
| 308 | | |
| 309 | | push @urls, qq{ <rdf:li rdf:resource="$url" />\n}; |
| 310 | | |
| 311 | | my $rdf_url = $url; |
| 312 | | $rdf_url =~ s/\?/\?id=/; |
| 313 | | $rdf_url .= ';format=rdf'; |
| 314 | | |
| 315 | | # make XML-clean |
| 316 | | my $title = $node_name; |
| 317 | | $title =~ s/&/&/g; |
| 318 | | $title =~ s/</</g; |
| 319 | | $title =~ s/>/>/g; |
| 320 | | |
| 321 | | # What location stuff do we have? |
| 322 | | my $geo_rss = $self->format_geo($node); |
| 323 | | |
| 324 | | push @items, qq{ |
| | 287 | $rss .= $self->build_feed_mid($feed_timestamp); |
| | 288 | |
| | 289 | # Generate the items list, and the individiual item entries |
| | 290 | my (@urls, @items); |
| | 291 | foreach my $node (@nodes) { |
| | 292 | my $node_name = $node->{name}; |
| | 293 | |
| | 294 | my $url = $self->{make_node_url}->($node_name); |
| | 295 | |
| | 296 | push @urls, qq{ <rdf:li rdf:resource="$url" />\n}; |
| | 297 | |
| | 298 | my $rdf_url = $url; |
| | 299 | $rdf_url =~ s/\?/\?id=/; |
| | 300 | $rdf_url .= ';format=rdf'; |
| | 301 | |
| | 302 | # make XML-clean |
| | 303 | my $title = $node_name; |
| | 304 | $title =~ s/&/&/g; |
| | 305 | $title =~ s/</</g; |
| | 306 | $title =~ s/>/>/g; |
| | 307 | |
| | 308 | # What location stuff do we have? |
| | 309 | my $geo_rss = $self->format_geo($node); |
| | 310 | |
| | 311 | push @items, qq{ |