AxKit2

 view release on metacpan or  search on metacpan

plugins/spod5  view on Meta::CPAN

use XML::LibXML::SAX::Builder;
use XML::LibXML;
use XML::LibXSLT;
use AxKit2::Utils qw(bytelength);
use AxKit2::Transformer::XSLT;

use constant EZPOD => eval { require XML::Filter::EzPod };

my $xslt   = XML::LibXSLT->new();
my $parser = XML::LibXML->new();
my $pod2s5;
my $add_params;

sub hook_response {
    my ($self) = @_;
    
    my $client = $self->client;
    
    my $file = $client->headers_in->filename;
    $self->log(LOGDEBUG, "request for file $file");
    return DECLINED unless $file =~ /\.(pod|pm)$/;
    return DECLINED unless -f $file;
    
    open(my $fh, $file) || die "Failed to open($file): $!";
    
    my $builder = XML::LibXML::SAX::Builder->new();
    my $handler = $builder;
    if (EZPOD) {
        $self->log(LOGDEBUG, "Using EzPod");
        $handler = XML::Filter::EzPod->new( Handler => $builder );
    }
    my $p = Pod::SAX->new( Handler => $handler );
    $p->parse_file($fh);

    my $doc = $builder->result();
    
    my $base_uri = $client->headers_in->uri . $client->headers_in->path_info;
    
    $base_uri =~ s/[^\/]*$//; # strip filename part
    $base_uri = "http://" . $client->headers_in->header('Host') . "$base_uri";
    
    my %params = (
        base => $base_uri,
        );
    
    my $addp_style = $xslt->parse_stylesheet($parser->parse_string($add_params));
    my $interim = $addp_style->transform($doc, 
                               AxKit2::Transformer::XSLT::fixup_params(%params)
                               );
    
    # print "Interim doc: ", $interim->toString;

    my $stylesheet = $xslt->parse_stylesheet($parser->parse_string($pod2s5));
    my $output = $stylesheet->transform($interim);
    
    my $ct  = $stylesheet->media_type;
    my $enc = $stylesheet->output_encoding;
    my $out = $stylesheet->output_string($output);

    $client->headers_out->header('Content-Length', bytelength($out));
    $client->headers_out->header('Content-Type', "$ct; charset=$enc");
    $client->send_http_headers;
    $client->write($out);
    
    return DONE;
}

$add_params = <<'EOT';
<xsl:stylesheet version="1.0"  
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    >

<xsl:param name="base"/>
<xsl:param name="style">slides.css</xsl:param>
<xsl:param name="uidir">default</xsl:param>

<xsl:template match="/pod">
  <pod>
    <meta>
        <base><xsl:value-of select="$base"/></base>
        <ui-dir><xsl:value-of select="$uidir"/></ui-dir>
        <slides><xsl:value-of select="$style"/></slides>
        <xsl:apply-templates select='meta'/>
    </meta>
    <xsl:apply-templates/>
  </pod>
</xsl:template>

<xsl:template match="meta">
    <xsl:element name="{substring-before(./text(), ' ')}">
        <xsl:value-of select="substring-after(./text(), ' ')"/>
    </xsl:element>
</xsl:template>

<xsl:template match="*|@*">
    <xsl:copy>
      <xsl:apply-templates select="*|@*|node()"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
EOT

$pod2s5 = <<'EOT';
<xsl:stylesheet version="1.0"  
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    >

<xsl:output method="html" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
                          doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
                          indent="yes"/>

<xsl:template match="/pod">
    <html>
    
    <head>
    <title><xsl:value-of select="meta/title"/></title>
    <!-- metadata -->
    <meta name="generator" content="spod5" />
    <meta name="version" content="S5 1.1" />
    <meta name="presdate" content="{meta/presdate}" />



( run in 0.726 second using v1.01-cache-2.11-cpan-39bf76dae61 )