Give precedence to @vocab over CURIEs when compacting IRIs.

This commit is contained in:
Dave Longley 2013-04-04 11:36:50 -04:00
parent 7034bb713e
commit 330aa5f685

View file

@ -4091,9 +4091,12 @@ class JsonLdProcessor {
if(self::_isKeyword($iri)) { if(self::_isKeyword($iri)) {
$relative_to['vocab'] = true; $relative_to['vocab'] = true;
} }
else if(!isset($relative_to['vocab'])) {
$relative_to['vocab'] = false;
}
// use inverse context to pick a term if iri is relative to vocab // use inverse context to pick a term if iri is relative to vocab
if(isset($relative_to['vocab']) && $relative_to['vocab'] && if($relative_to['vocab'] &&
property_exists($this->_getInverseContext($active_ctx), $iri)) { property_exists($this->_getInverseContext($active_ctx), $iri)) {
$default_language = '@none'; $default_language = '@none';
if(property_exists($active_ctx, '@language')) { if(property_exists($active_ctx, '@language')) {
@ -4204,7 +4207,22 @@ class JsonLdProcessor {
} }
} }
// no term match, check for possible CURIEs // no term match, use @vocab if available
if($relative_to['vocab']) {
if(property_exists($active_ctx, '@vocab')) {
// determine if vocab is a prefix of the iri
$vocab = $active_ctx->{'@vocab'};
if(strpos($iri, $vocab) === 0 && $iri !== $vocab) {
// use suffix as relative iri if it is not a term in the active context
$suffix = substr($iri, strlen($vocab));
if(!property_exists($active_ctx->mappings, $suffix)) {
return $suffix;
}
}
}
}
// no term or @vocab match, check for possible CURIEs
$choice = null; $choice = null;
foreach($active_ctx->mappings as $term => $definition) { foreach($active_ctx->mappings as $term => $definition) {
// skip terms with colons, they can't be prefixes // skip terms with colons, they can't be prefixes
@ -4240,22 +4258,8 @@ class JsonLdProcessor {
return $choice; return $choice;
} }
// no matching terms or curies, use @vocab if available
if(isset($relative_to['vocab']) && $relative_to['vocab']) {
if(property_exists($active_ctx, '@vocab')) {
// determine if vocab is a prefix of the iri
$vocab = $active_ctx->{'@vocab'};
if(strpos($iri, $vocab) === 0 && $iri !== $vocab) {
// use suffix as relative iri if it is not a term in the active context
$suffix = substr($iri, strlen($vocab));
if(!property_exists($active_ctx->mappings, $suffix)) {
return $suffix;
}
}
}
}
// compact IRI relative to base // compact IRI relative to base
else { if(!$relative_to['vocab']) {
return jsonld_remove_base($active_ctx->{'@base'}, $iri); return jsonld_remove_base($active_ctx->{'@base'}, $iri);
} }