App-phoebe
view release on metacpan or search on metacpan
lib/App/Phoebe/Oddmuse.pm view on Meta::CPAN
}
my $token = $oddmuse_wiki_tokens{$host};
$token = $server->{wiki_token}->[0] if not $token and $server->{wiki_token};
$stream->write(encode_utf8 "(The access token for short comments is â$tokenâ.)\n");
push(@links, oddmuse_gemini_link($stream, $host, $space, "Leave a short comment", "do/comment/$id"));
push(@links, oddmuse_gemini_link($stream, $host, $space, "How to leave a longer comment", "How_to_comment_without_a_browser"));
push(@links, oddmuse_gemini_link($stream, $host, $space, "Raw comments", "raw/Comments_on_$id")) if $id !~ /^Comments_on_(.*)/;
push(@links, oddmuse_gemini_link($stream, $host, $space, "Raw text", "raw/$id"));
push(@links, oddmuse_gemini_link($stream, $host, $space, "HTML", "html/$id"));
return join("\n", @links, "");
}
sub oddmuse_serve_tag {
my $stream = shift;
my $host = shift;
my $space = shift;
my $tag = shift;
success($stream);
$log->info("Serving tag $tag");
$stream->write("This page is about the tag $tag.\n");
print_link($stream, $host, $space, normal_to_free($tag), "tag/$tag");
$stream->write("\n");
my $url = "$oddmuse_wikis{$host}?raw=1&search=tag:$tag";
my $page = oddmuse_get_raw($stream, $url) // return;
my @entries = split(/\n\n+/, $page);
shift @entries; # skip head
foreach my $entry (@entries) {
my $data = parse_data($entry);
my $id = $data->{title};
print_link($stream, $host, $space, normal_to_free($id), "page/$id");
}
}
sub parse_data {
my $data = shift;
my %result = (description => "");
while ($data =~ /(\S+?): (.*?)(?=\n[^ \t]|\Z)/gs) {
my ($key, $value) = ($1, $2);
$value =~ s/\n\t/\n/g;
$result{$key} = $value;
}
return \%result;
}
sub oddmuse_serve_raw {
my $stream = shift;
my $host = shift;
my $space = shift;
my $id = shift;
my $revision = shift;
my $url = "$oddmuse_wikis{$host}";
$url .= "/$space" if $space;
$url .= "/raw/" . uri_escape_utf8($id);
$url .= "?revision=$revision" if $revision;
my $page = oddmuse_get_raw($stream, $url) // return;
if (my ($type, $data) = $page =~ /^#FILE (\S+) ?(?:\S+)?\n(.*)/s) {
oddmuse_serve_file_page($stream, $id, $type, $data);
return;
}
$log->info("Serving raw $id");
success($stream, 'text/plain; charset=UTF-8');
$stream->write(encode_utf8 $page);
}
sub oddmuse_serve_html {
my $stream = shift;
my $host = shift;
my $space = shift;
my $id = shift;
my $revision = shift;
my $url = "$oddmuse_wikis{$host}";
$url .= "/$space" if $space;
$url .= "/" . uri_escape_utf8($id);
$url .= "?revision=$revision" if $revision;
my $page = oddmuse_get_raw($stream, $url) // return;
$log->info("Serving $id as HTML");
success($stream, 'text/html');
$stream->write(encode_utf8 $page);
}
sub free_to_normal {
my $title = shift;
$title =~ s/^ +//g;
$title =~ s/ +$//g;
$title =~ s/ +/_/g;
return $title;
}
sub normal_to_free {
my $title = shift;
$title =~ s/_/ /g;
return $title;
}
# this is required when combining gopher with oddmuse!
*blog_pages_old = \&App::Phoebe::blog_pages;
*App::Phoebe::blog_pages = \&blog_pages;
sub blog_pages {
my $stream = shift;
my $host = shift;
my $space = shift;
my $n = shift;
if (exists $oddmuse_wikis{$host}) {
my $url = "$oddmuse_wikis{$host}?raw=1;action=index;match=^\\d\\d\\d\\d\\-\\d\\d-\\d\\d;n=$n";
return map { s/_/ /g; $_ } split(/\n/, oddmuse_get_raw($stream, $url) // '');
}
return blog_pages_old($stream, $host, $space, $n);
}
sub oddmuse_blog {
my $stream = shift;
my $host = shift;
my $space = shift;
my $n = shift;
my @pages = blog_pages($stream, $host, $space, $n);
return unless @pages;
for my $id (@pages) {
print_link($stream, $host, $space, normal_to_free($id), "page/$id");
}
print_link($stream, $host, $space, "More...", "do/blog/" . 10 * $n);
( run in 0.534 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )