Data-HTML-TreeDumper

 view release on metacpan or  search on metacpan

lib/Data/HTML/TreeDumper.pm  view on Meta::CPAN

    my $self = shift;
    if (@_) {
        $self->{ClassUnorderedList} = shift;
    }
    return $self->{ClassUnorderedList};
}

sub StartOrderedList {
    my $self = shift;
    if (@_) {
        $self->{StartOrderedList} = shift;
    }
    return $self->{StartOrderedList};
}

sub MaxDepth {
    my $self = shift;
    if (@_) {
        my $value = shift;
        $self->{MaxDepth}
            = $value < 0                  ? 0
            : $value > $default{MaxDepth} ? $default{MaxDepth}
            :                               $value;
    }
    return $self->{MaxDepth};
}

#endregion

#region Instance methods

sub dump {
    my $self  = shift;
    my $x     = shift // return $self->_dumpRaw('[undef]');
    my $name  = $self->_normalizeName( $x, shift );
    my $depth = shift || 0;
    my $result
        = !is_ref($x)      ? $self->_dumpRaw( $x, $name )
        : is_scalarref($x) ? $self->dump( ${$x}, $name, $depth + 1 )
        : is_arrayref($x)  ? $self->_dumpArray( $x, $name, $depth + 1 )
        : is_hashref($x)   ? $self->_dumpHash( $x, $name, $depth + 1 )
        :                    $self->_dumpRaw( $x, $name );
    return $result;
}

sub _normalizeName {
    my $self = shift;
    my $x    = shift;
    my $name = shift;
    return $name || ref($x) || 'unnamed';
}

sub _dumpRaw {
    my $self  = shift;
    my $x     = shift // '';
    my $name  = $self->_normalizeName( $x, shift );
    my $depth = shift || 0;
    return $autoTag->tag(
        tag   => 'span',
        attr  => { class => $self->ClassValue(), },
        cdata => encode_entities($x),
    );
}

sub _dumpArray {
    my $self  = shift;
    my $x     = shift // '';
    my $name  = $self->_normalizeName( $x, shift );
    my $depth = shift || 0;
    if ( $depth > $self->MaxDepth() ) {
        return $autoTag->tag(
            tag   => 'span',
            attr  => { class => $self->ClassKey(), },
            cdata => encode_entities($name),
            )
            . ': '
            . $autoTag->tag(
            tag   => 'span',
            attr  => { class => $self->ClassValue(), },
            cdata => '[...]',
            );
    }
    my $inner = [ map { { tag => 'li', cdata => $self->dump( $_, undef, $depth ) } } @{$x} ];
    return $autoTag->tag(
        tag   => 'details',
        cdata => [
            {   tag   => 'summary',
                attr  => { class => $self->ClassKey(), },
                cdata => encode_entities($name),
            },
            {   tag   => 'ol',
                attr  => { class => $self->ClassOrderedList(), start => $self->StartOrderedList() },
                cdata => $inner,
            },
        ],
    );
}

sub _dumpHash {
    my $self  = shift;
    my $x     = shift // '';
    my $name  = $self->_normalizeName( $x, shift );
    my $depth = shift || 0;
    if ( $depth > $self->MaxDepth() ) {
        return $autoTag->tag(
            tag   => 'span',
            attr  => { class => $self->ClassKey(), },
            cdata => encode_entities($name),
            )
            . ': '
            . $autoTag->tag(
            tag   => 'span',
            attr  => { class => $self->ClassValue(), },
            cdata => '{...}',
            );
    }
    my $inner = [
        map {
            is_arrayref( $x->{$_} )
                ? { tag => 'li', cdata => $self->_dumpArray( $x->{$_}, $_, $depth + 1 ) }
                : is_hashref( $x->{$_} )
                ? { tag => 'li', cdata => $self->_dumpHash( $x->{$_}, $_, $depth + 1 ) }
                : {
                tag   => 'li',
                cdata => $autoTag->tag(
                    tag   => 'span',
                    attr  => { class => $self->ClassKey(), },
                    cdata => encode_entities($_)
                    )
                    . ': '
                    . $self->dump( $x->{$_}, $_, $depth + 1 )
                }
        } sort( keys( %{$x} ) )
    ];
    return $autoTag->tag(
        tag   => 'details',
        cdata => [
            {   tag   => 'summary',
                attr  => { class => $self->ClassKey(), },
                cdata => encode_entities($name),
            },
            {   tag   => 'ul',
                attr  => { class => $self->ClassUnorderedList(), },
                cdata => $inner,
            },
        ],
    );
}

#endregion

1;

__END__

=encoding utf-8

=head1 NAME

L<Data::HTML::TreeDumper> - dumps perl data as HTML5 open/close tree

=head1 SYNOPSIS

    use Data::HTML::TreeDumper;
    my $td = Data::HTML::TreeDumper->new(
        ClassKey    => 'trdKey',
        ClassValue  => 'trdValue',
        MaxDepth    => 8,
    );
    my $obj = someFunction();
    print $td->dump($obj);

There are L<some samples|https://raw.githack.com/TakeAsh/p-Data-HTML-TreeDumper/master/examples/output/sample1.html>.

=head1 DESCRIPTION

Data::HTML::TreeDumper dumps perl data as HTML5 open/close tree.

=head1 CLASS METHODS

=head2 new([option => value, ...])

Creates a new Data::HTML::TreeDumper instance.
This method can take a list of options.
You can set each options later as the properties of the instance.

=head3 ClassKey, ClassValue, ClassOrderedList, ClassUnorderedList

CSS class names for each items.
OrderedList is for arrays.
UnorderedList is for hashes.

=head3 StartOrderedList

An integer to start counting from for arrays.
Default is 0.

=head3 MaxDepth

Stops following object tree at this level, and show "..." instead.
Default is 8.
Over 32 is not acceptable to prevent memory leak.

=head1 INSTANCE METHODS



( run in 1.374 second using v1.01-cache-2.11-cpan-140bd7fdf52 )