#!/usr/bin/perl -w

# Copyright 2001-2006 The Apache Software Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

=head1 NAME

doc_viewer - A pod viewer for the local AxKit2 docs

=head1 SYNOPSIS

  <Location /docs>
  Plugin doc_viewer
  </Location>

=head1 DESCRIPTION

This plugin uses Pod::SAX to turn the local POD docs into XML for rendering in
the browser.

=cut

use Pod::SAX;
use XML::LibXML::SAX::Builder;

sub hook_xmlresponse {
    my ($self, $input) = @_;
    
    my $uri = $self->client->headers_in->request_uri();
    
    $self->log(LOGDEBUG, "request for $uri");
    
    $uri =~ s/\/docs//;
    
    # map URI to path
    if ($uri eq '/') {
        $uri = 'lib/AxKit2.pm';
    }
    elsif ($uri =~ /::/) {
        $uri =~ s/^\///;
        my $module = $uri;
        $uri = "lib/$uri" unless $uri =~ /plugins::/;
        $uri =~ s/::/\//g;
        if    (-e "${uri}.pm") { $uri .= '.pm' }
        elsif (-e "${uri}.pod") { $uri .= '.pod' }
        else {
            die "Invalid module name: $module" if $module =~ /[^\w:]/;
            chomp($uri = `perldoc -l '$module'`);
        }
        if ($uri !~ /\//) {
            return NOT_FOUND;
        }
    }
    else {
        # Ignore?
        # die "Unsupported URL: $uri";
        return NOT_FOUND;
    }
    
    my $builder = XML::LibXML::SAX::Builder->new();
    my $p = Pod::SAX->new( Handler => $builder );
    
    open(my $fh, $uri) || die "Failed to open($uri): $!";
    $p->parse_file($fh);
    
    my $doc = $builder->result();
    
    $input->dom($doc);
    
    my $out = $input->transform(XSLT('demo/xslt/main.xsl'));

    return OK, $out;
}
