#!/usr/bin/env perl # txt2pre --- convert my site's txt files to `pre'-based html # Copyright (C) 2014-2021 all contributors # Copyright (c) 2021 Amin Bandali # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # This simple script borrows from a script of the same name from the # wonderful public-inbox project, under AGPLv3+, with additions of # my own. use strict; use warnings 'all'; use Getopt::Long; my $opt_lang = 'en'; my $opt_index; GetOptions ('lang=s' => \$opt_lang, 'index' => \$opt_index) or die("bad command line arguments\n"); my $link_re = qr{([\('!])?\b((?:ftps?|https?|nntps?|imaps?|s?news|gopher):// [\@:\w\.-]+(?:/ (?:[a-z0-9\-\._~!\$\&\';\(\)\*\+,;=:@/%]*) (?:\?[a-z0-9\-\._~!\$\&\';\(\)\*\+,;=:@/%]+)? (?:\#[a-z0-9\-\._~!\$\&\';\(\)\*\+,;=:@/%\?]+)? )? )}xi; my %pairs = ( "(" => qr/(\)[\.,;\+]?)\z/, # Markdown (,), Ruby (+) (, for arrays) "'" => qr/('[\.,;\+]?)\z/, # Perl / Ruby "!" => qr/(![\.,;\+]?)\z/, # Perl / Ruby ); my %html_map = ( '&' => '&', '<' => '<', '>' => '>', # '"' => '"', # "'" => ''', ); sub html_esc { my ($s) = @_; $s =~ s/([&<>])/$html_map{$1}/sge; $s; } sub linkify { my ($s) = @_; $s =~ s^$link_re^ my $beg = $1 || ''; my $url = $2; my $end = ''; # it's fairly common to end URLs in messages with # '.', ',' or ';' to denote the end of a statement; # assume the intent was to end the statement/sentence # in English if (defined(my $re = $pairs{$beg})) { if ($url =~ s/$re//) { $end = $1; } } elsif ($url =~ s/(\))?([\.,;])\z//) { $end = $2; # require ')' to be paired with '(' if (defined $1) { # ')' if (index($url, '(') < 0) { $end = ")$end"; } else { $url .= ')'; } } } elsif ($url !~ /\(/ && $url =~ s/\)\z//) { $end = ')'; } $beg . "$url" . $end; ^geo; $s; } my $txt = do { local $/; }; my $title = html_esc($txt =~ /\A([^\n]+)/); $title =~ s/^\s+|\s+$//g; if ($opt_lang eq 'fa') { $title .= ' — بندعلی' if $title !~ /بندعلی/; } else { $title .= ' — bandali' if $title !~ /bandali/; } my ($upd, $pub, $url) = $txt =~ /(.*)\r?\n(.*)\r?\n(.*)\r?\n?\z/; ($upd) = $upd =~ /(?:updated|ویرایش): (.*)/ if $upd; ($pub) = $pub =~ /(?:published|انتشار): (.*)/ if $pub; ($url) = $url =~ /(?:plain text|متن ساده): (.*)/ if $url; $url = 'https://bndl.org/bandali-cv.txt' if (!$url and $title =~ /curriculum vitae/); $url = html_esc($url) if $url; $txt = linkify(html_esc($txt)); print("", qq(", qq( \n), "$title\n", qq(\n), $url ? qq(\n) : '', ($opt_index and $opt_lang eq 'en') ? qq(\n) : ($opt_index and $opt_lang eq 'fa') ? qq(\n) : '', qq(\n", "
$txt
\n"); STDOUT->flush;