it* fefes blog on gopher Err codevoid.de 70 i Err codevoid.de 70 hgit clone git://git.codevoid.de/fefe-gopher URL:git://git.codevoid.de/fefe-gopher codevoid.de 70 1Log /git/fefe-gopher/log.gph codevoid.de 70 1Files /git/fefe-gopher/files.gph codevoid.de 70 1Refs /git/fefe-gopher/refs.gph codevoid.de 70 1LICENSE /git/fefe-gopher/file/LICENSE.gph codevoid.de 70 i--- Err codevoid.de 70 1commit 1f3177c6fbe58e3f4ef62b99a7f7828d91129538 /git/fefe-gopher/commit/1f3177c6fbe58e3f4ef62b99a7f7828d91129538.gph codevoid.de 70 hAuthor: Stefan Hagen URL:mailto:github@textmail.me codevoid.de 70 iDate: Sun, 13 May 2018 09:42:28 +0200 Err codevoid.de 70 i Err codevoid.de 70 iInitial commit Err codevoid.de 70 i Err codevoid.de 70 iDiffstat: Err codevoid.de 70 i A LICENSE | 15 +++++++++++++++ Err codevoid.de 70 i A fefe.dcgi | 111 ++++++++++++++++++++++++++++++ Err codevoid.de 70 i Err codevoid.de 70 i2 files changed, 126 insertions(+), 0 deletions(-) Err codevoid.de 70 i--- Err codevoid.de 70 1diff --git a/LICENSE b/LICENSE /git/fefe-gopher/file/LICENSE.gph codevoid.de 70 it@@ -0,0 +1,15 @@ Err codevoid.de 70 i+ Version 2, December 2004 Err codevoid.de 70 i+ Err codevoid.de 70 i+ Copyright (C) 2018 Stefan Hagen Err codevoid.de 70 i+ Err codevoid.de 70 i+ Everyone is permitted to copy and distribute verbatim or modified Err codevoid.de 70 i+copies of this license document, and changing it is allowed as long Err codevoid.de 70 i+ as the name is changed. Err codevoid.de 70 i+ Err codevoid.de 70 i+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE Err codevoid.de 70 i+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION Err codevoid.de 70 i+ Err codevoid.de 70 i+ 0. You just DO WHAT THE FUCK YOU WANT TO. Err codevoid.de 70 i+ Err codevoid.de 70 i+ Err codevoid.de 70 i+ Err codevoid.de 70 1diff --git a/fefe.dcgi b/fefe.dcgi /git/fefe-gopher/file/fefe.dcgi.gph codevoid.de 70 it@@ -0,0 +1,111 @@ Err codevoid.de 70 i+#!/usr/local/bin/perl Err codevoid.de 70 i+ Err codevoid.de 70 i+# LICENSE: WTFPL Err codevoid.de 70 i+# THE CODE IS PROVIDED "AS IS". DO WITH IT WHAT YOU WANT Err codevoid.de 70 i+# Copyright 2018 Stefan Hagen Err codevoid.de 70 i+ Err codevoid.de 70 i+use strict; Err codevoid.de 70 i+use warnings; Err codevoid.de 70 i+ Err codevoid.de 70 i+use Encode; Err codevoid.de 70 i+use XML::LibXML qw( ); Err codevoid.de 70 i+use LWP::UserAgent; Err codevoid.de 70 i+use HTML::LinkExtractor; Err codevoid.de 70 i+use HTML::Restrict; Err codevoid.de 70 i+use Text::Wrap; Err codevoid.de 70 i+$Text::Wrap::columns=80; Err codevoid.de 70 i+ Err codevoid.de 70 i+print ' Err codevoid.de 70 i+ ___ __ ___ _ Err codevoid.de 70 i+ | __|___ / _| ___ ___ | _ )| | ___ __ _ Err codevoid.de 70 i+ | _|/ -_)| _|/ -_)(_-< | _ \| |/ _ \/ _` | Err codevoid.de 70 i+ |_| \___||_| \___|/__/ |___/|_|\___/\__, | Err codevoid.de 70 i+ On Gopher (inofficial) |___/ Err codevoid.de 70 i+------------------------------------------------------------------------------- Err codevoid.de 70 i+[h| Visit Fefes Blog on the Internet|URL:https://blog.fefe.de|codevoid.de|70] Err codevoid.de 70 i+------------------------------------------------------------------------------- Err codevoid.de 70 i+ Err codevoid.de 70 i+ Err codevoid.de 70 i+'; Err codevoid.de 70 i+ Err codevoid.de 70 i+# Fefes Blog Config Err codevoid.de 70 i+my $protocol = "https"; Err codevoid.de 70 i+my $server = "blog.fefe.de"; Err codevoid.de 70 i+my $uri = "/rss.xml?html"; Err codevoid.de 70 i+ Err codevoid.de 70 i+# fetch data Err codevoid.de 70 i+my $REST= ({HOST => "$server", Err codevoid.de 70 i+ URL => "$protocol://$server$uri" }); Err codevoid.de 70 i+$REST->{UA} = LWP::UserAgent->new(keep_alive => 0, timeout => 5); Err codevoid.de 70 i+$REST->{UA}->agent("codevoid-fefe-gopherproxy/0.1"); Err codevoid.de 70 i+$REST->{resource} = $REST->{URL}; Err codevoid.de 70 i+$REST->{request} = HTTP::Request->new( GET => $REST->{resource} ); Err codevoid.de 70 i+$REST->{response} = $REST->{UA}->request( $REST->{request} ); Err codevoid.de 70 i+ Err codevoid.de 70 i+# parse data Err codevoid.de 70 i+my $parser = XML::LibXML->new(); Err codevoid.de 70 i+my $document = $parser->parse_string($REST->{response}->content); Err codevoid.de 70 i+my $root = $document->documentElement(); Err codevoid.de 70 i+ Err codevoid.de 70 i+# loop through items Err codevoid.de 70 i+foreach my $channel ($root->findnodes('channel')) { Err codevoid.de 70 i+ foreach my $item ($channel->findnodes('item')) { Err codevoid.de 70 i+ Err codevoid.de 70 i+ # Encode to proper utf8 Err codevoid.de 70 i+ my $description = encode("UTF-8", $item->findvalue('description')); Err codevoid.de 70 i+ Err codevoid.de 70 i+ # Search for links Err codevoid.de 70 i+ my $LX = new HTML::LinkExtractor(); Err codevoid.de 70 i+ $LX->strip(1); Err codevoid.de 70 i+ $LX->parse(\$description); Err codevoid.de 70 i+ Err codevoid.de 70 i+ # Replace some HTML elements Err codevoid.de 70 i+ my $HR = HTML::Restrict->new(); Err codevoid.de 70 i+ $description =~ s/

