Blame 132html

Packit Service 02e2fd
#! /usr/bin/perl -w
Packit Service 02e2fd
Packit Service 02e2fd
# Script to turn PCRE2 man pages into HTML
Packit Service 02e2fd
Packit Service 02e2fd
Packit Service 02e2fd
# Subroutine to handle font changes and other escapes
Packit Service 02e2fd
Packit Service 02e2fd
sub do_line {
Packit Service 02e2fd
my($s) = $_[0];
Packit Service 02e2fd
Packit Service 02e2fd
$s =~ s/</</g;                   # Deal with < and >
Packit Service 02e2fd
$s =~ s/>/>/g;
Packit Service 02e2fd
$s =~ s"\\fI(.*?)\\f[RP]"$1"g;
Packit Service 02e2fd
$s =~ s"\\fB(.*?)\\f[RP]"$1"g;
Packit Service 02e2fd
$s =~ s"\\e"\\"g;
Packit Service 02e2fd
$s =~ s/(?<=Copyright )\(c\)/©/g;
Packit Service 02e2fd
$s;
Packit Service 02e2fd
}
Packit Service 02e2fd
Packit Service 02e2fd
# Subroutine to ensure not in a paragraph
Packit Service 02e2fd
Packit Service 02e2fd
sub end_para {
Packit Service 02e2fd
if ($inpara)
Packit Service 02e2fd
  {
Packit Service 02e2fd
  print TEMP "\n" if ($inpre);
Packit Service 02e2fd
  print TEMP "

\n";
Packit Service 02e2fd
  }
Packit Service 02e2fd
$inpara = $inpre = 0;
Packit Service 02e2fd
$wrotetext = 0;
Packit Service 02e2fd
}
Packit Service 02e2fd
Packit Service 02e2fd
# Subroutine to start a new paragraph
Packit Service 02e2fd
Packit Service 02e2fd
sub new_para {
Packit Service 02e2fd
&end_para();
Packit Service 02e2fd
print TEMP "

\n";

Packit Service 02e2fd
$inpara = 1;
Packit Service 02e2fd
}
Packit Service 02e2fd
Packit Service 02e2fd
Packit Service 02e2fd
# Main program
Packit Service 02e2fd
Packit Service 02e2fd
$innf = 0;
Packit Service 02e2fd
$inpara = 0;
Packit Service 02e2fd
$inpre = 0;
Packit Service 02e2fd
$wrotetext = 0;
Packit Service 02e2fd
$toc = 0;
Packit Service 02e2fd
$ref = 1;
Packit Service 02e2fd
Packit Service 02e2fd
while ($#ARGV >= 0 && $ARGV[0] =~ /^-/)
Packit Service 02e2fd
  {
Packit Service 02e2fd
  $toc = 1 if $ARGV[0] eq "-toc";
Packit Service 02e2fd
  shift;
Packit Service 02e2fd
  }
Packit Service 02e2fd
Packit Service 02e2fd
# Initial output to STDOUT
Packit Service 02e2fd
Packit Service 02e2fd
print <
Packit Service 02e2fd
<html>
Packit Service 02e2fd
<head>
Packit Service 02e2fd
<title>$ARGV[0] specification</title>
Packit Service 02e2fd
</head>
Packit Service 02e2fd
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
Packit Service 02e2fd

$ARGV[0] man page

Packit Service 02e2fd

Packit Service 02e2fd
Return to the PCRE2 index page.
Packit Service 02e2fd

Packit Service 02e2fd

Packit Service 02e2fd
This page is part of the PCRE2 HTML documentation. It was generated
Packit Service 02e2fd
automatically from the original man page. If there is any nonsense in it,
Packit Service 02e2fd
please consult the man page, in case the conversion went wrong.
Packit Service 02e2fd

Packit Service 02e2fd
End
Packit Service 02e2fd
Packit Service 02e2fd
print "
    \n" if ($toc);
Packit Service 02e2fd
Packit Service 02e2fd
open(TEMP, ">/tmp/$$") || die "Can't open /tmp/$$ for output\n";
Packit Service 02e2fd
Packit Service 02e2fd
while (<STDIN>)
Packit Service 02e2fd
  {
Packit Service 02e2fd
  # Handle lines beginning with a dot
Packit Service 02e2fd
Packit Service 02e2fd
  if (/^\./)
Packit Service 02e2fd
    {
Packit Service 02e2fd
    # Some of the PCRE2 man pages used to contain instances of .br. However,
Packit Service 02e2fd
    # they should have all been removed because they cause trouble in some
Packit Service 02e2fd
    # (other) automated systems that translate man pages to HTML. Complain if
Packit Service 02e2fd
    # we find .br or .in (another macro that is deprecated).
Packit Service 02e2fd
Packit Service 02e2fd
    if (/^\.br/ || /^\.in/)
Packit Service 02e2fd
      {
Packit Service 02e2fd
      print STDERR "\n*** Deprecated macro encountered - rewrite needed\n";
Packit Service 02e2fd
      print STDERR "*** $_\n";
Packit Service 02e2fd
      die "*** Processing abandoned\n";
Packit Service 02e2fd
      }
Packit Service 02e2fd
Packit Service 02e2fd
    # Instead of .br, relevent "literal" sections are enclosed in .nf/.fi.
Packit Service 02e2fd
Packit Service 02e2fd
    elsif (/^\.nf/)
Packit Service 02e2fd
      {
Packit Service 02e2fd
      $innf = 1;
Packit Service 02e2fd
      }
Packit Service 02e2fd
Packit Service 02e2fd
    elsif (/^\.fi/)
Packit Service 02e2fd
      {
Packit Service 02e2fd
      $innf = 0;
Packit Service 02e2fd
      }
Packit Service 02e2fd
Packit Service 02e2fd
    # Handling .sp is subtle. If it is inside a literal section, do nothing if
Packit Service 02e2fd
    # the next line is a non literal text line; similarly, if not inside a
Packit Service 02e2fd
    # literal section, do nothing if a literal follows, unless we are inside
Packit Service 02e2fd
    # a .nf/.fi section or about to enter one. The point being that the 
Packit Service 02e2fd
    # and  that delimit literal sections will do the spacing. Always skip
Packit Service 02e2fd
    # if no previous output.
Packit Service 02e2fd
Packit Service 02e2fd
    elsif (/^\.sp/)
Packit Service 02e2fd
      {
Packit Service 02e2fd
      if ($wrotetext)
Packit Service 02e2fd
        {
Packit Service 02e2fd
        $_ = <STDIN>;
Packit Service 02e2fd
        if ($inpre)
Packit Service 02e2fd
          {
Packit Service 02e2fd
          print TEMP "\n" if (/^[\s.]/);
Packit Service 02e2fd
          }
Packit Service 02e2fd
        else
Packit Service 02e2fd
          {
Packit Service 02e2fd
          print TEMP "
\n
\n" if ($innf || /^\.nf/ || !/^[\s.]/);
Packit Service 02e2fd
          }
Packit Service 02e2fd
        redo;    # Now process the lookahead line we just read
Packit Service 02e2fd
        }
Packit Service 02e2fd
      }
Packit Service 02e2fd
    elsif (/^\.TP/ || /^\.PP/ || /^\.P/)
Packit Service 02e2fd
      {
Packit Service 02e2fd
      &new_para();
Packit Service 02e2fd
      }
Packit Service 02e2fd
    elsif (/^\.SH\s*("?)(.*)\1/)
Packit Service 02e2fd
      {
Packit Service 02e2fd
      # Ignore the NAME section
Packit Service 02e2fd
      if ($2 =~ /^NAME\b/)
Packit Service 02e2fd
        {
Packit Service 02e2fd
        <STDIN>;
Packit Service 02e2fd
        next;
Packit Service 02e2fd
        }
Packit Service 02e2fd
Packit Service 02e2fd
      &end_para();
Packit Service 02e2fd
      my($title) = &do_line($2);
Packit Service 02e2fd
      if ($toc)
Packit Service 02e2fd
        {
Packit Service 02e2fd
        printf("
  • $title\n",
  • Packit Service 02e2fd
              $ref, $ref);
    Packit Service 02e2fd
            printf TEMP ("
    $title
    \n",
    Packit Service 02e2fd
              $ref);
    Packit Service 02e2fd
            $ref++;
    Packit Service 02e2fd
            }
    Packit Service 02e2fd
          else
    Packit Service 02e2fd
            {
    Packit Service 02e2fd
            print TEMP "
    \n$title\n
    \n";
    Packit Service 02e2fd
            }
    Packit Service 02e2fd
          }
    Packit Service 02e2fd
        elsif (/^\.SS\s*("?)(.*)\1/)
    Packit Service 02e2fd
          {
    Packit Service 02e2fd
          &end_para();
    Packit Service 02e2fd
          my($title) = &do_line($2);
    Packit Service 02e2fd
          print TEMP "
    \n$title\n
    \n";
    Packit Service 02e2fd
          }
    Packit Service 02e2fd
        elsif (/^\.B\s*(.*)/)
    Packit Service 02e2fd
          {
    Packit Service 02e2fd
          &new_para() if (!$inpara);
    Packit Service 02e2fd
          $_ = &do_line($1);
    Packit Service 02e2fd
          s/"(.*?)"/$1/g;
    Packit Service 02e2fd
          print TEMP "$_\n";
    Packit Service 02e2fd
          $wrotetext = 1;
    Packit Service 02e2fd
          }
    Packit Service 02e2fd
        elsif (/^\.I\s*(.*)/)
    Packit Service 02e2fd
          {
    Packit Service 02e2fd
          &new_para() if (!$inpara);
    Packit Service 02e2fd
          $_ = &do_line($1);
    Packit Service 02e2fd
          s/"(.*?)"/$1/g;
    Packit Service 02e2fd
          print TEMP "$_\n";
    Packit Service 02e2fd
          $wrotetext = 1;
    Packit Service 02e2fd
          }
    Packit Service 02e2fd
    Packit Service 02e2fd
        # A comment that starts "HREF" takes the next line as a name that
    Packit Service 02e2fd
        # is turned into a hyperlink, using the text given, which might be
    Packit Service 02e2fd
        # in a special font. If it ends in () or (digits) or punctuation, they
    Packit Service 02e2fd
        # aren't part of the link.
    Packit Service 02e2fd
    Packit Service 02e2fd
        elsif (/^\.\\"\s*HREF/)
    Packit Service 02e2fd
          {
    Packit Service 02e2fd
          $_=<STDIN>;
    Packit Service 02e2fd
          chomp;
    Packit Service 02e2fd
          $_ = &do_line($_);
    Packit Service 02e2fd
          $_ =~ s/\s+$//;
    Packit Service 02e2fd
          $_ =~ /^(?:<.>)?([^<(]+)(?:\(\))?(?:<\/.>)?(?:\(\d+\))?[.,;:]?$/;
    Packit Service 02e2fd
          print TEMP "$_\n";
    Packit Service 02e2fd
          }
    Packit Service 02e2fd
    Packit Service 02e2fd
        # A comment that starts "HTML" inserts literal HTML
    Packit Service 02e2fd
    Packit Service 02e2fd
        elsif (/^\.\\"\s*HTML\s*(.*)/)
    Packit Service 02e2fd
          {
    Packit Service 02e2fd
          print TEMP $1;
    Packit Service 02e2fd
          }
    Packit Service 02e2fd
    Packit Service 02e2fd
        # A comment that starts < inserts that HTML at the end of the
    Packit Service 02e2fd
        # *next* input line - so as not to get a newline between them.
    Packit Service 02e2fd
    Packit Service 02e2fd
        elsif (/^\.\\"\s*(<.*>)/)
    Packit Service 02e2fd
          {
    Packit Service 02e2fd
          my($markup) = $1;
    Packit Service 02e2fd
          $_=<STDIN>;
    Packit Service 02e2fd
          chomp;
    Packit Service 02e2fd
          $_ = &do_line($_);
    Packit Service 02e2fd
          $_ =~ s/\s+$//;
    Packit Service 02e2fd
          print TEMP "$_$markup\n";
    Packit Service 02e2fd
          }
    Packit Service 02e2fd
    Packit Service 02e2fd
        # A comment that starts JOIN joins the next two lines together, with one
    Packit Service 02e2fd
        # space between them. Then that line is processed. This is used in some
    Packit Service 02e2fd
        # displays where two lines are needed for the "man" version. JOINSH works
    Packit Service 02e2fd
        # the same, except that it assumes this is a shell command, so removes
    Packit Service 02e2fd
        # continuation backslashes.
    Packit Service 02e2fd
    Packit Service 02e2fd
        elsif (/^\.\\"\s*JOIN(SH)?/)
    Packit Service 02e2fd
          {
    Packit Service 02e2fd
          my($one,$two);
    Packit Service 02e2fd
          $one = <STDIN>;
    Packit Service 02e2fd
          $two = <STDIN>;
    Packit Service 02e2fd
          $one =~ s/\s*\\e\s*$// if (defined($1));
    Packit Service 02e2fd
          chomp($one);
    Packit Service 02e2fd
          $two =~ s/^\s+//;
    Packit Service 02e2fd
          $_ = "$one $two";
    Packit Service 02e2fd
          redo;            # Process the joined lines
    Packit Service 02e2fd
          }
    Packit Service 02e2fd
    Packit Service 02e2fd
        # .EX/.EE are used in the pcre2demo page to bracket the entire program,
    Packit Service 02e2fd
        # which is unmodified except for turning backslash into "\e".
    Packit Service 02e2fd
    Packit Service 02e2fd
        elsif (/^\.EX\s*$/)
    Packit Service 02e2fd
          {
    Packit Service 02e2fd
          print TEMP "
    \n";
    Packit Service 02e2fd
          while (<STDIN>)
    Packit Service 02e2fd
            {
    Packit Service 02e2fd
            last if /^\.EE\s*$/;
    Packit Service 02e2fd
            s/\\e/\\/g;
    Packit Service 02e2fd
            s/&/&/g;
    Packit Service 02e2fd
            s/</</g;
    Packit Service 02e2fd
            s/>/>/g;
    Packit Service 02e2fd
            print TEMP;
    Packit Service 02e2fd
            }
    Packit Service 02e2fd
          }
    Packit Service 02e2fd
    Packit Service 02e2fd
        # Ignore anything not recognized
    Packit Service 02e2fd
    Packit Service 02e2fd
        next;
    Packit Service 02e2fd
        }
    Packit Service 02e2fd
    Packit Service 02e2fd
      # Line does not begin with a dot. Replace blank lines with new paragraphs
    Packit Service 02e2fd
    Packit Service 02e2fd
      if (/^\s*$/)
    Packit Service 02e2fd
        {
    Packit Service 02e2fd
        &end_para() if ($wrotetext);
    Packit Service 02e2fd
        next;
    Packit Service 02e2fd
        }
    Packit Service 02e2fd
    Packit Service 02e2fd
      # Convert fonts changes and output an ordinary line. Ensure that indented
    Packit Service 02e2fd
      # lines are marked as literal.
    Packit Service 02e2fd
    Packit Service 02e2fd
      $_ = &do_line($_);
    Packit Service 02e2fd
      &new_para() if (!$inpara);
    Packit Service 02e2fd
    Packit Service 02e2fd
      if (/^\s/)
    Packit Service 02e2fd
        {
    Packit Service 02e2fd
        if (!$inpre)
    Packit Service 02e2fd
          {
    Packit Service 02e2fd
          print TEMP "
    \n";
    Packit Service 02e2fd
          $inpre = 1;
    Packit Service 02e2fd
          }
    Packit Service 02e2fd
        }
    Packit Service 02e2fd
      elsif ($inpre)
    Packit Service 02e2fd
        {
    Packit Service 02e2fd
        print TEMP "\n";
    Packit Service 02e2fd
        $inpre = 0;
    Packit Service 02e2fd
        }
    Packit Service 02e2fd
    Packit Service 02e2fd
      # Add 
    to the end of a non-literal line if we are within .nf/.fi
    Packit Service 02e2fd
    Packit Service 02e2fd
      $_ .= "
    \n" if (!$inpre && $innf);
    Packit Service 02e2fd
    Packit Service 02e2fd
      print TEMP;
    Packit Service 02e2fd
      $wrotetext = 1;
    Packit Service 02e2fd
      }
    Packit Service 02e2fd
    Packit Service 02e2fd
    # The TOC, if present, will have been written - terminate it
    Packit Service 02e2fd
    Packit Service 02e2fd
    print "\n" if ($toc);
    Packit Service 02e2fd
    Packit Service 02e2fd
    # Copy the remainder to the standard output
    Packit Service 02e2fd
    Packit Service 02e2fd
    close(TEMP);
    Packit Service 02e2fd
    open(TEMP, "/tmp/$$") || die "Can't open /tmp/$$ for input\n";
    Packit Service 02e2fd
    Packit Service 02e2fd
    print while (<TEMP>);
    Packit Service 02e2fd
    Packit Service 02e2fd
    print <
    Packit Service 02e2fd

    Packit Service 02e2fd
    Return to the PCRE2 index page.
    Packit Service 02e2fd

    Packit Service 02e2fd
    End
    Packit Service 02e2fd
    Packit Service 02e2fd
    close(TEMP);
    Packit Service 02e2fd
    unlink("/tmp/$$");
    Packit Service 02e2fd
    Packit Service 02e2fd
    # End