package Markup::Open;

use strict; use warnings;

use base 'Markup::Tag';

use L;

sub new {
	my ($class, $data, $single) = @_;
	my $self = $class->SUPER::new;
	$data =~ s/^(\S+)\s*//;
	$self->{tag} = $1;
	my (@keys, %key_value);
	while ($data ne "") {
		if ($data =~ s/^\s+//) {
			# spaces
		} elsif ($data =~ s/^([^=\s]+)//) {
			# key
			my $key = $1;
			my $val;
			if ($data =~ s/="([^"]*)"//) {
				$val = $1;
			} elsif ($data =~ s/='([^']*)'//) {
				$val = $1;
			} elsif ($data =~ s/=([^\s]*)//) {
				$val = $1;
			}
			if (defined $val) {
				$val = html_to_text($val);
			}
			push @keys, $key;
			$key_value{lc($key)} = $val;
		} else {
			# brokenness
			die "cannot parse markup (in tag):\n".substr($data, 0, 500);
		}
	}
	$self->{single} = $single;
	$self->{keys} = \@keys;
	$self->{key_value} = \%key_value;
	return $self;
}

sub ensure_required_spacing {
	my ($self) = @_;
	if ($self->tag eq "textarea") {
		$self->{space_after} = "\n";
	}
}

sub html_without_padding_spaces {
	my ($self) = @_;
	my $html = "<".$self->{tag};
	for my $k (@{$self->{keys}}) {
		$html .= " $k";
		my $v = $self->{key_value}{$k};
		if (defined $v) {
			$html .= '="'.text_to_html($v).'"';
		}
	}
	$html .= "/" if $self->{single};
	$html .= ">";
	return $html;
}

sub attr_set {
	my ($self, $key, $val) = @_;
	my $lckey = lc($key);
	if (! exists $self->{key_value}{$lckey}) {
		push @{$self->{keys}}, $key;
	}
	$self->{key_value}{$lckey} = $val;
}

sub attr_exists {
	my ($self, $key) = @_;
	my $lckey = lc($key);
	return exists $self->{key_value}{$lckey};
}

sub attr_get {
	my ($self, $key) = @_;
	my $lckey = lc($key);
	return $self->{key_value}{$lckey};
}

sub attr_del {
	my ($self, $key) = @_;
	my $lckey = lc($key);
	if (exists $self->{key_value}{$lckey}) {
		delete $self->{key_value}{$lckey};
		@{$self->{keys}} = grep { lc($_) ne $lckey } @{$self->{keys}};
	}
}

sub type {
	return "open";
}

sub tag {
	my ($self) = @_;
	return $self->{tag};
}

1
