#!perl -w
# n.b. this is invoked via $(PERL) in makefiles
# Copyright (C) all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
#
# Stupid script to make HTML from preformatted, utf-8 text versions,
# only generating links for http(s).  Markdown does too much
# and requires indentation to output preformatted text.
use v5.12;
use PublicInbox::Linkify;
use PublicInbox::Hval qw(ascii_html);
my (%xurls, %lei);
for (qw[lei(1)
	lei-add-external(1)
	lei-add-watch(1)
	lei-blob(1)
	lei-config(1)
	lei-convert(1)
	lei-daemon(8)
	lei-daemon-kill(1)
	lei-daemon-pid(1)
	lei-edit-search(1)
	lei-export-kw(1)
	lei-forget-external(1)
	lei-forget-mail-sync(1)
	lei-forget-search(1)
	lei-import(1)
	lei-index(1)
	lei-init(1)
	lei-inspect(1)
	lei-lcat(1)
	lei-ls-external(1)
	lei-ls-label(1)
	lei-ls-mail-source(1)
	lei-ls-mail-sync(1)
	lei-ls-search(1)
	lei-ls-watch(1)
	lei-mail-diff(1)
	lei-mail-sync-overview(7)
	lei-overview(7)
	lei-p2q(1)
	lei-q(1)
	lei-rediff(1)
	lei-refresh-mail-sync(1)
	lei-reindex(1)
	lei-rm(1)
	lei-rm-watch(1)
	lei-security(7)
	lei-store-format(5)
	lei-tag(1)
	lei-up(1)
	public-inbox.cgi(1)
	public-inbox-cindex(1)
	public-inbox-clone(1)
	public-inbox-config(5)
	public-inbox-convert(1)
	public-inbox-daemon(8)
	public-inbox-edit(1)
	public-inbox-extindex(1)
	public-inbox-fetch(1)
	public-inbox-glossary(7)
	public-inbox-httpd(1)
	public-inbox-imapd(1)
	public-inbox-index(1)
	public-inbox-init(1)
	public-inbox-learn(1)
	public-inbox-mda(1)
	public-inbox-netd(1)
	public-inbox-nntpd(1)
	public-inbox-overview(7)
	public-inbox-pop3d(1)
	public-inbox-purge(1)
	public-inbox-v1-format(5)
	public-inbox-v2-format(5)
	public-inbox-watch(1)
	public-inbox-xcpdb(1)
]) {
	my ($n) = (/([\w\-\.]+)/);
	$xurls{$_} = "$n.html";
	$xurls{$n} = "$n.html";
	/\Alei-(.+?)\(1\)\z/ and $xurls{"lei $1"} = "$n.html";
}

$xurls{'lei/store'} = 'lei-store-format.html';

for (qw[make(1) flock(2) setrlimit(2) vfork(2) tmpfs(5) inotify(7) unix(7)
		syslog(3)]) {
	my ($n, $s) = (/([\w\-]+)\((\d)\)/);
	$xurls{$_} = "https://www.man7.org/linux/man-pages/man$s/$n.$s.html";
}

for (qw[git(1)
	git-am(1)
	git-apply(1)
	git-config(1)
	git-credential(1)
	git-daemon(1)
	git-diff(1)
	git-fast-import(1)
	git-fetch(1)
	git-filter-branch(1)
	git-format-patch(1)
	git-gc(1)
	git-http-backend(1)
	git-imap-send(1)
	git-init(1)
	git-send-email(1)
	gitrepository-layout(5)
	gitglossary(7)
]) {
	my ($n) = (/([\w\-\.]+)/);
	$xurls{$_} = "https://kernel.org/pub/software/scm/git/docs/$n.html"
}

for (qw[
	sd_listen_fds(3)
	systemd(1)
	systemd.unit(5)
	systemd.socket(5)
]) {
	my ($n) = (/([\w\-\.]+)/);
	$xurls{$_} = "https://www.freedesktop.org/software/systemd/man/$n.html";
}

