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 )