Added EOF-footer, atom feed for site changes and fixed paypal XHTML

This commit is contained in:
Yorhel 2012-02-17 15:59:02 +01:00
parent fa299b0fd9
commit 77600d79c5
3 changed files with 104 additions and 84 deletions

112
index.cgi
View file

@ -3,13 +3,53 @@
use strict;
use warnings;
use utf8;
use TUWF ':html';
use TUWF ':html', ':xml';
use POSIX 'strftime';
use Cwd 'abs_path';
our $ROOT;
BEGIN { ($ROOT = abs_path $0) =~ s{index\.cgi$}{}; }
my @changes = (
[ '2012-02-15', '/doc/commvis', 'Added an article on my new communication system.' ],
[ '2012-02-13', '/ncdc', 'ncdc 1.8 released.' ],
[ '2012-01-19', '/tuwf', 'TUWF 0.2 released.' ],
[ '2012-01-17', undef, 'Complete site redesign.' ],
[ '2011-12-30', '/ncdc/', 'ncdc 1.7 released!' ],
[ '2011-12-07', '/ncdc/', 'ncdc 1.6 released!' ],
[ '2011-11-26', '/doc', 'Added article section and the article on SQLite.' ],
[ '2011-11-03', '/ncdu', 'ncdu 1.8 released!' ],
[ '2011-11-03', '/ncdc', 'ncdc 1.5 released!' ],
[ '2011-10-26', '/ncdc', 'ncdc 1.4 released!' ],
[ '2011-10-19', undef, 'PGP-signed all releases of ncdu, ncdc and TUWF.' ],
[ '2011-10-14', '/ncdc', 'ncdc 1.3 released!' ],
[ '2011-09-25', '/ncdc', 'ncdc 1.1 released - follwed by a 1.2 quickfix.' ],
[ '2011-09-16', '/ncdc', 'ncdc 1.0 released!' ],
[ '2011-09-15', '/ncdc/scr', 'Added some screenshots for ncdu.' ],
[ '2011-09-03', '/ncdc', 'ncdc 0.9 released!' ],
[ '2011-08-26', '/ncdc', 'ncdc 0.8 released!' ],
[ '2011-08-17', '/ncdc', 'ncdc 0.7 released!' ],
[ '2011-08-08', '/ncdc', 'ncdc 0.6 released & user guide updated' ],
[ '2011-08-02', '/ncdc', 'ncdc 0.5 released!' ],
[ '2011-07-23', '/ncdc', 'ncdc 0.4 released!' ],
[ '2011-07-15', '/ncdc', 'ncdc 0.3 released!' ],
[ '2011-06-27', '/ncdc', 'ncdc 0.2 released!' ],
[ '2011-06-20', '/ncdc', 'ncdc 0.1 released! And wrote a user guide for it.' ],
[ '2011-06-11', '/dump/nccolour', 'Added NCurses colour experiment' ],
[ '2011-06-03', '/ncdc', 'Added my latest project: ncdc' ],
[ '2011-02-07', '/tuwf', 'TUWF 0.1 released and now also available on CPAN' ],
[ '2011-01-27', '/tuwf', 'Documented and uploaded one of my older projects: TUWF' ],
[ '2011-01-09', '/dump', 'Added my json.mll OCaml library to code dump' ],
[ '2010-08-13', '/ncdu', 'ncdu 1.7 released!' ],
[ '2009-12-22', '/dump', 'Added vinfo.c script to code dump' ],
[ '2009-10-23', '/ncdu', 'ncdu 1.6 released!' ],
[ '2009-09-21', undef, 'Tiny CSS fix to make this site look good in certain configurations.' ],
[ '2009-05-02', '/ncdu', 'ncdu 1.5 released!' ],
[ '2009-04-30', undef, 'Site redesign and reorganisation.' ],
);
TUWF::register(
qr{} => sub { podpage(shift, 'home', '', '', "Yorhel's Projects") },
qr{ncdu} => sub { podpage(shift, 'ncdu', 'ncdu', '', 'NCurses Disk Usage') },
@ -32,6 +72,7 @@ TUWF::register(
qr{dump/awshrink} => sub { podpage(shift, 'dump-awshrink', 'dump', 'awshrink', 'AWStats Data File Shrinker') },
qr{dump/grenamr} => sub { podpage(shift, 'dump-grenamr', 'dump', 'grenamr', 'GTK+ Mass File Renamer') },
qr{dump/nccolour} => sub { podpage(shift, 'dump-nccolour', 'dump', 'nccolour', 'Colours in NCurses') },
qr{feed\.atom} => \&atom,
);
TUWF::set(
@ -93,6 +134,37 @@ sub tuwfmanual {
}
sub atom {
my $s = shift;
my $t = (stat("$ROOT/index.cgi"))[9];
$s->resHeader('Last-Modified' => strftime '%a, %d %b %Y %H:%M:%S GMT', gmtime $t);
$s->resHeader('Content-Type' => 'application/atom+xml');
xml;
tag feed => xmlns => 'http://www.w3.org/2005/Atom', 'xml:lang' => 'en', 'xml:base' => 'http://dev.yorhel.nl/';
tag title => "Yorhel's Projects";
tag updated => strftime('%Y-%m-%dT%H:%M:%SZ', gmtime $t);
tag id => "http://dev.yorhel.nl/feed.atom";
tag link => rel => 'self', type => 'application/atom+xml', href => "http://dev.yorhel.nl/feed.atom", undef;
tag link => rel => 'alternate', type => 'text/html', href => 'http://dev.yorhel.nl/', undef;
for(@changes) {
tag 'entry';
tag id => 'http://dev.yorhel.nl'.($_->[1]||'/').'#'.$_->[0];
tag title => $_->[2];
tag updated => $_->[0].'T12:00:00Z';
tag published => $_->[0].'T12:00:00Z';
tag 'author';
tag name => 'Yoran Heling';
tag uri => 'http://dev.yorhel.nl/';
tag email => 'projects@yorhel.nl';
end;
tag link => rel => 'alternate', type => 'text/html', href => 'http://dev.yorhel.nl'.($_->[1]||'/'), undef;
end 'entry';
}
end 'feed';
}
sub notfound {
my $s = shift;
my $u = lc $s->reqPath;
@ -125,6 +197,7 @@ use TUWF ':html';
# [dllink $file $title]
# [img $class $file $alt]
# [html]..É
# [yh-changes]
sub htmlPOD {
my($s, $file, $toc) = @_;
require Pod::Simple::HTML;
@ -161,6 +234,7 @@ sub htmlPOD {
$html =~ s/\[dllink ([^ ]+)(?: ([^>]+))?\]/$s->genDLLink($1, $2)/eg;
$html =~ s/\[img ([^ ]+) ([^ ]+) ([^\]]*)\]/<img src="\/img\/$2" class="$1" alt="$3" \/>/g;
$html =~ s{\[html\](.*)É}{(my $h = $1) =~ s/\&gt;/>/g; $h =~ s/\&lt;/</g; $h =~ s/\&amp;/\&/g; $h =~ s/\&quot;/"/g; $h}egs;
$html =~ s/\[yh-changes\]/$s->genChanges()/e;
lit $html;
}
@ -174,6 +248,18 @@ sub genDLLink {
}
# Generate the changelog HTML for this website
sub genChanges {
return join "\n", map {
"<code>$_->[0] </code>"
.($_->[1]?qq{<a href="$_->[1]">}:'')
.TUWF::XML::html_escape($_->[2])
.($_->[1]?'</a>':'')
.'<br />';
} @changes;
}
sub htmlHeader {
my $s = shift;
my %o = (page => '', sec => '', sec2 => '', @_ );
@ -182,6 +268,7 @@ sub htmlHeader {
style type => 'text/css';
$s->printCSS;
end;
Link rel => 'alternate', type => 'application/atom+xml', href => '/feed.atom', title => 'Site updates';
title $o{title};
end;
body;
@ -197,12 +284,12 @@ sub htmlHeader {
txt ' - '; a href => 'http://pgp.mit.edu:11371/pks/lookup?search=0x8c2739fa', 'pgp';
br;br;
lit q|
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----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-----END PKCS7-----">
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
<img alt="" border="0" src="https://www.paypalobjects.com/nl_NL/i/scr/pixel.gif" width="1" height="1">
</form>|;
<form action="https://www.paypal.com/cgi-bin/webscr" method="post"><fieldset style="border:0">
<input type="hidden" name="cmd" value="_s-xclick" />
<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----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-----END PKCS7-----" />
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif" name="submit" alt="PayPal - The safer, easier way to pay online!" style="border: 0" />
<img alt="" src="https://www.paypalobjects.com/nl_NL/i/scr/pixel.gif" style="width:1px; height:1px; border:0" />
</fieldset></form>|;
end;
end 'div';
div id => 'main';
@ -212,7 +299,9 @@ sub htmlHeader {
sub htmlFooter {
end 'div'; # main
div id => 'anotherhack', ' ';
div id => 'footer';
p 'end-of-file';
end;
end 'div'; # body
end 'body';
end 'html';
@ -290,10 +379,11 @@ sub printCSS {
* { margin: 0; padding: 0; font: 15px 'Buenard',serif; color: #222 }
#body { text-align: left; width: 800px; margin: 0 auto; background: #fff; border-left: 1px solid #aaa; border-right: 1px solid #aaa; min-height: 100% }
#uglyhack { height: 30px }
#anotherhack { clear: left }
#main, #left { float: left; border-top: 0px dashed #aaa, margin-top: 50px }
#left { width: 130px; border-right: 1px dashed #aaa; padding: 20px 10px }
#main { width: 609px; padding: 12px 20px }
#left { width: 130px; border-right: 1px dashed #aaa; padding: 20px 10px; margin-bottom: 30px }
#main { width: 609px; padding: 12px 20px 30px 20px }
#footer { clear: left; width: 150px; margin: 0 0 0 324px; border-top: 1px dashed #aaa; height: 20px; text-align: center }
#footer p { position: relative; top: -10px; padding: 0; background: #fff; display: inline; color: #aaa }
#left h1 { font-weight: bold; text-align: center; font-size: 15px }
#left li { margin: 20px 0 0 10px; list-style-type: none }
#left li a { text-decoration: none; display: block; width: 120px; border-bottom: 1px solid #fff }