summaryrefslogtreecommitdiff
path: root/script/xbel2yaml.pl
blob: 6cfb18635f61bf241e8b8019c9041cd069cc3f53 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/perl 
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->{LocalNameeq 'folder') {
        $self->{status}='folder';
        push @{$self->{tags}},'';
    }
    elsif ($el->{LocalNameeq '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}}]; # force a copy 
        push @{$self->{bookmarks}},$mark;
    }
    elsif ($el->{LocalNameeq 'title' and $self->{statuseq 'folder') {
        $self->{status}='folder-title';
    }
    elsif ($el->{LocalNameeq 'title' and $self->{statuseq 'mark') {
        $self->{status}='mark-title';
    }
}
 
sub end_element {
    my ($self,$el)=@_;
 
    if ($el->{LocalNameeq 'folder') {
        pop @{$self->{tags}};
    }
    $self->{status}='';
}
 
sub characters {
    my ($self,$data)=@_;
 
    if ($self->{statuseq 'mark-title') {
        $self->{bookmarks}[-1]{description}.=$data->{Data};
    }
    elsif ($self->{statuseq 'folder-title') {
        $self->{tags}[-1].=$data->{Data};
    }
}
 
sub convert_date {
    return str2time($_[0]);
}
 
sub bookmarks {
    my ($self)=@_;
    return $self->{bookmarks};
}
 
1;