#! /bin/gawk -f
# Last edited on 2002-01-07 20:04:03 by stolfi

BEGIN {
  abort = -1;
  usage = ( \
    "reposition-marginal-notes \\\n" \
    "  < INFILE.org > OUTFILE.org" \
  );
  
  # Displaces any marginal notes that are embedded in a paragraph
  # forward to the end of that paragraph.
  
  last_was_para = 1;    # TRUE if last line was a paragraph terminator.
  inside_marg_note = 0; # TRUE if we have seen "@unit G" but not its "#end"
  marg_notes = "";      # Suspended marginal notes, each line ends with "\n".
}

(abort >= 0) { exit abort; }

/^[@]/ { 
  if(inside_marg_note) { data_error(("@-line inside marg note")); }
}

(inside_marg_note) {
  marg_notes = ( marg_notes $0 "\n");
  if ($0 ~ /^[#]end marginalnote */) inside_marg_note = 0;
  next;
}


($0 ~ /^[@](chapter|part|end)/) {
  last_was_parag = 1;
}

(last_was_parag) {
  if (marg_notes != "") 
    { printf "%s", marg_notes;
      if ($0 !~ /^[@](chapter|part|end)/) { print "@unit P +1 text"; }
      marg_notes = "";
      # last_was_parag remains unchanged
    }
}

/^ *([#]|$)/ {
  print; next;
  # last_was_parag remains unchanged
}

/^[@]unit *[G] *[+]?[0-9]+ *marg/ {
  marg_notes = ( marg_notes $0 "\n");
  inside_marg_note = 1;
  # last_was_parag remains unchanged
  next; 
}

/^[@][=] *$/ {
  last_was_parag = 1;
  print;
  next;
}

/./ {
  print; 
  last_was_parag = 0;
  next; 
}

function arg_error(msg)
{ 
  printf "%s\n", msg > "/dev/stderr";
  printf "usage: %s\n", usage > "/dev/stderr";
  abort = 1;
  exit 1
}

function data_error(msg)
{ 
  printf "line %d: %s\n", FNR, msg > "/dev/stderr";
  abort = 1;
  exit 1
}