diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2013-09-26 23:06:02 +0000 |
---|---|---|
committer | <> | 2015-02-03 11:56:22 +0000 |
commit | e0b511b834f3529395df67126a7314097c2cf97e (patch) | |
tree | 89945ae53183ab2acdc61659c8b0b3e57e4a1f3a /contrib/fixref.gawk | |
parent | 2d8ae7b161658c4a589172db0072fc99f76fa979 (diff) | |
download | texinfo-tarball-master.tar.gz |
Imported from /home/lorry/working-area/delta_texinfo-tarball/texinfo-5.2.tar.xz.HEADtexinfo-5.2master
Diffstat (limited to 'contrib/fixref.gawk')
-rw-r--r-- | contrib/fixref.gawk | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/contrib/fixref.gawk b/contrib/fixref.gawk new file mode 100644 index 0000000..4a692f7 --- /dev/null +++ b/contrib/fixref.gawk @@ -0,0 +1,143 @@ +#! /usr/local/bin/gawk -f + +# fixref.awk --- fix xrefs in texinfo documents +# Copyright 1991, 1998 Arnold David Robbins + +# FIXREF 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. +# +# FIXREF 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/>. + +# Updated: Jul 21 1992 --- change unknown +# Updated: Jul 18 1997 --- bug fix + +# usage: gawk -f fixref.awk input-file > output-file +# or if you have #!: fixref.awk input-file > output-file + +# Limitations: +# 1. no more than one cross reference on a line +# 2. cross references may not cross a newline + +BEGIN \ +{ + # we make two passes over the file. To do that we artificially + # tweak the argument vector to do a variable assignment + + if (ARGC != 2) { + printf("usage: %s texinfo-file\n", ARGV[0]) > "/dev/stderr" + exit 1 + } + ARGV[2] = "pass=2" + ARGV[3] = ARGV[1] + ARGC = 4 + + # examine paragraphs + RS = "" + + heading = "@(chapter|appendix|unnumbered|(appendix(sec|subsec|subsubsec))|section|subsection|subsubsection|unnumberedsec|heading|top)" + + pass = 1 + + # put space between paragraphs on output + ORS = "\n\n" +} + +pass == 1 && NF == 0 { next } + +# pass == 1 && /@node/ \ +# bug fix 7/18/96 +pass == 1 && /^@node/ \ +{ + lname = name = "" + n = split($0, lines, "\n") + for (i = 1; i <= n; i++) { + if (lines[i] ~ ("^" heading)) { + sub(heading, "", lines[i]) + sub(/^[ \t]*/, "", lines[i]) + lname = lines[i] +# printf "long name is '%s'\n", lines[i] + } else if (lines[i] ~ /@node/) { + sub(/@node[ \t]*/, "", lines[i]) + sub(/[ \t]*,.*$/, "", lines[i]) + name = lines[i] +# printf "node name is '%s'\n", lines[i] + } + } + if (name && lname) + names[name] = lname + else if (lname) + printf("node name for %s missing!\n", lname) > "/dev/stderr" + else + printf("long name for %s missing!\n", name) > "/dev/stderr" + + if (name ~ /:/) + printf("node `%s' contains a `:'\n", name) > "/dev/stderr" + + if (lname) { + if (lname ~ /:/) + printf("name `%s' contains a `:'\n", lname) > "/dev/stderr" + else if (lname ~ /,/) { + printf("name `%s' contains a `,'\n", lname) > "/dev/stderr" + gsub(/,/, " ", lname) + names[name] = lname # added 7/18/97 + } + } +} + +pass == 2 && /@(x|px)?ref{/ \ +{ + # split the paragraph into lines + # write them out one by one after fixing them + n = split($0, lines, "\n") + for (i = 1; i <= n; i++) + if (lines[i] ~ /@(x|px)?ref{/) { + res = updateref(lines[i]) + printf "%s\n", res + } else + printf "%s\n", lines[i] + + printf "\n" # avoid ORS + next +} + +function updateref(orig, refkind, line) +{ + line = orig # work on a copy + + # find the beginning of the reference + match(line, "@(x|px)?ref{") + refkind = substr(line, RSTART, RLENGTH) + + # pull out just the node name + sub(/.*ref{/, "", line) + sub(/}.*$/, "", line) + sub(/,.*/, "", line) + +# debugging +# printf("found ref to node '%s'\n", line) > "/dev/stderr" + + # If the node name and the section name are the same + # we don't want to bother doing this. + + if (! (line in names)) # sanity checking + printf("no long name for %s\n", line) > "/dev/stderr" + else if (names[line] != line && names[line] !~ /[:,]/) { + # build up new ref + newref = refkind line ", ," names[line] "}" + pat = refkind line "[^}]*}" + + sub(pat, newref, orig) + } + + return orig +} + +pass == 2 { print } |