#/bin/sh

# Script to prepare the files for building a PCRE2 release. It does some
# processing of the documentation, detrails files, and creates pcre2.h.generic
# and config.h.generic (for use by builders who can't run ./configure).

# You must run this script before runnning "make dist". If its first argument
# is "doc", it stops after preparing the documentation. There are no other
# arguments. The script makes use of the following files:

# 132html     A Perl script that converts a .1 or .3 man page into HTML. It
#             "knows" the relevant troff constructs that are used in the PCRE2
#             man pages.

# CheckMan    A Perl script that checks man pages for typos in the mark up.

# CleanTxt    A Perl script that cleans up the output of "nroff -man" by
#             removing backspaces and other redundant text so as to produce
#             a readable .txt file.

# Detrail     A Perl script that removes trailing spaces from files.

# doc/index.html.src
#             A file that is copied as index.html into the doc/html directory
#             when the HTML documentation is built. It works like this so that
#             doc/html can be deleted and re-created from scratch.

# README & NON-AUTOTOOLS-BUILD
#             These files are copied into the doc/html directory, with .txt
#             extensions so that they can by hyperlinked from the HTML
#             documentation, because some people just go to the HTML without
#             looking for text files.


# First, sort out the documentation. Remove pcre2demo.3 first because it won't
# pass the markup check (it is created below, using markup that none of the
# other pages use).

cd doc
echo Processing documentation

/bin/rm -f pcre2demo.3

# Check the remaining man pages

perl ../CheckMan *.1 *.3
if [ $? != 0 ] ; then exit 1; fi

# Make Text form of the documentation. It needs some mangling to make it
# tidy for online reading. Concatenate all the .3 stuff, but omit the
# individual function pages.

cat <<End >pcre2.txt
-----------------------------------------------------------------------------
This file contains a concatenation of the PCRE2 man pages, converted to plain
text format for ease of searching with a text editor, or for use on systems
that do not have a man page processor. The small individual files that give
synopses of each function in the library have not been included. Neither has
the pcre2demo program. There are separate text files for the pcre2grep and
pcre2test commands.
-----------------------------------------------------------------------------


End

echo "Making pcre2.txt"
for file in pcre2 pcre2api pcre2build pcre2callout pcre2compat pcre2jit \
            pcre2limits pcre2matching pcre2partial pcre2pattern pcre2perform \
            pcre2posix pcre2sample pcre2serialize pcre2stack pcre2syntax \
            pcre2unicode ; do
  echo "  Processing $file.3"
  nroff -c -man $file.3 >$file.rawtxt
  perl ../CleanTxt <$file.rawtxt >>pcre2.txt
  /bin/rm $file.rawtxt
  echo "------------------------------------------------------------------------------" >>pcre2.txt
  if [ "$file" != "pcre2sample" ] ; then
    echo " " >>pcre2.txt
    echo " " >>pcre2.txt
  fi
done

# The three commands
for file in pcre2test pcre2grep pcre2-config ; do
  echo Making $file.txt
  nroff -c -man $file.1 >$file.rawtxt
  perl ../CleanTxt <$file.rawtxt >$file.txt
  /bin/rm $file.rawtxt
done


# Make pcre2demo.3 from the pcre2demo.c source file

echo "Making pcre2demo.3"
perl <<"END" >pcre2demo.3
  open(IN, "../src/pcre2demo.c") || die "Failed to open src/pcre2demo.c\n";
  open(OUT, ">pcre2demo.3") || die "Failed to open pcre2demo.3\n";
  print OUT ".\\\" Start example.\n" .
            ".de EX\n" .
            ".  nr mE \\\\n(.f\n" .
            ".  nf\n" .
            ".  nh\n" .
            ".  ft CW\n" .
            "..\n" .
            ".\n" .
            ".\n" .
            ".\\\" End example.\n" .
            ".de EE\n" .
            ".  ft \\\\n(mE\n" .
            ".  fi\n" .
            ".  hy \\\\n(HY\n" .
            "..\n" .
            ".\n" .
            ".EX\n" ;
  while (<IN>)
    {
    s/\\/\\e/g;
    print OUT;
    }
  print OUT ".EE\n";
  close(IN);
  close(OUT);
