Hide Show 33 lines of Pod
no
warnings
'redefine'
;
our
(
$VERSION
);
our
%file_extensions
;
our
%parser_names
;
our
%canonical_media_types
;
our
%media_types
;
our
%format_uris
;
our
%encodings
;
BEGIN {
$VERSION
=
'1.019'
;
can_load(
modules
=> {
'Data::UUID'
=>
undef
,
'UUID::Tiny'
=>
undef
,
} );
}
Hide Show 6 lines of Pod
sub
media_type {
my
$self
=
shift
;
my
$class
=
ref
(
$self
) ||
$self
;
return
$canonical_media_types
{
$class
};
}
Hide Show 6 lines of Pod
sub
media_types {
my
$self
=
shift
;
my
@types
;
foreach
my
$type
(
keys
%media_types
) {
my
$class
=
$media_types
{
$type
};
push
(
@types
,
$type
)
if
(
$self
->isa(
$class
));
}
return
@types
;
}
Hide Show 7 lines of Pod
sub
parser_by_media_type {
my
$proto
=
shift
;
my
$type
=
shift
;
my
$class
=
$media_types
{
$type
};
return
$class
;
}
Hide Show 7 lines of Pod
sub
guess_parser_by_filename {
my
$class
=
shift
;
my
$file
=
shift
;
if
(
$file
=~ m/[.](\w+)$/) {
my
$ext
= $1;
return
$file_extensions
{
$ext
}
if
exists
$file_extensions
{
$ext
};
}
return
$class
->parser_by_media_type(
'application/rdf+xml'
) ||
'RDF::Trine::Parser::RDFXML'
;
}
Hide Show 15 lines of Pod
sub
new {
my
$class
=
shift
;
my
$name
=
shift
;
my
$key
=
lc
(
$name
);
$key
=~ s/[^a-z]//g;
if
(
$name
eq
'guess'
) {
throw RDF::Trine::Error::UnimplementedError
-text
=>
"guess parser heuristics are not implemented yet"
;
}
elsif
(
my
$class
=
$parser_names
{
$key
}) {
return
$class
->new(
name
=>
$key
,
@_
);
}
else
{
throw RDF::Trine::Error::ParserError
-text
=>
"No parser known named $name"
;
}
}
Hide Show 18 lines of Pod
sub
parse_url_into_model {
my
$class
=
shift
;
my
$url
=
shift
;
my
$model
=
shift
;
my
%args
=
@_
;
my
$base
=
$url
;
if
(
defined
(
$args
{base})) {
$base
=
$args
{base};
}
my
$ua
;
if
(
defined
(
$args
{useragent})) {
$ua
=
$args
{useragent};
}
else
{
$ua
= RDF::Trine->default_useragent->clone;
my
$accept
=
$class
->default_accept_header;
$ua
->default_headers->push_header(
'Accept'
=>
$accept
);
}
my
$resp
=
$ua
->get(
$url
);
if
(
$url
=~ /^file:/) {
my
$type
= guess_media_type(
$url
);
$resp
->header(
'Content-Type'
,
$type
);
}
unless
(
$resp
->is_success) {
throw RDF::Trine::Error::ParserError
-text
=>
$resp
->status_line;
}
my
$content
=
$resp
->content;
if
(
my
$cb
=
$args
{content_cb}) {
$cb
->(
$url
,
$content
,
$resp
);
}
my
$type
=
$resp
->header(
'content-type'
);
$type
=~ s/^([^\s;]+).*/$1/;
my
$pclass
=
$media_types
{
$type
};
if
(
$pclass
and
$pclass
->can(
'new'
)) {
my
$data
=
$content
;
if
(
my
$e
=
$encodings
{
$pclass
}) {
$data
= decode(
$e
,
$content
);
}
my
$parser
=
$pclass
->new(
%args
);
my
$ok
= 0;
try
{
$parser
->parse_into_model(
$base
,
$data
,
$model
,
%args
);
$ok
= 1;
}
catch
RDF::Trine::Error
with
{};
return
1
if
(
$ok
);
}
my
%options
;
if
(
defined
$args
{canonicalize}) {
$options
{ canonicalize } =
$args
{canonicalize};
}
my
$ok
= 0;
try
{
if
(
$url
=~ /[.](x?rdf|owl)$/ or
$content
=~ m/\x{FEFF}?<[?]xml /smo) {
my
$parser
= RDF::Trine::Parser::RDFXML->new(
%options
);
$parser
->parse_into_model(
$base
,
$content
,
$model
,
%args
);
$ok
= 1;;
}
elsif
(
$url
=~ /[.]ttl$/ or
$content
=~ m/@(prefix|base)/smo) {
my
$parser
= RDF::Trine::Parser::Turtle->new(
%options
);
my
$data
= decode(
'utf8'
,
$content
);
$parser
->parse_into_model(
$base
,
$data
,
$model
,
%args
);
$ok
= 1;;
}
elsif
(
$url
=~ /[.]trig$/) {
my
$parser
= RDF::Trine::Parser::Trig->new(
%options
);
my
$data
= decode(
'utf8'
,
$content
);
$parser
->parse_into_model(
$base
,
$data
,
$model
,
%args
);
$ok
= 1;;
}
elsif
(
$url
=~ /[.]nt$/) {
my
$parser
= RDF::Trine::Parser::NTriples->new(
%options
);
$parser
->parse_into_model(
$base
,
$content
,
$model
,
%args
);
$ok
= 1;;
}
elsif
(
$url
=~ /[.]nq$/) {
my
$parser
= RDF::Trine::Parser::NQuads->new(
%options
);
$parser
->parse_into_model(
$base
,
$content
,
$model
,
%args
);
$ok
= 1;;
}
elsif
(
$url
=~ /[.]js(?:on)?$/) {
my
$parser
= RDF::Trine::Parser::RDFJSON->new(
%options
);
$parser
->parse_into_model(
$base
,
$content
,
$model
,
%args
);
$ok
= 1;;
}
elsif
(
$url
=~ /[.]x?html?$/) {
my
$parser
= RDF::Trine::Parser::RDFa->new(
%options
);
$parser
->parse_into_model(
$base
,
$content
,
$model
,
%args
);
$ok
= 1;;
}
else
{
my
@types
=
keys
%{ {
map
{
$_
=> 1 }
values
%media_types
} };
foreach
my
$pclass
(
@types
) {
my
$data
=
$content
;
if
(
my
$e
=
$encodings
{
$pclass
}) {
$data
= decode(
$e
,
$content
);
}
my
$parser
=
$pclass
->new(
%options
);
my
$ok
= 0;
try
{
$parser
->parse_into_model(
$base
,
$data
,
$model
,
%args
);
$ok
= 1;
}
catch
RDF::Trine::Error::ParserError
with
{};
last
if
(
$ok
);
}
}
}
catch
RDF::Trine::Error
with
{
my
$e
=
shift
;
};
return
1
if
(
$ok
);
if
(
$pclass
) {
throw RDF::Trine::Error::ParserError
-text
=>
"Failed to parse data of type $type from $url"
;
}
else
{
throw RDF::Trine::Error::ParserError
-text
=>
"Failed to parse data from $url"
;
}
}
Hide Show 9 lines of Pod
sub
parse_url {
my
$class
=
shift
;
my
$url
=
shift
;
my
$handler
=
shift
;
my
%args
=
@_
;
my
$base
=
$url
;
if
(
defined
(
$args
{base})) {
$base
=
$args
{base};
}
my
$ua
;
if
(
defined
(
$args
{useragent})) {
$ua
=
$args
{useragent};
}
else
{
$ua
= RDF::Trine->default_useragent->clone;
my
$accept
=
$class
->default_accept_header;
$ua
->default_headers->push_header(
'Accept'
=>
$accept
);
}
my
$resp
=
$ua
->get(
$url
);
if
(
$url
=~ /^file:/) {
my
$type
= guess_media_type(
$url
);
$resp
->header(
'Content-Type'
,
$type
);
}
unless
(
$resp
->is_success) {
throw RDF::Trine::Error::ParserError
-text
=>
$resp
->status_line;
}
my
$content
=
$resp
->content;
if
(
my
$cb
=
$args
{content_cb}) {
$cb
->(
$url
,
$content
,
$resp
);
}
my
$type
=
$resp
->header(
'content-type'
);
$type
=~ s/^([^\s;]+).*/$1/;
my
$pclass
=
$media_types
{
$type
};
if
(
$pclass
and
$pclass
->can(
'new'
)) {
my
$data
=
$content
;
if
(
my
$e
=
$encodings
{
$pclass
}) {
$data
= decode(
$e
,
$content
);
}
my
$parser
=
$pclass
->new(
%args
);
my
$ok
= 0;
try
{
$parser
->parse(
$base
,
$data
,
$handler
);
$ok
= 1;
}
catch
RDF::Trine::Error
with
{};
return
1
if
(
$ok
);
}
my
%options
;
if
(
defined
$args
{canonicalize}) {
$options
{ canonicalize } =
$args
{canonicalize};
}
my
$ok
= 0;
try
{
if
(
$url
=~ /[.](x?rdf|owl)$/ or
$content
=~ m/\x{FEFF}?<[?]xml /smo) {
my
$parser
= RDF::Trine::Parser::RDFXML->new(
%options
);
$parser
->parse(
$base
,
$content
,
$handler
,
%args
);
$ok
= 1;;
}
elsif
(
$url
=~ /[.]ttl$/ or
$content
=~ m/@(prefix|base)/smo) {
my
$parser
= RDF::Trine::Parser::Turtle->new(
%options
);
my
$data
= decode(
'utf8'
,
$content
);
$parser
->parse(
$base
,
$data
,
$handler
,
%args
);
$ok
= 1;;
}
elsif
(
$url
=~ /[.]trig$/) {
my
$parser
= RDF::Trine::Parser::Trig->new(
%options
);
my
$data
= decode(
'utf8'
,
$content
);
$parser
->parse(
$base
,
$data
,
$handler
,
%args
);
$ok
= 1;;
}
elsif
(
$url
=~ /[.]nt$/) {
my
$parser
= RDF::Trine::Parser::NTriples->new(
%options
);
$parser
->parse(
$base
,
$content
,
$handler
,
%args
);
$ok
= 1;;
}
elsif
(
$url
=~ /[.]nq$/) {
my
$parser
= RDF::Trine::Parser::NQuads->new(
%options
);
$parser
->parse(
$base
,
$content
,
$handler
,
%args
);
$ok
= 1;;
}
elsif
(
$url
=~ /[.]js(?:on)?$/) {
my
$parser
= RDF::Trine::Parser::RDFJSON->new(
%options
);
$parser
->parse(
$base
,
$content
,
$handler
,
%args
);
$ok
= 1;;
}
elsif
(
$url
=~ /[.]x?html?$/) {
my
$parser
= RDF::Trine::Parser::RDFa->new(
%options
);
$parser
->parse(
$base
,
$content
,
$handler
,
%args
);
$ok
= 1;;
}
else
{
my
@types
=
keys
%{ {
map
{
$_
=> 1 }
values
%media_types
} };
foreach
my
$pclass
(
@types
) {
my
$data
=
$content
;
if
(
my
$e
=
$encodings
{
$pclass
}) {
$data
= decode(
$e
,
$content
);
}
my
$parser
=
$pclass
->new(
%options
);
my
$ok
= 0;
try
{
$parser
->parse(
$base
,
$data
,
$handler
,
%args
);
$ok
= 1;
}
catch
RDF::Trine::Error::ParserError
with
{};
last
if
(
$ok
);
}
}
}
catch
RDF::Trine::Error
with
{
my
$e
=
shift
;
};
return
1
if
(
$ok
);
if
(
$pclass
) {
throw RDF::Trine::Error::ParserError
-text
=>
"Failed to parse data of type $type from $url"
;
}
else
{
throw RDF::Trine::Error::ParserError
-text
=>
"Failed to parse data from $url"
;
}
}
Hide Show 7 lines of Pod
sub
parse_into_model {
my
$proto
=
shift
;
my
$self
= blessed(
$proto
) ?
$proto
:
$proto
->new();
my
$uri
=
shift
;
if
(blessed(
$uri
) and
$uri
->isa(
'RDF::Trine::Node::Resource'
)) {
$uri
=
$uri
->uri_value;
}
my
$input
=
shift
;
my
$model
=
shift
;
my
%args
=
@_
;
my
$context
=
$args
{
'context'
};
my
$handler
=
sub
{
my
$st
=
shift
;
if
(
$context
) {
my
$quad
= RDF::Trine::Statement::Quad->new(
$st
->nodes,
$context
);
$model
->add_statement(
$quad
);
}
else
{
$model
->add_statement(
$st
);
}
};
$model
->begin_bulk_ops();
my
$s
=
$self
->parse(
$uri
,
$input
,
$handler
);
$model
->end_bulk_ops();
return
$s
;
}
Hide Show 8 lines of Pod
sub
parse_file_into_model {
my
$proto
=
shift
;
my
$self
= (blessed(
$proto
) or
$proto
eq __PACKAGE__)
?
$proto
:
$proto
->new();
my
$uri
=
shift
;
if
(blessed(
$uri
) and
$uri
->isa(
'RDF::Trine::Node::Resource'
)) {
$uri
=
$uri
->uri_value;
}
my
$fh
=
shift
;
my
$model
=
shift
;
my
%args
=
@_
;
my
$context
=
$args
{
'context'
};
my
$handler
=
sub
{
my
$st
=
shift
;
if
(
$context
) {
my
$quad
= RDF::Trine::Statement::Quad->new(
$st
->nodes,
$context
);
$model
->add_statement(
$quad
);
}
else
{
$model
->add_statement(
$st
);
}
};
$model
->begin_bulk_ops();
my
$s
=
$self
->parse_file(
$uri
,
$fh
,
$handler
);
$model
->end_bulk_ops();
return
$s
;
}
Hide Show 8 lines of Pod
sub
parse_file {
my
$self
=
shift
;
my
$base
=
shift
;
my
$fh
=
shift
;
my
$handler
=
shift
;
unless
(
ref
(
$fh
)) {
my
$filename
=
$fh
;
undef
$fh
;
unless
(
$self
->can(
'parse'
)) {
my
$pclass
=
$self
->guess_parser_by_filename(
$filename
);
$self
=
$pclass
->new()
if
(
$pclass
and
$pclass
->can(
'new'
));
}
open
(
$fh
,
'<:encoding(UTF-8)'
,
$filename
) or throw RDF::Trine::Error::ParserError
-text
=> $!;
}
if
(
$self
and
$self
->can(
'parse'
)) {
my
$content
=
do
{
local
($/) =
undef
; <
$fh
> };
return
$self
->parse(
$base
,
$content
,
$handler
,
@_
);
}
else
{
throw RDF::Trine::Error::ParserError
-text
=>
"Cannot parse unknown serialization"
;
}
}
Hide Show 4 lines of Pod
Hide Show 8 lines of Pod
sub
new_bnode_prefix {
my
$class
=
shift
;
if
(
defined
(
$Data::UUID::VERSION
)) {
my
$ug
= new Data::UUID;
my
$uuid
=
$ug
->to_string(
$ug
->create() );
$uuid
=~ s/-//g;
return
'b'
.
$uuid
;
}
elsif
(
defined
(
$UUID::Tiny::VERSION
) && ($] < 5.010000)) {
my
$uuid
= UUID::Tiny::create_UUID_as_string(UUID::Tiny::UUID_V1());
$uuid
=~ s/-//g;
return
'b'
.
$uuid
;
}
else
{
return
''
;
}
}
Hide Show 10 lines of Pod
sub
default_accept_header {
my
$accept
=
join
(
','
,
map
{ /(turtle|rdf[+]xml)/ ?
"$_;q=1.0"
:
"$_;q=0.9"
}
keys
%media_types
);
return
$accept
;
}
1;
Hide Show 19 lines of Pod