- Timestamp:
- Oct 3, 2009, 10:15:11 AM (15 years ago)
- Branches:
- master, release-1.10, release-1.4, release-1.5, release-1.6, release-1.7, release-1.8, release-1.9
- Children:
- 9f5e847
- Parents:
- 340c3e7 (diff), 1167bf1 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Location:
- perl
- Files:
-
- 2 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
perl/lib/BarnOwl/Complete/Client.pm
rd5ccf4e8 ra3a9eb7 7 7 8 8 use BarnOwl::Completion::Util qw(complete_flags); 9 use BarnOwl::Complete::Filter qw(complete_filter_name complete_filter_expr); 9 10 10 11 my @all_colors = qw(default … … 42 43 sub complete_command { return sort @BarnOwl::all_commands; } 43 44 sub complete_color { return @all_colors; } 44 sub complete_filter_name { return @{BarnOwl::all_filters()}; }45 45 sub complete_variable { return @{BarnOwl::all_variables()}; } 46 46 sub complete_style { return @{BarnOwl::all_styles()}; } 47 48 my %filter_cmds = (49 sender => \&BarnOwl::Complete::Zephyr::complete_user,50 recipient => \&BarnOwl::Complete::Zephyr::complete_user,51 class => \&BarnOwl::Complete::Zephyr::complete_class,52 instance => \&BarnOwl::Complete::Zephyr::complete_instance,53 opcode => \&BarnOwl::Complete::Zephyr::complete_opcode,54 realm => \&BarnOwl::Complete::Zephyr::complete_realm,55 body => undef,56 hostname => undef,57 type => sub { qw(zephyr aim admin); },58 direction => sub { qw(in out none); },59 login => sub { qw(login logout none); },60 filter => \&complete_filter_name,61 perl => undef,62 );63 64 # Returns:65 # - where to look next after pulling out an expression66 # - $INCOMPLETE if this cannot form a complete expression (or w/e)67 # - pushes to completion list as it finds valid completions68 69 my $INCOMPLETE = -1;70 sub _complete_filter_expr {71 # Takes as arguments context and the index into $ctx->words where the72 # filter expression starts73 my $ctx = shift;74 my $start = shift;75 my $o_comp = shift;76 my $end = $ctx->word;77 78 # Grab an expression; we don't allow empty79 my $i = $start;80 $i = _complete_filter_primitive_expr($ctx, $start, $o_comp);81 return $INCOMPLETE if $start == $INCOMPLETE;82 83 while ($i <= $end) {84 if ($i == $end) {85 # We could and/or another clause86 push @$o_comp, qw(and or);87 return $end; # Or we could let the parent do his thing88 }89 90 if ($ctx->words->[$i] ne 'and' && $ctx->words->[$i] ne 'or') {91 return $i; # We're done. Let the parent do his thing92 }93 94 # Eat the and/or95 $i++;96 97 # Grab an expression98 $i = _complete_filter_primitive_expr($ctx, $i, $o_comp);99 return $INCOMPLETE if $i == $INCOMPLETE;100 }101 102 return $i; # Well, it looks like we're happy103 # (Actually, I'm pretty sure this never happens...)104 }105 106 sub _complete_filter_primitive_expr {107 my $ctx = shift;108 my $start = shift;109 my $o_comp = shift;110 my $end = $ctx->word;111 112 if ($start >= $end) {113 push @$o_comp, "(";114 push @$o_comp, qw(true false not);115 push @$o_comp, keys %filter_cmds;116 return $INCOMPLETE;117 }118 119 my $word = $ctx->words->[$start];120 if ($word eq "(") {121 $start = _complete_filter_expr($ctx, $start+1, $o_comp);122 return $INCOMPLETE if $start == $INCOMPLETE;123 124 # Now, we expect a ")"125 if ($start >= $end) {126 push @$o_comp, ")";127 return $INCOMPLETE;128 }129 if ($ctx->words->[$start] ne ')') {130 # User is being confusing. Give up.131 return $INCOMPLETE;132 }133 return $start+1; # Eat the )134 } elsif ($word eq "not") {135 # We just want another primitive expression136 return _complete_filter_primitive_expr($ctx, $start+1, $o_comp);137 } elsif ($word eq "true" || $word eq "false") {138 # No arguments139 return $start+1; # Eat the boolean. Mmmm, tasty.140 } else {141 # It's of the form 'CMD ARG'142 return $start+2 if ($start+1 < $end); # The user supplied the argument143 144 # complete the argument145 my $arg_func = $filter_cmds{$word};146 push @$o_comp, ($arg_func ? ($arg_func->()) : ());147 return $INCOMPLETE;148 }149 }150 151 sub complete_filter_expr {152 my $ctx = shift;153 my $start = shift;154 my @completions = ();155 _complete_filter_expr($ctx, $start, \@completions);156 # Get rid of duplicates and sort157 my %hash = ();158 @hash{@completions} = ();159 @completions = sort keys %hash;160 return @completions;161 }162 163 sub complete_filter_args {164 my $ctx = shift;165 my $arg = shift;166 return complete_filter_name() unless $arg;167 my $idx = 2; # skip the filter name168 while ($idx < $ctx->word) {169 last unless ($ctx->words->[$idx] =~ m{^-});170 $idx += 2; # skip the flag and the argument171 }172 return complete_filter_expr($ctx, $idx);173 }174 47 175 48 sub complete_help { … … 194 67 sub complete_filter { 195 68 my $ctx = shift; 69 # Syntax: filter FILTERNAME FLAGS EXPR 70 71 # FILTERNAME 72 return complete_filter_name() if $ctx->word == 1; 73 74 # FLAGS 75 $ctx = $ctx->shift_words(1); # complete_flags starts at the second word 196 76 return complete_flags($ctx, 197 77 [qw()], … … 200 80 "-b" => \&complete_color, 201 81 }, 202 \&complete_filter_args 82 # EXPR 83 sub { 84 my $ctx = shift; 85 my $arg = shift; 86 87 # We pass stop_at_nonflag, so we can rewind to the start 88 my $idx = $ctx->word - $arg; 89 $ctx = $ctx->shift_words($idx); 90 return complete_filter_expr($ctx); 91 }, 92 stop_at_nonflag => 1 203 93 ); 204 94 } … … 213 103 } 214 104 if ($ctx->words->[1] eq "-d") { 215 return complete_filter_expr($ctx, 2); 105 $ctx = $ctx->shift_words(2); 106 return complete_filter_expr($ctx); 216 107 } 217 108 if ($ctx->words->[1] eq "-s") { … … 243 134 } 244 135 136 sub complete_startup { 137 my $ctx = shift; 138 my $new_ctx = $ctx->shift_words(1); 139 return BarnOwl::Completion::get_completions($new_ctx); 140 } 141 245 142 BarnOwl::Completion::register_completer(help => \&complete_help); 246 143 BarnOwl::Completion::register_completer(filter => \&complete_filter); … … 250 147 BarnOwl::Completion::register_completer(set => \&complete_set); 251 148 BarnOwl::Completion::register_completer(unset => \&complete_set); 149 BarnOwl::Completion::register_completer(startup => \&complete_startup); 252 150 253 151 1; -
perl/lib/BarnOwl/Completion/Context.pm
r7be5d8b re97c5d05 40 40 41 41 use base qw(Class::Accessor::Fast); 42 use Carp qw(croak); 42 43 43 44 __PACKAGE__->mk_ro_accessors(qw(line point words word word_point … … 64 65 }; 65 66 return bless($self, $class); 67 } 68 69 =head2 shift_words N 70 71 Returns a new C<Context> object, with the leading C<N> words 72 stripped. All fields are updated as appopriate. If C<N> > C<< 73 $self->word >>, C<croak>s with an error message. 74 75 =cut 76 77 sub shift_words { 78 my $self = shift; 79 my $n = shift; 80 81 if($n > $self->word) { 82 croak "Context::shift: Unable to shift $n words"; 83 } 84 85 my $before = substr($self->line, 0, $self->point); 86 my $after = substr($self->line, $self->point); 87 88 return BarnOwl::Completion::Context->new(BarnOwl::skiptokens($before, $n), 89 $after); 66 90 } 67 91 -
perl/lib/BarnOwl/Completion/Util.pm
r94ef58c r69c27e6 24 24 my $optsdone = 0; 25 25 26 my %flags_seen; 27 26 28 while($idx < $ctx->word) { 27 29 my $word = $ctx->words->[$idx]; … … 37 39 } elsif ($word =~ m{^-}) { 38 40 $word = "-" . substr($word, -1); 41 $flags_seen{$word} = 1; # record flag 39 42 $flag = $word if(exists $args->{$word}); 40 43 } else { … … 58 61 return; 59 62 } else { 60 return ($optsdone ? () : (@$no_args, keys %$args), 61 $default ? ($default->($ctx, $argct)) : ()); 63 my @opts = $optsdone ? () : (@$no_args, keys %$args); 64 # filter out flags we've seen if needbe 65 @opts = grep {!$flags_seen{$_}} @opts unless $options{repeat_flags}; 66 return (@opts, $default ? ($default->($ctx, $argct)) : ()); 62 67 } 63 68 } -
perl/lib/BarnOwl.pm
r7589f0a rde3f641 427 427 } 428 428 429 =head3 default_zephyr_signature 430 431 Compute the default zephyr signature. 432 433 =cut 434 435 sub default_zephyr_signature 436 { 437 if (my $zsig = getvar('zsig')) { 438 return $zsig; 439 } 440 if (my $zsigproc = getvar('zsigproc')) { 441 return `$zsigproc`; 442 } 443 my $zwrite_signature = get_zephyr_variable('zwrite-signature'); 444 if (defined($zwrite_signature)) { 445 return $zwrite_signature; 446 } 447 my $name = ((getpwuid($<))[6]); 448 $name =~ s/,.*//; 449 return $name; 450 } 451 429 452 # Stub for owl::startup / BarnOwl::startup, so it isn't bound to the 430 453 # startup command. This may be redefined in a user's configfile. -
perl/lib/BarnOwl/Complete/Zephyr.pm
rfdc0c47 r9300fe5 45 45 my $m = shift; 46 46 return unless $m->type eq 'zephyr'; 47 $classes{ $m->class} = 1;48 $realms{ $m->realm} = 1;49 $users{ BarnOwl::Message::Zephyr::strip_realm($m->sender)} = 1;47 $classes{lc $m->class} = 1; 48 $realms{lc $m->realm} = 1; 49 $users{lc BarnOwl::Message::Zephyr::strip_realm($m->sender)} = 1; 50 50 } 51 51 -
perl/lib/BarnOwl/Hooks.pm
r03e25c5 re2f7963 196 196 my $package = "BarnOwl"; 197 197 198 199 if(!contains(\@BarnOwl::all_commands, $command)) { 200 push @BarnOwl::all_commands, $command; 201 } 202 198 203 if($symbol =~ m{^edit:(.+)$}) { 199 204 $symbol = $1; … … 222 227 } 223 228 } 224 225 if(!contains(\@BarnOwl::all_commands, $command)) {226 push @BarnOwl::all_commands, $command;227 }228 229 } 229 230 -
perl/modules/IRC/lib/BarnOwl/Module/IRC/Completion.pm
r216b1d0 r955a36e 6 6 use BarnOwl::Completion::Util qw(complete_flags); 7 7 8 my %networks = (); 9 my %dests = (); 10 my %servers = (); 8 our %users = (); 9 our %servers = (); 11 10 12 sub complete_networks { keys % networks }13 sub complete_dests { keys % dests}14 sub complete_channels { grep /^#/, keys %dests }15 sub complete_nicks { grep /^[^#]/, keys %dests }11 sub complete_networks { keys %BarnOwl::Module::IRC::ircnets } 12 sub complete_dests { keys %users, complete_channels() } 13 sub complete_channels { keys %BarnOwl::Module::IRC::channels } 14 sub complete_nicks { keys %users } 16 15 sub complete_servers { keys %servers } 17 16 … … 75 74 my $m = shift; 76 75 return unless $m->type eq 'IRC'; 77 $networks{$m->network} = 1; 78 $dests{$m->recipient} = 1; 79 $dests{$m->sender} = 1; 76 if ($m->recipient && $m->recipient !~ m{^#}) { 77 $users{$m->recipient} = 1; 78 } 79 if ($m->sender && $m->sender !~ m{^#}) { 80 $users{$m->sender} = 1; 81 } 80 82 $servers{$m->server} = 1; 81 83 }
Note: See TracChangeset
for help on using the changeset viewer.