mirror of
https://github.com/ldmud/ldmud
synced 2026-08-12 14:26:05 -04:00
117 lines
3.5 KiB
Awk
117 lines
3.5 KiB
Awk
#! /usr/local/bin/gawk -f
|
|
# a simple example script to convert a manpage into a LaTeX section
|
|
# ToDo:
|
|
# - preserve line breaks and indentation in Examples
|
|
# - generate index entries for the section names
|
|
# - generate cross references for the See Also entries.
|
|
|
|
## The behaviour of GNU awk was changed somewhere between versions 2.15.0
|
|
## and 2.15.5, regarding the backslash and & in the gsub() invocations
|
|
## below. If you get ampersands instead of backslash-underscores in
|
|
## the output, you need to experiment with the second arg of the gsub()s,
|
|
## maybe add two more backslashes (making 6 in total)
|
|
## Pepel sighs deeply
|
|
##
|
|
|
|
# firts, substitute electrical characters
|
|
{ gsub(/\\/,"$\\backslash$");
|
|
gsub(/[_{}%&\#\^]/, "\\\\&");
|
|
gsub(/[<>]/,"$&$");
|
|
## gsub("\"","\\quote+\"+");
|
|
# gsub("\{", "\\{");
|
|
# gsub("\}", "\\}");
|
|
# print $0;
|
|
}
|
|
|
|
/^NAME|^CONCEPT/ { state = "name";
|
|
# getline line;
|
|
# split(line, name, "[ \t]+");
|
|
# gsub(/[_{}%&]/, "\\\\&", name[1]);
|
|
# printf("\\section{%s\\label{%s-section}}\n",
|
|
# name[1], name[1]);
|
|
# print line "\\\\";
|
|
next;
|
|
}
|
|
/^SYNOPSIS/ { state = "syn";
|
|
# getline line; name = line;
|
|
# ## gsub(/[ \t]+/," ",name);
|
|
# ## print l;
|
|
# sub(/^[ \t]*[a-z]+[ \t]+\**/,"", name);
|
|
# sub(/\([^)]*\)/,"()", name);
|
|
# sub(/\).*$/,")", name);
|
|
# gsub(/[_{}%&]/, "\\\\&", name);
|
|
# gsub(/[_{}%&]/, "\\\\&", line);
|
|
# # print name;
|
|
# printf("\\section{%s\\label{%s-section}}\n", name, name);
|
|
# print line "\\\\"
|
|
next;
|
|
}
|
|
/^LAST UPDATE/ { state = "X"; print "\\subsection*{Last Update}\n"; next; }
|
|
/^SEE ALSO/ { state = "see"; print "\\subsection*{See Also}\n"; next; }
|
|
/^EXAMPLE/ { state = "exm"; # EXAMPLE or EXAMPLES
|
|
printf("\\subsection*{%s%s}\n",
|
|
toupper(substr($1, 1, 1)),
|
|
tolower(substr($1, 2)));
|
|
next;
|
|
}
|
|
/^[A-Z]+/ { state = "X";
|
|
printf("\\subsection*{%s%s}\n",
|
|
toupper(substr($1, 1, 1)),
|
|
tolower(substr($1, 2)));
|
|
next;
|
|
}
|
|
|
|
# a match-all , again
|
|
{ if ("X" == state) { print $0; next; }
|
|
if ("name" == state) {
|
|
split($0, namename, "[ \t]+");
|
|
# gsub(/[_{}%&]/, "\\\\&", namename[1]);
|
|
label = namename[1];
|
|
if ("" == label) label = $0;
|
|
gsub(/[_(){}%&^~\#\\\\]/, "", label);
|
|
printf("\\section{%s\\label{%s-section}}\n%s\\\\\n",
|
|
$0, label, line);
|
|
next;
|
|
}
|
|
if ("see" == state) {
|
|
# print $0;
|
|
gsub(/[ ]/, "", $0);
|
|
nrefs = split($0, refs, ",");
|
|
for (i = 1; i < nrefs; i++) {
|
|
if (!length(refs[i])) continue;
|
|
seename = substr(refs[i], 1, index(refs[i], "(")-1);
|
|
printf("%s", refs[i]);
|
|
gsub(/[_(){}%&^~\\\\]/, "", seename);
|
|
if (length(seename))
|
|
printf(" (\\ref{%s-section})", seename);
|
|
printf(", ");
|
|
}
|
|
print "";
|
|
next;
|
|
}
|
|
if ("syn" == state) {
|
|
syname = $0;
|
|
sub(/^[ \t]*[a-z]+[ \t]+\**/,"", syname);
|
|
sub(/\([^)]*\)/,"()", syname);
|
|
sub(/\).*$/,")", syname);
|
|
# # print syname;
|
|
label = syname;
|
|
gsub(/[_(){}%&^~\\\\]/, "", label);
|
|
printf("\\section{{\\tt %s}\\label{%s-section}}\n",
|
|
syname, label);
|
|
printf("~~{\\tt %s}\\\\\n", $0);
|
|
state = "syn2";
|
|
next;
|
|
}
|
|
if ("syn2" == state) {
|
|
printf("~~{\\tt %s}\\\\\n", $0);
|
|
next;
|
|
}
|
|
# print the entire examples section in \tt and lines separated.
|
|
# we need some heuristic to distinguish betwwen code and explanatory lines
|
|
if ("exm" == state) {
|
|
printf("{\\tt %s}\\\\\n", $0);
|
|
next;
|
|
}
|
|
print "unknown state " state > /dev/stderr;
|
|
}
|