App-Phoebe
view release on metacpan or search on metacpan
lib/App/Phoebe.pm view on Meta::CPAN
# if space and page or file name should both be shown (up to seven arguments).
# $scheme is either 'gemini' or 'https'.
sub atom {
my $stream = shift;
my $next = shift;
my $host = shift;
my $space = shift;
my $scheme = shift;
my $first_host = shift;
my $name = $server->{wiki_main_page} || "Phoebe";
my $port = port($stream);
$stream->write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
$stream->write("<feed xmlns=\"http://www.w3.org/2005/Atom\">\n");
$stream->write(encode_utf8 "<title>" . quote_html($name) . "</title>\n");
my $link = to_url($stream, $host, $space, "", $scheme);
$stream->write("<link href=\"$link\"/>\n");
$link = to_url($stream, $host, $space, "do/atom", $scheme);
$stream->write("<link rel=\"self\" type=\"application/atom+xml\" href=\"$link\"/>\n");
$stream->write("<id>$link</id>\n");
my $feed_ts = "0001-01-01T00:00:00Z";
$stream->write("<generator uri=\"https://alexschroeder.ch/cgit/phoebe/about/\" version=\"1.0\">Phoebe</generator>\n");
my %seen;
for (1 .. 100) {
my ($ts, $id, $revision, $code, $host, $space, $show_space) = $next->();
last unless $ts and $id;
my $name = name($stream, $id, $host, $space, $show_space);
if ($revision eq "ð¹") {
next if $seen{$name};
# a deleted page
$stream->write("<entry>\n");
$stream->write(encode_utf8 "<title>" . quote_html($name) . " (deleted)</title>\n");
$seen{$name} = 1;
} elsif ($revision eq "ð»") {
# a deleted file
next if $seen{$name . "\x1c"};
$stream->write("<entry>\n");
$stream->write(encode_utf8 "<title>" . quote_html($name) . " (deleted file)</title>\n");
$seen{$name . "\x1c"} = 1;
} elsif ($revision > 0) {
# a page
next if $seen{$name};
$stream->write("<entry>\n");
$stream->write(encode_utf8 "<title>" . quote_html($name) . "</title>\n");
my $link = to_url($stream, $host, $space, "page/$id", $scheme);
$stream->write("<link href=\"$link\"/>\n");
$stream->write("<id>$link</id>\n");
$stream->write(encode_utf8 "<content type=\"text\">" . quote_html(text($stream, $host, $space, $id)) . "</content>\n");
$seen{$name} = 1;
} else {
# a file
next if $seen{$name . "\x1c"};
$stream->write("<entry>\n");
$stream->write(encode_utf8 "<title>" . quote_html($name) . " (file)</title>\n");
my $link = to_url($stream, $host, $space, "file/$id", $scheme);
$stream->write("<link href=\"$link\"/>\n");
$stream->write("<id>$link</id>\n");
$seen{$name . "\x1c"} = 1;
}
my ($sec, $min, $hour, $mday, $mon, $year) = gmtime($ts); # 2003-12-13T18:30:02Z
$ts = sprintf("%04d-%02d-%02dT%02d:%02d:%02dZ", $year + 1900, $mon + 1, $mday, $hour, $min, $sec);
$stream->write("<updated>$ts</updated>\n");
$feed_ts = $ts if $ts gt $feed_ts;
$stream->write("<author><name>$code</name></author>\n");
$stream->write("</entry>\n");
}
$stream->write("<updated>$feed_ts</updated>\n");
$stream->write("</feed>\n");
}
sub serve_blog_atom {
my $stream = shift;
my $host = shift;
my $space = shift;
$log->info("Serving Gemini Blog Atom");
success($stream, "application/atom+xml");
blog_atom($stream, $host, $space, 'gemini');
}
sub blog_atom {
my $stream = shift;
my $host = shift;
my $space = shift;
my $scheme = shift;
my $name = $server->{wiki_main_page} || "Phoebe";
my $port = port($stream);
$stream->write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
$stream->write("<feed xmlns=\"http://www.w3.org/2005/Atom\">\n");
$stream->write(encode_utf8 "<title>" . quote_html($name) . "</title>\n");
my $link = to_url($stream, $host, $space, "", $scheme);
$stream->write("<link href=\"$link\"/>\n");
$link = to_url($stream, $host, $space, "do/blog/atom", $scheme);
$stream->write("<link rel=\"self\" type=\"application/atom+xml\" href=\"$link\"/>\n");
$stream->write("<id>$link</id>\n");
my $feed_ts = "0001-01-01T00:00:00Z";
$stream->write("<generator uri=\"https://alexschroeder.ch/cgit/phoebe/about/\" version=\"1.0\">Phoebe</generator>\n");
my $dir = wiki_dir($host, $space);
my @blog = blog_pages($stream, $host, $space, 10);
my $changes = changes_for($host, $space, @blog);
# hard coded: 10 pages blog ATOM, no pagination
for my $id (@blog[0 .. min($#blog, 9)]) {
$stream->write("<entry>\n");
$stream->write(encode_utf8 "<title>" . quote_html($id) . "</title>\n");
my $link = to_url($stream, $host, $space, "page/$id", $scheme);
$stream->write("<link href=\"$link\"/>\n");
$stream->write("<id>$link</id>\n");
$stream->write(encode_utf8 "<content type=\"text\">" . quote_html(text($stream, $host, $space, $id)) . "</content>\n");
my ($sec, $min, $hour, $mday, $mon, $year) = gmtime($changes->{$id}); # 2003-12-13T18:30:02Z
my $ts = sprintf("%04d-%02d-%02dT%02d:%02d:%02dZ", $year + 1900, $mon + 1, $mday, $hour, $min, $sec);
$stream->write("<updated>$ts</updated>\n");
$feed_ts = $ts if $ts gt $feed_ts;
$stream->write("</entry>\n");
}
$stream->write("<updated>$feed_ts</updated>\n");
$stream->write("</feed>\n");
}
sub serve_raw {
my $stream = shift;
my $host = shift;
my $space = shift;
my $id = shift;
my $revision = shift;
$log->info("Serving raw $id");
success($stream, 'text/plain; charset=UTF-8');
$stream->write(encode_utf8 text($stream, $host, $space, $id, $revision));
}
sub serve_diff {
my $stream = shift;
my $host = shift;
my $space = shift;
my $id = shift;
my $revision = shift;
my $style = shift;
$log->info("Serving the diff of $id");
success($stream);
$stream->write(encode_utf8 "# Differences for $id\n");
if (not $style) { print_link($stream, $host, $space, "Colour diff", "diff/$id/$revision/colour") }
else { print_link($stream, $host, $space, "Normal diff", "diff/$id/$revision") }
$stream->write("Showing the differences between revision $revision and the current revision.\n");
my $new = text($stream, $host, $space, $id);
my $old = text($stream, $host, $space, $id, $revision);
if (not $style) {
diff($old, $new,
sub { $stream->write(encode_utf8 "$_\n") for @_ },
sub { $stream->write(encode_utf8 "> $_\n") for map { $_||"â" } @_ },
sub { $stream->write(encode_utf8 "> $_\n") for map { $_||"â" } @_ },
sub { "ï½¢$_[0]ï½£" });
} else {
diff($old, $new,
sub { $stream->write(encode_utf8 "$_\n") for @_ },
sub { $stream->write(encode_utf8 "> \033[31m$_\033[0m\n") for map { $_||"â" } @_ },
sub { $stream->write(encode_utf8 "> \033[32m$_\033[0m\n") for map { $_||"â" } @_ },
sub { "\033[1m$_[0]\033[22m" });
}
}
# old text, new text, code reference to print a paragraph, print deleted text,
# print added text
sub diff {
my @old = split(/\n/, shift);
my @new = split(/\n/, shift);
my $paragraph = shift;
my $deleted = shift;
my $added = shift;
my $highlight = shift;
$log->debug("Preparing a diff");
my $diff = Algorithm::Diff->new(\@old, \@new);
$diff->Base(1); # line numbers, not indices
while($diff->Next()) {
next if $diff->Same();
my $sep = '';
my ($min1, $max1, $min2, $max2) = $diff->Get(qw(min1 max1 min2 max2));
( run in 2.118 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )