/** * Compact a JSON-LD document according a supplied context * * In contrast to {@link compact()}, this method assumes that the input * has already been expanded. * * @param array $input The JSON-LD document to * compact. * @param null|string|object|array $context The context. * @param null|array|object $options Options to configure the * compaction process. * @param bool $alwaysGraph If set to true, the resulting * document will always explicitly * contain the default graph at * the top-level. * * @return object The compacted JSON-LD document. * * @throws JsonLdException */ private static function doCompact($input, $context = null, $options = null, $alwaysGraph = false) { if (null !== $context) { $context = Processor::loadDocument($context); } if (is_object($context) && property_exists($context, '@context')) { $context = $context->{'@context'}; } if (is_object($context) && 0 === count(get_object_vars($context))) { $context = null; } elseif (is_array($context) && 0 === count($context)) { $context = null; } $activectx = array('@base' => $options->base); $processor = new Processor($options); $processor->processContext($context, $activectx); $inversectx = $processor->createInverseContext($activectx); $processor->compact($input, $activectx, $inversectx); $compactedDocument = new Object(); if (null !== $context) { $compactedDocument->{'@context'} = $context; } if (false === is_array($input) || 0 === count($input)) { if (false === $alwaysGraph) { $compactedDocument = (object) ((array) $compactedDocument + (array) $input); return $compactedDocument; } if (false === is_array($input)) { $input = array($input); } } $graphKeyword = isset($inversectx['@graph']['term']) ? $inversectx['@graph']['term'] : '@graph'; $compactedDocument->{$graphKeyword} = $input; return $compactedDocument; }