END
if [ $? != 0 ] ; then exit 1; fi


# Make HTML form of the documentation.

echo "Making HTML documentation"
/bin/rm html/*
cp index.html.src html/index.html
cp ../README html/README.txt
cp ../NON-AUTOTOOLS-BUILD html/NON-AUTOTOOLS-BUILD.txt

for file in *.1 ; do
  base=`basename $file .1`
  echo "  Making $base.html"
  perl ../132html -toc $base <$file >html/$base.html
done

# Exclude table of contents for function summaries. It seems that expr
# forces an anchored regex. Also exclude them for small pages that have
# only one section.

for file in *.3 ; do
  base=`basename $file .3`
  toc=-toc
  if [ `expr $base : '.*_'` -ne 0 ] ; then toc="" ; fi
  if [ "$base" = "pcre2sample" ]  || \
     [ "$base" = "pcre2stack" ]   || \
     [ "$base" = "pcre2compat" ]  || \
     [ "$base" = "pcre2limits" ]  || \
     [ "$base" = "pcre2unicode" ] ; then
    toc=""
  fi
  echo "  Making $base.html"
  perl ../132html $toc $base <$file >html/$base.html
  if [ $? != 0 ] ; then exit 1; fi
done

# End of documentation processing; stop if only documentation required.

cd ..
echo Documentation done
if [ "$1" = "doc" ] ; then exit; fi

# These files are detrailed; do not detrail the test data because there may be
# significant trailing spaces. Do not detrail RunTest.bat, because it has CRLF
# line endings and the detrail script removes all trailing white space. The
# configure files are also omitted from the detrailing.

files="\
  Makefile.am \
  configure.ac \
  README \
  LICENCE \
  COPYING \
  AUTHORS \
  NEWS \
  NON-AUTOTOOLS-BUILD \
  INSTALL \
  132html \
  CleanTxt \
  Detrail \
  ChangeLog \
  CMakeLists.txt \
  RunGrepTest \
  RunTest \
  pcre2-config.in \
  perltest.sh \
  libpcre2-8.pc.in \
  libpcre2-16.pc.in \
  libpcre2-32.pc.in \
  libpcre2-posix.pc.in \
  src/dftables.c \
  src/pcre2.h.in \
  src/pcre2_auto_possess.c \
  src/pcre2_compile.c \
  src/pcre2_config.c \
  src/pcre2_context.c \
  src/pcre2_dfa_match.c \
  src/pcre2_error.c \
  src/pcre2_find_bracket.c \
  src/pcre2_internal.h \
  src/pcre2_intmodedep.h \
  src/pcre2_jit_compile.c \
  src/pcre2_jit_match.c \
  src/pcre2_jit_misc.c \
  src/pcre2_jit_test.c \
  src/pcre2_maketables.c \
  src/pcre2_match.c \
  src/pcre2_match_data.c \
  src/pcre2_newline.c \
  src/pcre2_ord2utf.c \
  src/pcre2_pattern_info.c \
  src/pcre2_printint.c \
  src/pcre2_string_utils.c \
  src/pcre2_study.c \
  src/pcre2_substring.c \
  src/pcre2_tables.c \
  src/pcre2_ucd.c \
  src/pcre2_ucp.h \
  src/pcre2_valid_utf.c \
  src/pcre2_xclass.c \
  src/pcre2demo.c \
  src/pcre2grep.c \
  src/pcre2posix.c \
  src/pcre2posix.h \
  src/pcre2test.c"

echo Detrailing
perl ./Detrail $files doc/p* doc/html/*

echo Done

#End
