sub parse { my $source = shift ; my @output ; while ( $source =~ s/^([<]*)]*)([\s>])//s ; my $tag = $1 ; if ( $tag eq '!--' ) { $source =~ s/^(.*?)-->//s ; push @output, [ 'comment', $1 ] ; } else { my $param = '' ; if ( $2 ne '>' ) { while ( $source =~ s/^([^'">]*)(["'>])//s ) { $param .= $1 ; last if $2 eq '>' ; my $quote = $2 ; $source =~ s/^([^$quote]*$quote)// ; $param .= $quote . $1 . $quote ; } } push @output, ['tag', $tag, $param ] ; } } return @output ; }