my $year = (gmtime())[5] + 1900;
my $host = $cgi->virtual_host || $cgi->server_name;
- my $url = $cgi->url(-path_info=>1);
+ my $rel_name = quotemeta($cgi->url(-relative=>1));
+
+ my $add_path = 1;
+ $add_path = 0 if ($cgi->url(-path_info=>1) =~ /$rel_name$/);
+
+ my $url = $cgi->url(-path_info=>$add_path);
my $root = (split 'feed', $url)[0];
my $base = (split 'bookbag', $url)[0] . 'bookbag';
my $path = (split 'bookbag', $url)[1];
my $unapi = (split 'feed', $url)[0] . 'unapi';
+ #warn "URL breakdown: $url ($rel_name) -> $root -> $base -> $path -> $unapi";
my ($id,$type) = reverse split '/', $path;
my $bucket = $actor->request("open-ils.actor.container.public.flesh", 'biblio', $id)->gather(1);
- my $bucket_tag = "tag:$host,$year:record_bucket/$id";
+ return Apache2::Const::NOT_FOUND unless($bucket);
+ my $bucket_tag = "tag:$host,$year:record_bucket/$id";
if ($type eq 'opac') {
print "Location: $base/../../../opac/en-US/skin/default/xml/rresult.xml?rt=list&" .
join('&', map { "rl=" . $_->target_biblio_record_entry } @{ $bucket->items }) .
[ map { $_->target_biblio_record_entry } @{ $bucket->items } ],
$unapi,
);
+ $feed->root($root);
$feed->title("Items in Book Bag #".$bucket->id);
$feed->creator($host);
my $host = $cgi->virtual_host || $cgi->server_name;
- my $url = $cgi->url(-path_info=>1);
+ my $rel_name = quotemeta($cgi->url(-relative=>1));
+
+ my $add_path = 1;
+ $add_path = 0 if ($cgi->url(-path_info=>1) =~ /$rel_name$/);
+
+ my $url = $cgi->url(-path_info=>$add_path);
my $root = (split 'opensearch', $url)[0];
my $base = (split 'opensearch', $url)[0] . 'opensearch';
my $unapi = (split 'opensearch', $url)[0] . 'unapi';
my $path = (split 'opensearch', $url)[1];
+ #warn "URL breakdown: $url ($rel_name) -> $root -> $base -> $path -> $unapi";
+
if ($path =~ m{^/?(1\.\d{1})/(?:([^/]+)/)?([^/]+)/osd.xml}o) {
my $version = $1;
$class = 'keyword' if ($class eq '-');
$terms =~ s/\+/ /go;
- warn "searching for $class -> [$terms] via OS $version, response type $type";
+ #warn "searching for $class -> [$terms] via OS $version, response type $type";
my $org_unit;
if ($org eq '-') {
[ map { $_->[0] } @{$recs->{ids}} ],
$unapi,
);
+ $feed->root($root);
$feed->title("$class search results for [$terms] at ".$org_unit->[0]->name);
$feed->creator($host);
$feed->update_ts(gmtime_ISO8601());
-=head
- my $bucket = $actor->request("open-ils.actor.container.public.flesh", 'biblio', $id)->gather(1);
- my $bucket_tag = "tag:$host,$year:record_bucket/$id";
-
- my $feed = create_record_feed(
- $type,
- [ map { $_->target_biblio_record_entry } @{ $bucket->items } ],
- $unapi,
- );
-
- $feed->link(atom => $id);
- $feed->link(rss2 => $id);
- $feed->link(html => $id);
-
-=cut
-
$feed->_create_node(
$feed->{item_xpath},
'http://a9.com/-/spec/opensearch/1.1/',
);
$feed->link(
+ alternate =>
+ $root . "../$lang/skin/default/xml/rresult.xml?rt=list&" .
+ join('&', map { 'rl=' . $_->[0] } @{$recs->{ids}} ),
+ 'text/xhtml'
+ );
+
+ $feed->link(
opac =>
- $root . "../opac/$lang/skin/default/xml/rresult.xml?rt=list&" .
+ $root . "../$lang/skin/default/xml/rresult.xml?rt=list&" .
join('&', map { 'rl=' . $_->[0] } @{$recs->{ids}} ),
'text/xhtml'
);
sub entityize {
my $stuff = NFC(shift());
+ $stuff =~ s/&(?!#.{2,4};|amp;)/&/gso;
$stuff =~ s/([\x{0080}-\x{fffd}])/sprintf('&#x%X;',ord($1))/sgoe;
return $stuff;
}
use vars qw/$parser/;
use OpenSRF::EX qw(:try);
use XML::LibXML;
+use XML::LibXSLT;
+use OpenSRF::Utils::SettingsClient;
use CGI;
sub new {
return $self->{base};
}
+sub root {
+ my $self = shift;
+ my $root = shift;
+ $self->{root} = $root if ($root);
+ return $self->{root};
+}
+
sub unapi {
my $self = shift;
my $unapi = shift;
return $entry;
}
-sub toString {
+sub composeDoc {
my $self = shift;
for my $root ( $self->{doc}->findnodes($self->{item_xpath}) ) {
for my $item ( $self->items ) {
}
last;
}
+}
+sub toString {
+ my $self = shift;
+ $self->composeDoc;
return $self->{doc}->toString(1);
}
sub new {
my $class = shift;
my $self = $class->SUPER::new;
- $self->{type} = 'application/xml';
+ $self->{type} = 'application/xhtml+xml';
return $self;
}
+our ($_parser, $_xslt, $atom2html_xslt);
sub toString {
my $self = shift;
- my $stuff = $self->SUPER::toString;
my $base = $self->base;
- $stuff =~ s{\n}{\n<?xml-stylesheet href="../../../../os.xsl" type="text/xsl" ?>\n}so;
- return $stuff;
+ my $root = $self->root;
+
+ $self->composeDoc;
+
+ $_parser ||= new XML::LibXML;
+ $_xslt ||= new XML::LibXSLT;
+
+ # parse the MODS xslt ...
+ $atom2html_xslt ||= $_xslt->parse_stylesheet(
+ $_parser->parse_file(
+ OpenSRF::Utils::SettingsClient
+ ->new
+ ->config_value( dirs => 'xsl' ).
+ "/ATOM2XHTML.xsl"
+ )
+ );
+
+ my $new_doc = $atom2html_xslt->transform($self->{doc}, base_dir => "'$root'");
+ return $new_doc->toString(1);
+ return $atom2html_xslt->output_string($new_doc);
}