Remove optimize option; add compactArrays option to compaction.

This commit is contained in:
Dave Longley 2013-02-21 16:06:33 -05:00
parent 232afca21d
commit 8bad8e2d24

View file

@ -1,7 +1,7 @@
<?php <?php
/** /**
* PHP implementation of the JSON-LD API. * PHP implementation of the JSON-LD API.
* Version: 0.0.5 * Version: 0.0.6
* *
* @author Dave Longley * @author Dave Longley
* *
@ -44,7 +44,6 @@
* @param assoc [$options] options to use: * @param assoc [$options] options to use:
* [base] the base IRI to use. * [base] the base IRI to use.
* [strict] use strict mode (default: true). * [strict] use strict mode (default: true).
* [optimize] true to optimize the compaction (default: false).
* [graph] true to always output a top-level graph (default: false). * [graph] true to always output a top-level graph (default: false).
* [loadContext(url)] the context loader. * [loadContext(url)] the context loader.
* *
@ -97,7 +96,6 @@ function jsonld_flatten($input, $ctx, $options=array()) {
* [embed] default @embed flag (default: true). * [embed] default @embed flag (default: true).
* [explicit] default @explicit flag (default: false). * [explicit] default @explicit flag (default: false).
* [omitDefault] default @omitDefault flag (default: false). * [omitDefault] default @omitDefault flag (default: false).
* [optimize] optimize when compacting (default: false).
* [loadContext(url)] the context loader. * [loadContext(url)] the context loader.
* *
* @return stdClass the framed JSON-LD output. * @return stdClass the framed JSON-LD output.
@ -546,6 +544,10 @@ class JsonLdProcessor {
* @param mixed $ctx the context to compact with. * @param mixed $ctx the context to compact with.
* @param assoc $options the compaction options. * @param assoc $options the compaction options.
* [base] the base IRI to use. * [base] the base IRI to use.
* [strict] use strict mode (default: true).
* [compactArrays] true to compact arrays to single values when
* appropriate, false not to (default: true).
* [graph] true to always output a top-level graph (default: false).
* [skipExpansion] true to assume the input is expanded and skip * [skipExpansion] true to assume the input is expanded and skip
* expansion, false not to, defaults to false. * expansion, false not to, defaults to false.
* [activeCtx] true to also return the active context used. * [activeCtx] true to also return the active context used.
@ -561,10 +563,10 @@ class JsonLdProcessor {
// set default options // set default options
isset($options['base']) or $options['base'] = ''; isset($options['base']) or $options['base'] = '';
isset($options['strict']) or $options['strict'] = true;
isset($options['renameBlankNodes']) or $options['renameBlankNodes'] = isset($options['renameBlankNodes']) or $options['renameBlankNodes'] =
true; true;
isset($options['strict']) or $options['strict'] = true; isset($options['compactArrays']) or $options['compactArrays'] = true;
isset($options['optimize']) or $options['optimize'] = false;
isset($options['graph']) or $options['graph'] = false; isset($options['graph']) or $options['graph'] = false;
isset($options['skipExpansion']) or $options['skipExpansion'] = false; isset($options['skipExpansion']) or $options['skipExpansion'] = false;
isset($options['activeCtx']) or $options['activeCtx'] = false; isset($options['activeCtx']) or $options['activeCtx'] = false;
@ -600,7 +602,8 @@ class JsonLdProcessor {
// do compaction // do compaction
$compacted = $this->_compact($active_ctx, null, $expanded, $options); $compacted = $this->_compact($active_ctx, null, $expanded, $options);
if(!$options['graph'] && is_array($compacted)) { if($options['compactArrays'] &&
!$options['graph'] && is_array($compacted)) {
// simplify to a single item // simplify to a single item
if(count($compacted) === 1) { if(count($compacted) === 1) {
$compacted = $compacted[0]; $compacted = $compacted[0];
@ -781,7 +784,6 @@ class JsonLdProcessor {
* [embed] default @embed flag (default: true). * [embed] default @embed flag (default: true).
* [explicit] default @explicit flag (default: false). * [explicit] default @explicit flag (default: false).
* [omitDefault] default @omitDefault flag (default: false). * [omitDefault] default @omitDefault flag (default: false).
* [optimize] optimize when compacting (default: false).
* [loadContext(url)] the context loader. * [loadContext(url)] the context loader.
* *
* @return stdClass the framed JSON-LD output. * @return stdClass the framed JSON-LD output.
@ -789,10 +791,10 @@ class JsonLdProcessor {
public function frame($input, $frame, $options) { public function frame($input, $frame, $options) {
// set default options // set default options
isset($options['base']) or $options['base'] = ''; isset($options['base']) or $options['base'] = '';
isset($options['compactArrays']) or $options['compactArrays'] = true;
isset($options['embed']) or $options['embed'] = true; isset($options['embed']) or $options['embed'] = true;
isset($options['explicit']) or $options['explicit'] = false; isset($options['explicit']) or $options['explicit'] = false;
isset($options['omitDefault']) or $options['omitDefault'] = false; isset($options['omitDefault']) or $options['omitDefault'] = false;
isset($options['optimize']) or $options['optimize'] = false;
isset($options['loadContext']) or $options['loadContext'] = isset($options['loadContext']) or $options['loadContext'] =
'jsonld_get_url'; 'jsonld_get_url';
@ -845,7 +847,7 @@ class JsonLdProcessor {
$graph = $this->_compactIri($active_ctx, '@graph'); $graph = $this->_compactIri($active_ctx, '@graph');
// remove @preserve from results // remove @preserve from results
$compacted->{$graph} = $this->_removePreserve( $compacted->{$graph} = $this->_removePreserve(
$active_ctx, $compacted->{$graph}); $active_ctx, $compacted->{$graph}, $options);
return $compacted; return $compacted;
} }
@ -1622,7 +1624,7 @@ class JsonLdProcessor {
$rval[] = $compacted; $rval[] = $compacted;
} }
} }
if(count($rval) === 1) { if($options['compactArrays'] && count($rval) === 1) {
// use single element if no container is specified // use single element if no container is specified
$container = self::getContextValue( $container = self::getContextValue(
$active_ctx, $active_property, '@container'); $active_ctx, $active_property, '@container');
@ -1800,9 +1802,11 @@ class JsonLdProcessor {
$map_object, $expanded_item->{$container}, $compacted_item); $map_object, $expanded_item->{$container}, $compacted_item);
} }
else { else {
// use an array if: @container is @set or @list , value is an empty // use an array if: compactArrays flag is false,
// @container is @set or @list , value is an empty
// array, or key is @graph // array, or key is @graph
$is_array = ($container === '@set' || $container === '@list' || $is_array = (!$options['compactArrays'] ||
$container === '@set' || $container === '@list' ||
(is_array($compacted_item) && count($compacted_item) === 0) || (is_array($compacted_item) && count($compacted_item) === 0) ||
$expanded_property === '@list' || $expanded_property === '@list' ||
$expanded_property === '@graph'); $expanded_property === '@graph');
@ -3538,15 +3542,16 @@ class JsonLdProcessor {
* *
* @param stdClass $ctx the active context used to compact the input. * @param stdClass $ctx the active context used to compact the input.
* @param mixed $input the framed, compacted output. * @param mixed $input the framed, compacted output.
* @param assoc $options the compaction options used.
* *
* @return mixed the resulting output. * @return mixed the resulting output.
*/ */
protected function _removePreserve($ctx, $input) { protected function _removePreserve($ctx, $input, $options) {
// recurse through arrays // recurse through arrays
if(is_array($input)) { if(is_array($input)) {
$output = array(); $output = array();
foreach($input as $e) { foreach($input as $e) {
$result = $this->_removePreserve($ctx, $e); $result = $this->_removePreserve($ctx, $e, $options);
// drop nulls from arrays // drop nulls from arrays
if($result !== null) { if($result !== null) {
$output[] = $result; $output[] = $result;
@ -3570,15 +3575,17 @@ class JsonLdProcessor {
// recurse through @lists // recurse through @lists
if(self::_isList($input)) { if(self::_isList($input)) {
$input->{'@list'} = $this->_removePreserve($ctx, $input->{'@list'}); $input->{'@list'} = $this->_removePreserve(
$ctx, $input->{'@list'}, $options);
return $input; return $input;
} }
// recurse through properties // recurse through properties
foreach($input as $prop => $v) { foreach($input as $prop => $v) {
$result = $this->_removePreserve($ctx, $v); $result = $this->_removePreserve($ctx, $v, $options);
$container = self::getContextValue($ctx, $prop, '@container'); $container = self::getContextValue($ctx, $prop, '@container');
if(is_array($result) && count($result) === 1 && if($options['compactArrays'] &&
is_array($result) && count($result) === 1 &&
$container !== '@set' && $container !== '@list') { $container !== '@set' && $container !== '@list') {
$result = $result[0]; $result = $result[0];
} }