104fd306cSNickeau<?php 204fd306cSNickeau 304fd306cSNickeaunamespace ComboStrap\Meta\Api; 404fd306cSNickeau 504fd306cSNickeauuse ComboStrap\CacheExpirationDate; 604fd306cSNickeauuse ComboStrap\CacheExpirationFrequency; 704fd306cSNickeauuse ComboStrap\Canonical; 804fd306cSNickeauuse ComboStrap\DisqusIdentifier; 904fd306cSNickeauuse ComboStrap\DokuwikiId; 1004fd306cSNickeauuse ComboStrap\EndDate; 1104fd306cSNickeauuse ComboStrap\ExceptionBadArgument; 1204fd306cSNickeauuse ComboStrap\ExceptionNotFound; 1304fd306cSNickeauuse ComboStrap\ExceptionRuntimeInternal; 1404fd306cSNickeauuse ComboStrap\ExecutionContext; 1504fd306cSNickeauuse ComboStrap\FeaturedIcon; 1604fd306cSNickeauuse ComboStrap\FirstImage; 1704fd306cSNickeauuse ComboStrap\FirstRasterImage; 1804fd306cSNickeauuse ComboStrap\FirstSvgIllustration; 1904fd306cSNickeauuse ComboStrap\Label; 2004fd306cSNickeauuse ComboStrap\Lang; 2104fd306cSNickeauuse ComboStrap\LdJson; 2204fd306cSNickeauuse ComboStrap\Lead; 2304fd306cSNickeauuse ComboStrap\Locale; 2404fd306cSNickeauuse ComboStrap\LogUtility; 2504fd306cSNickeauuse ComboStrap\LowQualityCalculatedIndicator; 2604fd306cSNickeauuse ComboStrap\LowQualityPageOverwrite; 2704fd306cSNickeauuse ComboStrap\Meta\Field\Aliases; 2804fd306cSNickeauuse ComboStrap\Meta\Field\AliasPath; 2904fd306cSNickeauuse ComboStrap\Meta\Field\AliasType; 3004fd306cSNickeauuse ComboStrap\Meta\Field\AncestorImage; 3104fd306cSNickeauuse ComboStrap\Meta\Field\FacebookImage; 3204fd306cSNickeauuse ComboStrap\Meta\Field\FeaturedImage; 3304fd306cSNickeauuse ComboStrap\Meta\Field\FeaturedRasterImage; 3404fd306cSNickeauuse ComboStrap\Meta\Field\FeaturedSvgImage; 3504fd306cSNickeauuse ComboStrap\Meta\Field\PageH1; 3604fd306cSNickeauuse ComboStrap\Meta\Field\PageImage; 3704fd306cSNickeauuse ComboStrap\Meta\Field\PageImagePath; 3804fd306cSNickeauuse ComboStrap\Meta\Field\PageImages; 3904fd306cSNickeauuse ComboStrap\Meta\Field\PageTemplateName; 4004fd306cSNickeauuse ComboStrap\Meta\Field\Region; 4104fd306cSNickeauuse ComboStrap\Meta\Field\SocialCardImage; 4204fd306cSNickeauuse ComboStrap\Meta\Field\TwitterImage; 4304fd306cSNickeauuse ComboStrap\ModificationDate; 4404fd306cSNickeauuse ComboStrap\CreationDate; 4504fd306cSNickeauuse ComboStrap\PageDescription; 4604fd306cSNickeauuse ComboStrap\PageId; 4704fd306cSNickeauuse ComboStrap\PageImageUsage; 4804fd306cSNickeauuse ComboStrap\PageKeywords; 4904fd306cSNickeauuse ComboStrap\PageLevel; 5004fd306cSNickeauuse ComboStrap\PagePath; 5104fd306cSNickeauuse ComboStrap\PagePublicationDate; 5204fd306cSNickeauuse ComboStrap\PageTitle; 5304fd306cSNickeauuse ComboStrap\PageType; 5404fd306cSNickeauuse ComboStrap\PageUrlPath; 5504fd306cSNickeauuse ComboStrap\PluginUtility; 5604fd306cSNickeauuse ComboStrap\QualityDynamicMonitoringOverwrite; 5704fd306cSNickeauuse ComboStrap\References; 5804fd306cSNickeauuse ComboStrap\ReplicationDate; 5904fd306cSNickeauuse ComboStrap\ResourceName; 6004fd306cSNickeauuse ComboStrap\Slug; 6104fd306cSNickeauuse ComboStrap\StartDate; 6204fd306cSNickeau 6304fd306cSNickeauclass MetadataSystem 6404fd306cSNickeau{ 6504fd306cSNickeau 6604fd306cSNickeau /** 6704fd306cSNickeau * All known metadatas 6804fd306cSNickeau */ 6904fd306cSNickeau public const METADATAS = [ 7004fd306cSNickeau Aliases::PROPERTY_NAME => Aliases::class, 7104fd306cSNickeau Canonical::PROPERTY_NAME => Canonical::class, 7204fd306cSNickeau EndDate::PROPERTY_NAME => EndDate::class, 7304fd306cSNickeau PageType::PROPERTY_NAME => PageType::class, 7404fd306cSNickeau PageH1::PROPERTY_NAME => PageH1::class, 7504fd306cSNickeau PageUrlPath::PROPERTY_NAME => PageUrlPath::class, 7604fd306cSNickeau Lang::PROPERTY_NAME => Lang::class, 7704fd306cSNickeau LdJson::PROPERTY_NAME => LdJson::class, 7804fd306cSNickeau LdJson::OLD_ORGANIZATION_PROPERTY => LdJson::class, 7904fd306cSNickeau PageTitle::PROPERTY_NAME => PageTitle::class, 8004fd306cSNickeau PagePublicationDate::PROPERTY_NAME => PagePublicationDate::class, 8104fd306cSNickeau PagePublicationDate::OLD_META_KEY => PagePublicationDate::class, 8204fd306cSNickeau Region::PROPERTY_NAME => Region::class, 8304fd306cSNickeau ResourceName::PROPERTY_NAME => ResourceName::class, 8404fd306cSNickeau StartDate::PROPERTY_NAME => StartDate::class, 8504fd306cSNickeau PageDescription::PROPERTY_NAME => PageDescription::class, 8604fd306cSNickeau DisqusIdentifier::PROPERTY_NAME => DisqusIdentifier::class, 8704fd306cSNickeau Slug::PROPERTY_NAME => Slug::class, 8804fd306cSNickeau PageKeywords::PROPERTY_NAME => PageKeywords::class, 8904fd306cSNickeau CacheExpirationFrequency::PROPERTY_NAME => CacheExpirationFrequency::class, 9004fd306cSNickeau QualityDynamicMonitoringOverwrite::PROPERTY_NAME => QualityDynamicMonitoringOverwrite::class, 9104fd306cSNickeau LowQualityPageOverwrite::PROPERTY_NAME => LowQualityPageOverwrite::class, 9204fd306cSNickeau Locale::PROPERTY_NAME => Locale::class, 9304fd306cSNickeau CacheExpirationDate::PROPERTY_NAME => CacheExpirationDate::class, 9404fd306cSNickeau FeaturedImage::PROPERTY_NAME => FeaturedImage::class, 9504fd306cSNickeau FeaturedSvgImage::PROPERTY_NAME => FeaturedSvgImage::class, 9604fd306cSNickeau FeaturedRasterImage::PROPERTY_NAME => FeaturedRasterImage::class, 9704fd306cSNickeau FeaturedIcon::PROPERTY_NAME => FeaturedIcon::class, 9804fd306cSNickeau Lead::PROPERTY_NAME => Lead::class, 9904fd306cSNickeau Label::PROPERTY_NAME => Label::class, 10004fd306cSNickeau TwitterImage::PROPERTY_NAME => TwitterImage::class, 10104fd306cSNickeau FacebookImage::PROPERTY_NAME => FacebookImage::class, 10204fd306cSNickeau AliasPath::PROPERTY_NAME => Aliases::class, 10304fd306cSNickeau AliasType::PROPERTY_NAME => Aliases::class, 10404fd306cSNickeau PageImages::PROPERTY_NAME => PageImages::class, 10504fd306cSNickeau PageImages::OLD_PROPERTY_NAME => PageImages::class, 10604fd306cSNickeau PageImagePath::PROPERTY_NAME => PageImages::class, 10704fd306cSNickeau PageImageUsage::PROPERTY_NAME => PageImages::class, 10804fd306cSNickeau SocialCardImage::PROPERTY_NAME => SocialCardImage::class, 10904fd306cSNickeau AncestorImage::PROPERTY_NAME => AncestorImage::class, 11004fd306cSNickeau FirstImage::PROPERTY_NAME => FirstImage::class, 11104fd306cSNickeau Region::OLD_REGION_PROPERTY => Region::class, 11204fd306cSNickeau PageTemplateName::PROPERTY_NAME => PageTemplateName::class, 11304fd306cSNickeau PageTemplateName::PROPERTY_NAME_OLD => PageTemplateName::class, 11404fd306cSNickeau DokuwikiId::DOKUWIKI_ID_ATTRIBUTE => DokuwikiId::class, 11504fd306cSNickeau ReplicationDate::PROPERTY_NAME => ReplicationDate::class, 11604fd306cSNickeau References::PROPERTY_NAME => References::class, 11704fd306cSNickeau LowQualityCalculatedIndicator::PROPERTY_NAME => LowQualityCalculatedIndicator::class, 11804fd306cSNickeau PagePath::PROPERTY_NAME => PagePath::class, 11904fd306cSNickeau CreationDate::PROPERTY_NAME => CreationDate::class, 12004fd306cSNickeau ModificationDate::PROPERTY_NAME => ModificationDate::class, 12104fd306cSNickeau PageLevel::PROPERTY_NAME => PageLevel::class, 12204fd306cSNickeau PageId::PROPERTY_NAME => PageId::class 12304fd306cSNickeau ]; 12404fd306cSNickeau 12504fd306cSNickeau 12604fd306cSNickeau /** 12704fd306cSNickeau * @return Metadata[] 12804fd306cSNickeau */ 12904fd306cSNickeau public static function getMetadataObjects(): array 13004fd306cSNickeau { 13104fd306cSNickeau /** 13204fd306cSNickeau * TODO: create a metadata metadata object and a metadata processing object 13304fd306cSNickeau * We can't cache as we mix for now, in the same object 13404fd306cSNickeau * * the metadata metadata (ie {@link Metadata::isOnForm()}, ... 13504fd306cSNickeau * * and the process object {@link Metadata::setReadStore()}, writestore, value 13604fd306cSNickeau */ 13704fd306cSNickeau $metadatas = []; 13804fd306cSNickeau foreach (self::METADATAS as $metadataClass) { 13904fd306cSNickeau $metadatas[] = new $metadataClass(); 14004fd306cSNickeau } 14104fd306cSNickeau return $metadatas; 14204fd306cSNickeau 14304fd306cSNickeau } 14404fd306cSNickeau 14504fd306cSNickeau /** 14604fd306cSNickeau * @return Metadata[] 14704fd306cSNickeau */ 14804fd306cSNickeau public static function getMetadataClasses(): array 14904fd306cSNickeau { 15004fd306cSNickeau return self::METADATAS; 15104fd306cSNickeau } 15204fd306cSNickeau 15304fd306cSNickeau /** 15404fd306cSNickeau * @param object|string $class 15504fd306cSNickeau * @param Metadata|null $parent 15604fd306cSNickeau * @return Metadata 15704fd306cSNickeau * @throws ExceptionBadArgument - if the class is not a metadata class 15804fd306cSNickeau */ 15904fd306cSNickeau public static function toMetadataObject($class, Metadata $parent = null): Metadata 16004fd306cSNickeau { 16104fd306cSNickeau if (!is_subclass_of($class, Metadata::class)) { 16204fd306cSNickeau throw new ExceptionBadArgument("The class ($class) is not a metadata class"); 16304fd306cSNickeau } 16404fd306cSNickeau return new $class($parent); 16504fd306cSNickeau } 16604fd306cSNickeau 16704fd306cSNickeau /** 16804fd306cSNickeau * @return Metadata[] 16904fd306cSNickeau */ 17004fd306cSNickeau public static function getMutableMetadata(): array 17104fd306cSNickeau { 17204fd306cSNickeau $metas = []; 17304fd306cSNickeau foreach (MetadataSystem::getMetadataObjects() as $metadata) { 17404fd306cSNickeau if ($metadata::isMutable()) { 17504fd306cSNickeau $metas[] = $metadata; 17604fd306cSNickeau } 17704fd306cSNickeau } 17804fd306cSNickeau return $metas; 17904fd306cSNickeau } 18004fd306cSNickeau 18104fd306cSNickeau 18204fd306cSNickeau /** 18304fd306cSNickeau * @throws ExceptionNotFound 18404fd306cSNickeau */ 18504fd306cSNickeau public static function getForName(string $name): Metadata 18604fd306cSNickeau { 18704fd306cSNickeau 18804fd306cSNickeau $name = strtolower(trim($name)); 189*94bd6462Sgerardnico $metadataClass = self::METADATAS[$name] ?? null; 19004fd306cSNickeau if ($metadataClass !== null) { 19104fd306cSNickeau return new $metadataClass(); 19204fd306cSNickeau } 19304fd306cSNickeau throw new ExceptionNotFound("No metadata found with the name ($name)"); 19404fd306cSNickeau 19504fd306cSNickeau } 19604fd306cSNickeau} 197