source: trunk/essentials/sys-apps/texinfo/util/outline.gawk

Last change on this file was 2617, checked in by bird, 19 years ago

GNU Texinfo 4.8

File size: 3.2 KB
Line 
1#! /usr/local/bin/gawk -f
2
3# texi.outline --- produce an outline from a texinfo source file
4#
5# Copyright (C) 1998 Arnold David Robbins (arnold@gnu.org)
6#
7# TEXI.OUTLINE is free software; you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation; either version 2 of the License, or
10# (at your option) any later version.
11#
12# TEXI.OUTLINE is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program; if not, write to the Free Software
19# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
20
21# NOTE:
22# This program uses gensub(), which is specific to gawk.
23# With some work (split, substr, etc), it could be made to work
24# on other awks, but it's not worth the trouble for me.
25
26BEGIN \
27{
28 # Levels at which different nodes can be
29 Level["@top"] = 0
30 Level["@appendix"] = 1
31 Level["@chapter"] = 1
32 Level["@majorheading"] = 1
33 Level["@unnumbered"] = 1
34 Level["@appendixsec"] = 2
35 Level["@heading"] = 2
36 Level["@section"] = 2
37 Level["@unnumberedsec"] = 2
38 Level["@unnumberedsubsec"] = 3
39 Level["@appendixsubsec"] = 3
40 Level["@subheading"] = 3
41 Level["@subsection"] = 3
42 Level["@appendixsubsubsec"] = 4
43 Level["@subsubheading"] = 4
44 Level["@subsubsection"] = 4
45 Level["@unnumberedsubsubsec"] = 4
46
47 # insure that we were called correctly
48 if (ARGC != 2) {
49 printf("usage: %s texinfo-file\n", ARGV[0]) > "/dev/stderr"
50 exit 1
51 }
52
53 # init header counters
54 app_letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
55 app_h = 0
56 l1_h = l2_h = l3_h = l4_h = 0
57}
58
59# skip lines we're not interested in
60/^[^@]/ || ! ($1 in Level) { next }
61
62Level[$1] == 1 {
63 if ($1 !~ /^@unnumbered/ || $1 !~ /heading/)
64 l1_h++
65 l2_h = l3_h = l4_h = 0
66 Ntabs = 0
67 Number = makenumber($1)
68 Title = maketitle($0)
69 print_title()
70}
71
72Level[$1] == 2 {
73 l2_h++
74 l3_h = l4_h = 0
75 Ntabs = 1
76 Number = makenumber($1)
77 Title = maketitle($0)
78 print_title()
79}
80
81Level[$1] == 3 {
82 l3_h++
83 l4_h = 0
84 Ntabs = 2
85 Number = makenumber($1)
86 Title = maketitle($0)
87 print_title()
88}
89
90Level[$1] == 4 {
91 l4_h++
92 Ntabs = 3
93 Number = makenumber($1)
94 Title = maketitle($0)
95 print_title()
96}
97
98# maketitle --- extract title
99
100function maketitle(str, text)
101{
102 $1 = "" # clobber section keyword
103 text = $0
104 gsub(/^[ \t]*/, "", text)
105 text = gensub(/@[a-z]+{/, "", "g", text)
106 text = gensub(/([^@])}/, "\\1", "g", text)
107 return text
108}
109
110# print_title --- print the title
111
112function print_title( i)
113{
114 for (i = 1; i <= Ntabs; i++)
115 printf "\t"
116 printf("%s %s\n", Number, Title)
117}
118
119# makenumber --- construct a heading number from levels and section command
120
121function makenumber(command, result, lev1)
122{
123 result = ""
124 if (command ~ /^@appendix/) {
125 if (Level[command] == 1)
126 app_h++
127
128 lev1 = substr(app_letters, app_h, 1)
129 } else if (command ~ /^@unnumbered/ || command ~ /heading/) {
130 lev1 = "(unnumbered)"
131 } else
132 lev1 = l1_h ""
133
134 result = lev1 "."
135 if (l2_h > 0) {
136 result = result l2_h "."
137 if (l3_h > 0) {
138 result = result l3_h "."
139 if (l4_h > 0) {
140 result = result l4_h "."
141 }
142 }
143 }
144 return result
145}
Note: See TracBrowser for help on using the repository browser.