X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fmodules%2Fcontrib%2Fdiff%2Fsrc%2FPlugin%2Fdiff%2FLayout%2FVisualInlineDiffLayout.php;fp=web%2Fmodules%2Fcontrib%2Fdiff%2Fsrc%2FPlugin%2Fdiff%2FLayout%2FVisualInlineDiffLayout.php;h=124cc8bf71067fbc0147c34aadd01c9eadb6d2d6;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hp=0000000000000000000000000000000000000000;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad;p=yaffs-website diff --git a/web/modules/contrib/diff/src/Plugin/diff/Layout/VisualInlineDiffLayout.php b/web/modules/contrib/diff/src/Plugin/diff/Layout/VisualInlineDiffLayout.php new file mode 100644 index 000000000..124cc8bf7 --- /dev/null +++ b/web/modules/contrib/diff/src/Plugin/diff/Layout/VisualInlineDiffLayout.php @@ -0,0 +1,200 @@ +renderer = $renderer; + $this->entityComparison = $entity_comparison; + $storage = PhpStorageFactory::get('html_purifier_serializer'); + if (!$storage->exists('cache.php')) { + $storage->save('cache.php', 'dummy'); + } + $html_diff->getConfig()->setPurifierCacheLocation(dirname($storage->getFullPath('cache.php'))); + $this->htmlDiff = $html_diff; + $this->requestStack = $request_stack; + $this->entityDisplayRepository = $entity_display_repository; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $container->get('config.factory'), + $container->get('entity_type.manager'), + $container->get('diff.entity_parser'), + $container->get('date.formatter'), + $container->get('renderer'), + $container->get('diff.entity_comparison'), + $container->get('diff.html_diff'), + $container->get('request_stack'), + $container->get('entity_display.repository') + ); + } + + /** + * {@inheritdoc} + */ + public function build(ContentEntityInterface $left_revision, ContentEntityInterface $right_revision, ContentEntityInterface $entity) { + // Build the revisions data. + $build = $this->buildRevisionsData($left_revision, $right_revision); + + $this->entityTypeManager->getStorage($entity->getEntityTypeId())->resetCache([$entity->id()]); + // Build the view modes filter. + $options = []; + // Get all view modes for entity type. + $view_modes = $this->entityDisplayRepository->getViewModeOptionsByBundle($entity->getEntityTypeId(), $entity->bundle()); + foreach ($view_modes as $view_mode => $view_mode_info) { + // Skip view modes that are not used in the front end. + if (in_array($view_mode, ['rss', 'search_index'])) { + continue; + } + $options[$view_mode] = [ + 'title' => $view_mode_info, + 'url' => PluginRevisionController::diffRoute($entity, + $left_revision->getRevisionId(), + $right_revision->getRevisionId(), + 'visual_inline', + ['view_mode' => $view_mode] + ), + ]; + } + + $active_option = array_keys($options); + $active_view_mode = $this->requestStack->getCurrentRequest()->query->get('view_mode') ?: reset($active_option); + + $filter = $options[$active_view_mode]; + unset($options[$active_view_mode]); + array_unshift($options, $filter); + + $build['controls']['view_mode'] = [ + '#type' => 'item', + '#title' => $this->t('View mode'), + '#wrapper_attributes' => ['class' => 'diff-controls__item'], + 'filter' => [ + '#type' => 'operations', + '#links' => $options, + ], + ]; + + $view_builder = $this->entityTypeManager->getViewBuilder($entity->getEntityTypeId()); + // Trigger exclusion of interactive items like on preview. + $left_revision->in_preview = TRUE; + $right_revision->in_preview = TRUE; + $left_view = $view_builder->view($left_revision, $active_view_mode); + $right_view = $view_builder->view($right_revision, $active_view_mode); + + // Avoid render cache from being built. + unset($left_view['#cache']); + unset($right_view['#cache']); + + $html_1 = $this->renderer->render($left_view); + $html_2 = $this->renderer->render($right_view); + + $this->htmlDiff->setOldHtml($html_1); + $this->htmlDiff->setNewHtml($html_2); + $this->htmlDiff->build(); + + $build['diff'] = [ + '#markup' => $this->htmlDiff->getDifference(), + '#weight' => 10, + ]; + + $build['#attached']['library'][] = 'diff/diff.visual_inline'; + return $build; + } + +}