clean install

This commit is contained in:
2024-12-10 15:08:16 +01:00
commit e14eb2d8fd
31193 changed files with 3555714 additions and 0 deletions

View File

@@ -0,0 +1,7 @@
name: farmOS CSV
description: Provides CSV features for farmOS.
type: module
package: farmOS
core_version_requirement: ^10
dependencies:
- csv_serialization:csv_serialization

View File

@@ -0,0 +1,27 @@
services:
farm_csv.encoder.csv:
class: Drupal\farm_csv\Encoder\CsvEncoder
tags:
- { name: encoder, format: csv, priority: 10 }
farm_csv.normalizer.content_entity_normalizer:
class: Drupal\farm_csv\Normalizer\ContentEntityNormalizer
tags:
- { name: normalizer, priority: 10 }
arguments: ['@entity_type.manager', '@entity_type.repository', '@entity_field.manager']
farm_csv.normalizer.fraction_field_item:
class: Drupal\farm_csv\Normalizer\FractionFieldItemNormalizer
tags:
- { name: normalizer, priority: 10 }
farm_csv.normalizer.text_long_field_item:
class: Drupal\farm_csv\Normalizer\TextLongFieldItemNormalizer
tags:
- { name: normalizer, priority: 10 }
farm_csv.normalizer.entity_reference_field_item:
class: Drupal\farm_csv\Normalizer\EntityReferenceFieldItemNormalizer
tags:
- { name: normalizer, priority: 10 }
arguments: ['@entity.repository']
farm_csv.normalizer.timestamp_item:
class: Drupal\farm_csv\Normalizer\TimestampItemNormalizer
tags:
- { name: normalizer, priority: 10 }

View File

@@ -0,0 +1,66 @@
<?php
namespace Drupal\farm_csv\Encoder;
use Drupal\csv_serialization\Encoder\CsvEncoder as ContribCsvEncoder;
/**
* Adds CSV encoder support for the Serialization API.
*/
class CsvEncoder extends ContribCsvEncoder {
/**
* Whether to sanitize cell values.
*
* @var bool
*/
protected $sanitize = TRUE;
/**
* Constructs the class.
*
* @param string $delimiter
* Indicates the character used to delimit fields. Defaults to ",".
* @param string $enclosure
* Indicates the character used for field enclosure. Defaults to '"'.
* @param string $escape_char
* Indicates the character used for escaping. Defaults to "\".
* @param bool $strip_tags
* Whether to strip tags from values or not. Defaults to TRUE.
* @param bool $trim_values
* Whether to trim values or not. Defaults to TRUE.
* @param bool $sanitize
* Whether to sanitize values against formula injection. Defaults to TRUE.
*/
public function __construct($delimiter = ",", $enclosure = '"', $escape_char = "\\", $strip_tags = TRUE, $trim_values = TRUE, $sanitize = TRUE) {
parent::__construct($delimiter, $enclosure, $escape_char, $strip_tags, $trim_values);
$this->sanitize = $sanitize;
}
/**
* {@inheritdoc}
*/
protected function formatValue($value) {
$value = parent::formatValue($value);
// Sanitize against CSV injection vectors by prefixing cells that start with
// suspicious characters (=, -, +, or @) with a tab.
// @see https://georgemauer.net/2017/10/07/csv-injection.html
if ($this->sanitize) {
if (preg_match('/^[=@\-+]/', $value)) {
$value = "\t" . $value;
}
}
return $value;
}
/**
* {@inheritdoc}
*/
public function setSettings(array $settings) {
parent::setSettings($settings);
$this->sanitize = $settings['sanitize'] ?? $this->sanitize;
}
}

View File

@@ -0,0 +1,43 @@
<?php
namespace Drupal\farm_csv\Normalizer;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\serialization\Normalizer\ContentEntityNormalizer as CoreContentEntityNormalizer;
/**
* Normalizes farmOS content entities for CSV exports.
*/
class ContentEntityNormalizer extends CoreContentEntityNormalizer {
/**
* The supported format.
*/
const FORMAT = 'csv';
/**
* {@inheritdoc}
*/
public function normalize($entity, $format = NULL, array $context = []): array|string|int|float|bool|\ArrayObject|NULL {
$data = parent::normalize($entity, $format, $context);
// If columns were explicitly included, remove others.
if (!empty($context['include_columns'])) {
foreach (array_keys($data) as $key) {
if (!in_array($key, $context['include_columns'])) {
unset($data[$key]);
}
}
}
return $data;
}
/**
* {@inheritdoc}
*/
public function supportsNormalization($data, ?string $format = NULL, array $context = []): bool {
return $data instanceof ContentEntityInterface && $format == static::FORMAT;
}
}

