You are here

class CslReferenceNormalizer in Bibliography & Citation 2.0.x

Same name and namespace in other branches
  1. 8 modules/bibcite_entity/src/Normalizer/CslReferenceNormalizer.php \Drupal\bibcite_entity\Normalizer\CslReferenceNormalizer

Normalizes/denormalizes reference entity to CSL format.

Hierarchy

Expanded class hierarchy of CslReferenceNormalizer

1 string reference to 'CslReferenceNormalizer'
bibcite_entity.services.yml in modules/bibcite_entity/bibcite_entity.services.yml
modules/bibcite_entity/bibcite_entity.services.yml
1 service uses CslReferenceNormalizer
bibcite_entity.normalizer.reference in modules/bibcite_entity/bibcite_entity.services.yml
Drupal\bibcite_entity\Normalizer\CslReferenceNormalizer

File

modules/bibcite_entity/src/Normalizer/CslReferenceNormalizer.php, line 12

Namespace

Drupal\bibcite_entity\Normalizer
View source
class CslReferenceNormalizer extends ReferenceNormalizerBase {

  /**
   * List of date fields.
   *
   * @var array
   */
  protected $dateFields = [
    'bibcite_year',
    'bibcite_access_date',
    'bibcite_date',
  ];

  /**
   * {@inheritdoc}
   */
  public function supportsDenormalization($data, $type, $format = NULL) {
    return FALSE;
  }

  /**
   * {@inheritdoc}
   */
  public function denormalize($data, $class, $format = NULL, array $context = []) {
    throw new LogicException("Cannot denormalize from 'CSL' format.");
  }

  /**
   * {@inheritdoc}
   */
  public function normalize($reference, $format = NULL, array $context = []) {

    /** @var \Drupal\bibcite_entity\Entity\ReferenceInterface $reference */
    $attributes = parent::normalize($reference, $format, $context);
    $contributor_key = $this
      ->getContributorKey();
    if (isset($attributes[$contributor_key])) {
      $authors = $attributes[$contributor_key];
      foreach ($authors as $role => $contributors) {
        $attributes[$role] = $contributors;
      }
    }
    return $attributes;
  }

  /**
   * {@inheritdoc}
   */
  protected function extractFields(ReferenceInterface $reference, $format = NULL) {
    $attributes = [];
    $attributes['title'] = $this
      ->extractScalar($reference
      ->get('title'));
    foreach ($this->fieldsMapping[$this->format] as $csl_field => $entity_field) {
      if ($entity_field && $reference
        ->hasField($entity_field) && ($field = $reference
        ->get($entity_field)) && !$field
        ->isEmpty()) {
        if (in_array($entity_field, $this->dateFields)) {
          $attributes[$csl_field] = $this
            ->extractDate($field);
        }
        else {
          $attributes[$csl_field] = $this
            ->extractScalar($field);
        }
      }
    }
    return $attributes;
  }

  /**
   * Extract authors values from field.
   *
   * @param \Drupal\Core\Field\FieldItemListInterface $field_item_list
   *   List of field items.
   *
   * @return array
   *   Authors in CSL format.
   */
  protected function extractAuthors(FieldItemListInterface $field_item_list) {
    $authors = [];
    foreach ($field_item_list as $field) {

      /** @var \Drupal\bibcite_entity\Entity\ContributorInterface $contributor */
      if ($contributor = $field->entity) {
        switch ($field->role) {
          case 'editor':
          case 'series_editor':
            $authors['editor'][] = [
              'category' => $field->category,
              'role' => $field->role,
              'family' => $contributor
                ->getLastName(),
              'given' => $contributor
                ->getFirstName() . ' ' . $contributor
                ->getMiddleName(),
              'suffix' => $contributor
                ->getSuffix(),
              'literal' => $contributor
                ->getName(),
            ];
            break;
          case 'recipient':
          case 'translator':
            $authors[$field->role][] = [
              'category' => $field->category,
              'role' => $field->role,
              'family' => $contributor
                ->getLastName(),
              'given' => $contributor
                ->getFirstName() . ' ' . $contributor
                ->getMiddleName(),
              'suffix' => $contributor
                ->getSuffix(),
              'literal' => $contributor
                ->getName(),
            ];
            break;
          default:
            $authors['author'][] = [
              'category' => $field->category,
              'role' => $field->role,
              'family' => $contributor
                ->getLastName(),
              'given' => $contributor
                ->getFirstName() . ' ' . $contributor
                ->getMiddleName(),
              'suffix' => $contributor
                ->getSuffix(),
              'literal' => $contributor
                ->getName(),
            ];
            break;
        }
      }
    }
    return $authors;
  }

