# Copyright (c) 2007 bivio Software, Inc. All Rights Reserved. # # Visit http://www.bivio.biz for more info. # # This library is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; If not, you may get a copy from: # http://www.opensource.org/licenses/lgpl-license.html # # $Id: PList.pm,v 1.1 2008/01/01 02:56:50 nagler Exp $ package Bivio::XML::PList; use strict; use Bivio::Base 'Bivio::UNIVERSAL'; use Bivio::IO::File; use XML::Parser (); our($VERSION) = sprintf('%d.%02d', q$Revision: 1.1 $ =~ /\d+/g); sub to_tree { my(undef, $xml) = @_; $xml = Bivio::IO::File->read($xml) unless ref($xml); return _from_xhtml_children( XML::Parser->new(Style => 'Tree')->parse($$xml), )->[0]->[0]; } sub _from_xhtml_children { my($children) = @_; return [map( _from_xhtml_child($children->[$_ *= 2], $children->[++$_]), 0 .. @$children/2 - 1, )]; } sub _from_xhtml_child { my($tag, $children) = @_; return $children =~ /\S/ ? $children : () unless $tag; shift(@$children) if ref($children->[0]) eq 'HASH'; return _from_xhtml_children($children) if $tag =~ /^(?:plist|array)$/; unless ($tag eq 'dict') { my($res) = _from_xhtml_children($children); return @$res ? @$res : ''; } return {@{_from_xhtml_children($children)}}; } 1;