Add an HTML-output stylesheet and teach FlatFielder to use it
authorMike Rylander <mrylander@gmail.com>
Wed, 28 Mar 2012 16:14:56 +0000 (12:14 -0400)
committerMike Rylander <mrylander@gmail.com>
Thu, 29 Mar 2012 13:19:10 +0000 (09:19 -0400)
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/src/perlmods/lib/OpenILS/WWW/FlatFielder.pm
Open-ILS/xsl/FlatFielder2HTML.xsl [new file with mode: 0644]

index f8216c1..19c40b4 100644 (file)
@@ -8,11 +8,17 @@ use Apache2::Const -compile => qw(
     OK HTTP_NOT_ACCEPTABLE HTTP_INTERNAL_SERVER_ERROR :log
 );
 use XML::LibXML;
+use XML::LibXSLT;
 use Text::Glob;
 use CGI qw(:all -utf8);
 
 use OpenSRF::Utils::JSON;
 use OpenSRF::AppSession;
+use OpenSRF::Utils::SettingsClient;
+
+
+my $_parser = new XML::LibXML;
+my $_xslt = new XML::LibXSLT;
 
 # BEGIN package globals
 
@@ -21,7 +27,23 @@ use OpenSRF::AppSession;
 # you can weight them to control what matches requests for things like
 # 'application/*'
 
+
+sub html_ish_output {
+    my ($r, $args, $xslt) = @_;
+    $args->{'stylesheet'} =
+        OpenSRF::Utils::SettingsClient->new->config_value(dirs => 'xsl') . $xslt;
+    print data_to_xml($args);
+    return Apache2::Const::OK;
+}
+
 my $_output_handler_dispatch = {
+    "text/html" => {
+        "prio" => 0,
+        "code" => sub {
+            $_[0]->content_type("text/html; charset=utf-8");
+            return html_ish_output( @_, 'FlatFielder2HTML.xsl' );
+        }
+    },
     "application/xml" => {
         "prio" => 0,
         "code" => sub {
@@ -49,6 +71,21 @@ my @_output_handler_types = sort {
 
 # END package globals
 
+=comment
+
+<FlatSearch hint='foo' identifier='bar' label='Foo Bar' FS_key='ad1awe43a3a2a3ra32a23ra32ra23rar23a23r'>
+  <row ordinal='1'>
+    <column name='fiz'>YAY!</column>
+    <column name='faz'>boooo</column>
+  </row>
+  <row ordinal='2'>
+    <column name='fiz'>WHEEE!</column>
+    <column name='faz'>noooo</column>
+  </row>
+</FlatSearch>
+
+=cut
+
 sub data_to_xml {
     my ($args) = @_;
 
@@ -60,10 +97,14 @@ sub data_to_xml {
     $fs->setAttribute("FS_key", $args->{key}) if $args->{key};
     $dom->setDocumentElement($fs);
 
+    my $rownum = 1;
     for my $i (@{$$args{data}}) {
-        my $item = $dom->createElement("item");
+        my $item = $dom->createElement("row");
+        $item->setAttribute('ordinal', $rownum);
+        $rownum++;
         for my $k (keys %$i) {
-            my $val = $dom->createElement($k);
+            my $val = $dom->createElement('column');
+            $val->setAttribute('name', $k);
             $val->appendText($i->{$k});
             $item->addChild($val);
         }
@@ -72,6 +113,13 @@ sub data_to_xml {
 
     # XML::LibXML::Document::toString() returns an encoded byte string, which
     # is why we don't need to binmode STDOUT, ':utf8'.
+
+    return $_xslt->parse_stylesheet(
+        $_parser->parse_file( $$args{stylesheet} )
+    )->transform(
+        $dom
+    )->toString if ($$args{stylesheet}); # configured transform, early return
+
     return $dom->toString();
 }
 
diff --git a/Open-ILS/xsl/FlatFielder2HTML.xsl b/Open-ILS/xsl/FlatFielder2HTML.xsl
new file mode 100644 (file)
index 0000000..c988ba8
--- /dev/null
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+  
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  version="1.0">
+  <xsl:output method="html" doctype-public="-//W3C/DTD HTML 4.01 Transitional//EN" doctype-system="http://www.w3.org/TR/html4/strict.dtd" />    
+
+  <xsl:template match="//FlatSearch">
+    <html>
+        <head>
+            <meta http-equiv="Content-Type" content="text/html" charset="utf-8"/>
+        </head>
+        <body>
+            <table>
+                <tbody>
+                    <xsl:apply-templates select="row[@ordinal='1']"/>
+                    <xsl:apply-templates select="row[not(@ordinal='1')]"/>
+                </tbody>
+            </table>
+        </body>
+    </html>
+  </xsl:template>
+
+  <xsl:template match="row[@ordinal='1']">
+    <tr>
+        <xsl:for-each select="column"><th><xsl:value-of select="@name"/></th></xsl:for-each>
+    <tr>
+    </tr>
+        <xsl:for-each select="column"><td><xsl:value-of select="."/></td></xsl:for-each>
+    </tr>
+  </xsl:template>
+
+   <xsl:template match="row">
+    <tr>
+        <xsl:for-each select="column"><td><xsl:value-of select="."/></td></xsl:for-each>
+    </tr>
+  </xsl:template>
+    
+</xsl:stylesheet>