Qgoda

 view release on metacpan or  search on metacpan

lib/Qgoda/Processor/HTMLFilter.pm  view on Meta::CPAN

        start => [],
        text => [],
        end => [],
        comment => [],
        process => [],
    );

    # FIXME! Sort this by 'order'!
    foreach my $name (keys %plug_ins) {
        my $args = $plug_ins{$name};

        if (!perl_class $name) {
            die __x("{class}: filter specification:"
                    . " illegal plug-in name '{name}'",
                    class => $class, name => $name);
        }

		if (!ref $args || 'HASH' ne reftype $args) {
			die __x("{class}: filter specification for plug-in '{name}':"
			        . " use named arguments!",
					class => $class, name => $name);
		}

        $name = 'Qgoda::HTMLFilter::' . $name;

        my $module = class2module $name;
        require $module;

        my $plug_in = $name->new(%$args);
        push @{$handlers{declaration}}, $plug_in
            if $plug_in->can('declaration');
        push @{$handlers{start}}, $plug_in
            if $plug_in->can('start');
        push @{$handlers{text}}, $plug_in
            if $plug_in->can('text');
        push @{$handlers{end}}, $plug_in
            if $plug_in->can('end');
        push @{$handlers{comment}}, $plug_in
            if $plug_in->can('comment');
        push @{$handlers{process}}, $plug_in
            if $plug_in->can('process');
        push @{$handlers{start_document}}, $plug_in
            if $plug_in->can('start_document');
        push @{$handlers{end_document}}, $plug_in
            if $plug_in->can('end_document');
    }

    my $self = {
        __handlers => \%handlers,
    };

    bless $self, $class;
}

sub process {
    my ($self, $content, $asset) = @_;

    my $output = '';
    
    my $handler = sub {
        my ($event, $text, $tagname, $attr, $attrseq, $is_cdata) = @_;

        my $chunk;
        if ('start_document' eq $event || 'end_document' eq $event) {
            $chunk = $output;
            $output = '';
        } else {
            $chunk = $text;
        }

        foreach my $plug_in (@{$self->{__handlers}->{$event}}) {
            $chunk = $plug_in->$event(
                $chunk,
                event => $event,
                text => $text,
                output => \$output,
                text => $text,
                tagname => $tagname,
                attr => $attr,
                attrseq => $attrseq,
                is_cdata => $is_cdata,
                asset => $asset,
            );
        }

        $output .= $chunk;
    };

    my $parser = HTML::Parser->new(
        comment_h => [$handler, 'event, text'],
        declaration_h => [$handler, 'event, text'],
        start_h => [$handler, 'event, text, tagname, attr, attrseq, is_cdata'],
        end_h => [$handler, 'event, text, tagname'],
        process_h => [$handler, 'event, text'],
        text_h => [$handler, 'event, text'],
        start_document_h => [$handler, 'event'],
    );
    $parser->empty_element_tags(1);
    $parser->parse($content);

    # FIXME! Why can that handler not be registered like the others?
    $handler->('end_document', $output);

    return $output;    
}

1;



( run in 1.646 second using v1.01-cache-2.11-cpan-2398b32b56e )