HEX
Server: Apache
System: Linux webm004.cluster121.gra.hosting.ovh.net 5.15.167-ovh-vps-grsec-zfs-classid #1 SMP Tue Sep 17 08:14:20 UTC 2024 x86_64
User: grainesdfo (155059)
PHP: 5.4.45
Disabled: _dyuweyrj4,_dyuweyrj4r,dl
Upload Files
File: /home/grainesdfo/www/wp-content/plugins/tablepress/libraries/vendor/PhpSpreadsheet/DefinedName.php
<?php

namespace TablePress\PhpOffice\PhpSpreadsheet;

use TablePress\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;

abstract class DefinedName
{
	protected const REGEXP_IDENTIFY_FORMULA = '[^_\p{N}\p{L}:, \$\'!]';

	/**
	 * Name.
	 */
	protected string $name;

	/**
	 * Worksheet on which the defined name can be resolved.
	 */
	protected ?Worksheet $worksheet;

	/**
	 * Value of the named object.
	 */
	protected string $value;

	/**
	 * Is the defined named local? (i.e. can only be used on $this->worksheet).
	 */
	protected bool $localOnly;

	/**
	 * Scope.
	 */
	protected ?Worksheet $scope;

	/**
	 * Whether this is a named range or a named formula.
	 */
	protected bool $isFormula;

	/**
	 * Create a new Defined Name.
	 */
	public function __construct(
		string $name,
		?Worksheet $worksheet = null,
		?string $value = null,
		bool $localOnly = false,
		?Worksheet $scope = null
	) {
		if ($worksheet === null) {
			$worksheet = $scope;
		}

		// Set local members
		$this->name = $name;
		$this->worksheet = $worksheet;
		$this->value = (string) $value;
		$this->localOnly = $localOnly;
		// If local only, then the scope will be set to worksheet unless a scope is explicitly set
		$this->scope = ($localOnly === true) ? (($scope === null) ? $worksheet : $scope) : null;
		// If the range string contains characters that aren't associated with the range definition (A-Z,1-9
		//      for cell references, and $, or the range operators (colon comma or space), quotes and ! for
		//      worksheet names
		//  then this is treated as a named formula, and not a named range
		$this->isFormula = self::testIfFormula($this->value);
	}

	public function __destruct()
	{
		$this->worksheet = null;
		$this->scope = null;
	}

	/**
	 * Create a new defined name, either a range or a formula.
	 */
	public static function createInstance(
		string $name,
		?Worksheet $worksheet = null,
		?string $value = null,
		bool $localOnly = false,
		?Worksheet $scope = null
	): self {
		$value = (string) $value;
		$isFormula = self::testIfFormula($value);
		if ($isFormula) {
			return new NamedFormula($name, $worksheet, $value, $localOnly, $scope);
		}

		return new NamedRange($name, $worksheet, $value, $localOnly, $scope);
	}

	public static function testIfFormula(string $value): bool
	{
		if (str_starts_with($value, '=')) {
			$value = substr($value, 1);
		}

		if (is_numeric($value)) {
			return true;
		}

		$segMatcher = false;
		foreach (explode("'", $value) as $subVal) {
			//    Only test in alternate array entries (the non-quoted blocks)
			$segMatcher = $segMatcher === false;
			if (
				$segMatcher
				&& (preg_match('/' . self::REGEXP_IDENTIFY_FORMULA . '/miu', $subVal))
			) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Get name.
	 */
	public function getName(): string
	{
		return $this->name;
	}

	/**
	 * Set name.
	 */
	public function setName(string $name): self
	{
		if (!empty($name)) {
			// Old title
			$oldTitle = $this->name;

			// Re-attach
			if ($this->worksheet !== null) {
				$this->worksheet->getParentOrThrow()->removeNamedRange($this->name, $this->worksheet);
			}
			$this->name = $name;

			if ($this->worksheet !== null) {
				$this->worksheet->getParentOrThrow()->addDefinedName($this);
			}

			if ($this->worksheet !== null) {
				// New title
				$newTitle = $this->name;
				ReferenceHelper::getInstance()->updateNamedFormulae($this->worksheet->getParentOrThrow(), $oldTitle, $newTitle);
			}
		}

		return $this;
	}

	/**
	 * Get worksheet.
	 */
	public function getWorksheet(): ?Worksheet
	{
		return $this->worksheet;
	}

	/**
	 * Set worksheet.
	 */
	public function setWorksheet(?Worksheet $worksheet): self
	{
		$this->worksheet = $worksheet;

		return $this;
	}

	/**
	 * Get range or formula value.
	 */
	public function getValue(): string
	{
		return $this->value;
	}

	/**
	 * Set range or formula  value.
	 */
	public function setValue(string $value): self
	{
		$this->value = $value;

		return $this;
	}

	/**
	 * Get localOnly.
	 */
	public function getLocalOnly(): bool
	{
		return $this->localOnly;
	}

	/**
	 * Set localOnly.
	 */
	public function setLocalOnly(bool $localScope): self
	{
		$this->localOnly = $localScope;
		$this->scope = $localScope ? $this->worksheet : null;

		return $this;
	}

	/**
	 * Get scope.
	 */
	public function getScope(): ?Worksheet
	{
		return $this->scope;
	}

	/**
	 * Set scope.
	 */
	public function setScope(?Worksheet $worksheet): self
	{
		$this->scope = $worksheet;
		$this->localOnly = $worksheet !== null;

		return $this;
	}

	/**
	 * Identify whether this is a named range or a named formula.
	 */
	public function isFormula(): bool
	{
		return $this->isFormula;
	}

	/**
	 * Resolve a named range to a regular cell range or formula.
	 */
	public static function resolveName(string $definedName, Worksheet $worksheet, string $sheetName = ''): ?self
	{
		if ($sheetName === '') {
			$worksheet2 = $worksheet;
		} else {
			$worksheet2 = $worksheet->getParentOrThrow()->getSheetByName($sheetName);
			if ($worksheet2 === null) {
				return null;
			}
		}

		return $worksheet->getParentOrThrow()->getDefinedName($definedName, $worksheet2);
	}

	/**
	 * Implement PHP __clone to create a deep clone, not just a shallow copy.
	 */
	public function __clone()
	{
		$vars = get_object_vars($this);
		foreach ($vars as $key => $value) {
			if (is_object($value)) {
				$this->$key = clone $value;
			} else {
				$this->$key = $value;
			}
		}
	}
}