/\n\n/g; Err codevoid.de 70 i+ $description =~ s/

/\n\n /g; Err codevoid.de 70 i+ $description =~ s/<\/blockquote>/\n\n/g; Err codevoid.de 70 i+ Err codevoid.de 70 i+ # Strip remaining html Err codevoid.de 70 i+ my $description_clean = $HR->process($description); Err codevoid.de 70 i+ Err codevoid.de 70 i+ # htmldecode (quick fix - could be done properly) Err codevoid.de 70 i+ $description_clean =~ s/&/\&/gi; Err codevoid.de 70 i+ Err codevoid.de 70 i+ # Loop at links, match text, add [counter] and generate output. Err codevoid.de 70 i+ my $c = 0; Err codevoid.de 70 i+ my $links = ""; Err codevoid.de 70 i+ foreach my $link ($LX->links) { Err codevoid.de 70 i+ foreach my $linkitem (@$link) { Err codevoid.de 70 i+ $c++; Err codevoid.de 70 i+ $description_clean =~ s/(\Q$linkitem->{_TEXT}\E)/$1\[$c]/gi; Err codevoid.de 70 i+ Err codevoid.de 70 i+ # shorten links Err codevoid.de 70 i+ my $short = $linkitem->{href}; Err codevoid.de 70 i+ if(length($short) > 70) { $short = substr($short,0,70)." ..."; } Err codevoid.de 70 i+ Err codevoid.de 70 i+ # add link to output scalar Err codevoid.de 70 i+ $links .= sprintf("[h|[%i]: %s|URL:%s|codevoid.de|70]\n", $c, $short, $linkitem->{href}); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ # Wrap to 80 character width Err codevoid.de 70 i+ $description_clean = wrap("","",$description_clean)."\n"; Err codevoid.de 70 i+ Err codevoid.de 70 i+ # fix geomyidae ^t design Err codevoid.de 70 i+ $description_clean =~ s/^t/&&/; Err codevoid.de 70 i+ Err codevoid.de 70 i+ # nobody needs more that one newline. Err codevoid.de 70 i+ $description_clean =~ s/\n\n(\n)*/\n\n/g; Err codevoid.de 70 i+ Err codevoid.de 70 i+ # print! Err codevoid.de 70 i+ print $description_clean, "\nLinks:\n", $links, "\n"; Err codevoid.de 70 i+ print "*******************************************************************************\n\n"; Err codevoid.de 70 i+ } Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+# TODO: Err codevoid.de 70 i+# * consolidate regex and call the regex parser only twice (before parsing => strip / replace html, Err codevoid.de 70 i+# after parsing => format output) Err codevoid.de 70 i+# * proper htmldecode the output Err codevoid.de 70 i+# * maybe ask fefe to include the dates into the feed. Err codevoid.de 70 i+# * add source link somewhere Err codevoid.de 70 .