mirror of
https://github.com/pragma-/pbot.git
synced 2024-12-23 11:12:42 +01:00
Improved interactive-editing loop, added "add" and "remove" commands
This commit is contained in:
parent
220a2ec46b
commit
f819867c63
@ -133,13 +133,70 @@ while($subcode =~ s/^\s*(and)?\s*undo//) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my @replacements;
|
||||||
my $prevchange = $last_code[0];
|
my $prevchange = $last_code[0];
|
||||||
my $got_changes = 0;
|
my $got_changes = 0;
|
||||||
|
|
||||||
{
|
while(1) {
|
||||||
my @replacements;
|
$got_sub = 0;
|
||||||
|
$got_changes = 0;
|
||||||
|
|
||||||
while($subcode =~ m/^\s*(and)?\s*replace\s*([^']+)?\s*'.*'\s*with\s*'.*'/i) {
|
if($subcode =~ m/^\s*(and)?\s*remove \s*([^']+)?\s*'/) {
|
||||||
|
my $modifier = 'first';
|
||||||
|
|
||||||
|
$subcode =~ s/^\s*(and)?\s*//;
|
||||||
|
$subcode =~ s/remove\s*([^']+)?\s*//i;
|
||||||
|
$modifier = $1 if defined $1;
|
||||||
|
$modifier =~ s/\s+$//;
|
||||||
|
|
||||||
|
my ($e, $r) = extract_delimited($subcode, "'");
|
||||||
|
|
||||||
|
my $text;
|
||||||
|
|
||||||
|
if(defined $e) {
|
||||||
|
$text = $e;
|
||||||
|
$text =~ s/^'//;
|
||||||
|
$text =~ s/'$//;
|
||||||
|
$subcode = "replace $modifier '$text' with '' and $r";
|
||||||
|
} else {
|
||||||
|
print "$nick: Unbalanced single quotes. Usage: !cc remove [all, first, .., tenth, last] 'text' [and ...]\n";
|
||||||
|
exit 0;
|
||||||
|
}
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($subcode =~ s/^\s*(and)?\s*add '//) {
|
||||||
|
$subcode = "'$subcode";
|
||||||
|
|
||||||
|
my ($e, $r) = extract_delimited($subcode, "'");
|
||||||
|
|
||||||
|
my $text;
|
||||||
|
|
||||||
|
if(defined $e) {
|
||||||
|
$text = $e;
|
||||||
|
$text =~ s/^'//;
|
||||||
|
$text =~ s/'$//;
|
||||||
|
$subcode = $r;
|
||||||
|
|
||||||
|
$got_sub = 1;
|
||||||
|
$got_changes = 1;
|
||||||
|
|
||||||
|
if(not defined $prevchange) {
|
||||||
|
print "$nick: No recent code to append to.\n";
|
||||||
|
exit 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$code = $prevchange;
|
||||||
|
$code =~ s/$/ $text/;
|
||||||
|
$prevchange = $code;
|
||||||
|
} else {
|
||||||
|
print "$nick: Unbalanced single quotes. Usage: !cc add 'text' [and ...]\n";
|
||||||
|
exit 0;
|
||||||
|
}
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($subcode =~ m/^\s*(and)?\s*replace\s*([^']+)?\s*'.*'\s*with\s*'.*'/i) {
|
||||||
$got_sub = 1;
|
$got_sub = 1;
|
||||||
my $modifier = 'first';
|
my $modifier = 'first';
|
||||||
|
|
||||||
@ -159,7 +216,7 @@ my $got_changes = 0;
|
|||||||
$subcode = $r;
|
$subcode = $r;
|
||||||
$subcode =~ s/\s*with\s*//i;
|
$subcode =~ s/\s*with\s*//i;
|
||||||
} else {
|
} else {
|
||||||
print "$nick: Unbalanced single quotes. Usage: !cc replace 'from' with 'to' [and replace ... with ... [and ...]]\n";
|
print "$nick: Unbalanced single quotes. Usage: !cc replace 'from' with 'to' [and ...]\n";
|
||||||
exit 0;
|
exit 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -197,89 +254,10 @@ my $got_changes = 0;
|
|||||||
$replacement->{'modifier'} = $modifier;
|
$replacement->{'modifier'} = $modifier;
|
||||||
|
|
||||||
push @replacements, $replacement;
|
push @replacements, $replacement;
|
||||||
|
next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@replacements = sort { $a->{'from'} cmp $b->{'from'} or $a->{'modifier'} <=> $b->{'modifier'} } @replacements;
|
if($subcode =~ m/^\s*(and)?\s*s\/.*\//) {
|
||||||
|
|
||||||
my ($previous_from, $previous_modifier);
|
|
||||||
|
|
||||||
foreach my $replacement (@replacements) {
|
|
||||||
my $from = $replacement->{'from'};
|
|
||||||
my $to = $replacement->{'to'};
|
|
||||||
my $modifier = $replacement->{'modifier'};
|
|
||||||
|
|
||||||
if(defined $previous_from) {
|
|
||||||
if($previous_from eq $from and $previous_modifier =~ /^\d+$/) {
|
|
||||||
$modifier -= $modifier - $previous_modifier;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(defined $prevchange) {
|
|
||||||
$code = $prevchange;
|
|
||||||
} else {
|
|
||||||
print "$nick: No recent code to change.\n";
|
|
||||||
exit 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
my $ret = eval {
|
|
||||||
my $got_change;
|
|
||||||
|
|
||||||
my ($first_char, $last_char, $first_bound, $last_bound);
|
|
||||||
$first_char = $1 if $from =~ m/^(.)/;
|
|
||||||
$last_char = $1 if $from =~ m/(.)$/;
|
|
||||||
|
|
||||||
if($first_char =~ /\W/) {
|
|
||||||
$first_bound = '.';
|
|
||||||
} else {
|
|
||||||
$first_bound = '\b';
|
|
||||||
}
|
|
||||||
|
|
||||||
if($last_char =~ /\W/) {
|
|
||||||
$last_bound = '\B';
|
|
||||||
} else {
|
|
||||||
$last_bound = '\b';
|
|
||||||
}
|
|
||||||
|
|
||||||
if($modifier eq 'all') {
|
|
||||||
while($code =~ s/($first_bound)$from($last_bound)/$1$to$2/) {
|
|
||||||
$got_change = 1;
|
|
||||||
}
|
|
||||||
} elsif($modifier eq 'last') {
|
|
||||||
if($code =~ s/(.*)($first_bound)$from($last_bound)/$1$2$to$3/) {
|
|
||||||
$got_change = 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
my $count = 0;
|
|
||||||
my $unescaped = $from;
|
|
||||||
$unescaped =~ s/\\//g;
|
|
||||||
if($code =~ s/($first_bound)$from($last_bound)/if(++$count == $modifier) { "$1$to$2"; } else { "$1$unescaped$2"; }/gex) {
|
|
||||||
$got_change = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $got_change;
|
|
||||||
};
|
|
||||||
|
|
||||||
if($@) {
|
|
||||||
print "$nick: $@\n";
|
|
||||||
exit 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if($ret) {
|
|
||||||
$got_changes = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
$prevchange = $code;
|
|
||||||
$previous_from = $from;
|
|
||||||
$previous_modifier = $modifier;
|
|
||||||
}
|
|
||||||
|
|
||||||
if($got_sub and not $got_changes) {
|
|
||||||
print "$nick: No replacements made.\n";
|
|
||||||
exit 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
while($subcode =~ m/^\s*(and)?\s*s\/.*\//) {
|
|
||||||
$got_sub = 1;
|
$got_sub = 1;
|
||||||
$subcode =~ s/^\s*(and)?\s*s//;
|
$subcode =~ s/^\s*(and)?\s*s//;
|
||||||
|
|
||||||
@ -420,10 +398,96 @@ while($subcode =~ m/^\s*(and)?\s*s\/.*\//) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if($got_sub and not $got_changes) {
|
if($got_sub and not $got_changes) {
|
||||||
print "$nick: No changes made.\n";
|
print "$nick: No substitutions made.\n";
|
||||||
|
exit 0;
|
||||||
|
} elsif($got_sub and $got_changes) {
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($#replacements > 0) {
|
||||||
|
@replacements = sort { $a->{'from'} cmp $b->{'from'} or $a->{'modifier'} <=> $b->{'modifier'} } @replacements;
|
||||||
|
|
||||||
|
my ($previous_from, $previous_modifier);
|
||||||
|
|
||||||
|
foreach my $replacement (@replacements) {
|
||||||
|
my $from = $replacement->{'from'};
|
||||||
|
my $to = $replacement->{'to'};
|
||||||
|
my $modifier = $replacement->{'modifier'};
|
||||||
|
|
||||||
|
if(defined $previous_from) {
|
||||||
|
if($previous_from eq $from and $previous_modifier =~ /^\d+$/) {
|
||||||
|
$modifier -= $modifier - $previous_modifier;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(defined $prevchange) {
|
||||||
|
$code = $prevchange;
|
||||||
|
} else {
|
||||||
|
print "$nick: No recent code to change.\n";
|
||||||
exit 0;
|
exit 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my $ret = eval {
|
||||||
|
my $got_change;
|
||||||
|
|
||||||
|
my ($first_char, $last_char, $first_bound, $last_bound);
|
||||||
|
$first_char = $1 if $from =~ m/^(.)/;
|
||||||
|
$last_char = $1 if $from =~ m/(.)$/;
|
||||||
|
|
||||||
|
if($first_char =~ /\W/) {
|
||||||
|
$first_bound = '.';
|
||||||
|
} else {
|
||||||
|
$first_bound = '\b';
|
||||||
|
}
|
||||||
|
|
||||||
|
if($last_char =~ /\W/) {
|
||||||
|
$last_bound = '\B';
|
||||||
|
} else {
|
||||||
|
$last_bound = '\b';
|
||||||
|
}
|
||||||
|
|
||||||
|
if($modifier eq 'all') {
|
||||||
|
while($code =~ s/($first_bound)$from($last_bound)/$1$to$2/) {
|
||||||
|
$got_change = 1;
|
||||||
|
}
|
||||||
|
} elsif($modifier eq 'last') {
|
||||||
|
if($code =~ s/(.*)($first_bound)$from($last_bound)/$1$2$to$3/) {
|
||||||
|
$got_change = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
my $count = 0;
|
||||||
|
my $unescaped = $from;
|
||||||
|
$unescaped =~ s/\\//g;
|
||||||
|
if($code =~ s/($first_bound)$from($last_bound)/if(++$count == $modifier) { "$1$to$2"; } else { "$1$unescaped$2"; }/gex) {
|
||||||
|
$got_change = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $got_change;
|
||||||
|
};
|
||||||
|
|
||||||
|
if($@) {
|
||||||
|
print "$nick: $@\n";
|
||||||
|
exit 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($ret) {
|
||||||
|
$got_sub = 1;
|
||||||
|
$got_changes = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$prevchange = $code;
|
||||||
|
$previous_from = $from;
|
||||||
|
$previous_modifier = $modifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($got_sub and not $got_changes) {
|
||||||
|
print "$nick: No replacements made.\n";
|
||||||
|
exit 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
open FILE, "> ideone_last_code.txt";
|
open FILE, "> ideone_last_code.txt";
|
||||||
|
|
||||||
@ -449,6 +513,8 @@ print FILE "$nick: $code\n";
|
|||||||
my $lang = "C99";
|
my $lang = "C99";
|
||||||
$lang = $1 if $code =~ s/-lang=([^\b\s]+)//i;
|
$lang = $1 if $code =~ s/-lang=([^\b\s]+)//i;
|
||||||
|
|
||||||
|
$lang = "C" if $code =~ s/-nowarn[ings]*//i;
|
||||||
|
|
||||||
my $show_link = 0;
|
my $show_link = 0;
|
||||||
$show_link = 1 if $code =~ s/-showurl//i;
|
$show_link = 1 if $code =~ s/-showurl//i;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user