[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[7981] Update prepinfo.awk.
From: |
arnold |
Subject: |
[7981] Update prepinfo.awk. |
Date: |
Thu, 9 Nov 2017 03:45:57 -0500 (EST) |
Revision: 7981
http://svn.sv.gnu.org/viewvc/?view=rev&root=texinfo&revision=7981
Author: arnold
Date: 2017-11-09 03:45:55 -0500 (Thu, 09 Nov 2017)
Log Message:
-----------
Update prepinfo.awk. It's only been 19 years. :-)
Modified Paths:
--------------
trunk/contrib/prepinfo.awk
Modified: trunk/contrib/prepinfo.awk
===================================================================
--- trunk/contrib/prepinfo.awk 2017-10-29 16:04:10 UTC (rev 7980)
+++ trunk/contrib/prepinfo.awk 2017-11-09 08:45:55 UTC (rev 7981)
@@ -1,78 +1,83 @@
-#! /usr/local/bin/gawk -f
+#! /usr/bin/gawk -f
-# prepinfo.awk --- fix node lines and menus
+# prepinfo.awk --- correct node lines and build menus
+
+# Copyright (C) 1997, 2001, 2018 Arnold David Robbins
+# (address@hidden)
#
-# Copyright 1998 Arnold Robbins
+# PREPINFO is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either
+# version 3 of the License, or (at your option) any later
+# version.
#
-# PREPINFO is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
# PREPINFO is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
-#
+#
# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-BEGIN \
-{
- # manifest constants
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+# USA
+#
+# The most recent version of PREPINFO may be found at
+# https://github.com/arnoldrobbins/prepinfo
+BEGIN {
+ # Manifest constants
TRUE = 1
FALSE = 0
-
+
# Levels at which different nodes can be
- Level["@top"] = 0
+ Level["@top"] = 0
Level["@appendix"] = 1
Level["@chapter"] = 1
Level["@majorheading"] = 1
Level["@unnumbered"] = 1
Level["@appendixsec"] = 2
+ Level["@section"] = 2
Level["@heading"] = 2
- Level["@section"] = 2
Level["@unnumberedsec"] = 2
Level["@unnumberedsubsec"] = 3
Level["@appendixsubsec"] = 3
+ Level["@subsection"] = 3
Level["@subheading"] = 3
- Level["@subsection"] = 3
+ Level["@unnumberedsubsubsec"] = 4
Level["@appendixsubsubsec"] = 4
+ Level["@subsubsection"] = 4
Level["@subsubheading"] = 4
- Level["@subsubsection"] = 4
- Level["@unnumberedsubsubsec"] = 4
-
# Length of menus
- Menumargin = 78
-
+ if (Menumargin == 0)
+ Menumargin = 78
+
# Length of menu item
- Min_menitem_length = 29
-
- # insure that we were called correctly
+ if (Min_menitem_length == 0)
+ Min_menitem_length = 29
+ # Ensure that we were called correctly
if (ARGC != 2) {
- printf("usage: %s texinfo-file\n", ARGV[0]) > "/dev/stderr"
+ print "usage: prepinfo texinfo-file > new-file\n" >
"/dev/stderr"
exit 1
}
-
# Arrange for two passes over input file
Pass = 1
ARGV[2] = "Pass=2"
ARGV[3] = ARGV[1]
ARGC = 4
+ # Initialize stacks
Lastlevel = -1
-
- # Initialize stacks
Up[-1] = "(dir)"
Prev[0] = "(dir)"
-
- if (Debug == "args") {
+ if (Debug ~ "args") {
for (i = 0; i < ARGC; i++)
printf("ARGV[%d] = %s\n", i, ARGV[i]) > "/dev/stderr"
}
}
+/address@hidden/ && Pass == 1, /address@hidden \t]+ignore/ && Pass == 1 {
+ next
+}
+# @node lines, save nodename
-$1 == "@node" \
-{
+$1 == "@node" {
Name = getnodename($0)
Nodeseen = TRUE
@@ -79,57 +84,51 @@
if ((l = length(Name)) > Maxlen)
Maxlen = l
- if (Debug == "nodenames")
+ if (Debug ~ "nodenames")
printf("Name = %s\n", Name) > "/dev/stderr"
if (Pass == 1)
next
}
-
-Pass == 1 && /address@hidden(omment)?[ \t]+fakenode/ \
-{
- if (Debug == "fakenodes")
- printf("fakenode at %d\n", FNR) > "/dev/stderr"
+Pass == 1 && /address@hidden(omment)?[ \t]+fakenode/ {
+ if (Debug ~ "fakenodes")
+ printf("fakenode at %d\n", FNR) > "/dev/stderr"
Fakenode = TRUE
next
}
-
-Pass == 1 && ($1 in Level) \
-{
- # skip fake nodes --- titles without associated @node lines
+# Build the tree of nodes in associative array `Node'
+Pass == 1 && ($1 in Level) {
+ # Skip fake nodes --- titles without @node lines
if (Fakenode) {
- if (Debug == "fakenodes")
+ if (Debug ~ "fakenodes")
printf("%s at %d is a fakenode\n", $1, FNR) >
"/dev/stderr"
Fakenode = FALSE
next
}
- if (Debug == "titles")
+ if (Debug ~ "titles")
printf("Processing %s: Name = %s\n", $1, Name) > "/dev/stderr"
- # save type
+ # Save type
type = $1
if (! Nodeseen) {
err_prefix()
- printf("%s line with no @node or fakenode line\n",
- type) > "/dev/stderr"
- Badheading[FNR] = 1
- # ??? used ???
+ printf("%s line with no @node or fakenode line\n", type) \
+
> "/dev/stderr"
next
} else
- Nodeseen = FALSE # reset it
-
+ Nodeseen = FALSE # reset it
# Squirrel away the info
levelnum = Level[type]
Node[Name ".level"] = levelnum
- Node[Name ".name"] = Name
- if (Debug == "titles") {
+
+ if (Debug ~ "titles") {
printf("Node[%s\".level\"] = %s\n", Name, Node[Name ".level"])
> "/dev/stderr"
printf("Node[%s\".name\"] = %s\n", Name, Node[Name ".name"]) >
"/dev/stderr"
}
-
- if (levelnum == Lastlevel) { # e.g., two sections in a row
+ if (levelnum == Lastlevel) {
+ # E.g., two sections in a row
Node[Name ".up"] = Up[levelnum - 1]
if (levelnum in Prev) {
Node[Prev[levelnum] ".next"] = Name
@@ -136,8 +135,10 @@
Node[Name ".prev"] = Prev[levelnum]
}
Prev[levelnum] = Name
- Up[levelnum] = Name # ???
- } else if (levelnum < Lastlevel) { # section, now chapter
+ Up[levelnum] = Name
+ }
+ else if (levelnum < Lastlevel) {
+ # section, now chapter
Lastlevel = levelnum
Node[Name ".up"] = Up[levelnum - 1]
if (levelnum in Prev) {
@@ -146,11 +147,14 @@
}
Prev[levelnum] = Name
Up[levelnum] = Name
- } else { # chapter, now section, levelnum > Lastlevel
+ }
+ else {
+ # chapter, now section,
+ # levelnum > Lastlevel
Node[Name ".up"] = Up[levelnum - 1]
Node[Up[Lastlevel] ".child"] = Name
+ Prev[levelnum] = Name
Up[levelnum] = Name
- Prev[levelnum] = Name
Lastlevel = levelnum
}
@@ -158,44 +162,33 @@
if (Level[$1] >= 2)
List[++Sequence] = Name
- if (Debug == "titles") {
+ if (Debug ~ "titles") {
printf("Node[%s\".prev\"] = %s\n", Name, Node[Name ".prev"]) >
"/dev/stderr"
printf("Node[%s\".up\"] = %s\n", Name, Node[Name ".up"]) >
"/dev/stderr"
printf("Node[%s\".child\"] = %s\n", Name, Node[Name ".child"])
> "/dev/stderr"
}
}
-
-Pass == 2 && Debug == "dumptitles" && FNR <= 1 \
-{
- for (i in Node)
- printf("Node[%s] = %s\n", i, Node[i]) | "sort 1>&2"
- close("sort 1>&2")
-}
-
-/address@hidden/ && Pass == 1, /address@hidden \t]+menu/ && Pass == 1 \
-{
- if (/address@hidden/ || /address@hidden \t]+menu/)
+/address@hidden/ && Pass == 1, /address@hidden \t]menu/ && Pass == 1 {
+ if (/address@hidden/ || /address@hidden \t]menu/)
next
-
-# if (Debug == "menu")
-# printf("processing: %s\n", $0) > "/dev/stderr"
-
+
+ if (/address@hidden/ || /address@hidden \t]+detailmenu/)
+ next
+ if (Debug ~ "menu")
+ printf("processing: %s\n", $0) > "/dev/stderr"
if (/^\*/) {
- if (In_menitem) { # file away info from previousline
+ if (In_menitem) { # Save info from previous line
Node[node ".mendesc"] = desc
Node[node ".longdesc"] = longdesc
- if (Debug == "mendesc") {
- printf("Node[%s.mendesc] = %s\n",
- node, Node[node ".mendesc"]) >
"/dev/stderr"
- printf("Node[%s.longdesc] = %s\n",
- node, Node[node ".longdesc"]) >
"/dev/stderr"
+ if (Debug ~ "mendesc") {
+ printf("Node[%s.mendesc] = %s\n", node,
Node[node ".mendesc"]) > "/dev/stderr"
+ printf("Node[%s.longdesc] = %s\n", node,
Node[node ".longdesc"]) > "/dev/stderr"
}
}
In_menitem = TRUE
-
- # pull apart menu item
- $1 = "" # nuke ``*''
- $0 = $0 # reparse line
+ # Pull apart menu item
+ $1 = "" # nuke ``*''
+ $0 = $0 # reparse line
i1 = index($0, ":")
if (i1 <= 0) {
err_prefix()
@@ -202,7 +195,8 @@
printf("badly formed menu item") > "/dev/stderr"
next
}
- if (substr($0, i1+1, 1) != ":") { # desc: node. long desc
+ # desc: node. long desc
+ if (substr($0, i1 + 1, 1) != ":") {
i2 = index($0, ".")
if (i2 <= 0) {
err_prefix()
@@ -210,10 +204,14 @@
next
}
desc = substr($0, 1, i1 - 1)
+ node = substr($0, i1 + 1, i2 - i1 - 1)
sub(/^[ \t]+/, "", node)
sub(/[ \t]+$/, "", node)
+ sub(/^[ \t]+/, "", desc)
+ sub(/[ \t]+$/, "", desc)
longdesc = substr($0, i2 + 1)
- } else { # nodname:: long desc
+ }
+ else { # nodename:: long desc
desc = ""
node = substr($0, 1, i1 - 1)
sub(/^[ \t]+/, "", node)
@@ -220,57 +218,46 @@
sub(/[ \t]+$/, "", node)
longdesc = substr($0, i1 + 2)
}
- } else if (In_menitem) { # continuation line
+ }
+ else if (In_menitem) { # Continuation line
longdesc = longdesc " " $0
} else
In_menitem = FALSE
-
+
Node[node ".mendesc"] = desc
Node[node ".longdesc"] = longdesc
- if (Debug == "mendesc") {
- printf("Node[%s.mendesc] = %s\n",
- node, Node[node ".mendesc"]) > "/dev/stderr"
- printf("Node[%s.longdesc] = %s\n",
- node, Node[node ".longdesc"]) > "/dev/stderr"
+
+ if (Debug ~ "mendesc") {
+ printf("Node[%s.mendesc] = %s\n", node, Node[node ".mendesc"])
> "/dev/stderr"
+ printf("Node[%s.longdesc] = %s\n", node, Node[node
".longdesc"]) > "/dev/stderr"
}
-
- if (Debug == "menu")
- printf("Menu:: Name %s: desc %s: longdesc %s\n",
- node, desc, longdesc) > "/dev/stderr"
+ if (Debug ~ "menu") {
+ printf("Menu:: Name %s: desc %s: longdesc %s\n", node, desc,
longdesc) > "/dev/stderr"
+ }
}
-
-function err_prefix()
-{
- printf("%s: %s: %d: ", ARGV[0], FILENAME, FNR) > "/dev/stderr"
+Pass == 2 && Debug ~ "dumptitles" && FNR <= 1 {
+ for (i in Node)
+ printf("Node[%s] = %s\n", i, Node[i]) | "sort 1>&2"
+ close("sort 1>&2")
}
-
-function getnodename(str)
-{
- sub(/@node[ \t]+/, "", str)
- sub(/,.*/, "", str)
- if (Debug == "nodenames")
- printf("getnodename: return %s\n", str) > "/dev/stderr"
- return str
-}
-
-Pass == 2 && /address@hidden/ \
-{
+# Print @node line
+Pass == 2 && /address@hidden/ {
Name = getnodename($0)
- # Top node is special. It's next is the first child
+ # Top node is special. Its next is the first child
n = Node[Name ".next"]
if (Node[Name ".level"] == 0 && n == "")
n = Node[Name ".child"]
printf("@node %s, %s, %s, %s\n", Name, n,
- Node[Name ".prev"] ? Node[Name ".prev"] : Node[Name ".up"],
+ Node[Name ".prev"] ? Node[Name ".prev"] \
+ : Node[Name ".up"],
Node[Name ".up"])
next
}
-
-Pass == 2 && /address@hidden/ \
-{
- # First, nuke current contents of menu
+# Print menu for current node
+Pass == 2 && /address@hidden/ {
+ # First, skip current contents of menu
do {
if ((getline) <= 0) {
err_prefix()
@@ -277,11 +264,11 @@
printf("unexpected EOF inside menu\n") > "/dev/stderr"
exit 1
}
- } while (! /address@hidden \t]+menu/)
-
- # next, compute maximum length of a node name
+ } while (! /address@hidden \t]menu/)
+ # Next, compute maximum length of a node name
max = 0
- for (n = Node[Name ".child"]; (n ".next") in Node; n = Node[n ".next"])
{
+ for (n = Node[Name ".child"]; (n ".next") in Node;
+ n = Node[n
".next"]) {
if ((n ".desc") in Node)
s = Node[n ".desc"] ": " n "."
else
@@ -292,31 +279,46 @@
}
if (max < Min_menitem_length)
max = Min_menitem_length
-
- # now dump the menu
+ # Now dump the menu
print "@menu"
- for (n = Node[Name ".child"]; (n ".next") in Node; n = Node[n ".next"])
{
+ for (n = Node[Name ".child"]; (n ".next") in Node;
+ n = Node[n
".next"]) {
print_menuitem(n, max)
}
print_menuitem(n, max)
- if (Name == "Top") { # Master Menu
+ if (Name == "Top") { # Master Menu
if (Maxlen < Min_menitem_length)
Maxlen = Min_menitem_length
print ""
+ print "@detailmenu"
for (i = 1; i <= Sequence; i++)
print_menuitem(List[i], Maxlen)
- print ""
+ print "@end detailmenu"
}
print "@end menu"
next
}
+Pass == 2 # print
+function err_prefix()
+{
+ printf("prepinfo:%s:%d: ", FILENAME, FNR) > "/dev/stderr"
+}
+function getnodename(str)
+{
+ sub(/address@hidden \t]+/, "", str)
+ sub(/[ \t]*,.*/, "", str)
-Pass == 2 # print
+ if (Debug ~ "nodenames")
+ printf("getnodename: return %s\n", str) > "/dev/stderr"
+ return str
+}
+# Print nice description with reformatting as needed
-function print_menuitem(n, max, nodesc, i, dwords, count, p)
+function print_menuitem(n, max, # params
+ nodesc, i, dwords, count, p)
{
nodesc = FALSE
if (! ((n ".longdesc") in Node)) {
@@ -323,11 +325,9 @@
err_prefix()
printf("warning: %s: no long description\n", n) > "/dev/stderr"
nodesc = TRUE
- } else {
- for (i in dwords)
- delete dwords[i]
- count = split(Node[n ".longdesc"], dwords, "[ \t\n]+")
- }
+ } else
+ count = split(Node[n ".longdesc"], dwords, " ")
+
if ((n ".desc") in Node)
s = Node[n ".desc"] ": " n "."
else
@@ -334,9 +334,8 @@
s = n "::"
printf("* %-*s", max, s)
- if (Debug == "mendescitem")
+ if (Debug ~ "mendescitem")
printf("<* %-*s>\n", max, s) > "/dev/stderr"
-
p = max + 2
if (! nodesc) {
for (i = 1; i <= count; i++) {
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [7981] Update prepinfo.awk.,
arnold <=