texinfo-commits
[Top][All Lists]
Advanced

[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++) {




reply via email to

[Prev in Thread] Current Thread [Next in Thread]