fixing html output (server side now)
authormiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Thu, 9 Mar 2006 18:20:53 +0000 (18:20 +0000)
committermiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Thu, 9 Mar 2006 18:20:53 +0000 (18:20 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@3294 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/src/perlmods/OpenILS/WWW/SuperCat.pm
Open-ILS/src/perlmods/OpenILS/WWW/SuperCat/Feed.pm
Open-ILS/xsl/MARC21slim2ATOM.xsl

index 556fd96..dcb6f95 100644 (file)
@@ -287,19 +287,26 @@ sub bookbag_feed {
        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 }) .
@@ -312,6 +319,7 @@ sub bookbag_feed {
                [ map { $_->target_biblio_record_entry } @{ $bucket->items } ],
                $unapi,
        );
+       $feed->root($root);
 
        $feed->title("Items in Book Bag #".$bucket->id);
        $feed->creator($host);
@@ -425,13 +433,20 @@ sub opensearch_feed {
 
        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;
@@ -472,7 +487,7 @@ sub opensearch_feed {
        $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 '-') {
@@ -499,27 +514,12 @@ sub opensearch_feed {
                [ 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/',
@@ -560,8 +560,15 @@ sub opensearch_feed {
        );
 
        $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'
        );
@@ -611,6 +618,7 @@ sub create_record_feed {
 
 sub entityize {
        my $stuff = NFC(shift());
+       $stuff =~ s/&(?!#.{2,4};|amp;)/&amp;/gso;
        $stuff =~ s/([\x{0080}-\x{fffd}])/sprintf('&#x%X;',ord($1))/sgoe;
        return $stuff;
 }
index e15b841..aa4a553 100644 (file)
@@ -3,6 +3,8 @@ use strict; use warnings;
 use vars qw/$parser/;
 use OpenSRF::EX qw(:try);
 use XML::LibXML;
+use XML::LibXSLT;
+use OpenSRF::Utils::SettingsClient;
 use CGI;
 
 sub new {
@@ -40,6 +42,13 @@ sub base {
        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;
@@ -113,7 +122,7 @@ sub add_item {
        return $entry;
 }
 
-sub toString {
+sub composeDoc {
        my $self = shift;
        for my $root ( $self->{doc}->findnodes($self->{item_xpath}) ) {
                for my $item ( $self->items ) {
@@ -121,7 +130,11 @@ sub toString {
                }
                last;
        }
+}
 
+sub toString {
+       my $self = shift;
+       $self->composeDoc;
        return $self->{doc}->toString(1);
 }
 
@@ -351,17 +364,35 @@ use base 'OpenILS::WWW::SuperCat::Feed::atom';
 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);
 }
 
 
index dbd29db..476732a 100644 (file)
@@ -66,7 +66,7 @@
 
                        <xsl:for-each select="marc:datafield[@tag=260]">
                                <rights type="html">
-                                       <xsl:text>&amp;copy; </xsl:text>
+                                       <xsl:text>&#169; </xsl:text>
                                        <xsl:call-template name="subfieldSelect">
                                                <xsl:with-param name="codes">c</xsl:with-param>
                                        </xsl:call-template>