# favor upstream docs if they exist, use manpages.debian.org if they don't
$xurls{'netrc(5)'} = 'https://manpages.debian.org/stable/ftp/netrc.5.en.html';
$xurls{'mbsync(1)'} =
	'https://manpages.debian.org/stable/isync/mbsync.1.en.html';
$xurls{'offlineimap(1)'} =
	'https://manpages.debian.org/stable/offlineimap/offlineimap.1.en.html';
$xurls{'spamc(1)'} =
	'https://spamassassin.apache.org/full/3.4.x/doc/spamc.html';
$xurls{'grok-pull'} =
	'https://git.kernel.org/pub/scm/utils/grokmirror/grokmirror.git' .
	'/tree/man/grok-pull.1.rst';
$xurls{'git-filter-repo(1)'} = 'https://github.com/newren/git-filter-repo'.
			'/blob/master/Documentation/git-filter-repo.txt';
$xurls{'ssoma(1)'} = 'https://ssoma.public-inbox.org/ssoma.txt';
$xurls{'cgitrc(5)'} = 'https://git.zx2c4.com/cgit/tree/cgitrc.5.txt';
$xurls{'prove(1)'} = 'https://perldoc.perl.org/prove.html';
$xurls{'mbox(5)'} = 'https://manpages.debian.org/stable/mutt/mbox.5.en.html';
$xurls{'mmdf(5)'} = 'https://manpages.debian.org/stable/mutt/mmdf.5.en.html';
$xurls{'mutt(1)'} = 'https://manpages.debian.org/stable/mutt/mutt.1.en.html';
$xurls{'torsocks(1)'} =
	'https://manpages.debian.org/stable/torsocks/torsocks.1.en.html';
$xurls{'curl(1)'} = 'https://manpages.debian.org/stable/curl/curl.1.en.html';
$xurls{'copydatabase(1)'} =
 'https://manpages.debian.org/stable/xapian-tools/copydatabase.1.en.html';
$xurls{'xapian-compact(1)'} =
 'https://manpages.debian.org/stable/xapian-tools/xapian-compact.1.en.html';
$xurls{'xapian-delve(1)'} =
 'https://manpages.debian.org/stable/xapian-tools/xapian-delve.1.en.html';
$xurls{'gzip(1)'} = 'https://manpages.debian.org/stable/gzip/gzip.1.en.html';
$xurls{'chmod(1)'} =
	'https://manpages.debian.org/stable/coreutils/chmod.1.en.html';
$xurls{'kqueue(2)'} =
	'https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2';
$xurls{'notmuch(1)'} = 'https://notmuchmail.org/manpages/notmuch-1/';
$xurls{'mairix(1)'} =
	'https://manpages.debian.org/stable/mairix/mairix.1.en.html';

my $str = do { local $/; <STDIN> };
my ($title) = ($str =~ /\A([^\n]+)/);
if ($str =~ /^NAME\n\s+([^\n]+)/sm) {
	# don't link to ourselves
	$title = $1;
	if ($title =~ /([\w\.\-]+)/) {
		delete $xurls{$1};
	}
	if ($title =~ /\blei-([\w\-]+)\b/) {
		delete $xurls{"lei $1"};
	}
}
$title = ascii_html($title);
my $l = PublicInbox::Linkify->new;
$str = $l->linkify_1($str);
$str = ascii_html($str);

# longest matches, first
my @keys = sort { length($b) <=> length($a) } keys %xurls;
my $xkeys = join('|', map { quotemeta } @keys);
$str =~ s,(?<![>\w_])($xkeys)(?!(?:[\w<\-]|\.html)),
	qq(<a\nhref=").$xurls{$1}.qq(">$1).($2//'').'</a>',sge;

$str = $l->linkify_2($str);

print '<html><head>',
  qq(<meta\nhttp-equiv="Content-Type"\ncontent="text/html; charset=utf-8"\n/>),
  "<title>$title</title>",
  "</head><body><pre>",  $str , '</pre></body></html>';
STDOUT->flush;
