}
sub set_attribute {
- my ($self, $args) = @_;
- my ($name, $value) = @{$args}{qw(name value)};
+ my $self = shift;
+ my ($name, $value) = $self->_parse_attribute_args(@_);
sub {
my $a = (my $evt = $_[0])->{attrs};
my $e = exists $a->{$name};
};
}
+sub _parse_attribute_args {
+ my $self = shift;
+ # allow ->add_attribute(name => 'value')
+ # or ->add_attribute({ name => 'name', value => 'value' })
+ my ($name, $value) = @_ > 1 ? @_ : @{$_[0]}{qw(name value)};
+ return ($name, $self->_zconfig->parser->html_escape($value));
+}
+
sub add_attribute {
- my ($self, $args) = @_;
- my ($name, $value) = @{$args}{qw(name value)};
+ my $self = shift;
+ my ($name, $value) = $self->_parse_attribute_args(@_);
sub {
my $a = (my $evt = $_[0])->{attrs};
my $e = exists $a->{$name};
sub remove_attribute {
my ($self, $args) = @_;
- my $name = $args->{name};
+ my $name = (ref($args) eq 'HASH') ? $args->{name} : $args;
sub {
my $a = (my $evt = $_[0])->{attrs};
return $evt unless exists $a->{$name};
sub collect {
my ($self, $options) = @_;
- my ($into, $passthrough, $content, $filter) =
- @{$options}{qw(into passthrough content filter)};
+ my ($into, $passthrough, $content, $filter, $flush_before) =
+ @{$options}{qw(into passthrough content filter flush_before)};
sub {
my ($evt, $stream) = @_;
# We wipe the contents of @$into here so that other actions depending
}
die "Never saw closing </${name}> before end of source";
});
- return ($passthrough||$content) ? [ $evt, $collector ] : $collector;
+ if ($flush_before) {
+ if ($passthrough||$content) {
+ $evt = { %$evt, flush => 1 };
+ } else {
+ $evt = { type => 'EMPTY', flush => 1 };
+ }
+ }
+ return ($passthrough||$content||$flush_before)
+ ? [ $evt, $collector ]
+ : $collector;
};
}