The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Bookmarks::XML;
use base 'Bookmarks::Parser';
use strict;
use warnings;
use XML::Simple;

sub new {
    my ($class, %opts) = @_;

    #    %opts = check_options(%opts);

    my $self = bless({%opts}, ref($class) || $class);
    return $self;
}

sub parse_file {
    my ($sel, $filename) = @_;

    return if (!$filename || !-e $filename);

    my $bookmarks = XMLin($filename, ForceArray => ['folder']);

}

sub get_header_as_string {
    my ($self) = @_;

    my $now    = scalar localtime;
    my $title  = $self->{_title} || 'Bookmarks';
    my $header = << "XML";
<?xml version="1.0" encoding="UTF-8"?>
<!--
Bookmarks::XML internal format
Created on: $now

-->
<bookmarks title="$title">
XML

    return $header;
}

sub get_item_as_string {
    my ($self, $item) = @_;

    if (!defined $item->{id} || !$self->{_items}{ $item->{id} }) {
        warn "No such item in get_item_as_string";
        return;
    }

    my $string = '';
    my ($id, $url, $name, $visited, $created, $modified, $icon, $desc,
        $expand, $trash, $order) = (
        $item->{id}          || 0,
        $item->{url}         || '',
        $item->{name}        || '',
        $item->{visited}     || 0,
        $item->{created}     || time(),
        $item->{modified}    || 0,
        $item->{icon}        || '',
        $item->{description} || '',
        $item->{expanded}    || '',
        $item->{trash}       || '',
        $item->{order}       || ''
        );

    if ($item->{type} eq 'folder') {
        $string .= << "XML";
  <folder id="$id" name="$name" created="$created" visited="$visited" icon="$icon" description="$desc" expanded="$expand" trash="$trash">
XML

        $string .= $self->get_item_as_string($self->{_items}{$_})
            foreach (@{ $item->{children} });
        $string .= "  </folder>\n";
    }
    elsif ($item->{type} eq 'url') {
        $string .= << "XML";
    <bookmark id="$id" url="$url" name="$name" created="$created" visited="$visited" modified="$modified" icon="$icon" description="$desc" order="$order" />
XML

    }

    return $string;
}

sub get_footer_as_string {
    my ($self) = @_;

    my $footer = << "XML";
</bookmarks>
XML

    return $footer;
}

1;

=head1 NAME

Bookmarks::Parser::XML - Backend for XML format

=head1 DESCRIPTION

This backend is completely untested, and probably does not work yet. use at own risk.
It will probably be replaced with an XBEL based backend in a future release.

=head1 METHODS

=head2 get_footer_as_string

=head2 get_header_as_string

=head2 get_item_as_string

=head2 new

=head2 parse_file

For these methods, consult L<Bookmarks::Parser> documentation.
They are overridden because of the XML behaviour here.
Interface remains the same.

=cut