3
0
mirror of https://github.com/pragma-/pbot.git synced 2024-11-26 22:09:26 +01:00

Factoids: more improvements to $variable expansion:

* removed debug code
* index() with a negative value will index from tail end
* improved handling of trailing modifier punctuation
This commit is contained in:
Pragmatic Software 2020-05-30 01:03:07 -07:00
parent 03b3a0a519
commit 2e3fed5bae

View File

@ -459,15 +459,8 @@ sub expand_factoid_vars {
my $root_keyword = $context->{keyword_override} ? $context->{keyword_override} : $context->{root_keyword}; my $root_keyword = $context->{keyword_override} ? $context->{keyword_override} : $context->{root_keyword};
my $action = $context->{action}; my $action = $context->{action};
my $debug = 0;
my $depth = 0; my $depth = 0;
if ($debug) {
$self->{pbot}->{logger}->log("enter expand_factoid_vars\n");
use Data::Dumper;
$self->{pbot}->{logger}->log(Dumper $context);
}
if ($action =~ m/^\/call --keyword-override=([^ ]+)/i) { $root_keyword = $1; } if ($action =~ m/^\/call --keyword-override=([^ ]+)/i) { $root_keyword = $1; }
while (1) { while (1) {
@ -479,8 +472,6 @@ sub expand_factoid_vars {
$action =~ s/(?<!\\)\$0/$root_keyword/g; $action =~ s/(?<!\\)\$0/$root_keyword/g;
my $const_action = $action; my $const_action = $action;
$self->{pbot}->{logger}->log("action: $const_action\n") if $debug;
while ($const_action =~ /(\ba\s*|\ban\s*)?(?<!\\)\$(?:(\{[a-zA-Z0-9_#]+(?::[a-zA-Z0-9_(),.#:-]+)?\}|[a-zA-Z0-9_#]+(?::[a-zA-Z0-9_(),.#:-]+)?))/gi) { while ($const_action =~ /(\ba\s*|\ban\s*)?(?<!\\)\$(?:(\{[a-zA-Z0-9_#]+(?::[a-zA-Z0-9_(),.#:-]+)?\}|[a-zA-Z0-9_#]+(?::[a-zA-Z0-9_(),.#:-]+)?))/gi) {
my ($indefinite_article, $v) = ($1, $2); my ($indefinite_article, $v) = ($1, $2);
$indefinite_article = '' if not defined $indefinite_article; $indefinite_article = '' if not defined $indefinite_article;
@ -495,8 +486,6 @@ sub expand_factoid_vars {
next if @exclude && grep { $test_v =~ m/^\Q$_\E$/i } @exclude; next if @exclude && grep { $test_v =~ m/^\Q$_\E$/i } @exclude;
last if ++$depth >= 1000; last if ++$depth >= 1000;
$self->{pbot}->{logger}->log("v: [$original_v], test v: [$test_v]\n") if $debug;
$matches++; $matches++;
$test_v =~ s/\{(.+)\}/$1/; $test_v =~ s/\{(.+)\}/$1/;
@ -530,8 +519,8 @@ sub expand_factoid_vars {
foreach my $mod (split /:/, $modifier) { foreach my $mod (split /:/, $modifier) {
next if not length $mod; next if not length $mod;
if ($mod =~ s/,$//) { if ($mod =~ s/([,.#:-]+)$//) {
$settings{'trailing-comma'} = 1; $settings{'trailing-punct'} = $1;
} }
if ($mod eq 'comma') { if ($mod eq 'comma') {
@ -554,7 +543,7 @@ sub expand_factoid_vars {
next; next;
} }
if ($mod =~ /^pick\((\d+),(\d+)\)$/) { if ($mod =~ /^pick\((\-?\d+),(\-?\d+)\)$/) {
$settings{'pick'} = 1; $settings{'pick'} = 1;
$settings{'random'} = 1; $settings{'random'} = 1;
$settings{'pick_min'} = $1; $settings{'pick_min'} = $1;
@ -562,14 +551,14 @@ sub expand_factoid_vars {
next; next;
} }
if ($mod =~ /^pick\((\d+)\)$/) { if ($mod =~ /^pick\((\-?\d+)\)$/) {
$settings{'pick'} = 1; $settings{'pick'} = 1;
$settings{'pick_min'} = 1; $settings{'pick_min'} = 1;
$settings{'pick_max'} = $1; $settings{'pick_max'} = $1;
next; next;
} }
if ($mod =~ /^pick_unique\((\d+),(\d+)\)$/) { if ($mod =~ /^pick_unique\((\-?\d+),(\-?\d+)\)$/) {
$settings{'pick'} = 1; $settings{'pick'} = 1;
$settings{'random'} = 1; $settings{'random'} = 1;
$settings{'unique'} = 1; $settings{'unique'} = 1;
@ -578,7 +567,7 @@ sub expand_factoid_vars {
next; next;
} }
if ($mod =~ /^pick_unique\((\d+)\)$/) { if ($mod =~ /^pick_unique\((\-?\d+)\)$/) {
$settings{'pick'} = 1; $settings{'pick'} = 1;
$settings{'unique'} = 1; $settings{'unique'} = 1;
$settings{'pick_min'} = 1; $settings{'pick_min'} = 1;
@ -586,7 +575,7 @@ sub expand_factoid_vars {
next; next;
} }
if ($mod =~ /^index\((\d+)\)$/) { if ($mod =~ /^index\((\-?\d+)\)$/) {
$settings{'index'} = $1; $settings{'index'} = $1;
next; next;
} }
@ -596,9 +585,12 @@ sub expand_factoid_vars {
if (exists $settings{'index'}) { if (exists $settings{'index'}) {
my $index = $settings{'index'}; my $index = $settings{'index'};
$index = $#list - -$index if $index < 0;
$index = 0 if $index < 0; $index = 0 if $index < 0;
$index = $#list if $index > $#list; $index = $#list if $index > $#list;
$replacement = $list[$index]; $replacement = $list[$index];
# strip outer quotes
if (not $replacement =~ s/^"(.*)"$/$1/) { $replacement =~ s/^'(.*)'$/$1/; }
} elsif ($settings{'pick'}) { } elsif ($settings{'pick'}) {
my $min = $settings{'pick_min'}; my $min = $settings{'pick_min'};
my $max = $settings{'pick_max'}; my $max = $settings{'pick_max'};
@ -640,14 +632,13 @@ sub expand_factoid_vars {
} }
} else { } else {
$replacement = $list[rand @list]; $replacement = $list[rand @list];
}
if ($settings{'trailing-comma'}) {
$replacement .= ',';
}
# strip outer quotes # strip outer quotes
if (not $replacement =~ s/^"(.*)"$/$1/) { $replacement =~ s/^'(.*)'$/$1/; } if (not $replacement =~ s/^"(.*)"$/$1/) { $replacement =~ s/^'(.*)'$/$1/; }
}
if ($settings{'trailing-punct'}) {
$replacement .= $settings{'trailing-punct'};
}
foreach my $mod (split /:/, $modifier) { foreach my $mod (split /:/, $modifier) {
next if not length $mod; next if not length $mod;
@ -685,46 +676,21 @@ sub expand_factoid_vars {
$replacement = "$fixed_article $replacement"; $replacement = "$fixed_article $replacement";
} }
if ($debug and $offset == 0) { $self->{pbot}->{logger}->log(("-" x 40) . "\n"); }
$original_v = quotemeta $original_v; $original_v = quotemeta $original_v;
$original_v =~ s/\\:/:/g; $original_v =~ s/\\:/:/g;
if (not length $replacement) { if (not length $replacement) {
$self->{pbot}->{logger}->log("No length!\n") if $debug;
if ($debug) {
$self->{pbot}->{logger}->log("before: v: $original_v, offset: $offset\n");
$self->{pbot}->{logger}->log("$action\n");
$self->{pbot}->{logger}->log((" " x $offset) . "^\n");
}
substr($action, $offset) =~ s/$indefinite_article\$$original_v ?/$replacement/; substr($action, $offset) =~ s/$indefinite_article\$$original_v ?/$replacement/;
$offset += $-[0] + length $replacement; $offset += $-[0] + length $replacement;
if ($debug) {
$self->{pbot}->{logger}->log("after: r: EMPTY \$-[0]: $-[0], offset: $offset\n");
$self->{pbot}->{logger}->log("$action\n");
$self->{pbot}->{logger}->log((" " x $offset) . "^\n");
}
} else { } else {
if ($debug) {
$self->{pbot}->{logger}->log("before: v: $original_v, offset: $offset\n");
$self->{pbot}->{logger}->log("$action\n");
$self->{pbot}->{logger}->log((" " x $offset) . "^\n");
}
substr($action, $offset) =~ s/$indefinite_article\$$original_v/$replacement/; substr($action, $offset) =~ s/$indefinite_article\$$original_v/$replacement/;
$offset += $-[0] + length $replacement; $offset += $-[0] + length $replacement;
}
if ($debug) {
$self->{pbot}->{logger}->log("after: r: $replacement, \$-[0]: $-[0], offset: $offset\n");
$self->{pbot}->{logger}->log("$action\n");
$self->{pbot}->{logger}->log((" " x $offset) . "^\n");
}
}
$expansions++; $expansions++;
} }
} }
last if $matches == 0 or $expansions == 0; last if $matches == 0 or $expansions == 0;
} }