View File

@@ -0,0 +1,51 @@
<?php
namespace Drupal\farm_csv\Normalizer;
use Drupal\Core\Config\Entity\ConfigEntityInterface;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItemInterface;
use Drupal\serialization\Normalizer\EntityReferenceFieldItemNormalizer as CoreEntityReferenceFieldItemNormalizer;
/**
* Normalizes entity reference fields for farmOS CSV exports.
*/
class EntityReferenceFieldItemNormalizer extends CoreEntityReferenceFieldItemNormalizer {
/**
* The supported format.
*/
const FORMAT = 'csv';
/**
* {@inheritdoc}
*/
public function normalize($field_item, $format = NULL, array $context = []): array|string|int|float|bool|\ArrayObject|NULL {
// Attempt to load the referenced entity.
/** @var \Drupal\Core\Entity\EntityInterface $entity */
if ($entity = $field_item->get('entity')->getValue()) {
// Return content entity labels, if desired.
if ($entity instanceof ContentEntityInterface && isset($context['content_entity_labels']) && $context['content_entity_labels'] === TRUE) {
return $entity->label();
}
// Return config entity IDs, if desired.
if ($entity instanceof ConfigEntityInterface && isset($context['config_entity_ids']) && $context['config_entity_ids'] === TRUE) {
return $entity->id();
}
}
// Otherwise, delegate to the parent method.
return parent::normalize($field_item, $format, $context);
}
/**
* {@inheritdoc}
*/
public function supportsNormalization($data, ?string $format = NULL, array $context = []): bool {
return $data instanceof EntityReferenceItemInterface && $format == static::FORMAT;
}
}

View File

@@ -0,0 +1,33 @@
<?php
namespace Drupal\farm_csv\Normalizer;
use Drupal\fraction\Plugin\Field\FieldType\FractionItem;
use Drupal\serialization\Normalizer\FieldItemNormalizer;
/**
* Normalizes fraction fields for farmOS CSV exports.
*/
class FractionFieldItemNormalizer extends FieldItemNormalizer {
/**
* The supported format.
*/
const FORMAT = 'csv';
/**
* {@inheritdoc}
*/
public function normalize($field_item, $format = NULL, array $context = []): array|string|int|float|bool|\ArrayObject|NULL {
/** @var \Drupal\fraction\Plugin\Field\FieldType\FractionItem $field_item */
return $field_item->get('decimal')->getValue();
}
/**
* {@inheritdoc}
*/
public function supportsNormalization($data, ?string $format = NULL, array $context = []): bool {
return $data instanceof FractionItem && $format == static::FORMAT;
}
}

View File

@@ -0,0 +1,46 @@
<?php
namespace Drupal\farm_csv\Normalizer;
use Drupal\serialization\Normalizer\FieldItemNormalizer;
use Drupal\text\Plugin\Field\FieldType\TextLongItem;
/**
* Normalizes long text fields for farmOS CSV exports.
*/
class TextLongFieldItemNormalizer extends FieldItemNormalizer {
/**
* The supported format.
*/
const FORMAT = 'csv';
/**
* {@inheritdoc}
*/
public function normalize($field_item, $format = NULL, array $context = []): array|string|int|float|bool|\ArrayObject|NULL {
/** @var \Drupal\text\Plugin\Field\FieldType\TextLongItem $field_item */
// If processed_text is explicitly set, return processed or raw user input
// accordingly.
if (isset($context['processed_text'])) {
if ($context['processed_text']) {
return $field_item->get('processed')->getValue();
}
else {
return $field_item->get('value')->getValue();
}
}
// Delegate to the parent method.
return parent::normalize($field_item, $format, $context);
}
/**
* {@inheritdoc}
*/
public function supportsNormalization($data, ?string $format = NULL, array $context = []): bool {
return $data instanceof TextLongItem && $format == static::FORMAT;
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace Drupal\farm_csv\Normalizer;
use Drupal\serialization\Normalizer\TimestampItemNormalizer as CoreTimestampItemNormalizer;
/**
* Normalizes timestamp fields for farmOS CSV exports.
*/
class TimestampItemNormalizer extends CoreTimestampItemNormalizer {
/**
* The supported format.
*/
const FORMAT = 'csv';
/**
* {@inheritdoc}
*/
public function normalize($object, $format = NULL, array $context = []): array|string|int|float|bool|\ArrayObject|NULL {
$data = parent::normalize($object, $format, $context);
// Return the RFC3339 formatted date, if desired.
if (isset($context['rfc3339_dates']) && $context['rfc3339_dates'] === TRUE) {
return $data['value'];
}
return $data;
}
}