From ef7adda6c3a21fbeccdb9603f9f2d88ee5e167d5 Mon Sep 17 00:00:00 2001 From: "Jon Allen (JJ)" Date: Sun, 16 May 2010 14:38:57 +0100 Subject: [PATCH] Moved Perl version drop-down menu to external JavaScript file --- javascript/perlversion.js | 21 + lib/Pod/POM/Node.pm.orig | 599 ----------------------- lib/Pod/POM/View/HTML.pm.orig | 480 ------------------- lib/Pod/POM/View/HTML.pm.patch | 36 -- static/css-20100513.css | 851 +++++++++++++++++++++++++++++++++ syntax.cache | Bin 17583253 -> 17590337 bytes templates/default.tt | 2 +- 7 files changed, 873 insertions(+), 1116 deletions(-) create mode 100644 javascript/perlversion.js delete mode 100644 lib/Pod/POM/Node.pm.orig delete mode 100644 lib/Pod/POM/View/HTML.pm.orig delete mode 100644 lib/Pod/POM/View/HTML.pm.patch create mode 100644 static/css-20100513.css diff --git a/javascript/perlversion.js b/javascript/perlversion.js new file mode 100644 index 0000000..128b34c --- /dev/null +++ b/javascript/perlversion.js @@ -0,0 +1,21 @@ +// perlversion.js - writes Perl version drop-down menu + +function selectPerlVersion(element) { + if (element.value.substring(0,1) == '/') { + location.href = element.value; + } +} + +document.write(''); \ No newline at end of file diff --git a/lib/Pod/POM/Node.pm.orig b/lib/Pod/POM/Node.pm.orig deleted file mode 100644 index ce135b0..0000000 --- a/lib/Pod/POM/Node.pm.orig +++ /dev/null @@ -1,599 +0,0 @@ -#============================================================= -*-Perl-*- -# -# Pod::POM::Node -# -# DESCRIPTION -# Base class for a node in a Pod::POM tree. -# -# AUTHOR -# Andy Wardley -# -# COPYRIGHT -# Copyright (C) 2000-2003 Andy Wardley. All Rights Reserved. -# -# This module is free software; you can redistribute it and/or -# modify it under the same terms as Perl itself. -# -# REVISION -# $Id: Node.pm 60 2009-03-20 12:41:35Z ford $ -# -#======================================================================== - -package Pod::POM::Node; - -require 5.004; - -use strict; -use Pod::POM::Nodes; -use Pod::POM::Constants qw( :all ); -use vars qw( $VERSION $DEBUG $ERROR $NODES $NAMES $AUTOLOAD ); -use constant DUMP_LINE_LENGTH => 80; - -$VERSION = sprintf("%d.%02d", q$Revision: 1.5 $ =~ /(\d+)\.(\d+)/); -$DEBUG = 0 unless defined $DEBUG; -$NODES = { - pod => 'Pod::POM::Node::Pod', - head1 => 'Pod::POM::Node::Head1', - head2 => 'Pod::POM::Node::Head2', - head3 => 'Pod::POM::Node::Head3', - head4 => 'Pod::POM::Node::Head4', - over => 'Pod::POM::Node::Over', - item => 'Pod::POM::Node::Item', - begin => 'Pod::POM::Node::Begin', - for => 'Pod::POM::Node::For', - text => 'Pod::POM::Node::Text', - code => 'Pod::POM::Node::Code', - verbatim => 'Pod::POM::Node::Verbatim', -}; -$NAMES = { - map { ( $NODES->{ $_ } => $_ ) } keys %$NODES, -}; - -# overload stringification to present node via a view -use overload - '""' => 'present', - fallback => 1, - 'bool' => sub { 1 }; - -# alias meta() to metadata() -*meta = \*metadata; - - -#------------------------------------------------------------------------ -# new($pom, @attr) -# -# Constructor method. Returns a new Pod::POM::Node::* object or undef -# on error. First argument is the Pod::POM parser object, remaining -# arguments are node attributes as specified in %ATTRIBS in derived class -# package. -#------------------------------------------------------------------------ - -sub new { - my $class = shift; - my $pom = shift; - my ($type, $attribs, $accept, $key, $value, $default); - - $type = $NAMES->{ $class }; - - { - no strict qw( refs ); - $attribs = \%{"$class\::ATTRIBS"} || [ ]; - $accept = \@{"$class\::ACCEPT"} || [ ]; - unless (defined (%{"$class\::ACCEPT"})) { - %{"$class\::ACCEPT"} = ( - map { ( $_ => $NODES->{ $_ } ) } @$accept, - ); - } - } - - # create object with slots for each acceptable child and overall content - my $self = bless { - type => $type, - content => bless([ ], 'Pod::POM::Node::Content'), - map { ($_ => bless([ ], 'Pod::POM::Node::Content')) } - (@$accept, 'code'), - }, $class; - - # set attributes from arguments - keys %$attribs; # reset hash iterator - while(my ($key, $default) = each %$attribs) { - $value = shift || $default; - return $class->error("$type expected a $key") - unless $value; - $self->{ $key } = $value; - } - - return $self; -} - - -#------------------------------------------------------------------------ -# add($pom, $type, @attr) -# -# Adds a new node as a child element (content) of the current node. -# First argument is the Pod::POM parser object. Second argument is the -# child node type specified by name (e.g. 'head1') which is mapped via -# the $NODES hash to a class name against which new() can be called. -# Remaining arguments are attributes passed to the child node constructor. -# Returns a reference to the new node (child was accepted) or one of the -# constants REDUCE (child terminated node, e.g. '=back' terminates an -# '=over' node), REJECT (child rejected, e.g. '=back' expected to terminate -# '=over' but something else found instead) or IGNORE (node didn't expect -# child and is implicitly terminated). -#------------------------------------------------------------------------ - -sub add { - my $self = shift; - my $pom = shift; - my $type = shift; - my $class = ref $self; - my ($name, $attribs, $accept, $expect, $nodeclass, $node); - - $name = $NAMES->{ $class } - || return $self->error("no name for $class"); - { - no strict qw( refs ); - $accept = \%{"$class\::ACCEPT"}; - $expect = ${"$class\::EXPECT"}; - } - - # SHIFT: accept indicates child nodes that can be accepted; a - # new node is created, added it to content list and node specific - # list, then returned by reference. - - if ($nodeclass = $accept->{ $type }) { - defined($node = $nodeclass->new($pom, @_)) - || return $self->error($nodeclass->error()) - unless defined $node; - push(@{ $self->{ $type } }, $node); - push(@{ $self->{ content } }, $node); - $pom->{in_begin} = 1 if $nodeclass eq 'Pod::POM::Node::Begin'; - return $node; - } - - # REDUCE: expect indicates the token that should terminate this node - if (defined $expect && ($type eq $expect)) { - DEBUG("$name terminated by expected $type\n"); - $pom->{in_begin} = 0 if $name eq 'begin'; - return REDUCE; - } - - # REJECT: expected terminating node was not found - if (defined $expect) { - DEBUG("$name rejecting $type, expecting a terminating $expect\n"); - $self->error("$name expected a terminating $expect"); - return REJECT; - } - - # IGNORE: don't know anything about this node - DEBUG("$name ignoring $type\n"); - return IGNORE; -} - - -#------------------------------------------------------------------------ -# present($view) -# -# Present the node by making a callback on the appropriate method against -# the view object passed as an argument. $Pod::POM::DEFAULT_VIEW is used -# if $view is unspecified. -#------------------------------------------------------------------------ - -sub present { - my ($self, $view, @args) = @_; - $view ||= $Pod::POM::DEFAULT_VIEW; - my $type = $self->{ type }; - my $method = "view_$type"; - DEBUG("presenting method $method to $view\n"); - return $view->$method($self, @args); -} - - -#------------------------------------------------------------------------ -# metadata() -# metadata($key) -# metadata($key, $value) -# -# Returns the metadata hash when called without any arguments. Returns -# the value of a metadata item when called with a single argument. -# Sets a metadata item to a value when called with two arguments. -#------------------------------------------------------------------------ - -sub metadata { - my ($self, $key, $value) = @_; - my $metadata = $self->{ METADATA } ||= { }; - - return $metadata unless defined $key; - - if (defined $value) { - $metadata->{ $key } = $value; - } - else { - $value = $self->{ METADATA }->{ $key }; - return defined $value ? $value - : $self->error("no such metadata item: $key"); - } -} - - -#------------------------------------------------------------------------ -# error() -# error($msg, ...) -# -# May be called as a class or object method to set or retrieve the -# package variable $ERROR (class method) or internal member -# $self->{ _ERROR } (object method). The presence of parameters indicates -# that the error value should be set. Undef is then returned. In the -# abscence of parameters, the current error value is returned. -#------------------------------------------------------------------------ - -sub error { - my $self = shift; - my $errvar; -# use Carp; - - { - no strict qw( refs ); - if (ref $self) { -# my ($pkg, $file, $line) = caller(); -# print STDERR "called from $file line $line\n"; -# croak "cannot get/set error in non-hash: $self\n" -# unless UNIVERSAL::isa($self, 'HASH'); - $errvar = \$self->{ ERROR }; - } - else { - $errvar = \${"$self\::ERROR"}; - } - } - if (@_) { - $$errvar = ref($_[0]) ? shift : join('', @_); - return undef; - } - else { - return $$errvar; - } -} - - -#------------------------------------------------------------------------ -# dump() -# -# Returns a representation of the element and all its children in a -# format useful only for debugging. The structure of the document is -# shown by indentation (inspired by HTML::Element). -#------------------------------------------------------------------------ - -sub dump { - my($self, $depth) = @_; - my $output; - $depth = 0 unless defined $depth; - my $nodepkg = ref $self; - if ($self->isa('REF')) { - $self = $$self; - my $cmd = $self->[CMD]; - my @content = @{ $self->[CONTENT] }; - if ($cmd) { - $output .= (" " x $depth) . $cmd . $self->[LPAREN] . "\n"; - } - foreach my $item (@content) { - if (ref $item) { - $output .= $item->dump($depth+1); # recurse - } - else { # text node - $output .= _dump_text($item, $depth+1); - } - } - if ($cmd) { - $output .= (" " x $depth) . $self->[RPAREN] . "\n", ; - } - } - else { - no strict 'refs'; - my @attrs = sort keys %{"*${nodepkg}::ATTRIBS"}; - $output .= (" " x $depth) . $self->type . "\n"; - foreach my $attr (@attrs) { - if (my $value = $self->{$attr}) { - $output .= (" " x ($depth+1)) . "\@$attr\n"; - - if (ref $value) { - $output .= $value->dump($depth+1); - } - else { - $output .= _dump_text($value, $depth+2); - } - } - } - foreach my $item (@{$self->{content}}) { - if (ref $item) { # element - $output .= $item->dump($depth+1); # recurse - } - else { # text node - $output .= _dump_text($item, $depth+1); - } - } - } - - return $output; -} - -sub _dump_text { - my ($text, $depth) = @_; - - my $output = ""; - my $padding = " " x $depth; - my $max_text_len = DUMP_LINE_LENGTH - length($depth) - 2; - - foreach my $line (split(/\n/, $text)) { - $output .= $padding; - if (length($line) > $max_text_len or $line =~ m<[\x00-\x1F]>) { - # it needs prettyin' up somehow or other - my $x = (length($line) <= $max_text_len) ? $_ : (substr($line, 0, $max_text_len) . '...'); - $x =~ s<([\x00-\x1F])> - <'\\x'.(unpack("H2",$1))>eg; - $output .= qq{"$x"\n}; - } else { - $output .= qq{"$line"\n}; - } - } - return $output; -} - - -#------------------------------------------------------------------------ -# AUTOLOAD -#------------------------------------------------------------------------ - -sub AUTOLOAD { - my $self = shift; - my $name = $AUTOLOAD; - my $item; - - $name =~ s/.*:://; - return if $name eq 'DESTROY'; - -# my ($pkg, $file, $line) = caller(); -# print STDERR "called from $file line $line to return ", ref($item), "\n"; - - return $self->error("can't manipulate \$self") - unless UNIVERSAL::isa($self, 'HASH'); - return $self->error("no such member: $name") - unless defined ($item = $self->{ $name }); - - return wantarray ? ( UNIVERSAL::isa($item, 'ARRAY') ? @$item : $item ) - : $item; -} - - -#------------------------------------------------------------------------ -# DEBUG(@msg) -#------------------------------------------------------------------------ - -sub DEBUG { - print STDERR "DEBUG: ", @_ if $DEBUG; -} - -1; - - - -=head1 NAME - -Pod::POM::Node - base class for a POM node - -=head1 SYNOPSIS - - package Pod::POM::Node::Over; - use base qw( Pod::POM::Node ); - use vars qw( %ATTRIBS @ACCEPT $EXPECT $ERROR ); - - %ATTRIBS = ( indent => 4 ); - @ACCEPT = qw( over item begin for text verbatim ); - $EXPECT = q( back ); - - package main; - my $list = Pod::POM::Node::Over->new(8); - $list->add('item', 'First Item'); - $list->add('item', 'Second Item'); - ... - -=head1 DESCRIPTION - -This documentation describes the inner workings of the Pod::POM::Node -module and gives a brief overview of the relationship between it and -its derived classes. It is intended more as a guide to the internals -for interested hackers than as general user documentation. See -L for information on using the modules. - -This module implements a base class node which is subclassed to -represent different elements within a Pod Object Model. - - package Pod::POM::Node::Over; - use base qw( Pod::POM::Node ); - -The base class implements the new() constructor method to instantiate -new node objects. - - my $list = Pod::POM::Node::Over->new(); - -The characteristics of a node can be specified by defining certain -variables in the derived class package. The C<%ATTRIBS> hash can be -used to denote attributes that the node should accept. In the case of -an C<=over> node, for example, an C attribute can be specified -which otherwise defaults to 4. - - package Pod::POM::Node::Over; - use base qw( Pod::POM::Node ); - use vars qw( %ATTRIBS $ERROR ); - - %ATTRIBS = ( indent => 4 ); - -The new() method will now expect an argument to set the indent value, -or will use 4 as the default if no argument is provided. - - my $list = Pod::POM::Node::Over->new(8); # indent: 8 - my $list = Pod::POM::Node::Over->new( ); # indent: 4 - -If the default value is undefined then the argument is mandatory. - - package Pod::POM::Node::Head1; - use base qw( Pod::POM::Node ); - use vars qw( %ATTRIBS $ERROR ); - - %ATTRIBS = ( title => undef ); - - package main; - my $head = Pod::POM::Node::Head1->new('My Title'); - -If a mandatory argument isn't provided then the constructor will -return undef to indicate failure. The $ERROR variable in the derived -class package is set to contain a string of the form "$type expected a -$attribute". - - # dies with error: "head1 expected a title" - my $head = Pod::POM::Node::Head1->new() - || die $Pod::POM::Node::Head1::ERROR; - -For convenience, the error() subroutine can be called as a class -method to retrieve this value. - - my $type = 'Pod::POM::Node::Head1'; - my $head = $type->new() - || die $type->error(); - -The C<@ACCEPT> package variable can be used to indicate the node types -that are permitted as children of a node. - - package Pod::POM::Node::Head1; - use base qw( Pod::POM::Node ); - use vars qw( %ATTRIBS @ACCEPT $ERROR ); - - %ATTRIBS = ( title => undef ); - @ACCEPT = qw( head2 over begin for text verbatim ); - -The add() method can then be called against a node to add a new child -node as part of its content. - - $head->add('over', 8); - -The first argument indicates the node type. The C<@ACCEPT> list is -examined to ensure that the child node type is acceptable for the -parent node. If valid, the constructor for the relevant child node -class is called passing any remaining arguments as attributes. The -new node is then returned. - - my $list = $head->add('over', 8); - -The error() method can be called against the I node to retrieve -any constructor error generated by the I node. - - my $list = $head->add('over', 8); - die $head->error() unless defined $list; - -If the child node is not acceptable to the parent then the add() -method returns one of the constants IGNORE, REDUCE or REJECT, as -defined in Pod::POM::Constants. These return values are used by the -Pod::POM parser module to implement a simple shift/reduce parser. - -In the most common case, IGNORE is returned to indicate that the -parent node doesn't know anything about the new child node. The -parser uses this as an indication that it should back up through the -parse stack until it finds a node which I accept this child node. -Through this mechanism, the parser is able to implicitly terminate -certain POD blocks. For example, a list item initiated by a C<=item> -tag will I accept another C<=item> tag, but will instead return IGNORE. -The parser will back out until it finds the enclosing C<=over> node -which I accept it. Thus, a new C<=item> implicitly terminates any -previous C<=item>. - -The C<$EXPECT> package variable can be used to indicate a node type -which a parent expects to terminate itself. An C<=over> node, for -example, should always be terminated by a matching C<=back>. When -such a match is made, the add() method returns REDUCE to indicate -successful termination. - - package Pod::POM::Node::Over; - use base qw( Pod::POM::Node ); - use vars qw( %ATTRIBS @ACCEPT $EXPECT $ERROR ); - - %ATTRIBS = ( indent => 4 ); - @ACCEPT = qw( over item begin for text verbatim ); - $EXPECT = q( back ); - - package main; - my $list = Pod::POM::Node::Over->new(); - my $item = $list->add('item'); - $list->add('back'); # returns REDUCE - -If a child node isn't specified in the C<@ACCEPT> list or doesn't match -any C<$EXPECT> specified then REJECT is returned. The parent node sets -an internal error of the form "$type expected a terminating $expect". -The parser uses this to detect missing POD tags. In nearly all cases -the parser is smart enough to fix the incorrect structure and downgrades -any errors to warnings. - - # dies with error 'over expected terminating back' - ref $list->add('head1', 'My Title') # returns REJECT - || die $list->error(); - -Each node contains a 'type' field which contains a simple string -indicating the node type, e.g. 'head1', 'over', etc. The $NODES and -$NAMES package variables (in the base class) reference hash arrays -which map these names to and from package names (e.g. head1 E=E -Pod::POM::Node::Head1). - - print $list->{ type }; # 'over' - -An AUTOLOAD method is provided to access to such internal items for -those who don't like violating an object's encapsulation. - - print $list->type(); - -Nodes also contain a 'content' list, blessed into the -Pod::POM::Node::Content class, which contains the content (child -elements) for the node. The AUTOLOAD method returns this as a list -reference or as a list of items depending on the context in which it -is called. - - my $items = $list->content(); - my @items = $list->content(); - -Each node also contains a content list for each individual child node -type that it may accept. - - my @items = $list->item(); - my @text = $list->text(); - my @vtext = $list->verbatim(); - -The present() method is used to present a node through a particular view. -This simply maps the node type to a method which is then called against the -view object. This is known as 'double dispatch'. - - my $view = 'Pod::POM::View::HTML'; - print $list->present($view); - -The method name is constructed from the node type prefixed by 'view_'. -Thus the following are roughly equivalent. - - $list->present($view); - - $view->view_list($list); - -The benefit of the former over the latter is, of course, that the -caller doesn't need to know or determine the type of the node. The -node itself is in the best position to determine what type it is. - -=head1 AUTHOR - -Andy Wardley Eabw@kfs.orgE - -=head1 COPYRIGHT - -Copyright (C) 2000, 2001 Andy Wardley. All Rights Reserved. - -This module is free software; you can redistribute it and/or -modify it under the same terms as Perl itself. - -=head1 SEE ALSO - -Consult L for a general overview and examples of use. - diff --git a/lib/Pod/POM/View/HTML.pm.orig b/lib/Pod/POM/View/HTML.pm.orig deleted file mode 100644 index 3db3511..0000000 --- a/lib/Pod/POM/View/HTML.pm.orig +++ /dev/null @@ -1,480 +0,0 @@ -#============================================================= -*-Perl-*- -# -# Pod::POM::View::HTML -# -# DESCRIPTION -# HTML view of a Pod Object Model. -# -# AUTHOR -# Andy Wardley -# -# COPYRIGHT -# Copyright (C) 2000 Andy Wardley. All Rights Reserved. -# -# This module is free software; you can redistribute it and/or -# modify it under the same terms as Perl itself. -# -# REVISION -# $Id: HTML.pm 33 2009-03-17 21:10:42Z ford $ -# -#======================================================================== - -package Pod::POM::View::HTML; - -require 5.004; - -use strict; -use Pod::POM::View; -use base qw( Pod::POM::View ); -use vars qw( $VERSION $DEBUG $ERROR $AUTOLOAD ); -use Text::Wrap; - -$VERSION = sprintf("%d.%02d", q$Revision: 1.6 $ =~ /(\d+)\.(\d+)/); -$DEBUG = 0 unless defined $DEBUG; -my $HTML_PROTECT = 0; -my @OVER; - -sub new { - my $class = shift; - my $self = $class->SUPER::new(@_) - || return; - - # initalise stack for maintaining info for nested lists - $self->{ OVER } = []; - - return $self; -} - - -sub view { - my ($self, $type, $item) = @_; - - if ($type =~ s/^seq_//) { - return $item; - } - elsif (UNIVERSAL::isa($item, 'HASH')) { - if (defined $item->{ content }) { - return $item->{ content }->present($self); - } - elsif (defined $item->{ text }) { - my $text = $item->{ text }; - return ref $text ? $text->present($self) : $text; - } - else { - return ''; - } - } - elsif (! ref $item) { - return $item; - } - else { - return ''; - } -} - - -sub view_pod { - my ($self, $pod) = @_; - return "\n\n" - . $pod->content->present($self) - . "\n\n"; -} - - -sub view_head1 { - my ($self, $head1) = @_; - my $title = $head1->title->present($self); - return "

