1 |
#!/usr/bin/perl |
2 |
# $Id: mikiman,v 1.4 2004/06/15 12:06:08 kripke Exp $ |
3 |
|
4 |
# convert a http://openisis.org/Doc/MikiDoc to manpage |
5 |
# uti/mikiman <doc/CmdLine.txt |nroff -man|less |
6 |
# |
7 |
# first section is always assumed NAME |
8 |
# document should have standard * sections |
9 |
# SYNOPSIS DESCRIPTION OPTIONS RETURN VALUES ENVIRONMENT FILES |
10 |
# EXAMPLES DIAGNOSTICS ERRORS SEE ALSO STANDARDS BUGS |
11 |
# SECURITY CONSIDERATIONS |
12 |
# |
13 |
# ; is a comment line. a first line starting ;man sets textheading and man mode |
14 |
# $ (code mode) toggles .nf - .fi (nofill - fill) |
15 |
# * is .SH |
16 |
# - is .TP or .HP in man mode, else .IP \(bu |
17 |
# *foo* is .B |
18 |
# _foo_ is .IR |
19 |
# |
20 |
# c.f. man groff_man |
21 |
# c.f. http://www.schweikhardt.net/man_page_howto.html |
22 |
# c.f. http://cm.bell-labs.com/sys/doc/troff.html |
23 |
# |
24 |
# TODO: should get .TH defaults from .man file |
25 |
# TODO: use tbl for ||| constructs |
26 |
|
27 |
use POSIX qw(strftime); |
28 |
|
29 |
$mode = 'p'; # plain code list table |
30 |
$noman = 1; |
31 |
# if first line has man instructions, treat as real manpage |
32 |
# else use "documentation" mode |
33 |
$_ = <STDIN>; |
34 |
if (/^;man/) { |
35 |
chomp; |
36 |
($foo, $title, $section, $footmid, $footleft, $headmid) = split /\t/; |
37 |
$noman = 0; |
38 |
$_ = <STDIN>; |
39 |
} else { |
40 |
($title, $section) = ($ARGV[0] || 'malete', $ARGV[1] || 7); |
41 |
} |
42 |
$footmid ||= gmtime; |
43 |
$footleft ||= 'Malete 0.9.9x'; |
44 |
$headmid ||= 'Malete database'; |
45 |
print ".TH \"$title\" \"$section\" \"$footmid\" \"$footleft\" \"$headmid\" |
46 |
.SH NAME |
47 |
"; |
48 |
|
49 |
do {{ |
50 |
($mark, $line) = /(.)\t?(.*)/; |
51 |
if ('c' eq $mode) { # in code mode |
52 |
if ('$' ne $mark) { |
53 |
print $_; |
54 |
} else { |
55 |
$mode = 'p'; |
56 |
print ".fi\n\n"; |
57 |
} |
58 |
next; |
59 |
} |
60 |
$pre = ''; |
61 |
if ('l' eq $mode && $mark !~ /[->\t]/) { # end list |
62 |
print ".P\n"; |
63 |
$mode = 'p'; |
64 |
} |
65 |
if ('*' eq $mark) { # section heading |
66 |
$pre = '.SH '; |
67 |
$line = uc($line); |
68 |
} elsif ('-' eq $mark) { # start list entry |
69 |
if ( $line =~ /^--/ ) { print "\n\\l'|40'\n.P\n"; next; } |
70 |
$pre = $noman ? ".IP \\(bu 4\n" # noice bullets in noman's land |
71 |
: 40 > length($line) ? ".TP\n.I " : ".HP\n"; |
72 |
$mode = 'l'; |
73 |
} elsif ('$' eq $mark) { |
74 |
$pre = '.nf'; |
75 |
$mode = 'c'; |
76 |
} elsif ('>' eq $mark) { # link |
77 |
$pre = '.I '; |
78 |
if (2 == (($tgt,$name) = split(/\t/, $line))) { |
79 |
$line = "$name (\\(-> $tgt)" |
80 |
} else { |
81 |
$pre .= '\\(-> '; |
82 |
} |
83 |
} elsif (';' eq $mark) { # comment |
84 |
next; |
85 |
} elsif ("\t" eq $mark) { # nothing |
86 |
} else { |
87 |
chomp($line = $_); |
88 |
} |
89 |
$line =~ s/^\./\\&./; # prepend the "zero width filler" |
90 |
$line =~ s/_(\S+)_/\\fI$1\\fR/g; |
91 |
$line =~ s/\*(\S+)\*/\\fB$1\\fR/g; |
92 |
print $pre, $line, "\n"; |
93 |
}} while (<STDIN>); |