forked from friendica/php-json-ld
Various bug fixes to pass more tests.
This commit is contained in:
parent
89dd522d45
commit
6fbdfaa3b6
53
jsonld.php
53
jsonld.php
|
@ -271,6 +271,7 @@ function jsonld_parse_url($url) {
|
|||
else if(!isset($rval['path'])) {
|
||||
$rval['path'] = '';
|
||||
}
|
||||
return $rval;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -287,7 +288,6 @@ function jsonld_prepend_base($base, $iri) {
|
|||
}
|
||||
$authority = $base['host'];
|
||||
$rel = jsonld_parse_url($iri);
|
||||
print_r($rel);
|
||||
|
||||
// per RFC3986 normalize slashes and dots in path
|
||||
|
||||
|
@ -297,7 +297,7 @@ function jsonld_prepend_base($base, $iri) {
|
|||
$authority = substr($path, 0, strrpos($path, '/'));
|
||||
$path = substr($path, strlen($authority));
|
||||
}
|
||||
// IRI represents an absolue path
|
||||
// IRI represents an absolute path
|
||||
else if(strpos($rel['path'], '/') === 0) {
|
||||
$path = $rel['path'];
|
||||
}
|
||||
|
@ -308,23 +308,23 @@ function jsonld_prepend_base($base, $iri) {
|
|||
if($rel['path'] !== '') {
|
||||
$idx = strrpos($path, '/');
|
||||
$idx = ($idx === false) ? 0 : $idx + 1;
|
||||
$path = substr($path, 0, $idx) + $rel['path'];
|
||||
$path = substr($path, 0, $idx) . $rel['path'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$segments = explode($path, '/');
|
||||
$segments = explode('/', $path);
|
||||
|
||||
// remove '.' and '' (do not remove trailing empty path)
|
||||
$idx = 0;
|
||||
$idx = -1;
|
||||
$end = count($segments) - 1;
|
||||
$filter = function($e) use ($idx, $end) {
|
||||
$filter = function($e) use (&$idx, $end) {
|
||||
$idx += 1;
|
||||
return $e !== '.' && ($e !== '' || $idx === $end);
|
||||
};
|
||||
$segments = array_filter($segments, $filter);
|
||||
$segments = array_values(array_filter($segments, $filter));
|
||||
|
||||
// remove as many '..' as possible
|
||||
for($i = 0; $i < count($segments);) {
|
||||
for($i = 0; $i < count($segments);) {
|
||||
$segment = $segments[$i];
|
||||
if($segment === '..') {
|
||||
// too many reverse dots
|
||||
|
@ -339,8 +339,9 @@ function jsonld_prepend_base($base, $iri) {
|
|||
break;
|
||||
}
|
||||
|
||||
// remove '..' and previous segment
|
||||
// remove '..' and previous segment
|
||||
array_splice($segments, $i - 1, 2);
|
||||
$segments = array_values($segments);
|
||||
$i -= 1;
|
||||
}
|
||||
else {
|
||||
|
@ -348,14 +349,14 @@ function jsonld_prepend_base($base, $iri) {
|
|||
}
|
||||
}
|
||||
|
||||
$path = '/' . implode(',', $segments);
|
||||
$path = '/' . implode('/', $segments);
|
||||
|
||||
// add query and hash
|
||||
if(isset($rel['query'])) {
|
||||
$path .= '?' . $rel['query'];
|
||||
}
|
||||
if(isset($rel['hash'])) {
|
||||
$path .= '#' . $rel['hash'];
|
||||
if(isset($rel['fragment'])) {
|
||||
$path .= '#' . $rel['fragment'];
|
||||
}
|
||||
|
||||
return $base['scheme'] . "://$authority$path";
|
||||
|
@ -472,7 +473,7 @@ class JsonLdProcessor {
|
|||
$tmp = $ctx;
|
||||
$ctx = array();
|
||||
foreach($tmp as $v) {
|
||||
if(!is_object($v) || count(get_object_vars($v)) > 0) {
|
||||
if(!is_object($v) || count(array_keys((array)$v)) > 0) {
|
||||
$ctx[] = $v;
|
||||
}
|
||||
}
|
||||
|
@ -1012,7 +1013,7 @@ class JsonLdProcessor {
|
|||
return !self::compareValues($e, $value);
|
||||
};
|
||||
$values = self::getValues($subject, $property);
|
||||
$values = array_filter($values, $filter);
|
||||
$values = array_values(array_filter($values, $filter));
|
||||
|
||||
if(count($values) === 0) {
|
||||
self::removeProperty($subject, $property);
|
||||
|
@ -1062,10 +1063,12 @@ class JsonLdProcessor {
|
|||
}
|
||||
$list1 = $v1->{'@list'};
|
||||
$list2 = $v2->{'@list'};
|
||||
if(count($list1) !== count($list2)) {
|
||||
$count_list1 = count($list1);
|
||||
$count_list2 = count($list2);
|
||||
if($count_list1 !== $count_list2) {
|
||||
return false;
|
||||
}
|
||||
for($i = 0; $i < count($list1); ++$i) {
|
||||
for($i = 0; $i < $count_list1; ++$i) {
|
||||
if(!self::compareValues($list1[$i], $list2[$i])) {
|
||||
return false;
|
||||
}
|
||||
|
@ -1664,7 +1667,7 @@ class JsonLdProcessor {
|
|||
foreach($keys as $key) {
|
||||
$value = $element->{$key};
|
||||
|
||||
// expand key using property generator
|
||||
// get term definition for key
|
||||
if(property_exists($active_ctx->mappings, $key)) {
|
||||
$mapping = $active_ctx->mappings->{$key};
|
||||
}
|
||||
|
@ -1672,6 +1675,7 @@ class JsonLdProcessor {
|
|||
$mapping = null;
|
||||
}
|
||||
|
||||
// expand key using property generator
|
||||
if($mapping && $mapping->propertyGenerator) {
|
||||
$expanded_property = $mapping->{'@id'};
|
||||
}
|
||||
|
@ -2609,7 +2613,8 @@ class JsonLdProcessor {
|
|||
*/
|
||||
protected function _labelBlankNodes($namer, $element, $is_id=false) {
|
||||
if(is_array($element)) {
|
||||
for($i = 0; $i < count($element); ++$i) {
|
||||
$length = count($element);
|
||||
for($i = 0; $i < $length; ++$i) {
|
||||
$element[$i] = $this->_labelBlankNodes($namer, $element[$i], $is_id);
|
||||
}
|
||||
}
|
||||
|
@ -3942,7 +3947,8 @@ class JsonLdProcessor {
|
|||
if($iri === $expanded_property) {
|
||||
continue;
|
||||
}
|
||||
for($pi = 0; $pi < count($element->{$iri}); ++$pi) {
|
||||
$length = count($element->{$iri});
|
||||
for($pi = 0; $pi < $length; ++$pi) {
|
||||
if(self::compareValues($element->{$iri}[$pi], $value)) {
|
||||
// duplicate found, remove it in place
|
||||
array_splice($element->{$iri}, $pi, 1);
|
||||
|
@ -4005,7 +4011,7 @@ class JsonLdProcessor {
|
|||
$kw = $active_ctx->mappings->{$term}->{'@id'};
|
||||
if(self::_isKeyword($kw)) {
|
||||
array_splice($active_ctx->keywords->{$kw},
|
||||
in_array($term, $active_ctx->keywords->{$kw}), 1);
|
||||
array_search($term, $active_ctx->keywords->{$kw}), 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4226,9 +4232,7 @@ class JsonLdProcessor {
|
|||
|
||||
if(property_exists($active_ctx->mappings, $value)) {
|
||||
$mapping = $active_ctx->mappings->{$value};
|
||||
}
|
||||
|
||||
if(isset($mapping)) {
|
||||
// value is explicitly ignored with a null mapping
|
||||
if($mapping === null) {
|
||||
return null;
|
||||
|
@ -4239,8 +4243,7 @@ class JsonLdProcessor {
|
|||
}
|
||||
|
||||
// term dependency cannot be a property generator
|
||||
if($local_ctx !== null && $mapping &&
|
||||
$mapping->propertyGenerator) {
|
||||
if($local_ctx !== null && $mapping && $mapping->propertyGenerator) {
|
||||
throw new JsonLdException(
|
||||
'Invalid JSON-LD syntax; a term definition cannot have a property ' .
|
||||
'generator as a dependency.',
|
||||
|
|
Loading…
Reference in a new issue