App-phoebe
view release on metacpan or search on metacpan
lib/App/Phoebe.pm view on Meta::CPAN
push @lines, "<pre class=\"$type\">";
$code = 1;
}
} elsif ($code) {
push @lines, $_;
} elsif (/^\* +(.*)/) {
push @lines, "<ul>" unless $list;
push @lines, "<li>$1";
$list = 1;
} elsif (my ($url, $text) = /^=>\s*(\S+)\s*(.*)/) { # quoted HTML!
push @lines, "<ul>" unless $list;
$text ||= $url;
push @lines, "<li><a href=\"$url\">$text</a>";
$list = 1;
} elsif (/^(#{1,6})\s*(.*)/) {
push @lines, "</ul>" if $list;
$list = 0;
my $level = length($1);
push @lines, "<h$level>$2</h$level>";
} elsif (/^>\s*(.*)/) { # quoted HTML!
push @lines, "</ul>" if $list;
$list = 0;
push @lines, "<blockquote>$1</blockquote>";
} else {
push @lines, "</ul>" if $list;
$list = 0;
push @lines, "<p>$_";
}
}
push @lines, "</pre>" if $code;
push @lines, "</ul>" if $list;
return join("\n", @lines);
}
sub html_footer {
my $stream = shift;
my $host = shift;
my $space = shift;
my $id = shift;
my $revision = shift||"";
my @links;
push(@links, $_->($stream, $host, $space, $id, $revision, "html")) for @footer;
my $html = join("\n", grep /\S/, @links);
return "\n\nMore:\n$html" if $html =~ /\S/;
return "";
}
sub day {
my $stream = shift;
my ($sec, $min, $hour, $mday, $mon, $year) = gmtime(shift);
return sprintf('%4d-%02d-%02d', $year + 1900, $mon + 1, $mday);
}
sub time_of_day {
my $stream = shift;
my ($sec, $min, $hour, $mday, $mon, $year) = gmtime(shift);
return sprintf('%02d:%02d UTC', $hour, $min);
}
sub modified {
my $ts = (stat(shift))[9];
return $ts;
}
sub serve_history {
my $stream = shift;
my $host = shift;
my $space = shift;
my $id = shift;
my $n = shift;
my $style = shift;
success($stream);
$log->info("Serve history for $id");
$stream->write(encode_utf8 "# Page history for $id\n");
if (not $style) { print_link($stream, $host, $space, "Colour history", "history/$id/$n/colour") }
elsif ($style eq "colour") { print_link($stream, $host, $space, "Fancy history", "history/$id/$n/fancy") }
elsif ($style eq "fancy") { print_link($stream, $host, $space, "Normal history", "history/$id/$n") }
my $dir = wiki_dir($host, $space);
my $log = "$dir/changes.log";
if (not -e $log) {
$stream->write("No changes.\n");
return;
}
$stream->write("Showing up to $n changes.\n");
my $fh = File::ReadBackwards->new($log);
return unless changes($stream,
$n,
sub { $stream->write("## " . shift . "\n") },
sub { $stream->write(shift . " by " . colourize($stream, shift, $style) . "\n") },
sub { print_link($stream, @_) },
sub { $stream->write(join("\n", @_, "")) },
sub {
READ:
return unless $_ = decode_utf8($fh->readline);
chomp;
my ($ts, $id_log, $revision, $code) = split(/\x1f/);
goto READ if $id_log ne $id;
$ts, $id_log, $revision, $code, $host, $space, 0 });
$stream->write("\n");
print_link($stream, $host, $space, "More...", "history/" . uri_escape_utf8($id) . "/" . 10 * $n . ($style ? "/$style" : ""));
}
sub footer {
my $stream = shift;
my $host = shift;
my $space = shift;
my $id = shift;
my $revision = shift||"";
my @links;
push(@links, gemini_link($stream, $host, $space, "History", "history/$id"));
push(@links, gemini_link($stream, $host, $space, "Raw text", "raw/$id/$revision"));
push(@links, gemini_link($stream, $host, $space, "HTML", "html/$id/$revision"));
push(@links, $_->($stream, $host, $space, $id, $revision, "gemini")) for @footer;
return join("\n", "\n\nMore:", (grep /\S/, @links), ""); # includes a trailing newline
}
sub serve_page {
my $stream = shift;
my $host = shift;
my $space = shift;
my $id = shift;
( run in 2.355 seconds using v1.01-cache-2.11-cpan-5837b0d9d2c )