package App::FileTools::BulkRename::UserCommands::AutoFormat;
# ABSTRACT: English title rewriting routines.
use strict;
use warnings;

BEGIN
  { our $VERSION = substr '$$Version: 0.06 $$', 11, -3; }

require Exporter;

our @ISA = qw(Exporter);
our @EXPORT_OK=qw(afmt);

use Carp;
use Contextual::Return;
use Text::Autoformat;
use Lingua::EN::Titlecase;

use App::FileTools::BulkRename::Common qw(modifiable);

#
# Our eventual hope is that we can eventually handle a great variety
# of title formats. Initially we went with the recommended
# Text::Autoformat module for everything, but found it inadequate in a
# wide variety of ways, such as rendering "façade" as "FaçAde".
#
# One day we should be able to handle all of the cases
# below. Currently we only do cases 1,2,3 and 9.
#
# 1) Uppercase:
#    "THE VITAMINS ARE IN MY FRESH CALIFORNIA RAISINS"
# 2) Start-Case: Capitalize all words
#    "The Vitamins Are In My Fresh California Raisins"
# 3) Title-Case 1: Capitalize all but internal articles, prepositions,
#    and conjunctions:
#    "The Vitamins Are in My Fresh California Raisins"
# 4) Title-Case 2: Capitalize all but internal articles, prepositions,
#    conjunctions and forms of 'to be':
#    "The Vitamins are in My Fresh California Raisins"
# 5) Title-Case 3: Capitalize all but internal closed-class function words
#    (these are the word classes that are strongly conserved in a language,
#    and to which it is hard to add new members):
#    "The Vitamins are in my Fresh California Raisins"
# 6) Noun-Case: Just capitalize nouns
#    "The Vitamins are in my fresh California Raisins"
# 7) Sentence case: Just the first word and proper nouns (and a few
#    other exceptions for English Prose):
#    "The vitamins are in my fresh California raisins"
# 8) Proper-Noun Case: Only proper nouns are capitalized.
#    "the vitamins are in my fresh California raisins"
# 9) Lowercase
#    "the vitamins are in my fresh california raisins"


# autoformat shim. Takes a case conversion name, and optionally
# something to convert. If not passed anything to convert, it will
# work on $_. If called in void context, it will modify its input
# (including $_, when appropriate).

my $TC = new Lingua::EN::Titlecase;

sub afmt
  { my $case = shift;
    my $opt  = { case => $case };
    my @ret;

    return afmt($case,$_) unless @_;

    foreach my $in (@_)
      { my $out;

	if( !defined($in) )
	  { $out = undef; }
	elsif( $in eq '' )
	  { $out = ''; }
	elsif( $case eq 'highlight' )
	  { $out = $TC->title($in); }
	else
	  {
	    # autoformat gags on blanks and undef's
	    $out = autoformat($in, $opt);

	    chomp($out); chomp($out);
	  }
	if( VOID )
	  { modifiable($in,$_) = $out; }
	else
	  { push @ret, $out; }
      }

    if( SCALAR )
      { return $ret[0]; }
    else
      { return @ret; }
  }

1;
