use strict; #use warnings; package RDF::Notation3::SAX; require 5.005_62; use RDF::Notation3; use RDF::Notation3::Template::TXML; use XML::SAX::Base; use IO::File; use Carp; ############################################################ @RDF::Notation3::SAX::ISA = qw(XML::SAX::Base RDF::Notation3::Template::TXML RDF::Notation3); # -------------------------------------------------- sub _parse_bytestream { my ($self, $fh, $options) = @_; #FIXME: options to ai jsou zbytecne $self->_do_error(1, '') unless @_ > 1; $self->{ansuri} = '#' unless exists $self->{ansuri}; $self->{quantif} = 1 unless exists $self->{quantif}; $self->{count} = 0; $self->doStartDocument; eval { $self->RDF::Notation3::parse_file($fh) }; if ($@) { my ($ms, $ln) = _parse_error_msg($@); $self->SUPER::error({ Message => $ms, Exception => $@, LineNumber => $ln }); } return $self->doEndDocument; } sub _parse_string { my ($self, $str, $options) = @_; $self->_do_error(3, '') unless @_ > 1; $self->{ansuri} = '#' unless exists $self->{ansuri}; $self->{quantif} = 1 unless exists $self->{quantif}; $self->{count} = 0; $self->doStartDocument; eval { $self->RDF::Notation3::parse_string($str) }; if ($@) { my ($ms, $ln) = _parse_error_msg($@); $self->SUPER::error({ Message => $ms, Exception => $@, LineNumber => $ln }); } return $self->doEndDocument; } sub _parse_systemid { my ($self, $uri, $options) = @_; my $fh = IO::File->new($uri) or croak "RDF::Notation3: Can't open $uri ($!)"; $self->_parse_bytestream($fh, $options); #$self->_do_error(301, ''); } sub _parse_characterstream { my ($self, $fh, $options) = @_; $self->_do_error(302, ''); } # -------------------------------------------------- sub doStartDocument { my $self = shift; $self->start_document({}); $self->{context} = '<>'; my @attr = (['xmlns:rdf','http://www.w3.org/1999/02/22-rdf-syntax-ns#']); $self->doStartElement('rdf:RDF', \@attr); } sub doEndDocument { my $self = shift; $self->doEndElement('rdf:RDF'); return $self->end_document({}); } sub doStartElement { my ($self, $tag, $attr) = @_; my %ahash; foreach (@$attr) { my ($prefix, $lname) = _split_qname($_->[0]); my $ns = $self->_set_namespace($prefix); $ahash{"{$ns}$_->[0]"} = { Name => $_->[0], LocalName => $lname, Prefix => $prefix, NamespaceURI => $ns, Value => $_->[1] }; } my ($prefix, $lname) = _split_qname($tag); my $ns = $self->_set_namespace($prefix); $self->start_element({ Name => $tag, LocalName => $lname, Prefix => $prefix, NamespaceURI => $ns, Attributes => \%ahash }); } sub doEndElement { my ($self, $tag) = @_; my ($prefix, $lname) = _split_qname($tag); my $ns = $self->_set_namespace($prefix); $self->end_element({ Name => $tag, LocalName => $lname, Prefix => $prefix, NamespaceURI => $ns } ); } sub doElement { my ($self, $tag, $attr, $value) = @_; $self->doStartElement($tag, $attr, $tag); $self->characters({ Data => $value }); $self->doEndElement($tag, $tag); } # ---------- utility functions ---------- sub _set_namespace { my ($self, $prefix) = @_; my $ns = $self->{ns}->{$self->{context}}->{$prefix}; if ($prefix eq 'rdf') { $ns = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' unless $self->{ns}->{$self->{context}}->{rdf}; } elsif ($prefix eq 'xml') { $ns = 'http://www.w3.org/XML/1998/namespace'; } elsif ($prefix eq 'xmlns') { $ns = 'http://www.w3.org/2000/xmlns/'; } $ns = '' unless $ns; return $ns; } sub _split_qname { my $qname = shift; my $prefix = ''; my $lname = $qname; if ($qname =~ /^([_a-zA-Z]\w*)*:([a-zA-Z]\w*)$/) { $prefix = $1; $lname = $2; } return ($prefix, $lname); } sub _parse_error_msg { my $msg = shift; my $ms = 'RDF::Notation3 parse error'; my $ln = 'n/a'; $msg =~ /] line (\d+)/ and $ln = $1; return ($ms, $ln); } 1; __END__ # Below is a documentation. =head1 NAME RDF::Notation3::XML - RDF/N3 to RDF/XML SAX convertor =head1 LICENSING Copyright (c) 2001 Ginger Alliance. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 AUTHOR Petr Cimprich, petr@gingerall.cz =head1 SEE ALSO perl(1), RDF::Notation3. =cut