# File: FuncSed.pm
# Author: pragma-
#
# Purpose: Registers the sed Function

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

package Plugins::FuncSed;
use parent 'Plugins::Plugin';

use warnings; use strict;
use feature 'unicode_strings';

sub initialize {
    my ($self, %conf) = @_;
    $self->{pbot}->{functions}->register(
        'sed',
        {
            desc   => 'a sed-like stream editor',
            usage  => 'sed s/<regex>/<replacement>/[Pig]; P preserve case; i ignore case; g replace all',
            subref => sub { $self->func_sed(@_) }
        }
    );
}

sub unload {
    my $self = shift;
    $self->{pbot}->{functions}->unregister('sed');
}

# near-verbatim insertion of krok's `sed` factoid
no warnings;

sub func_sed {
    my $self = shift;
    my $text = "@_";

    if ($text =~ /^s(.)(.*?)(?<!\\)\1(.*?)(?<!\\)\1(\S*)\s+(.*)/p) {
        my ($a, $r, $g, $m, $t) = ($5, "'\"$3\"'", index($4, "g") != -1, $4, $2);

        print "a: $a, r: $r, g: $g, m: $m, t: $t\n";
        print "text: [$text]\n";

        if ($m =~ /P/) {
            $r =~ s/^'"(.*)"'$/$1/;
            $m =~ s/P//g;

            if   ($g) { $a =~ s|(?$m)($t)|$1=~/^[A-Z][^A-Z]/?ucfirst$r:($1=~/^[A-Z]+$/?uc$r:$r)|gie; }
            else      { $a =~ s|(?$m)($t)|$1=~/^[A-Z][^A-Z]/?ucfirst$r:($1=~/^[A-Z]+$/?uc$r:$r)|ie; }
        } else {
            if   ($g) { $a =~ s/(?$m)$t/$r/geee; }
            else      { $a =~ s/(?$m)$t/$r/eee; }
        }
        return $a;
    } else {
        return "sed: syntax error";
    }
}
use warnings;

1;