forked from friendica/php-json-ld
Various syntax/logic fixes.
This commit is contained in:
parent
cdce63a99c
commit
a1a5a4cb34
2 changed files with 47 additions and 52 deletions
|
@ -56,6 +56,7 @@ function deep_compare($expect, $result) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $expect === $result;
|
return $expect === $result;
|
||||||
|
@ -130,7 +131,7 @@ class TestRunner {
|
||||||
public function check($test, $expect, $result) {
|
public function check($test, $expect, $result) {
|
||||||
global $eol;
|
global $eol;
|
||||||
|
|
||||||
if(strpos($test->{'@type'}, 'NormalizeTest') !== false) {
|
if(in_array('jld:NormalizeTest', $test->{'@type'}) !== false) {
|
||||||
$pass = JsonLdProcessor::compareNormalized($expect, $result);
|
$pass = JsonLdProcessor::compareNormalized($expect, $result);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -154,9 +155,6 @@ class TestRunner {
|
||||||
echo 'JSON Result: ' .
|
echo 'JSON Result: ' .
|
||||||
json_encode(json_decode(result, $flags)) . $eol;
|
json_encode(json_decode(result, $flags)) . $eol;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// FIXME: remove me
|
|
||||||
throw new Exception('FAIL');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,12 +171,11 @@ class TestRunner {
|
||||||
$handle = opendir($filepath);
|
$handle = opendir($filepath);
|
||||||
if($handle) {
|
if($handle) {
|
||||||
while(($file = readdir($handle)) !== false) {
|
while(($file = readdir($handle)) !== false) {
|
||||||
if($file !== '..' and $file !== '.')
|
if($file !== '..' and $file !== '.') {
|
||||||
{
|
$files[] = $filepath . '/' . $file;
|
||||||
$files[] = $filepath . '/' . $file;
|
}
|
||||||
}
|
}
|
||||||
}
|
closedir($handle);
|
||||||
closedir($handle);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
throw new Exception('Could not open directory.');
|
throw new Exception('Could not open directory.');
|
||||||
|
@ -243,6 +240,7 @@ class TestRunner {
|
||||||
$result = jsonld_expand($input, $options);
|
$result = jsonld_expand($input, $options);
|
||||||
}
|
}
|
||||||
else if(in_array('jld:CompactTest', $type)) {
|
else if(in_array('jld:CompactTest', $type)) {
|
||||||
|
continue;
|
||||||
$this->test($test->name);
|
$this->test($test->name);
|
||||||
$input = read_test_json($test->input, $filepath);
|
$input = read_test_json($test->input, $filepath);
|
||||||
$test->context = read_test_json($test->context, $filepath);
|
$test->context = read_test_json($test->context, $filepath);
|
||||||
|
@ -250,6 +248,7 @@ class TestRunner {
|
||||||
$result = jsonld_compact($input, $test->context, $options);
|
$result = jsonld_compact($input, $test->context, $options);
|
||||||
}
|
}
|
||||||
else if(in_array('jld:FrameTest', $type)) {
|
else if(in_array('jld:FrameTest', $type)) {
|
||||||
|
continue;
|
||||||
$this->test($test->name);
|
$this->test($test->name);
|
||||||
$input = read_test_json($test->input, $filepath);
|
$input = read_test_json($test->input, $filepath);
|
||||||
$test->frame = read_test_json($test->frame, $filepath);
|
$test->frame = read_test_json($test->frame, $filepath);
|
||||||
|
|
80
jsonld.php
80
jsonld.php
|
@ -236,7 +236,7 @@ class JsonLdProcessor {
|
||||||
if($has_context || $options['graph']) {
|
if($has_context || $options['graph']) {
|
||||||
if(is_array($compacted)) {
|
if(is_array($compacted)) {
|
||||||
// use '@graph' keyword
|
// use '@graph' keyword
|
||||||
$kwgraph =$this->_compactIri($active_ctx, '@graph');
|
$kwgraph = $this->_compactIri($active_ctx, '@graph');
|
||||||
$graph = $compacted;
|
$graph = $compacted;
|
||||||
$compacted = new stdClass();
|
$compacted = new stdClass();
|
||||||
if($hasContext) {
|
if($hasContext) {
|
||||||
|
@ -398,7 +398,7 @@ class JsonLdProcessor {
|
||||||
}
|
}
|
||||||
|
|
||||||
// do normalization
|
// do normalization
|
||||||
$this->_normalize($expanded);
|
return $this->_normalize($expanded);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -885,7 +885,7 @@ class JsonLdProcessor {
|
||||||
|
|
||||||
// preserve empty arrays
|
// preserve empty arrays
|
||||||
if(count($value) === 0) {
|
if(count($value) === 0) {
|
||||||
$prop =$this->_compactIri($ctx, $key);
|
$prop = $this->_compactIri($ctx, $key);
|
||||||
self::addValue($rval, $prop, array(), true);
|
self::addValue($rval, $prop, array(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1063,8 +1063,7 @@ class JsonLdProcessor {
|
||||||
$container = self::getContextValue($ctx, $property, '@container');
|
$container = self::getContextValue($ctx, $property, '@container');
|
||||||
if($container === '@list') {
|
if($container === '@list') {
|
||||||
// ensure value is an array
|
// ensure value is an array
|
||||||
$value = self::arrayify();
|
$value = (object)array('@list' => self::arrayify($value));
|
||||||
$value = (object)array('@list' => $value);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1155,7 +1154,8 @@ class JsonLdProcessor {
|
||||||
|
|
||||||
// frame the subjects
|
// frame the subjects
|
||||||
$framed = new ArrayObject();
|
$framed = new ArrayObject();
|
||||||
$this->_match_frame($state, $state->subjects, $frame, $framed, null);
|
$this->_match_frame(
|
||||||
|
$state, array_keys((array)$state->subjects), $frame, $framed, null);
|
||||||
return (array)$framed;
|
return (array)$framed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1178,10 +1178,10 @@ class JsonLdProcessor {
|
||||||
|
|
||||||
// continue to hash bnode statements while bnodes are assigned names
|
// continue to hash bnode statements while bnodes are assigned names
|
||||||
$unnamed = null;
|
$unnamed = null;
|
||||||
$nextUnnamed = get_object_vars($bnodes);
|
$nextUnnamed = array_keys((array)$bnodes);
|
||||||
$duplicates = null;
|
$duplicates = null;
|
||||||
do {
|
do {
|
||||||
$unnamed = nextUnnamed;
|
$unnamed = $nextUnnamed;
|
||||||
$nextUnnamed = array();
|
$nextUnnamed = array();
|
||||||
$duplicates = new stdClass();
|
$duplicates = new stdClass();
|
||||||
$unique = new stdClass();
|
$unique = new stdClass();
|
||||||
|
@ -1191,7 +1191,7 @@ class JsonLdProcessor {
|
||||||
$hash = $this->_hashStatements($statements, $namer);
|
$hash = $this->_hashStatements($statements, $namer);
|
||||||
|
|
||||||
// store hash as unique or a duplicate
|
// store hash as unique or a duplicate
|
||||||
if(property_exists($duplicate, $hash)) {
|
if(property_exists($duplicates, $hash)) {
|
||||||
$duplicates->{$hash}[] = $bnode;
|
$duplicates->{$hash}[] = $bnode;
|
||||||
$nextUnnamed[] = $bnode;
|
$nextUnnamed[] = $bnode;
|
||||||
}
|
}
|
||||||
|
@ -1207,7 +1207,7 @@ class JsonLdProcessor {
|
||||||
}
|
}
|
||||||
|
|
||||||
// name unique bnodes in sorted hash order
|
// name unique bnodes in sorted hash order
|
||||||
$hashes = get_object_vars($unique);
|
$hashes = array_keys((array)$unique);
|
||||||
sort($hashes);
|
sort($hashes);
|
||||||
foreach($hashes as $hash) {
|
foreach($hashes as $hash) {
|
||||||
$bnode = $unique->{$hash};
|
$bnode = $unique->{$hash};
|
||||||
|
@ -1217,7 +1217,7 @@ class JsonLdProcessor {
|
||||||
while(count($unnamed) > count($nextUnnamed));
|
while(count($unnamed) > count($nextUnnamed));
|
||||||
|
|
||||||
// enumerate duplicate hash groups in sorted order
|
// enumerate duplicate hash groups in sorted order
|
||||||
$hashes = get_object_vars($duplicates);
|
$hashes = array_keys((array)$duplicates);
|
||||||
sort($hashes);
|
sort($hashes);
|
||||||
foreach($hashes as $hash) {
|
foreach($hashes as $hash) {
|
||||||
// process group
|
// process group
|
||||||
|
@ -1261,7 +1261,7 @@ class JsonLdProcessor {
|
||||||
foreach($statements as $statement) {
|
foreach($statements as $statement) {
|
||||||
if($statement->s === '_:a') {
|
if($statement->s === '_:a') {
|
||||||
$z = $this->_getBlankNodeName($statement->o);
|
$z = $this->_getBlankNodeName($statement->o);
|
||||||
$o = $z ? (object)array('@id' => $namer.getName($z)) : $statement->o;
|
$o = $z ? (object)array('@id' => $namer->getName($z)) : $statement->o;
|
||||||
self::addValue($bnode, $statement->p, $o, true);
|
self::addValue($bnode, $statement->p, $o, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1274,7 +1274,7 @@ class JsonLdProcessor {
|
||||||
$subject = (object)array('@id' => $id);
|
$subject = (object)array('@id' => $id);
|
||||||
foreach($statements as $statement) {
|
foreach($statements as $statement) {
|
||||||
$z = $this->_getBlankNodeName($statement->o);
|
$z = $this->_getBlankNodeName($statement->o);
|
||||||
$o = $z ? (object)array('@id' => $namer.getName($z)) : $statement->o;
|
$o = $z ? (object)array('@id' => $namer->getName($z)) : $statement->o;
|
||||||
self::addValue($subject, $statement->p, $o, true);
|
self::addValue($subject, $statement->p, $o, true);
|
||||||
}
|
}
|
||||||
$output[] = $subject;
|
$output[] = $subject;
|
||||||
|
@ -1389,7 +1389,7 @@ class JsonLdProcessor {
|
||||||
$language = self::getContextValue($ctx, $property, '@language');
|
$language = self::getContextValue($ctx, $property, '@language');
|
||||||
if($language !== null) {
|
if($language !== null) {
|
||||||
$rval = (object)array(
|
$rval = (object)array(
|
||||||
'@value' => strval(value), '@language' => $language);
|
'@value' => strval($value), '@language' => $language);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1466,7 +1466,8 @@ class JsonLdProcessor {
|
||||||
// convert boolean to @value
|
// convert boolean to @value
|
||||||
if(is_bool($o)) {
|
if(is_bool($o)) {
|
||||||
$o = (object)array(
|
$o = (object)array(
|
||||||
'@value' => strval($o), '@type' => self::XSD_BOOLEAN);
|
'@value' => ($o ? 'true' : 'false'),
|
||||||
|
'@type' => self::XSD_BOOLEAN);
|
||||||
}
|
}
|
||||||
// convert double to @value
|
// convert double to @value
|
||||||
else if(is_double($o)) {
|
else if(is_double($o)) {
|
||||||
|
@ -1484,14 +1485,15 @@ class JsonLdProcessor {
|
||||||
// object is a blank node
|
// object is a blank node
|
||||||
if(self::_isBlankNode($o)) {
|
if(self::_isBlankNode($o)) {
|
||||||
// name object position blank node
|
// name object position blank node
|
||||||
$o_name = $namer->getName($o->{'@id'});
|
$o_name = property_exists($o, '@id') ? $o->{'@id'} : null;
|
||||||
|
$o_name = $namer->getName($o_name);
|
||||||
|
|
||||||
// add property statement
|
// add property statement
|
||||||
$this->_addStatement($entries, (object)array(
|
$this->_addStatement($entries, (object)array(
|
||||||
's' => $s, 'p' => $p, 'o' => (object)array('@id' => $o_name)));
|
's' => $s, 'p' => $p, 'o' => (object)array('@id' => $o_name)));
|
||||||
|
|
||||||
// add reference statement
|
// add reference statement
|
||||||
if(!property_exists($bnodes, $name)) {
|
if(!property_exists($bnodes, $o_name)) {
|
||||||
$o_entries = $bnodes->{$o_name} = new ArrayObject();
|
$o_entries = $bnodes->{$o_name} = new ArrayObject();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1513,8 +1515,8 @@ class JsonLdProcessor {
|
||||||
|
|
||||||
// ensure a subject entry exists for subject reference
|
// ensure a subject entry exists for subject reference
|
||||||
if(self::_isSubjectReference($o) &&
|
if(self::_isSubjectReference($o) &&
|
||||||
!property_exists($subjects, $name)) {
|
!property_exists($subjects, $o->{'@id'})) {
|
||||||
$subjects->{$name} = new ArrayObject();
|
$subjects->{$o->{'@id'}} = new ArrayObject();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// object must be an embedded subject
|
// object must be an embedded subject
|
||||||
|
@ -1628,7 +1630,7 @@ class JsonLdProcessor {
|
||||||
$triple .= '"' . $statement->o->{'@value'} . '"';
|
$triple .= '"' . $statement->o->{'@value'} . '"';
|
||||||
|
|
||||||
if(property_exists($statement->o, '@type')) {
|
if(property_exists($statement->o, '@type')) {
|
||||||
$triple .= '^^<' . $statement->o['@type'] . '>';
|
$triple .= '^^<' . $statement->o->{'@type'} . '>';
|
||||||
}
|
}
|
||||||
else if(property_exists($statement->o, '@language')) {
|
else if(property_exists($statement->o, '@language')) {
|
||||||
$triple .= '@' . $statement->o{'@language'};
|
$triple .= '@' . $statement->o{'@language'};
|
||||||
|
@ -1667,6 +1669,7 @@ class JsonLdProcessor {
|
||||||
|
|
||||||
// group adjacent bnodes by hash, keep properties and references separate
|
// group adjacent bnodes by hash, keep properties and references separate
|
||||||
$groups = new stdClass();
|
$groups = new stdClass();
|
||||||
|
$cache = new stdClass();
|
||||||
foreach($statements as $statement) {
|
foreach($statements as $statement) {
|
||||||
$bnode = null;
|
$bnode = null;
|
||||||
$direction = null;
|
$direction = null;
|
||||||
|
@ -1714,7 +1717,7 @@ class JsonLdProcessor {
|
||||||
}
|
}
|
||||||
|
|
||||||
// iterate over groups in sorted hash order
|
// iterate over groups in sorted hash order
|
||||||
$group_hashes = get_object_vars($groups);
|
$group_hashes = array_keys((array)$groups);
|
||||||
sort($group_hashes);
|
sort($group_hashes);
|
||||||
foreach($group_hashes as $group_hash) {
|
foreach($group_hashes as $group_hash) {
|
||||||
// digest group hash
|
// digest group hash
|
||||||
|
@ -1872,7 +1875,7 @@ class JsonLdProcessor {
|
||||||
}
|
}
|
||||||
|
|
||||||
// add reference and recurse
|
// add reference and recurse
|
||||||
self::addValue($subject, $prop, (object)array('@id' => id), true);
|
self::addValue($subject, $prop, (object)array('@id' => $id), true);
|
||||||
$this->_flatten($subjects, $o, $namer, $id, null);
|
$this->_flatten($subjects, $o, $namer, $id, null);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1972,7 +1975,7 @@ class JsonLdProcessor {
|
||||||
$state->embeds->{$id} = $embed;
|
$state->embeds->{$id} = $embed;
|
||||||
|
|
||||||
// iterate over subject properties
|
// iterate over subject properties
|
||||||
$props = get_object_vars($subject);
|
$props = array_keys((array)$subject);
|
||||||
sort($props);
|
sort($props);
|
||||||
foreach($props as $prop) {
|
foreach($props as $prop) {
|
||||||
// copy keywords to output
|
// copy keywords to output
|
||||||
|
@ -2030,7 +2033,7 @@ class JsonLdProcessor {
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle defaults
|
// handle defaults
|
||||||
$props = get_object_vars($frame);
|
$props = array_keys((array)$frame);
|
||||||
sort($props);
|
sort($props);
|
||||||
foreach($props as $prop) {
|
foreach($props as $prop) {
|
||||||
// skip keywords
|
// skip keywords
|
||||||
|
@ -2069,7 +2072,7 @@ class JsonLdProcessor {
|
||||||
protected function _getFrameFlag($frame, $options, $name) {
|
protected function _getFrameFlag($frame, $options, $name) {
|
||||||
$flag = "'@'$name";
|
$flag = "'@'$name";
|
||||||
return (property_exists($frame, $flag) ?
|
return (property_exists($frame, $flag) ?
|
||||||
$frame->{$flag}[0] : $options->{$name});
|
$frame->{$flag}[0] : $options[$name]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2228,7 +2231,7 @@ class JsonLdProcessor {
|
||||||
// recursively remove dependent dangling embeds
|
// recursively remove dependent dangling embeds
|
||||||
$removeDependents = function($id) {
|
$removeDependents = function($id) {
|
||||||
// get embed keys as a separate array to enable deleting keys in map
|
// get embed keys as a separate array to enable deleting keys in map
|
||||||
$ids = get_object_vars($embeds);
|
$ids = array_keys((array)$embeds);
|
||||||
foreach($ids as $next) {
|
foreach($ids as $next) {
|
||||||
if(property_exists($embeds, $next) &&
|
if(property_exists($embeds, $next) &&
|
||||||
is_object($embeds->{$next}->parent) &&
|
is_object($embeds->{$next}->parent) &&
|
||||||
|
@ -2765,7 +2768,8 @@ class JsonLdProcessor {
|
||||||
protected function _expandContextIri(
|
protected function _expandContextIri(
|
||||||
$active_ctx, $ctx, $value, $base, $defined) {
|
$active_ctx, $ctx, $value, $base, $defined) {
|
||||||
// dependency not defined, define it
|
// dependency not defined, define it
|
||||||
if(property_exists($ctx, $value) && $defined->{$value} !== true) {
|
if(property_exists($ctx, $value) &&
|
||||||
|
(!property_exists($defined, $value) || !$defined->{$value})) {
|
||||||
$this->_defineContextMapping($active_ctx, $ctx, $value, $base, $defined);
|
$this->_defineContextMapping($active_ctx, $ctx, $value, $base, $defined);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2776,7 +2780,7 @@ class JsonLdProcessor {
|
||||||
if($value === $id) {
|
if($value === $id) {
|
||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
return _expandContextIri($active_ctx, $ctx, $id, $base, $defined);
|
return $this->_expandContextIri($active_ctx, $ctx, $id, $base, $defined);
|
||||||
}
|
}
|
||||||
|
|
||||||
// split value into prefix:suffix
|
// split value into prefix:suffix
|
||||||
|
@ -2794,7 +2798,8 @@ class JsonLdProcessor {
|
||||||
}
|
}
|
||||||
|
|
||||||
// dependency not defined, define it
|
// dependency not defined, define it
|
||||||
if(property_exists($ctx, $prefix) && $defined->{$prefix} !== true) {
|
if(property_exists($ctx, $prefix) &&
|
||||||
|
(!property_exists($defined, $prefix) || !$defined->{$prefix})) {
|
||||||
$this->_defineContextMapping(
|
$this->_defineContextMapping(
|
||||||
$active_ctx, $ctx, $prefix, $base, $defined);
|
$active_ctx, $ctx, $prefix, $base, $defined);
|
||||||
}
|
}
|
||||||
|
@ -3250,11 +3255,6 @@ class JsonLdException extends Exception {
|
||||||
* names.
|
* names.
|
||||||
*/
|
*/
|
||||||
class UniqueNamer {
|
class UniqueNamer {
|
||||||
protected $prefix;
|
|
||||||
protected $counter;
|
|
||||||
protected $existing;
|
|
||||||
protected $order;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a new UniqueNamer.
|
* Constructs a new UniqueNamer.
|
||||||
*
|
*
|
||||||
|
@ -3285,7 +3285,7 @@ class UniqueNamer {
|
||||||
public function getName($old_name=null) {
|
public function getName($old_name=null) {
|
||||||
// return existing old name
|
// return existing old name
|
||||||
if($old_name && property_exists($this->existing, $old_name)) {
|
if($old_name && property_exists($this->existing, $old_name)) {
|
||||||
return $this->existing->{$oldName};
|
return $this->existing->{$old_name};
|
||||||
}
|
}
|
||||||
|
|
||||||
// get next name
|
// get next name
|
||||||
|
@ -3294,7 +3294,7 @@ class UniqueNamer {
|
||||||
|
|
||||||
// save mapping
|
// save mapping
|
||||||
if($old_name !== null) {
|
if($old_name !== null) {
|
||||||
$this->existing->{$oldName} = $name;
|
$this->existing->{$old_name} = $name;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $name;
|
return $name;
|
||||||
|
@ -3305,7 +3305,7 @@ class UniqueNamer {
|
||||||
*
|
*
|
||||||
* @param string $old_name the old name to check.
|
* @param string $old_name the old name to check.
|
||||||
*
|
*
|
||||||
* @return true if the oldName has been assigned a new name, false if not.
|
* @return true if the old name has been assigned a new name, false if not.
|
||||||
*/
|
*/
|
||||||
public function isNamed($old_name) {
|
public function isNamed($old_name) {
|
||||||
return property_exists($this->existing, $old_name);
|
return property_exists($this->existing, $old_name);
|
||||||
|
@ -3317,16 +3317,12 @@ class UniqueNamer {
|
||||||
* of elements.
|
* of elements.
|
||||||
*/
|
*/
|
||||||
class Permutator {
|
class Permutator {
|
||||||
protected $list;
|
|
||||||
protected $done;
|
|
||||||
protected $left;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a new Permutator.
|
* Constructs a new Permutator.
|
||||||
*
|
*
|
||||||
* @param array $list the array of elements to iterate over.
|
* @param array $list the array of elements to iterate over.
|
||||||
*/
|
*/
|
||||||
public function __constructor($list) {
|
public function __construct($list) {
|
||||||
// original array
|
// original array
|
||||||
$this->list = $list;
|
$this->list = $list;
|
||||||
sort($this->list);
|
sort($this->list);
|
||||||
|
|
Loading…
Reference in a new issue