use XML::SAX::ParserFactory;
use YAML;
my $handler=XBEL::Handler->new();
my $parser=XML::SAX::ParserFactory->parser(Handler=>$handler);
$parser->parse_uri($ARGV[0]);
print Dump($handler->bookmarks());
package XBEL::Handler;
use base 'XML::SAX::Base';
use Date::Parse;
sub new {
my ($class)=@_;
return bless +{
bookmarks=>[],
status=>'out',
tags=>[],
},$class;
}
sub start_element {
my ($self,$el)=@_;
if ($el->{LocalName} eq 'folder') {
$self->{status}='folder';
push @{$self->{tags}},'';
}
elsif ($el->{LocalName} eq 'bookmark') {
$self->{status}='mark';
my $mark={};
$mark->{href}=$el->{Attributes}{'{}href'}{Value};
$mark->{created}=convert_date($el->{Attributes}{'{}added'}{Value});
$mark->{modified}=convert_date($el->{Attributes}{'{}modified'}{Value});
$mark->{tags}=[@{$self->{tags}}];
push @{$self->{bookmarks}},$mark;
}
elsif ($el->{LocalName} eq 'title' and $self->{status} eq 'folder') {
$self->{status}='folder-title';
}
elsif ($el->{LocalName} eq 'title' and $self->{status} eq 'mark') {
$self->{status}='mark-title';
}
}
sub end_element {
my ($self,$el)=@_;
if ($el->{LocalName} eq 'folder') {
pop @{$self->{tags}};
}
$self->{status}='';
}
sub characters {
my ($self,$data)=@_;
if ($self->{status} eq 'mark-title') {
$self->{bookmarks}[-1]{description}.=$data->{Data};
}
elsif ($self->{status} eq 'folder-title') {
$self->{tags}[-1].=$data->{Data};
}
}
sub convert_date {
return str2time($_[0]);
}
sub bookmarks {
my ($self)=@_;
return $self->{bookmarks};
}
1;