$title

\n\n" - . $head1->content->present($self); -} - - -sub view_head2 { - my ($self, $head2) = @_; - my $title = $head2->title->present($self); - return "

$title

\n" - . $head2->content->present($self); -} - - -sub view_head3 { - my ($self, $head3) = @_; - my $title = $head3->title->present($self); - return "

$title

\n" - . $head3->content->present($self); -} - - -sub view_head4 { - my ($self, $head4) = @_; - my $title = $head4->title->present($self); - return "

$title

\n" - . $head4->content->present($self); -} - - -sub view_over { - my ($self, $over) = @_; - my ($start, $end, $strip); - my $items = $over->item(); - - if (@$items) { - - my $first_title = $items->[0]->title(); - - if ($first_title =~ /^\s*\*\s*/) { - # '=item *' =>
    - $start = "
      \n"; - $end = "
    \n"; - $strip = qr/^\s*\*\s*/; - } - elsif ($first_title =~ /^\s*\d+\.?\s*/) { - # '=item 1.' or '=item 1 ' =>
      - $start = "
        \n"; - $end = "
      \n"; - $strip = qr/^\s*\d+\.?\s*/; - } - else { - $start = "
        \n"; - $end = "
      \n"; - $strip = ''; - } - - my $overstack = ref $self ? $self->{ OVER } : \@OVER; - push(@$overstack, $strip); - my $content = $over->content->present($self); - pop(@$overstack); - - return $start - . $content - . $end; - } - else { - return "
      \n" - . $over->content->present($self) - . "
      \n"; - } -} - - -sub view_item { - my ($self, $item) = @_; - - my $over = ref $self ? $self->{ OVER } : \@OVER; - my $title = $item->title(); - my $strip = $over->[-1]; - - if (defined $title) { - $title = $title->present($self) if ref $title; - $title =~ s/$strip// if $strip; - if (length $title) { - my $anchor = $title; - $anchor =~ s/^\s*|\s*$//g; # strip leading and closing spaces - $anchor =~ s/\W/_/g; - $title = qq{$title}; - } - } - - return '
    1. ' - . "$title\n" - . $item->content->present($self) - . "
    2. \n"; -} - - -sub view_for { - my ($self, $for) = @_; - return '' unless $for->format() =~ /\bhtml\b/; - return $for->text() - . "\n\n"; -} - - -sub view_begin { - my ($self, $begin) = @_; - return '' unless $begin->format() =~ /\bhtml\b/; - $HTML_PROTECT++; - my $output = $begin->content->present($self); - $HTML_PROTECT--; - return $output; -} - - -sub view_textblock { - my ($self, $text) = @_; - return $HTML_PROTECT ? "$text\n" : "

      $text

      \n"; -} - - -sub view_verbatim { - my ($self, $text) = @_; - for ($text) { - s/&/&/g; - s//>/g; - } - return "
      $text
      \n\n"; -} - - -sub view_seq_bold { - my ($self, $text) = @_; - return "$text"; -} - - -sub view_seq_italic { - my ($self, $text) = @_; - return "$text"; -} - - -sub view_seq_code { - my ($self, $text) = @_; - return "$text"; -} - -sub view_seq_file { - my ($self, $text) = @_; - return "$text"; -} - -sub view_seq_space { - my ($self, $text) = @_; - $text =~ s/\s/ /g; - return $text; -} - - -sub view_seq_entity { - my ($self, $entity) = @_; - return "&$entity;" -} - - -sub view_seq_index { - return ''; -} - - -sub view_seq_link { - my ($self, $link) = @_; - - # view_seq_text has already taken care of L - if ($link =~ /^view_seq_link_transform_path($page); - } - - # append the #section if exists - $url .= "#$section" if defined $url and - defined $section and length $section; - - return make_href($url, $linktext); -} - - -# should be sub-classed if extra transformations are needed -# -# for example a sub-class may search for the given page and return a -# relative path to it. -# -# META: where this functionality should be documented? This module -# doesn't have docs section -# -sub view_seq_link_transform_path { - my($self, $page) = @_; - - # right now the default transform doesn't check whether the link - # is not dead (i.e. whether there is a corresponding file. - # therefore we don't link L<>'s other than L - # subclass to change the default (and of course add validation) - - # this is the minimal transformation that will be required if enabled - # $page = "$page.html"; - # $page =~ s|::|/|g; - #print "page $page\n"; - return undef; -} - - -sub make_href { - my($url, $title) = @_; - - if (!defined $url) { - return defined $title ? "$title" : ''; - } - - $title = $url unless defined $title; - #print "$url, $title\n"; - return qq{$title}; -} - - - - -# this code has been borrowed from Pod::Html -my $urls = '(' . join ('|', - qw{ - http - telnet - mailto - news - gopher - file - wais - ftp - } ) . ')'; -my $ltrs = '\w'; -my $gunk = '/#~:.?+=&%@!\-'; -my $punc = '.:!?\-;'; -my $any = "${ltrs}${gunk}${punc}"; - -sub view_seq_text { - my ($self, $text) = @_; - - unless ($HTML_PROTECT) { - for ($text) { - s/&/&/g; - s//>/g; - } - } - - $text =~ s{ - \b # start at word boundary - ( # begin $1 { - $urls : # need resource and a colon - (?!:) # Ignore File::, among others. - [$any] +? # followed by one or more of any valid - # character, but be conservative and - # take only what you need to.... - ) # end $1 } - (?= # look-ahead non-consumptive assertion - [$punc]* # either 0 or more punctuation followed - (?: # followed - [^$any] # by a non-url char - | # or - $ # end of the string - ) # - | # or else - $ # then end of the string - ) - }{$1}igox; - - return $text; -} - - -1; - -=head1 NAME - -Pod::POM::View::HTML - -=head1 DESCRIPTION - -HTML view of a Pod Object Model. - -=head1 METHODS - -=over 4 - -=item C - -=item C - -=item C - -=item C - -=item C - -=item C - -=item C - -=item C - -=item C - -=item C - -=item C - -=item C - -=item C - -=item C - -Returns the text of a CE> sequence enclosed in a Cb> element. - -=item C - -Returns the text of a CE> sequence enclosed in a Ci> element. - -=item C - -Returns the text of a CE> sequence enclosed in a Ccode> element. - -=item C - -=item C - -=item C - -Returns an empty string. Index sequences are suppressed in HTML view. - -=item C - -=back - -=head1 AUTHOR - -Andy Wardley Eabw@kfs.orgE - -=head1 COPYRIGHT AND LICENSE - -Copyright (C) 2000 Andy Wardley. All Rights Reserved. - -This module is free software; you can redistribute it and/or -modify it under the same terms as Perl itself. - -=cut diff --git a/lib/Pod/POM/View/HTML.pm.patch b/lib/Pod/POM/View/HTML.pm.patch deleted file mode 100644 index de2c02d..0000000 --- a/lib/Pod/POM/View/HTML.pm.patch +++ /dev/null @@ -1,36 +0,0 @@ ---- HTML.pm.orig 2009-04-02 10:10:37.000000000 +0100 -+++ HTML.pm 2009-04-02 10:17:10.000000000 +0100 -@@ -27,6 +27,7 @@ - use Pod::POM::View; - use base qw( Pod::POM::View ); - use vars qw( $VERSION $DEBUG $ERROR $AUTOLOAD ); -+use HTML::Entities; - use Text::Wrap; - - $VERSION = sprintf("%d.%02d", q$Revision: 1.6 $ =~ /(\d+)\.(\d+)/); -@@ -208,11 +209,7 @@ - - sub view_verbatim { - my ($self, $text) = @_; -- for ($text) { -- s/&/&/g; -- s//>/g; -- } -+ $text = encode_entities($text); - return "
      $text
      \n\n"; - } - -@@ -370,11 +367,7 @@ - my ($self, $text) = @_; - - unless ($HTML_PROTECT) { -- for ($text) { -- s/&/&/g; -- s//>/g; -- } -+ $text = encode_entities($text); - } - - $text =~ s{ diff --git a/static/css-20100513.css b/static/css-20100513.css new file mode 100644 index 0000000..05410c7 --- /dev/null +++ b/static/css-20100513.css @@ -0,0 +1,851 @@ +/* @override http://localhost:3323/static/css-20100402.css */ + +/* @override http://localhost:3323/static/css-20100402.css */ + +/* @override http://localhost:3323/css-20090810.css */ + +/* @override http://localhost:3323/css-20090730.css */ + +/* @override http://localhost:3323/css-20090727.css */ + +/* @override http://localhost:3323/css-20090722.css */ + +/* @override http://localhost:3323/css-20090721.css */ + +/* @override http://localhost:3323/css.css */ + +/* @group Layout */ + +body { + background-color: #004065; + margin: 0; + font-family: "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif; +} + +div.clear { + clear: both; +} + +div#page { + width: 946px; + margin: 16px auto 26px; + position: relative; +} + +p { + margin: 0; + padding-top: 5px; + padding-bottom: 5px; +} + +/* @group Header */ + +div#header { + height: 105px; + background-image: url(header.png); + position: relative; + width: 946px; +} + +div#strapline { + + color: #b4b4b4; + position: absolute; + top: 63px; + left: 119px; + font-size: .8em; + text-align: center; + width: 228px; +} + +/* @group Download */ + +div#download_link { + position: absolute; + top: 48px; + font-size: .8em; + left: 724px; +} + +div#explore_link { + position: absolute; + top: 48px; + font-size: .8em; + left: 846px; +} +div.download a { + text-decoration: none; + color: #b4b4b4; +} + +div.download a:hover { + color: #eaeaea; +} + +/* @end */ + +/* @group Homepage link */ + +div#homepage_link { + position: absolute; + top: 10px; + left: 10px; + height: 90px; + width: 340px; +} + +div#homepage_link a { + display: block; + height: 90px; +} + +/* @end */ + + + +/* @group Search form */ + +label.overTxtLabel { + color: #afafaf; + font-size: .8em; + margin-top: -2px; + margin-left: -6px; +} + +div#search_form { + position: relative; + top: 23px; + left: 588px; + width: 115px; +} + +div#search_form input { + border-style: none; + width: 115px; +} + +/* @end */ + +/* @group Body */ + +div#body { + padding-top: 0px; + background: url(main_bg.png) repeat-y; +} + +div#left_column { + float: left; + width: 145px; + padding-left: 30px; +} + +div#centre_column { + float: left; + width: 731px; + margin-left: 9px; + margin-right: 9px; + position: relative; +} + +div#right_column { + float: left; + width: 145px; + padding-left: 6px; +} + +/* @end */ + + + +/* @group Footer */ + +div#footer { + +} + +div#footer_content { + background-image: url(footer_bg.png); + padding-right: 74px; + padding-left: 74px; +} + +div#footer_strapline { + text-align: center; + padding-top: 15px; + padding-bottom: 15px; + color: #6c6c6c; + font: lighter 1.05em "Gill Sans"; +} + +div#footer_end { + background-image: url(footer.png); + width: 946px; + height: 42px; + clear: both; + background-color: #004065; +} + +/* @group Address */ + +div#address { + background: url(onion-grey.png) no-repeat 0 4px; + padding-left: 51px; + float: left; + border-right: 1px solid #b4b4b4; + padding-right: 35px; +} + +div#address p.name { + margin: 0; + color: #414141; +} + +div#address p.address { + color: #797979; + font-size: .9em; + margin: 3px 0 0; + padding: 0; +} + +div#address p.contact { + color: #797979; + margin: 3px 0 0; + font-size: .9em; +} + +div#address p.contact a { + color: #797979; + text-decoration: underline; +} + +div#address p.contact a:hover { + color: #515151; +} + +div#address p.address a { + color: #797979; + text-decoration: underline; +} + +div#address p.address a:hover { + color: #515151; +} + + +/* @end */ + +/* @group Links */ + +div#footer_links { + background-image: url(footer_bg.png); +} + +ul.f1 { + list-style-type: none; + margin: 0; + float: right; + padding: 8px 0 0; +} + +ul.f1 li { + float: left; + color: #414141; + font-size: .8em; + text-align: right; + padding-left: 40px; +} + +ul.f2 { + list-style-type: none; + text-align: right; + margin: 3px 0 0; + padding: 0; +} + +ul.f2 li { + float: none; + font-size: 1em; + margin: 0; + padding: 0; +} + +ul.f2 li a { + text-decoration: none; + color: #858585; +} + +ul.f2 li a:hover { + color: #515151; +} + +/* @end */ + + + +/* @end */ + +/* @end */ + +/* @group Side panels */ + +/* @group Perl version form */ + +select#perl_version_select { + margin: 5px 8px 11px; + width: 121px; +} + +/* @end */ + +div.side_group { + margin-bottom: 25px; +} + +div.side_panel { + width: 130px; + background: #3b3b3b url(combined-20090925.png) no-repeat 0 -216px; + color: #d8d8d8; + padding-right: 8px; + font: .8em "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif; + margin-bottom: 1px; +} + +div.side_panel p { + margin: 0; + padding-top: 14px; + padding-left: 42px; + height: 27px; + width: 96px; + padding-bottom: 0; +} + +div.doc_panel p { + background: url(combined-20090925.png) -648px -153px; +} + +div.links_panel p { + background: url(combined-20090925.png) -786px -153px; +} + +div.tools_panel p { + background: url(combined-20090925.png) -648px -194px; +} + +div.side_panel ul { + padding-left: 8px; + margin-bottom: 0; + padding-bottom: 11px; + margin-top: 1px; + font-size: .9em; + margin-left: 0; +} + +div.side_panel li { + list-style-type: none; + text-align: right; + padding-bottom: 1px; +} + +div.side_panel a { + color: #bebebe; + text-decoration: none; +} + +div.side_panel a:hover { + color: white; +} + + + +/* @end */ + +/* @group Content */ + +/* @group Header */ + +div#content_header { + background-image: url(content_bg.png); + top: 0; + width: 731px; + height: 85px; + z-index: 1; +} + +/* @group Title bar */ + +div#title_bar { + height: 53px; + position: relative; + background: url(center_header.png) 0 0; +} + +div#page_name { + position: absolute; + left: 46px; + top: 16px; +} + +div#page_name h1 { + color: white; + font: normal normal 0.85em "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif; + margin: 0; + padding: 0; +} + +div#perl_version { + color: #bebebe; + font: .7em "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif; + position: absolute; + left: 46px; + top: 33px; +} + +div.page_links { + color: #7f7f7f; + font: .7em "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif; + position: absolute; +} + +div#page_links_top { + top: 18px; + right: 179px; +} + +div#page_links_bottom { + top: 33px; + right: 179px; +} + +div.page_links a { + color: #bebebe; + text-decoration: none; +} + +div.page_links a:hover { + color: white; +} + +div.page_links a:focus { + outline: none; +} + +/* @end */ + +div#breadcrumbs { + color: #7f7f7f; + padding-left: 30px; + padding-top: 10px; + font: .8em "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif; +} + +div#breadcrumbs a { + color: #5a5a5a; +} + +/* @end */ + +/* @group Body */ + +div.mod_az_list { + font-size: .9em; + text-align: center; + margin-top: 15px; + margin-bottom: 15px; +} + +div#content_body { + padding-right: 30px; + padding-left: 30px; + font-size: .8em; + color: #515151; + position: relative; + top: 0px; + background-image: url(content_bg.png); +} + +div#content_body h1 { + font: 1.9em "ITC Garamond", Garamond, Georgia, "Times New Roman", Times, serif; + color: #36497d; + background: url(h2_bg.png) no-repeat -2px 29px; + + padding-left: 0px; + padding-top: 6px; + padding-bottom: 8px; + margin-top: 0px; + margin-bottom: 0; +} + +div#content_body h2 { + font: 1.5em "ITC Garamond", Garamond, Georgia, "Times New Roman", Times, serif; + color: #36497d; + padding-top: 12px; + margin: 0; + background: url(h2_bg.png) no-repeat -2px 30px; + padding-bottom: 4px; + padding-left: 0; +} + +div#content_body h3 { + font: 1.3em "ITC Garamond", Garamond, Georgia, "Times New Roman", Times, serif; + color: #36497d; + margin-top: 9px; + margin-bottom: 3px; +} + +div#content_body p { + margin-top: 0px; + margin-bottom: 0px; +} + +div#content_body ul li { + padding-bottom: 3px; +} + +div#content_body dt { + font-weight: bold; +} + +div#content_body a:link, div#content_body a:active { + color: #36415c; +} + +div#content_body a:visited { + color: #666666; +} + +div#content_body a:hover { + color: #888; +} + +div#searchBanner { + text-align: center; + background-color: #5ab06d; + padding: 10px; + margin-bottom: 15px; + color: #f1f1f1; + border: 5px solid #1a661c; + margin-right: 15px; + margin-left: 15px; +} + +div#searchBanner a { + color: white; + font-weight: bold; +} + +div#searchBanner a:link { + color: white; + font-weight: bold; +} + +div#searchBanner a:visited { + color: white; + font-weight: bold; +} + +div#searchBanner a:hover { + color: white; + font-weight: bold; +} + +div.noscript { + text-align: center; + padding: 10px; + margin-bottom: 15px; + border: 5px solid #dc4c24; + margin-right: 15px; + margin-left: 15px; +} + +/* @end */ + +/* @group Footer */ + +div#content_footer { + width: 731px; + height: 25px; + background: url(content_footer.png) no-repeat; + margin-bottom: 20px; +} + + +/* @end */ + + + +/* @end */ + +/* @group Syntax highlighting */ + +.c { color: #228B22;} /* comment */ +.cm { color: #000000;} /* comma */ +.co { color: #000000;} /* colon */ +.h { color: #CD5555; font-weight:bold;} /* here-doc-target */ +.hh { color: #CD5555; font-style:italic;} /* here-doc-text */ +.i { color: #00688B;} /* identifier */ +.j { color: #CD5555; font-weight:bold;} /* label */ +.k { color: #8B008B; font-weight:bold;} /* keyword */ +.m { color: #FF0000; font-weight:bold;} /* subroutine */ +.n { color: #B452CD;} /* numeric */ +.p { color: #000000;} /* paren */ +.pd { color: #228B22; font-style:italic;} /* pod-text */ +.pu { color: #000000;} /* punctuation */ +.q { color: #CD5555;} /* quote */ +.s { color: #000000;} /* structure */ +.sc { color: #000000;} /* semicolon */ +.v { color: #B452CD;} /* v-string */ +.w { color: #000000;} /* bareword */ + +a.l_k:link, a.l_k:visited, a.l_k:active { color: #8B008B; font-weight:bold;} /* keyword */ +a.l_k:hover { color: #225533; font-weight:bold;} /* keyword */ + +a.l_w:link, a.l_w:visited, a.l_w:active { color: #000000; } /* keyword */ +a.l_w:hover { color: #225533; } /* keyword */ + +code.inline { + background: #eeeedd; + border-width: 1px; + border-style: solid solid solid solid; + border-color: #ccc; + font-size: 1.2em; +} + +pre.verbatim { + margin-left: 10px; + margin-right: 10px; + background: #eeeedd; + border-width: 1px; + border-style: solid solid solid solid; + border-color: #ccc; + word-wrap: break-word; + white-space: pre-wrap; + padding: 3px; + font-size: 1.2em; +} + +pre.verbatim ol { + background-color: #d8d8d8; + color: #3f3f3f; + margin-top: 0; + margin-bottom: 0; +} + +pre.verbatim ol li { + background: #eeeedd; + padding-left: 5px; + color: #262626; + padding-bottom: 2px; +} + +pre.indent { + margin-left: 30px; + margin-right: 30px; + background: #eeeedd; + border-width: 1px; + border-style: solid solid solid solid; + border-color: #ccc; + padding: 10px 10px 10px 10px; +} + +/* @end */ + +/* @group Page Index */ + +div#page_index { + top: 180px; + left: 550px; +} + +div#recent_pages { + top: 180px; + left: 250px; +} + +div.hud_container { + position: fixed; + z-index: 2; + display: none; + visibility: hidden; +} + +div.hud_header { +} + +div.hud_footer { +} + +div.hud_bottomleft { + background: url(popup_bottomleft.png) no-repeat; + width: 8px; + height: 23px; + float: left; +} + +div.hud_title { + background-image: url(popup_title.png); + margin-left: 24px; + margin-right: 8px; + padding-top: 4px; + color: #d8d8d8; + text-align: center; + padding-right: 16px; + font-size: .9em; + cursor: move; +} + +div.hud_topright { + width: 8px; + height: 23px; + background-image: url(popup_topright.png); + position: absolute; + right: 0; + top: 0; +} + +div.hud_bottom { + background-image: url(popup_bg.png); + margin-left: 8px; + margin-right: 23px; +} + +div.hud_resize { + background: url(popup_resize.png) no-repeat; + width: 23px; + height: 23px; + position: absolute; + right: 0; + bottom: 0; + cursor: se-resize; +} + +div.hud_close { + width: 24px; + height: 23px; + background-image: url(popup_close.png); + float: left; +} + +div.hud_close a { + display: block; + width: 24px; + height: 23px; +} + +div.hud_content { + overflow: auto; + width: 250px; + height: 200px; + background-image: url(popup_bg.png); + font-size: .9em; + color: #7f7f7f; + padding-right: 5px; +} + +div.hud_content ul { + margin-top: 10px; +} + +div#content_body div.hud_content a:link { + color: #a6a6a6; +} + +div#content_body div.hud_content a:visited { + color: #a6a6a6; +} + +div#content_body div.hud_content { + color: #a6a6a6; +} + +div#content_body div.hud_content a:hover { + color: #fff; +} + +span.hud_span_top { + display: inline-block; + height: 19px; +} + +span.hud_span_bottom { + display: inline-block; + height: 23px; +} + +div#recent_pages_content { + width: 170px; + height: 200px; +} + +/* @end */ + +/* @group Search results */ + +div.search_results { + margin-bottom: 15px; +} + +div.search_results img { + margin-right: 10px; + vertical-align: top; +} + +/* @end */ + +/* @group Preferences */ + +form.prefs { + width: 580px; + margin-right: auto; + margin-left: auto; +} + +form.prefs legend { + padding: 2px 15px 2px 8px; + color: #3f3f3f; + border: 2px solid #bfbfbf; + background-color: white; + font-weight: bold; + font-size: .9em; +} + +form.prefs fieldset { + margin-bottom: 20px; + padding-bottom: 25px; + border: 2px solid #bfbfbf; + background-color: #fafafa; +} + +form.prefs label { + display: block; + margin-left: 50px; + margin-bottom: -8px; + font-size: .9em; +} + +form.prefs fieldset input { + float: left; + margin-left: 25px; +} + +div.form_section { + font-size: .9em; + color: #3f3f3f; + border-bottom: 1px solid #bfbfbf; + padding-bottom: 1px; + margin: 7px 10px 13px; + font-weight: bold; + font-style: italic; +} + +div.form_buttons { + padding-bottom: 5px; + text-align: center; +} + +div.form_buttons input { + margin-right: 6px; + margin-left: 6px; + font-size: 1.2em; +} + +/* @end */ diff --git a/syntax.cache b/syntax.cache index 6067ab639caee928aac82115b4d5fa26a0985d25..cc8aae847341ca02a2ce11370c9d19ba0abeaa1a 100644 GIT binary patch delta 3018 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 Jduhrd{s+EwaT@>t diff --git a/templates/default.tt b/templates/default.tt index 164bd2c..1d05c03 100755 --- a/templates/default.tt +++ b/templates/default.tt @@ -33,7 +33,7 @@ [% UNLESS download %]

      Perl version

      - [% INCLUDE perlversion.tt %] +