  /**
   * Extract date value to CSL format.
   *
   * @param \Drupal\Core\Field\FieldItemListInterface $date_field
   *   Date item list.
   *
   * @return array
   *   Date in CSL format.
   */
  protected function extractDate(FieldItemListInterface $date_field) {
    $value = $this
      ->extractScalar($date_field);
    return [
      'date-parts' => [
        [
          $value,
        ],
      ],
      'literal' => $value,
    ];
  }

}

Members

Namesort descending Modifiers Type Description Overrides
CacheableNormalizerInterface::SERIALIZATION_CONTEXT_CACHEABILITY constant Name of key for bubbling cacheability metadata via serialization context.
CslReferenceNormalizer::$dateFields protected property List of date fields.
CslReferenceNormalizer::denormalize public function Overrides ReferenceNormalizerBase::denormalize
CslReferenceNormalizer::extractAuthors protected function Extract authors values from field. Overrides ReferenceNormalizerBase::extractAuthors
CslReferenceNormalizer::extractDate protected function Extract date value to CSL format.
CslReferenceNormalizer::extractFields protected function Extract fields values from reference entity. Overrides ReferenceNormalizerBase::extractFields
CslReferenceNormalizer::normalize public function Overrides ReferenceNormalizerBase::normalize
CslReferenceNormalizer::supportsDenormalization public function Implements \Symfony\Component\Serializer\Normalizer\DenormalizerInterface::supportsDenormalization() Overrides NormalizerBase::supportsDenormalization
FieldableEntityNormalizerTrait::$entityFieldManager protected property The entity field manager.
FieldableEntityNormalizerTrait::$entityTypeManager protected property The entity type manager. 1
FieldableEntityNormalizerTrait::$entityTypeRepository protected property The entity type repository.
FieldableEntityNormalizerTrait::constructValue protected function Build the field item value using the incoming data. 7
FieldableEntityNormalizerTrait::denormalizeFieldData protected function Denormalizes entity data by denormalizing each field individually.
FieldableEntityNormalizerTrait::determineEntityTypeId protected function Determines the entity type ID to denormalize as.
FieldableEntityNormalizerTrait::extractBundleData protected function Denormalizes the bundle property so entity creation can use it.
FieldableEntityNormalizerTrait::getEntityFieldManager protected function Returns the entity field manager.
FieldableEntityNormalizerTrait::getEntityTypeDefinition protected function Gets the entity type definition.
FieldableEntityNormalizerTrait::getEntityTypeManager protected function Returns the entity type manager.
FieldableEntityNormalizerTrait::getEntityTypeRepository protected function Returns the entity type repository.
NormalizerBase::addCacheableDependency protected function Adds cacheability if applicable.
NormalizerBase::checkFormat protected function Checks if the provided format is supported by this normalizer. 1
NormalizerBase::supportsNormalization public function 1
ReferenceNormalizerBase::$configFactory protected property Configuration factory service.
ReferenceNormalizerBase::$contributorKey public property Format contributor key.
ReferenceNormalizerBase::$defaultType public property Default publication type. Will be assigned for types without mapping.
ReferenceNormalizerBase::$fieldsMapping protected property Mapping between bibcite_entity and format fields.
ReferenceNormalizerBase::$format protected property The format that this Normalizer supports. Overrides NormalizerBase::$format
ReferenceNormalizerBase::$keywordKey public property Format keyword key.
ReferenceNormalizerBase::$supportedInterfaceOrClass protected property The interface or class that this Normalizer supports. Overrides EntityNormalizer::$supportedInterfaceOrClass
ReferenceNormalizerBase::$typeKey public property Format type key.
ReferenceNormalizerBase::$typesMapping protected property Mapping between bibcite_entity and format publication types.
ReferenceNormalizerBase::convertEntityType protected function Convert publication type to format type.
ReferenceNormalizerBase::convertFormatType protected function Convert format type to publication type.
ReferenceNormalizerBase::convertKeys protected function Convert format keys to Bibcite entity keys and filter non-mapped.
ReferenceNormalizerBase::DEFAULT_REF_TYPE constant Default reference type. Will be assigned for types without mapping.
ReferenceNormalizerBase::extractKeywords protected function Extract keywords labels from field.
ReferenceNormalizerBase::extractScalar protected function Extract scalar value.
ReferenceNormalizerBase::getContributorKey protected function Get format contributor key.
ReferenceNormalizerBase::getKeywordKey protected function Get format keyword key.
ReferenceNormalizerBase::getTypeKey protected function Get format type key.
ReferenceNormalizerBase::setFormat public function Format setter for DI calls.
ReferenceNormalizerBase::__construct public function Construct new BibliographyNormalizer object. Overrides EntityNormalizer::__construct