mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-22 10:58:10 +01:00
devel: make man-to-mdwn.pl to work with generated manual pages
The new manual pages converted from rst using sphinx or rst2man has somewhat different syntax. man-to-mdwn.pl is now adjusted to produce even better output from this syntax. The changes also include using utf-8 locale (e.g. for tables and generated hypens) and and quite a few bugs fixes. This tool still produces better results than just using the html pages generated using sphinx / rst2html. For example those tools don't create inter-page hyperlinks -- and the preformatted pages written by man-to-mdwn.pl just works well with manual page content.
This commit is contained in:
parent
0d40b37954
commit
f7be8f4ebf
1 changed files with 22 additions and 20 deletions
|
@ -6,18 +6,18 @@
|
||||||
# This program is used to generate mdwn-formatted notmuch manual pages
|
# This program is used to generate mdwn-formatted notmuch manual pages
|
||||||
# for notmuch wiki. Example run:
|
# for notmuch wiki. Example run:
|
||||||
#
|
#
|
||||||
# $ ./devel/man-to-mdwn.pl man ../notmuch-wiki
|
# $ ./devel/man-to-mdwn.pl doc/_build/man ../notmuch-wiki
|
||||||
#
|
#
|
||||||
# In case taken into more generic use, modify these comments and examples.
|
# In case taken into more generic use, modify these comments and examples.
|
||||||
|
|
||||||
use 5.8.1;
|
use 5.10.1;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
unless (@ARGV == 2) {
|
unless (@ARGV == 2) {
|
||||||
warn "\n$0 <source-directory> <destination-directory>\n\n";
|
warn "\n$0 <source-directory> <destination-directory>\n\n";
|
||||||
# Remove/edit this comment if this script is taken into generic use.
|
# Remove/edit this comment if this script is taken into generic use.
|
||||||
warn "Example: ./devel/man-to-mdwn.pl man ../notmuch-wiki\n\n";
|
warn "Example: ./devel/man-to-mdwn.pl doc/_build/man ../notmuch-wiki\n\n";
|
||||||
exit 1;
|
exit 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,11 +48,6 @@ while (<P>)
|
||||||
}
|
}
|
||||||
close P;
|
close P;
|
||||||
|
|
||||||
#undef $ENV{'GROFF_NO_SGR'};
|
|
||||||
#delete $ENV{'GROFF_NO_SGR'};
|
|
||||||
$ENV{'GROFF_NO_SGR'} = '1';
|
|
||||||
$ENV{'TERM'} = 'vt100'; # does this matter ?
|
|
||||||
|
|
||||||
my %htmlqh = qw/& & < < > > ' ' " "/;
|
my %htmlqh = qw/& & < < > > ' ' " "/;
|
||||||
# do html quotation to $_[0] (which is an alias to the given arg)
|
# do html quotation to $_[0] (which is an alias to the given arg)
|
||||||
sub htmlquote($)
|
sub htmlquote($)
|
||||||
|
@ -70,8 +65,11 @@ while (my ($k, $v) = each %fhash)
|
||||||
#next if -l $v; # skip symlinks here. -- not... references there may be.
|
#next if -l $v; # skip symlinks here. -- not... references there may be.
|
||||||
|
|
||||||
my @lines;
|
my @lines;
|
||||||
#open I, '-|', qw/groff -man -T utf8/, $v;
|
open I, '-|', qw/env -i/, "PATH=$ENV{PATH}",
|
||||||
open I, '-|', qw/groff -man -T latin1/, $v; # this and GROFF_NO_SGR='1'
|
qw/TERM=vt100 LANG=en_US.utf8 LC_ALL=en_US.utf8/,
|
||||||
|
qw/GROFF_NO_SGR=1 MAN_KEEP_FORMATTING=1 MANWIDTH=80/,
|
||||||
|
qw/man/, $v or die "$!";
|
||||||
|
binmode I, ':utf8';
|
||||||
|
|
||||||
my ($emptyline, $pre, $hl) = (0, 0, 'h1');
|
my ($emptyline, $pre, $hl) = (0, 0, 'h1');
|
||||||
while (<I>) {
|
while (<I>) {
|
||||||
|
@ -79,13 +77,15 @@ while (my ($k, $v) = each %fhash)
|
||||||
$emptyline = 1;
|
$emptyline = 1;
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
s/(?<=\S)\s{8,}.*//; # $hl = 'h1' if s/(?<=\S)\s{8,}.*//;
|
# keep only leftmost in lines like 'NOTMUCH(1) notmuch NOTMUCH(1)'
|
||||||
htmlquote $_;
|
s/\S\K\s{8,}\S.+\s{8,}\S.*//; # $hl = 'h1' if s/(?<=\S)\s{8,}.*//;
|
||||||
s/[_&]\010&/&/g;
|
s/[_&]\010&/&/g;
|
||||||
s/((?:_\010[^_])+)/<u>$1<\/u>/g;
|
s/((?:_\010[^_])+)/\001u\002$1\001\/u\002/g;
|
||||||
s/_\010(.)/$1/g;
|
s/_\010(.)/$1/g;
|
||||||
s/((?:.\010.)+)/<b>$1<\/b>/g;
|
s/((?:.\010.)+)/\001b\002$1\001\/b\002/g;
|
||||||
s/.\010(.)/$1/g;
|
s/.\010(.)/$1/g;
|
||||||
|
htmlquote $_;
|
||||||
|
s/\001/</g; s/\002/>/g;
|
||||||
|
|
||||||
if (/^\S/) {
|
if (/^\S/) {
|
||||||
$pre = 0, push @lines, "</pre>\n" if $pre;
|
$pre = 0, push @lines, "</pre>\n" if $pre;
|
||||||
|
@ -111,16 +111,18 @@ while (my ($k, $v) = each %fhash)
|
||||||
$lines[0] =~ s/^\n//;
|
$lines[0] =~ s/^\n//;
|
||||||
$k = "$ARGV[1]/manpages/$k.mdwn";
|
$k = "$ARGV[1]/manpages/$k.mdwn";
|
||||||
open O, '>', $k or die;
|
open O, '>', $k or die;
|
||||||
|
binmode O, ':utf8';
|
||||||
print STDOUT 'Writing ', "'$k'\n";
|
print STDOUT 'Writing ', "'$k'\n";
|
||||||
select O;
|
select O;
|
||||||
my $pe = '';
|
my ($pe, $hyphen) = ('', '');
|
||||||
foreach (@lines) {
|
foreach (@lines) {
|
||||||
|
#print $_; next;
|
||||||
if ($pe) {
|
if ($pe) {
|
||||||
if (s/^(\s+)<b>([^<]+)<\/b>\((\d+)\)//) {
|
if (s/^(\s+)<b>([^<]+)\((\d+)\)<\/b>//) {
|
||||||
my $link = maymakelink "$pe-$2-$3";
|
my $link = maymakelink "$pe-$2-$3";
|
||||||
$link = maymakelink "$pe$2-$3" unless $link;
|
$link = maymakelink "$pe$2-$3" unless $link;
|
||||||
if ($link) {
|
if ($link) {
|
||||||
print "<a href='$link'>$pe-</a>\n";
|
print "<a href='$link'>$pe$hyphen</a>\n";
|
||||||
print "$1<a href='$link'>$2</a>($3)";
|
print "$1<a href='$link'>$2</a>($3)";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -132,8 +134,8 @@ while (my ($k, $v) = each %fhash)
|
||||||
}
|
}
|
||||||
$pe = '';
|
$pe = '';
|
||||||
}
|
}
|
||||||
s/<b>([^<]+)<\/b>\((\d+)\)/mayconvert($1, $2)/ge;
|
s/<b>([^<]+)\((\d+)\)<\/b>/mayconvert($1, $2)/ge;
|
||||||
$pe = $1 if s/<b>([^<]+)-<\/b>\s*$//;
|
($pe, $hyphen) = ($1, $2) if s/<b>([^<]+)([-\x{2010}])<\/b>\s*$//;
|
||||||
print $_;
|
print $_;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -169,7 +171,7 @@ foreach (sort srt values %fhash)
|
||||||
open I, '<', $in or die $!;
|
open I, '<', $in or die $!;
|
||||||
my $s;
|
my $s;
|
||||||
while (<I>) {
|
while (<I>) {
|
||||||
if (/^\s*[.]TH\s+\S+\s+(\S+)/) {
|
if (/^\s*[.]TH\s+\S+\s+"?(\S+?)"?\s/) {
|
||||||
$s = $1;
|
$s = $1;
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue