85 lines
3.0 KiB
Plaintext
85 lines
3.0 KiB
Plaintext
|
# filename: outline_classic11.awk
|
||
|
# author: Eric Pement - pemente@northpark.edu
|
||
|
# date: 22 March 2001
|
||
|
# version: 1.1
|
||
|
#
|
||
|
# purpose: GNU awk script to modify files created and saved in GNU Emacs
|
||
|
# "outline-mode" into classic indented, outline format. E.g.,
|
||
|
#
|
||
|
# INPUT FILE OUTPUT FILE
|
||
|
# ============== ===================
|
||
|
# * Line 1 | A. Line 1
|
||
|
# ** Line 2 | 1. Line 2
|
||
|
# *** Line 3 | a. Line 3
|
||
|
# *** Line 4 | b. Line 4
|
||
|
# **** Line 5 | (1) Line 5
|
||
|
# ***** Line 6 | (a) Line 6
|
||
|
# ***** Line 7 | (b) Line 7
|
||
|
# ** Line 8 | 2. Line 8
|
||
|
# * Line 9 | B. Line 9
|
||
|
# ** Line 10 | 1. Line 10
|
||
|
#
|
||
|
# NEW! variable "num" determines the amount of increasing indentation.
|
||
|
# Default is 2 (indent by 2, 4, 6, 8... spaces), but this can be
|
||
|
# controlled by using the -v switch from the command line. E.g.,
|
||
|
#
|
||
|
# awk -v num=4 -f outline_classic11.awk yourfile.txt
|
||
|
#
|
||
|
# Note: this script expects a maximum of five asterisks (*) on a line.
|
||
|
# Lines of plain text (no asterisks) in source file are NOT indented.
|
||
|
BEGIN {
|
||
|
if (num == "") num = 2 # if num is not defined, set it to 2
|
||
|
split("ABCDEFGHIJKLMNOPQRSTUVWXYZ",Lev1,"")
|
||
|
split("abcdefghijklmnopqrstuvwxyz",Lev3,"")
|
||
|
split("abcdefghijklmnopqrstuvwxyz",Lev5,"")
|
||
|
}
|
||
|
|
||
|
/^\*/ {
|
||
|
|
||
|
this_len = match($0,/\*([^*]|$)/); # get number of stars in 1st field
|
||
|
array[this_len]++; # increment index of current leaf
|
||
|
|
||
|
if ( this_len - last_len > 1 ) { # check for invalid outline levels
|
||
|
if (FILENAME == "-" ) myfile = "(piped from standard input)"
|
||
|
else myfile = FILENAME
|
||
|
|
||
|
error_message = "\a\a" \
|
||
|
"************************************************\n" \
|
||
|
" WARNING! The input file has an invalid number \n" \
|
||
|
" of asterisks on line " NR ", below. \n\n" \
|
||
|
" The previous outline level had " last_len " asterisks, \n" \
|
||
|
" but the current/next level has " this_len " asterisks!\n\n" \
|
||
|
" You have inadvertently skipped one level of \n" \
|
||
|
" indentation. Processing halted so you can fix \n" \
|
||
|
" the input file, \x22" myfile "\x22. \n" \
|
||
|
"************************************************\n" \
|
||
|
">>>\n" \
|
||
|
"Error on Line #" NR " :" ;
|
||
|
|
||
|
print error_message, $0 > "/dev/stderr" ;
|
||
|
exit 1;
|
||
|
}
|
||
|
|
||
|
if ( this_len < last_len ) { # if we have moved up a branch...
|
||
|
for (i = this_len + 1; i <= last_len; i++)
|
||
|
array[i] = 0; # .. reset the leaves below us
|
||
|
}
|
||
|
|
||
|
for (j=1; j <= this_len; j++){ # build up the prefix string
|
||
|
if (j == 1) prefix = Lev1[array[j]] "."
|
||
|
else if (j == 2) prefix = array[j] "."
|
||
|
else if (j == 3) prefix = Lev3[array[j]] "."
|
||
|
else if (j == 4) prefix = "(" array[j] ")"
|
||
|
else if (j == 5) prefix = "(" Lev5[array[j]] ")"
|
||
|
}
|
||
|
|
||
|
indent_level = (this_len - 1) * num ;
|
||
|
indentation = sprintf("%+" indent_level "s", "") ;
|
||
|
|
||
|
sub(/^\*+/, indentation prefix) ;
|
||
|
last_len = this_len ;
|
||
|
prefix = "" ;
|
||
|
}
|
||
|
{ print }
|
||
|
# --- end of script ---
|