#!/usr/bin/env perl
#***************************************************************************
#                                  _   _ ____  _
#  Project                     ___| | | |  _ \| |
#                             / __| | | | |_) | |
#                            | (__| |_| |  _ <| |___
#                             \___|\___/|_| \_\_____|
#
# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://curl.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is
# furnished to do so, under the terms of the COPYING file.
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
# SPDX-License-Identifier: curl
#
###########################################################################

=begin comment

This script converts an nroff file to curldown

Example: cd2nroff [options] <file.md> > <file.3>

Note: when converting .nf sections, this tool does not know if the
section is code or just regular quotes. It then assumes and uses ~~~c
for code.

=end comment
=cut

my $nroff2cd = "0.1"; # to keep check

sub single {
    my ($f)=@_;
    open(F, "<:crlf", "$f") ||
        return 1;
    my $line;
    my $title;
    my $section;
    my $source;
    my @seealso;
    my @desc;
    my $header; # non-zero when TH is passed
    my $quote = 0; # quote state
    while(<F>) {
        $line++;
        my $d = $_;
        if($_ =~ /^.\\\"/) {
            # a comment we can ignore
            next;
        }
        if(!$header) {
            if($d =~ /.so (.*)/) {
                # this is basically an include, so do that
                my $f = $1;
                # remove leading directory
                $f =~ s/(.*?\/)//;
                close(F);
                open(F, "<:crlf", "$f") || return 1;
            }
            if($d =~ /^\.TH ([^ ]*) (\d) \"(.*?)\" ([^ \n]*)/) {
                # header, this needs to be the first thing after leading comments
                $title = $1;
                $section = $2;
                # date is $3
                $source = $4;
                # if there are enclosing quotes around source, remove them
                $source =~ s/[\"\'](.*)[\"\']\z/$1/;
                $header = 1;

            print <<HEAD
---
c: Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
SPDX-License-Identifier: curl
Title: $title
Section: $section
Source: $source
HEAD
                ;
            }
            next;
        }

        if($quote) {
            if($d =~ /^\.SH/) {
                #end of quote without an .fi
                $quote = 0;
                push @desc, "~~~\n";
            }
            elsif($d =~ /^\.fi/) {
                #end of quote
                $quote = 0;
                push @desc, "~~~\n";
                next;
            }
            else {
                # double-backslashes converted to single ones
                $d =~ s/\\\\/\\/g;
                push @desc, $d;
                next;
            }
        }
        if($d =~ /^\.SH (.*)/) {
            my $word = $1;
            # if there are enclosing quotes, remove them first
            $word =~ s/[\"\'](.*)[\"\']\z/$1/;
            if($word eq "SEE ALSO") {
                # we just slurp up this section
                next;
            }
            push @desc, "\n# $word\n\n";
        }
        elsif($d =~ /^\.(RS|RE)/) {
            # ignore these
        }
        elsif($d =~ /^\.IP (.*)/) {
            my $word = $1;
            # if there are enclosing quotes, remove them first
            $word =~ s/[\"\'](.*)[\"\']\z/$1/;
            push @desc, "\n## $word\n\n";
        }
        elsif($d =~ /^\.IP/) {
            # .IP with no text we just skip
        }
        elsif($d =~ /^\.BR (.*)/) {
            # only used for SEE ALSO
            my $word = $1;
            # remove trailing comma
            $word =~ s/,\z//;

            for my $s (split(/,/, $word)) {
                # remove all double quotes
                $s =~ s/\"//g;
                # tream leading whitespace
                $s =~ s/^ +//g;
                push @seealso, $s;
            }
        }
        elsif($d =~ /^\.I (.*)/) {
            push @desc, "*$1*\n";
        }
        elsif($d =~ /^\.B (.*)/) {
            push @desc, "**$1**\n";
        }
        elsif($d =~ /^\.nf/) {
            push @desc, "~~~c\n";
            $quote = 1;
        }
        else {
            # embolden
            $d =~ s/\\fB(.*?)\\fP/**$1**/g;
            # links to "curl.*()" are left bare since cd2nroff handles them
            # specially
            $d =~ s/\\fI(curl.*?\(3\))\\fP/$1/ig;
            # emphasize
            $d =~ s/\\fI(.*?)\\fP/*$1*/g;
            # emphasize on a split line
            $d =~ s/\\fI/*/g;
            # bold on a split line
            $d =~ s/\\fB/**/g;
            # remove backslash amp
            $d =~ s/\\&//g;
            # remove backslashes
            $d =~ s/\\//g;
            # fix single quotes
            $d =~ s/\(aq/'/g;
            # fix double quotes
            $d =~ s/\(dq/\"/g;
            push @desc, $d;
        }
    }
    close(F);

    print "See-also:\n";
    for my $s (sort @seealso) {
        print "  - $s\n" if($s);
    }
    print "---\n";
    print @desc;

    return !$header;
}

exit single($ARGV[0]);
