App-phoebe
view release on metacpan or search on metacpan
lib/App/Phoebe/Oddmuse.pm view on Meta::CPAN
package App::Phoebe::Oddmuse;
use App::Phoebe qw(@request_handlers @extensions @main_menu $server $log $full_url_regex
success result reserved_regex port gemini_link modified changes diff
colourize quote_html bogus_hash print_link);
use Mojo::UserAgent;
use Modern::Perl;
use MIME::Base64;
use URI::Escape;
use List::Util qw(uniq);
use Encode qw(encode_utf8 decode_utf8);
use DateTime::Format::ISO8601;
use utf8; # the source contains UTF-8 encoded strings
no warnings 'redefine';
# Oddmuse Wiki
our %oddmuse_wikis = (
"alexschroeder.ch" => "http://localhost:4023/wiki",
"communitywiki.org" => "http://localhost:4019/wiki",
"emacswiki.org" => "http://localhost:4002/wiki" );
lib/App/Phoebe/Oddmuse.pm view on Meta::CPAN
my $data = parse_data($entry);
# namespaces
my $ns = $space;
my $title = $data->{title};
if (not $ns and $title =~ /:/) {
($ns, $title) = split(/:/, $title);
}
# timestamp from 2020-07-22T20:59Z back to a number
my $ts = $data->{"last-modified"};
$ts =~ s/Z/:00Z/; # apparently seconds are mandatory?
$ts = DateTime::Format::ISO8601->parse_datetime($ts)->epoch();
# author from some string back to a bogus hash: [0-7]{4}
my $author = $data->{generator};
$author = bogus_hash($stream, encode_utf8($author)) unless $author =~ /^[0-7]{4}$/;
push(@$log, [
$ts,
free_to_normal($title),
$data->{revision},
$author,
$host,
$ns,
lib/App/Phoebe/Oddmuse.pm view on Meta::CPAN
$url .= ";ns=$space" if $space;
my $page = oddmuse_get_raw($stream, $url) // return;
my @entries = split(/\n\n+/, $page);
shift @entries; # skip head
my $log;
foreach my $entry (@entries) {
my $data = parse_data($entry);
# timestamp from 2020-07-22T20:59Z back to a number
my $ts = $data->{"last-modified"};
$ts =~ s/Z/:00Z/; # apparently seconds are mandatory?
$ts = DateTime::Format::ISO8601->parse_datetime($ts)->epoch();
# author from some string back to a bogus hash: [0-7]{4}
my $author = $data->{generator};
$author = bogus_hash($stream, encode_utf8($author)) unless $author =~ /^[0-7]{4}$/;
push(@$log, [
$ts,
free_to_normal($data->{title}),
$data->{revision},
$author,
$host,
$space, # space
lib/App/Phoebe/Oddmuse.pm view on Meta::CPAN
my $link = "gemini://$host:$port/" . ($ns ? "$ns/" : "") . "page/" . uri_escape_utf8(free_to_normal($title));
$stream->write("<link>$link</link>\n");
$stream->write("<guid>$link</guid>\n");
$link = "gemini://$host:$port/" . ($ns ? "$ns/" : "") . "page/Comments_on_" . uri_escape_utf8(free_to_normal($title));
$stream->write("<comments>$link</comments>\n");
my $summary = quote_html(oddmuse_gemini_text($stream, $host, $space, $data->{description}));
$stream->write(encode_utf8 "<description>$summary</description>\n") if $summary;
# timestamp from 2020-07-22T20:59Z back to a number
my $ts = $data->{"last-modified"};
$ts =~ s/Z/:00Z/; # apparently seconds are mandatory?
$ts = DateTime::Format::ISO8601->parse_datetime($ts)->epoch();
my ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime($ts); # Sat, 07 Sep 2002 00:00:01 GMT
$stream->write("<pubDate>"
. sprintf("%s, %02d %s %04d %02d:%02d:%02d GMT", qw(Sun Mon Tue Wed Thu Fri Sat)[$wday], $mday,
qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)[$mon], $year + 1900, $hour, $min, $sec)
. "</pubDate>\n");
$stream->write("</item>\n");
};
$stream->write("</channel>\n");
$stream->write("</rss>\n");
}
t/Oddmuse.t view on Meta::CPAN
use Encode;
use Encode::Locale;
use File::Slurper qw(write_text);
use Test::More;
use utf8; # tests contain UTF-8 characters and it matters
my $msg;
if (not $ENV{TEST_AUTHOR}) {
$msg = 'Contributions are an author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
} else {
for my $module (qw(CGI Mojolicious::Plugin::CGI DateTime::Format::ISO8601)) {
if (not defined eval "require $module") {
$msg = "You need to install the $module module for this test: $@";
last;
}
}
}
plan skip_all => $msg if $msg;
# Start the Oddmuse server
t/oddmuse-gopher.t view on Meta::CPAN
use Encode;
use Encode::Locale;
use Test::More;
use URI::Escape;
use utf8; # tests contain UTF-8 characters and it matters
my $msg;
if (not $ENV{TEST_AUTHOR}) {
$msg = 'Contributions are an author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
} else {
for my $module (qw(CGI Mojolicious::Plugin::CGI DateTime::Format::ISO8601)) {
if (not defined eval "require $module") {
$msg = "You need to install the $module module for this test: $@";
last;
}
}
}
plan skip_all => $msg if $msg;
# Start the Oddmuse server
t/prerequisites.t view on Meta::CPAN
IO::Socket::IP List::Util Mojo::IOLoop Mojo::IOLoop::Server
Mojo::Log Mojo::JSON Mojo::UserAgent Pod::Text Socket Term::ReadLine
Test::More utf8 warnings Exporter Data::Dumper MIME::Base64
Pod::Checker Term::ANSIColor),
# Skip modules used for some of the plugins. This is a judgement call.
# Do we need them or not? Most people won't be installing these, I'm
# sure.
qw(File::MimeInfo), # Iapetus.pm
qw(Graph::Easy), # Ijirait.pm
qw(Text::Wrapper), # Gopher.pm, Spartan.pm
qw(DateTime::Format::ISO8601), # Oddmuse.pm
qw(MediaWiki::API Text::SpanningTable), # Wikipedia.pm
qw(Net::DNS Net::IP), # SpeedBump.pm
qw(Devel::MAT::Dumper), # HeapDump.pm
# Skip modules that are only used for author tests.
qw(IPC::Open2), # Chat.t
]);
( run in 0.328 second using v1.01-cache-2.11-cpan-05444aca049 )