#! /usr/bin/gawk -f # Last edited on 2026-03-04 16:36:04 by stolfi # This filter removes from a raw per-line ".ivt" file of the SPS several # lines that are suspected of being wrong, e.g. because their parag # breaks had to be guessed. Blank lines, #-comments, and page headers # are passed through unchanged. BEGIN { nread = 0 # Number of lines read. ngood = 0 # Number of lines written. printf "filtering good lines ...\n" > "/dev/stderr" } // { nread += 1 } /^[ ]*([#]|$)/ { print; next } /^ / { print; next } /^ / { loc = $1 pgsq = loc; gsub(/[<>]/, "", pgsq); gsub(/[;][A-Z]*/, "", pgsq); page = pgsq; gsub(/[.].*$/, "", page) lseq = pgsq; gsub(/^.*[.]/, "", lseq); lseq += 0 if (! match(page, /^f[0-9]+[rv][0-9]*$/)) { prog_error(("bug page id «" page "»")) } if ((page < "f103r") || (page > "f116r")) { data_error(("page «" page "» not in SPS")) } if ((lseq < 1) || (lseq > 54)) { data_error(("bad line number = " lseq "")) } # if ((page == "f103r") && within(lseq, 8, 12)) { next } # if ((page == "f103v") && within(lseq, 20, 26)) { next } if ((page == "f103v") && within(lseq, 39, 42)) { next } # if ((page == "f105r") && within(lseq, 10, 13)) { next } if ((page == "f105r") && within(lseq, 17, 23)) { next } # if ((page == "f106v") && within(lseq, 20, 25)) { next } # if ((page == "f107r") && within(lseq, 13, 17)) { next } if ((page == "f107r") && within(lseq, 30, 37)) { next } # if ((page == "f108r") && within(lseq, 8, 13)) { next } if ((page == "f108r") && within(lseq, 39, 50)) { next } # if ((page == "f108v") && within(lseq, 5, 14)) { next } if ((page == "f108v") && within(lseq, 20, 52)) { next } # if ((page == "f111r") && within(lseq, 6, 43)) { next } if ((page == "f111r") && within(lseq, 48, 54)) { next } # if ((page == "f111v") && within(lseq, 1, 25)) { next } if ((page == "f111v") && within(lseq, 29, 33)) { next } # if ((page == "f112r") && within(lseq, 1, 10)) { next } if ((page == "f112r") && within(lseq, 39, 45)) { next } # # We keep f112v.35 even though it has no starlet, because it is the only # shortest parag. if ((page == "f112v") && within(lseq, 23, 26)) { next } if ((page == "f112v") && within(lseq, 32, 34)) { next } if ((page == "f112v") && within(lseq, 42, 44)) { next } # if ((page == "f113r") && within(lseq, 22, 26)) { next } if ((page == "f113r") && within(lseq, 45, 51)) { next } # if ((page == "f113v") && within(lseq, 13, 17)) { next } # if ((page == "f114r") && within(lseq, 32, 38)) { next } # if ((page == "f114v") && within(lseq, 36, 41)) { next } # if ((page == "f115r") && within(lseq, 29, 34)) { next } # if ((page == "f116r") && within(lseq, 10, 14)) { next } if ((page == "f116r") && within(lseq, 18, 30)) { next } print $0 ngood += 1 next } // { data_error("invalid line format or not SPS page") } END { printf "%d lines read, %d good ones written\n", nread, ngood > "/dev/stderr" } function within(ln,hb,tb) { # Returns true iff the line number {ln} is contained in {hb..tb}. if ((hb <= ln) && (ln <= tb)) { return 1 } return 0 }