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} 146