package CPAN::Mini::Webserver::Templates; use strict; use warnings; use MIME::Base64; use Template::Declare::Tags; use base 'Template::Declare'; private template 'header' => sub { my ( $self, $title ) = @_; head { title {$title}; link { attr { rel => 'stylesheet', href => '/static/css/screen.css', type => 'text/css', media => 'screen, projection' } }; link { attr { rel => 'stylesheet', href => '/static/css/print.css', type => 'text/css', media => 'print' } }; outs_raw ''; link { attr { rel => 'icon', href => '/static/images/favicon.png', type => 'image/png', } }; link { attr { rel => 'search', href => '/static/xml/opensearch.xml', type => 'application/opensearchdescription+xml', title => 'minicpan search', } }; meta { attr { generator => 'CPAN::Mini::Webserver' } }; } }; private template 'footer' => sub { my $self = shift; my $version = $CPAN::Mini::Webserver::VERSION; div { attr { id => "footer" }; small { "Generated by CPAN::Mini::Webserver $version"; }; } }; private template 'author_link' => sub { my ( $self, $author ) = @_; a { attr { href => '/~' . lc( $author->pauseid ) . '/' }; $author->name; }; }; private template 'distribution_link' => sub { my ( $self, $distribution ) = @_; a { attr { href => '/~' . lc( $distribution->cpanid ) . '/' . $distribution->distvname . '/' }; $distribution->distvname; }; }; private template 'package_link' => sub { my ( $self, $package ) = @_; my $distribution = $package->distribution; a { attr { href => '/package/' . lc( $distribution->cpanid ) . '/' . $distribution->distvname . '/' . $package->package . '/' }; $package->package; }; }; private template distribution_file => sub { my ( $self, $pauseid, $distvname, $filename ) = (@_); my $display_filename = ( $filename =~ /^$distvname\/(.*)$/ ) ? $1 : $filename; my $href = ( $filename =~ /\.(pm|PL|pod)$/ ) ? "/~$pauseid/$distvname/$filename" : "/raw/~$pauseid/$distvname/$filename"; row { cell { a { attr { href => $href }; span { $display_filename; }; }; }; }; }; private template 'searchbar' => sub { my $self = shift; my $q = shift; table { row { form { attr { method => 'get', action => '/search/' }; cell { attr { class => 'searchbar' }; outs_raw q||; }; cell { attr { class => 'searchbar' }; input { { attr { type => 'text', name => 'q', value => $q } }; }; input { { attr { type => 'submit', value => 'Search Mini CPAN' } }; }; }; }; }; }; }; private template 'search_results' => sub { my ( $self, $arguments ) = @_; my $parse_cpan_authors = $arguments->{parse_cpan_authors}; my $q = $arguments->{q}; my @authors = @{ $arguments->{authors} }; my @distributions = @{ $arguments->{distributions} }; my @packages = @{ $arguments->{packages} }; if ( @authors + @distributions + @packages ) { outs_raw ''; foreach my $author (@authors) { row { cell { show( 'author_link', $author ); }; }; } foreach my $distribution (@distributions) { row { cell { show( 'distribution_link', $distribution ); outs ' by '; show( 'author_link', $parse_cpan_authors->author( $distribution->cpanid ) ); }; }; } foreach my $package (@packages) { row { cell { show( 'package_link', $package ); outs ' by '; show( 'author_link', $parse_cpan_authors->author( $package->distribution->cpanid ) ); }; }; } outs_raw '
'; } else { p {'No results found.'}; } }; template 'index' => sub { my $self = shift; html { attr { xmlns => 'http://www.w3.org/1999/xhtml' }; div { attr { class => 'container' }; div { attr { class => 'span-24' }; show( 'header', 'Index' ); body { show('searchbar'); h1 {'Index'}; p {'Welcome to CPAN::Mini::Webserver. Start searching!'}; }; show('footer'); }; }; }; }; template '404' => sub { my ( $self, $arguments ) = @_; my $q = $arguments->{q}; html { attr { xmlns => 'http://www.w3.org/1999/xhtml' }; div { attr { class => 'container' }; div { attr { class => 'span-24' }; show( 'header', 'File not found' ); body { show( 'searchbar', $q ); h1 {'Sorry. I couldn\'t find the page you wanted.'}; p { "Unfortunately, the page you were looking for doesn't exist. Perhaps a quick search for $q will turn up what you were looking for:"; }; }; h2 { outs "Search for "; outs_raw '“'; outs $q; outs_raw '”'; }; show( 'search_results', $arguments ); show('footer'); }; }; }; }; template 'search' => sub { my ( $self, $arguments ) = @_; my $q = $arguments->{q}; html { show( 'header', "Search for `$q'" ); body { div { attr { class => 'container' }; div { attr { class => 'span-24' }; show( 'searchbar', $q ); h1 { outs "Search for "; outs_raw '“'; outs $q; outs_raw '”'; }; show( 'search_results', $arguments ); show('footer'); } }; } }; }; template 'author' => sub { my ( $self, $arguments ) = @_; my $author = $arguments->{author}; my $pauseid = $arguments->{pauseid}; my $distvname = $arguments->{distvname}; my @distributions = @{ $arguments->{distributions} }; my $dates = $arguments->{dates}; html { show( 'header', $author->name ); body { div { attr { class => 'container' }; div { attr { class => 'span-24' }; show('searchbar'); h1 { show( 'author_link', $author ) }; outs_raw ''; foreach my $distribution (@distributions) { row { cell { show( 'distribution_link', $distribution ); }; cell { outs $dates->{ $distribution->distvname }; }; }; } outs_raw '
'; show('footer'); }; }; }; } }; private template 'dependencies' => sub { my ( $self, $meta, $pcp ) = @_; div { attr { class => 'dependencies' }; h2 {'Dependencies'}; ul { foreach my $deptype (qw(requires build_requires configure_requires)) { if ( defined $meta->{$deptype} ) { foreach my $package ( sort keys %{ $meta->{$deptype} } ) { next if $package eq 'perl'; my $d = $pcp->package($package)->distribution; next unless $d; my $distvname = $d->distvname; my $author = $d->cpanid; li { a { attr { href => "/~$author/$distvname/" }; $package; }; if ( $deptype =~ /(.*?)_/ ) { outs " ($1 requirement)"; } } } } } } } }; private template 'metadata' => sub { my ( $self, $meta ) = @_; h2 {'Metadata'}; div { attr { class => 'metadata' }; dl { foreach my $key ( qw(abstract license), 'release date' ) { if ( defined $meta->{$key} ) { dt { ucfirst $key; }; if ( defined $meta->{resources}->{$key} ) { a { attr { href => delete $meta->{resources}->{$key} }; $meta->{$key}; }; } else { dd { $meta->{$key} }; } } } foreach my $datum ( keys %{ $meta->{resources} } ) { dt { ucfirst $datum; } dd { a { attr { href => $meta->{resources}->{$datum}; }; $meta->{resources}->{$datum}; } } } } }; }; private template 'download' => sub { my ( $self, $author, $distribution ) = @_; my $distvname = $distribution->distvname; h2 {'Download'}; div { a { attr { href => '/download/~' . $author->pauseid . "/$distvname" }; $distribution->filename; } }; }; private template 'install' => sub { my ( $self, $author, $distribution, $filenames ) = @_; my $distvname = $distribution->distvname; # Check whether we have the module/distribution installed # And display the status # Just fudge: # * If we have lib/*.pm, that's a contained module my @modules = map { m![^/]*/lib/(.*?)\.pm!; $_ = $1; s!/!::!g; $_ } grep { m![^/]*/lib/.*?\.pm$! } @{$filenames}; my $installed_version = Module::InstalledVersion->new( $modules[0] ); my $msg = "Not installed on this Perl"; my $action = 'Install'; if ( $installed_version->{version} ) { $msg = sprintf 'You have version %s installed.', $installed_version->{version}; if ( $installed_version->{version} lt $distribution->version ) { $action = 'Update'; } elsif ( $installed_version->{version} eq $distribution->version ) { $action = 'Reinstall'; } else { $action = 'Downgrade'; } } h2 {'Install'}; div { attr { class => 'install' }; div { attr { 'class' => "install-message" }; $msg }; form { attr { class => 'install-link' } attr { method => 'PUT' }; attr { action => '/install/~' . lc( $distribution->cpanid ) . '/' . $distribution->distvname . '/' . $distribution->filename; }; button {$action} $action; }; }; }; private template 'dist_links' => sub { my ( $self, $distribution ) = @_; my $distname = $distribution->dist; h2 {'Links'}; ul { li { outs "Test "; a { attr { href => "http://bbbike.radzeit.de/~slaven/cpantestersmatrix.cgi?dist=$distname" }; "matrix"; }; outs " and "; a { attr { href => "http://cpantesters.perl.org/show/$distname.html" }; "reports"; }; } li { a { attr { href => "http://rt.cpan.org/NoAuth/Bugs.html?Dist=$distname" }; "RT"; }; outs " (or via "; a { attr { href => "mailto:bug-$distname\@rt.cpan.org" } "email"; }; outs ")"; } li { a { attr { href => "http://annocpan.org/dist/$distname" }; "AnnoCPAN"; } } li { a { attr { href => "http://cpanratings.perl.org/d/$distname" }; "CPAN Ratings"; } } } }; template 'filelist' => sub { my ( $self, $pauseid, $distvname, $label, $filenames ) = @_; h2 {$label}; outs_raw ''; foreach my $filename (@$filenames) { show( distribution_file => $pauseid, $distvname, $filename ); } outs_raw '
'; }; template 'distribution' => sub { my ( $self, $arguments ) = @_; my $author = $arguments->{author}; my $pauseid = $arguments->{pauseid}; my $distvname = $arguments->{distvname}; my $distribution = $arguments->{distribution}; my @filenames = @{ $arguments->{filenames} }; my $meta = $arguments->{meta}; my $pcp = $arguments->{pcp}; html { show( 'header', $author->name . ' > ' . $distvname ); body { div { attr { class => 'container' }; div { attr { class => 'span-24 last' }; show('searchbar'); h1 { show( 'author_link', $author ); outs ' > '; show( 'distribution_link', $distribution ); }; } div { attr { class => 'span-18 last' }; # outs_raw ''; my ( @code, @test, @other ); while ( $_ = shift @filenames ) { if ( m{(?:/bin/|\.p(?:m|l)$)} and not m{/inc/} ) { push @code, $_; } elsif (/\.t$/) { push @test, $_; } else { push @other, $_; } } show( 'filelist', $pauseid, $distvname, 'Code', \@code ); show( 'filelist', $pauseid, $distvname, 'Tests', \@test ); show( 'filelist', $pauseid, $distvname, 'Other', \@other ); # foreach my $filename (@filenames) { # show( # distribution_file => $pauseid, # $distvname, $filename # ); # } # outs_raw '
'; }; div { attr { class => 'span-6 last' }; show( 'metadata', $meta ); show( 'dependencies', $meta, $pcp ); show( 'download', $author, $distribution ); show( 'install', $author, $distribution, \@filenames ); show( 'dist_links', $distribution ); }; div { attr { class => 'span-24 last' }; show('footer'); }; } }; } }; template 'file' => sub { my ( $self, $arguments ) = @_; my $author = $arguments->{author}; my $distribution = $arguments->{distribution}; my $filename = $arguments->{filename}; my $pauseid = $arguments->{pauseid}; my $distvname = $arguments->{distvname}; my $file = $arguments->{filename}; my $contents = $arguments->{contents}; my $html = $arguments->{html}; html { show( 'header', $author->name . ' > ' . $distvname . ' > ' . $filename ); body { div { attr { class => 'container' }; div { attr { class => 'span-24' }; show('searchbar'); h1 { show( 'author_link', $author ); outs ' > '; show( 'distribution_link', $distribution ); outs ' > '; outs $filename; }; a { attr { href => "/raw/~$pauseid/$distvname/$filename" }; "See raw file"; }; if ($html) { div { attr { id => "pod" }; outs_raw $html; }; } else { pre {$contents}; } show('footer'); }; }; }; } }; template 'raw' => sub { my ( $self, $arguments ) = @_; my $author = $arguments->{author}; my $distribution = $arguments->{distribution}; my $filename = $arguments->{filename}; my $pauseid = $arguments->{pauseid}; my $distvname = $arguments->{distvname}; my $contents = $arguments->{contents}; my $html = $arguments->{html}; html { show( 'header', $author->name . ' > ' . $distvname . ' > ' . $filename ); body { div { attr { class => 'container' }; div { attr { class => 'span-24' }; show('searchbar'); h1 { show( 'author_link', $author ); outs ' > '; show( 'distribution_link', $distribution ); outs ' > '; outs $filename; }; if ($html) { div { attr { id => "code" }; code { outs_raw $html; }; }; } else { pre {$contents}; } div { attr { class => 'download-link' }; a { attr { href => '/download/~' . $author->pauseid . "/$distvname/$filename" }; "Download as plain text"; }; }; show('footer'); }; }; }; } }; template 'opensearch' => sub { my $self = shift; outs_raw q| minicpan_webserver Search minicpan UTF-8 data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%10%00%00%00%10%08%03%00%00%00(-%0FS%00%00%00%01sRGB%00%AE%CE%1C%E9%00%00%003PLTE8%00%00%05%08%04%16%18%15%1E%1F%1D!%22%20%26(%26%2C-%2B130%3B%3D%3AFHELMKXZWegdxyw%84%86%83%9E%A0%9D%CC%CE%CBjq%F6r%00%00%00%01tRNS%00%40%E6%D8f%00%00%00lIDAT%18%D3u%8FY%0E%C20%0C%05%BD%AF)%ED%FDO%0B%85%10%15%04%EF%C7%1A%7B%2C%D9%00%7Fr%C4W%A3u%EB%2B%EFn%E3sAnr1%8E%E11%D4rq%1Bn%9E%CC%8B%15%C5%01%14u%B2%A0%3EmA9K1Z%BD%5C%C6%87%18%B4%18%8A0%A0Q%2B%C3%CC%232%9D%CE%19%E1%3B%3C%E6%E6%CA%BC%C4%A5%BB%C2%84%FC%D7%DBw%7BS%02%E3Ki%23G%00%00%00%00IEND%AEB%60%82 |; }; template 'css_screen' => sub { my $self = shift; outs_raw q|/* ----------------------------------------------------------------------- Blueprint CSS Framework 0.7.1 http://blueprintcss.googlecode.com * Copyright (c) 2007-2008. See LICENSE for more info. * See README for instructions on how to use Blueprint. * For credits and origins, see AUTHORS. * This is a compressed file. See the sources in the 'src' directory. ----------------------------------------------------------------------- */ /* reset.css */ html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;} body {line-height:1.5;} table {border-collapse:separate;border-spacing:0;} caption, th, td {text-align:left;font-weight:normal;} table, td, th {vertical-align:middle;} blockquote:before, blockquote:after, q:before, q:after {content:"";} blockquote, q {quotes:"" "";} a img {border:none;} /* typography.css */ body {font-size:75%;color:#222;background:#fff;font-family:"Helvetica Neue", Helvetica, Arial, sans-serif;} h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;} h1 {font-size:3em;line-height:1;margin-bottom:0.5em;} h2 {font-size:2em;margin-bottom:0.75em;} h3 {font-size:1.5em;line-height:1;margin-bottom:1em;} h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;height:1.25em;} h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;} h6 {font-size:1em;font-weight:bold;} h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;} p {margin:0 0 1.5em;} p img {float:left;margin:1.5em 1.5em 1.5em 0;padding:0;} p img.right {float:right;margin:1.5em 0 1.5em 1.5em;} a:focus, a:hover {color:#000;} a {color:#009;text-decoration:underline;} blockquote {margin:1.5em;color:#666;font-style:italic;} strong {font-weight:bold;} em, dfn {font-style:italic;} dfn {font-weight:bold;} sup, sub {line-height:0;} abbr, acronym {border-bottom:1px dotted #666;} address {margin:0 0 1.5em;font-style:italic;} del {color:#666;} pre, code {margin:1.5em 0;white-space:pre;} pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;} li ul, li ol {margin:0 1.5em;} ul, ol {margin:0 1.5em 1.5em 1.5em;} ul {list-style-type:disc;} ol {list-style-type:decimal;} dl {margin:0 0 1.5em 0;} dl dt {font-weight:bold;} dd {margin-left:1.5em;} table {margin-bottom:1.4em;width:100%;} th {font-weight:bold;background:#C3D9FF;} th, td {padding:4px 10px 4px 5px;} tr.even td {background:#E5ECF9;} tfoot {font-style:italic;} caption {background:#eee;} .small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;} .large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;} .hide {display:none;} .quiet {color:#666;} .loud {color:#000;} .highlight {background:#ff0;} .added {background:#060;color:#fff;} .removed {background:#900;color:#fff;} .first {margin-left:0;padding-left:0;} .last {margin-right:0;padding-right:0;} .top {margin-top:0;padding-top:0;} .bottom {margin-bottom:0;padding-bottom:0;} /* grid.css */ .container {width:950px;margin:0 auto;} .showgrid {background:url(src/grid.png);} body {margin:1.5em 0;} div.span-1, div.span-2, div.span-3, div.span-4, div.span-5, div.span-6, div.span-7, div.span-8, div.span-9, div.span-10, div.span-11, div.span-12, div.span-13, div.span-14, div.span-15, div.span-16, div.span-17, div.span-18, div.span-19, div.span-20, div.span-21, div.span-22, div.span-23, div.span-24 {float:left;margin-right:10px;} div.last {margin-right:0;} .span-1 {width:30px;} .span-2 {width:70px;} .span-3 {width:110px;} .span-4 {width:150px;} .span-5 {width:190px;} .span-6 {width:230px;} .span-7 {width:270px;} .span-8 {width:310px;} .span-9 {width:350px;} .span-10 {width:390px;} .span-11 {width:430px;} .span-12 {width:470px;} .span-13 {width:510px;} .span-14 {width:550px;} .span-15 {width:590px;} .span-16 {width:630px;} .span-17 {width:670px;} .span-18 {width:710px;} .span-19 {width:750px;} .span-20 {width:790px;} .span-21 {width:830px;} .span-22 {width:870px;} .span-23 {width:910px;} .span-24, div.span-24 {width:950px;margin:0;} .append-1 {padding-right:40px;} .append-2 {padding-right:80px;} .append-3 {padding-right:120px;} .append-4 {padding-right:160px;} .append-5 {padding-right:200px;} .append-6 {padding-right:240px;} .append-7 {padding-right:280px;} .append-8 {padding-right:320px;} .append-9 {padding-right:360px;} .append-10 {padding-right:400px;} .append-11 {padding-right:440px;} .append-12 {padding-right:480px;} .append-13 {padding-right:520px;} .append-14 {padding-right:560px;} .append-15 {padding-right:600px;} .append-16 {padding-right:640px;} .append-17 {padding-right:680px;} .append-18 {padding-right:720px;} .append-19 {padding-right:760px;} .append-20 {padding-right:800px;} .append-21 {padding-right:840px;} .append-22 {padding-right:880px;} .append-23 {padding-right:920px;} .prepend-1 {padding-left:40px;} .prepend-2 {padding-left:80px;} .prepend-3 {padding-left:120px;} .prepend-4 {padding-left:160px;} .prepend-5 {padding-left:200px;} .prepend-6 {padding-left:240px;} .prepend-7 {padding-left:280px;} .prepend-8 {padding-left:320px;} .prepend-9 {padding-left:360px;} .prepend-10 {padding-left:400px;} .prepend-11 {padding-left:440px;} .prepend-12 {padding-left:480px;} .prepend-13 {padding-left:520px;} .prepend-14 {padding-left:560px;} .prepend-15 {padding-left:600px;} .prepend-16 {padding-left:640px;} .prepend-17 {padding-left:680px;} .prepend-18 {padding-left:720px;} .prepend-19 {padding-left:760px;} .prepend-20 {padding-left:800px;} .prepend-21 {padding-left:840px;} .prepend-22 {padding-left:880px;} .prepend-23 {padding-left:920px;} div.border {padding-right:4px;margin-right:5px;border-right:1px solid #eee;} div.colborder {padding-right:24px;margin-right:25px;border-right:1px solid #eee;} .pull-1 {margin-left:-40px;} .pull-2 {margin-left:-80px;} .pull-3 {margin-left:-120px;} .pull-4 {margin-left:-160px;} .pull-5 {margin-left:-200px;} .pull-6 {margin-left:-240px;} .pull-7 {margin-left:-280px;} .pull-8 {margin-left:-320px;} .pull-9 {margin-left:-360px;} .pull-10 {margin-left:-400px;} .pull-11 {margin-left:-440px;} .pull-12 {margin-left:-480px;} .pull-13 {margin-left:-520px;} .pull-14 {margin-left:-560px;} .pull-15 {margin-left:-600px;} .pull-16 {margin-left:-640px;} .pull-17 {margin-left:-680px;} .pull-18 {margin-left:-720px;} .pull-19 {margin-left:-760px;} .pull-20 {margin-left:-800px;} .pull-21 {margin-left:-840px;} .pull-22 {margin-left:-880px;} .pull-23 {margin-left:-920px;} .pull-24 {margin-left:-960px;} .pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float:left;position:relative;} .push-1 {margin:0 -40px 1.5em 40px;} .push-2 {margin:0 -80px 1.5em 80px;} .push-3 {margin:0 -120px 1.5em 120px;} .push-4 {margin:0 -160px 1.5em 160px;} .push-5 {margin:0 -200px 1.5em 200px;} .push-6 {margin:0 -240px 1.5em 240px;} .push-7 {margin:0 -280px 1.5em 280px;} .push-8 {margin:0 -320px 1.5em 320px;} .push-9 {margin:0 -360px 1.5em 360px;} .push-10 {margin:0 -400px 1.5em 400px;} .push-11 {margin:0 -440px 1.5em 440px;} .push-12 {margin:0 -480px 1.5em 480px;} .push-13 {margin:0 -520px 1.5em 520px;} .push-14 {margin:0 -560px 1.5em 560px;} .push-15 {margin:0 -600px 1.5em 600px;} .push-16 {margin:0 -640px 1.5em 640px;} .push-17 {margin:0 -680px 1.5em 680px;} .push-18 {margin:0 -720px 1.5em 720px;} .push-19 {margin:0 -760px 1.5em 760px;} .push-20 {margin:0 -800px 1.5em 800px;} .push-21 {margin:0 -840px 1.5em 840px;} .push-22 {margin:0 -880px 1.5em 880px;} .push-23 {margin:0 -920px 1.5em 920px;} .push-24 {margin:0 -960px 1.5em 960px;} .push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float:right;position:relative;} .box {padding:1.5em;margin-bottom:1.5em;background:#E5ECF9;} hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:.1em;margin:0 0 1.45em;border:none;} hr.space {background:#fff;color:#fff;} .clearfix:after, .container:after {content:".";display:block;height:0;clear:both;visibility:hidden;} .clearfix, .container {display:inline-block;} * html .clearfix, * html .container {height:1%;} .clearfix, .container {display:block;} .clear {clear:both;} /* forms.css */ label {font-weight:bold;} fieldset {padding:1.4em;margin:0 0 1.5em 0;border:1px solid #ccc;} legend {font-weight:bold;font-size:1.2em;} input.text, input.title, textarea, select {margin:0.5em 0;border:1px solid #bbb;} input.text:focus, input.title:focus, textarea:focus, select:focus {border:1px solid #666;} input.text, input.title {width:300px;padding:5px;} input.title {font-size:1.5em;} textarea {width:390px;height:250px;padding:5px;} .error, .notice, .success {padding:.8em;margin-bottom:1em;border:2px solid #ddd;} .error {background:#FBE3E4;color:#8a1f11;border-color:#FBC2C4;} .notice {background:#FFF6BF;color:#514721;border-color:#FFD324;} .success {background:#E6EFC2;color:#264409;border-color:#C6D880;} .error a {color:#8a1f11;} .notice a {color:#514721;} .success a {color:#264409;} /* /home/acme/hg/CPAN-Mini-Webserver/root/static/css/my-screen.css */ h1 {font-size:2em;clear:both;margin-top:10px;} h2 {font-size:1.7em;clear:both;} h3 {font-size:1.4em;clear:both;} body {background:#ffffff;font-size:100%;font-family:Georgia, "Times New Roman", Times, serif;} pre, code, tt {font-size:80%;} td.searchbar {vertical-align:middle;} div#searchbar {min-height:10em;display:table-cell;vertical-align:middle;} #code {font-size:120%;font-family:monospace;padding:10px 10px 10px 10px;} #eval {font-family:monospace;border-width:1px;border-style:solid solid solid solid;border-color:#ccc;padding:5px 5px 5px 5px;} .line_number {color:#aaaaaa;} .comment {color:#228B22;} .symbol {color:#00688B;} .word {color:#8B008B;font-weight:bold;} .structure {color:#000000;} .number {color:#B452CD;} .single {color:#CD5555;} .double {color:#CD5555;} /* buttons */ a.button, button {display:block;float:left;margin:0 0.583em 0.667em 0;padding:5px 10px 5px 7px;border:1px solid #dedede;border-top:1px solid #eee;border-left:1px solid #eee;background-color:#f5f5f5;font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif;font-size:100%;line-height:130%;text-decoration:none;font-weight:bold;color:#565656;cursor:pointer;} button {width:auto;overflow:visible;padding:4px 10px 3px 7px;} button[type] {padding:4px 10px 4px 7px;line-height:17px;} *:first-child+html button[type] {padding:4px 10px 3px 7px;} button img, a.button img {margin:0 3px -3px 0 !important;padding:0;border:none;width:16px;height:16px;float:none;} button:hover, a.button:hover {background-color:#dff4ff;border:1px solid #c2e1ef;color:#336699;} a.button:active {background-color:#6299c5;border:1px solid #6299c5;color:#fff;} body .positive {color:#529214;} a.positive:hover, button.positive:hover {background-color:#E6EFC2;border:1px solid #C6D880;color:#529214;} a.positive:active {background-color:#529214;border:1px solid #529214;color:#fff;} body .negative {color:#d12f19;} a.negative:hover, button.negative:hover {background:#fbe3e4;border:1px solid #fbc2c4;color:#d12f19;} a.negative:active {background-color:#d12f19;border:1px solid #d12f19;color:#fff;} |; }; template 'css_print' => sub { my $self = shift; outs_raw q|/* ----------------------------------------------------------------------- Blueprint CSS Framework 0.7.1 http://blueprintcss.googlecode.com * Copyright (c) 2007-2008. See LICENSE for more info. * See README for instructions on how to use Blueprint. * For credits and origins, see AUTHORS. * This is a compressed file. See the sources in the 'src' directory. ----------------------------------------------------------------------- */ /* print.css */ body {line-height:1.5;font-family:"Helvetica Neue", Helvetica, Arial, sans-serif;color:#000;background:none;font-size:10pt;} .container {background:none;} hr {background:#ccc;color:#ccc;width:100%;height:2px;margin:2em 0;padding:0;border:none;} hr.space {background:#fff;color:#fff;} h1, h2, h3, h4, h5, h6 {font-family:"Helvetica Neue", Arial, "Lucida Grande", sans-serif;} code {font:.9em "Courier New", Monaco, Courier, monospace;} img {float:left;margin:1.5em 1.5em 1.5em 0;} a img {border:none;} p img.top {margin-top:0;} blockquote {margin:1.5em;padding:1em;font-style:italic;font-size:.9em;} .small {font-size:.9em;} .large {font-size:1.1em;} .quiet {color:#999;} .hide {display:none;} a:link, a:visited {background:transparent;font-weight:700;text-decoration:underline;} a:link:after, a:visited:after {content:" (" attr(href) ") ";font-size:90%;} |; }; template 'css_ie' => sub { my $self = shift; outs_raw q|/* ----------------------------------------------------------------------- Blueprint CSS Framework 0.7.1 http://blueprintcss.googlecode.com * Copyright (c) 2007-2008. See LICENSE for more info. * See README for instructions on how to use Blueprint. * For credits and origins, see AUTHORS. * This is a compressed file. See the sources in the 'src' directory. ----------------------------------------------------------------------- */ /* ie.css */ body {text-align:center;} .container {text-align:left;} * html .column {overflow-x:hidden;} * html legend {margin:-18px -8px 16px 0;padding:0;} ol {margin-left:2em;} sup {vertical-align:text-top;} sub {vertical-align:text-bottom;} html>body p code {*white-space:normal;} hr {margin:-8px auto 11px;} |; }; template 'images_logo' => sub { my $self = shift; my $encoded = q|iVBORw0KGgoAAAANSUhEUgAAAFIAAAAYCAMAAABeMVqjAAAAAXNSR0IArs4c6QAAApFQTFRFAgIC AwMDBAQEBQUFBgYGBwcHCAgICQkJCgoKCwsLDAwMDQ0NDg4ODw8PEBAQEREREhISExMTFBQUFRUV FhYWFxcXGBgYGRkZGhoaGxsbHh4eHx8fICAgISEhIiIiIyMjJCQkJSUlJiYmJycnKCgoKSkpKioq KysrLCwsLS0tLi4uLy8vMDAwMTExMjIyMzMzNTU1NjY2Nzc3ODg4OTk5Ojo6Ozs7PDw8PT09Pj4+ Pz8/QEBAQUFBQkJCQ0NDRERERUVFSEhISUlJSkpKTU1NT09PUFBQUVFRUlJSU1NTVFRUVVVVV1dX WFhYWVlZW1tbXV1dXl5eX19fY2NjZGRkZmZmaGhoaWlpa2trbW1tbm5ub29vcHBwcXFxcnJydHR0 dXV1dnZ2enp6e3t7fHx8fX19fn5+f39/gICAgYGBgoKCg4ODhYWFhoaGiIiIiYmJjIyMjY2Njo6O kJCQkZGRkpKSk5OTlJSUlpaWl5eXmJiYmZmZmpqam5ubnJycnZ2dnp6en5+foKCgoaGhoqKio6Oj pKSkpaWlpqamp6enqKioqampqqqqq6urrKysra2trq6ur6+vsLCwsbGxsrKys7OztLS0tbW1tra2 t7e3uLi4ubm5urq6u7u7vLy8vb29vr6+wMDAwcHBwsLCw8PDxMTExsbGx8fHyMjIycnJysrKy8vL zMzMzc3Nzs7Oz8/P0NDQ09PT1NTU1dXV1tbW19fX2NjY2dnZ2tra3Nzc3d3d3t7e39/f4ODg4eHh 4uLi4+Pj5OTk5eXl5ubm6Ojo6urq6+vr7Ozs7e3t7u7u7+/v8PDw8fHx8vLy8/Pz9PT09fX19vb2 9/f3+Pj4+fn5+vr6+/v7/Pz8/f39/v7+////4IAsjwAAA9hJREFUOMtjuEUauOq7iJASBtJMvN6h UnuTqkZe36Rmw7+m+yr1jLyxO1xPwrjN8CJRRl6cnxXi5RWa3r72JIh7qqaxq72qsm/TdWQTt3eJ 2nK3WzcgG7BmBpy5saG1q3YL1MhrLbre9YvXLW8NFWVPBwncPBfG7DCx2YfXeiNcx809Kyzs+Z1a RY4iG9krshhu5XEnvhU3IEZeidZcAgn0mzuNi6BKmROAihp4NI7BTNy/KlfGSKDHQt7/NJKRfSyy W+CcfIUrEI/fTBNfDxedWQWhJzMlgiz2Ym6Hmnhw1XRFNw6vVk4hQ7+zCCO7uNlVdsE4ZbJQIzfy pCISxoEuqJEMCSCqhzEdwt+/apamjaLIRDtzVTHDmBsIV9oGsxofhnKq5a5CjAzl3ImUTi6gGLmC sQLMPbVquoqFEEtwu5x6hLigTCVcfb/9eSdWa2hQNECNPC8rcwMzKUxkjAdRUzjXguNv3RRZc34W Vlf9vDUqFqwCUjNh6nosb500ZXc/D+a0QY3cxmFwC5eRV7yDQNbd3DVB0YKPjc1ANfH8rYkqoiwi KhtgMW5y49Y+DbagS+CAlbsGNnINizkOI28eS/I9AeIc71Mx4WNmN1MqBWq5WacqyCJucghqpB5Q aKMCWzTI6n55iCvXMqtjN3JJVsqsK2Bv9ymb8LDy2ChPAEfjjTJFHhYJF4hfezUuA8nVEmyZQLm5 ihAjD/DzHcdq5E1YOpitaMTJxG2uvgKWRDOV2FnEw8Ex0KsIjs+ZfNzFN28t1IZkyCvaLC2YRkJj HAQWyBmwMglZWO+GS16LU2ZnEcgHWdkrcw6SmPi5224u0oLm8Sxm0/N4jNwhpc7MJGngfQxJ9kqw PBsb52RQjEuegQg1cwlNWakDNfKgAns2oniYCqEmMSRCBbYJszDJ6kad2z+zvLi0vLahubN74rRp +rJsrCkgV0pC0+TNKi7Reg1YSTSbh7cYZub2AgjdzRgLC7npItLquiGmCnLyyqrKahqaWpo6urJy JsKOoNTQKwpz/Y0yDkFNeOE2W4rddyvY0KPuk6F5iykY7vBtaZqcnJxcHEDAzsrGxsbCwq5QfWIO uNis4t0DL4kKWbUQ5eW+WGkeq6iM1AApqb1ggV1u7GpLj8ANdWFiYGQAAkZmZhYWFjZOVVEzcETf 2OzBkbYZ5sOb+QbIpfrJ+VXJ8QnFvQcgOX3FilUrFm6DG+nJxMTECARQg1nYeBTABenlhcvXLl10 De7OZcRXFE3c7Jw8vLw83NxgglNEse4GhXXPzV1r5k1uLMlJigx0ttCRExXoxF1PAgA2yRjCqrg9 2wAAAABJRU5ErkJggg== |; outs_raw decode_base64($encoded); }; template 'images_favicon' => sub { my $self = shift; my $encoded = q|iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAADNQTFRFOAAA BQgEFhgVHh8dISIgJigmLC0rMTMwOz06RkhFTE1LWFpXZWdkeHl3hIaDnqCdzM7LanH2cgAAAAF0 Uk5TAEDm2GYAAABsSURBVBjTdY9ZDsIwDAW9rynt/U8LhRAVBO/HGnss2QB/csRXo3XrK+9u43NB bnIxjuEx1HJxG26ezIsVxQEUdbKgPm1BOUsxWr1cxocYtBiKMKBRK8PMIzKdzhnhOzzm5sq8xKW7 woT819t3e1MC40tpI0cAAAAASUVORK5CYII= |; outs_raw decode_base64($encoded); }; __END__ =head1 NAME CPAN::Mini::Webserver::Templates - Templates for CPAN::Mini::Webserver =head1 DESCRIPTION This module holds the templates, CSS and images for CPAN::Mini::Webserver. =head1 AUTHOR Leon Brocard =head1 COPYRIGHT Copyright (C) 2008, Leon Brocard. This module is free software; you can redistribute it or modify it under the same terms as Perl itself.