| #!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; |